[
  {
    "path": ".codespellrc",
    "content": "# https://github.com/codespell-project/codespell\n\n[codespell]\nskip = ./man/nominatim.1,data,./docs/styles.css,lib-php,module,munin,osm2pgsql,./test,./settings/*.lua,./settings/*.yaml,./settings/**/*.yaml,./settings/icu-rules,./nominatim/tokenizer/token_analysis/config_variants.py\n# Need to be lowercase in the list\n# Unter = Unter den Linden (an example address)\nignore-words-list = inout,unter\n"
  },
  {
    "path": ".flake8",
    "content": "[flake8]\nmax-line-length = 100\nmax-doc-length = 100\nextend-ignore =\n    # something == None constructs are needed for SQLAlchemy\n    E711\nper-file-ignores =\n    __init__.py: F401\n    test/python/utils/test_json_writer.py: E131\n    **/conftest.py: E402\n    test/bdd/*: F821\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: lonvia\ncustom: \"https://nominatim.org/funding/\"\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "contact_links:\n  - name: Nominatim Discussions\n    url: https://github.com/osm-search/Nominatim/discussions\n    about: Ask questions, get support, share ideas and discuss with community members.\n  - name: Discussions about OpenStreetMap data\n    url: https://community.openstreetmap.org/\n    about: Ask questions about the data used by Nominatim and discuss with the OSM community.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n<!-- Before opening a new feature request, please search through the open issue to check that your request hasn't been reported already. -->\n\n**Is your feature request related to a problem? Please describe.**\n<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->\n\n**Describe the solution you'd like**\n<!-- A clear and concise description of what you want to happen. -->\n\n**Describe alternatives you've considered**\n<!-- A clear and concise description of any alternative solutions or features you've considered. -->\n\n**Additional context**\n<!-- Add any other context or screenshots about the feature request here. -->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/report-issues-with-search-results.md",
    "content": "---\nname: Report issues with search results\nabout: You have searched something with Nominatim and did not get the expected result.\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n<!-- Note: this template is for reporting problems with searching. If you have found an issue with the data, you need to report/fix the issue directly in OpenStreetMap. See https://www.openstreetmap.org/fixthemap for details. -->\n\n## What did you search for?\n\n<!-- Please try to provide a link to your search. You  can go to https://nominatim.openstreetmap.org and repeat your search there. If you originally found the issue somewhere else, please tell us what software/website you were using. -->\n\n## What result did you get?\n\n## What result did you expect?\n\n**When the result is in the right place and just named wrongly:** \n\n<!-- Please tell us the display name you expected. -->\n\n**When the result is missing completely:**\n\n<!-- Make sure that the data you are looking for is in OpenStreetMap. Provide a link to the OpenStreetMap object or if you cannot get it, a link to the map on https://openstreetmap.org where you expect the result to be.\n\nTo get the link to the OSM object, you can try the following:\n\n * Go to [https://openstreetmap.org](https://openstreetmap.org).\n * Move to the area of the map where you expect the result and then zoom in as much as possible.\n * Click on the question mark on the right side of the map. You get a question cursor. Use it to click on the map where your object is located.\n * Find the object of interest in the list that appears on the left side.\n * Click on the object and report back the URL that the browser shows.\n-->\n\n## Further details\n\n<!-- Anything else we should know about the search. Particularities with addresses in the area etc. -->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/report-problems-with-the-software.md",
    "content": "---\nname: Report problems with the software\nabout: You have your own installation of Nominatim and found a bug.\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n<!-- Note: if you are installing Nominatim through a docker image, you should report issues with the installation process with the docker repository first.\n\n     Do not send screen shots! Copy any console output directly into the issue.\n -->\n\n**Describe the bug**\n<!-- A clear and concise description of what the bug is.-->\n\n**To Reproduce**\n<!-- Please describe what you did to get to the issue. -->\n\n**Software Environment (please complete the following information):**\n- Nominatim version: \n- Postgresql version: \n- Postgis version:\n- OS: \n\n**Hardware Configuration (please complete the following information):**\n- RAM: \n- number of CPUs:\n- type and size of disks:\n\n**Postgresql Configuration:**\n\n<!-- List any configuration items you changed in your postgresql configuration. -->\n\n**Nominatim Configuration:**\n\n<!-- List the contents of your customized `.env` file. -->\n\n**Additional context**\n\n<!-- Add any other context about the problem here. -->\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "## Summary\n<!-- Describe the purpose of your pull request and, if present, link to existing issues. -->\n\n## AI usage\n<!-- Please list where and to what extent AI was used. -->\n\n## Contributor guidelines (mandatory)\n<!-- We only accept pull requests that follow our guidelines. A deliberate violation may result in a ban. -->\n\n- [ ] I have adhered to the [coding style](https://github.com/osm-search/Nominatim/blob/master/CONTRIBUTING.md#coding-style)\n- [ ] I have [tested](https://github.com/osm-search/Nominatim/blob/master/CONTRIBUTING.md#testing) the proposed changes\n- [ ] I have [disclosed](https://github.com/osm-search/Nominatim/blob/master/CONTRIBUTING.md#using-ai-assisted-code-generators) above any use of AI to generate code, documentation, or the pull request description\n"
  },
  {
    "path": ".github/actions/build-nominatim/action.yml",
    "content": "name: 'Build Nominatim'\n\ninputs:\n    dependencies:\n        description: 'Where to install dependencies from (pip/apt)'\n        required: false\n        default: 'pip'\n\nruns:\n    using: \"composite\"\n\n    steps:\n        - name: Clean out the disk\n          run: |\n            sudo rm -rf /opt/hostedtoolcache/go /opt/hostedtoolcache/CodeQL /usr/lib/jvm /usr/local/share/chromium /usr/local/lib/android\n            df -h\n          shell: bash\n        - name: Install general prerequisites\n          run: |\n            sudo apt-get install -y -qq libspatialite-dev libsqlite3-mod-spatialite libicu-dev virtualenv python3-dev osm2pgsql\n          shell: bash\n\n        - name: Install prerequisites from apt\n          run: |\n            sudo apt-get install -y -qq python3-icu python3-datrie python3-jinja2 python3-psutil python3-dotenv python3-yaml python3-sqlalchemy python3-psycopg python3-asyncpg python3-mwparserfromhell\n          shell: bash\n          if: inputs.dependencies == 'apt'\n\n        - name: Setup virtual environment (for pip)\n          run: |\n            virtualenv venv\n            ./venv/bin/pip install -U pip\n          shell: bash\n          if: inputs.dependencies == 'pip'\n\n        - name: Setup virtual environment (for apt)\n          run: |\n            virtualenv venv --system-site-packages\n          shell: bash\n          if: inputs.dependencies == 'apt'\n\n        - name: Build nominatim\n          run: ./venv/bin/pip install Nominatim/packaging/nominatim-{api,db}\n          shell: bash\n"
  },
  {
    "path": ".github/actions/setup-postgresql/action.yml",
    "content": "name: 'Setup Postgresql and Postgis'\n\ndescription: 'Installs PostgreSQL and PostGIS and configures it for CI tests'\n\ninputs:\n    postgresql-version:\n        description: 'Version of PostgreSQL to install'\n        required: true\n\nruns:\n    using: \"composite\"\n\n    steps:\n        - name: Remove existing PostgreSQL\n          run: |\n              sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -y\n              sudo apt-get purge -yq postgresql*\n              sudo apt-get update -qq\n\n          shell: bash\n\n        - name: Install PostgreSQL\n          run: |\n              sudo apt-get install -y -qq --no-install-suggests --no-install-recommends postgresql-client-${PGVER} postgresql-${PGVER}-postgis-3 postgresql-${PGVER}-postgis-3-scripts postgresql-contrib-${PGVER} postgresql-${PGVER}\n          shell: bash\n          env:\n              PGVER: ${{ inputs.postgresql-version }}\n\n        - name: Adapt postgresql configuration\n          run: |\n              echo 'fsync = off' | sudo tee /etc/postgresql/${PGVER}/main/conf.d/local.conf\n              echo 'synchronous_commit = off' | sudo tee -a /etc/postgresql/${PGVER}/main/conf.d/local.conf\n              echo 'full_page_writes = off' | sudo tee -a /etc/postgresql/${PGVER}/main/conf.d/local.conf\n              echo 'shared_buffers = 1GB' | sudo tee -a /etc/postgresql/${PGVER}/main/conf.d/local.conf\n              echo 'port = 5432' | sudo tee -a /etc/postgresql/${PGVER}/main/conf.d/local.conf\n          shell: bash\n          env:\n              PGVER: ${{ inputs.postgresql-version }}\n\n        - name: Setup database\n          run: |\n              sudo systemctl restart postgresql\n              sudo -u postgres createuser -S www-data\n              sudo -u postgres createuser -s runner\n          shell: bash\n"
  },
  {
    "path": ".github/actions/setup-postgresql-windows/action.yml",
    "content": "name: 'Setup Postgresql and Postgis on Windows'\n\ndescription: 'Installs PostgreSQL and PostGIS for Windows and configures it for CI tests'\n\ninputs:\n    postgresql-version:\n        description: 'Version of PostgreSQL to install'\n        required: true\n\nruns:\n    using: \"composite\"  \n\n    steps:\n        - name: Set up PostgreSQL variables\n          shell: pwsh\n          run: |\n            $version = \"${{ inputs.postgresql-version }}\"\n            $root = \"C:\\Program Files\\PostgreSQL\\$version\"\n            $bin = \"$root\\bin\"\n\n            echo \"PGROOT=$root\" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append\n            echo \"PGBIN=$bin\"   | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append\n\n            echo \"$bin\" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append\n\n        - name: Decide Postgis version (Windows)\n          id: postgis-ver\n          shell: pwsh\n          run: |\n            echo \"PowerShell version: ${PSVersionTable.PSVersion}\"\n            $PG_VERSION = Split-Path $env:PGROOT -Leaf\n            $postgis_page = \"https://download.osgeo.org/postgis/windows/pg$PG_VERSION\"\n            echo \"Detecting PostGIS version from $postgis_page for PostgreSQL $PG_VERSION\"\n            $pgis_bundle = (Invoke-WebRequest -Uri $postgis_page -ErrorAction Stop).Links.Where({$_.href -match \"^postgis.*zip$\"}).href\n            if (!$pgis_bundle) {\n              Write-Error \"Could not find latest PostGIS version in $postgis_page that would match  ^postgis.*zip$  pattern\"\n              exit 1\n            }\n            $pgis_bundle = [IO.Path]::ChangeExtension($pgis_bundle, [NullString]::Value)\n            $pgis_bundle_url = \"$postgis_page/$pgis_bundle.zip\"\n            Add-Content $env:GITHUB_OUTPUT \"postgis_file=$pgis_bundle\"\n            Add-Content $env:GITHUB_OUTPUT \"postgis_bundle_url=$pgis_bundle_url\"\n\n        - uses: actions/cache@v5\n          with:\n            path: |\n              C:/postgis.zip\n            key: postgis-cache-${{ steps.postgis-ver.outputs.postgis_file }}\n\n        - name: Download postgis\n          shell: pwsh\n          run: |\n            if (!(Test-Path \"C:\\postgis.zip\")){(new-object net.webclient).DownloadFile($env:PGIS_BUNDLE_URL, \"c:\\postgis.zip\")}\n            if (Test-path \"c:\\postgis_archive\"){Remove-Item \"c:\\postgis_archive\" -Recurse -Force}\n            7z x c:\\postgis.zip -oc:\\postgis_archive\n          env: \n            PGIS_BUNDLE_URL: ${{ steps.postgis-ver.outputs.postgis_bundle_url }}\n\n        - name: Install postgis\n          shell: bash\n          run: |\n            echo \"Root: $PGROOT, Bin: $PGBIN\"\n            cp -r c:/postgis_archive/postgis-bundle-*/* \"$PGROOT\" \n\n        - name: Start PostgreSQL on Windows\n          run: |\n            $pgService = Get-Service -Name postgresql*\n            Set-Service -InputObject $pgService -Status running -StartupType automatic\n            Start-Process -FilePath \"$env:PGBIN\\pg_isready\" -Wait -PassThru\n          shell: pwsh\n\n        - name: Adapt postgresql configuration\n          shell: pwsh\n          env:\n            PGPASSWORD: root\n          run: |\n            & \"$env:PGBIN\\psql\" -U postgres -d postgres -c \"ALTER SYSTEM SET fsync = 'off';\"\n            & \"$env:PGBIN\\psql\" -U postgres -d postgres -c \"ALTER SYSTEM SET synchronous_commit = 'off';\"\n            & \"$env:PGBIN\\psql\" -U postgres -d postgres -c \"ALTER SYSTEM SET full_page_writes = 'off';\"\n            & \"$env:PGBIN\\psql\" -U postgres -d postgres -c \"ALTER SYSTEM SET shared_buffers = '1GB';\"\n            & \"$env:PGBIN\\psql\" -U postgres -d postgres -c \"ALTER SYSTEM SET port = 5432;\"\n\n            Restart-Service -Name postgresql*\n            Start-Process -FilePath \"$env:PGBIN\\pg_isready\" -Wait -PassThru\n\n        - name: Setup database users\n          shell: pwsh\n          env:\n            PGPASSWORD: root\n          run: |\n            & \"$env:PGBIN\\createuser\" -U postgres -S www-data\n            & \"$env:PGBIN\\createuser\" -U postgres -s runner\n        \n\n\n"
  },
  {
    "path": ".github/workflows/ci-tests.yml",
    "content": "name: CI Tests\n\non: [ push, pull_request ]\n\njobs:\n    create-archive:\n        runs-on: ubuntu-latest\n\n        steps:\n            - uses: actions/checkout@v6\n              with:\n                submodules: true\n\n            - uses: actions/cache@v5\n              with:\n                  path: |\n                     data/country_osm_grid.sql.gz\n                  key: nominatim-country-data-1\n\n            - name: Package tarball\n              run: |\n                  if [ ! -f data/country_osm_grid.sql.gz ]; then\n                      wget --no-verbose -O data/country_osm_grid.sql.gz https://www.nominatim.org/data/country_grid.sql.gz\n                  fi\n                  cd ..\n                  tar czf nominatim-src.tar.bz2 Nominatim\n                  mv nominatim-src.tar.bz2 Nominatim\n\n            - name: 'Upload Artifact'\n              uses: actions/upload-artifact@v7\n              with:\n                  name: full-source\n                  path: nominatim-src.tar.bz2\n                  retention-days: 1\n\n    tests:\n        needs: create-archive\n        strategy:\n            matrix:\n                flavour: [\"ubuntu-22\", \"ubuntu-24\"]\n                include:\n                    - flavour: ubuntu-22\n                      ubuntu: 22\n                      postgresql: 12\n                      lua: '5.1'\n                      dependencies: pip\n                      python: '3.9'\n                    - flavour: ubuntu-24\n                      ubuntu: 24\n                      postgresql: 18\n                      lua: '5.3'\n                      dependencies: apt\n                      python: 'builtin'\n\n        runs-on: ubuntu-${{ matrix.ubuntu }}.04\n\n        steps:\n            - uses: actions/download-artifact@v8\n              with:\n                  name: full-source\n\n            - name: Unpack Nominatim\n              run: tar xf nominatim-src.tar.bz2\n\n            - uses: ./Nominatim/.github/actions/setup-postgresql\n              with:\n                  postgresql-version: ${{ matrix.postgresql }}\n\n            - uses: ./Nominatim/.github/actions/build-nominatim\n              with:\n                  dependencies: ${{ matrix.dependencies }}\n\n            - uses: actions/cache@v5\n              with:\n                  path: |\n                     /usr/local/bin/osm2pgsql\n                  key: osm2pgsql-bin-22-1\n              if: matrix.ubuntu == '22'\n\n            - name: Set up Python\n              uses: actions/setup-python@v6\n              with:\n                  python-version: ${{ matrix.python }}\n              if: matrix.python != 'builtin'\n\n            - name: Compile osm2pgsql\n              run: |\n                  if [ ! -f /usr/local/bin/osm2pgsql ]; then\n                      sudo apt-get install -y -qq libboost-system-dev libboost-filesystem-dev libexpat1-dev zlib1g-dev libbz2-dev libpq-dev libproj-dev libicu-dev liblua${LUA_VERSION}-dev lua-dkjson nlohmann-json3-dev \n                      mkdir osm2pgsql-build\n                      cd osm2pgsql-build\n                      git clone https://github.com/osm2pgsql-dev/osm2pgsql\n                      mkdir build\n                      cd build\n                      cmake ../osm2pgsql\n                      make\n                      sudo make install\n                      cd ../..\n                      rm -rf osm2pgsql-build\n                  else\n                      sudo apt-get install -y -qq libexpat1 liblua${LUA_VERSION}\n                  fi\n              if: matrix.ubuntu == '22'\n              env:\n                  LUA_VERSION: ${{ matrix.lua }}\n\n            - name: Install test prerequisites (apt)\n              run: sudo apt-get install -y -qq python3-pytest python3-pytest-asyncio uvicorn python3-falcon python3-aiosqlite python3-pyosmium\n              if: matrix.dependencies == 'apt'\n\n            - name: Install test prerequisites (pip)\n              run: ./venv/bin/pip install pytest-asyncio falcon starlette asgi_lifespan aiosqlite osmium uvicorn\n              if: matrix.dependencies == 'pip'\n\n            - name: Install test prerequisites\n              run: ./venv/bin/pip install pytest-bdd\n\n            - name: Install latest flake8\n              run: ./venv/bin/pip install -U flake8\n\n            - name: Python linting\n              run: ../venv/bin/python -m flake8 src test/python test/bdd\n              working-directory: Nominatim\n\n            - name: Install mypy and typechecking info\n              run: ./venv/bin/pip install -U mypy types-PyYAML types-jinja2 types-psutil types-requests types-ujson types-Pygments typing-extensions\n              if: matrix.dependencies == 'pip'\n\n            - name: Python static typechecking\n              run: ../venv/bin/python -m mypy --strict --python-version 3.9 src\n              working-directory: Nominatim\n              if: matrix.dependencies == 'pip'\n\n            - name: Python unit tests\n              run: ../venv/bin/python -m pytest test/python\n              working-directory: Nominatim\n\n            - name: BDD tests\n              run: |\n                  ../venv/bin/python -m pytest test/bdd --nominatim-purge\n              working-directory: Nominatim\n\n    tests-windows:\n        needs: create-archive\n        runs-on: windows-latest\n\n        steps:\n            - uses: actions/download-artifact@v8\n              with:\n                  name: full-source\n\n            - name: Unpack Nominatim\n              run: tar xf nominatim-src.tar.bz2\n\n            - uses: ./Nominatim/.github/actions/setup-postgresql-windows\n              with:\n                  postgresql-version: 17\n\n            - name: Set up Python\n              uses: actions/setup-python@v6\n              with:\n                  python-version: '3.14'\n\n            - name: Install Spatialite\n              run: |\n                  Invoke-WebRequest -Uri \"https://www.gaia-gis.it/gaia-sins/windows-bin-amd64/mod_spatialite-5.1.0-win-amd64.7z\" -OutFile \"spatialite.7z\"\n                  7z x spatialite.7z -o\"C:\\spatialite\"\n                  echo \"C:\\spatialite\\mod_spatialite-5.1.0-win-amd64\" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append\n\n            - name: Install osm2pgsql\n              run: |\n                  Invoke-WebRequest -Uri \"https://osm2pgsql.org/download/windows/osm2pgsql-latest-x64.zip\" -OutFile \"osm2pgsql.zip\"\n                  Expand-Archive -Path \"osm2pgsql.zip\" -DestinationPath \"C:\\osm2pgsql\"\n                  $BinDir = Get-ChildItem -Path \"C:\\osm2pgsql\" -Recurse -Filter \"osm2pgsql.exe\" | Select-Object -ExpandProperty DirectoryName | Select-Object -First 1\n                  if (-not $BinDir) {\n                      Write-Error \"Could not find osm2pgsql.exe\"\n                      exit 1\n                  }\n                  echo \"$BinDir\" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append\n                  $FullExePath = Join-Path $BinDir \"osm2pgsql.exe\"\n                  echo \"NOMINATIM_OSM2PGSQL_BINARY=$FullExePath\" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append\n\n            - name: Set UTF-8 encoding\n              run: |\n                  [System.Console]::OutputEncoding = [System.Text.Encoding]::UTF8\n\n            - name: Install PyICU from wheel\n              run: |\n                  python -m pip install https://github.com/cgohlke/pyicu-build/releases/download/v2.16.0/pyicu-2.16-cp314-cp314-win_amd64.whl\n                  \n            - name: Install test prerequisites\n              run: |\n                  python -m pip install -U pip\n                  python -m pip install pytest pytest-asyncio \"psycopg[binary]!=3.3.0\" python-dotenv pyyaml jinja2 psutil sqlalchemy pytest-bdd falcon starlette uvicorn asgi_lifespan aiosqlite osmium mwparserfromhell\n\n            - name: Python unit tests\n              run: |\n                  python -m pytest test/python -k \"not (import_osm or run_osm2pgsql)\"\n              working-directory: Nominatim\n\n    install:\n        runs-on: ubuntu-latest\n        needs: create-archive\n\n        strategy:\n            matrix:\n                name: [Ubuntu-22, Ubuntu-24]\n                include:\n                    - name: Ubuntu-22\n                      image: \"ubuntu:22.04\"\n                      ubuntu: 22\n                      install_mode: install-apache\n                    - name: Ubuntu-24\n                      image: \"ubuntu:24.04\"\n                      ubuntu: 24\n                      install_mode: install-apache\n\n        container:\n            image: ${{ matrix.image }}\n            env:\n                LANG: en_US.UTF-8\n\n        defaults:\n            run:\n                shell: sudo -Hu nominatim bash --noprofile --norc -eo pipefail {0}\n\n        steps:\n            - name: Prepare container (Ubuntu)\n              run: |\n                  export APT_LISTCHANGES_FRONTEND=none\n                  export DEBIAN_FRONTEND=noninteractive\n                  apt-get update -qq\n                  apt-get install -y git sudo wget\n                  ln -snf /usr/share/zoneinfo/$CONTAINER_TIMEZONE /etc/localtime && echo $CONTAINER_TIMEZONE > /etc/timezone\n              shell: bash\n\n            - name: Setup import user\n              run: |\n                  useradd -m nominatim\n                  echo 'nominatim   ALL=(ALL:ALL) NOPASSWD: ALL' > /etc/sudoers.d/nominiatim\n                  echo \"/home/nominatim/Nominatim/vagrant/Install-on-${OS}.sh no $INSTALL_MODE\" > /home/nominatim/vagrant.sh\n              shell: bash\n              env:\n                OS: ${{ matrix.name }}\n                INSTALL_MODE: ${{ matrix.install_mode }}\n\n            - uses: actions/download-artifact@v8\n              with:\n                  name: full-source\n                  path: /home/nominatim\n\n            - name: Install Nominatim\n              run: |\n                export USERNAME=nominatim\n                export USERHOME=/home/nominatim\n                export NOSYSTEMD=yes\n                export HAVE_SELINUX=no\n                tar xf nominatim-src.tar.bz2\n                . vagrant.sh\n              working-directory: /home/nominatim\n\n            - name: Prepare import environment\n              run: |\n                  mv Nominatim/test/testdb/apidb-test-data.pbf test.pbf\n                  rm -rf Nominatim\n                  mkdir data-env-reverse\n              working-directory: /home/nominatim\n\n            - name: Add nominatim to path\n              run: |\n                sudo ln -s /home/nominatim/nominatim-venv/bin/nominatim /usr/local/bin/nominatim\n\n            - name: Need lua binary\n              run: |\n                sudo apt-get install -y lua5.4 lua-dkjson\n\n            - name: Print version\n              run: nominatim --version\n              working-directory: /home/nominatim/nominatim-project\n\n            - name: Print taginfo\n              run: lua ./nominatim-venv/lib/*/site-packages/nominatim_db/resources/lib-lua/taginfo.lua\n              working-directory: /home/nominatim\n\n            - name: Collect host OS information\n              run: nominatim admin --collect-os-info\n              working-directory: /home/nominatim/nominatim-project\n\n            - name: Import\n              run: nominatim import --osm-file ../test.pbf\n              working-directory: /home/nominatim/nominatim-project\n\n            - name: Import special phrases\n              run: nominatim special-phrases --import-from-wiki\n              working-directory: /home/nominatim/nominatim-project\n\n            - name: Check full import\n              run: nominatim admin --check-database\n              working-directory: /home/nominatim/nominatim-project\n\n            - name: Warm up database\n              run: nominatim admin --warm\n              working-directory: /home/nominatim/nominatim-project\n\n            - name: Install osmium\n              run: |\n                  /home/nominatim/nominatim-venv/bin/pip install osmium\n\n            - name: Run update\n              run: |\n                  nominatim replication --init\n                  NOMINATIM_REPLICATION_MAX_DIFF=1 nominatim replication --once\n              working-directory: /home/nominatim/nominatim-project\n\n            - name: Clean up database\n              run: nominatim refresh --postcodes --word-tokens\n              working-directory: /home/nominatim/nominatim-project\n\n            - name: Run reverse-only import\n              run : |\n                  echo 'NOMINATIM_DATABASE_DSN=\"pgsql:dbname=reverse\"' >> .env\n                  nominatim import --osm-file ../test.pbf --reverse-only --no-updates\n              working-directory: /home/nominatim/data-env-reverse\n\n            - name: Check reverse-only import\n              run: nominatim admin --check-database\n              working-directory: /home/nominatim/data-env-reverse\n\n            - name: Clean up database (reverse-only import)\n              run: nominatim refresh --postcodes --word-tokens\n              working-directory: /home/nominatim/nominatim-project\n\n    install-no-superuser:\n      runs-on: ubuntu-24.04\n      needs: create-archive\n\n      steps:\n          - uses: actions/download-artifact@v8\n            with:\n                name: full-source\n\n          - name: Unpack Nominatim\n            run: tar xf nominatim-src.tar.bz2\n\n          - uses: ./Nominatim/.github/actions/setup-postgresql\n            with:\n                postgresql-version: 16\n\n          - uses: ./Nominatim/.github/actions/build-nominatim\n\n          - name: Prepare import environment\n            run: |\n                mv Nominatim/test/testdb/apidb-test-data.pbf test.pbf\n                rm -rf Nominatim\n\n          - name: Prepare Database\n            run: |\n                ./venv/bin/nominatim import --prepare-database\n\n          - name: Create import user\n            run: |\n                sudo -u postgres createuser osm-import\n                psql -d nominatim -c \"ALTER USER \\\"osm-import\\\" WITH PASSWORD 'osm-import'\"\n                psql -d nominatim -c 'GRANT CREATE ON SCHEMA public TO \"osm-import\"'\n\n          - name: Run import\n            run: |\n                NOMINATIM_DATABASE_DSN=\"pgsql:host=127.0.0.1;dbname=nominatim;user=osm-import;password=osm-import\" ./venv/bin/nominatim import --continue import-from-file --osm-file test.pbf\n\n          - name: Check full import\n            run: ./venv/bin/nominatim admin --check-database\n\n    migrate:\n      runs-on: ubuntu-24.04\n      needs: create-archive\n\n      steps:\n          - uses: actions/download-artifact@v8\n            with:\n                name: full-source\n\n          - name: Unpack Nominatim\n            run: tar xf nominatim-src.tar.bz2\n\n          - uses: ./Nominatim/.github/actions/setup-postgresql\n            with:\n                postgresql-version: 18\n\n          - name: Install Python dependencies\n            run: |\n              sudo apt-get install --no-install-recommends virtualenv osm2pgsql\n\n          - name: Install Nominatim master version\n            run: |\n              virtualenv master\n              cd Nominatim\n              ../master/bin/pip install packaging/nominatim-db\n\n          - name: Install Nominatim from pypi\n            run: |\n              virtualenv release\n              ./release/bin/pip install nominatim-db\n\n          - name: Import Nominatim database using release\n            run: |\n              ./release/bin/nominatim import --osm-file Nominatim/test/testdb/apidb-test-data.pbf\n              ./release/bin/nominatim add-data --file Nominatim/test/testdb/additional_api_test.data.osm\n\n          - name: Migrate to master version\n            run: |\n              ./master/bin/nominatim admin --migrate\n              ./release/bin/nominatim add-data --file Nominatim/test/testdb/additional_api_test.data.osm\n"
  },
  {
    "path": ".gitignore",
    "content": "*.log\n*.pyc\n*.swp\n\ndocs/develop/*.png\nsite-html\n\nbuild\ndist\n.coverage\n\n.vagrant\ndata/country_osm_grid.sql.gz\n"
  },
  {
    "path": ".gitmodules",
    "content": ""
  },
  {
    "path": ".mypy.ini",
    "content": "[mypy]\nplugins = sqlalchemy.ext.mypy.plugin\n\n[mypy-icu.*]\nignore_missing_imports = True\n\n[mypy-asyncpg.*]\nignore_missing_imports = True\n\n[mypy-dotenv.*]\nignore_missing_imports = True\n"
  },
  {
    "path": "AUTHORS",
    "content": "Nominatim was written by:\n\n* Brian Quinion\n* Sarah Hoffmann\n* Marc Tobias Metten\n\n* markigail\n* AntoJvlt\n* gemo1011\n* darkshredder\n\nand many more.\n\nFor a full list of contributors see the Git logs or visit\nhttps://github.com/openstreetmap/Nominatim/graphs/contributors\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Nominatim contribution guidelines\n\n## Reporting Bugs\n\nBugs can be reported at https://github.com/openstreetmap/Nominatim/issues.\nPlease always open a separate issue for each problem. In particular, do\nnot add your bugs to closed issues. They may look similar to you but\noften are completely different from the maintainer's point of view.\n\nIf you just have a question or when you are not sure if what you have found\nis an actual bug, use the [Discussion section](https://github.com/openstreetmap/Nominatim/discussions).\n\nIf you have questions about the underlying OpenStreetMap data rather than\nthe geocoding software, then the\n[OpenStreetMap forum](https://community.openstreetmap.org/) is the best\nplace to start.\n\n## Workflow for Pull Requests\n\nWe love to get pull requests from you. We operate the \"Fork & Pull\" model\nexplained at\n\nhttps://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests\n\nYou should fork the project into your own repo, create a topic branch\nthere and then make a single pull requests back to the main repository.\nYour pull requests will then be reviewed and discussed.\n\nEnable CI (we use Github Actions workflows) on your fork. It will run the\nfull test suite whenever you push to one of your branches.\nhttps://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository\n\n\nPlease make sure to follow these guidelines:\n\n* Make sure CI passes _before_ opening the pull request. Check the \"Actions\" tab\n  in your repo to make sure everything works.\n* Make sure that you have time to react to these comments and amend the code or\n  engage in a conversation. Do not expect that others will pick up your code,\n  it will almost never happen.\n* Open a separate pull request for each issue you want to address.\n  Don't mix multiple changes. In particular, don't mix style cleanups with\n  feature pull requests (exceptions, see 'Style modernisation' below).\n* For small fixes and amendments open a PR directly.\n  If you plan to make larger changes, please open an issue first or comment\n  on the appropriate issue to outline your planned implementation.\n\n### Using AI-assisted code generators\n\nPRs that include AI-generated content, may that be in code, in the PR\ndescription or in documentation need to\n\n1. clearly mark the AI-generated sections as such, for example, by\n   mentioning all use of AI in the PR description, and\n2. include proof that you have run the generated code on an actual\n   installation of Nominatim. Adding and executing tests will not be\n   sufficient. You need to show that the code actually solves the problem\n   the PR claims to solve.\n\n## Getting Started with Development\n\nPlease see the development section of the Nominatim documentation for\n\n* [an architecture overview](https://nominatim.org/release-docs/develop/develop/overview/)\n  and backgrounds on some of the algorithms\n* [how to set up a development environment](https://nominatim.org/release-docs/develop/develop/Development-Environment/)\n* and background on [how tests are organised](https://nominatim.org/release-docs/develop/develop/Testing/)\n\n\n## Coding style\n\nThe coding style for Python is enforced with flake8. It can be tested with:\n\n```\nmake lint\n```\n\nSQL code is currently not linted but should follow the following rules:\n\n* 2 spaces indentation\n* UPPER CASE for all SQL keywords\n\n### Style modernisation\n\nThere are a few places where we modernize code style as we go. The following\nchanges can be made when you touch the code anyway:\n\n* update copyright date in the file header to the current year\n* switch Python code to use [generics in standard collections](https://docs.python.org/3/whatsnew/3.9.html#type-hinting-generics-in-standard-collections)\n\n## Testing\n\nBefore submitting a pull request make sure that the tests pass:\n\n```\n  make tests\n```\n\n## Releases\n\nNominatim follows semantic versioning. Major releases are done for large changes\nthat require (or at least strongly recommend) a reimport of the databases.\nMinor releases can usually be applied to existing databases. Patch releases\ncontain bug fixes only and are released from a separate branch where the\nrelevant changes are cherry-picked from the master branch.\n\nChecklist for releases:\n\n* [ ] increase versions in\n  * `src/nominatim_api/version.py`\n  * `src/nominatim_db/version.py`\n* [ ] update `ChangeLog` (copy information from patch releases from release branch)\n* [ ] complete `docs/admin/Migration.md`\n* [ ] update EOL dates in `SECURITY.md`\n* [ ] commit and make sure CI tests pass\n* [ ] update OSMF production repo and release new version -post1 there\n* [ ] test migration\n  * download, build and import previous version\n  * migrate using master version\n  * run updates using master version\n* [ ] prepare tarball:\n  * `git clone https://github.com/osm-search/Nominatim` (switch to right branch!)\n  * `rm -r .git*`\n  * copy country data into `data/`\n  * add version to base directory and package\n* [ ] upload tarball to https://nominatim.org\n* [ ] prepare documentation\n  * check out new docs branch\n  * change git checkout instructions to tarball download instructions or adapt version on existing ones\n  * build documentation and copy to https://github.com/osm-search/nominatim-org-site\n  * add new version to history\n* [ ] check release tarball\n  * download tarball as per new documentation instructions\n  * compile and import Nominatim\n  * run `nominatim --version` to confirm correct version\n* [ ] tag new release and add a release on github.com\n* [ ] build pip packages and upload to pypi\n  * `make build`\n  * `twine upload dist/*`\n"
  },
  {
    "path": "COPYING",
    "content": "GNU GENERAL PUBLIC LICENSE\nVersion 3, 29 June 2007\n\nCopyright © 2007 Free Software Foundation, Inc. <https://fsf.org/>\n\nEveryone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.\n\nPreamble\n\nThe GNU General Public License is a free, copyleft license for software and other kinds of works.\n\nThe licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.\n\nWhen we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.\n\nTo protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.\n\nFor example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.\n\nDevelopers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.\n\nFor the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.\n\nSome devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.\n\nFinally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.\n\nThe precise terms and conditions for copying, distribution and modification follow.\n\nTERMS AND CONDITIONS\n\n0. Definitions.\n\n“This License” refers to version 3 of the GNU General Public License.\n\n“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.\n\n“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.\n\nTo “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.\n\nA “covered work” means either the unmodified Program or a work based on the Program.\n\nTo “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.\n\nTo “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.\n\nAn interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.\n\n1. Source Code.\nThe “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.\n\nA “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.\n\nThe “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.\n\nThe “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.\n\nThe Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.\n\nThe Corresponding Source for a work in source code form is that same work.\n\n2. Basic Permissions.\nAll rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.\n\nYou may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.\n\nConveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.\n\n3. Protecting Users' Legal Rights From Anti-Circumvention Law.\nNo covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.\n\nWhen you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.\n\n4. Conveying Verbatim Copies.\nYou may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.\n\nYou may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.\n\n5. Conveying Modified Source Versions.\nYou may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:\n\n     a) The work must carry prominent notices stating that you modified it, and giving a relevant date.\n\n     b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.\n\n     c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.\n\n     d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.\n\nA compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.\n\n6. Conveying Non-Source Forms.\nYou may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:\n\n     a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.\n\n     b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.\n\n     c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.\n\n     d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.\n\n     e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.\n\nA separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.\n\nA “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.\n\n“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.\n\nIf you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).\n\nThe requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.\n\nCorresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.\n\n7. Additional Terms.\n“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.\n\nWhen you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.\n\nNotwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:\n\n     a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or\n\n     b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or\n\n     c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or\n\n     d) Limiting the use for publicity purposes of names of licensors or authors of the material; or\n\n     e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or\n\n     f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.\n\nAll other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.\n\nIf you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.\n\nAdditional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.\n\n8. Termination.\nYou may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).\n\nHowever, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.\n\nMoreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.\n\nTermination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.\n\n9. Acceptance Not Required for Having Copies.\nYou are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.\n\n10. Automatic Licensing of Downstream Recipients.\nEach time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.\n\nAn “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.\n\nYou may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.\n\n11. Patents.\nA “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.\n\nA contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.\n\nEach contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.\n\nIn the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.\n\nIf you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.\n\nIf, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.\n\nA patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.\n\nNothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.\n\n12. No Surrender of Others' Freedom.\nIf conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.\n\n13. Use with the GNU Affero General Public License.\nNotwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.\n\n14. Revised Versions of this License.\nThe Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.\n\nIf the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.\n\nLater license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.\n\n15. Disclaimer of Warranty.\nTHERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n16. Limitation of Liability.\nIN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n\n17. Interpretation of Sections 15 and 16.\nIf the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.\n\nEND OF TERMS AND CONDITIONS\n\nHow to Apply These Terms to Your New Programs\n\nIf you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.\n\nTo do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.\n\n     <one line to give the program's name and a brief idea of what it does.>\n     Copyright (C) <year>  <name of author>\n\n     This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n\n     This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.\n\n     You should have received a copy of the GNU General Public License along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:\n\n     <program>  Copyright (C) <year>  <name of author>\n     This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n     This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”.\n\nYou should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <https://www.gnu.org/licenses/>.\n\nThe GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <https://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "ChangeLog",
    "content": "5.3.0\n * reorganise postcode and interpolation handling into separate tables\n * add table for handling associatedStreet relations (thanks @Itz-Agasta)\n * allow TIGER data imports on frozen tables (thanks @AyushDharDubey)\n * add layer filtering option to search cli command (thanks @Itz-Agasta)\n * add support for addr:interpolation together with addr:housenumber\n * add support for exclude_place_ids to take an OSM ID (thanks @Itz-Agasta)\n * add more abbreviations for Malay (thanks @harithilmi)\n   and Pakistan (thanks @bgo-eiu)\n * adaptions to boundary processing in Czech Republic, Australia and Brazil\n * return admin_level tag in extratags (thanks @kad-link)\n * clean up table creation SQL and add more constraints\n * add new cli administration tool to grant read rights to a new user\n   (thanks @Itz-Agasta)\n * remove uvicorn from the deployment instructions, guvicorn is now sufficient\n * fix entrance output for reverse and lookup\n * fix performance issue with instantiation of config (thanks @AyushDharDubey)\n * fix badly quoted SQL\n * ensure use of UTF-8 everywhere (thanks @kad-link)\n * fix endless loop when indexing only partial ranks (thanks @jayaddison)\n * fix erroring on /search endpoint when Postgresql wasn't running on startup\n * improve searching addresses by addr:* tags (thanks @Itz-Agasta)\n * add langauge-aware penalty for matching country names (thanks @Itz-Agasta)\n * compute default langauge also for linked place names (thanks @jayaddison)\n * use mwparserfromhell for parsing wiki pages (thanks @AyushDharDubey)\n * refactor table creation SQL to be reusable in tests\n * reduce SQL queries for reverse\n * enforce non-null importance and remove all code that expects otherwise\n * add rematching against country names\n * import now reports on total time (thanks @daishu0000)\n * give wikidata matches preference over name matching when linking places\n * removed nat_name from list of parsed names\n * exclude zero-only postcodes\n * type annotation updates due to dependency changes (thanks @vytas5)\n * improve display of test names for BDD tests\n * enable CI unit tests on Windows (thanks @kad-link)\n * remove unused settings from the documentation\n * various fixes and improvements to documentation (thanks @28Deepakpandey,\n   @Aditya30ag, @AmmarYasser455, @jonas-endter-optimax-energy, @vai67)\n\n5.2.0\n * increase minimum required Python to 3.9\n * index and output entrances of buildings and areas (thanks @emlove)\n * name tags used for creating display names are now configurable\n   (thanks @astridx)\n * new pattern-replacement query preprocessor (thanks @TuringVerified)\n * special phrases can now be filtered by presence of tags (thanks @anqixxx)\n * lua import style now always includes tags required by Nominatim\n * improved query time reporting and logging\n * improve word matching for languages with no word boundaries\n * POIs with addresses inherited from surrounding building are no\n   longer returned in the address layer\n * avoid creating a directory for the tokenizer when not needed\n * replace behave with pytest-bdd for BDD testing\n * refactoring and performance improvements to query parsing\n * various smaller updates to styles\n * remove English as default language for South Korea\n * remove Japanese word variants\n * updated country names for Norwegians (thanks @Johannes-Andersen)\n * remove support for deprecated osm2pgsql gazetteer style\n * fix updating of importances (also needs to update search_name table)\n * fix query for deletable endpoint to use index again\n * fix reindexing of contained places when a boundary is deleted and reinstated\n * fix difference computation error when updating postcodes\n * bracket handling sanitizer no longer strips bracket terms in the middle of\n   name\n * reduce precision of stored coordinates to 7-digits everywhere\n * avoid ST_Relate as it seems buggy on some systems\n * remove setting for logging queries in DB, no longer functional\n * postcode updates no longer require a project directory (needed for tests)\n * refactor locale handling code (thanks @anqixxx)\n * code updates for newer Python (thanks @emmanuel-ferdman)\n * better test coverage (thanks @asharmalik19)\n * various fixes and improvements to documentation\n   (thanks @anqixxx, @dave-meyer, @hasandiwan)\n\n5.1.0\n * replace datrie with simple internal trie implementation\n * add pattern-based postcode parser for queries,\n   postcodes no longer need to be present in OSM to be found\n * take variants into account when computing token similarity\n * add extratags output to geocodejson format\n * fix default layer setting used for structured queries\n * update abbreviation lists for Russian and English\n   (thanks @shoorick, @IvanShift, @mhsrn21)\n * fix variant generation for Norwegian\n * fix normalization around space-like characters\n * improve postcode search and handling of postcodes in queries\n * reorganise internal query structure and get rid of slow enums\n * enable code linting for tests\n * various code moderinsations in test code (thanks @eumiro)\n * remove setting osm2pgsql location via config.lib_dir\n * make SQL functions parallel save as far as possible (thanks @otbutz)\n * various fixes and improvements to documentation (thanks @TuringVerified)\n\n5.0.0\n * increase required versions for PostgreSQL (12+), PostGIS (3.0+)\n * remove installation via cmake and debundle osm2pgsql\n * remove deprecated PHP frontend\n * remove deprecated legacy tokenizer\n * add configurable pre-processing of queries\n * add query pre-processor to split up Japanese addresses\n * rewrite of osm2pgsql style implementation\n   (also adds support for osm2pgsql-themepark)\n * reduce the number of SQL queries needed to complete a 'lookup' call\n * improve computation of centroid for lines with only two points\n * improve bbox output for postcode areas\n * improve result order by returning the largest object when other things are\n   equal\n * add fallback for reverse geocoding to default country tables\n * exclude postcode areas from reverse geocoding\n * disable search endpoint when database is reverse-only (regression)\n * minor performance improvements to area split algorithm\n * switch table and index creation to use autocommit mode to avoid deadlocks\n * drop overly long ways during import\n * restrict automatic migrations to versions 4.3+\n * switch linting from pylint to flake8\n * switch tests to use a wikimedia test file in the new CSV style\n * various fixes and improvements to documentation\n\n4.5.0\n * allow building Nominatim as a pip package\n * make osm2pgsql building optional\n * switch importer to psycopg3\n * allow output format of web search to be customized in self-installations\n * look up potential postcode areas for postcode results\n * add word usage statistics for address terms\n * implement more light-weight CSV format for wiki importance tables\n * rewrite SQL for place search to use window functions\n * increase search radius when filtering by postcode\n * prefer POI points over POI areas\n * reintroduce full terms for address terms in search_name table\n * reindex postcodes when their parent is deleted\n * indexing: precompute counts of affected rows\n * ensure consistent country assignments for overlapping countries\n * make Nominatim[Async]API context manager to ensure proper calling of\n   close()\n * make usage of project dir optional for library\n * drop interpolations when no parent can be found\n * style tweaks to reflect OSM usage (man_made, highway and others)\n * deprecation of: bundled osm2pgsql, legacy tokenizer, PHP frontend\n * make documentation buildable without CMake\n * various fixes and improvements to documentation\n\n4.4.1\n * fix geocodejson output: admin level output should only print boundaries\n * updating: restrict invalidation of child objects on large street features\n * restrict valid interpolation house numbers to 0-999999\n * fix import error when SQLAlchemy 1.4 and psycopg3 are installed\n * various typo fixes in the documentation\n\n4.4.0\n * add export to SQLite database and SQLite support for the frontend\n * switch to Python frontend as the default frontend\n * update to osm2pgsql 1.11.0\n * add support for new osm2pgsql middle table format\n * simplify geometry for large polygon objects not used in addresses\n * various performance tweaks for search in Python frontend\n * fix regression in search with categories where it was confused with near\n   search\n * partially roll back use of SQLAlchemy lambda statements due to bugs\n   in SQLAlchemy\n * fix handling of timezones for timestamps from the database\n * fix handling of full address searches in connection with a viewbox\n * fix postcode computation of highway areas\n * fix handling of timeout errors for Python <= 3.10\n * fix address computation for postcode areas\n * fix variable shadowing in osm2pgsql flex script, causing bugs with LuaJIT\n * make sure extratags are always null when empty\n * reduce importance of places without wikipedia reference\n * improve performance of word count computations\n * drop support for wikipedia tags with full URLs\n * replace get_addressdata() SQL implementation with a Python function\n * improve display name for non-address features\n * fix postcode validation for postcodes with country code\n   (thanks @pawel-wroniszewski)\n * add possibility to run imports without superuser database rights\n   (thanks @robbe-haesendonck)\n * new CLI command for cleaning deleted relations (thanks @lujoh)\n * add check for database version in the CLI check command\n * updates to import styles ignoring more unused objects\n * various typo fixes (thanks @kumarUjjawal)\n\n4.3.2\n * fix potential SQL injection issue for 'nominatim admin --collect-os-info'\n * PHP frontend: fix on-the-fly lookup of postcode areas near boundaries\n * Python frontend: improve handling of viewbox\n * Python frontend: correct deployment instructions\n\n4.3.1\n * reintroduce result rematching\n * improve search of multi-part names\n * fix accidentally switched meaning of --reverse-only and --search-only in\n   warm command\n\n4.3.0\n * fix failing importance recalculation command\n * fix merging of linked names into unnamed boundaries\n * fix a number of corner cases with interpolation splitting resulting in\n   invalid geometries\n * fix failure in website generation when password contains curly brackets\n * fix broken use of ST_Project in PostGIS 3.4\n * new NOMINATIM_SEARCH_WITHIN_COUNTRIES setting to restrict reverse lookups\n   to known countries (thanks @alfmarcua)\n * allow negative OSM IDs (thanks @alfmarcua)\n * disallow import of Tiger data in a frozen DB\n * avoid UPDATE to change settings to be compatible with r/o DBs (thanks @t-tomek)\n * update bundled osm2pgsql to 1.9.2\n * reorganise osm2pgsql flex style and make it the default\n * exclude names ending in :wikipedia from indexing\n * no longer accept comma as a list separator in name tags\n * process forward dependencies on update to catch updates in geometries\n   of ways and relations\n * fix handling of isolated silent letters during transliteration\n * no longer assign postcodes to large linear features like rivers\n * introduce nominatim.paths module for finding data and libraries\n * documentation layout changed to material theme\n * new documentation section for library\n * various smaller fixes to existing documentation\n   (thanks @woodpeck, @bloom256, @biswajit-k)\n * updates to vagrant install scripts, drop support for Ubuntu 18\n   (thanks @n-timofeev)\n * removed obsolete configuration variables from env.defaults\n * add script for generating a taginfo description (thanks @biswajit-k)\n * modernize Python code around BDD test and add testing of Python frontend\n * lots of new BDD tests for API output\n\n4.2.3\n\n * fix deletion handling for 'nominatim add-data'\n * adapt place_force_delete() to new deletion handling\n * flex style: avoid dropping of postcode areas\n * fix update errors on address interpolation handling\n\n4.2.2\n\n * extend flex-style library to fully support all default styles\n * fix handling of Hebrew aleph\n * do not assign postcodes to rivers\n * fix string matching in PHP code\n * update osm2pgsql (various updates to flex)\n * fix slow query when deleting places on update\n * fix CLI details query\n * fix recalculation of importance values\n * fix polygon simplification in reverse results\n * add class/type information to reverse geocodejson result\n * minor improvements to default tokenizer configuration\n * various smaller fixes to documentation\n\n4.2.1\n\n * fix XSS vulnerability in debug view\n\n4.2.0\n\n * add experimental support for osm2pgsql flex style\n * introduce secondary importance value to be retrieved from a raster data file\n   (currently still unused, to replace address importance, thanks to @tareqpi)\n * add new report tool `nominatim admin --collect-os-info`\n   (thanks @micahcochran, @tareqpi)\n * reorganise index to improve lookup performance and size\n * run index creation after import in parallel\n * run ANALYZE more selectively to speed up continuation of indexing\n * fix crash on update when addr:interpolation receives an illegal value\n * fix minimum number of retrieved results to be at least 10\n * fix search for combinations of special term + name (e.g Hotel Bellevue)\n * do not return interpolations without a parent street on reverse search\n * improve invalidation of linked places on updates\n * fix address parsing for interpolation lines\n * make sure socket timeouts are respected during replication\n   (working around a bug in some versions of pyosmium)\n * update bundled osm2pgsql to 1.7.1\n * add support for PostgreSQL 15\n * typing fixes to work with latest type annotations from typeshed\n * smaller improvements to documentation (thanks to @mausch)\n\n4.1.1\n\n * fix XSS vulnerability in debug view\n\n4.1.0\n\n * switch to ICU tokenizer as default\n * add housenumber normalization and support optional spaces during search\n * add postcode format checking and support optional spaces during search\n * add function for cleaning housenumbers in word table\n * add updates/deletion of country names imported from OSM\n * linked places no longer overwrite names from a place permanently\n * move default country name configuration into yaml file (thanks @tareqpi)\n * more compact layout for interpolation and TIGER tables\n * introduce mutations to ICU tokenizer (used for German umlauts)\n * support reinitializing a full project directory with refresh --website\n * fix various issues with linked places on updates\n * add support for external sanitizers and token analyzers\n * add CLI commands for forced indexing\n * add CLI command for version report\n * add offline import mode\n * change geocodejson to return a feature class in the 'type' field\n * add ISO3166-2 to address output (thanks @I70l0teN4ik)\n * improve parsing and matching of addr: tags\n * support relations as street members of associatedStreet\n * better ranking for address results from TIGER data\n * adapt rank classification to changed tag usage in OSM\n * update bundled osm2pgsql to 1.6.0\n * add typing information to Python code\n * improve unit test coverage\n * reorganise and speed up code for BDD tests, drop support for scenes\n * move PHP unit tests to PHP 9.5\n * extensive typo fixes in documentation (thanks @woodpeck,@StephanGeorg,\n   @amandasaurus, @nslxndr, @stefkiourk, @Luflosi, @kianmeng)\n * drop official support for installation on CentOS\n * add installation instructions for Ubuntu 22.04\n * add support for PHP8\n * add setup instructions for updates and systemd\n * drop support for PostgreSQL 9.5\n\n4.0.2\n\n * fix XSS vulnerability in debug view\n\n4.0.1\n\n * fix initialisation error in replication script\n * ICU tokenizer: avoid any special characters in word tokens\n * better error message when API php script does not exist\n * fix quoting of house numbers in SQL queries\n * small fixes and improvements in search query parsing\n * add documentation for moving the database to a different machine\n\n4.0.0\n\n * refactor name token computation and introduce ICU tokenizer\n   * name processing now happens in the indexer outside the DB\n   * reorganizes abbreviation handling and moves it to the indexing phases\n   * adds preprocessing of names\n * add country-specific ranking for Spain, Slovakia\n * partially switch to using SP-GIST indexes\n * better updating of dependent addresses for name changes in streets\n * remove unused/broken tables for external housenumbers\n * move external postcodes to CSV format and no longer save them in tables\n   (adds support for postcodes for arbitrary countries)\n * remove postcode helper entries from placex (thanks @AntoJvlt)\n * change required format for TIGER data to CSV\n * move configuration of default languages from wiki into config file\n * expect customized configuration files in project directory by default\n * disable search API for reverse-only import (thanks @darkshredder)\n * port most of maintenance/import code to Python and remove PHP utils\n * add catch-up mode for replication\n * add updating of special phrases (thanks @AntoJvlt)\n * add support for special phrases in CSV files (thanks @AntoJvlt)\n * switch to case-independent matching between place and boundary names\n * remove disabling of reverse query parsing\n * minor tweaks to search algorithm to avoid more false positives\n * major overhaul of the administrator and developer documentation\n * add security disclosure policy\n * add testing of installation scripts via CI\n * drop support for Python < 3.6 and Postgresql < 9.5\n\n3.7.3\n\n * fix XSS vulnerability in debug view\n\n3.7.2\n\n * fix database check for reverse-only imports\n * do not error out in status API result when import date is missing\n * add array_key_last function for PHP < 7.3 (thanks to @woodpeck)\n * fix more url when server name is unknown (thanks to @mogita)\n * commit changes to replication log table\n\n3.7.1\n\n * fix smaller issues with special phrases import (thanks @AntoJvlt)\n * add index to speed up continued indexing during import\n * fix index on location_property_tiger(parent_place_id) (thanks @changpingc)\n * make sure Python code is backward-compatible with Python 3.5\n * various documentation fixes\n\n3.7.0\n\n * switch to dotenv for configuration file\n * introduce 'make install' (reorganising most of the code)\n * introduce nominatim tool as replacement for various php scripts\n * introduce project directories and allow multiple installations from same build\n * clean up BDD tests: drop nose, reorganise step code\n * simplify test database for API BDD tests and autoinstall database\n * port most of the code for command-line tools to Python\n   (thanks to @darkshredder and @AntoJvlt)\n * add tests for all tooling\n * replace pyosmium-get-changes with custom internal implementation using\n   pyosmium\n * improve search for queries with housenumber and partial terms\n * add database versioning\n * use jinja2 for preprocessing SQL files\n * introduce automatic migrations\n * reverse fix preference of interpolations over housenumbers\n * parallelize indexing of postcodes\n * add non-key indexes to speed up housenumber + street searches\n * switch housenumber field in placex to save transliterated names\n\n3.6.0\n\n * add full support for searching by and displaying of addr:* tags\n * improve address output for large-area objects\n * better use of country names from OSM data for search and display\n * better debug output for reverse call\n * add support for addr:place links without an place equivalent in OSM\n * improve finding postcodes with normalisation artefacts\n * batch object to index for rank 30, avoiding a wrap-around of transaction\n   IDs in PostgreSQL\n * introduce dynamic address rank computation for administrative boundaries\n   depending on linked objects and their place in the admin level hierarchy\n * add country-specific address ranking for Indonesia, Russia, Belgium and\n   the Netherlands (thanks @hendrikmoree)\n * make sure wikidata/wikipedia tags are imported for all styles\n * make POIs searchable by name and housenumber (thanks @joy-yyd)\n * reverse geocoding now ignores places without an address rank (rivers etc.)\n * installation of a webserver is no longer mandatory, for development\n   use the php internal webserver via 'make serve\n * reduce the influence of place nodes in addresses\n * drop support for the unspecific is_in tag\n * various minor tweaks to supplied styles\n * move HTML web frontend into its own project\n * move scripts for processing external data sources into separate directories\n * introduce separate configuration for website (thanks @krahulreddy)\n * update documentation, in particular, clean up development docs\n * update osm2pgsql to 1.4.0\n\n3.5.2\n\n * ensure that wikipedia tags are imported for all styles\n * reinstate verbosity for indexing during updates\n * make house number reappear in display name on named POIs\n * introduce batch processing in indexer to avoid transaction ID overrun\n * increase splitting for large geometries to improve indexing speed\n * remove deprecated get_magic_quotes_gpc() function\n * make sure that all postcodes have an entry in word and are thus searchable\n * remove use of ST_Covers in conjunction with ST_Intersects,\n   causes bad query planning and slow updates in Postgis3\n * update osm2pgsql\n\n3.5.1\n\n * disable jit and parallel processing in PostgreSQL for osm2pgsql\n * update libosmium to 2.15.6 (fixes an issue with processing hanging\n   on large multipolygons)\n\n3.5.0\n\n * structured select on HTML search page\n * new PHP Nominatim\\Shell class to wrap shell escaping\n * remove polygon parameter from all API calls\n * improve handling of postcode areas\n * reorganise place linking algorithm, now using wikidata tag as well\n * remove linkees from search_name and larger_area tables\n * introduce country-specific address ranks\n * reorganise rank address computation\n * cleanup of partition function\n * improve parenting for large POIs\n * add support for Postgresql 12 and Postgis 3\n * add earlier cleanup when --drop is given, to reduce memory usage\n * remove use of place_id in URLs\n * replace C nominatim indexer with a simpler Python implementation\n * split up the huge sql/functions.sql file\n * move osm2pgsql tests to osm2pgsql\n * add new extratags style which imports all tags from OSM\n * add new script for checking the import after completion\n * update osm2pgsql, reducing memory usage\n * use new wikipedia importance and add processing of wikidata tags\n * add search form for details page\n * use ExtraDataPath for country_grid table\n * remove short_name from list of names to be displayed\n * split up CMakeFile, so that all parts can be built separately\n * update installation instructions for CentOS and Ubuntu\n * add script for importing/updating multiple country extracts\n * various documentation improvements\n\n3.4.2\n\n * fix security bug in /details endpoint where user input was not\n   properly sanitized\n\n3.4.1\n\n * update osm2pgsql to fix hans during updates and lost address numbers\n   during updates\n\n3.4.0\n\n * increase required version for PostgreSQL(9.3), PostGIS(2.2) and PHP(7.0)\n * better error reporting for out-of-memory errors\n * exclude postcode ranges separated by colon from centre point calculation\n * update osm2pgsql, better handling of imports without flatnode file\n * switch to more efficient algorithm for word set computation\n * use only boundaries for country and state parts of addresses\n * improve updates of addresses with housenumbers and interpolations\n * remove country from place_addressline table and use country_code instead\n * optimise indexes on search_name partition tables\n * improve searching of attached streets for large objects like airports\n * drop support for python 2\n * new scripts for importing Wikidata for importance\n * create and drop indexes concurrently to not clash with auto vacuum\n * various documentation improvements\n\n\n3.3.0\n\n * zoom 17 in reverse now zooms in on minor streets\n * fix use of postcode relations in address\n * support for housenumber 0 on interpolations\n * replace database abstraction DB with PDO and switch to using exceptions\n * exclude line features at rank 30 from reverse geocoding\n * remove self-reference and country from place_addressline\n * make json output more readable (less escaping)\n * update conversion scripts for postcodes\n * scripts in utils/ are no longer executable (always use scripts in build dir)\n * remove Natural Earth country fallback (OSM is complete enough)\n * make rank assignments configurable\n * allow accept languages with underscore\n * new reverse-only import mode (without search index table)\n * rely on boundaries only for states and countries\n * update osm2pgsql, now using a configurable style\n * provide multiple import styles\n * improve search when house number and postcodes are dropped\n * overhaul of setup code\n * add support for PHPUnit 6\n * update test database\n * various documentation improvements\n\n3.2.0\n\n * complete rewrite of reverse search algorithm\n * add new geojson and geocodejson output formats\n * add simple export script to export addresses to CSV\n * remove is_in terms from address computation\n * remove unused search_name_country tables\n * various smaller fixes to query parsing\n * convert Tokens and token types to class types\n * correctly handle update when boundary object type is changed\n * improve debug output for /search endpoint\n * update to latest osm2pgsql and leaflet.js\n * overhaul of /details endpoint:\n     * new class parameter when using osmtype/osmid parameters\n     * permalink to instance-independent osmtype/osmid parameter format\n     * new json output format\n * update CentOS vagrant machine to use SELinux\n * add vagrant scripts for Ubuntu 18.04\n * fix build process for BSD\n * enable running the database on a different host than the setup scripts\n * allow to configure use of custom PHP binaries (PHP_BIN)\n * extensive coding style improvements to PHP code\n * more PHP unit tests for new classes\n * increase coverage for API tests\n * add documentation for API\n\n3.1.0\n\n * rework postcode handling and introduce location_postcode table\n * make setup less verbose and print a summary in the end\n * setup: error out when web site user does not exist\n * add more API tests to complete code coverage\n * reinstate key-value amenity search (special term [key=value])\n * fix detection of coordinates in query\n * various smaller tweaks to ranking of search interpretations\n * complete overhaul of PHP frontend code using OOP\n * add address rank to details page\n * update Tiger scripts for 2017 data and clean up unused code\n * various bug fixes and improvements to UI\n * improve reverse geocoding performance close to coasts\n * more PHP style cleanup (quoting)\n * allow unnamed road in reverse geocoding to avoid too far off results\n * add function to recalculate counts for full-word search term\n * add function to check if new updates are available\n * update documentation and switch to mkdocs for generating HTML\n\n3.0.1\n\n * fix bug in geometry building algorithm in osm2pgsql\n * fix typos in build instructions\n\n3.0.0\n\n * move to cmake build system\n * various fixes to HTML output\n * reverse endpoint now can return geometries\n * add support for PHP7\n * move to on-the-fly computation of interpolations\n * improve handling of linked places (updating)\n * improve test framework:\n    * replace lettuce with behave\n    * use smaller database for API tests\n * drop support for postgres < 9.1, postgis < 2.0 and PHP < 5.4\n * make external data use optional (useful for imports without US)\n * detect postgres and postgis versions automatically\n * clean up query logging and remove unused tables\n * move installation documentation into this repo\n * add self-documenting vagrant scripts\n * remove --create-website, recommend to use website directory in build\n * add accessor functions for URL parameters and improve error checking\n * remove IP blocking and rate-limiting code\n * enable CI via travis\n * reformatting for more consistent coding style\n * make country search term creation part of setup\n * update country names and country grid\n * handle roads that cross boundaries better\n * keep full information on address tags\n * update to refactored osm2pgsql which use libosmium based types\n * switch from osmosis to pyosmium for updates\n * be more strict when matching against special search terms\n * handle postcode entries with multiple values correctly\n\n2.5\n\n * reverse geocoding includes looking up housenumbers from Tiger data\n * added parameter to return simplified geometries\n * new lookup call for getting address information for OSM objects\n * new namedetails and extratags parameters that expose the name and extratags\n   fields of the placex table\n * mobile website\n * reverse web view\n\n2.4\n\n * drop support for postgres 8.4\n * rewrite address interpolation\n * switch to C++ version of osm2pgsql and rewrite tag filtering\n * support for bridge:name and tunnel:name, man_made, junction\n * drop way-node index (reduces database size by about 15%)\n * add support for configuring tablespaces and webserver user\n * better evaluation of search queries in right-to-left notation\n * improve house number search for streets with many duplicate entries\n * code cleanup (remove unused functions and tables)\n\n2.3\n\n * further improve ordering of results\n * support for more lat/lon formats in search-as-reverse\n * fix handling of GB postcodes\n * new functional test suite\n * support for waterway relations\n * inherit postcodes from street to poi\n * fix housenumber normalisation to find non-latin house numbers\n * take viewbox into account for ordering of results\n * pois may now inherit address tags from surrounding buildings\n * improve what objects may participate in an address\n * clean up handled class/type combinations to current OSM usage\n * lots of bug fixes\n\n2.2\n\n * correct database rights for www-data\n * add timestamps for update output\n * load postgis via extension for postgis >= 2.0\n * remove non-admin boundaries from addresses\n * further improve ordering of results with same importance\n * merge addr:postcode tags into object addresses\n * include rank and importance in reverse geocode output\n * replace ST_Line_Interpolate_Point with ST_LineInterpolatePoint\n  (for postgis >= 2.1)\n * update osm2pgsql to latest version\n * properly detect changes of admin_level\n * remove landuses when name is removed\n * smaller fixes\n\n2.1\n\n * update to openlayers 2.12 (now custom built)\n * update fallback OSM boundaries\n * add support for postgresql 9.2/9.3 and postgis 2.x\n * add structured queries\n * add options for polygon output in various formats\n   (geojson, svg, kml, postgis text)\n * maintenance functions for deleting objects and updating regions\n   (plcae_force_update/place_force_delete)\n * web view for polygons that need deleting\n * rate limiting using memcache\n * improve layout of details page\n * add support for boundary:postal_code\n * full CORS support\n * improve parenting of POIs\n * support for extract daily diffs from Geofabrik\n * support for addresses without a street\n   (addr:place and conscription number house numbers)\n * improve layout of word and search_name_* tables\n * support for US ZIP+4 codes\n * refactoring of front-end PHP code\n * lots of smaller bug fixes\n\n2.0.1\n\n * delete outdated entries from location_area_country\n * remove remaining uses of INTEGER, to allow node ids larger than 2^31\n"
  },
  {
    "path": "LICENSES/Apache-2.0.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "LICENSES/GPL-2.0-only.txt",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Lesser General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n                            NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program; if not, write to the Free Software Foundation, Inc.,\n    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.\n"
  },
  {
    "path": "Makefile",
    "content": "all:\n\n# Building of wheels\n\nbuild: clean-build build-db build-api\n\nclean-build:\n\trm -f dist/*\n\nbuild-db:\n\tpython3 -m build packaging/nominatim-db --outdir dist/\n\nbuild-api:\n\tpython3 -m build packaging/nominatim-api --outdir dist/\n\n# Tests\n\ntests: mypy lint pytest bdd\n\nmypy:\n\tmypy --strict --python-version 3.9 src\n\npytest:\n\tpytest test/python\n\nlint:\n\tflake8 src test/python test/bdd\n\nbdd:\n\tpytest test/bdd --nominatim-purge\n\n# Documentation\n\ndoc:\n\tmkdocs build\n\nserve-doc:\n\tmkdocs serve\n\nmanpage:\n\targparse-manpage --pyfile man/create-manpage.py --function get_parser --project-name Nominatim --url https://nominatim.org  > man/nominatim.1 --author 'the Nominatim developer community' --author-email info@nominatim.org\n\n\n.PHONY: tests mypy pytest lint bdd build clean-build build-db build-api doc serve-doc manpage\n"
  },
  {
    "path": "README.md",
    "content": "[![Build Status](https://github.com/osm-search/Nominatim/workflows/CI%20Tests/badge.svg)](https://github.com/osm-search/Nominatim/actions?query=workflow%3A%22CI+Tests%22)\n\nNominatim\n=========\n\nNominatim (from the Latin, 'by name') is a tool to search OpenStreetMap data\nby name and address (geocoding) and to generate synthetic addresses of\nOSM points (reverse geocoding). An instance with up-to-date data can be found\nat https://nominatim.openstreetmap.org. Nominatim is also used as one of the\nsources for the Search box on the OpenStreetMap home page.\n\nDocumentation\n=============\n\nThe documentation of the latest development version is in the\n`docs/` subdirectory. A HTML version can be found at\nhttps://nominatim.org/release-docs/develop/ .\n\nInstallation\n============\n\nThe latest stable release can be downloaded from https://nominatim.org.\nThere you can also find [installation instructions for the release](https://nominatim.org/release-docs/latest/admin/Installation), as well as an extensive [Troubleshooting/FAQ section](https://nominatim.org/release-docs/latest/admin/Faq/).\n\n[Detailed installation instructions for current master](https://nominatim.org/release-docs/develop/admin/Installation)\ncan be found at nominatim.org as well.\n\nA quick summary of the necessary steps:\n\n\n1. Clone this git repository and download the country grid\n\n        git clone https://github.com/osm-search/Nominatim.git\n        wget -O Nominatim/data/country_osm_grid.sql.gz https://nominatim.org/data/country_grid.sql.gz\n\n2. Create a Python virtualenv and install the packages:\n\n        python3 -m venv nominatim-venv\n        ./nominatim-venv/bin/pip install packaging/nominatim-{api,db}\n\n3. Create a project directory, get OSM data and import:\n\n        mkdir nominatim-project\n        cd nominatim-project\n        ../nominatim-venv/bin/nominatim import --osm-file <your planet file> 2>&1 | tee setup.log\n\n\n4. Start the webserver:\n\n        ./nominatim-venv/bin/pip install uvicorn falcon\n        ../nominatim-venv/bin/nominatim serve\n\n\nLicense\n=======\n\nThe Python source code is available under a GPL license version 3 or later.\nThe Lua configuration files for osm2pgsql are released under the\nApache License, Version 2.0. All other files are under a GPLv2 license.\n\n\nContributing\n============\n\nContributions, bug reports and pull requests are welcome. When reporting a\nbug, please use one of the\n[issue templates](https://github.com/osm-search/Nominatim/issues/new/choose)\nand make sure to provide all the information requested. If you are not\nsure if you have really found a bug, please ask for help in the forums\nfirst (see 'Questions' below).\n\nFor details on contributing, have a look at the\n[contribution guide](CONTRIBUTING.md).\n\n\nQuestions and help\n==================\n\nIf you have questions about search results and the OpenStreetMap data\nused in the search, use the [OSM Forum](https://community.openstreetmap.org/).\n\nFor questions, community help and discussions around the software and\nyour own installation of Nominatim, use the\n[Github discussions forum](https://github.com/osm-search/Nominatim/discussions).\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\n## Supported Versions\n\nAll Nominatim releases receive security updates for two years.\n\nThe following table lists the end of support for all currently supported\nversions.\n\n| Version | End of support for security updates |\n| ------- | ----------------------------------- |\n| 5.3.x   | 2028-04-04                          |\n| 5.2.x   | 2027-10-29                          |\n| 5.1.x   | 2027-04-01                          |\n| 5.0.x   | 2027-02-06                          |\n| 4.5.x   | 2026-09-12                          |\n\n## Reporting a Vulnerability\n\nIf you believe, you have found an issue in Nominatim that has implications on\nsecurity, please send a description of the issue to **security@nominatim.org**.\nYou will receive an acknowledgement of your mail within 3 work days where we\nalso notify you of the next steps.\n\n## How we Disclose Security Issues\n\n** The following section only applies to security issues found in released\nversions. Issues that concern the master development branch only will be\nfixed immediately on the branch with the corresponding PR containing the\ndescription of the nature and severity of the issue. **\n\nPatches for identified security issues are applied to all affected versions and\nnew minor versions are released. At the same time we release a statement at\nthe [Nominatim blog](https://nominatim.org/blog/) describing the nature of the\nincident.\n\n## List of Previous Incidents\n\n* 2023-11-20 - [SQL injection vulnerability](https://nominatim.org/2023/11/20/release-432.html)\n* 2023-02-21 - [cross-site scripting vulnerability](https://nominatim.org/2023/02/21/release-421.html)\n* 2020-05-04 - [SQL injection issue on /details endpoint](https://lists.openstreetmap.org/pipermail/geocoding/2020-May/002012.html)\n"
  },
  {
    "path": "VAGRANT.md",
    "content": "# Install Nominatim in a virtual machine for development and testing\n\nThis document describes how you can install Nominatim inside a Ubuntu 24\nvirtual machine on your desktop/laptop (host machine). The goal is to give\nyou a development environment to easily edit code and run the test suite\nwithout affecting the rest of your system. \n\nThe installation can run largely unsupervised. You should expect 1h from\nstart to finish depending on how fast your computer and download speed\nis.\n\n## Prerequisites\n\n1. [Virtualbox](https://www.virtualbox.org/wiki/Downloads)\n\n2. [Vagrant](https://www.vagrantup.com/downloads.html)\n\n3. Nominatim\n\n        git clone https://github.com/openstreetmap/Nominatim.git\n\n## Installation\n\n1. Start the virtual machine\n\n        vagrant up ubuntu24-nginx\n\n2. Log into the virtual machine\n\n        vagrant ssh ubuntu24-nginx\n\n3. Import a small country (Monaco)\n\n    See the FAQ how to skip this step and point Nominatim to an existing database.\n\n      ```\n      # inside the virtual machine:\n      cd nominatim-project\n      wget --no-verbose --output-document=monaco.osm.pbf http://download.geofabrik.de/europe/monaco-latest.osm.pbf\n      nominatim import --osm-file monaco.osm.pbf 2>&1 | tee monaco.$$.log\n      ```\n\n    To repeat an import you'd need to delete the database first\n\n        dropdb --if-exists nominatim\n\n\n\n## Development\n\nVagrant maps the virtual machine's port 8089 to your host machine. Thus you can\nsee Nominatim in action on [localhost:8089](http://localhost:8089/nominatim/).\n\nYou edit code on your host machine in any editor you like. There is no need to\nrestart any software: just refresh your browser window.\n\nUse the functions of the `log()` object to create temporary debug output.\nAdd `&debug=1` to the URL to see the output.\n\nIn the Python BDD test you can use `logger.info()` for temporary debug\nstatements.\n\nFor more information on running tests, see\nhttps://nominatim.org/release-docs/develop/develop/Testing/\n\n\n## FAQ\n\n##### Will it run on Windows?\n\nYes, Vagrant and Virtualbox can be installed on MS Windows just fine. You need\na 64bit version of Windows.\n\n##### Will it run on Apple Silicon?\n\nYou might need to replace Virtualbox with [Parallels](https://www.parallels.com/products/desktop/).\nThere is no free/open source version of Parallels.\n\n##### Why Monaco, can I use another country?\n\nOf course! The Monaco import takes less than 10 minutes and works with 2GB RAM.\n\n##### Will the results be the same as those from nominatim.openstreetmap.org?\n\nNo. Long-running Nominatim installations will differ once new import features (or\nbug fixes) get added since those usually only get applied to new/changed data.\n\nAlso this document skips the optional Wikipedia data import which affects ranking\nof search results. See [Nominatim installation](https://nominatim.org/release-docs/latest/admin/Installation)\nfor details.\n\n##### Why Ubuntu? Can I test CentOS/Fedora/CoreOS/FreeBSD?\n\nThere used to be a Vagrant script for CentOS available, but the Nominatim directory\nisn't symlinked/mounted to the host which makes development trickier. We used\nit mainly for debugging installation with SELinux.\n\nIn general Nominatim will run in the other environments. The installation steps\nare slightly different, e.g. the name of the package manager, Apache2 package\nname, location of files. We chose Ubuntu because that is closest to the\nnominatim.openstreetmap.org production environment.\n\nYou can configure/download other Vagrant boxes from\n[https://app.vagrantup.com/boxes/search](https://app.vagrantup.com/boxes/search).\n\n##### How can I connect to an existing database?\n\nLet's say you have a Postgres database named `nominatim_it` on server `your-server.com`\nand port `5432`. The Postgres username is `postgres`. You can edit the `.env` in your\nproject directory and point Nominatim to it.\n\n    NOMINATIM_DATABASE_DSN=\"pgsql:host=your-server.com;port=5432;user=postgres;dbname=nominatim_it\n\nNo data import or restarting necessary.\n\nIf the Postgres installation is behind a firewall, you can try\n\n    ssh -L 9999:localhost:5432 your-username@your-server.com\n\ninside the virtual machine. It will map the port to `localhost:9999` and then\nyou edit `.env` file with\n\n    NOMINATIM_DATABASE_DSN=\"pgsql:host=localhost;port=9999;user=postgres;dbname=nominatim_it\"\n\nTo access postgres directly remember to specify the hostname,\ne.g. `psql --host localhost --port 9999 nominatim_it`\n\n\n##### My computer is slow and the import takes too long. Can I start the virtual machine \"in the cloud\"?\n\nYes. It's possible to start the virtual machine on [Amazon AWS (plugin)](https://github.com/mitchellh/vagrant-aws)\nor [DigitalOcean (plugin)](https://github.com/smdahlen/vagrant-digitalocean).\n"
  },
  {
    "path": "Vagrantfile",
    "content": "# -*- mode: ruby -*-\n# vi: set ft=ruby :\n\nVagrant.configure(\"2\") do |config|\n  # Apache webserver\n  config.vm.network \"forwarded_port\", guest: 80, host: 8089\n  config.vm.network \"forwarded_port\", guest: 8088, host: 8088\n\n  # If true, then any SSH connections made will enable agent forwarding.\n  config.ssh.forward_agent = true\n\n  # Never sync the current directory to /vagrant.\n  config.vm.synced_folder \".\", \"/vagrant\", disabled: true\n\n  checkout = \"yes\"\n  if ENV['CHECKOUT'] != 'y' then\n    checkout = \"no\"\n  end\n\n  config.vm.provider \"hyperv\" do |hv, override|\n    hv.memory = 2048\n    hv.linked_clone = true\n    if ENV['CHECKOUT'] != 'y' then\n      override.vm.synced_folder \".\", \"/home/vagrant/Nominatim\", type: \"smb\", smb_host: ENV['SMB_HOST'] || ENV['COMPUTERNAME']\n    end\n  end\n\n  config.vm.provider \"virtualbox\" do |vb, override|\n    vb.gui = false\n    vb.memory = 2048\n    vb.customize [\"setextradata\", :id, \"VBoxInternal2/SharedFoldersEnableSymlinksCreate//vagrant\",\"0\"]\n    if ENV['CHECKOUT'] != 'y' then\n      override.vm.synced_folder \".\", \"/home/vagrant/Nominatim\"\n    end\n  end\n\n  config.vm.provider \"parallels\" do |prl, override|\n    prl.update_guest_tools = false\n    prl.memory = 2048\n    if ENV['CHECKOUT'] != 'y' then\n      override.vm.synced_folder \".\", \"/home/vagrant/Nominatim\"\n    end\n  end\n\n  config.vm.provider \"libvirt\" do |lv, override|\n    lv.memory = 2048\n    lv.nested = true\n    if ENV['CHECKOUT'] != 'y' then\n      override.vm.synced_folder \".\", \"/home/vagrant/Nominatim\", type: 'nfs', nfs_udp: false\n    end\n  end\n\n  config.vm.define \"ubuntu22\", primary: true do |sub|\n      sub.vm.box = \"generic/ubuntu2204\"\n      sub.vm.provision :shell do |s|\n        s.path = \"vagrant/Install-on-Ubuntu-22.sh\"\n        s.privileged = false\n        s.args = [checkout]\n      end\n  end\n\n  config.vm.define \"ubuntu22-apache\" do |sub|\n      sub.vm.box = \"generic/ubuntu2204\"\n      sub.vm.provision :shell do |s|\n        s.path = \"vagrant/Install-on-Ubuntu-22.sh\"\n        s.privileged = false\n        s.args = [checkout, \"install-apache\"]\n      end\n  end\n\n  config.vm.define \"ubuntu22-nginx\" do |sub|\n      sub.vm.box = \"generic/ubuntu2204\"\n      sub.vm.provision :shell do |s|\n        s.path = \"vagrant/Install-on-Ubuntu-22.sh\"\n        s.privileged = false\n        s.args = [checkout, \"install-nginx\"]\n      end\n  end\n\n  config.vm.define \"ubuntu24\" do |sub|\n      sub.vm.box = \"bento/ubuntu-24.04\"\n      if RUBY_PLATFORM.include?('darwin') && RUBY_PLATFORM.include?('arm64')\n        # Apple M processor\n        sub.vm.box = 'gutehall/ubuntu24-04'\n      end\n      sub.vm.provision :shell do |s|\n        s.path = \"vagrant/Install-on-Ubuntu-24.sh\"\n        s.privileged = false\n        s.args = [checkout]\n      end\n  end\n\n  config.vm.define \"ubuntu24-apache\" do |sub|\n      sub.vm.box = \"bento/ubuntu-24.04\"\n      sub.vm.provision :shell do |s|\n        s.path = \"vagrant/Install-on-Ubuntu-24.sh\"\n        s.privileged = false\n        s.args = [checkout, \"install-apache\"]\n      end\n  end\n\n  config.vm.define \"ubuntu24-nginx\" do |sub|\n      sub.vm.box = \"bento/ubuntu-24.04\"\n      sub.vm.provision :shell do |s|\n        s.path = \"vagrant/Install-on-Ubuntu-24.sh\"\n        s.privileged = false\n        s.args = [checkout, \"install-nginx\"]\n      end\n  end\nend\n"
  },
  {
    "path": "data/words.sql",
    "content": "--\n-- PostgreSQL database dump\n--\n\nSET statement_timeout = 0;\nSET client_encoding = 'UTF8';\nSET standard_conforming_strings = on;\nSET check_function_bodies = false;\nSET client_min_messages = warning;\n\nSET search_path = public, pg_catalog;\n\nSET default_tablespace = '';\n\nSET default_with_oids = false;\n\n--\n-- Name: word_frequencies; Type: TABLE; Schema: public; Owner: -; Tablespace: \n--\n\nDROP TABLE IF EXISTS word_frequencies;\n\nCREATE TABLE word_frequencies (\n    word_token text,\n    count bigint\n);\n\n--\n-- Data for Name: word_frequencies; Type: TABLE DATA; Schema: public; Owner: -\n--\n\nCOPY word_frequencies (word_token, count) FROM stdin;\ngooseberry\t501\nqew\t501\ncoaster\t501\nlubecker st\t501\ngeorg st\t501\nnapravlinii\t501\nr georges bizet\t501\njr chang pan xian\t501\n1550\t501\nwellington dr\t501\nstarii\t501\nlundy\t501\npolizeistation\t501\nrailway rd\t501\nr st antoine\t501\ngril\t501\nwirtschaft\t501\nripa\t501\nminsenv\t501\nespanya\t501\nwoodend\t501\nsuz\t501\nsternen\t501\nmattos\t501\nschaf\t501\nmcdonald cr\t501\ngove\t501\ncox rd\t501\nmurta\t501\nfermata\t501\nagios nikolaos\t501\nrake\t501\ndra\t501\ndesportivo\t501\ntalbach\t501\nn water st\t501\nprisma\t501\nbanff\t501\nprigorodnaia ul\t501\nhaller st\t501\nkabinit\t501\nzuider\t501\nkrymskaia\t501\nirlanda\t501\npatha\t501\nmisery\t501\npleasant dr\t501\nbanannarkanin\t501\nwestfild rd\t501\ngiono\t501\ncree\t501\nkrems\t501\nhiram\t501\nst g\t501\nelkins\t501\ncantone\t501\nmacchia\t501\nmex 1\t501\nadana sanliurfa otoyolu\t502\npoziomkowa\t502\nisidore\t502\nn 117\t502\nbhyrte\t502\ncamat\t502\nqili\t502\npinecrest dr\t502\nuva\t502\ntbr\t502\narmstrong rd\t502\nc so giuseppe garibaldi\t502\nevergreen st\t502\ngrushivskogo vulitsia\t502\nd 949\t502\n2190\t502\nmacro\t502\npampas\t502\nrollo\t502\nviaraya\t502\nupon\t502\nbaker cr\t502\nmuhlhauser\t502\nkalinowa\t502\ncoille\t502\nmalteser\t502\n57a\t502\nsh25\t502\nshchirbakova\t502\nsolon\t502\ne 40 e 41\t502\na37\t502\nveronese\t502\nlloyd st\t502\nfructuoso\t502\noun\t502\npurdy\t502\nmcnair\t502\naleflshmaleflyte\t502\nbanja\t502\nhuntsville\t502\nasti\t502\nhensley\t502\ne 451\t502\nozira\t502\navtomagazin\t502\nmyru st\t502\nmundial\t502\nplum cr\t502\nl 530\t502\nwainwright\t502\nschreiber\t502\nwhitefild\t502\nul zoi kosmodimianskoi\t503\nprvomajska\t503\ncarney\t503\nsh5\t503\nrispublika\t503\ngrasweg\t503\nmosconi\t503\nvistula\t503\nmclaren\t503\nseminar\t503\narral\t503\ndoshkilnii\t503\npiani\t503\nalder st\t503\ncisco\t503\noliver rd\t503\nmulas\t503\ntaurus\t503\ntusday\t503\nhonved\t503\n1 88\t503\nrosenheimer st\t503\nlabattoir\t503\nbahama\t503\nwegkreuz\t503\nbicicletas\t503\nrefinery\t503\ndechant\t503\nmckinley st\t503\n2111\t503\n320th st\t503\ncastlereagh\t503\ndoan\t503\naleflshhdalefhamza\t503\nkliuchivaia ul\t503\nv lazio\t503\nqtalefr\t503\nbaustoffe\t503\nkrolowej jadwigi\t503\nooster\t503\nblokker\t503\n963\t503\n246a\t503\nhage\t503\nbaixada\t503\nalbion st\t503\norbita\t503\nshearwater\t503\nzhong hua lu\t503\ndaisy ln\t503\nkeian electric railway keian main ln\t503\nlewiston\t503\namedee\t503\ncaupolican\t504\nincheon\t504\npitt st\t504\nlokomotiv\t504\nbrandes\t504\nbejar\t504\nmcdonald rd\t504\nnippo\t504\nshoh\t504\nweseler st\t504\narmazem\t504\nsharaf\t504\nkhy\t504\nc s sebastian\t504\ncasetta\t504\nbridger\t504\nfisher st\t504\n53k\t504\ngotthard\t504\nkreisverband\t504\nromualdo\t504\nlandbackerei\t504\nkrm\t504\nj st\t504\ntryon\t504\nhubertusweg\t504\nhaustechnik\t504\npanasa\t504\nbackbone\t504\nsmit\t504\nsommet\t504\ncarroll st\t504\nhayes rd\t504\nmiscelanea\t504\nbramante\t504\ncarmes\t504\nrocky branch\t504\nhunyadi janos u\t504\nbei chuan\t504\nco rd 28\t504\nwindwood\t504\nsindicato\t504\nhulshoff\t504\niper\t504\neconomy\t504\nlepinette\t504\nmynydd\t504\nvelarde\t504\nwooded\t504\nthessalonikes\t504\nvazhinka\t504\nhangweg\t504\nhuipyeonzzyx\t504\nstardust\t505\njudd\t505\nc granada\t505\ngr bd\t505\n211th\t505\nturkish\t505\nsimion\t505\nd 177\t505\nstockholms\t505\n5a c\t505\nvalia\t505\nn 14\t505\ncurt\t505\nw end\t505\nerlengrund\t505\nfirmin\t505\ndig\t505\nsp233\t505\nizumi\t505\nwheatfild\t505\nmarkets\t505\ndoll\t505\nputri\t505\nbiriozovi\t505\nbanki\t505\nvini\t505\nia 27\t505\nradica\t505\nchurch vw\t505\nhermano\t505\na76\t505\ngospital\t505\nxxx\t505\nsp71\t505\nakazin\t505\nshared\t505\nfifth st\t505\nxiaono\t505\ndurval\t505\npodlisnaia\t505\nd 927\t505\ncis\t505\nrandstad\t505\nharsfa\t505\nlawrence av\t506\ngentle\t506\nmcquen\t506\nmeadow c\t506\ngabrila narutowicza\t506\nparalia\t506\nnauchno\t506\n1047\t506\norikhovaia\t506\nadalberto\t506\nd 929\t506\nballe\t506\njjimjilbang\t506\nyayayyat\t506\nodenwald st\t506\nstoll\t506\ndortmunder\t506\nshay\t506\nic 2\t506\nca 66\t506\ns fernando\t506\ntrek\t506\npenedes\t506\nregato\t506\ncrouch\t506\nvarshavskoi shossi\t506\ntulane\t506\njewett\t506\ndjebel\t506\nchemistry\t506\nher\t506\npoison\t506\n1013\t506\ncumberland rd\t506\ne 903\t506\nlos robles\t506\ndi5\t506\nfireside\t506\nr paul cezanne\t506\nlongchamp\t506\npastora\t506\nyakima\t506\nav general paz\t506\nabteilung\t506\nevents\t506\ngyeongjeon ln\t506\neira\t506\nbeans\t506\nlexus\t506\nstandart\t506\nchas\t506\npab\t506\na167\t506\nrauch\t506\nlaureano\t506\nap 9\t506\nkonoba\t506\nmo a\t506\nwakefild rd\t506\nco rd e\t506\nkoupali\t506\nnh30\t506\nuranus\t506\npulku\t506\ntashkintskaia\t506\ngioberti\t506\npree\t507\nadnan\t507\nshalefrain 3\t507\narpents\t507\nmercearia\t507\nfazant\t507\ndecima\t507\ntupper\t507\nseven 1 holdings\t507\noak cr\t507\n1077\t507\na470\t507\ng219\t507\npeterson rd\t507\nmurchison\t507\nnibelungen st\t507\nukrainska vulitsia\t507\nbernstein\t507\ndan in luan huang yuki ze gyeongbu exp s\t507\ncutter\t507\nlandsborough\t507\ndust\t507\nunitarian\t507\naugenoptik\t507\nchacon\t507\nozirna vulitsia\t507\nsaglik\t507\ns ding mu\t507\nyhdys\t507\nmather\t507\newald\t507\ntownline rd\t507\nprospikt stroitilii\t507\ntikhniki\t507\ns jorge\t507\nlinhares\t507\nponente\t507\ndelft\t507\ncomm ctr\t507\ncroas\t507\nmackenna\t507\nathlone\t507\nus 30 alternate old us 330\t507\nkwiatkowskigo\t507\nesteves\t507\nzwickaur\t507\n1650\t507\nelectrica\t507\ntasca\t507\nwurttembergische\t507\ndao107\t507\nslovenija\t507\nmt zion cemetery\t507\nhiriy\t507\nlimbach\t507\nstarego\t507\nmzhd\t507\npreta\t507\nmilliken\t507\nedgard\t507\ntiga\t507\nus 42\t507\nconn\t507\nquy\t508\ngeant\t508\ncavaillon\t508\njiffy lube\t508\nvorosmarty u\t508\npitrovskogo vulitsia\t508\nleopard\t508\ngeneva subdivision\t508\nlebre\t508\nanderson av\t508\n33rd st\t508\nfourneau\t508\nv novara\t508\nwoluwe\t508\nberea\t508\nstoneouse\t508\nheritage ln\t508\ncian\t508\npelto\t508\nalzira\t508\nstifan\t508\ns342\t508\nkamianka\t508\nrodnichok\t508\ntx 289\t508\nokhrany\t508\nparacelsus\t508\nspas\t508\nsoccorso\t508\nbrookwood dr\t508\nlas lomas\t508\n2055\t508\ndonk\t508\nbirches\t508\ntineretului\t508\necoponto\t508\nstudentenwerk\t508\nchp\t508\nrua 16\t508\ngyeongjeon\t508\ntolstoi\t508\nsp70\t508\npineridge\t508\nrouse\t508\ncowper\t508\nberens\t508\nneubaur\t508\n2040\t508\nsalem church\t508\ngeneral building\t508\nbite\t508\nhansens\t508\n2191\t508\nrosemead\t508\ncoffe\t508\nkhntrl\t508\nkazan\t508\ncameron rd\t509\nani\t509\nhowland\t509\npojazdow\t509\nokmulgee\t509\nligne de savenay a landerneau\t509\nfrunzi ul\t509\nbalefnkh mly\t509\nmonteagudo\t509\ncent\t509\nwurm\t509\ndixi rd\t509\niuzhnoi\t509\nbarkers\t509\nr du ch vert\t509\nluxemburger\t509\nrope\t509\nswirczewskigo\t509\nkongo\t509\ncruceiro\t509\nazure\t509\npommerai\t509\nmaximilian st\t509\nhammerweg\t509\nmission rd\t509\nredondel\t509\nufa\t509\nr des noyers\t509\nhanwa\t509\nfurza\t509\nmiller ln\t509\narriaga\t509\n3500\t509\nstefana batorego\t509\nkarbyshiva\t509\nmesa dr\t509\nporche\t509\nodisskaia\t509\n2210\t509\ncertosa\t509\nmasarykovo\t509\nd 618\t509\nrats\t509\nabsa\t509\ncarpenter rd\t509\nbellviw\t509\ntangenziale est\t509\nbarren\t509\nshms\t509\nbai chuan\t509\nvang\t509\nakacfa\t509\nocotillo\t509\nshvp\t509\nbradley st\t509\ntervuren\t509\nn 25\t509\ndactivite\t509\npenna\t509\ncomm rd\t509\nmechelse stwg\t509\nbidv\t509\nr 10\t510\nverdon\t510\nav aristide briand\t510\nbluberry ln\t510\nbella vsta\t510\nkiosko\t510\nchon\t510\nb 191\t510\ncaruso\t510\ntaqwa\t510\nvoronizhskaia\t510\nperle\t510\nhuhangyong gaosu\t510\nm14\t510\nballarat\t510\nsh 14\t510\nbeija\t510\ntalat\t510\nn mkt st\t510\n5 kvetna\t510\ntrones\t510\ndao176\t510\norono\t510\nebers\t510\nav presidente vargas\t510\nmanzanillo\t510\naydin\t510\ninfancia\t510\nzikenhuis\t510\nmangga\t510\nl 173\t510\noficina de correos\t510\nfarr\t510\ndalniaia ul\t510\nphahon\t510\nbarber shop\t510\npascoal\t510\nmurs\t510\nkrakow\t510\ntiatralnaia ul\t510\nmskhn\t510\nbessi\t510\nsunlight\t510\nodori\t510\nrn6\t510\noakcrest\t510\nladeras\t510\nfrindship church\t510\nlafayette av\t510\ngoldene\t510\nep20\t510\nhuhangyong exp\t510\nteczowa\t510\ncerezos\t511\nkulinariia\t511\nvysokaia\t511\ngaraze\t511\nmeall\t511\nstairs\t511\ntsilinnaia\t511\nantik\t511\nkarma\t511\nukrainky\t511\nkajaanin\t511\nwacker\t511\nlatour\t511\nlinder\t511\ncontre\t511\nbuschweg\t511\nptitsifabrika\t511\nprivokzalna\t511\nruines\t511\nk 67\t511\nb 184\t511\nshalefh\t511\ncolumbus st\t511\nash gr\t511\nhms\t511\n2025\t511\nn cr\t511\nasrama\t511\nconverse\t511\nsteinbruchweg\t511\nilinka\t511\ntotal accs\t511\nkastell\t511\nwilden\t511\nmarly\t511\neintracht\t511\nn76\t511\nkeller st\t511\nhatar\t511\ne 314\t511\nbrot\t511\nbadgers\t511\nptarmigan\t511\nchanning\t511\n1105\t511\nnegara\t511\nkhristova\t512\nbliska\t512\nwarrego\t512\nabadia\t512\ngibson rd\t512\nlambeth\t512\ncomuna\t512\nr louis bleriot\t512\n3c\t512\nn 7th av\t512\ndial\t512\npopple\t512\nbighorn\t512\nwinkl\t512\nrepubliky\t512\nbeatrix st\t512\npiramida\t512\nrabelo\t512\ne maple st\t512\ngrasse\t512\nkolk\t512\nb60\t512\nfu xing lu\t512\nleeuw\t512\nkasprowicza\t512\nrocket\t512\npesantren\t512\nfabra\t512\nsotni\t512\nbezrucova\t512\nseegraben\t512\npiacenza\t512\npotoka\t512\nmontoya\t512\nlongmeadow\t512\naparecido\t512\np za roma\t512\nclove\t512\ncth n\t512\nnewstead\t512\nzhudalg\t512\nchante\t512\nmav\t512\ndaodasdakdabs\t513\nwangen\t513\nsp73\t513\nmshhd\t513\ntidewater\t513\nmizhraionnaia\t513\ntasty\t513\nhaslach\t513\nrmlte\t513\nstell\t513\nvigny\t513\nmelezes\t513\nchickamauga\t513\nstandort\t513\nclayton rd\t513\nwaldpark\t513\noberlin\t513\narroyos\t513\nr101\t513\nze15\t513\nsivastopolskaia ul\t513\npl de verdun\t513\nlandgasthaus\t513\nrona\t513\nmolise\t513\njacint\t513\nrua onze\t513\ngolden state fwy\t513\nwesterly\t513\ndi4\t513\nkuopion\t513\n1 476\t513\ntrinity church\t513\nhales\t513\nbartley\t513\nguo daodasdakdabs hao\t513\nkayu\t513\ncr 39\t513\nfood mart\t513\nschaferei\t513\ngorkogo st\t513\nllorenc\t513\nrameau\t513\ntresor\t513\nwalter st\t513\nmanson\t513\nkoya\t513\ndoolittle\t513\nmechanical\t513\nn gr av\t513\nferial\t513\nthionville\t513\nsotsialnogo\t513\nlarchen st\t513\neckert\t513\ncevennes\t513\nsecao\t513\nherrenhaus\t513\npolivalente\t513\niss\t514\nn 322\t514\nobsluzhivaniia\t514\nr augu ste renoir\t514\ncordel\t514\nd 643\t514\nandras\t514\nkab\t514\nserge\t514\nademar\t514\nholywell\t514\nlutter\t514\nboulay\t514\nende\t514\nvozrozhdinii\t514\nblu cr\t514\nplatanen\t514\nbootshaus\t514\nulsan\t514\nav of saints\t514\nemirates\t514\nobecni urad\t514\nrapida\t514\npentland\t514\nasc\t514\npleasant hill church\t514\nmorg\t514\nv dei pini\t514\nalexander of macedonia\t514\np t\t514\nomsk\t514\ncollettore\t514\npartizanski\t514\nl 136\t514\nlloyds tsb\t514\nchardonnay\t514\nst 9\t514\nvat\t514\na df pl\t514\nolimpiiskii\t514\nhanover st\t514\niturbide\t514\ngolfe\t514\n1185\t514\nzhong yang zong wu huan xing xian\t514\nasp\t514\nwaddell\t514\ncolas\t514\nguadalquivir\t514\nchine\t514\ncottage ln\t514\ndzamija\t514\npioneer dr\t514\nschool number 1\t514\namstel\t515\naquileia\t515\nfeld bg st\t515\ncypriana kamila norwida\t515\nboyd st\t515\nchiusa\t515\nhochwald\t515\nantistaseos\t515\nbluff rd\t515\nzhd\t515\nlastra\t515\nsupercarretera\t515\nschleswig\t515\nbroome\t515\nstapleton\t515\nhunger\t515\nmalinovskogo\t515\nrn 2\t515\nalefmalefmzalefdh\t515\nsony\t515\ntimoteo\t515\nanas\t515\ntrio\t515\nwayne st\t515\nmekong\t515\njatoba\t515\nhillwood\t515\nljubljanska\t515\ngroveland\t515\nmdkhte\t515\nnatalia\t515\nparadise rd\t515\nradio shack\t515\nlamadrid\t515\nleiten\t515\nsidings\t515\nnowej\t515\ndorm\t515\nsainsburys local\t515\nmiskii\t515\ntangerine\t515\nhorny\t515\narran\t515\nprivate dr\t515\nb 81\t515\naspen ct\t515\neifelautobahn\t515\nkharkovskaia\t515\ndominicana\t515\ne 18 ah8\t515\nsavona\t515\n2070\t515\nbrecon\t516\nbenfica\t516\ntanka\t516\nkir\t516\nmenotti\t516\nst johns cemetery\t516\nmontseny\t516\nrichnoi piriulok\t516\nharp\t516\nlupin\t516\nrua boa vsta\t516\n71a\t516\npiute\t516\nbyn\t516\ncra 28\t516\nsignature\t516\nxiao tian chuan\t516\nagraria\t516\nvvur\t516\nriqulme\t516\nvolcano\t516\nshan yang dao\t516\nconfederate\t516\nbold\t516\ncolibris\t516\nmiskas\t516\nsportu\t516\nkool\t516\nn 24th st\t516\nyum\t516\ntojo\t516\n1 66\t516\ntd bank\t516\nhough\t516\noak rdge rd\t516\n1s\t516\ncollision\t516\nborngasse\t516\nd 820\t516\nbirgit\t516\ncranbourne\t516\ndevine\t516\nupt\t516\npk bd\t516\nostrovskogo vulitsia\t516\ncards\t516\nelio\t516\nsio\t516\nv cassia\t516\nsimpson rd\t516\nswing\t516\ncrowne\t516\nw chester pk\t517\nsdis\t517\nguo daodabsdabdak hao\t517\nsultana\t517\nrn2\t517\nhannibal\t517\nhackett\t517\nkholiittai bhiiddrbhng\t517\nav g\t517\nmunch\t517\ndetmolder st\t517\nyam\t517\nstudinchiskaia ul\t517\nesportes\t517\nl 21\t517\nbhiiddrbhng\t517\nnew r\t517\nmgdl\t517\ncarson st\t517\nsolnichni piriulok\t517\nmccloud\t517\nproliv\t517\nqua\t517\nn63\t517\nhighschool\t517\namadeo\t517\nd 220\t517\njmy\t517\ndaodabsdabdak\t517\nstadt graz\t517\nsimona\t517\nsinagoga\t517\nsiwa\t517\ntexas av\t517\nokrzei\t517\nzong guan t lu\t517\nreten\t517\nstn depuration\t517\nspring branch\t517\npaja\t517\ndewberry\t517\nbloomingdale\t517\ndubki\t517\n20b\t517\nlyzhnaia\t517\ns pablo av\t517\nsheridan st\t517\nsevigne\t517\ntortuga\t517\n3115\t517\nlloyds bank\t517\nmicala\t517\nteaching\t517\npoplars\t518\nrosemount\t518\nraba\t518\nneva\t518\nnavasiolki\t518\nabilene\t518\ngiambattista\t518\naviator\t518\nwladyslawa jagilly\t518\nshhalefb\t518\nav 5\t518\ng 11\t518\npowell rd\t518\nkopalnia\t518\npalas\t518\nmdm\t518\nus 275\t518\nquasimodo\t518\nyothin\t518\ntraurhalle\t518\nshorewood\t518\nvysoka\t518\nrak\t518\nqusada\t518\ninside\t518\nkeepers\t518\nagropecuaria\t518\natwater\t518\nstrana\t518\n1113\t518\naubrac\t518\nsophin\t518\nzinnia\t518\ncheonannonsan exp\t518\njarv\t518\ncheonannonsan\t518\nvillefranche\t518\nhlm\t518\nshang hai rao cheng gao su\t518\nsahil\t518\nculvert\t518\n859\t518\nrasen\t519\npond st\t519\ng 7\t519\nresurrection\t519\nmartir\t519\nnijverheids\t519\niugra\t519\nwassermuhle\t519\n4500\t519\n08a\t519\ntown hall\t519\nwoodbine av\t519\nreseda\t519\nabid\t519\nibiza\t519\nkniovna\t519\ndimitrov\t519\nr leon blum\t519\nbouillon\t519\nclearwater cr\t519\nworth st\t519\nvyhlidka\t519\nargun\t519\nmoseley\t519\nshanghai ring exp\t519\napolo\t519\nferte\t519\nzoll st\t519\nthat\t519\nolney\t519\nheywood\t519\noakton\t519\nhashim\t519\n1170\t519\nalefltjnb\t519\nlormeau\t519\narda\t519\n1 280\t519\nskoki\t519\nplaceta\t519\nprinsen\t519\nrhodfa\t519\nhoyuk\t519\nkollataja\t519\nknooppunt\t519\nmaisonneuve\t519\narrigo\t519\nflowage\t519\nguarderia\t519\nrutgers\t519\nproyecto\t519\nn 3rd av\t520\ntrans niderrhein magistrale\t520\nmazipi\t520\nzahir\t520\nt10\t520\npleasant gr church\t520\ninstytut\t520\nspolecznej\t520\nweimarer\t520\nveranda\t520\nyon\t520\nb 91\t520\nd 919\t520\nss48\t520\npionir\t520\nus 380\t520\ncarpinteria\t520\ngreenhills\t520\nhomestead dr\t520\nvisual\t520\napricot\t520\nkasai\t520\ncuckoo\t520\nkemuning\t520\ncellar\t520\narrayanes\t520\n1007\t520\nclimat\t520\nwern\t520\nr des chardonnerets\t520\nmatilda\t520\n983\t520\nberliner al\t520\ndan in xin gyeongbuseon\t520\nniki\t520\nvergel\t520\nautoroute jean lesage\t520\nedwarda\t520\nlivi\t520\nchefferi\t520\ncliff rd\t520\npowstancow wilkopolskich\t520\nabraq\t520\nc s migul\t520\n2310\t520\nbadgasse\t520\nbgn\t520\nilse\t520\ntpu\t520\ngladstone st\t521\njanes\t521\nbernardi\t521\nvittime\t521\ntaille\t521\nwisconsin central railroad\t521\narodromio\t521\nboylston\t521\njungbugosokdoro\t521\nr des artisans\t521\ncoxs\t521\nabrams\t521\nzadni\t521\n1214\t521\ngau\t521\nblackwater r\t521\nseabrook\t521\nfilding\t521\nchilders\t521\nglowackigo\t521\ntsz\t521\nnorden\t521\nwurttem\t521\nv 2 giugno\t521\nzalisi\t521\nburns rd\t521\nbasler st\t521\ndrinks\t521\nlong rd\t521\nwells st\t521\nrinaldi\t521\nspotted\t521\ndinner\t521\nmorristown\t521\nkrolewska\t521\ngiraud\t521\npacifica\t521\ncarrollton\t521\nautumn ln\t521\ngriggs\t521\nlli\t521\ncallahan\t521\nmargaridas\t521\nr du pressoir\t521\nbumi\t521\nnuclear\t521\nfaidherbe\t521\nmccarty\t521\nhenderson st\t522\nunidocente\t522\ne 13\t522\ntudela\t522\nchinh\t522\nxi huang gao su\t522\nstanley av\t522\nptu\t522\nk 66\t522\nbethleem church\t522\nlucknow\t522\nselim\t522\nguo dao8 hao\t522\nb 17\t522\ncollegiate\t522\nr du ft\t522\nquen elizabeth wy\t522\na d muhle\t522\nalkotmany u\t522\n32nd st\t522\nminster\t522\ndocks\t522\na wisengrund\t522\nsparse\t522\nb 255\t522\nus post office\t522\nd 218\t522\nturkestan siberia railway\t522\nrmk\t522\nteck\t522\nring 2\t522\nkirchfeld\t522\ncth h\t522\nduncan st\t522\ndruck\t522\nfinances\t522\nsr 72\t522\n1450\t522\noya\t522\nschnellfahrstrecke koln rh main\t522\nug\t522\namapa\t522\ndezesseis\t522\no3\t522\nkifern\t522\npreparatoria\t522\nplanetarium\t522\nalianza\t522\n35th st\t522\nhsl zuid\t522\ndistretto\t522\npokoju\t522\nburgenland\t522\nilla\t522\npedemontana\t522\nanaya\t522\nzion church\t522\nclubhaus\t522\ngz\t522\ngerolamo\t522\nbydgoska\t522\nget\t522\npazar\t522\njester\t522\nhazen\t522\nrobespirre\t522\nautoroute felix leclerc\t522\nbnsf railway\t523\nbrande\t523\ntourist information\t523\njing jiu xian\t523\ndwrbyn\t523\nfevereiro\t523\nash av\t523\ntikkurilan\t523\nkhudayr\t523\nguild\t523\nkhana\t523\nurozhainaia ul\t523\nvesta\t523\nwillow wy\t523\nremise\t523\nfco\t523\nlike\t523\nazteca\t523\nharrell\t523\nparkhill\t523\nv monte rosa\t523\nscalinata\t523\nboite\t523\namberley\t523\ncarretas\t523\ndushana\t523\npridorozhnaia\t523\nsinging\t523\ntavistock\t523\nmolodiozhni piriulok\t523\nsr 32\t523\nfrati\t523\nvolgograd\t523\nstn app\t523\nmujer\t523\npl du champ de foire\t523\ncollada\t523\nmemorial pk\t523\nwolga\t523\ngaylord\t523\ncrocetta\t523\npoul\t523\nchishma\t523\nd 603\t523\nlarsen\t523\nendeavour\t523\nsportkompliks\t523\nbakeshop\t524\nav georges pompidou\t524\npiles\t524\nbaylor\t524\neurospar\t524\ntirheim\t524\na 64\t524\nosterleden\t524\npiramide\t524\nfrisen st\t524\nhealth ctr\t524\ngolondrinas\t524\ncolne\t524\ndavis ln\t524\nsilvestro\t524\nteja\t524\nkazanskaia\t524\nearle\t524\nstevens rd\t524\nkeluarga\t524\nr jules gusde\t524\nbreast\t524\nhorizons\t524\nneu westbahn\t524\nuniwersytet\t524\nfoxtail\t524\nphrrdhphlllng\t524\npetrol stn\t524\nmaples\t524\ndawson rd\t524\nperiwinkle\t524\njlalefl\t524\nsvoboda\t524\nmwqf\t524\nbidwell\t524\nsnowsho\t524\nroure\t524\ndixon rd\t524\nbasingstoke\t524\nsherman av\t524\nannas\t524\nvarshavskoi\t524\nn 25th st\t524\ne14\t524\nnhs\t524\nmalmo\t524\ncuiaba\t524\nhalda\t524\nguo dao186 hao\t524\nban ji dian t shen hu xian\t524\ndrinking\t524\n849\t524\nrawhide\t524\nbernice\t524\nleroy merlin\t524\nchenevires\t524\ncsarda\t524\nclassroom\t524\nriddle\t525\ndurant\t525\npetty\t525\ngong qian chuan\t525\nglades\t525\nwindsor st\t525\nkorner st\t525\nbland\t525\nchinquapin\t525\nxiantag\t525\nfresco\t525\nlitva\t525\nrick\t525\n6000\t525\ndruzhbi vulitsia\t525\nperito\t525\no 52\t525\nsinopec\t525\neurospin\t525\nc 49\t525\nivanova\t525\nguter\t525\nst andrews rd\t525\njarzebinowa\t525\ngourmand\t525\nmutter\t525\nbousqut\t525\namarante\t525\nv matteotti\t525\naddington\t525\npulai\t525\nripon\t525\nkholm\t525\nexpressa\t525\nobservatorio\t525\nnaturel\t525\nprimax\t525\ncaspian\t525\nimmo\t525\nanggerik\t525\nbadan\t525\nsemi\t525\nteo\t525\nartinos\t525\ngrist\t525\nstn service e leclerc\t525\nd 216\t525\nchristiana\t526\nostkustbanan\t526\nacacia ln\t526\nrzemislnicza\t526\nager\t526\nkunterbunt\t526\nkastanin st\t526\n1 bruhl\t526\npalefyyn\t526\nrongwu\t526\nsinistro\t526\ndessau\t526\nmorvan\t526\nacme\t526\nzimmerman\t526\nkozi\t526\nsharpe\t526\nz sport pl\t526\nbrink st\t526\nhackney\t526\ndao54\t526\nmarks spencer\t526\nahon\t526\nwun\t526\ncr 42\t526\neastwood dr\t526\nphetkasem rd\t526\netap\t526\nalbert einstein st\t526\narchitecture\t526\naleflalefswd\t526\nanvil\t526\nkashtanovaia\t526\npappelallee\t526\nrais\t526\nanonima\t526\nmaple cr\t526\nweid\t526\nbtn\t526\nlibero\t526\nsouthwind\t526\ncontour\t526\nv francesco crispi\t526\nsodu g\t526\nopiki\t526\ns40\t526\nd 206\t526\nopshtina\t526\nzuoxhli\t526\nhelms\t526\nvanessa\t526\nnordlicher\t526\nd 205\t526\nmeteor\t526\ntheodor storm st\t526\njingha\t526\nmecklenburger\t526\nhangzhou ruili exp\t526\nnational rt 42\t526\ndeutschen\t526\nraiffaizin bank aval\t526\ncopley\t526\ncolombes\t526\nainmalefr\t526\nlois ln\t526\ndepanneur\t527\nskipton\t527\ncandle\t527\npine ct\t527\nscott av\t527\ns215\t527\n6th st n\t527\nmiradouro\t527\ngolf rd\t527\nnassau st\t527\npsj\t527\nbussteig 1\t527\nsr 73\t527\npineurst dr\t527\nsmolinskoi\t527\nr40\t527\nb 109\t527\nbelmont st\t527\nmladost\t527\n3a c\t527\nr de stn\t527\nchateau deau\t527\nvostochni piriulok\t527\nmami\t527\nnimitz\t527\nnansen\t527\nsmith cemetery\t527\nprofissionalni\t527\nazalefdgalefn\t527\npichler\t527\nstringer\t527\nkings r\t527\nfeurbach\t527\ntanzschule\t527\namal\t527\nsr 35\t527\negan\t527\nbeam\t527\nkiwanis\t527\nviwing\t527\njizni\t527\nkuan\t527\nr 4\t527\nwohnbau\t527\ncarrizo\t527\nlongviw dr\t527\nberna\t527\n1 57\t527\ne 24\t527\n3011\t527\nprioziornaia\t527\nalpenverein\t528\ndagubusangan exp\t528\nse 15th st\t528\ngasoline\t528\nrobinhood\t528\ntupac amaru\t528\nknowle\t528\npracy\t528\nfiacre\t528\nb 93\t528\npetar\t528\nqullen st\t528\nfame\t528\nrt t\t528\njuniper ln\t528\nbdy st\t528\nhegi\t528\nl 78\t528\nbebe\t528\ndagubusangan\t528\ndantoni\t528\nchana\t528\nhonor\t528\nbeacon st\t528\nd 178\t528\ncrown st\t528\nss4\t528\ncra 26\t528\ngruben\t528\ntouristiqu\t528\nheike\t528\nodilon\t528\ndvaro\t528\nkone\t528\ngall gall\t528\namsel st\t528\npalefrq\t528\njurija\t528\nbleus\t528\ngeyer\t528\nthalia\t528\ndwr\t528\nmayberry\t528\nmunitsipalni\t528\npl dr\t528\ndrink\t528\ntullys\t528\nc po\t528\nprairi av\t528\nkeikyu main ln\t528\ntool\t528\nskelly\t528\ngraduate\t528\ndemocracia\t528\n34th st\t528\ncorning\t529\nitea antirrio\t529\nw madison st\t529\npom\t529\nmeter\t529\nbrig\t529\nbazin\t529\nmontpelir\t529\npermanente\t529\npaderborner\t529\ndmitra\t529\ncredit mutul de bretagne\t529\nruta nacional 3\t529\nlyndon b johnson fwy\t529\nalmacenes\t529\nmubarak\t529\nglengarry\t529\nkelly st\t529\nr av\t529\nbca\t529\ngeren\t529\ndakar\t529\ninteramericana\t529\nst 2240\t529\njing ha gao su\t529\nnavchalnii\t529\nwp\t529\nalbrecht durer st\t529\ncaserta\t529\nnikolskii\t529\nquiteria\t529\nmigul hidalgo costilla\t529\ngrabowa\t529\nkrasny\t529\nsantambrogio\t529\nhagebau\t529\nmorrison rd\t529\nlodewijk\t529\ndwyer\t529\nantwerpse stwg\t529\nold state rd\t529\nc madrid\t529\npretoria\t529\nbash\t529\nmahmoud\t529\nkrista\t529\n2 3\t529\ngorham\t529\nelim\t529\nforces\t529\ndempster\t529\nno name\t529\nbodo\t529\ndickey\t529\namizade\t529\noutfitters\t529\ngurtel\t529\ngaviotas\t529\ncailloux\t529\nmet\t529\nkal\t529\nsavickaja vulica\t529\nep15\t529\nclearviw dr\t529\nparish rd\t529\nepsom\t529\naltair\t529\nhorsepen\t529\nhe nei chuan\t529\ncr 41\t529\natha\t529\nstonewood\t529\nbesucherpark\t529\nscherer\t529\nkhomeini\t529\nr mozart\t529\nl 73\t530\ntemple st\t530\nst stefan cel mare\t530\norwell\t530\nb 189\t530\ntaha\t530\npurtas\t530\ngdn ln\t530\ntongu\t530\nportobello\t530\nmuri\t530\njovanovitsha\t530\nbipa\t530\nolimpiiskaia ul\t530\nchengkun ln\t530\ngisborne\t530\nottica\t530\ngallen\t530\nrua paraiba\t530\neastland\t530\nduclos\t530\nul mindiliiva\t530\ntariq\t530\nnerudova\t530\nchenai\t530\npez\t530\nathens thessaloniki evzoni\t530\nloring\t530\nklinge\t530\ncrew\t530\nkharab\t530\nlakeridge\t530\nheung\t530\nvolkova\t530\neditado por ivan arenas\t530\nmogilki\t530\natv\t530\nkarvej\t530\nvtoraia\t530\nethnikes\t530\narteaga\t530\nwilliams av\t530\ncharanvincharanvinanjilinsan\t530\nr43\t530\nbrowns cr\t530\noazis\t530\nboones\t530\nmedellin\t530\nthibault\t530\nold us 330\t530\nchengkun\t530\nus 5\t531\nkandi\t531\nlicenciado\t531\ngeziret\t531\nhowards\t531\nqumada\t531\nmirova\t531\nashgrove\t531\namapolas\t531\nwyli\t531\nbosse\t531\nfacundo\t531\nerrekea\t531\nc sevilla\t531\nreale\t531\nfukagawa\t531\nrua 13 de maio\t531\nnogura\t531\nlangton\t531\nmibili\t531\ns228\t531\nedoardo\t531\njulitte\t531\narthurs\t531\nstuart st\t531\nblumenau\t531\nbundesanstalt technisches hilfswerk thw\t531\nstellwerk\t531\nb 244\t531\nroti\t531\nbos ln\t531\nfomento\t531\nc s francisco\t531\n1134\t531\nsheridan rd\t531\nbarba\t531\nfontane st\t531\nb 95\t531\n80n\t531\nhaverhill\t531\nhohenzollern st\t531\nknigi\t531\ntilsiter st\t531\njinshan\t531\nbellas\t531\nsaddlebrook\t531\npurdu\t531\nmagdalene\t532\ns ctr st\t532\nvolontari\t532\nsocita\t532\npamiati\t532\ncinaga\t532\ndao311\t532\nr danjou\t532\ngriffin rd\t532\npoirirs\t532\nny g\t532\npopov\t532\npomoshch\t532\nshuanghli\t532\nul tsiolkovskogo\t532\nconsulo\t532\nnorthwood dr\t532\ntaitung\t532\n54a\t532\nmqr\t532\nallmend st\t532\nprumyslova\t532\nkaffee\t532\nr jacqus brel\t532\nholland rd\t532\npatrice\t532\nmt pleasant church\t532\noaxaca\t532\nmuskrat\t532\nv umbria\t532\nsh 82\t532\nd 163\t532\ntsin\t532\nfrdwsy\t532\nnemocnice\t532\nujezd\t532\nmakarinko\t532\nnsr\t532\nco rd 31\t532\nlagar\t532\ncle\t532\nmacarthur bd\t532\nkas\t533\nv della vittoria\t533\nhorca\t533\ngiron\t533\nhawthorne rd\t533\nping ru gao su\t533\njakes\t533\nho hong luan huang yuki ze honam exp\t533\nmarinkapelle\t533\nharvard av\t533\nrossiiskoi\t533\n1 35w\t533\nred oak dr\t533\nwestelijke\t533\n1870\t533\ndarmstadt\t533\nbronze\t533\ntyrone\t533\nliberazione\t533\ns224\t533\nyardley\t533\nwingfild\t533\nbozeny\t533\n2150\t533\nbeausoleil\t533\nareas agricolas\t533\nnoce\t533\nswm2\t533\nbakke\t533\nstavok\t533\ndoorman\t533\ntrakiia\t533\ni shi zi dong ch dao\t533\nshalefhd\t533\nsentir cotir\t533\nroyd\t533\nbadminton\t533\ncorran\t533\ngondola\t533\ntradgards\t533\noctober\t533\nh3\t533\nseccion\t533\nsherwood rd\t533\nseverin\t533\nsp82\t533\naunweg\t533\nmeurthe\t533\nevesham\t533\nbyrne\t533\ndogwood rd\t533\nn fork feather r\t533\ntowarowa\t533\neditado\t533\nsman\t533\nzeus\t533\nachadh\t533\ngd\t533\nt15\t533\nfeed\t533\ns61\t533\nbuckner\t533\ngaspare\t534\nkuc\t534\njeil\t534\nbouqut\t534\neccles\t534\nmokyklos\t534\n6th av n\t534\ns agustin\t534\nligne shinkansen sanyo\t534\nbayswater\t534\njackson dr\t534\ndisna\t534\nwenhua\t534\nchemi\t534\nsklady\t534\njaune\t534\npsaje 4\t534\nduqusne\t534\nbakr\t534\nantena\t534\nchurch c\t534\nsanhardio sinkansen\t534\ndogwood st\t534\nscott dr\t534\nbarqa\t534\nluar\t534\nprolitarska vulitsia\t534\ngiro\t534\nkibitzweg\t534\nv delle rose\t534\nho hong luan huang yuki ze\t534\ndan pi xin\t534\nlilinthal st\t534\nirvin\t534\ncreation\t534\nhemlock ln\t534\nwhittington\t534\nmem\t534\nsuccess\t534\npl du 19 mars 1962\t534\nbeverly dr\t534\nlong chuan\t534\nind bd\t534\ntianjin\t534\nparadise ln\t534\nrrrnguuddh\t534\nmarijke\t534\nmistleto\t534\nliberty av\t534\nfrench broad r\t534\neglise notre dame de lassomption\t534\nrrrnguuddh uulllikorrngiireei\t534\nuulllikorrngiireei\t534\npap\t534\ncorts\t535\nmarbach\t535\nsargento cabral\t535\nwinter trl\t535\nshaffer\t535\nshane\t535\nsecurite\t535\ninspiration\t535\nkorla\t535\nbrugse\t535\nguillen\t535\nmoveis\t535\nhitchcock\t535\nridgeland\t535\nszanjo sinkanszen\t535\n1225\t535\nchia\t535\nschaffhauser\t535\nhighpoint\t535\nfootbridge\t535\nhells\t535\nodeon\t535\nw mkt st\t535\nwestway\t535\npoliclinica\t535\ns western main ln\t535\nmasi\t535\naspen ln\t535\nrua 15\t535\nmlynsky\t535\nszanjo\t535\nadmiralty\t535\nbulldog\t535\nrua marechal deodoro\t535\npizzas\t535\nbexley\t535\nyeo\t535\nbocaiuva\t535\nl 29\t535\nparkwood dr\t535\nyale univ\t535\nturin\t535\nschonaur\t535\ntawil\t535\na 89\t536\nregio\t536\nlome\t536\nyayasan\t536\ngiao\t536\namour\t536\naround\t536\ndavy\t536\nainlmyn\t536\nparrot\t536\nlambs\t536\nnhw\t536\nsivirni piriulok\t536\nkustbanan\t536\nlida\t536\nferruccio\t536\nhwn\t536\nfalcon dr\t536\ncommonwealth av\t536\nbeyer\t536\nawg\t536\nful stn\t536\ngrossa\t536\nr13\t536\nneunkirchen\t536\nelise\t536\ndao309\t536\ngertrudis\t536\nbk st\t536\nbr 316\t536\noranje st\t536\ncochabamba\t536\nvtb 24\t536\nivy st\t536\nmuvelodesi\t536\nmaraichers\t536\ngaucho\t536\nmaybach\t536\nbilorusskaia\t536\nmarcellin\t536\nindus\t536\nl 190\t536\nzhimchuzhina\t536\nmibilni\t536\naleflnby\t536\nellis rd\t537\ntorrecilla\t537\nlindenwood\t537\ncatharina\t537\nbryant st\t537\ncth e\t537\nrude\t537\nburton rd\t537\nkampweg\t537\nbranchement\t537\niowa st\t537\nloli\t537\ntualatin\t537\n102 qun\t537\ndao12\t537\ninst\t537\ngup\t537\nibm\t537\nsaverio\t537\ngharbiyah\t537\nal des peuplirs\t537\ntham\t537\n1082\t537\nonder\t537\nhani\t537\nbadger cr\t537\nrio parana\t537\npiters\t537\nkorinthos\t537\nparr\t537\nav 4\t537\nazalea dr\t537\nvolia\t537\nrund\t537\nromans\t537\n2120\t537\npk vw\t537\nconsulado\t537\nturksib\t537\nn 4th av\t537\nmargarethen\t537\nrayburn\t537\nschwartz\t537\n085\t537\njackson cr\t537\ne 52 e 60\t537\naras\t537\nrejo\t537\nlandon\t537\nwhrf rd\t537\ntraube\t537\nav rd\t537\nus 44\t537\nparcheggio disabili\t537\nss51\t537\nmargit\t537\ncarbonera\t537\nhakodate\t538\nxin dong ming gao su dao lu\t538\nb145\t538\nsavane\t538\ngallagher\t538\nrodovia comandante joao ribeiro de barros\t538\n1091\t538\ndesvio\t538\nthelma\t538\na 104\t538\nferguson rd\t538\nkarczma\t538\neunice\t538\nmudurlugu\t538\nkastoria\t538\npetru\t538\nmcdougall\t538\nkz\t538\nkoto\t538\nrundwanderweg\t538\naleksandar makedonski\t538\npochinok\t538\npiu\t538\nmasraf\t538\nlusine\t538\nnuri\t538\ngenerali\t538\nbetania\t538\ntulsa\t538\npost ch ag\t538\nanderson cr\t538\nw 17th st\t538\nsry\t538\nfysl\t538\nd885\t538\nabdon\t538\nraritan\t538\nlenoir\t538\nwingert\t538\nkickapoo\t538\nsalvia\t538\nvejlevej\t538\n1 67\t538\nctra santander vinaroz\t538\nvillares\t538\nhuset\t538\naleflmdrste\t538\nbugambilias\t538\nmure\t538\ncapricorn\t538\nunited states hwy 34\t538\ndg\t538\njenner\t538\nss17\t538\nfix price\t538\nstate ln rd\t538\nishun\t538\nbennet\t538\npuget\t538\na 59\t539\npolici\t539\nconrado\t539\nvoru\t539\nbateau\t539\nfels\t539\npolish\t539\nsuryatlalefk\t539\ncr 46\t539\n026\t539\nnashua\t539\noverhill\t539\nflaubert\t539\ncardigan\t539\nseen\t539\nabukuma\t539\ngrazhdanskaia ul\t539\nbricomarche\t539\nbotro\t539\nl 140\t539\nmeadowlands\t539\nusina\t539\ngerrit\t539\ns eastern main ln\t539\nl 361\t539\nfuzhou\t539\nvinzenz\t539\nkathryn\t539\nv s francesco dassisi\t539\nstalina\t539\njoubert\t539\nstocker\t539\nbaleflalef\t539\nleipzig hof\t539\nmisko\t539\ndempsey\t539\n64n\t539\nstockport\t539\nky 80\t539\nprise\t539\nchabrowa\t539\nscizka\t539\nbono\t539\ntwhyd\t539\nsp81\t540\nfees\t540\n400th\t540\nhedges\t540\nmechanic st\t540\nraabe\t540\nn31\t540\nc libertad\t540\nescanaba\t540\nezers\t540\ngrindstone\t540\ncab\t540\nrua orquideas\t540\nclothes\t540\nss73\t540\nd 937\t540\ntirras\t540\npeking\t540\n798\t540\nflevolijn\t540\npacific st\t540\nnarzissenweg\t540\nbutler rd\t540\ndufour\t540\nl4\t540\nl 151\t540\ntranquil\t540\nmayenne\t540\nipanema\t540\ndarsena\t540\nhomburger\t540\nhorns\t540\njaagpad\t540\nvanguard\t540\nbarbados\t540\nstocks\t540\nkayseri\t540\npommern\t540\nvillon\t540\nkiler st\t540\nimportadora\t540\nmilitsii\t540\nwindmuhlen\t540\npraspekt\t540\nalefljzyrte\t540\nrua j\t540\npok\t540\nvegyesbolt\t540\nd 675\t541\nwuke\t541\nditali\t541\ndimiana\t541\nalmaty\t541\ndinamarca\t541\ndkhtralefnh\t541\nwaldler\t541\nn 432\t541\nosinovka\t541\nrt yellowhead\t541\nashbrook\t541\nspeed camera\t541\nmenengah\t541\nmanara\t541\nmichelbach\t541\nhessenweg\t541\nantigo\t541\nkalinina ul\t541\nr des sapins\t541\nboven\t541\nkuznichnaia\t541\nrudnik\t541\naleixo\t541\nrafala\t541\nr ampere\t541\nbachelet\t541\nsaraiva\t541\nmichels\t541\nschellfischlini\t541\ncranford\t541\nr du chene\t541\nboing\t541\nikhlas\t541\nmenara\t541\ncomplanare\t541\ngellert\t541\namer\t541\nr50\t541\nfo shan i huan\t541\nchenal\t541\npatuxent\t541\narcangel\t541\njose maria morelos\t541\n1036\t541\njhalefd\t541\nphetkasem\t541\nlennon\t542\nbiologiqu\t542\nproximite\t542\nfrankston\t542\ndireita\t542\ndenizu\t542\nygalefl\t542\ntirpark\t542\nadkins\t542\nostsee\t542\ndezoito\t542\nsnowden\t542\nfirth\t542\nr 24\t542\nbyaleflyq\t542\narodromnaia\t542\ncaffetteria\t542\nvalls\t542\nstetson\t542\ngoth\t542\nzwirki 1 wigury\t542\nscranton\t542\ncelio\t542\nneisse\t542\ntrotter\t542\ngrenzgraben\t542\nwhiteill\t542\nsalguiro\t542\nloir\t542\nvvdas\t542\nl 39\t542\ndonjon\t542\ne 234\t542\nv giuseppe parini\t542\ncoupe\t542\nkrutoi\t542\nhiper\t542\ncorta\t542\nbazan\t542\ngave\t542\nmsr\t543\nhancock st\t543\nl 163\t543\nsharps\t543\nperdido\t543\nn 601\t543\nkharbin\t543\nturkestan\t543\nhnos\t543\nmagnoliia\t543\nproduce\t543\nkerk ln\t543\nkoster\t543\ncisterna\t543\nstephanus\t543\nav georges clemenceau\t543\njuly\t543\nlobby\t543\nkert\t543\nav hipolito yrigoyen\t543\nmonastere\t543\nintegracao\t543\ncaseros\t543\nsaka\t543\njdwl\t543\nespina\t543\nhenriqus\t543\nsolidaridad\t543\npalladio\t543\nsubdivison\t543\n090\t543\nnzoz\t543\nmuscat\t543\nmeireles\t543\nwars\t543\nold r rd\t543\nnijverheidsweg\t543\nkaminica\t543\nlohe\t543\nnational trust\t543\ntinistaia ul\t543\nmaan\t543\ntelepizza\t544\nc s pedro\t544\nroo\t544\nsinkanszen\t544\ntove\t544\nmurmanskoi\t544\ncarlota\t544\nutopia\t544\nautoteile\t544\nbjork\t544\nfayetteville\t544\nzilinii\t544\nbrise\t544\nrayo\t544\ncalade\t544\nmlyna\t544\nhtml\t544\ntherme\t544\ngrote st\t544\nsvirdlova vulitsia\t544\nkhvtsh\t544\nherrick\t544\nvins\t544\nkhai\t544\nshalefrain 2\t544\naaa\t544\nwittener st\t544\ns 15th st\t544\nmanty\t544\nbelmont rd\t544\nrodin\t544\ngarros\t544\nw 18th st\t544\nbuddy\t544\npacinotti\t544\nshainbh\t544\ngaziantep\t544\nnaif\t544\nreichenbacher\t544\ndorfbrunnen\t544\nzwijger\t544\nleu\t544\neisenacher\t544\nharding st\t544\nbryson\t544\nzay\t544\nsandusky\t545\nlaurel rd\t545\nr de provence\t545\netos\t545\nstud\t545\ncaridad\t545\nrudy\t545\ntonga\t545\nfosters\t545\nhyland\t545\ncr av\t545\nszabadsag ter\t545\ncharcuteri\t545\ng110\t545\nfischerweg\t545\nxinjiang\t545\nd 191\t545\narchery\t545\nstanislawa wyspianskigo\t545\nn 8\t545\ntamagawa\t545\nus 56\t545\nalpenblick\t545\ncrossings\t545\ntorretta\t545\nweinstube\t545\nanello\t545\nmapleton\t545\nrua da igreja\t545\n035\t545\nthomas muntzer st\t545\nconquista\t545\nsntr\t545\nfusilles\t545\n2031\t545\nd 224\t545\npl des tilleuls\t545\nnasi\t545\ntenerife\t545\ngreensboro\t545\ncela\t545\nstreda\t545\nbarnes rd\t545\nschoner\t545\ndekra\t545\nl 200\t545\ngreat clips\t545\ntejo\t545\nescola mun de ensino fundamental\t545\ngraig\t545\nvalenciana\t545\nulivi\t545\n4a c\t545\ncecilio\t545\nshaheed\t545\nb 254\t545\ncra 25\t545\nsta elena\t545\ncementerio mun\t545\nautomat\t546\nfarmaci\t546\nponent\t546\npersian\t546\nd 210\t546\ns central av\t546\nhov\t546\nslack\t546\nalpine dr\t546\ngesundheitszentrum\t546\nhofmark\t546\nrittergut\t546\nshan yang dian qi t dao ben xian\t546\nmunicipales\t546\nseoulogwaksunhwangosokdoro\t546\nmcra\t546\n74a\t546\ntaylor dr\t546\nosterfeld\t546\noziorni\t546\nc h\t546\nbotaniqu\t546\nlivres\t546\nfancy\t546\ncaseys general st\t546\nmovi\t546\naltona\t546\nars\t546\nbalance\t546\ntravail\t546\nkapsalon\t546\nstrani\t546\nstaufen\t546\nbigelow\t546\nsip\t546\nflagstone\t546\nmedersa\t546\npodlesna\t546\n4010\t546\ncuneo\t546\nlowery\t546\nrn 11\t547\ndawes\t547\nhorou\t547\nbrown av\t547\nstjepana\t547\nc 52\t547\nclifton rd\t547\ntesta\t547\nlugano\t547\nwladyslawa broniwskigo\t547\nbight\t547\nvenizelou\t547\nqnp\t547\nandreu\t547\nk 65\t547\nransom\t547\nkostelni\t547\nhofgarten\t547\njumping\t547\nlas vegas\t547\ndennen\t547\nprimarschule\t547\nminiature\t547\nneris\t547\nguo dao53 hao\t547\ns36\t547\nlidia\t547\npadiglione\t547\nfarhan\t547\nreed rd\t547\nbryd\t547\nhart st\t547\nsalz st\t547\ncouronne\t547\ndan in luan huang yuki ze gyeongbu exp n\t547\ncapao\t547\nsp62\t547\nbellerive\t547\nrn34\t547\npommir\t547\ndama\t547\nchristians\t547\nguo daodabdamdang hao\t547\nfakultesi\t547\nsportivna\t547\nmiddel\t547\ndani\t547\nlas vinas\t547\nrua rosas\t547\nelgin st\t547\n255th\t547\njuri\t547\n50 st\t547\ncirculation\t547\nparka\t547\ncliffe\t547\nav principal\t547\nstoneleigh\t547\nm21\t547\nreza\t547\nbordj\t547\nalter weg\t547\ne mkt st\t547\npluit\t547\nl 15\t548\nbrewers\t548\nmontagna\t548\nangostura\t548\nze14\t548\nblaze\t548\ns338\t548\nmaasdijk\t548\nvenn\t548\ncentrul\t548\nroccolo\t548\ntamarac\t548\nalefbyb\t548\ncoldstream\t548\nwoodmere\t548\nalessandria\t548\nedgewood rd\t548\nr des forges\t548\ntraiteur\t548\nul vorovskogo\t548\nstotis\t548\nch des pres\t548\nbiblioteca mun\t548\npecanha\t548\npopuliren\t548\nl 74\t548\ncaselle\t548\nmoa\t548\npiatra\t548\nsondergade\t548\nrosebank\t548\npravda\t548\ntoa\t548\nesteve\t548\ntanyard\t548\na45\t548\nd 323\t548\nmeadow ct\t548\nul bogdana khmilnitskogo\t548\nmartin luther king\t548\nbunting\t548\ncumberland st\t548\nsuur\t548\nkempen\t548\na96\t548\ndellappennino\t548\nwaldsidlung\t548\nch du chateau\t548\nantona\t548\na 94\t549\nhilal\t549\nbundesanstalt technisches hilfswerk\t549\npatron\t549\ns 40\t549\nvezer\t549\nc po de futbol\t549\nrockville\t549\nlanza\t549\nseoul ring exp\t549\nwaldheim\t549\ncalzados\t549\npinedale\t549\npirates\t549\nanyar\t549\nraduzhnaia ul\t549\noptima\t549\nmacia\t549\nmarl\t549\netela\t549\nferraris\t549\nrousse\t549\ndillard\t549\nclubhouse dr\t549\nherr\t549\nsavino\t549\nkhaled\t549\nk 68\t549\nheine st\t549\nfirst church of christ scintist\t549\nmalina\t549\ndincendi\t549\nsik\t549\nb 30\t549\nrn38\t549\n65a\t549\ningleside\t549\n1a c\t549\npogranichnaia ul\t549\ntallinna\t549\nkoninginne\t549\nsobral\t549\nn33\t549\nlandscape\t549\nxiang gang you zheng hong kong post\t549\nck\t549\nvercelli\t549\npuglia\t549\nmedival\t549\ntalca\t549\nwaldfriden\t549\nstivana\t549\nzhongshan rd\t550\ncoburn\t550\nstrait\t550\nfederal hwy\t550\nbunny\t550\nantrim\t550\nkhralefyb\t550\ndao18\t550\ncintura\t550\nmelba\t550\nreinigung\t550\nbogdan\t550\nsemmelweis\t550\nodd\t550\nsackville\t550\nbenin\t550\nauto del sur\t550\nzwembad\t550\nkhmys\t550\nkalefml\t550\n1112\t550\nnahkauf\t550\ndiqu\t550\nprtco\t550\nhbnym\t550\ndaodabdamdang\t550\nrua sta luzia\t550\npaschi\t550\njin chuan\t550\ncollina\t550\ngrobla\t550\npetanqu\t550\nduren\t550\nrsaleflt\t550\nbergische\t550\nxiandal\t550\nbarsuki\t550\nl 116\t550\njenni\t550\nind rd\t550\nscar\t550\nbadweg\t550\nrobinwood\t550\nr marcel pagnol\t550\noak gr rd\t551\njerrys\t551\nze16\t551\nnair\t551\nguo dao19 hao\t551\nlir\t551\nv giovanni boccaccio\t551\ncharcoal\t551\nmornington\t551\nbanamex\t551\nsadova st\t551\nkorczaka\t551\nulianova\t551\nairlines\t551\nacqu\t551\nbernat\t551\nhickey\t551\nrace st\t551\nsayh\t551\ntanager\t551\nlidicka\t551\nkholiittai\t551\nnh9\t551\nclinico\t551\nfairviw cemetery\t551\nfebbraio\t551\ncorr\t551\nfilles\t551\nneukirchen\t551\nch du lavoir\t551\nsap\t551\na 48\t551\nkasteel st\t551\nhorcajo\t551\nb52\t551\nsykes\t551\nwarsaw\t551\ngiochi\t551\nzhkkh\t551\nul gaidara\t551\ncoles express\t551\ndruckerei\t551\nbermudez\t551\nav sao paulo\t551\ncareer\t551\ns222\t551\nantero\t552\nsuperstrada\t552\nfaisal\t552\nledesma\t552\npitrova\t552\njeune\t552\ndiving\t552\nacevedo\t552\nwormser\t552\ng15w\t552\ncisowa\t552\nkuytun\t552\npapen\t552\nbartholomew\t552\nprolitarska\t552\nshasha\t552\nvalta t\t552\n39a\t552\nduncan rd\t552\nartima vulitsia\t552\npitrovka\t552\nr du tilleul\t552\nclive\t552\nn 2nd av\t552\ndezenove\t552\nr du viux moulin\t552\na d bahn\t552\nr centrale\t552\npisacane\t553\nhuffman\t553\ntunguska\t553\nrenfrew\t553\nquiktrip\t553\ngongke\t553\n984\t553\nescondida\t553\njewellery\t553\ndoon\t553\n3300\t553\nlatorre\t553\ncorrado\t553\nfalefdl\t553\nnhm\t553\nlougheed hwy\t553\neren\t553\nguadarrama\t553\ngimnazium\t553\nchanhlu\t553\nhoher weg\t553\nmapa\t553\nwindemere\t553\nr st nicolas\t553\nbreil\t553\ndinkey cr\t553\ndonnelly\t553\nzwaluw\t553\ndotoru\t553\nsyh\t553\nv stambanan\t553\nkrupp\t553\npaliw\t553\nn broad st\t553\nolive gdn\t553\namphitheater\t553\n350th\t553\nmannerheimin\t553\ndiga\t553\nw maple st\t553\neuropea\t553\nrance\t553\ndanske\t554\npinfold\t554\nshang yu xian\t554\ngigante\t554\ndon bosco\t554\nsycamore cr\t554\ndekalb\t554\nhsynyh\t554\nmonastir\t554\nraqul\t554\nmaiakovskogo vulitsia\t554\nshhdalefy\t554\nqasim\t554\nrwe\t554\nwug\t554\nlaveri\t554\nalbeniz\t554\ncapanna\t554\nbethel cemetery\t554\nr 256\t554\nhausen\t554\nctt\t554\nother\t554\nsibirskaia ul\t554\nruta nacional 14\t554\nfasanen st\t554\norchidees\t554\nbrooks rd\t554\nfridays\t554\nriz\t554\nv mazzini\t554\nal des chenes\t554\nbrodi\t554\nribbon\t554\nguo daodasdakdass hao\t554\nthuringer st\t554\nschonblick\t554\ndefence\t554\nwesterplatte\t554\ndaodasdakdass\t554\nw state st\t554\nstearns\t554\naleflsryainte\t554\nzachary\t554\nn jefferson st\t554\nvalletta\t554\nvantage\t554\ngeary\t554\n890\t554\narch st\t554\ncuil\t554\nhurontario\t554\nbaross\t554\npow\t555\nlerma\t555\nloise\t555\nwashington rd\t555\npicton\t555\nneptun\t555\nmaxime\t555\n1212\t555\namanecer\t555\navtozimnik\t555\nsudhang\t555\nprevost\t555\npawn\t555\ngeranium\t555\nauto de mediterrania\t555\nbourse\t555\nwheatsheaf\t555\nalimentacion\t555\nkupang\t555\nkincaid\t555\nleatherwood\t555\nv tevere\t555\ntraktovaia ul\t555\nsp92\t555\neconomia\t555\ncathy\t555\nmartin dr\t555\nwoodroffe\t555\npaddington\t555\ntinker\t555\ndeerfild dr\t555\nonibus\t555\nlombardo\t555\nglenfild\t555\nmtn av\t555\njordao\t555\npoz\t555\nairy\t555\nlothar\t555\nnatale\t555\n1035\t555\nzagorodnaia ul\t555\nmarjori\t555\nmodas\t555\nknightsbridge\t555\nlas rosas\t555\njordan rd\t555\nliningradskii\t555\nvolks\t555\nmillstream\t555\nvirrey\t555\nshinjuku\t555\nsalar\t555\nbarnabas\t555\nc paz\t555\nvegetable\t555\nmarten\t555\nsalvator\t556\nkinizsi\t556\npavlovka\t556\ndabrowka\t556\ncervera\t556\nn scottsdale rd\t556\njula\t556\npassa\t556\ndavis cr\t556\nbusto\t556\n886\t556\npors\t556\nb23\t556\ncromer\t556\nkidul\t556\nhali\t556\nflstyn\t556\nmahon\t556\nevangelist\t556\nmagnit kosmitik\t556\na300\t556\n58a\t556\njas\t556\nmollard\t556\nmeisen\t556\ncrepe\t556\nleonard st\t556\nvrede\t556\nmicrorregiao\t556\nprospero\t556\nkhngngpsnsdddhlllg\t556\nhosok\t556\nrungkut\t556\nalmaden\t556\njeovas\t556\nbiltmore\t556\ncaswell\t556\ndpd\t556\npawnshop\t556\nberzu\t556\nheck\t556\ngarrido\t556\nconsejo\t556\nportella\t556\nst 10\t556\n101 qun\t556\nita vla\t556\nherenweg\t556\nv flaminia\t556\ntrafford\t556\njacki\t556\ntranquility\t556\n04 22\t556\nbaywa\t556\ntown open space\t557\nberga\t557\nb 35\t557\nold farm rd\t557\nkhor\t557\ngrenville\t557\nul novosiolov\t557\nkalan\t557\nhopfengarten\t557\ncottage st\t557\nb 455\t557\ndruid\t557\nss115\t557\na350\t557\nsabin\t557\nkochi\t557\ncastellar\t557\nr verte\t557\ncerrillos\t557\nterrir\t557\nmlodzizowa\t557\nl 10\t557\nabruzzese\t557\nthumb\t557\naleflmtalefr\t557\ndamour\t557\nobaga\t557\nrigel\t557\noc\t557\nb 462\t557\nbuna vsta\t557\nspider\t557\nss35\t557\nhuasenv\t557\nkaminnaia\t557\nchirvonoarmiiska vulitsia\t557\nus 410\t557\nus 91 sr 18\t557\ngateway dr\t557\nr de normandi\t557\nsilskogo\t557\nr jean monnet\t557\nmalek\t557\nivroopt\t557\nbann\t557\narnika\t557\nfu in gao su\t558\ndamaschke\t558\nbedford st\t558\nhermon\t558\nv antonio vivaldi\t558\nvous\t558\nchartwell\t558\nfear\t558\nmaltings\t558\nferri\t558\nheathcote\t558\nwybudowani\t558\nwheeler rd\t558\nnadrzeczna\t558\nmhaleffzte\t558\ncerezo\t558\ngilbert st\t558\nroseland\t558\nc dr fleming\t558\ntela\t558\nc g\t558\nkami\t558\nnoronha\t558\nherndon\t558\ncadiz subdivision\t558\nesquinas\t558\naussichtspunkt\t558\nvignoble\t558\nal nipodleglosci\t558\nelm ct\t558\ndaphne\t558\ncantos\t558\ngrind\t558\nr 5\t558\nmysliwska\t558\nd 942\t558\nmooney\t558\nbelvidere\t558\nvenetian\t558\n1131\t558\nsannitico\t558\nhutt\t558\nsteinmetz\t558\nroku\t558\npowell st\t558\nnova poshta 2\t558\nvire\t558\nkarla marksa st\t558\nav de liberte\t558\nscintifico\t559\nduin\t559\nhayes st\t559\ndavis av\t559\npokrovskii\t559\npl du chateau\t559\njakobs\t559\nandromeda\t559\noak hill rd\t559\nwuppertal\t559\nflorianopolis\t559\ncripple\t559\nmoors\t559\nargonne\t559\npoitirs\t559\nimports\t559\nholbein\t559\nlinne\t559\ngeoje\t559\nji yan gao su\t559\nc s isidro\t559\niris st\t559\ntravellers\t559\nauto del cantabrico\t559\nchambery\t559\nnato\t559\nsirena\t559\npl de toros\t559\nbavaria\t559\nbourke\t559\nd 219\t559\ntsara\t559\npr bernhard ln\t559\nekonom\t559\nchurch of nazarene\t559\n799\t559\netats\t559\nvermeer\t559\nedmonds\t559\nchantemerle\t559\nwhiteorse\t559\nnewington\t559\nvoortrekker\t559\nvereinshaus\t559\nb 32\t559\nwildwood ln\t559\nayr\t559\ncory\t559\no 4\t559\nchrzcicila\t559\nstern st\t559\nsalute\t560\nlas flores\t560\nmidland hwy\t560\nnc 24\t560\n55a\t560\nphillips st\t560\ns marcos\t560\nheil\t560\nmagistrala weglowa\t560\ndonskoi\t560\nquensland\t560\nravintola\t560\ngiusto\t560\nmarini\t560\ncrenshaw bd\t560\ntub\t560\ntubingen\t560\nludal\t560\nl 288\t560\nm 19\t560\nspoor st\t560\nmonitor\t560\nbaroni\t560\nkalvaria\t560\nhorses\t560\nsvitog\t560\nvegetarian\t560\nnevers\t560\nwindsor ct\t560\ntilos\t560\ne 421\t560\nburnley\t560\ngregoriou\t560\nhenning\t560\nr de leurope\t560\npsmar\t560\naf\t560\ngregor\t560\nperipheral\t560\nantal\t560\nladopotamos\t560\nwody\t560\nmai dang lao\t560\nsignora\t560\nlaituri\t560\nnelly\t560\nsvalka\t560\nkandang\t560\ncoty\t560\nlivio\t560\npuro\t560\nblk 2\t560\nvinschgaur\t560\nc 65\t560\nkantonalbank\t560\ndimas\t561\nfink\t561\napplid\t561\nyanzhiwu\t561\nofficers\t561\naoki\t561\ngradska\t561\nlesne\t561\ninga\t561\nheilbronner st\t561\nsid\t561\nd 917\t561\ncolumbus av\t561\nbarbiri\t561\nmelia\t561\nbeech rd\t561\nwhitworth\t561\nbesson\t561\nshmvrt\t561\nkuznitsova\t561\nhands\t561\nfino\t561\nhuan ba tongri\t561\nyanzhiwu exp\t561\nbaise\t561\nirene st\t561\ngosudarstvinnogo\t561\nhimmelreich\t561\njackass\t561\nrubis\t561\nmassachusetts tpk\t561\nlohr\t561\ndeer run\t561\nsheetz\t561\nc 47\t561\nbussardweg\t561\ncarriage ln\t561\nplenty\t561\nharrison rd\t561\nwalt\t561\nmsainwd\t561\nleben\t561\nyan zhi wu gao su gong lu\t561\na 63\t561\nimpala\t561\ncoyote cr\t561\npando\t561\nmoksha\t561\nkonya\t561\nalexander rd\t561\ntourismus\t561\nvirag\t561\ngauss\t561\ncassidy\t561\nhama\t561\nsharm\t562\nwolters\t562\nluga\t562\nmersin\t562\nchestnut ln\t562\nring 1\t562\npilas\t562\n3s\t562\nbahntrassenradweg\t562\nmalmin\t562\nq jia\t562\nhilliard\t562\nheld\t562\nconsolidated\t562\njohann sebastian bach st\t562\ntg\t562\nalgeri po ste\t562\nperiphereiake odos\t562\npizza express\t562\nhawthorne dr\t562\npanhandle\t562\nmitsui\t562\nkendo\t562\ngatewood\t562\nslim\t562\ngarnett\t562\nbure\t562\nadriatico\t562\njingzhu exp\t562\nd 619\t562\n199th\t562\nd 840\t562\nfontenelle\t562\nwaldsee\t562\nrheintalbahn\t562\nassiniboine\t562\nplanas\t562\nbetsy\t562\n48a\t562\npiraus\t562\npiton\t562\nzmaj\t562\nhamam\t562\ndespagne\t562\nsfr\t562\nalder cr\t562\npaynes\t563\nu haupt st\t563\nchongqing\t563\nvalk\t563\nbagutte\t563\noulad\t563\nolympus\t563\nuslug\t563\ngurre\t563\nnghia\t563\nvoinov\t563\ngruppa\t563\nlauberge\t563\n15n\t563\nlancaster rd\t563\ndeventerweg\t563\nassociazione\t563\nr du marche\t563\nkhngngnynnrnnlddgvai\t563\nn 330\t563\ndamen\t563\nkoblenz\t563\n89a\t563\nwels\t563\ntbain\t563\nschulbus\t563\nhollins\t563\n1141\t563\nfest pl\t563\nclairire\t563\njapon\t563\nspringwater\t563\ngr13\t563\nupc\t563\npipeline rd\t563\nn ctr st\t563\nautostrada dei trafori\t563\nmikhaila grushivskogo vulitsia\t563\nfilmann\t563\npetsmart\t563\nbourges\t563\nkirsch\t563\nbrune\t563\njong\t563\nivanovskoi\t563\nv xxiv maggio\t564\nkron\t564\nruta provincial 11\t564\nhuidu\t564\nhutchison\t564\ne 762\t564\nrheinland\t564\nsuperiure\t564\ndok\t564\nmetzger\t564\ntumulo\t564\nsparte\t564\ncastelnuovo\t564\nnabirizhni\t564\ncommanderi\t564\nrd 1\t564\nwhistler\t564\nrib\t564\nterzo\t564\nkrasna\t564\nhayfild\t564\nimp des jardins\t564\nstrawberry ln\t564\ndinamo\t564\nr st michel\t564\nmerrimac\t564\nparoquial\t564\ntravessera\t564\njagodowa\t564\nphra\t564\nbw 8\t564\ncheckpoint\t564\nmarkgrafen\t564\nuptown\t564\nnarita\t564\nze20\t564\nready\t564\ntoc\t564\neglise st etinne\t564\ntoulon\t564\ndiamantina\t565\nvrtic\t565\npidagogichiskii\t565\ncervino\t565\nkrainiaia\t565\nemporio\t565\nvincents\t565\naliksandar makidonski\t565\nd 468\t565\nrandolph st\t565\ntrafori\t565\nmaschinenbau\t565\nfantasy\t565\nbelanger\t565\nr alphonse daudet\t565\nplantation dr\t565\nsw st\t565\nsalter\t565\nharewood\t565\ndamiao\t565\nmili\t565\nzacarias\t565\nc 58\t565\nbei lu dao\t565\ndrumheller\t565\nr des fosses\t565\nnid\t565\n203rd\t565\ndeken\t565\nr10\t565\nbuurtweg\t565\nspanin\t565\nduck cr\t565\nalefyylvn\t565\nresidentialarea\t565\nschilling\t565\nwasen\t565\ng7\t565\ndonskaia\t565\nsr 42 old sr 10\t565\nquntuop\t565\nshokoladnitsa\t565\npopovka\t565\nvladimirescu\t566\nbildungszentrum\t566\nstover\t566\narta\t566\ndeesilla\t566\nkhshalefwrzy\t566\nakademia\t566\nzeeman\t566\nburrito\t566\nszkola podstawowa\t566\nsesto\t566\nryan rd\t566\nsuk\t566\nbhr\t566\n1950\t566\naurrera\t566\nbanksia\t566\nc s roqu\t566\nkuria\t566\naromos\t566\nluang\t566\ndao186\t566\nescape\t566\nphyllis\t566\ntab\t566\nforages\t566\nzrodlana\t566\nmarmol\t566\nvive\t566\n3102\t566\ndancing\t566\nbatavia\t566\nep9\t567\nelzen\t567\nbagley\t567\nparkfild\t567\nkors\t567\nul zhukovskogo\t567\npicacho\t567\nkitchens\t567\nmbtsain\t567\ngobel\t567\nn90\t567\noberen\t567\nrundkurs\t567\nroyce\t567\ns305\t567\nwi 32\t567\ng321\t567\nr des vosges\t567\nlugova vulitsia\t567\ncosta rica\t567\nn 134\t567\nv magenta\t567\ncorey\t567\nv giovanni amendola\t567\ncuirt\t567\nhamadi\t567\npitka\t567\ncentral pk\t567\nmarata\t567\ngarvey\t567\nbogoroditsi\t567\ncm 412\t567\nbathurst st\t567\nmahendra hwy\t567\ngranary\t567\nlyautey\t567\nimia\t567\nyayla\t567\n3111\t567\nwalsall\t567\ntilden\t567\nearl st\t567\n2115\t567\nboni\t567\nautonoma\t567\nwilson dr\t567\nfalkenstein\t567\nqadim\t568\nessex st\t568\npfarr st\t568\nkinderspil\t568\njnc rd\t568\nmeix\t568\nambar\t568\nposo\t568\n987\t568\nhussein\t568\nbaraji\t568\nholly rd\t568\n1115\t568\nkazachia\t568\nanhalt\t568\ncarnarvon\t568\nbrookstone\t568\nh r blk\t568\ns311\t568\nsi guo zong guan zi dong ch dao\t568\npinturas\t568\nfach\t568\nmowbray\t568\nladder\t568\nbamiyan\t568\n028\t568\nmylly\t568\nrindo\t568\nhallam\t568\nbaitul\t568\nch de chapelle\t568\n19b\t568\nst georg\t568\n2d\t568\nlaurel cr\t568\nv giovanni verga\t568\nhjr\t568\nsouris\t568\nloveland\t568\nsimpson st\t568\nmudrogo\t568\nbeale\t568\nhornbach\t568\nv brescia\t568\nelektrotechnik\t568\nromualda traugutta\t568\nwayland\t568\nd 918\t568\njohnson dr\t568\nivey\t568\nsviatitilia\t568\nfrg\t568\nr de bourgogne\t568\nlh\t568\nbotany\t568\nagadir\t569\nagion\t569\nintegrated\t569\nmilne\t569\nguo dao11 hao\t569\nnstrn\t569\nonda\t569\nbeobia\t569\ndublin rd\t569\nchastni\t569\npatel\t569\nishikarigawa\t569\nkhoziaistvinni\t569\nlongfild\t569\naumailngkrdhrrngkko\t569\npobidy ul\t569\nbunder\t569\nskrzyzowani\t569\nkuros\t569\nchiuahua\t569\nvidin t\t569\ndaycare\t569\nvignerons\t569\nbartolome mitre\t569\ndade\t569\nphil\t569\ne 272\t569\n16b\t569\naubrey\t569\nd 181\t569\n223rd\t569\n3002\t569\ndres\t569\nzapote\t570\nzamecka\t570\namadeu\t570\nchop\t570\ncamper\t570\nmeric\t570\n1720\t570\nb 465\t570\ntaleflb\t570\nl 1140\t570\nlaut\t570\nshakhta\t570\nthatcher\t570\nus 66 old us 99\t570\nnautico\t570\njokai u\t570\nanges\t570\nqlyb\t570\nshoprite\t570\nb 471\t570\nthan\t570\nalderwood\t570\nprecision\t570\nm 40\t570\nvaridades\t570\nrua da paz\t570\nadel\t570\nlivanivskogo\t570\njamil\t570\nd 974\t570\ntolbukhina\t570\nfistivalnaia ul\t570\noakes\t570\nv degli alpini\t570\njuniper st\t570\nsp78\t570\nslauson\t570\n52a\t570\nma 28\t570\njohnson ln\t570\nvaio\t570\nlaporte\t570\nt16\t570\njs\t571\nchartreuse\t571\ndinfanteri\t571\nabbot\t571\ngure\t571\ne 18th st\t571\nv cantonale\t571\neo7\t571\nmississauga\t571\ne 21st st\t571\nrandy\t571\nc sol\t571\npoinciana\t571\nkomeri\t571\nmidwest\t571\nr du 8 mai\t571\ntampico\t571\ng323\t571\nwalpole\t571\nameghino\t571\ntompkins\t571\nmacao\t571\nbeek st\t571\nn 301\t571\nromao\t571\nlamarmora\t571\nv della chisa\t571\nbina\t571\nfd\t571\nblus\t571\nhickory rd\t571\nwigwam\t571\nsandgrube\t571\nfolwark\t571\nctra de madrid\t571\nnotaria\t572\nquiznos\t572\nirineu\t572\ndolly\t572\ncabras\t572\nmaitre\t572\narnold st\t572\nfisk\t572\nvysokoi\t572\nb 431\t572\nchapin\t572\ngilead\t572\nkharkivska\t572\nbluwater\t572\nengelbert\t572\nwinkel st\t572\njeanette\t572\nhanger\t572\ncentra\t572\nguss\t572\ns207\t572\nep10\t572\nveerweg\t572\nnevado\t572\nplatane\t572\nsummit rd\t572\nprogriss\t572\ngavilan\t572\nabbud\t572\ntura\t572\ne church st\t572\nbayerische\t572\nvaras\t572\nrovnsutoa100\t572\ngabelsberger st\t572\nyau\t572\nplanning\t572\npret\t572\nstubbs\t572\ntetto\t572\nmilton rd\t572\nunion church\t572\nlamp\t572\nstantsii\t572\nbuchanan st\t572\nrosenheim\t572\npickens\t572\nr des ormes\t573\nmt auk branch\t573\ndolce vita\t573\nsynalef\t573\nsysteme u\t573\nmcguire\t573\ndom byta\t573\n6362\t573\nn 9\t573\ntsintar\t573\nvinaroz\t573\ntumbleweed\t573\nr louise michel\t573\nwhitestone\t573\nrito\t573\ngrafen\t573\namins\t573\nuniv bd\t573\nav parana\t573\ndepositos\t573\nerdo\t573\nkortrijk\t573\ncra 27\t573\nkulz\t573\nrhine\t573\nkbc\t573\nassociations\t573\nwallace rd\t573\nmark st\t573\nspil pl\t573\ncevre\t573\nv pasubio\t573\neugeniusza\t573\nhiguras\t573\nr des carrires\t573\npancake\t573\nv sta lucia\t573\nalefbrhm\t573\nlituvos\t573\nriverton\t573\ncharme\t573\nbakar\t573\nkeolis\t573\nhory\t573\nis rd\t573\nblu trl\t573\nchester st\t573\ncentennial dr\t573\nliningradskoi shossi\t574\nmassachusetts av\t574\ncornet\t574\nhato\t574\nkarntner\t574\nidlewild\t574\naksu\t574\nzhuno\t574\ncombs\t574\nrmt\t574\ntrevor\t574\ndanji\t574\ne ctr st\t574\nm52\t574\nsano\t574\ngabrille\t574\noverflow\t574\nprivate sect name no\t574\nivrea\t574\nlocal private sect name no\t574\nbifurcacion\t574\nbearn\t574\nus 3\t574\nmnkhm bgyn\t574\ncarro\t574\na414\t574\norellana\t574\ndistrital\t574\nkhmelnytskoho\t574\ndoran\t574\nnational rt 13\t574\nwlkp\t574\n2600\t574\njr kagoshima honsen\t574\ns312\t574\nsagamore\t574\nstresemann st\t574\nverreri\t574\nniftibaza\t574\nse st\t574\ns wales main ln\t574\nmhlh\t574\nsection 3\t574\ne 801\t574\nbild\t575\nrozen st\t575\nleuvense stwg\t575\nkopi\t575\ngoa\t575\nchemnitzer st\t575\nbirizka\t575\ntanners\t575\nschumann st\t575\nbaudelaire\t575\njosef st\t575\nsault\t575\nnivo\t575\nkuwait\t575\nhmalefdy\t575\nriachulo\t575\nklinovaia\t575\nsuka\t575\ngalitskogo\t575\nlynn st\t575\nainalefmr\t575\npikin\t575\nsh7\t575\nbrad\t575\ntanneri\t575\nhalstead\t575\nbloor\t575\nbuissons\t575\ncocina\t575\nyang an t lu\t575\nglavnaia\t575\nb 203\t575\nfuchsweg\t575\nchantry\t575\ncovadonga\t575\nvody\t575\nft st\t575\nbradford rd\t575\nchancery\t575\nveteran\t575\nn52\t575\n208th\t575\nnang\t575\ninspection\t575\nboro\t575\nvirkhniaia ul\t575\nmita\t575\ng111\t575\nkea 1\t575\ntran\t575\nd 159\t575\ninfirmary\t575\n1130\t575\nreit pl\t576\nr pirre brossolette\t576\nsenioren\t576\ntrucks\t576\nyukun exp\t576\npyeong qigyakhli luan huang yuki ze\t576\ntroitskaia\t576\nvorder\t576\nav f\t576\nzhong yang xian\t576\ncaddo\t576\nd 606\t576\neclipse\t576\naurbach\t576\nkostiol\t576\nav du marechal leclerc\t576\nyukun\t576\nb 209\t576\nebe\t576\nikot\t576\ndich\t576\nshipley\t576\ns sebastian\t576\ncolors\t576\nsamarkand\t576\ntoronto district school board\t576\nmuan\t576\nting1\t576\ntournai\t576\n856\t576\nqigyakhli\t576\nbayda\t576\nashcroft\t576\njose hernandez\t576\nbalbin\t576\npitrol\t576\nklettersteig\t576\ncordelirs\t576\nnau\t576\ndaily yamazaki\t576\nsteingasse\t576\nd 215\t576\ntongyeong\t576\nlerdo\t576\n3106\t576\ncataluna\t576\nco rd 30\t576\nn21\t576\nholzbau\t576\nus 131\t576\nlinii\t576\nep16\t577\naleksandrowka\t577\nlalef\t577\ncercado\t577\nf2\t577\ntransformator wizowy\t577\nvecchi\t577\nostergade\t577\nchapaiva ul\t577\nflow\t577\nbard\t577\nsmak\t577\naleflbnk\t577\nbalcarce\t577\ndaquitaine\t577\nreformhaus\t577\naix\t577\nstredisko\t577\ncsapos kut\t577\nlp 8\t577\njabir\t577\nddhi\t577\nwilliams cr\t577\nkecil\t577\nadmin\t577\nshale\t577\nfrind\t577\nkalk\t577\nseidel\t577\nburger st\t577\nlocust av\t577\nwilhelm busch st\t577\nsynagoge\t577\npong\t577\nfrituur\t577\npassion\t577\nyu in luan huang yuki ze\t577\ncarlsbad\t577\ndorozhni\t577\nodvojak\t577\nmarii sklodovskoi kiuri vulitsia\t577\ne 125\t577\njanvir\t577\nr des tulipes\t577\npleasure\t578\na 41\t578\nlituva\t578\n2027\t578\n967\t578\ndzialkowe\t578\nporter rd\t578\nnahon\t578\nestuary\t578\npoinsettia\t578\nw jefferson st\t578\nhuong\t578\nhaharina\t578\ncondamine\t578\nmaybank\t578\nprunus\t578\nsr439\t578\nlandshuter\t578\nakushirskii\t578\nsklodovskoi\t578\nv st\t578\nb 43\t578\nhopfen\t578\nmanso\t578\nnh47\t578\ndong jiu zhou zi dong ch dao\t578\nnajswitszego\t578\nautov del norde ste\t578\n2610707\t578\nmilutina\t578\neschen\t578\npine rdge rd\t578\nshaurma\t578\nabdellah\t578\nkop\t578\nkepala\t578\ncalzado\t578\nvoronizh\t578\nroxas\t578\nfirm\t578\nepulet\t579\nrua palmeiras\t579\nstockbridge\t579\nd 996\t579\nmallard dr\t579\nmanaus\t579\nl 523\t579\nwendel\t579\nst 2244\t579\ncoudray\t579\nlanark\t579\nbuk\t579\nn 430\t579\nn 1st av\t579\nbadi\t579\nunion cemetery\t579\nbrook rd\t579\nus 66 historic\t579\nhunyadi u\t579\nbruckenweg\t579\nnorthbrook\t579\ncarrira\t579\nluki\t579\na65\t579\ncavallo\t579\ndalefwd\t579\nsovkhoza\t579\nissa\t579\nmeike\t579\nsp61\t579\n40th st\t579\nsafra\t579\nelmwood dr\t579\nblackberry ln\t579\nmelchor ocampo\t579\npale\t579\nalpha bank\t579\nmalinovaia\t579\nkosmitik\t579\narantes\t579\nwizowy\t579\nbilac\t579\npapineau\t579\nmarlene\t579\nviljandi\t579\npilone\t579\nep11\t579\ndourado\t579\neyth\t579\ndari\t579\nmercadinho\t580\nminister\t580\nhuan qi tongri\t580\nrollin\t580\nstadtwald\t580\nhost\t580\nbernabe\t580\ndenia\t580\nvorm\t580\numgeungs st\t580\nhshtm\t580\njagdhutte\t580\nultra\t580\nstudi\t580\ncerny\t580\npitrovskoi\t580\nalefy\t580\nbogen st\t580\nlapin\t580\nbattaglia\t580\nr grande\t580\nverdugo\t580\ngezelle\t580\nnanarupusu\t580\nreconquista\t580\nfrontenac\t580\ndamon\t580\npomeroy\t580\nctra de gijon a sevilla\t580\nhimalaya\t580\nmuhl bg\t580\nr des frenes\t580\ntrot\t580\nstudents\t581\nmascarenhas\t581\ntsintralni rynok\t581\npinho\t581\npolyvalent\t581\ntite\t581\nsantiago del estero\t581\ne 871\t581\ngarii\t581\ntuba\t581\nuss\t581\nst 8\t581\nmeri\t581\nsamgeori\t581\n35w\t581\nviajes\t581\nlocust ln\t581\ncsapos\t581\nsurprise\t581\ngottinger\t581\n05 23\t581\nsocidade\t581\noliver st\t581\nb 170\t581\ncoleridge\t581\nrampart\t581\npionirskii piriulok\t581\nbinder\t581\nkrzysztofa\t582\nlarrea\t582\nwilhelmina ln\t582\nyoung rd\t582\ndouane\t582\nul dimitrova\t582\nhebel\t582\nheatherwood\t582\nagenzia\t582\ntorrens\t582\nermine\t582\ne 803\t582\n2a av\t582\ndiba\t582\nd 960\t582\ncrawley\t582\nbarge\t582\nobligado\t582\nzetkin\t582\nc del sol\t582\nmdyryte\t582\nsivastopolskaia\t582\nparku\t582\nnavoi\t582\nd 948\t582\nr de prairi\t582\nkarlsruher st\t582\nliniinaia ul\t582\nss62\t582\nchuck\t582\ncalvary baptist church\t582\nsuperiur\t582\nwynn\t582\nmein\t582\nfrhng\t582\nchartered\t582\nzhi jian chuan\t582\nchennai\t582\nst nikolaus\t582\nvendeglo\t582\npotable\t582\nroos\t582\nfox st\t582\nkurfursten\t582\ncentral exp\t582\ntisserands\t582\nworship\t582\nappulo\t583\nolaf\t583\nplanalto\t583\nser\t583\na t u\t583\nrecife\t583\nrepublicii\t583\namancio\t583\ncoria\t583\nyongin\t583\ngalveston\t583\ntuwima\t583\ndobo\t583\niuzhno\t583\nbua\t583\nbasile\t583\nlade st\t583\nep17\t583\nrosali\t583\nbaz\t583\nlandsberger st\t583\ngasthuis\t583\ngerber st\t583\ncalders\t583\nsidewalk\t583\n13b\t583\ntickets\t583\njyvaskylan t\t583\norzechowa\t583\nkardynala stefana wyszynskigo\t583\nperugia\t583\nventi\t583\nstredni\t583\nkremser\t583\nlan nan gao su\t583\npaulou\t583\nshar\t583\nkhirr\t583\npeyre\t583\naftokinitodromos\t584\nkentrikis\t584\nelche\t584\nmwy 7 central peloponnese\t584\npalmares\t584\nxi pan gao su\t584\nzoltan\t584\n5 de febrero\t584\nmyanmar\t584\nautokinetodromos 7 kentrikes peloponnesou\t584\nkennedy dr\t584\nkentrikes peloponnesou\t584\nr st louis\t584\nautobahn 7\t584\ndeere\t584\nautoroute 7 peloponnese centrale\t584\nautoroute 7\t584\nstrzelecka\t584\ngiovan\t584\njinghu ln\t584\narchers\t584\nbatyra\t584\nstate trust\t584\naftokinitodromos 7 kentrikis peloponnisou\t584\ngaldos\t584\nn 629\t584\nxipan exp\t584\nlal\t584\nhampton ct\t584\nmerlo\t584\nmarina dr\t584\nbowles\t584\nsilent\t584\nidlewood\t584\nstokhod\t584\nautobahn 7 zentral peloponnes\t584\nautokinetodromos 7\t584\nformula\t584\nyunikuro\t584\nxi gu chuan\t584\n19th av\t584\naftokinitodromos 7\t584\nplatanos\t584\nkentrikis peloponnisou\t584\npeloponnese centrale\t584\nwildwood rd\t584\nschapman\t584\nzentral peloponnes\t584\nmormon\t584\ncentral peloponnese\t584\nobecna\t584\nventas\t584\nn r\t584\nkhtybt\t584\nnasa\t584\nmwy 7\t584\nlaiteri\t585\n876\t585\nacacia st\t585\nkabupaten\t585\nh2\t585\nmausoleum\t585\nlautaro\t585\n1 go travnia vulitsia\t585\nspina\t585\nouse\t585\nfox ln\t585\na 60\t585\nqro\t585\nd 947\t585\nllana\t585\nkline\t585\nabby\t585\ngalgen bg\t585\nnye\t585\njims\t585\ncyril\t585\npus\t585\nbleich\t585\njuan escutia\t585\nvastkustbanan\t585\ncasimir\t585\nstoneenge\t585\nsudliche\t585\n3a av\t585\nfawr\t585\nrua primeiro de maio\t585\ns 16th st\t585\nanp\t585\ndorada\t585\nredon\t585\ncanara\t585\ndat\t585\nv buren st\t585\nballon\t585\njuca\t585\nathol\t585\nist\t585\nainsworth\t585\ncerreto\t585\nrp7\t585\ntuileris\t585\nav du marechal foch\t585\nvoyages\t585\nnick\t585\nrua dez\t585\nmelon\t586\nconejo\t586\nsalonu\t586\nherrero\t586\ncampground rd\t586\nc antonio machado\t586\nsexton\t586\n1111\t586\ntownhall\t586\narkhangila\t586\npillar\t586\nasin\t586\nnagano\t586\nmiasnoi\t586\nn 627\t586\nstaza\t586\nfairwood\t586\nbenz st\t586\ncampa\t586\nriverside av\t586\nlortzing st\t586\nkanyakumari\t586\nr du couvent\t586\n689\t586\nvalette\t586\ncapolinea\t586\nokolovrhardstin\t586\nkanetuzidousiyadou\t586\nposiliniia\t586\nrua maranhao\t586\nfisica\t586\nbedok\t586\nant\t586\nmex 40d\t586\nwalgau\t586\nkan etsu jidosha do\t586\nlimousin\t586\ngumnasio\t586\nstelvio\t586\nhongkong\t587\nplantation rd\t587\nartisan\t587\ntelecom italia\t587\nsavenay\t587\nr jacqus prevert\t587\npiva\t587\ncra 24\t587\nbaghdad\t587\nstout\t587\nboskij\t587\nstick\t587\ncarpenters\t587\nuralskii\t587\nhidayah\t587\nlebensmittel\t587\nobelisk\t587\nlayout\t587\npresidential\t587\ns13\t587\ncentenaire\t587\ncj\t587\ne oak st\t587\ngazity\t587\nnemcove\t587\nduzen\t587\nweissenbach\t587\nlauterbach\t587\nmulberry ln\t587\nribes\t587\nlale\t587\nus 21\t587\nembarcadero\t587\nbernhard st\t587\nbeltline\t587\ntruro\t587\ntrial\t587\nlitoranea\t587\n49a\t587\nblanken\t587\nyosef\t587\nav du marechal de lattre de tassigny\t587\nmargot\t587\nrembrandt ln\t588\nlaire\t588\neleutheriou benizelou\t588\nnera\t588\nveloso\t588\nchuncheon\t588\n4100\t588\npadel\t588\nguo daodabdam hao\t588\nretro\t588\n300th st\t588\nfuxing\t588\ngarganta\t588\nschnee\t588\nyang funo qing shan\t588\nchildhood\t588\nnutmeg\t588\nbreakwater\t588\ndodson\t588\nti yu guan\t588\nmcfarland\t588\npeloponnes\t588\npnb\t588\ndaodabdam\t588\nbabylon\t588\nfiddlers\t588\nmaddox\t588\nsaco\t588\ngarages\t588\nweston rd\t588\nguo dao58 hao\t588\nachterweg\t588\ntigli\t588\nyura\t588\nkonichnaia\t588\npotsdamer st\t588\nnjm\t588\nsanmarukukahu\t588\nah75\t589\ncalifornia st\t589\nungaretti\t589\nmouton\t589\nr gabril peri\t589\nsundeteria\t589\nspluga\t589\ncascine\t589\nresturant\t589\nban ji dian t jing du xian\t589\nkub\t589\nkomsomolskii piriulok\t589\nli qun luan huang yuki ze yeongdong exp\t589\nl 113\t589\ngurnsey\t589\nburkina\t589\nlagan\t589\ntatra\t589\nleoncio\t589\nvalentina\t589\nmarsden\t589\nold sr 10\t589\neurico\t589\nmustashfa\t589\n07 25\t589\nbarbary\t589\nb18\t589\ndrugs\t589\nserravalle\t589\nliz\t589\nmdou\t589\ncanoas\t589\nrodovia presidente dutra\t589\ndeich st\t589\nrua bela vsta\t589\nbuche\t589\nabaia\t589\nguo dao13 hao\t589\noczyszczalnia\t589\nmichelin\t589\n2nee\t589\nclaiborne\t589\nv verdi\t589\nspalding\t589\nmatch\t589\ncota\t589\nmaterial\t589\np6\t590\nfrobel st\t590\nhegel\t590\n3007\t590\ns104\t590\n06 24\t590\nmartinet\t590\nhillviw dr\t590\nmuhlen bg\t590\nhonamgosokdoro\t590\nboissire\t590\ndak\t590\nangmad\t590\na kanal\t590\ne 82\t590\nkhwy\t590\n3n\t590\nhirtenweg\t590\njanice\t590\npresidents\t590\nnorwalk\t590\nmeisin\t590\nevergreen av\t590\ndonde\t590\nguo daodak hao\t590\nbreed\t590\ndean st\t590\nnorwida\t590\nashbury\t590\nkings ct\t590\ncarman\t590\nkamal\t590\nr denis papin\t590\nnavarre\t590\nbilingu\t590\nchipmunk\t590\ngettys\t590\nhip\t590\n2222\t590\ncremona\t591\nkennet\t591\ntovarni\t591\nvermelha\t591\ntyn\t591\ntupelo\t591\nrega\t591\nladang\t591\nkart\t591\nbethel rd\t591\nxipan\t591\n204th\t591\nkaplan\t591\nhearthstone\t591\nmilagros\t591\ndonaldo\t591\nxvii\t591\nneusser\t591\nguardia civil\t591\n130 01\t591\nbronco\t591\nzaniatosti\t591\nhotutomotuto\t591\ncanario\t591\nkanava\t591\nbolsa\t591\nhesiru\t591\nmarburger\t591\ntrend\t591\nmercat\t591\nn 620\t591\ncanal de nantes a brest\t591\nmirnaia ul\t591\nreynolds rd\t591\nsperberweg\t591\nchu yun ji dao\t591\nfiscal\t591\nl 75\t591\ndbstalefn\t591\nkorenblom\t591\nfahre\t591\ncampion\t591\nlanderneau\t591\ne 55 e 60\t591\ncebu\t591\ngirasol\t591\nabout\t591\nhouston st\t591\ndn66\t592\nthis\t592\nv zara\t592\nvanir\t592\nus 611\t592\njasmins\t592\n310th st\t592\nbrennan\t592\nplato\t592\nglinnglng\t592\nborro\t592\nhave\t592\nkanala\t592\nbidnogo\t592\npopiluszki\t592\nparkering\t592\nfilomena\t592\nlure\t592\npeloponnisou\t592\nhistorische\t592\nmabry\t592\nsusa\t592\nmosevej\t592\nr de lhopital\t592\nulybka\t592\nsteeplechase\t592\nraval\t592\njernbane\t592\nglava\t592\nimigrantes\t592\nporter st\t592\nbushaltestelle\t592\nsadah\t592\nalmas\t592\nerzincan\t592\nkansai\t592\ngallardo\t592\nherzl\t592\nbroadwater\t592\npalestro\t592\npivnichna\t593\nmaurinne\t593\novrazhnaia ul\t593\nsolitude\t593\nmitchells\t593\nsaltillo\t593\nsosta\t593\nbergstation\t593\nlisia\t593\ntruite\t593\numbro\t593\nn frnt st\t593\n50k\t593\nmoraine\t593\nsmetanova\t593\noak ct\t593\nb 97\t593\nroyal oak\t593\nberliner pl\t593\npocahontas\t593\nstone st\t593\nmoudania\t593\nantioch church\t593\nbilefelder\t593\nwarande\t593\nshoreline dr\t593\nrash\t593\nc 51\t593\nst joseph\t593\nsens\t593\nelizabeth dr\t593\nweather\t593\nhanse\t593\nb 73\t594\nbayviw dr\t594\nvytsmn\t594\nbeagle\t594\ncameo\t594\nv luigi pirandello\t594\nredland\t594\nlitniaia\t594\nsezione\t594\nneptuno\t594\nperrires\t594\nwoodley\t594\nbrett\t594\nsobornaia\t594\noconnell\t594\n2609600\t594\nthar\t594\ngio\t594\nherminio\t594\nbank spoldzilczy\t594\npr bernhard st\t594\nfeijo\t594\n1 43\t594\nherne\t594\npasealekua\t594\nav pasteur\t594\nw oak st\t594\nmontgomery rd\t594\nvilaine\t594\npari\t594\ncefn\t594\nsusana\t594\nlatino\t594\nhacia\t594\nbelvoir\t594\ngypsum\t594\nessarts\t594\nindian trl\t594\ndentist\t594\nr25\t594\nrua alagoas\t594\nzabolo\t594\nrennsteig\t594\nrizzo\t594\ncarrara\t594\nlussac\t594\nn coast ln\t594\nkoppelweg\t595\ncampania\t595\nlarchen\t595\nzimmerei\t595\norin\t595\nelektronik\t595\ndere\t595\nhlalefl\t595\nvaldemar\t595\nlizy\t595\ndomain\t595\npasika\t595\nbratislava\t595\nathanasiou\t595\ngarrigus\t595\nraab\t595\nsmolinskaia\t595\nhui jin ruo song shi huato luno ke\t595\nzashchity\t595\nmakarova\t595\nv s giorgio\t595\ncisne\t595\nus 90 alternate\t595\nstadtverwaltung\t595\naz 93\t595\n2006\t595\nwalnut ln\t595\nhamud\t595\nmanen\t595\ndvorik\t595\nsnoman trl\t595\nohio tpk\t595\nep6\t595\nv sicilia\t595\nqryt\t595\njamal\t595\nnottoway\t595\nwurth\t595\nrnge rd\t595\nsvenska kyrkan\t595\nbyers\t595\nn 44\t595\nsunnyvale\t595\nbeeke\t595\nstudanka\t595\nveldweg\t595\ntillman\t595\nladour\t595\narequipa\t595\nskye\t595\ncivica\t596\nmagee\t596\nvermillion\t596\nplatani\t596\nconservancy\t596\nsavickaja\t596\nposadas\t596\npedrosa\t596\npleasant hill rd\t596\nb38\t596\ncorbeil\t596\nb 279\t596\na 36\t596\nkentucky av\t596\nharpers\t596\nvala\t596\ndion\t596\nl 3080\t596\nraduzhnaia\t596\nvolgogradskaia\t596\ncarte\t596\nabba\t596\njr heng xu he xian\t596\nc central\t596\ndepuradora\t596\nserene\t596\nweb\t596\nkhmrbndy\t596\nrois\t596\nco rd 26\t596\nst 7\t596\nrog\t596\nvictorin\t596\nmegan\t596\nskate pk\t596\ntennishalle\t596\n869\t596\njr yokosuka ln\t596\nc so europa\t596\nespagne\t596\ntoom\t596\nsousse\t596\ncastilho\t596\nmashru\t596\nbijou\t596\nhakim\t596\nl 22\t596\nkatz\t596\ndanny\t596\npits\t596\nsinan\t596\nlouka\t597\nbellegarde\t597\nsaveurs\t597\nayres\t597\nbr 369\t597\nloti\t597\ncaroline st\t597\nd 158\t597\nsettle carlisle railway\t597\nav de espana\t597\ndomus\t597\nlilli\t597\nkoil\t597\namapola\t597\niancu\t597\nmistnogo\t597\ncoracao\t597\nsarandi\t597\nprovinzial\t597\npalmirs\t597\nallo\t597\ntinistaia\t597\neverglades\t597\nv francesco baracca\t597\nsoldat\t597\nthirry\t597\nbirdi\t597\nuiut\t597\ngods\t597\nn 112\t597\nquinones\t597\nvolturno\t597\nmitterweg\t597\nmohr\t597\npl de liberation\t597\nco 7\t597\naguda\t597\nvillarejo\t597\nst jugend\t597\nsamba\t597\nteto\t597\nurheilu\t598\ntrilho\t598\nho hong luan huang xin\t598\nrelay\t598\nmisuvdonatu\t598\nschuhhaus\t598\nparvis\t598\nxunhag\t598\nkawm\t598\npl jean jaures\t598\nsteinkreuz\t598\nqalefym\t598\nrecord\t598\ntrim\t598\nfrhalefn\t598\nokna\t598\nmidori\t598\napc\t598\nportofino\t598\nmcneil\t598\nyo\t598\npatrocinio\t598\nr du paradis\t598\nvilas\t598\n1023\t598\ndao170\t598\nsomers\t598\ncatalans\t598\nbch bd\t598\nministirstvo\t598\nvolg\t598\nhonam hsl\t598\nsta teresa\t598\nc7\t598\ngaviota\t598\nroyston\t598\nfesthalle\t598\ntalavera\t598\ndovatora\t598\ncabra\t598\nzorrilla\t598\nildefonso\t598\nmateriaux\t598\nbrookline\t598\nmadden\t598\ntains\t599\nkennel\t599\nrecreativa\t599\nphat\t599\nbarbarossa\t599\nshkola 5\t599\nmandi\t599\nrua treze de maio\t599\nalps\t599\nv tagliamento\t599\nchiu\t599\ne411\t599\nhorster\t599\n5n\t599\naida\t599\nithaca\t599\nparus\t599\nsour\t599\nbennett st\t599\nramalho\t599\nv liguria\t599\nharlow\t599\nprudy\t599\nanemones\t599\nleesville\t599\nhildegard\t599\nllbnyn\t599\nbole\t599\nmartiou\t599\nversicherung\t599\nharju\t599\nagenor\t599\nmestsky\t599\nkivi\t599\nkurzer\t599\nbenetton\t599\nmlainb\t599\nhasel\t599\nchirvonoarmiiska\t599\nlangdale\t599\nv luigi cadorna\t599\ngrigoriia\t599\nelizy orzeszkowej\t599\ncavalcanti\t599\nfranje\t600\nwildpark\t600\nschuler\t600\nrua jose bonifacio\t600\nmakelan\t600\nw side fwy\t600\nb 202\t600\ntag\t600\nescultor\t600\nmathilde\t600\nv padova\t600\nguan yu\t600\nsharqiyah\t600\njingmetoro\t600\nberufsschule\t600\nburgundy\t600\nnoodles\t600\nredhill\t600\nrichland cr\t600\n20th av\t600\nfed\t600\nbaurn\t600\nkrefelder\t600\nfridrichs\t600\ngas stn\t600\nberliner pumpe\t600\nurozhainaia\t600\na36\t601\nbrookhurst\t601\neinkaufszentrum\t601\nsweetbriar\t601\nguo daodasdassdam hao\t601\n228th\t601\nahumada\t601\nsurvey\t601\nazucenas\t601\nsheep cr\t601\nthon\t601\ndaodasdassdam\t601\nchequrs\t601\nfamilinzentrum\t601\nresidency\t601\nw church st\t601\nfoothill fwy\t601\nbr 470\t601\nlong lake\t601\nipes\t601\npains\t601\nbonifatius\t601\nkan etsu exp\t601\nbutik\t601\nbeaver brook\t601\nsharif\t601\n832\t601\nss77\t601\n041\t601\nhelados\t601\npassau\t601\nindre\t601\nmoschee\t601\nmarcia\t601\nestatua\t601\nidea\t601\nboufs\t601\neyre\t601\ndeer run rd\t601\nr ste anne\t601\nsr 8\t601\ngoud\t601\nbrau\t602\ncinqunta\t602\npuit\t602\nkapi\t602\nmaje\t602\nken de ji\t602\nobs\t602\nplaqu\t602\ns205\t602\nhermoso\t602\njezusa\t602\nlitnii\t602\nbrighton main ln\t602\ntomaz\t602\nchancellor\t602\nmaleflk\t602\nmitra\t602\nmaritim\t602\nnegros\t602\nbibliothequ municipale\t602\n885\t602\nwoodmont\t602\ngeelong\t602\nott\t602\nfabriks\t602\nwild rice r\t602\nphdhm\t602\ncr 36\t602\nrua rio grande do sul\t602\ningrid\t602\nsteiger\t602\nligne de lyon perrache a marseille st charles\t602\ngorlitzer\t602\nroosevelt hwy\t602\ntrift st\t602\ne17\t602\nwatson st\t602\nluzon\t602\nfaculte\t602\nligne de lyon perrache a marseille st charles v grenoble\t602\ns stambanan\t602\n2700\t602\nkuca\t602\nkazmunaygas\t602\nbij\t602\nfaso\t603\ncalaveras\t603\nrodina\t603\nv torquato tasso\t603\nboschetto\t603\npeschira\t603\ncroisette\t603\ndaodabdatdab\t603\nbaileys\t603\npinsionni\t603\ncormorant\t603\nmex 57\t603\nkomercni banka\t603\nboschi\t603\nss3\t603\na wasserturm\t603\noborony\t603\ngvardiiskaia ul\t603\nvolkshochschule\t603\npisochnaia\t603\nquart\t603\nguo daodabdatdab hao\t603\nheredia\t603\nqdalefhamza\t603\ndzialkowa\t603\nrouget\t603\ndress\t603\nwonder\t603\nvisioli\t603\nvendee\t603\nbao mao gao su\t603\noulun\t603\njameson\t603\nsnell\t603\nchilton\t603\n2132\t603\nus 167\t603\nkwa\t603\nlas heras\t603\nminskaia ul\t603\nd 6015\t603\nl 82\t603\nficus\t603\ncth b\t603\nmbvalef\t604\nravenwood\t604\ncarthage\t604\nantofagasta\t604\naquduc\t604\ncaccia\t604\npoteau\t604\nmarley\t604\nconni\t604\nmaude\t604\nchemnitz\t604\nr des aubepines\t604\nkucuk\t604\ncompagni\t604\nmeadowbrook dr\t604\nfischteich\t604\ncasali\t604\nv della staz\t604\ntotem\t604\n1 39\t604\nswitzerland\t604\nvarna\t604\n969\t604\noakwood av\t604\nunderhill\t604\nletras\t604\nblk 1\t604\njr kisei ln\t604\noutpost\t604\noakleigh\t604\nfrome\t604\nschweizerische\t604\nroman rd\t604\nclub ho\t604\narl\t604\n47a\t604\nmolin\t604\nn 22nd st\t604\nwesterwald\t604\ndinkey\t605\ningolstadt\t605\nsumber\t605\nfeart\t605\nhighfild rd\t605\nsilas\t605\nallgemeinmedizin\t605\nivi\t605\nl 141\t605\nbezirs\t605\nshort rd\t605\nteboil\t605\nmilo\t605\nmatas\t605\nbateman\t605\nbrt\t605\nmelis\t605\ngouverneur\t605\nnarcis\t605\ns bway st\t605\nfolk\t605\nb14\t605\nsoiuz\t605\narctic\t605\npalisade\t605\nflughafen st\t605\ntsentralnaya st\t605\nloaf\t605\nnorthern bd\t605\nsaray\t605\ndriving rnge\t605\ntamandare\t605\nd 203\t605\nautonomo\t605\ndelia\t605\nbhmn\t605\noak rdge dr\t605\nv del mare\t606\nr lavoisir\t606\nnovi piriulok\t606\npoghota\t606\nyalefsyn\t606\n31st st\t606\nparagon\t606\nvodni\t606\ncabezas\t606\nkarlsbader st\t606\nr de bel air\t606\npoplar rd\t606\nn57\t606\ne jefferson st\t606\nliber\t606\nregensburger st\t606\ncinder\t606\nbene\t606\nbr 285\t606\ngrillo\t606\nschanz\t606\nhering\t606\ndozsa gyorgy ut\t606\npasseggiata\t606\nn central av\t606\noillets\t606\nverissimo\t606\nminskoi\t606\nadalbert stifter st\t606\nabingdon\t606\ntoshkent\t606\nlynnwood\t606\ndurer st\t606\nyasin\t606\nkeren\t606\nhalli\t606\n1055\t606\npurisima\t606\nengineers\t606\nr rene cassin\t606\ncanos\t606\nr 254\t606\nopale\t606\nincorporated\t606\nmontalvo\t606\nnervo\t606\nbalkan\t607\nhortencias\t607\nworldwide\t607\ns cristobal\t607\nbayreuther\t607\ntronco\t607\ncherokee dr\t607\ns 36\t607\nfallbrook\t607\ndahlia st\t607\ncarsharing\t607\ndukuh\t607\nmorava\t607\nradnor\t607\nsp63\t607\ngr canal\t607\nbotanichna\t607\nlenclos\t607\nketteler st\t607\ndetmolder\t607\ndurham rd\t607\nsilverado\t607\nadvance auto parts\t607\ncypriana\t607\nsaul\t607\ndeluxe\t607\nnational hwy\t607\nnordsee\t607\nb83\t607\namsel\t607\nbanco santander\t607\nmoderne\t607\nroanoke r\t607\npaige\t607\ndlhe\t607\nrockdale\t607\nmeitner\t607\nfortes\t607\nprats\t607\n100n\t607\nanak\t607\ncampanario\t607\nperry rd\t607\nsp90\t607\ntheresia\t607\nstrandvejen\t607\nstinson\t608\n29th st\t608\nrestaurants\t608\nthomas dr\t608\nluzern\t608\nfloris\t608\ncollin\t608\nune\t608\nrivero\t608\nintercity\t608\nsachsische\t608\nstratford rd\t608\nroseville\t608\na d hohe\t608\nbeechnut\t608\nchemins de fer abidjan niger\t608\nn 21st st\t608\nsligo\t608\nsp 330\t608\nkau\t608\nozirna\t608\nhazait\t608\npalmer st\t608\nhalfords\t608\nkopernikus st\t608\nolimpiiskaia\t608\nhaystack\t608\nb 68\t608\nkukhnia\t608\ndeacon\t608\nmesta\t608\n1032\t608\nd550\t608\nkent rd\t608\n1107\t608\nbotelho\t608\nchiltern main ln\t608\niuzhni piriulok\t608\naviacion\t608\nelsi\t608\ndio\t609\nwrzshy\t609\nsiri\t609\nsanches\t609\nkrist\t609\ndechets\t609\nrodovia governador antonio mariz\t609\n245th\t609\nemmett\t609\ne 01 e 80\t609\npond rd\t609\nmabini\t609\nsp 270\t609\nwi 35\t609\nmwl\t609\nviilles\t609\nze13\t609\nb 246\t609\nkalina\t609\nhatcher\t609\nhuang yan gao su\t609\nschweriner\t609\nkleist st\t609\nmuse\t609\naleflainalefmte\t609\narbour\t609\ndelfino\t609\nechangeur\t609\nsurtes\t609\ncapac\t609\nwoodside rd\t609\nhenriquz\t609\na weir\t609\nhuangyan exp\t609\ncornish main ln\t609\npritchard\t609\nnovotel\t609\nsohn\t609\nv s lorenzo\t610\npyeongtag\t610\nchshmh\t610\nparakampse\t610\naguilas\t610\nuslugi\t610\nflisen\t610\npolitsiia\t610\ndao4\t610\nannen\t610\na muhlen bg\t610\n51a\t610\nzephyr\t610\ncanfild\t610\nsada\t610\nmateriales\t610\nflorencia\t610\ntopfer\t610\nc colon\t610\nc 53\t610\nplymouth rd\t610\nb 311\t610\nprager\t610\ngloucester rd\t610\nsovkhoz\t610\nn 234\t610\npon\t610\nharrat\t610\nslavianskaia\t610\nputt\t610\nksar\t610\ncra 22\t610\nv nuova\t610\nspitz\t610\ndunkirk\t610\ndao53\t610\nrodelbahn\t610\njuno\t610\njana matejki\t610\n1989\t610\nbldyte\t610\nr des pommirs\t610\nkisei\t610\nzhong jin chuan\t610\npalats\t610\ncobre\t610\nmalfa\t610\n1 580\t610\nbadener\t610\ng92\t611\nwerft\t611\ndermatologic\t611\nsean\t611\nukrtilikom\t611\nmakam\t611\nela\t611\nd 166\t611\npirvomaiskii piriulok\t611\nkilkenny\t611\naubert\t611\ncth f\t611\nwire\t611\nb 253\t611\na92\t611\ngrup\t611\n52n\t611\nmulla\t611\ns jefferson st\t611\neliot\t611\nbr 267\t611\ns maple st\t611\nepad\t611\nlany\t611\n3o\t611\nspecialist\t611\nqwr\t611\nsmith av\t611\nantelope cr\t611\naguascalintes\t611\niakutskaia\t611\nnew zealand contiguous zone\t612\nholder\t612\nnvvh\t612\nvincennes\t612\n3008\t612\nbonheur\t612\npapir\t612\nv guglilmo oberdan\t612\n970\t612\nurbain\t612\ngallup\t612\n17th av\t612\ng10\t612\nmania\t612\nmose\t612\nhosteria\t612\nr henri barbusse\t612\nebony\t612\nblucher st\t612\ncenters\t612\nkatun\t612\n962\t612\nsycamore ln\t612\nnational rt 56\t612\ncameron st\t612\nsidlerweg\t612\nouches\t612\nmallet\t612\nwaldrand\t612\nkona\t612\ntheophile\t612\ncedre\t612\nkoshesi\t612\nzambrano\t612\nlidir\t612\naryk\t612\nbeeive\t612\nsanno\t612\nshangno\t612\namberwood\t612\ndemetrio\t613\nfox cr\t613\njugendhaus\t613\narches\t613\ngentse\t613\nw pine st\t613\nwoburn\t613\narabe\t613\nsoba\t613\nlouvain\t613\nweisses\t613\npj\t613\nodakyu electric railway odawara ln\t613\npartigiani\t613\nlariat\t613\nr du 11 novembre 1918\t613\nrua piaui\t613\nus 4\t613\nniftianikov\t613\nus 218\t613\nr des iris\t613\nkripost\t613\nmotorcycle parking\t613\nculvers\t613\nyeongdonggosokdoro\t613\nmauritius\t613\nerasmus\t613\ntonys\t613\nsutton rd\t613\nbridlewood\t613\ncoventry rd\t613\nbulnes\t613\ndesirto\t613\ntraktovaia\t613\na1 m\t613\nwolverhampton\t613\nautohof\t614\nhawthorne av\t614\nadministracion\t614\nliget\t614\ncorne\t614\nerfurter st\t614\nbrusselse stwg\t614\njeep trl\t614\njagerweg\t614\nbarkley\t614\njoncs\t614\npolice municipale\t614\n991\t614\n019\t614\nbrew\t614\ntonkin\t614\nmerc mun\t614\nespana portugal\t614\nventana\t614\nlecture\t614\navocado\t614\nbristol rd\t614\n838\t614\nmarysville\t614\nalmirante brown\t614\nalter fridhof\t614\nkatholisches\t614\nnicolai\t614\nbrianza\t614\njon\t614\nctr dr\t614\nv veneto\t614\nsholokhova\t614\nhelen st\t614\nhauff\t614\nbancomer\t615\nmillfild\t615\nmilosa\t615\nbily\t615\nd 204\t615\nchubut\t615\nbronx\t615\nvisiolaia ul\t615\nptolemaida\t615\ndunmore\t615\nrainha\t615\ncth g\t615\noh\t615\ndechetteri\t615\nqrte\t615\nlipu g\t615\nnarodnaia ul\t615\nshaw rd\t615\nrdge dr\t615\nmarty\t615\nroldan\t615\nfelton\t615\nbrook ln\t615\npostfiliale\t615\nwyandotte\t615\nlap\t615\nignacio allende\t615\nl 49\t615\ndlrg\t615\nkampong\t615\nbrussels\t615\naldridge\t615\nreichs\t615\npolycliniqu\t615\n796\t615\narina\t615\ndonu\t615\nbenigno\t616\n2a c\t616\nqust\t616\npristizh\t616\nsafi\t616\nmassenet\t616\nquens dr\t616\ngers\t616\nalbemarle\t616\nshdh\t616\nmercury drug\t616\ndurazno\t616\ndover rd\t616\npitirburga\t616\nkio\t616\nfilm\t616\nmoneta\t616\npato\t616\neibenweg\t616\nantares\t616\nsr 26 old sr 6\t616\nfistivalnaia\t616\nituzaingo\t616\ncth d\t616\ne 45 e 60\t616\nfrunze st\t616\nvocabolo\t616\nwembley\t616\nsuiza\t616\n1350\t616\nr du lac\t616\nb16\t616\ncalcutta\t616\npidade\t616\nlefebvre\t616\npryor\t616\naitken\t616\nnazareno\t616\nhalla\t616\nlesny\t616\nsaisons\t616\nwaffle ho\t617\nmilagrosa\t617\nless\t617\nsom\t617\nhutten st\t617\ncadet\t617\nnabi\t617\nsupa\t617\nv benedetto croce\t617\nadriana\t617\nfreundschaft\t617\nvickers\t617\njacka\t617\ndaodabdakdam\t617\n864\t617\njr fan tian xian\t617\nul tirishkovoi\t617\n1051\t617\nfairground\t617\njohnstown\t617\nmhmdy\t617\nbahar\t617\ncth c\t617\nnandos\t617\nfahd\t617\nkladovishchi\t617\nsotsialni\t617\nvisconti\t617\nadolph\t617\ncholla\t617\nvogele\t617\nshaws\t617\nguo daodabdakdam hao\t617\ngovernor john davis lodge tpk\t617\npancho\t617\nrodo\t617\ntateyama\t617\noffice depot\t617\npurcell\t617\nstein bg\t618\njaroslawa\t618\ncolo\t618\nsigmund\t618\nbade\t618\nting2\t618\ngymnazium\t618\nturystyczna\t618\nmaze\t618\npolly\t618\nsteinach\t618\nbrownsville\t618\nblubird ln\t618\nb 466\t618\nd 817\t618\ntelevision\t618\nsck\t618\nhochfeld\t618\ndecor\t618\n1 86\t618\nlillo\t618\ntouhokuhonsen\t618\nropa\t618\nc nou\t618\nkhabrat\t618\ndroits\t618\noficinas\t618\n194th\t618\nquu\t618\nvuong\t618\n1080\t618\negerton\t618\nignazio\t618\n5th av n\t619\ng315\t619\nvytauto\t619\nfaja\t619\naugusta st\t619\nchaussee st\t619\nlisandro\t619\niunosti\t619\nkul\t619\npresszo\t619\n97a\t619\n1045\t619\nfragua\t619\ngajowa\t619\nainmq\t619\nainwalefd\t619\ngosokdoro\t619\nlegal\t619\nfenix\t619\nchangi\t619\nkwan\t619\nlazar\t619\ndidabs\t620\nkisgrube\t620\nconnecting\t620\nphillips 66\t620\nzeisigweg\t620\nmartindale\t620\npartizanskii\t620\nrein\t620\nr0\t620\ntarlac\t620\ntimor\t620\nfrank st\t620\nhuangyan\t620\nl 24\t620\nborromeo\t620\naleflnwr\t620\nfire stn\t620\nskipper\t620\naleflhjr\t620\nwinners\t620\nss131\t620\njr tokaido hauptlini\t620\ntyne\t620\navenija\t620\nmontreuil\t620\nwh\t620\nsnoman\t620\nca 91\t620\n1066\t620\nbati\t620\ncuts\t620\nhulu\t620\ndlain\t620\nvaladares\t620\n1 95 njtp\t620\nkro\t620\nst wis\t620\nveicular\t620\nslovenska posta\t621\nst st\t621\nv achille grandi\t621\ncabinas\t621\nd 976\t621\nhillman\t621\nmoricz\t621\noktiabrskii piriulok\t621\ncra 1\t621\nrua para\t621\nweeping\t621\ns 14th st\t621\nrenaud\t621\ncafetaria\t621\nrudi\t621\nmacleod\t621\niloilo\t621\ntrib\t621\ntodos\t621\nbles\t621\nheizung\t621\nr de plaine\t621\nninemile\t621\nredentor\t621\nditz\t621\nshose\t621\nmullen\t621\nmonash\t621\npowiatowa\t621\ncharente\t621\nimp du moulin\t621\nrodovia raposo tavares\t621\nmeadow st\t621\nemployee\t621\neri st\t621\nnascente\t621\nmaj\t621\nk 63\t621\nromani\t621\nponiatowskigo\t621\nzacatecas\t622\nkreisel\t622\nbargain\t622\n5ta\t622\nslaughter\t622\ngabelsberger\t622\nkruse\t622\nautov del norte\t622\ndeir\t622\nverano\t622\nmasaryka\t622\ngoff\t622\npohjoinen\t622\nmeadowlark ln\t622\ncheviot\t622\njr gao shan xian\t622\ngales\t622\nshlvm\t622\nb54\t622\nrif\t622\nzhinskaia\t622\nnous\t622\npost rd\t622\nyu xiang gao su\t622\nregatta\t622\nspitalul\t622\nshrkht\t622\nhorgerate\t622\nil\t622\nstowe\t622\ndoubletree\t622\nlyndale\t622\njosefa ortiz de dominguz\t622\na71\t622\nbelcher\t623\nbastia\t623\n1085\t623\nd 1006\t623\nwatling st\t623\nr14\t623\nfraunhofer\t623\nb72\t623\nmid yuba r\t623\nhrad\t623\nhorka\t623\nspecht\t623\nb20\t623\nrodovia marechal rondon\t623\nfursten\t623\nbogu\t623\nnama\t623\ntuul\t623\njing shi gao su gong lu\t623\nrodovia anhangura\t623\ntrevino\t623\nswede\t623\nhyacinth\t623\nrua belo horizonte\t623\nr du verger\t623\nst peters church\t623\nanfiteatro\t623\nzebra\t623\nmcdanil\t623\nsmyrna\t623\npanther cr\t624\ncrowley\t624\nbahru\t624\nopticians\t624\np za guglilmo marconi\t624\nhkr\t624\nstantsionnaia ul\t624\nmental\t624\norchards\t624\nbennetts\t624\nshhrstalefn\t624\ngorkogo ul\t624\notel\t624\nohio av\t624\nrsh\t624\ndrb\t624\nmiller cr\t624\nd 165\t624\nsilverwood\t624\nkirchhof\t624\npoliclinico\t624\njr sanin main ln\t624\ntally\t624\nandra\t624\n5th st n\t624\ndaodak\t624\nwittener\t624\nnft\t624\nk 62\t624\njd\t625\n18th av\t625\nnativite\t625\nyu in neng cu luan huang yuki ze jungbunaryuk exp\t625\ncastlewood\t625\nlandi\t625\ncasilina\t625\nv s michele\t625\nthermal\t625\nvysilki\t625\nc 50\t625\n40a\t625\nlurah\t625\nmarins\t625\nln st\t625\nfaber\t625\nsalem rd\t625\nholiday inn express\t625\nequstre\t625\nglenwood av\t625\narchimede\t625\nr st joseph\t625\nah72\t625\nwoodward av\t625\nkheurbet\t625\nb 102\t625\nprade\t625\nn62\t625\nliberty rd\t625\nstacey\t625\ndonegal\t625\nfabrichnaia ul\t625\ns81\t625\nhivatal\t625\nstuben\t626\npickerel\t626\nshortcut\t626\nsister\t626\nniko\t626\nw gr av\t626\nincline\t626\nblumenhaus\t626\njr shan yang xian\t626\nalexandra rd\t626\nc 63\t626\npinede\t626\ncypress dr\t626\nbokasuiso\t626\nriks\t626\nshoshone\t626\nd 765\t626\nklosterhof\t626\nnegre\t626\nclaires\t626\nfrailes\t626\n891\t626\nhampton rd\t626\njoris\t626\n2deg\t626\n025\t626\nsportanlage\t626\naar\t626\nxiao fang shui xiang\t626\nprimer\t626\ncistermas\t626\nrosental\t626\nnika\t626\nyamuna exp\t626\nstewart av\t626\nshkola 4\t626\nlt casars\t626\nlocker\t626\nsiracusa\t626\ncostantino\t626\nsr10\t626\nhartland\t627\nch des ecolirs\t627\n290th st\t627\nespanol\t627\nlours\t627\ndowling\t627\nkifer\t627\ntimberlane\t627\nlc\t627\nc 46\t627\nsp77\t627\n50 av\t627\nhansa st\t627\nengenho\t627\nabyad\t627\nsutera\t627\nrua 14\t627\nstaten\t627\naleflmdynte\t627\n1027\t627\ntextile\t627\njacksons\t627\nburleigh\t627\nlander\t627\nav 3\t627\nfok\t627\nmichurina vulitsia\t627\ntsintralnii\t627\nwnibowzicia\t627\nautobus\t627\nfritz reuter st\t627\npingo\t627\nfrwshgalefh\t627\nhod\t627\nmusical\t627\nferran\t627\nbascule\t627\nze9\t628\nkarla marksa vulitsia\t628\nmill branch\t628\nhouay\t628\npaderborn\t628\nsahib\t628\nbesancon\t628\nbriquteri\t628\nesterna\t628\ncypress av\t628\nsuzhou\t628\nogilvi\t628\nul isinina\t628\nus 6 sr 11\t628\ntai tian chuan\t628\nbamberger st\t628\nmiddlefild\t628\nbonilla\t628\na pk\t628\nfauna\t628\nvermelho\t628\nw bell rd\t628\npickle\t628\npekseg\t628\nhounds\t628\nlightning\t628\nherons\t628\nbarrir islands\t628\nmers\t628\npine r\t628\n2220\t628\n212th\t628\ncrestline\t629\nhoteru\t629\nhuato\t629\ncajero\t629\nhotan\t629\nquincailleri\t629\naiken\t629\n2045\t629\njill\t629\nkonsultatsiia\t629\nhanley\t629\nrees\t629\ndutchman\t629\na66\t629\nd 934\t629\ntsentralnaya\t629\npetersen\t629\ncreighton\t629\narca\t629\nglacire\t629\nedwards rd\t629\noberhausen\t629\nrichfild\t629\nn 75\t629\nlindner\t629\nl 3004\t629\nphilosophenweg\t629\ntabacchi\t629\nredwing\t629\ncalcio\t629\nferrire\t629\ngr union canal\t629\ndaccuil\t629\n959\t629\nus 212\t629\nbudai\t629\nbutton\t629\nbocskai\t629\nprairi cr\t629\n2281\t629\nbrighton rd\t629\nseriola\t629\n10b\t629\nantuna\t629\nrijlat\t629\nrimembranze\t629\n897\t629\nprovencale\t629\nmagnolia ln\t629\nbalagur\t629\nviliki\t629\nd 144\t629\nklosterweg\t629\naleftstralefd\t630\nbelediyesi\t630\ndgf\t630\nnatures\t630\nadao\t630\noriula\t630\nsary\t630\nze10\t630\nboukasuisou\t630\nqr\t630\ncassiano\t630\nnicolaas\t630\nlibra\t630\njawa\t630\nfrench cr\t630\nmagellan\t630\nrichard st\t630\nsami\t630\n3ra\t630\nburch\t630\nmoos st\t630\neleonora\t630\nparry\t630\nparral\t630\nbrookshire\t630\nfajardo\t630\npyramide\t630\nmaterials\t630\nkemal\t630\ngbuz\t630\ncopernico\t630\nkulturni\t630\nnito\t630\nbundesanstalt\t630\ntools\t630\nautomobiles\t630\nsteinfeld\t630\negge\t630\nroutes\t631\nrecords\t631\ndrago\t631\nghat\t631\nona\t631\npushkin\t631\nalma st\t631\nalvaro obregon\t631\nludalg\t631\nklary\t631\nsoap\t631\nclover ln\t631\ns309\t631\nmcclellan\t631\nb19\t631\njuventud\t631\nike\t631\nsturgeon r\t631\nelmo\t631\nr du temple\t631\nherve\t631\nw ctr st\t631\noak gr church\t631\nfindlay\t631\nfourth st\t631\ne 763\t631\nbunaventura\t631\ndenham\t631\ngalle\t631\nlos sauces\t631\nfasanen\t631\nwillow ct\t632\ncastleton\t632\nhuhang\t632\ncra 23\t632\nwedgewood dr\t632\ncypress cr\t632\nvassar\t632\nmaroc\t632\nsiridnia\t632\nthomas mann st\t632\ndeuxime\t632\ne s st\t632\nb 41\t632\nkuro\t632\n100k\t632\nnewbery\t632\nmonitka\t632\nolivares\t632\nch du cimetire\t632\ne 441\t632\nsangre\t632\nsabkhat\t632\ng12\t632\npate\t632\nnottingham rd\t632\nrin\t632\nnantucket\t632\n1089\t632\nambleside\t632\n1st av s\t632\nvallarta\t632\nb 57\t632\nfl 60\t632\ndao24\t632\nn 16\t632\nwheaton\t632\ncoire\t632\ncais\t632\ntiny\t632\nbushland\t632\nestudios\t632\nedessa\t632\nsilcher st\t633\nluniversite\t633\nfontanella\t633\nkozatska\t633\nbmo\t633\ns roqu\t633\nassuncao\t633\nrp14\t633\nprilaz\t633\nbalmaceda\t633\nkapines\t633\n2 av\t633\nplatforma\t633\nrispublikanskaia\t633\nyarrow\t633\nsurface\t633\nfridrich engels st\t633\nr des chataignirs\t633\nashworth\t633\nrabi\t633\nschuylkill\t633\ns35\t633\nkliuchivaia\t633\ngaudi\t633\nredding\t633\nhiribidea\t633\nilot\t633\nvictory bd\t633\ntranchee\t633\nwilshire bd\t633\nr hector berlioz\t633\npadi\t633\ncruce longitudinal\t633\ncourcelles\t633\nbudy\t633\nwharton\t633\nenge\t633\nbdr\t633\nmetrobank\t633\nchataignerai\t633\nlaurin\t633\nl 1\t633\nbk cr\t633\nbispo\t633\nalefnqlalefb\t633\npavese\t634\nav de las americas\t634\nemporia\t634\nmechelse\t634\ndimitrija\t634\nphuoc\t634\nwestheimer\t634\nplanches\t634\npicon\t634\nsagar\t634\nfern st\t634\nn36\t634\nsailing\t634\nkirchner\t634\nsquash\t634\njeffery\t634\n15 33\t634\nca 72\t634\nus 280\t634\nive\t634\nr de resistance\t634\nr pirre curi\t634\nd 212\t634\nmorte\t634\nprestes\t634\nspirito\t634\nhomero\t634\nhmdalefn\t634\nperkebunan\t634\narcades\t634\nvernon st\t634\naddis\t634\ncra 21\t634\nbrandweer\t635\nstele\t635\nelmira\t635\nkhar\t635\nferrovia firenze roma\t635\n896\t635\nze12\t635\nargyle st\t635\nn 19th st\t635\nvauxhall\t635\nneuhauser\t635\ncontreras\t635\n1132\t635\nmontesquiu\t635\nlozano\t635\n189th\t635\ncukraszda\t635\nua\t635\ncasares\t635\nbellamy\t635\nbaltazar\t635\nviterbo\t635\ncristobal colon\t635\naldrich\t635\nvestergade\t635\nbradbury\t635\na 12\t635\ngolfviw\t635\nglendale av\t635\nviso\t635\nmaricopa\t635\nrua dom pedro 2\t635\nwelser\t635\nsade\t635\nforskolan\t635\ncuril\t635\nkardinal\t636\ns andres\t636\npamatnik\t636\nvladimirskaia\t636\nbestattungen\t636\napostolo\t636\nc calvario\t636\nfreiwillige feurwer\t636\nhenson\t636\nellis st\t636\nemili\t636\npendidikan\t636\njin ji ri ben t dao da ban xian\t636\nnordbahn\t636\nmoray\t636\nhortensia\t636\nnadi\t636\nelm cr\t636\nsaturno\t636\nzapravka\t636\nmotocross\t636\nberyl\t636\ngibbons\t636\n340th\t636\nco rd 22\t636\nindustrialni\t636\ncrofton\t636\ntoys r us\t636\nturning\t636\njingzhang exp\t636\nparken\t636\nchillicothe\t636\nterm\t636\npozharni\t636\nofiar\t636\nl 16\t636\nv vittorio emanule\t636\nhindu\t636\nbutlers\t636\ninvestments\t636\nhedevej\t637\nxiuang exp\t637\nrp4\t637\nrua nove\t637\n50n\t637\ndongha exp\t637\ntilsiter\t637\nhammer st\t637\n202nd\t637\n877\t637\nbeauchamp\t637\nhrte\t637\npirival\t637\nhema\t637\nverici\t637\nep13\t637\naleflbw\t637\nlcr\t637\nfarah\t637\nsoft\t637\nm 12\t637\ndanemark\t637\nautov de las rias bajas\t637\nsp76\t637\nalkali\t637\nyu kun gao su\t637\nd 908\t637\nd 161\t637\njudge\t637\nwezel\t637\ndott\t637\n4c\t637\namethyst\t637\nkw\t638\nsotelo\t638\nmansilla\t638\nshaftesbury\t638\nbarbecu\t638\ngerry\t638\nsecretariat\t638\nmlynowka\t638\nhabil\t638\ndingle\t638\ns9\t638\nmurto\t638\nvisna\t638\nschonau\t638\ndebra\t638\ncarousel\t638\nkepler st\t638\ncarpe\t638\nwerkstatten\t638\nchapultepec\t638\ntecnologia\t638\ngabrila mistral\t638\npochtovi\t638\nalo\t638\nsoniachna vulitsia\t638\ns 3\t638\nhoyas\t638\nchevy\t638\nkoblenzer st\t638\ntouraine\t638\nthermes\t638\northopadi\t638\neagle cr\t638\nkilato\t638\nfong\t638\nyaakov\t638\n11 29\t638\nmada\t638\nmegalou\t638\nr du priure\t638\ncomunitaria\t638\nbuttermilk\t638\nridgefild\t638\nchiornoi\t639\nfraile\t639\n839\t639\nbrq\t639\nuhren\t639\nstiles\t639\ngracas\t639\nvillages\t639\nbernadette\t639\nkomintirna\t639\nmanna\t639\nbrosses\t639\nono\t639\n270th st\t639\nmanin\t639\nmilli\t639\ne 65 e 80\t639\ncasco\t639\ncommerce dr\t639\ndn\t639\nisar\t639\nkioski\t639\n46a\t639\nsail\t639\nkonstantego\t639\njyvaskylan\t639\nherriot\t640\ne pine st\t640\ncosta coffee\t640\nlloyds pharmacy\t640\nwebber\t640\nwolf tabakwaren\t640\nlahden vla\t640\nnarodov\t640\nrozcesti\t640\nmakmur\t640\nv fabio filzi\t640\necologico\t640\nkawasaki\t640\nacuna\t640\nbaga\t640\nteles\t640\ncrawford st\t640\ngreenacres\t640\nhaselbach\t640\nprofesional\t640\nshaikh\t640\nsp67\t640\nc s n\t640\nswitch\t640\nmontale\t640\nhai nan huan xian gao su hainan ring exp\t640\nrua mato grosso\t640\ncentras\t640\nchaussures\t640\nvalenzula\t640\nlesniczowka\t640\nzibarat\t640\ngalt\t640\ncalixto\t640\ndelfin\t640\nbrunn\t640\nzia\t640\nquoc\t640\nduchess\t640\nolof\t640\njbr\t640\nsellers\t640\nmishash\t640\nv liberta\t640\nculebra\t640\nafrika\t640\nzilini\t641\nmoskovska\t641\nviveres\t641\nlaurens\t641\ncort\t641\nterritoriale\t641\n14b\t641\nep14\t641\nrustavili\t641\nozero\t641\nlonga\t641\nuj\t641\nlimekiln\t641\nzhrte\t641\npurpose\t641\nzolnirzy\t641\nmilton st\t641\nkomercni\t641\nv regina margherita\t641\npluto\t641\ncoulter\t641\ne 233\t641\ncondado\t641\nda ze chuan\t641\npertanian\t641\ngleason\t641\n1 80 1 90\t641\nluonnonsuojelu\t641\ng78\t641\npalm dr\t641\nkentro\t641\nclarence st\t641\nr des cedres\t641\nfalcao\t641\ntbryz\t641\ngrazhdanskaia\t641\nbirch cr\t641\npinang\t641\nfarrington\t641\nor 99e\t641\nmadrona\t641\ncorregidora\t642\nalkotmany\t642\npetes\t642\ncharrire\t642\ndaves\t642\nk 47\t642\nalarcon\t642\nkavkazskii\t642\na 22\t642\neucalipto\t642\nsta clara\t642\nbatlle\t642\ntrapeza\t642\npui\t642\nrzeczna\t642\nthompsons\t642\nk 60\t642\njeziorna\t642\npolskich\t642\ndimitri\t642\nny 25a\t642\nshliakh\t642\nimmigration\t642\nmater\t642\nayam\t642\nevanston\t642\nescobedo\t642\noasi\t642\nfgc\t643\ndala\t643\ngeorgia av\t643\ndao3\t643\nreed st\t643\nturnbull\t643\noneill\t643\ncavallotti\t643\nfall cr\t643\noreilly auto parts\t643\nwaterbury\t643\nlijster\t643\ncongreso\t643\nliberia\t643\ndelmas\t643\nbellwood\t643\nspartak\t643\npantry\t643\nd 211\t643\nmaxim\t643\nhallera\t643\nsunbury\t643\nmt olive church\t643\nfrankrijk\t643\nd 301\t643\nus 501\t643\nrocky rd\t643\nd 905\t643\nlynn rd\t643\nwlyainsr\t643\nchicago ln\t643\ngur\t643\nardennes\t643\ntirarztpraxis\t643\ntchibo\t643\nleeward\t643\nwarren av\t643\nngan\t644\n187th\t644\naptichni\t644\nespiritu\t644\nbatan\t644\nrendelo\t644\n1 680\t644\nherbert st\t644\nmannheimer st\t644\nnegras\t644\nchorro\t644\nalvarenga\t644\nthal\t644\nn 18th st\t644\n201st\t644\nponderosa dr\t644\n863\t644\nsanriku\t644\nss26\t644\natletico\t644\nr thames\t644\nilina\t644\nus 122\t644\ncrosstown\t645\ncooley\t645\nsycamore rd\t645\n027\t645\nzigel st\t645\ncanela\t645\npatterson rd\t645\nkristen\t645\npittman\t645\ncarme\t645\njunipero\t645\nstanitsa\t645\n1014\t645\n260th st\t645\nslatina\t645\nv sardegna\t645\nskolevej\t645\nthornwood\t645\ngorno\t645\nemscherschnellweg\t645\nsunkus sankusu\t645\nnyuop\t645\ngila\t645\npurple heart memorial hwy\t645\n1 4\t645\nwestwind\t645\natu\t645\nhaintsmalefvt\t646\nt9\t646\ndarb\t646\ntstp\t646\nlvy\t646\nrobledo\t646\nnalogovaia\t646\nsun yat sen fwy\t646\ncolonna\t646\nirik\t646\nkenvtukiuraidotikin\t646\npremir inn\t646\nascension\t646\ncalf\t646\nio\t646\nnelli\t646\ngermantown\t646\ngoulburn\t646\ninchuan\t646\nnorberto\t646\nshoal cr\t646\nobergasse\t646\ngitmana\t646\nb 313\t646\nsettentrionale\t646\nbasel\t646\nava\t646\nrena\t646\nfoster st\t646\nsalines\t646\nbogdana khmilnitskogo ul\t646\nsivas\t646\nrasm\t646\nbuffalo r\t646\nlawrence rd\t646\nassumption\t646\nw s st\t646\nlomba\t646\nsaud\t646\nr bellevu\t647\nkade\t647\npis\t647\nduffy\t647\nheidi\t647\n792\t647\nbuca\t647\nalwan\t647\nautoservicio\t647\nburwood\t647\nmenard\t647\nn80\t647\nv giovanni falcone\t647\nsuttner\t647\ngeraumt\t647\nflagler\t647\npulaskigo\t647\nr claude debussy\t647\n5c\t647\ncalypso\t647\nr ln\t647\nlizard\t647\ncharlotte st\t647\nd 146\t647\nzhong chuan\t647\nink\t647\nsouthern tir exp\t647\ndisabled\t647\nk 48\t647\nashbourne\t648\nbride\t648\nmayfild rd\t648\nlucero\t648\nlat\t648\nzhong shan dao\t648\naleflainyn\t648\nlvivska\t648\nrosengasse\t648\nnas\t648\n70a\t648\nvitorino\t648\nbodenseeautobahn\t648\nkraal\t648\nyak\t648\nstallion\t648\np za giuseppe garibaldi\t648\na487\t648\ndelaney\t648\nscottish\t648\norzeszkowej\t648\nmatije\t648\nsuncrest\t648\nkenosha\t648\ndovbusha\t648\nbuford\t648\nzajazd\t648\nsalut\t648\nbertram\t648\nalemannen st\t648\nhour\t648\nfourmile cr\t648\nr de lorraine\t648\nresidenza\t648\ncesario\t648\nss223\t648\nkolcsey\t648\nprosta\t648\ngypsy\t648\naltes rathaus\t648\nchurch hill\t649\nyar\t649\nporin t\t649\nsandhurst\t649\nsahl\t649\nd 151\t649\naliia\t649\naleflqdymte\t649\nacademy st\t649\n16 34\t649\ngps\t649\ngreenfild rd\t649\nalaska hwy\t649\n191st\t649\nessener\t649\nreger\t649\nperum\t649\ntianno\t649\nsalefhb\t649\nfyalefd\t649\nbailly\t649\nrodnikovaia ul\t649\n1103\t649\nfordham\t649\nvictoria dr\t649\npohon\t649\nvolker\t649\nunder construction\t649\nvg\t649\npapandreou\t649\ne 851\t649\nkalamas\t649\ngading\t649\nmarcondes\t649\ncanchas\t649\nacadia\t649\nbaltiiskii\t649\nseagull\t650\nhameenlinnan vla\t650\nlirr main ln\t650\nstadtmobil\t650\nss33\t650\nrooster\t650\nd 973\t650\nmasarykova\t650\ntikhnichiskii\t650\ntamara\t650\nst einheit\t650\npanjang\t650\nzviazku\t650\nlavage\t650\nsigen\t650\na33\t650\nneumuhle\t650\ncinqu\t650\nep8\t650\nk 49\t650\nlanchonete\t650\nkiuri\t650\nfairfild rd\t650\nrainy\t650\nspoorweg\t650\nkuta\t650\nn 11\t650\nlittleton\t650\ndourimpig\t651\nv adige\t651\nv don minzoni\t651\nvalente\t651\naleflqalefhrte\t651\nfacilitis\t651\nheilbronner\t651\nester\t651\nl 60\t651\nkampe\t651\nmulligan\t651\n1101\t651\nn 86\t651\ngenaro\t651\nwanne\t651\nsocar\t651\nhyang\t651\nbyvshaia\t651\ncambridge dr\t651\nagha\t651\nbruna\t651\nss67\t651\nbouchet\t651\nqdrt\t651\nknott\t651\ndn2\t651\nbinario\t651\nmeister\t651\nuusi\t651\nstycznia\t651\nvillaverde\t651\nfifth av\t651\npapeteri\t651\nskalka\t651\nanza\t651\ntioga\t651\nabarrotes\t651\nalston\t651\nescorial\t652\n2c\t652\nportail\t652\nlaki\t652\npolisi\t652\naguilera\t652\ndily\t652\ngarita\t652\nmantova\t652\ntaikos\t652\nbolognesi\t652\ndao19\t652\nconfederation\t652\nspoon\t652\nviry\t652\nsichovikh striltsiv vulitsia\t652\nfuoco\t652\nerickson\t652\ntoi\t652\nzavodska vulitsia\t652\nrennweg\t652\nkmart\t652\nbegonias\t652\nr15\t652\ndavison\t652\nwheatland\t652\nzizkova\t652\nmorelia\t652\nbmt\t652\n43a\t652\nban shen dian qi t dao ben xian\t652\nmilosha\t652\nbragg\t652\nw 16th st\t652\ntropicana\t652\norkhon\t652\nwildcat cr\t652\nskilift\t652\nalpen st\t653\nhopper\t653\nn60\t653\nmiszka\t653\nmouse\t653\nmakedonski\t653\npullman\t653\nb 275\t653\nv s marco\t653\nsimo\t653\ncowley\t653\nspring cr rd\t653\nsereno\t653\nbr 277\t653\npa 611\t653\nvicks\t653\nrua castro alves\t653\nkhbrte\t653\ndonovan\t653\nwold\t653\ngriya\t653\nisabelle\t653\nopolska\t653\ngamestop\t653\nkreis st\t653\nboon\t653\nsviatoga\t654\nvigili\t654\naxe\t654\nnaturfreunde\t654\nhosp st\t654\nmontigny\t654\nelizy\t654\nhbyb\t654\nseguro\t654\ncherry cr\t654\nabandoned cnr rowy\t654\naranda\t654\nco rd 23\t654\nstaatliche\t654\nvirchow\t654\nsevernaya st\t654\ngain\t654\nhume hwy\t654\nraglan\t654\nromea\t654\n1008\t654\ndealer\t654\nhalal\t654\nd 154\t654\nnovaya\t654\npools\t654\nrua barao do rio branco\t654\nnicklaus\t654\naleflnsr\t654\nul vatutina\t654\nrsm\t654\nwhitby\t655\n42a\t655\ngobetti\t655\nd 751\t655\naussenstelle\t655\npeyton\t655\nsucia\t655\nphi\t655\neluard\t655\nwetan\t655\nss 77 della val di chinti\t655\nrossbach\t655\nsoriana\t655\nrempart\t655\nwoodlake\t655\ncooke\t655\ndn15\t655\nnjain\t655\nfildcrest\t655\nplumpe\t655\nbarberry\t655\nmumbai\t655\nzaslonova\t655\norozco\t655\nnaturfreundeaus\t655\nkomsomolskii prospikt\t655\nd 164\t655\nbull cr\t655\nmodelo\t655\nrusty\t655\ncasimiro\t655\ncolliry\t655\ncapdenac\t655\nmonk\t655\nhftm\t655\nmichal st\t655\ngray st\t655\nelizabeth av\t655\ngoodwood\t655\nal des acacias\t656\ndong jing huan zhuang\t656\nrua 13\t656\ncoliseum\t656\nhzm\t656\nbryce\t656\nmolendijk\t656\ntrader\t656\nbellflower\t656\nmic\t656\ne15\t656\nluther st\t656\ngalo\t656\ncth m\t656\nco rd 14\t656\nrimbaud\t656\ndestra\t656\nsanat\t656\nriverviw rd\t656\nappel\t656\npeloponnesou\t656\nst 6\t656\nspor\t656\nruta nacional 40\t656\nberner\t656\nshark\t656\nosnabrucker st\t656\nsudlicher\t656\nruan\t656\nban he zi dong ch dao\t657\ngr pl\t657\nkonstytucji\t657\nbao fu gao su\t657\nfiore\t657\nleopold st\t657\njohannes st\t657\ntriton\t657\niunost\t657\naril\t657\necluse\t657\ntijuana\t657\nnaciminto\t657\nhoward rd\t657\nchisetta\t657\nsp69\t657\ntbilisi\t657\nwirt\t657\ntangenziale sud\t657\ng319\t657\niguazu\t657\nr de lavenir\t657\nxu chuan\t657\ndamascus\t657\nkraus\t657\nlondonderry\t657\nsimms\t657\nautostrada messina palermo\t657\nc 39\t657\nzo\t658\nss63\t658\nennis\t658\nhaddon\t658\nhoz\t658\nn201\t658\nlaboratoriia\t658\nfischer st\t658\nkhr\t658\nb 185\t658\nparents\t658\npalmyra\t658\nmyjnia\t658\nco rd 25\t658\nschutzenweg\t658\nlortzing\t658\nwu he ruo xia zi dong ch dao\t658\naliso\t658\nvil\t658\nqabr\t658\nbeinn\t658\ncr 32\t658\nrob\t658\njr dong bei ben xian\t658\nwidokowa\t658\nlouche\t658\nspectrum\t658\nreus\t658\ncoy\t658\nclimbing\t658\nfreirr vom stein st\t658\nleven\t658\nedgewater dr\t658\ntyler st\t658\nalde\t659\nbonaventure\t659\nrua sergipe\t659\ncasper\t659\ncushing\t659\nv enrico toti\t659\nhs2 phase 2b w midlands to leeds\t659\nkhotil\t659\nmorris rd\t659\nav francois mitterrand\t659\nkort\t659\nwein bg\t659\nb 72\t659\njr kagoshima main ln\t659\npumpwerk\t659\ncostes\t659\nlecce\t659\nkathe kollwitz st\t659\nprosperity\t659\nboswell\t659\nmirante\t659\nservico\t659\nbouvreuils\t659\nat sf railway\t659\ncampinas\t659\nss10\t659\ngenom\t659\ntern\t659\nvolna\t659\ncurva\t660\nwoodlawn av\t660\neastex\t660\nmeadowood\t660\nkinderkrippe\t660\navias\t660\nmurray rd\t660\na56\t660\nrdwy\t660\ne 584\t660\nmelati\t660\nv s giovanni bosco\t660\neagle st\t660\nwhole\t660\nenriquz\t660\nroberts st\t660\npeche\t660\nspartan\t660\ntali\t660\nav de paris\t660\nmccall\t660\nberken ln\t660\nbeasley\t660\nrodovia ulisses guimaras\t660\nmiditsinskoi\t660\nparlour\t660\nl 23\t660\ncumhuriyet\t660\njones cr\t660\npaf\t660\nweissdornweg\t660\nuniversitats st\t660\nurbanizacao\t660\njingshen exp\t660\npalmer rd\t661\nkeiyo\t661\njohnson av\t661\nbeaux\t661\ndickerson\t661\nwyspianskigo\t661\niwaki\t661\nbrin\t661\nmcallister\t661\njingshen\t661\nober st\t661\nbezirk\t661\nargo\t661\nah32\t661\n884\t661\ngaa\t661\ndisabili\t661\nb12\t661\n3020\t661\nhttps\t661\nmalden\t661\nmitallurgov\t661\nsusanne\t661\nst andrews dr\t661\nbeng\t661\nways\t661\na 370\t662\nviborgvej\t662\ntaipei\t662\ngedenkstatte\t662\nul krylova\t662\nstate rd\t662\nbatas\t662\ntrirer st\t662\ndelegacion\t662\nnugget\t662\nriabinovaia ul\t662\nalfamart\t662\nbetribshof\t662\npasarela\t662\naintyte\t662\ntennis ct\t662\nbermejo\t662\nl 11\t662\ngurtozhitok\t662\nsilpo\t662\nfm 1960\t662\nnovii\t662\nthrough\t662\noffice de tourisme\t662\n1 24\t662\nd 155\t662\nredlands\t662\ne 402\t662\nrazvaliny\t662\nscheune\t662\nwestviw dr\t662\nnoorder\t663\njungbunaryukgosokdoro\t663\npobedy\t663\nsch\t663\nalon\t663\nvyytsmn\t663\naliksandar\t663\ncozy\t663\nvtoroi\t663\nsunnybrook\t663\nmosel st\t663\nheidelberger\t663\nferrol\t663\nkirchen pl\t663\ncua\t663\nrjlte\t663\nwedge\t663\nkilkis\t663\nv udine\t663\nmahendra\t663\n1 35e\t663\ns206\t663\ngower\t663\nlasem\t663\nxe\t663\nfridberger\t663\na259\t663\nl 1100\t663\ngoss\t663\nsufla\t663\npa 3\t663\njakobus\t663\nnether\t663\npl de iglesia\t664\ntermas\t664\nrozsa u\t664\nespacio\t664\nheimat\t664\nwide\t664\nslovenska sporitelna\t664\nposeidon\t664\nwells rd\t664\norto\t664\ndaodabsdatdam\t664\nfuko\t664\npainter\t664\nhermenegildo\t664\nmanco\t664\narabia\t664\nlee hwy\t664\nblood\t664\nm18\t664\nsadovoi\t664\norden\t664\nr maurice ravel\t664\nzbalefrte\t664\nhandy\t664\naleflbydalefhamza\t664\no df st\t664\nbirizovka\t664\nguo daodabsdatdam hao\t664\nus 53\t664\n1 270\t664\nbauhaus\t665\nharo\t665\nn maple st\t665\nkedai\t665\nnh65\t665\nkosmonavtiv\t665\narmour\t665\ntechnologi\t665\nluitpold\t665\nmaurer\t665\nchang gu chuan\t665\nvau\t665\ngippsland\t665\nlandshaftnii\t665\nkoloniia\t665\npeiraios\t665\ngens\t665\ntemplirs\t665\nhilfswerk\t665\nholl\t665\njuniper dr\t665\nraadhuis st\t665\nmeridinne\t665\ndah\t665\nn eastern standard gauge ln\t665\nberne\t665\nlawndale\t665\nmaple ct\t665\nkhalefnh\t666\nterul\t666\nrt de gare\t666\n2350\t666\nperemohy\t666\ncore\t666\nvitorio\t666\nastana\t666\ndemos\t666\ngardes\t666\nc 66\t666\ngreenside\t666\ngertrud\t666\ncosmetics\t666\nhoff\t666\nayers\t666\nallens\t666\nbreitenbach\t666\nkhlibozavod\t666\ncowboy trl\t666\nmejia\t666\nota\t666\nivropa\t666\nlesli st\t666\nr des mimosas\t666\nclarion\t666\ninnsbrucker\t666\ndt\t666\nsr 134\t666\nmorandi\t666\nwali\t666\njoker\t666\nrdge st\t666\nnikko\t666\ncharlis\t666\njr musashino ln\t666\nbrompton\t666\nlibertadores\t666\ntravessia\t666\nsjo\t666\ncarne\t666\nvijas\t666\ng1512\t667\ncuza\t667\nrosenheimer\t667\nbarcelos\t667\nmanley\t667\nmanitoba\t667\nd 306\t667\ncrook\t667\nbernal\t667\nace hardware\t667\nmediterranean\t667\nambasada\t667\ncastellanos\t667\nraso\t667\nlulu\t667\ncordon\t667\nrebel\t667\nc 48\t667\nreinhard\t667\nescalante\t667\ncasilla\t667\nshqalefyq\t667\nbruckner st\t667\nfairlane\t667\ndurance\t667\nbrandstrom\t667\ntsitkin\t667\nsassari\t667\ndaiv\t667\nsupermercados\t667\ncerna\t667\nboathouse\t667\nhummel\t667\nn 623\t667\nward rd\t667\n197th\t667\nprolongee\t667\nkga\t667\nmataram\t667\nerzurum\t668\nminni\t668\nbazarnaia ul\t668\nteakwood\t668\n829\t668\nus 20 bus\t668\nvaches\t668\ncracker\t668\ngoda\t668\njr wu zang ye xian\t668\ngorman\t668\naleflthalefnwyte\t668\nsooruzhiniia\t668\njokai mor u\t668\nreinhold\t668\njohanniter\t668\n12e\t668\n1n\t668\nkoper\t668\ntele\t668\nv chisa\t668\natp\t668\ndolgoi\t668\nr albert camus\t668\naleflrhmn\t668\nmansfild rd\t668\nframe\t668\nstoneaven\t668\nmarinas\t668\nlinke rheinstrecke\t669\nmatin\t669\nruy\t669\novrazhnaia\t669\naloha\t669\npur\t669\nphotography\t669\nblustone\t669\nmawar\t669\nengvej\t669\n08 26\t669\nu df st\t669\ncfa\t669\ncopperfild\t669\namerika\t669\nshore dr\t669\nbutt\t669\nsivirnoi\t669\nwright rd\t669\njoseph st\t669\noven\t669\nharveys\t669\npalazzetto\t669\nmarca\t669\nbarres\t669\ntoluca\t669\ndunav\t669\nsardis\t669\npellegrino\t669\nqunha luan huang yuki ze\t669\ncomplexo\t670\n2004\t670\nlanches\t670\nherb\t670\nsever\t670\nverizon wireless\t670\nchaikinoi\t670\nruko\t670\nswim\t670\nkassel\t670\ndevil\t670\ndamjanich\t670\nhyeonda\t670\njubb\t670\nmaintalautobahn\t670\nbergs\t670\npfeiffer\t670\nr7\t670\nnibelungen\t670\nsore\t670\nscrub\t670\ntxiki\t670\nr des pinsons\t670\nbotte\t670\n022\t670\nv vittorio emanule 2\t670\nhusky\t671\ndrugstore\t671\nantonino\t671\nrstwralefn\t671\nedicola\t671\nreinaldo\t671\nl 12\t671\ngrant rd\t671\nvillage rd\t671\nfurther\t671\nn 15\t671\nkhamis\t671\nkoban\t671\nmot\t671\nr jules verne\t671\nnaos\t671\nch vert\t671\nroqus\t671\nswimming pool\t671\njuko\t671\nsulayman\t671\npalefrkhyng\t671\nsoriano\t671\nrt de lyon\t672\nny 27\t672\nalmendro\t672\nlesi\t672\nptit\t672\nmaiskii\t672\niao\t672\nstathmos\t672\nk 43\t672\nstadtbucherei\t672\nkew\t672\ndeg\t672\namericano\t672\nhrvatska posta\t672\nzeche\t672\ntamworth\t672\ngui chuan\t672\nrigg\t672\nraiffeisen bank\t672\ng106\t672\nbarraca\t672\nmontcalm\t672\nvhardizd\t672\ninman\t672\nkorean war veterans memorial hwy\t672\nl 20\t672\ndivisione\t672\npolk st\t672\nroder\t672\nsbkhte\t673\nrheintal\t673\noum\t673\nb 304\t673\ngotz\t673\nfalk\t673\nriserva\t673\nlivski\t673\nm 25\t673\ngola\t673\nrear\t673\naok\t673\ns212\t673\nnasser\t673\ns 13th st\t673\nn v\t673\nrostov\t673\nfuk\t673\nr st jacqus\t673\nrodoanel\t673\nb67\t673\nmindener\t673\nrosenthal\t673\npolizeiinspektion\t673\nkirpichnaia ul\t673\nnachtigallenweg\t673\nprovost\t673\ntani\t673\nsalisbury rd\t673\nkaufhaus\t674\naconcagua\t674\nbutler st\t674\nsaddleback\t674\nblythe\t674\nkowloon\t674\nlora\t674\nsilverio\t674\nsweden\t674\npeter st\t674\nguta\t674\nvatutina vulitsia\t674\n280th st\t674\nritter st\t674\nbatorego\t674\n2018\t674\nflash\t674\ns80\t674\nhorna\t674\nflorida av\t674\nhoop\t674\nspeicher\t674\nkerk pln\t674\ntelekom austria\t674\nul 40 lit oktiabria\t674\nmatheson\t674\nbouf\t674\nempress\t674\nv edmondo de amicis\t675\ntaillis\t675\nespaco\t675\nburgstall\t675\nidrotts\t675\nralf\t675\nsouthridge\t675\nlazara\t675\ngrandviw av\t675\nfruteria\t675\nset\t675\npustertaler\t675\nmenuiseri\t675\nlucille\t675\ntwain\t675\nbarrack\t675\nschild\t675\ndoubs\t675\nstationsvej\t675\n2054\t675\ncanadian pacific railway belleville subdivision\t675\nsewell\t675\njifang\t675\nvodokanal\t675\nkastsiol\t675\nrassvit\t675\npfarrhof\t675\nco rd 24\t676\nboguna\t676\nvarenne\t676\ngagarina st\t676\ninformacion\t676\nheath rd\t676\nlantinen\t676\nroa\t676\nlilac ln\t676\npolytechnic\t676\nrodovia ulysses guimaras\t676\ntibet\t676\naswad\t676\npl du 8 mai 1945\t676\nmakidonski\t676\nbrussel\t676\nramsay\t676\nrua quinze de novembro\t676\nflider st\t676\nsoul\t676\nwegweiser\t676\nlougheed\t676\nindustripark\t676\nveld st\t676\nold sr 6\t677\nrichtung\t677\nblacksmith\t677\nbuddhist\t677\noril\t677\nelisabeth st\t677\nepa\t677\nsuperette\t677\n1106\t677\nstube\t677\nw 14th st\t677\nalefldalefyry\t677\neve\t677\nquijote\t677\nsagebrush\t677\npz\t677\n193rd\t677\ncra 19\t677\ncolton\t677\nhalt\t677\n1 20 1 59\t677\nunited methodist church\t677\nbaskin robbins\t677\nn church st\t677\nruhrschnellweg\t677\nah150\t677\nthroat clinic\t677\nshogakko\t677\ncondes\t677\nlincoln dr\t677\nnicolas bravo\t677\nproxi\t677\nfleuve\t677\ngranda\t678\nfox rd\t678\nfabian\t678\nfalah\t678\nwarszawa\t678\nhypovereinsbank\t678\nbanska\t678\nsafa\t678\npinta\t678\nmorgans\t678\nvazov\t678\nvitale\t678\nul kommunarov\t678\nne ste\t678\nneugasse\t678\nbuhler\t678\ncaidat\t678\nn state st\t678\nred lion\t678\naraucarias\t678\nhanuman\t678\nkari\t678\nflugel\t678\nchutes\t678\nrua nova\t678\nmontezuma\t678\nalefljdyd\t678\nvillars\t678\nlwowska\t678\nukrainskaia ul\t678\nairport dr\t678\ngephura\t678\ni ban guo dao112 hao\t678\nwendell\t678\nkirava\t678\ncider\t678\nzdravlja\t678\nmaire\t678\nseed\t678\nanh\t678\ngranit\t678\ndavi\t678\njiffy\t679\nst 2260\t679\nwaldchen\t679\nv toscana\t679\nrank\t679\natili\t679\ncarpets\t679\n27th st\t679\n34a\t679\nlak\t679\nchiba\t679\n698\t679\nkilpatrick\t679\nrfv\t679\nautoroute de lest\t679\njolla\t679\nze11\t679\nul stipana razina\t679\nkohlen\t679\nv 20 settembre\t679\nbuzon de correos\t679\nrichardson rd\t679\npanzio\t679\nmatte\t679\nstroud\t679\ntrav\t679\nposyandu\t679\nmechtat\t679\ngiroiam\t679\njanuario\t679\nspruce av\t679\ncavalcavia\t679\nlukas\t679\nchateaux\t679\n198th\t679\nmoika\t679\ne 16th st\t679\ncukirnia\t679\nr molire\t679\n2125\t679\ne 533\t680\nimp des lilas\t680\na wald\t680\nus 97\t680\nmarkische\t680\nreg\t680\ngebruder\t680\narica\t680\ntotalerg\t680\nraspberry\t680\nsakit\t680\nsupreme\t680\nv vittorio alfiri\t680\nven\t680\nmaryland av\t680\nhall ln\t680\nweseler\t680\ncrematorium\t680\nthor\t680\nmjyd\t680\n3005\t680\npunjab\t680\naustin st\t680\nalemannen\t680\nmonge\t680\nv enrico mattei\t680\niberia\t680\nscikow\t680\n964\t680\nbedford rd\t680\nantonin\t680\nfrisco\t680\nnasosnaia\t680\nrecyclinghof\t680\nkurhaus\t680\nc6\t680\nsfc\t681\nlhorloge\t681\nsalefdraleft\t681\ntennis courts\t681\ncampbells\t681\niugo\t681\nbahnsteig\t681\nd 99\t681\nwasser st\t681\nobshchiobrazovatilnoi\t681\npsaje 3\t681\nkoblenzer\t681\nkorolinko\t681\nbirchwood dr\t681\npalmers\t681\nbohm\t681\nniman\t681\nsamarinda\t681\nwly\t681\neducacional\t681\nheating\t681\ndepot rd\t681\ntirol\t681\nhunter rd\t681\naquarius\t681\npsi\t681\nmtn cr\t681\njk\t681\nyalefs\t681\nstal\t681\nco rd 27\t681\neberhard\t681\n696\t681\nlaja\t681\ner ding mu\t682\nojos\t682\nhenrys\t682\nontonagon\t682\nweeks\t682\nkoge\t682\nbandiri\t682\nwhite oak dr\t682\nr louis pasteur\t682\ntrestle\t682\nuspiniia\t682\nrother\t682\ntunas\t682\nsp66\t682\nare\t682\napostola\t682\nkarting\t682\nattilio\t682\ntash\t682\ndaji\t682\ndolomiti\t682\nzagreb\t682\nxiao chuan\t682\nbrandenburger st\t682\nbens\t682\nprut\t682\nits\t682\npischanaia ul\t682\nturistica\t682\nplikhanova\t682\nmerles\t682\nbay rd\t682\nschulte\t682\nrainbow dr\t682\ndalefwwd\t683\nwitolda\t683\nlassen\t683\nforestal\t683\nfinger\t683\nsandoval\t683\na43\t683\ncharon\t683\nautoroute dolympia\t683\nvallo\t683\nmwy a5 ionian mwy\t683\ncovey\t683\ndan in xin\t683\nenergia\t683\ncarls jr\t683\ncontrole\t683\ndolympia\t683\nlaurelwood\t683\nmestska\t683\nverdagur\t683\nrancheria\t683\ncsrio\t683\nkendrick\t683\ncrafts\t683\n779\t683\nange\t683\nliuks\t683\nyunus\t683\nqtainte\t683\ntrigo\t683\ntadeu\t683\ngoldsmith\t684\ngrives\t684\nbons\t684\npostes\t684\npokrovskaia\t684\n784\t684\nkanda\t684\nsouthwestern\t684\nbangalore\t684\nbrentwood dr\t684\npetunia\t684\n3200\t684\nezequil\t684\naurel\t684\nkildare\t684\nav 7\t684\nyogurt\t684\nviar\t684\nmott\t684\nbursa\t684\nan abhainn mhor\t684\nautokinetodromos a5 ionia odos\t684\nv raffallo sanzio\t684\ndao58\t684\nlindley\t684\ns carlos\t684\ntaunus st\t684\n065\t684\nchkalova vulitsia\t684\naker\t684\neuronics\t684\n99a\t684\nc s antonio\t684\nsera\t684\nmiodowa\t684\ngottardo\t684\nul pugachiova\t685\nzigeleiweg\t685\n2003\t685\nr du marechal leclerc\t685\nvanderbilt\t685\na graben\t685\nsemmering schnell st\t685\nd 162\t685\nandersen\t685\npalm st\t685\nayer\t685\nkolkhozni\t685\nferrovia roma napoli\t685\ndarul\t685\nortaokulu\t685\nmolodyozhnaya st\t685\ndavis dr\t685\nrn 4\t685\nlochan\t685\ncontiguous\t685\nhoward av\t685\nsorlandsbanen\t685\nferrovia roma napoli alta velocita\t685\nary\t685\nfirst christian church\t685\nstockholm\t685\nveer\t685\npogranichnaia\t685\nus 7\t685\ns100\t685\ngallatin\t685\nstudinchiskaia\t685\naleflsalefdte\t685\nzentrale\t685\nmong\t685\ndato\t685\n38k\t685\nxing lin gao su gong lu\t686\ndonat\t686\ncommercial rd\t686\nforca\t686\njeffris\t686\nvalsugana\t686\nsmith ln\t686\ncardinale\t686\ninicial\t686\ngirasoles\t686\njagilly\t686\nzapad\t686\npischani\t686\nok 51\t686\nzagorodnaia\t686\nburgruine\t686\ncommodore\t686\nappletree\t686\nalbacete\t686\nmeira\t686\nblom\t686\nwendover\t686\nridder\t686\nn 20th st\t686\npiri\t686\npages\t687\n2500\t687\nhopi\t687\nr 217\t687\nsuriu\t687\nlugova\t687\nislington\t687\nzurcher st\t687\nk 59\t687\nr 255\t687\npenrose\t687\nkelter\t687\nmcconnell\t687\nco rd 29\t687\nrossignol\t687\ngramme\t687\ngreeley\t687\nboulanger\t687\nantenor\t687\nruta de plata\t687\nkarlsbader\t687\nwood rd\t687\nc interna zona agricola\t687\nborba\t687\n3600\t687\ngoleti\t688\nolympian mwy\t688\ndispensaire\t688\npaquis\t688\nrailways\t688\nbratshi\t688\nmarbella\t688\nthorbecke\t688\njoshin\t688\nbibliotheek\t688\nolya\t688\n36a\t688\nbuilders\t688\njr chang qi xian\t688\ncycling\t688\n866\t688\nepp\t688\nmoussa\t688\nmayr\t688\ngrota\t688\nkrai\t688\ns pine st\t688\nkhn\t688\nhirten\t688\nmidway rd\t688\nactivity\t688\nzand st\t688\nmuril\t688\nmorskaia\t689\ngomeria\t689\nd 147\t689\npd\t689\nholcomb\t689\ncv rd\t689\nsidler st\t689\ngeranios\t689\nautov del sur\t689\nmaladziozhnaia vulitsa\t689\nn r rd\t689\ne 36\t689\nromeral\t689\nlatimer\t689\nbraddock\t689\nsum\t689\ntalstation\t689\nhoneysuckle ln\t689\nnore\t689\nterraza\t689\ncagliari\t689\ntrevo\t689\nrua getulio vargas\t690\narakawa\t690\na sonnenhang\t690\nhsk\t690\nhuu\t690\njustino\t690\nzollhaus\t690\nmeishin\t690\nharrys\t690\ncastle rd\t690\nkrasnoarmiiskii\t690\nsandford\t690\nsolicitors\t690\nsenter\t690\nmeda\t690\noaklawn\t690\nminer\t690\nseniorenheim\t690\nspray\t690\nrua pernambuco\t690\nshomaker\t690\nkomenda\t690\nc f\t690\nathenes thessaloniqu evzoni\t690\njainfr\t690\nriou\t690\nzikit\t690\nguterbahnhof\t690\ncolosio\t690\nzaliznichna vulitsia\t691\nwhitefish\t691\nmshainvl\t691\nkite\t691\nrua 15 de novembro\t691\n4th av n\t691\nunibank\t691\nmiron\t691\neid\t691\nleuven\t691\nnico\t691\nhelle\t691\na 17\t691\nmaranatha\t691\nvulcan\t691\njurong\t691\npushkina ul\t691\n2035\t691\nmarii sklodowskij curi\t691\npalencia\t691\nfanny\t691\nvange\t691\nus 250\t691\n1re\t691\ncommonwealth bank\t692\nfurst\t692\nchiorni\t692\ngalvan\t692\njosefs\t692\nsibley\t692\nagatha\t692\naleflqds\t692\ntees\t692\nnurseris\t692\nactive\t692\nbarnet\t692\nzhongzheng\t692\ndalefnsh\t692\nfild rd\t692\nstadtischer\t692\nlibby\t692\njames rd\t692\nweser st\t692\neo5\t692\nhertog\t692\nr charles de gaulle\t692\nhari\t692\ncr 35\t692\njugendzentrum\t692\nd 909\t692\nolimpica\t692\ncotir\t692\nlean\t692\nstadtring\t692\nmasse\t692\nflandres\t692\nc 40\t692\nmoldova\t692\nr st exupery\t692\nmosley\t693\ngina\t693\ngascogne\t693\nmkhbz\t693\nvishniva vulitsia\t693\nsr 118\t693\ncapella\t693\nsanga\t693\ndistillery\t693\n1102\t693\nrjalefyy\t693\nanjos\t693\nburley\t693\njeolla ln\t693\nkitchener\t693\nsp248\t693\n1044\t693\nmccullough\t693\ne8\t693\nsparda bank\t693\nwzgorze\t693\nn 17th st\t693\nreiterhof\t693\nd 988\t693\nrenan\t693\nlackawanna\t693\nartima\t693\nrecinto\t694\ncouvert\t694\nguo daodabdamdab hao\t694\n2800\t694\ndellacqua\t694\npridpriiatii\t694\narchives\t694\nsouk\t694\nh1\t694\nartisanale\t694\nmetcalf\t694\ncarso\t694\ndonja\t694\nzilioni piriulok\t694\nvernet\t694\nkelten st\t694\nguo daodac hao\t694\nkuk\t694\nleopoldina\t694\nv genova\t694\nphillips rd\t694\nsofi\t694\nmill cr rd\t694\nsandown\t694\ncampbell cr\t694\nschutz\t694\ndepartamental\t694\nkampus\t694\nmostovaia ul\t694\ndruzstevni\t694\ngalefz\t694\nul mikhanizatorov\t694\nacero\t694\ntransmission\t694\nsichovikh\t694\nabbotts\t694\nr henri dunant\t694\nfrankfort\t694\npeggy\t694\ncardinal ln\t694\ngaillarde\t695\ndonner\t695\nclark av\t695\nwilliam hill\t695\nroan\t695\neglantirs\t695\n018\t695\noakland av\t695\nrostock\t695\nboileau\t695\nnel\t695\nibarska magistrala\t695\nbgdalefd\t695\nhistorico\t695\ndauvergne\t695\nshangri\t695\nnovosiolov\t695\nkirova ul\t695\nfisher rd\t695\nv ludovico ariosto\t695\ncarter st\t695\nleoni\t695\ndet\t695\nstina\t695\nnepomuk\t695\nschlossgarten\t695\ngraha\t695\nloomis\t696\nravenswood\t696\nco rd 7\t696\ndale st\t696\nheinemann\t696\nrecreo\t696\nmarshalls\t696\nleap\t696\nbangladesh\t696\nsporthal\t696\ns rafal\t696\npervenches\t696\nmolodyozhnaya\t696\npi pi xin\t696\nabdulla\t696\nbrkte\t696\nmanufacturing\t696\ne dr\t696\n230th st\t696\nrepairs\t696\nal armii krajowej\t696\nporvoon\t696\nwarbler\t696\nmasons\t696\nfranprix\t696\nweller\t696\ne 331\t697\ncolombe\t697\npeguy\t697\nalefljnwby\t697\nberthold\t697\nus 321\t697\nderby rd\t697\nrp2\t697\nbagel\t697\negger\t697\nzumbro\t697\npskovskoi\t697\nlinear\t697\nco operative group\t697\nyarra\t697\nceltic\t697\nmud lake\t697\nmamma\t697\nji ye chuan\t697\nnautilus\t697\nwzalefrte\t697\ngeneralitat\t697\nbodelschwingh\t697\ngoldenen\t697\nimport\t697\ncra 20\t697\n2240\t697\nlibig st\t697\nspigel\t698\nfriday\t698\nfairviw st\t698\ndaodac\t698\nrni\t698\ntempio\t698\nchurrascaria\t698\notto st\t698\na361\t698\nvogels\t698\nsakuru kei\t698\nfabriqu\t698\ngarran\t698\nquintero\t698\nsmtt\t698\nvasut u\t698\noran\t698\nlokalbahn\t698\nsavon rata\t698\nda chuan\t698\nmortimer\t698\nsender\t698\nastra\t698\nrby\t698\nloa\t698\nkaspii\t698\nn 09\t698\nmatta\t698\nvenosta\t698\nbruhl st\t698\nbilagroprombank\t698\nqrh\t699\nnobrega\t699\ncontournement\t699\nbroniwskigo\t699\nhuntley\t699\nhirschen\t699\ntwelvemile\t699\nnepean\t699\nborek\t699\nkappa\t699\nxviii\t699\npneus\t699\nfidel\t699\ncruise\t699\ndouglas dr\t699\nempresarial\t699\nruggero\t699\ncreeks\t699\nd 138\t699\nharas\t699\nbeckett\t699\nfreiburger\t699\nfreiberger\t699\nb 92\t699\nrawdat\t699\ncapistrano\t699\nmorskoi\t700\ngreendale\t700\noccidente\t700\nmaurits\t700\ncisneros\t700\ndmitriia\t700\nings\t700\nmone\t700\ngazprom nift\t700\ngamble\t700\negidio\t700\nconnell\t700\nzdorovi\t700\nuralsib\t700\nhaig\t700\n1 70 bus\t700\nperegrine\t700\nvarsity\t700\nbirkenallee\t700\nhazel st\t700\nkilometer\t700\nsentinel\t700\ntownhouse\t700\nb 252\t700\nelevator\t700\nchristuskirche\t700\nsequia\t701\nlangudocinne\t701\nelectronica\t701\nroden\t701\ngarennes\t701\nevi\t701\nmkr\t701\nnyc\t701\ndao11\t701\nsitu\t701\norquidea\t701\njenderal\t701\nshadows\t701\nautov do noro ste\t701\nw n st\t701\ngeza\t701\n11r\t701\nsennar\t701\nndeg1\t701\nrua sao francisco\t701\nhernando\t701\ncro\t701\ntoki\t701\nk 57\t701\ncoliseo\t701\ntokaido national rt 1\t701\nh st\t701\nneckar st\t701\ndera\t701\nmilagro\t701\nst marys cemetery\t701\nbruchweg\t701\nesglesia\t701\n240th st\t701\n979\t701\nanaheim\t701\nautostrada do atlantico\t701\nozark\t702\nhemlock dr\t702\nd 613\t702\nescalir\t702\ndubrova\t702\nzalesi\t702\nhendricks\t702\nmeza\t702\n05k\t702\nr de lhotel de ville\t702\ngroupe casino\t702\nmabel\t702\ns107\t702\nfontenay\t702\nkad\t702\nblackfoot\t702\ndamai\t702\ninternationale\t702\nv 24 maggio\t702\nklara\t702\ntravers\t702\nkaufmann\t702\nbraunschweiger\t702\nswiat\t702\nkhalturina\t702\nmaryse\t702\nsams club\t703\n031\t703\nhudud\t703\ngreenwood av\t703\ngnc\t703\naugustus\t703\nring ln\t703\nwoodhill\t703\npl linina\t703\nlionel\t703\nshenzhen\t703\ntirminal\t703\nlaurence\t703\nanexo\t703\nleather\t703\nbakkerij\t703\nivanivka\t703\nschlachthof\t703\nst 5\t703\nny 25\t703\ncobble\t703\ndazeglio\t703\nflorence av\t703\njimmy johns\t703\ngissener\t703\ndestro\t704\narenes\t704\ni ding mu\t704\nalmagro\t704\ntraditional\t704\nrt de paris\t704\npaulina\t704\ncth a\t704\nmusset\t704\ngruppo\t704\nterrazas\t704\nw 15th st\t704\nlaquitaine\t704\nn50\t704\nautov del nord est\t704\n727\t704\nv enrico berlingur\t704\nschuhe\t704\nespinoza\t704\nst 4\t704\nvercors\t704\necologica\t704\nseicomart\t704\navanti\t704\nschaffer\t704\nhu hang yong gao su\t704\nmalinowa\t704\n235th\t704\nlogan st\t704\nmangrove\t704\nmeilenstein\t704\ncastiglione\t705\nprofsoiuznaia ul\t705\nsunningdale\t705\netapa\t705\njunquira\t705\nlee av\t705\npimenta\t705\nsr53\t705\nflurweg\t705\n140th st\t705\n200th st\t705\nserca\t705\nchilexpress\t705\nrosegger\t705\nchickadee\t705\nanger st\t705\npodgorna\t705\nb 36\t705\nkolodits\t705\nteleski\t705\nbadr\t705\ngrazer st\t705\napple st\t705\nscheffel\t705\nrbs\t705\nmeunirs\t705\nd 213\t705\nc 45\t705\nv don giovanni minzoni\t705\nfourche\t705\nradhus\t705\nsudheide gifhorn gmbh\t706\ndaodabdamdab\t706\n739\t706\nbos st\t706\nbennett rd\t706\nsidova\t706\nn43\t706\naleflalefbyd\t706\ndivers\t706\nmedard\t706\nli gen chuan\t706\nze8\t706\nshou du q zhong yang lian luo zi dong ch dao\t706\ncigales\t706\npfalz\t706\nr des bouleaux\t706\nyoli\t706\nweglowa\t706\ng98\t706\ntreille\t706\ndarmstadter\t707\nstad\t707\nhans bockler st\t707\nkiu\t707\nmeats\t707\nsag\t707\nsorrel\t707\nthessaloniqu\t707\nambrosio\t707\nhippolyte\t707\namman\t707\nbibliotek\t707\nch de fontaine\t707\nb 58\t707\ns vicente\t707\nhelp\t707\nminute\t707\nturistico\t707\nmajid\t707\nb 11\t707\nstudentenwohnheim\t707\ngus\t707\n759\t707\nloblaw companis limited\t707\nhaci\t707\nbronte\t707\nsp 300\t707\nyayasiyaf\t707\n40d\t707\npartners\t707\njuliana ln\t707\n179th\t708\nkolb\t708\nsanatorium\t708\nd 922\t708\nianvaria\t708\nsouthland\t708\nsunburst\t708\nsycamore av\t708\nstran\t708\nlirr\t708\nelmwood av\t708\ncilmaninnardonan\t708\nprov\t708\ndeveloppement\t708\nkleinbahn\t708\nchemnitzer\t708\nedmunds\t708\npkn orlen\t708\nlingkar\t708\nyvonne\t708\ns105\t708\nferrata\t708\nacuducto\t708\nelf\t708\nnarutowicza\t708\njingno\t708\npaddocks\t708\nturquoise\t708\nlami\t708\nchalmers\t708\nohm\t708\nmeissner\t708\nparent\t708\nhir\t708\ncarter rd\t709\nnvp\t709\npuigcerda\t709\nrothen\t709\npitrovskii\t709\npnc bank\t709\n1 70 us 40\t709\nmex 15d\t709\ncooper rd\t709\ng 5\t709\nss64\t709\nbreche\t709\npikku\t709\nlaz parking\t709\np za della repubblica\t709\nmonumental\t709\nrotterdam\t709\n944\t709\nc 43\t709\nbookshop\t709\nus 68\t709\nmeijer\t709\nrosi\t709\npowstancow slaskich\t709\ncortland\t709\nv indipendenza\t709\nancha\t709\nauvergne\t709\nlevesqu\t709\nkliuchi\t709\nbonneville\t709\npl de fontaine\t709\npros\t709\nctra central\t709\nconejos\t709\nnanaimo\t710\nflagstaff\t710\naliksiivka\t710\nnationale bewegwijzeringsdinst\t710\ntula\t710\nbewegwijzeringsdinst\t710\nbm\t710\nstrate\t710\nindustrialnaia ul\t710\nkirkko t\t710\ndriver\t710\nchalon\t710\nsibirskaia\t710\npune\t710\nstanley rd\t710\nmuzeul\t710\nurology\t710\njati\t710\nmichta\t710\nus 58\t710\ndalby\t710\narmee\t710\nbotilleria\t710\narbres\t710\nmcknight\t710\nrostocker st\t710\ne42\t710\nhipolito yrigoyen\t710\nposeidonos\t710\nalefldktwr\t710\nmullins\t710\nlein\t710\nbheag\t710\nbotiv\t710\na w\t710\nnemzeti dohanybolt\t711\nmaladziozhnaia\t711\nhester\t711\nprospect rd\t711\nwoods rd\t711\ndro\t711\nolivera\t711\n994\t711\nfamily mart\t711\nviadukt\t711\njarnvags g\t711\nolsen\t711\nroswell\t711\nrosary\t711\nnaberezhnaya st\t711\nus bank\t711\nridweg\t711\npattaya\t711\nfir st\t711\nhoh\t711\ntestigos\t711\nlamont\t711\nvacas\t711\ntok\t711\nr du ruisseau\t711\ncerrado\t711\nlovell\t711\nbengkel\t711\nm10\t711\nsaida\t711\nlunch\t711\nconstance\t712\nach\t712\nbeef\t712\ntribune\t712\ntimberland\t712\nmatsuyama exp\t712\nshuo\t712\npomorska\t712\nburlington northern railroad\t712\nkromme\t712\nwaitrose\t712\ncarmichal\t712\nmarsh rd\t712\natahualpa\t712\ncrows\t712\nfairchild\t712\nmedia mkt\t712\neuropa st\t712\nbicentennial\t712\nvacant\t712\nnat\t712\ne 17th st\t712\nkirovskii\t712\nmella\t712\nus 221\t712\nfoster rd\t712\nholiday inn\t712\npravdy\t712\nserviceweg\t712\nsheung\t712\naoyama\t712\nausiyotupu\t713\nzosh\t713\nst dei parchi\t713\nthuy\t713\ncome\t713\nco rd 9\t713\nosnabruck\t713\n854\t713\n1017\t713\nukrainy\t713\nhostinec\t713\nr de tuileri\t713\ne11\t713\niochtarach\t713\nk 61\t713\nmadalena\t713\ncerritos\t713\ndores\t713\naino\t713\ns209\t713\ngermaine\t713\nulmer st\t713\nobala\t713\ne 26\t713\ncreston\t713\nkristiyan\t713\ntelep\t713\nwhipple\t713\nchinook\t713\nrn14\t713\nmatratzen\t713\nsportsman\t713\nkoivu\t713\norganic\t713\nhmalefm\t713\nsimply mkt\t713\n1 78\t713\nwydzial\t713\navangard\t713\nrade\t714\nc 41\t714\nmito\t714\nrodnikovaia\t714\nvero\t714\ng 1\t714\nwhitmore\t714\neo30\t714\ncope\t714\nss71\t714\nthun\t714\ngestion\t714\nrochette\t714\nb70\t714\nmonumento ai caduti\t714\n1030\t714\nstig\t714\nreiter\t714\neu\t714\nperrire\t714\naltamirano\t714\nnachalnaia\t714\nouachita\t714\nkampen\t714\nmiczyslawa\t714\nabdulaziz\t714\nhaven st\t714\npocztowy\t714\nmano\t714\nvokzalna\t714\ns church st\t714\natenas\t714\na82\t714\njugos\t714\naraguaia\t715\nbarns\t715\nangerweg\t715\nautostrada dei fiori\t715\nbrunet\t715\npushkinskaia ul\t715\ncostcutter\t715\nyanjiang exp\t715\ndina\t715\nbiz\t715\nnh7\t715\nkolos\t715\nbaywood\t715\nsteeg\t715\nbalefshalef\t715\nseton\t715\nschwaben\t715\nader\t715\nyan jiang gao su\t715\ntodor\t715\nrospichat\t715\ncharlotten\t715\ncr 29\t715\nsurya\t715\nc de iglesia\t715\ndevi\t715\nkubanskaia ul\t715\nvirgil\t715\npujol\t715\nvillette\t715\nhuang he\t715\npirce st\t715\ncow cr\t715\nk 54\t716\nredeemer\t716\ncondorcet\t716\nladbrokes\t716\nwm\t716\nshaker\t716\nfagundes\t716\nsouthend\t716\nmosquito cr\t716\njr yu zan xian\t716\nraionna\t716\nfranki\t716\n958\t716\nplainfild\t716\nrede\t716\nmedzi\t716\nwaal\t716\nmakan\t716\nselwyn\t716\nlegends\t716\ngimnazija\t716\nyamanote ln\t716\nallid\t716\nbagels\t716\nmasson\t716\nbakamni\t716\northopedics\t716\nvira\t716\nkristianskaia ul\t716\n1210\t717\nbasketball ct\t717\ncoco i fan wu\t717\nparcela\t717\nm 9\t717\ndenner\t717\nsilverdale\t717\ndobri\t717\nrumah warga\t717\ncoloma\t717\ngreenwood rd\t717\narrowhead dr\t717\nionian mwy\t717\ngulph\t717\n186th\t717\ngautir\t717\nschwan\t717\nmktbte\t717\nperformance\t717\nsteuben\t717\ncollins rd\t717\nsotsialnoi\t717\n831\t718\nsp60\t718\ndesire\t718\nshake\t718\nfours\t718\npassaur\t718\nhuron st\t718\ncraighead\t718\nmtwstte\t718\ncolorada\t718\npanda express\t718\nconnecticut tpk\t718\nhaan\t718\nhameen t\t718\nkonstantin\t718\ncr 31\t718\nfourth av\t718\ndreams\t718\nbolzano\t718\nsofla\t718\nb 256\t718\nparkova\t718\nbloomington\t718\nskwer\t718\nn oak st\t719\nrudolph\t719\nr de bretagne\t719\nkassa\t719\nkvarn\t719\nguide\t719\ndanton\t719\nrua oito\t719\nruti\t719\ncasse\t719\nbarton rd\t719\nsp58\t719\ngraham rd\t719\nhql\t719\nbreiter\t719\nd 559\t719\nflorentino\t719\nrn4\t719\nollegil\t719\nsuncheonwanju\t719\nrema 1000\t719\nmassiv\t719\nboyce\t720\nspruce ln\t720\nshchorsa vulitsia\t720\ngeiger\t720\nyamato\t720\nexperimental\t720\ncondos\t720\nstantsionnaia\t720\nsurau\t720\nsaving\t720\nlaos\t720\nbruch st\t720\nestudio\t720\nsilcher\t720\nc funte\t720\nrosita\t720\noakhill\t720\nkeizer\t720\nhongha luan huang yuki ze namha exp\t720\nmikolaja reja\t720\nmorra\t720\nrua sao sebastiao\t720\nmokykla\t720\nkaraoke\t721\nul gastillo\t721\nhenderson rd\t721\nsucker cr\t721\nwater ln\t721\ntaylor cr\t721\nul karla libknikhta\t721\nlear\t721\nups st\t721\nsatellite\t721\nkhwh\t721\nr dalsace\t721\nong\t721\npanteon\t721\nfeinkost\t721\nrdge av\t721\nfinal\t721\ngerhardt\t721\nbayer\t721\nrua ceara\t721\nlocks\t721\nsanin\t721\nr georges brassens\t721\nlancashire\t721\nsevernaya\t721\ngleneagles\t721\ngolu\t721\noffentliche\t721\n13 31\t721\ndutton\t721\nultimos\t721\nlb\t721\nwiggins\t722\nlisnoi piriulok\t722\ncra 17\t722\nleibniz\t722\nlisnichistvo\t722\nspyglass\t722\nluxury\t722\nsanliurfa\t722\nszpitalna\t722\nmagpi\t722\ndebbi\t722\ne 78\t722\nnuno\t722\n833\t722\nstandish\t722\nsit\t722\nhollister\t722\ns24\t722\nav e\t722\nsendai\t722\nstanislawa moniuszki\t722\ndefense\t722\nkitty\t723\ncarling\t723\ntrinite\t723\n180th st\t723\ntsvitochni\t723\nautostrada azzurra\t723\nbriarwood dr\t723\n878\t723\nrembrandt st\t723\nvicario\t723\nfurtado\t723\na see\t723\n6015\t723\nus 400\t723\noman\t723\nfisheris\t723\ns oak st\t723\nbeton\t723\n1 dorfe\t723\nhunter st\t723\nluck\t723\nkidd\t723\nins\t723\nmattress\t723\nchacra\t723\nwende\t723\n872\t723\ngateouse\t723\nalefswalefq\t723\nkapel st\t724\ncurda\t724\ncampoamor\t724\nweng\t724\nmuhsin\t724\nmedicale\t724\nr 1\t724\npompeu\t724\nchestnut dr\t724\npaqurettes\t724\ns83\t724\nsaga\t724\nkopf\t724\nbrushy cr\t724\nbrooklands\t724\neglantines\t724\ngunn\t724\nnaselje\t724\nlovers ln\t724\nwessex\t724\nhttp globus tut by\t724\nsaghir\t724\nal saints\t724\nning\t724\nn 23rd st\t724\nhanaur\t724\nchama\t724\namity\t724\nul lva tolstogo\t724\ntorgovaia\t724\nmanzanares\t724\nambinte\t724\nonofre\t724\ne 86\t725\nwedding\t725\nromeu\t725\ncarmona\t725\ncopacabana\t725\ncuarta\t725\nsilber\t725\nmedan\t725\ncerkiw\t725\ntrikuharria\t725\ne 74\t725\nbear cr rd\t725\nlacul\t725\nhalefrte\t725\npiz\t725\nalford\t725\nwoodpecker\t725\njalisco\t725\ne 411\t726\ndaang maharlika\t726\n3003\t726\nspoldzilcza\t726\nloblaw\t726\nmuhlenteich\t726\nwinnipeg\t726\nfabrichnaia\t726\ngalefbte\t726\ndes moines r\t726\nn71\t726\nmakro\t726\nconnor\t726\ngrasmere\t726\ntempleton\t726\n28th st\t726\ndoumer\t726\nlas palmas\t726\nbarbershop\t727\nsviatykh\t727\nhrbitov\t727\nkeur\t727\na kirch bg\t727\ndivina\t727\nvillafranca\t727\nkasseler st\t727\nsantagostino\t727\ntoto\t727\nbonner st\t727\nacker st\t727\noldenburger st\t727\noxfam\t727\nwarwick rd\t727\nsauvage\t727\n6100\t727\nabbots\t727\n961\t727\nlexington av\t727\nmuzykalnaia shkola\t727\n1 405\t727\nmaplewood dr\t727\nwatson rd\t727\nsplash\t727\ndurian\t727\nbyvej\t727\naleflshmalefly\t727\nus 219\t727\nvalley bd\t727\nolegario\t727\n38a\t727\ntaw\t727\nfruhling st\t727\nrp6\t727\nmoacir\t728\nsovitskii piriulok\t728\njanssen\t728\nn shore dr\t728\nspencer rd\t728\nss14\t728\nwilfrid\t728\nold us 66\t728\ngron st\t728\nhalden st\t728\numum\t728\naleflgrbyte\t728\nr de labbaye\t728\ncastellon\t728\n1040\t728\nsp430\t728\n210th st\t728\n10 28\t728\nv sta maria\t728\nraceway\t728\nlajeado\t728\nemmaus\t728\ncanadian tire\t728\ncra 18\t728\nleli\t728\n1939\t728\nlos alamos\t728\njudson\t728\nvermilion\t728\nconcrete\t728\nvr bank\t728\ncllja\t729\nnaturdenkmal\t729\nsiatista\t729\nbund\t729\ngalan\t729\ncelia\t729\nb11\t729\nharro\t729\nlongford\t729\nthicket\t729\nflandre\t729\nschlesir st\t729\nsportovni\t729\nperche\t729\nmelrose av\t729\nk 51\t729\nbullard\t729\npastelaria\t729\nhaveforeningen\t729\nuachtarach\t729\nmcgill\t729\nxiao tian ji dian t xiao tian yuan xian\t729\nchar\t729\nvoikova\t729\n130th st\t729\nfonds\t729\nchippewa national forest\t729\nus 136\t730\nul entuziastov\t730\nkinley\t730\nsaintes\t730\nteollisuus\t730\n787\t730\nbiriznia\t730\npoznan\t730\nplante\t730\nlubecker\t730\ncourbet\t730\nkonsum\t730\nmurphy rd\t730\nsambre\t730\nindustril\t730\nsuro\t730\npelletir\t730\nb 34\t730\njiuhag\t730\nsusi\t730\nqiong\t730\nsalaria\t730\nbiriozovka\t730\nwetland\t730\nmarches\t730\ndaodal\t730\njr bei lu xian\t730\ninternat\t730\nsp50\t730\nbears\t730\nleuschner\t730\ndelguur\t730\nchad\t730\ncondo\t730\ndalniaia\t730\nbittersweet\t730\nfara\t730\nmanantial\t730\ncerf\t730\npavia\t731\ncarrizal\t731\nsette\t731\ntriana\t731\ncanadas\t731\nv don luigi sturzo\t731\nabn amro\t731\navtostoianka\t731\nshiv\t731\nsylvester\t731\nrepresa\t731\nbrug st\t731\nbivacco\t731\nhalef\t731\n1nee\t731\nclam\t731\nsulz\t731\ncommercio\t731\nimperial hwy\t731\nparcul\t731\npescador\t731\nbotanic\t731\nsteep\t731\nl 551\t731\nbergmann\t731\nsumter\t731\nturners\t731\npipers\t731\nlahden t\t731\nflider\t731\noswego\t731\nruin\t731\nescutia\t731\nrosa luxem bg st\t731\nchurch av\t732\nbr 376\t732\nhavel\t732\nvitus\t732\nm58\t732\npicos\t732\nst pauls church\t732\ns45\t732\npiccola\t732\njame\t732\nbec\t732\ngrizzly cr\t732\nulya\t732\nwooden\t732\nmaurizio\t732\nul dikabristov\t732\nunisex\t732\npyeong qi rou jing luan huang yuki ze\t732\nwoodcock\t732\nqlbalefn\t732\n2011\t732\nkopernikus\t732\n2007\t732\n692\t732\nbruce st\t732\nkosong\t732\nrattlesnake cr\t732\nmirabeau\t733\n188th\t733\n1 40 bus\t733\ntennis pl\t733\nhurtos\t733\npoiana\t733\njct\t733\ncrowsnest hwy\t733\nmendel\t733\npase\t733\nfgup\t733\nfreshwater\t733\nlav\t733\nepping\t733\nroserai\t733\nchantilly\t733\npaisley\t733\nwohnheim\t733\nmagno\t733\n36k\t733\ngyogyszertar\t733\nhwy 3\t733\nrowley\t733\nivana franko ul\t733\ncadore\t733\nr de montagne\t733\ncook rd\t733\nqalefsm\t734\ntriumph\t734\nc 38\t734\nr de tour\t734\nwalnut dr\t734\nguardian\t734\nschulen\t734\nleg\t734\nmeta\t734\nav victor hugo\t734\nwordsworth\t734\ndonut\t734\nkyrkan\t734\nl3\t734\ncostituzione\t734\nhagener\t734\nspinnaker\t734\nzvizda\t734\nhuqingping\t734\nrua espirito santo\t734\nahmar\t734\nshallow\t734\noal\t734\ntucson\t734\nlaco\t734\npirvi\t734\nmfts\t734\n12 30\t734\nsainwd\t735\ninteriors\t735\nkilian\t735\natencion\t735\nkrzywa\t735\nscotia\t735\nsanto domingo\t735\nwestpark\t735\ndeco\t735\ngrassi\t735\nuz\t735\nsobre\t735\ngroote\t735\nfaculdade\t735\n978\t735\ngouveia\t735\n887\t735\nb 105\t735\nevang\t735\narquitecto\t735\nlazzaro\t735\nvalley st\t735\nboudewijn\t735\nd 152\t735\npesa\t735\nparalela\t735\nheladeria\t735\nhaya\t735\nep7\t735\ncadena\t735\nfulda\t735\nco rd 21\t735\nstupiniv\t735\naq\t735\nkomitit\t736\nnh19\t736\nwilhelms\t736\nkalkofen\t736\ntenmile cr\t736\nrua principal\t736\nditiacha\t736\nmercurio\t736\ntweede\t736\npickett\t736\nsp55\t736\nwirtshaus\t736\nmirnaia\t736\nshhdalef\t736\nmariano moreno\t736\nbern st\t736\ndonau st\t736\nbourassa\t736\nkhngng\t736\noffenbach\t736\nmoffat\t736\nplummer\t736\nd 153\t736\ndorp st\t736\nholler\t736\nmulini\t736\nassisi\t736\nhuff\t736\noconnor\t736\nfloridas\t736\nr12\t737\nlighting\t737\nmonro av\t737\nharts\t737\ncohen\t737\nrenmin\t737\njino\t737\ntirritoriia\t737\nraton\t737\nruch\t737\nhosp rd\t737\nbohdana\t737\nwhiteead\t737\neleutheriou\t737\ngandara\t737\nmatar\t737\nyamuna\t737\nfranziskus\t737\ncoates\t737\nr george sand\t737\notichistvinnoi\t737\nmission bd\t737\naleflsgyr\t737\nruta nacional 12\t737\nrhon\t737\nplaces\t737\nhazm\t737\nvillegas\t737\njar\t738\nfichte\t738\npavilhao\t738\nswift cr\t738\nze7\t738\nmatadero\t738\nschwanen\t738\nwisental\t738\nt8\t738\n746\t738\nyu zhan luan huang yuki ze jungang exp\t738\nedwards st\t738\ns dr\t738\nh01\t738\npraje\t738\nunite\t738\njoyeria\t738\nelse\t738\namis\t738\nbeyond\t738\n1012\t738\nco rd 13\t738\nhannoversche st\t738\nthir\t738\nbaoli exp\t739\nsaha\t739\nhid\t739\nfira\t739\nlilin st\t739\nhassel\t739\npaul st\t739\npep\t739\nsedan\t739\ncantons\t739\njunganggosokdoro\t739\nkrivoi\t739\ntoy\t739\nirigoyen\t739\nbao lin gao su\t739\ncipreses\t739\nstadtbibliothek\t739\nesk\t739\nfireouse\t739\njesucristo\t739\n1 90 bus\t739\npinhal\t739\nvitirinarnaia\t739\nsanderson\t739\nkapitana\t739\ninformatiqu\t739\ne elm st\t739\njazz\t739\nhoche\t740\nemu\t740\nmorska\t740\nbr 040\t740\nsalvation army\t740\nanna st\t740\nayrton\t740\n196th\t740\nminho\t740\nannunziata\t740\ncherbourg\t740\nwhale\t740\nmusik\t740\nsimco\t740\nfigura\t740\nshine\t740\nemporium\t740\nscintist\t740\ngoodrich\t740\nwallace st\t740\nloves\t740\nw 13th st\t740\nvineland\t740\nrotatoria\t740\ncasita\t740\nochistni\t740\nocean av\t740\nboyle\t740\nregenbogen\t740\nvaquria\t740\nakron\t740\nhuntingdon\t740\npinewood dr\t740\ntolosa\t741\nmani\t741\nrua 11\t741\nl 191\t741\npodstantsiia\t741\nharlan\t741\ncamelback\t741\nshiva\t741\nwoodside dr\t741\nautostrada do norte\t741\nblyth\t741\ntuck\t741\nskin\t741\npirikriostok\t741\napgyocharo\t741\nminden\t741\noto\t741\nroslyn\t741\nilicha\t741\nchristchurch\t741\nbasil\t741\nstationery\t741\nbaro\t741\ntikhnologii\t741\nonce\t741\nmoctezuma\t741\ngvardiiskaia\t741\nempalme\t741\nkhalifa\t741\nk 58\t741\nfo ut\t741\nv camillo benso conte di cavour\t741\nkind\t741\nkopec\t741\nlandratsamt\t741\nfarina\t741\ncyprus\t741\nfregusias\t741\nantartida\t741\ntyson\t742\nuab\t742\nngoc\t742\nregia\t742\n120th st\t742\ndimithardr\t742\nmanitou\t742\norg\t742\npotsdam\t742\nn iia\t742\nhu zhu gao su\t742\n1205\t742\nkure\t742\nupravlinnia\t742\nclarkson\t742\nvoi romaine\t742\nr8\t742\nkemper\t742\nnasr\t742\n1070\t742\ncaracol\t742\nwaterloo rd\t742\nmastir\t742\nsvenska\t742\npago\t742\nsuck\t742\nbefore\t742\ne 574\t742\nalte schule\t742\ngee\t743\nco rd 19\t743\nsarre\t743\n996\t743\n25b\t743\nbacchus\t743\ntaka\t743\nunter df st\t743\nmurdock\t743\n14 32\t743\ngaj\t743\n184th\t743\nhager\t743\nkarasu\t743\n413 01\t743\nb 37\t743\nyee\t743\nsp72\t743\nbkr\t743\nperpignan\t743\nav 2\t743\n1905\t743\nambulatorio\t743\nco rd 3\t743\ndeak ferenc u\t743\nzio\t743\nrobson\t743\nhumbug\t743\nbataille\t743\ndelegacia\t743\npeixe\t743\ntrir\t744\nmananrakanentarin\t744\nr105\t744\nlermitage\t744\npaganini\t744\ncastors\t744\nmtn vw rd\t744\nn fwy\t744\nmex 40\t744\ncwm\t744\nch de leglise\t744\nautostrada wolnosci\t744\nmaternity\t744\nslaski\t744\nsvitli\t744\nhawaii\t744\nnewbridge\t744\nwaldo\t744\njisr\t744\ntongsenv\t744\n3rd st n\t744\ntrt\t744\nus 72\t744\neo8\t744\nbeat\t744\nn pine st\t744\n3080\t744\nlippe\t745\nkhdr\t745\nneedham\t745\ntsrkva\t745\nwicklow\t745\nalum\t745\n1750\t745\n250th st\t745\nsixmile\t745\nsnc\t745\nr 297\t745\nteresita\t745\n24h\t745\nallard\t745\nrimont obuvi\t745\nkridit\t745\nv pimonte\t745\ndong hai dao guo dao1 hao\t745\nmastirskaia\t745\ne 21\t745\nnalefdy\t745\nriabinovaia\t745\naic\t745\nceller\t746\npile\t746\ndimitar\t746\nsorolla\t746\nlair\t746\nbalefr\t746\njake\t746\nlacroix\t746\nhuning exp\t746\nhofweg\t746\nlens\t746\nspencer st\t746\nmex 180\t746\n3805\t746\nsluis\t746\nkhlyfte\t746\npasco\t746\nfrisch\t746\nxin chuan\t746\ncapitello\t746\nmaverick\t746\nhalton\t746\nveterinario\t746\nconey\t746\ndouglas av\t746\nobservation\t746\nhohenzollern\t746\nalimentari\t747\npoteri\t747\nkozpont\t747\naachener st\t747\nbrama\t747\ngreentree\t747\nrl\t747\ngranados\t747\ncatolicos\t747\naldi nord\t747\nxang\t747\nuxbridge\t747\npulo\t747\nbeechwood dr\t747\nliga\t747\nlausanne\t747\nmilitare\t747\nrazhardizd\t747\ncustomer\t747\nmuno\t747\n178th\t748\nr pirre mari curi\t748\nr du bourg\t748\namand\t748\nbalmes\t748\ndevesa\t748\ntabla\t748\nrtd\t748\nv nino bixio\t748\nneustadter st\t748\nfaulkner\t748\nbambu\t748\nrn 1 tw\t748\nmaidstone\t748\nnanlu\t748\nmalefhamza\t748\nshevchenko\t748\nistok\t748\nliniinaia\t748\nazucena\t748\nmoor ln\t748\nfluvial\t748\nsr 60\t749\npoitou\t749\nsquires\t749\ndm drogeri mkt\t749\nb 229\t749\npumpe\t749\nadele\t749\netc\t749\nstewart rd\t749\nmarsa\t749\nwolverine\t749\nmarlow\t749\nfrukty\t749\nfairlawn\t749\nyongb\t749\nsonnenschein\t749\nyama\t749\nkohls\t749\nhemingway\t749\nmiriam\t749\npropertis\t749\ndunas\t750\nwiltshire\t750\nbrok st\t750\nmagnet\t750\nfhd\t750\nsaivriya\t750\nsp52\t750\nwilgen\t750\nrua flores\t750\nsuir\t750\nbrp\t750\nbroomfild\t750\nlujan\t750\nkniazia\t750\nrid st\t750\nbelmont av\t750\nromashka\t750\nconley\t750\nb 175\t750\nradford\t750\nskoroi\t750\ncarrir\t750\nfamiglia\t750\nmarlboro\t751\ntikhii\t751\nwinn\t751\nmatsuyama expwy\t751\ntanger\t751\nmlalef\t751\ncrabapple\t751\nstacy\t751\nduluth\t751\nwilla\t751\nbarid al maghrib\t751\nlombo\t751\ngogolia vulitsia\t752\nridgeviw dr\t752\nwiosenna\t752\ntevere\t752\nd6\t752\ner yan gao su\t752\n13th av\t752\nanta\t752\nhodge\t752\nmexicana\t752\nknowles\t752\nsp57\t752\nvasilivka\t752\no st\t752\nleonor\t752\ns214\t752\nseligman subdivision\t752\nmoreton\t752\nca 2\t752\nlangeweg\t752\nstanding\t752\ncempaka\t752\nleuvense\t752\nd 157\t752\nmalefyr\t752\n738\t752\ntrirer\t752\nnob\t752\nthousand\t752\nstarej\t752\ndavid st\t752\nchristy\t752\ngiang\t752\nhulva\t752\ngruta\t752\nhuntington dr\t752\nthurston\t752\ndiussh\t752\ncr 33\t752\nsawit\t753\nfrunzi vulitsia\t753\nrivoliutsionnaia ul\t753\ncorsica\t753\njosefina\t753\nfrias\t753\nmerah\t753\nfornaci\t753\nrotdornweg\t753\nholstein\t753\ndeborah\t753\ngbaint\t753\nhistorischer\t753\nmezarlik\t753\ncriqu\t753\nwaldhof\t753\ngaines\t753\narmory\t753\nlepanto\t753\nv grazia deledda\t753\nandersa\t753\ntarasa shivchinko ul\t753\narlington av\t753\npopeyes\t753\nco rd 12\t753\nv luigi einaudi\t754\nn 525\t754\nnewport rd\t754\nshwe\t754\nsh 7\t754\nsovitskoi\t754\n4th st n\t754\nr 2\t754\nblackbird\t754\nschreibwaren\t754\nmitteldeutsche schleife\t754\nvicent\t754\nbailey rd\t754\ndw\t754\ngoldfinch\t754\nellesmere\t754\ncra 2\t754\nclipper\t754\nmyra\t754\njeolla\t754\nr des fauvettes\t754\nbrenta\t754\nal wojska polskigo\t755\noberschule\t755\ncattaneo\t755\ntets\t755\nberesford\t755\ndoral\t755\nakita\t755\nbustamante\t755\njozefa pilsudskigo\t755\ncomida\t755\nkorona\t755\nkleber\t755\ncreekviw\t755\ngardenias\t755\ncandida\t755\nbyst\t755\ne 13th st\t755\ntas\t755\n3802\t755\niksanpohang exp\t755\nvaldes\t755\npolicial\t755\nseguridad\t755\nwil\t755\nairpark\t755\ncasona\t755\nfranklin rd\t755\njing gang ao gao su gong lu\t755\nbron\t755\nshingle\t755\nvaleria\t756\nlacey\t756\ns302\t756\ngana\t756\nosnabrucker\t756\ns18\t756\nsci\t756\nescalada\t756\nalbert rd\t756\nnetto marken discount\t756\ndogs\t756\n858\t756\nrimini\t756\nrichmond st\t756\n971\t756\ncannes\t756\nv della resistenza\t756\nsoho\t756\nd 1083\t756\nwoodburn\t756\nmeunir\t756\nagricolas\t757\nnorge\t757\nxiuang\t757\nindiana av\t757\nditskaia poliklinika\t757\npombal\t757\ngable\t757\naleflainly\t757\nclasse\t757\ntbc\t757\ncedar ct\t757\neger\t757\nlars\t757\nprogres\t757\nmilltown\t757\nmorris st\t757\nwilson cr\t757\nul 50 lit oktiabria\t757\nheerweg\t757\ndesoto\t758\nlaird\t758\nplainviw\t758\nriverside rd\t758\n598\t758\nfather\t758\ngreat n rd\t758\nr liffey\t758\nstezka\t758\nbayan\t758\nm37\t758\nhalefshm\t758\nbochum\t758\nthuong\t758\nparkvej\t758\nmoosbach\t758\nmilligan\t758\ncra 15\t758\nlunion\t758\nmatejki\t758\nrn8\t758\ndiva\t758\npostamt\t758\nshchil\t758\nultramar\t758\nul titova\t758\nrech\t758\npergola\t758\nfloriana\t758\nitea\t759\naudrey\t759\nszecheni u\t759\ntiburtina\t759\ndorfteich\t759\nstanislawa staszica\t759\ncr 26\t759\nbrahms st\t759\nschmuck\t759\nmercantil\t759\nmerisirs\t759\ns204\t759\nv s giovanni\t759\nshlmh\t759\n848\t759\nst marys\t759\nhighbury\t759\nante\t759\nadolfo lopez mateos\t759\n174th\t759\npeterborough\t759\nveiculos\t759\nschwabischer albverein\t759\nestevao\t759\nringwood\t759\nweiden st\t760\nakademika\t760\nbusstation\t760\nboucle\t760\njesionowa\t760\nparquadero\t760\ne 901\t760\ndangjin\t760\nwelland\t760\neer\t760\ng309\t760\npraha\t760\nninos heros\t760\nbrive\t760\nco rd 20\t760\nrua rio de janeiro\t760\nwaterworks\t760\ntout\t760\nquiros\t760\nmammoth\t760\nruska\t760\nnacos\t760\ne 15th st\t760\nalefmyr\t761\nevergreen ln\t761\nblume\t761\naccessoris\t761\nhaur\t761\nencinas\t761\njalefbr\t761\nnew hope church\t761\nv fratelli bandira\t761\ntirso\t761\nhardees\t761\nco rd 4\t761\nmshalefsh\t761\nsulpice\t761\nmagon\t761\n9710\t761\nlaundromat\t761\nchelmsford\t761\nchatel\t761\nglenwood dr\t761\ncomstock\t761\ns82\t761\nbode\t761\nsp56\t761\nhsin\t761\ncouturir\t761\narbutus\t761\nalta velocita\t761\ncolmar\t761\nr du canal\t762\nflorestal\t762\n895\t762\nkatharinen\t762\nmaua\t762\nbrugge\t762\nmiail\t762\nn fork kings r\t762\npons\t762\n3001\t762\na49\t762\nobst\t762\nford st\t762\nuralskaia ul\t762\n8b\t762\ncavaliri\t762\nburt\t762\nb 42\t762\nnusa\t762\ncerveceria\t762\ntiatralnaia\t762\nprigorodnaia\t762\nlongo\t762\nqurweg\t762\nb 388\t762\nherder st\t762\ncrocker\t762\n1002\t762\nqulban\t762\nkastanin\t762\nb 226\t762\nschans\t762\ndusseldorfer st\t763\nschmidgasse\t763\nromualda\t763\nsabah\t763\nuniversitas\t763\n1 30\t763\nburial\t763\ninstitucion\t763\nbartolo\t763\nvilikogo\t763\nedgeill\t763\nmhr\t763\nsucha\t763\ng36\t763\nmsp\t763\ndivoire\t763\nbuttonwood\t763\nzaliznichna\t763\nv solferino\t763\nplumbing\t763\nc 42\t763\nantenne\t763\njuvenal\t763\nparnell\t763\nbyta\t764\nshhrdalefry\t764\nditskogo\t764\ntrebol\t764\nventure\t764\nmak\t764\nricci\t764\nnorthern cretan hwy\t764\ncock\t764\nlombardi\t764\narbre\t764\nvijver\t764\nplataforma\t764\nilkogretim\t764\nspring rd\t764\nnr32\t764\npero\t764\nhwy 6\t764\nhintergasse\t764\navignon\t764\ngentil\t764\niguacu\t764\ngrp\t764\nammerseeautobahn\t764\ns 12th st\t764\nklin\t764\nb 224\t764\nkomeda\t764\nmiaso\t765\nsti\t765\nlubelska\t765\nhaleffz\t765\n15th av\t765\ngaliriia\t765\nmagazine\t765\ncirculo\t765\nmain weser bahn\t765\ncra 16\t765\nzsigmond\t765\ncollege dr\t765\npera\t765\nmyr\t765\nv gabrile dannunzio\t765\njans\t765\nc s juan\t765\nbuzon\t765\nbarbara st\t765\neng\t765\nlahan\t765\nspiaggia\t765\ndav\t765\nbelles\t765\nrua 9\t765\nfelso\t765\nbaumann\t765\n2244\t766\n08k\t766\nlk rd\t766\nhavlickova\t766\nsp53\t766\ntinggi\t766\nblessed\t766\niman\t766\neldon\t766\npresidio\t766\ntanks\t766\nemploi\t766\ndarre\t766\nkat\t766\nul tilmana\t766\nconcejo\t766\ngolfclub\t766\nfirmino\t766\nfermin\t766\nco rd 5\t766\nargentinas\t766\nwhiting\t766\ngroves\t766\ngaia\t767\nrenee\t767\nbaoli\t767\nunion rd\t767\nromulo\t767\nblugrass\t767\nnjtp\t767\nrip\t767\ntriftweg\t767\nbenavides\t767\nguadalupe victoria\t767\nglen rd\t767\nibarska\t767\nformosa fwy\t767\ng2211\t767\navoca\t767\nchateauneuf\t767\ntraugutta\t767\nay\t767\ntimbers\t767\nklee\t767\nrays\t767\ndlouha\t768\nindustrias\t768\nchilds\t768\nsettle\t768\ncranbrook\t768\npandan\t768\nchampions\t768\ndouar\t768\nguanabara\t768\nnew england hwy\t768\nmlt\t768\nmerel\t768\ntejada\t768\nr16\t768\nchaplin\t768\nbrusselse\t768\nroper\t768\nluong\t768\nmdynte\t768\nantwerpse\t768\nmane\t768\ntrang\t768\nadidas\t768\neller\t768\ncimitir\t768\npitstsa\t768\ndew\t769\ntbte\t769\ndatong\t769\nco rd 11\t769\ntocantins\t769\ninpost\t769\neroski\t769\nkhdyr\t769\ngreenwood dr\t769\nkalinina vulitsia\t769\noldfild\t769\nnisa\t769\nd 134\t769\na 26\t769\nnii\t769\nsoo\t769\nlandhotel\t769\nl 50\t769\npolitia\t769\nhaikou\t769\nalice st\t769\nitshak\t769\nxiang2\t769\n788\t769\niksanpohang\t769\nvillalba\t770\ntrip\t770\nmartens\t770\nmathis\t770\naubrais\t770\nsino\t770\ngeni\t770\narb\t770\nsiben\t770\n177th\t770\n37a\t770\nbahnhofs pl\t770\nlotte\t770\nspring ln\t770\nm 32\t770\nd 95\t770\nodell\t770\nmondo\t770\nmyru\t770\nturun t\t770\nbowden\t770\nfarrell\t770\nrobin rd\t770\nclips\t770\nclaret\t770\nberges\t770\nporin\t770\nmarsh ln\t770\nbaume\t770\ntrinita\t770\nteren\t770\nabdelkader\t770\nleopolda\t770\navtoshkola\t770\nduff\t771\nbaurnhof\t771\ncastanos\t771\nrp1\t771\nd 941\t771\nb 500\t771\npintail\t771\ngarin\t771\n3rd av n\t771\nicici\t771\nharald\t771\nskolska\t771\nchichester\t771\ndela\t771\nmainlm\t771\nv 1 maggio\t771\nkill\t771\nsirova\t771\nmeadow cr\t771\nthird st\t771\nbenzina\t771\ndohanybolt\t771\nbeech av\t771\ndara\t772\ngesu\t772\nosborn\t772\ntechnologiqu\t772\n954\t772\n669\t772\neo9\t772\ngr lyon\t772\nzarza\t772\ngal\t772\naleflhmralefhamza\t772\nk 52\t772\nrivage\t772\nhotell\t772\nborovaia\t772\natilio\t772\nvojvode\t772\nm53\t772\nmonastero\t772\nzdrowia\t772\nrosbank\t772\nadelino\t772\nvishniva\t772\ndomingus\t773\nmoulton\t773\nkommuny\t773\ntapia\t773\nhuning\t773\ngrace st\t773\nalger\t773\ngazebo\t773\nainthmalefn\t773\npotts\t773\nbch st\t773\nalva\t773\nus 377\t773\ngebr\t773\ndagu\t773\ndetention\t773\nswitych\t773\nviachislava\t773\nkwun\t773\ne 461\t773\nr du marechal foch\t773\nlantana\t773\na48\t773\n1 26\t773\nlhermitage\t773\nslabada\t773\nmorgan rd\t773\nukrainska\t774\nbeino\t774\npikes\t774\nb 239\t774\nmaaaraviramaga\t774\nrochers\t774\n926\t774\nsacco\t774\npoultry\t774\nmason st\t774\ninfanta\t774\nentertainment\t774\ngresham\t774\nvorota\t774\nhobson\t774\nkyrk\t774\nsempione\t774\nnazaire\t774\nrompetrol\t774\nwildhorse\t774\ngari\t774\ngraham st\t774\npompe\t774\nhornos\t775\n2089\t775\ndanille\t775\nhaga\t775\nkarl libknecht st\t775\nlakeviw rd\t775\npacific mwy\t775\n699\t775\ntimes 24th\t775\nbrosse\t775\nnew jersey tpk\t775\nbomba\t775\nlaprida\t775\ntsyvn\t775\nhdyqte\t775\nsaldanha\t775\nkirpichnaia\t775\ndul\t775\nripoll\t775\nsat\t775\nnatsionalnii\t775\nbasler\t775\nat t\t775\nst marys rd\t775\npwr\t775\nags\t776\npik\t776\npurok\t776\nlanir\t776\nherrmann\t776\nfrenchman\t776\nbankomat bz wbk\t776\n819\t776\nprokhodnaia\t776\nswansea\t776\norintale\t776\nmstwsf\t776\n1 8\t776\nautomotriz\t776\nsecondaria\t776\nyongah\t776\nbaumschule\t776\nrua santos dumont\t776\nuchibni\t776\nmnswr\t776\ncr st\t776\nadler st\t776\ne 552\t776\ngosudarstvinnaia\t776\nrosewood dr\t776\nganesh\t776\n1022\t776\npqu infantil\t776\nbagh\t776\nzenith\t777\nlandau\t777\nsananbananvinshinvinon\t777\nmouhoun\t777\nontario st\t777\nlannec\t777\nmillard\t777\nbenitez\t777\ncorno\t777\ncalico\t777\nparfumeri\t777\n96a\t777\nbolnichnaia ul\t777\nrua 12\t777\nv s giuseppe\t777\nb 312\t777\nmoosweg\t777\nhnshyalef\t777\ntorri\t777\nmyrtle av\t777\npackstation\t778\nul rozy liuksim bg\t778\ntractor\t778\nwarte\t778\npoplar dr\t778\na fridhof\t778\nboquron\t778\nioanna\t778\nek\t778\nv s pitro\t778\ntorrejon\t778\nprirody\t778\nbcp\t778\nsonia\t778\nlazio\t778\ntuttle\t778\nn25\t778\nn70\t778\nthuaidh\t778\nguayaquil\t778\nlanggasse\t778\nwilsons\t778\nmitteldeutsche\t779\ntoilette\t779\nqinglan\t779\nlybyalef\t779\nrestaurang\t779\nokruzni\t779\nminnesota eastern railroad\t779\ncaravaggio\t779\n14k\t779\nmiller av\t779\nkrumme\t779\njr guan xi xian\t779\n845\t779\ntovary\t779\nbarragem\t779\nippolito\t779\noko\t779\nsotsialistichiskaia ul\t779\nsr 9\t779\nshuttle\t779\nkennedy st\t779\nfontanelle\t779\nbd de leurope\t779\nmatt\t779\nfrutas\t779\nhermanas\t779\nk 56\t779\ncarp\t779\npanfilova\t779\nellington\t780\nhaywood\t780\niskra\t780\nkrzyz\t780\npices\t780\nfu shi chuan\t780\ndakota minnesota eastern railroad\t780\nespinosa\t780\nfitzroy\t780\nlatina\t780\nsvobodi\t780\nsokolska\t780\nkraividchiskii\t780\nripple\t780\nbut\t780\nwilkes\t780\nemas\t780\nlenz\t780\nbering\t780\n26th st\t780\nhelipad\t780\ntoscanini\t780\nteran\t780\nperales\t780\nnizalizhnosti vulitsia\t780\nwart\t781\nmwy a5\t781\nludwigs\t781\nservizio\t781\nbocchetta\t781\ndemesne\t781\nmariner\t781\nhawley\t781\nk 55\t781\nscalo\t781\nstorey\t781\nfisch\t781\ndottor\t781\nstrass\t781\nmolkerei\t781\nerh\t781\ndescanso\t781\nalsina\t781\nvarzea\t781\nclaudel\t781\nfishers\t781\n2050\t781\nmilner\t781\nsimia\t781\nevent\t781\nautokinetodromos a5\t782\nd 939\t782\nbalcon\t782\ngrotto\t782\nsunderland\t782\nrua goias\t782\nmthry\t782\nmaribor\t782\ndargent\t782\nfallen\t782\nradishchiva\t782\ntipton\t782\nlacy\t782\nshshm\t782\nvsta dr\t782\nsei\t782\nc 44\t782\ndanisches bettenlager\t782\npioneiro\t782\nkenya\t782\ncr 34\t782\nwasserfall\t782\nevans st\t782\ntagliamento\t782\nbagni\t782\nkee\t782\nalians\t782\nsirius\t782\nphou\t782\nlebenshilfe\t782\npolis\t783\ncb\t783\nwoodman\t783\nnjd\t783\nsaar st\t783\ntanosveny\t783\nasi\t783\nbrun\t783\nlyle\t783\nmidtown\t783\nmennonite\t783\na51\t783\nco rd 6\t783\nsportplatzweg\t783\ns pablo\t783\nbitter\t783\nschnellfahrstrecke hannover wurz bg\t783\ngoodyear\t783\nlakeviw av\t783\nsaturnino\t783\nzamok\t783\ns304\t783\nmetirs\t783\nfairways\t783\namiral\t783\nrockford\t784\nlangdon\t784\ncra 14\t784\nmarshal\t784\nflora st\t784\nzoom\t784\ndomino\t784\nseligman\t784\nxvi\t784\nkhu\t784\ncavee\t784\njiraskova\t784\nshan shou xian\t784\nsudirman\t784\npirson\t784\nthroat\t784\nhoven\t784\ndevelopmental\t784\nbirch dr\t784\n50a\t784\ndrh\t784\nfalken st\t784\nshosse\t785\nr jean jacqus rousseau\t785\nmau\t785\nr roger salengro\t785\nnuraghe\t785\nwerder\t785\njewellers\t785\nindustrialnaia\t785\nep5\t785\nburrows\t785\ncrestwood dr\t785\ngregoire\t785\n26a\t785\ncitadelle\t785\npsp\t785\nslalefh\t785\nplans\t785\nv napoli\t785\ns307\t785\nlech\t785\nav de andalucia\t785\nrt napoleon\t785\nblauwe\t785\nal des tilleuls\t785\ngifford\t786\nerskine\t786\nfinken st\t786\ntanzania\t786\norchard av\t786\nwalde\t786\nboulangeri patisseri\t786\nsp54\t786\n181st\t786\ncantu\t786\normond\t786\nr du commerce\t786\nvelocita\t786\ndeutsches rotes kreuz\t786\nvasa\t786\nnorwich rd\t786\nskaly\t786\nhighwood\t786\nkniznica\t786\nacqudotto\t786\n1 37\t786\npriorbank\t786\npoort\t786\nfahr\t786\nzavoda\t786\nmarathonos\t786\nturi\t786\nfuneraria\t786\nboll\t786\npeach st\t787\nr des marronnirs\t787\nwand\t787\nbit\t787\novoshchi\t787\nsyracuse\t787\nberghof\t787\nshri\t787\nbraille\t787\ndixi hwy\t787\npigeonnir\t787\nv dante\t787\ngrundwassermesstelle\t787\nmarte\t787\nivy ln\t787\npaine\t787\nsaffron\t787\nb 248\t787\nus 151\t787\ncurlew\t787\nnikoli\t787\nspeedy\t787\nprofsoiuznaia\t787\n1125\t788\nhundred\t788\nlong st\t788\nmacelleria\t788\nnickel\t788\ncarlyle\t788\ne n st\t788\nc s jose\t788\nstreetcar\t788\npolder\t788\nnordea\t788\nliguria\t788\nfoss\t788\nv garibaldi\t788\ngagnon\t788\nbranly\t788\nav de madrid\t788\ndiable\t788\ndanforth\t788\nanel\t788\nmillet\t788\nmeucci\t788\ndite\t788\ndobroliubova\t788\nweavers\t788\nmarko\t788\nstone rd\t788\n1 93\t788\nparkhominko\t788\n3d\t788\nattiki odos\t789\naleflshrqyte\t789\nrivoliutsionnaia\t789\nco rd 18\t789\nstaro\t789\nfruhling\t789\nfuji\t789\nsab\t789\nsetia\t789\nsutter\t789\nsander\t789\ncayuga\t789\nbelleviw\t789\nlawns\t789\nerf\t789\nhetres\t789\ngao su t lu\t789\n1120\t789\nignacio zaragoza\t789\nbrico\t789\nsakuru\t789\nwlswalefly\t790\nlamia\t790\n1st st n\t790\ncampus dr\t790\ngianni\t790\ng213\t790\nfamille\t790\nclydesdale\t790\nkastely\t790\na 21\t790\nislet\t790\nridley\t790\npecan st\t790\nrink\t790\n2016\t790\nrivoli\t790\ngs25\t790\n1020\t790\nhemlock st\t790\nn bway\t790\ngroneweg\t790\nlarc\t791\ngatos\t791\nt5\t791\ngillespi\t791\nloccitane\t791\nredstone\t791\ntohoku exp\t791\nnamhagosokdoro\t791\ntaleflqalefny\t791\ndeutscher\t791\nmazari\t791\nkalinina st\t791\n769\t791\nillia\t791\nclaudius\t791\nvlaanderen\t791\n2o\t791\ncambria\t791\naubach\t791\ntvl\t791\nmcclure\t791\nw elm st\t791\n2013\t791\ncastano\t791\nzeiss\t791\nosman\t791\nalefhl\t791\nschlossgasse\t791\nsta isabel\t791\ncanales\t791\nniuweweg\t791\nbayviw av\t791\naufm\t792\ngazi\t792\nmastri\t792\nmaghrib\t792\nrustaveli\t792\ntitus\t792\nmaison neuve\t792\nshevchenka st\t792\ncampamento\t792\nkhalid\t792\nr carnot\t792\nredwood dr\t792\ncollins st\t792\npayless\t792\nnovosiolki\t792\npocztowa\t792\nklarwerk\t792\nschonen\t792\nfresnos\t792\nd 139\t792\nc 36\t792\npersonal\t792\nancona\t792\nc 55\t793\nsr 42\t793\nsart\t793\njana kochanowskigo\t793\nlinh\t793\nikan\t793\n2010\t793\ncurri\t793\nsingleton\t793\nfrere\t793\ngera\t793\ntere\t793\natelirs\t793\nrubin\t793\njana 3 sobiskigo\t793\n016\t793\nslate cr\t793\ncompostela\t793\nracing\t793\ndiakoni\t794\nolimpia\t794\nfruits\t794\nst 3\t794\ngres\t794\nmarshall rd\t794\nschanze\t794\neiken ln\t794\nthayer\t794\npeabody\t794\nohio st\t794\npalmira\t794\nqullenweg\t794\nsaiid\t794\nlanxin ln\t794\ncretes\t794\ntd canada trust\t794\nazalefdy\t794\nfrain\t794\ngottlib\t794\ng2 jinghu exp\t794\nwintergreen\t794\nmad r\t794\nlancelot\t794\ndunkerqu\t794\nroseill\t794\nmzalefrain\t794\nslip\t795\nupas\t795\nbresse\t795\noase\t795\nfrente\t795\nguilford\t795\n1093\t795\nqian chuan\t795\nfoy\t795\nlos llanos\t795\nlkw\t795\nkrasnaya st\t795\noverbrook\t795\nghadir\t795\nautov del e ste\t795\nalgarrobo\t795\ngent\t795\nplantage\t795\nserafim\t795\ngrayson\t795\nmolo\t795\npauli\t795\nluise\t795\nkrause\t795\n668\t795\nkruis st\t795\nshang xin yu zi dong ch dao\t796\nl 52\t796\nbota\t796\nguia\t796\nsyndicat\t796\nzigelhutte\t796\nfrozen\t796\ntheas\t796\nb 64\t796\nca 39\t796\nschelde\t796\nkaplica cmentarna\t796\nortsverband\t796\ndorrego\t796\ncalifornia av\t797\nlayton\t797\nbema\t797\ntops\t797\ngoldener\t797\nsta rita\t797\nsoborna\t797\nbrazos\t797\nfraternite\t797\nkatowicka\t797\n2nd st n\t797\nsavoia\t797\n190th st\t797\nfolsom\t797\ncorpus\t797\nbrazil\t797\nstrathmore\t797\nleeuwerik\t797\neingang\t797\nvara\t797\nedf\t797\nlick cr\t798\nsama\t798\ndunlop\t798\nwilmot\t798\nkelly rd\t798\ndorsey\t798\nsnowy\t798\nrn 6\t798\namadeus\t798\nd 135\t798\npinetree\t798\ntempo\t798\nattiki\t798\nkomplek\t798\noneil\t798\nsaal\t798\nchill\t798\ntejera\t798\nprogram\t798\ndill\t798\narrondissement\t798\ncolibri\t798\nkimberley\t798\nused\t798\nlebuh\t798\nqumado\t798\nschisstand\t799\niriguchi\t799\ngeer\t799\ncaixa economica federal\t799\nciclo\t799\nmazraat\t799\nbelmonte\t799\nshota\t799\nsawgrass\t799\ntimberlake\t799\ncrispi\t799\nvarese\t799\nc5\t799\nmacs\t799\ncor\t799\ncrucero\t799\nmaranon\t799\nvb\t799\ngrenir\t799\nribara\t799\nlisi ukrainki ul\t799\nsanai\t799\n9b\t799\nubs\t799\nsdt\t799\nraiffaizin\t799\nvez\t800\nunifid\t800\nchblohvo\t800\nn 260\t800\n1 79\t800\n1 st\t800\nvolt\t800\nchaumes\t800\nverda\t800\na55\t800\nforth\t800\nspedition\t800\nduis\t800\nboccaccio\t800\nster\t800\nwaldhaus\t800\nvorwerk\t800\novrag\t800\nprosper\t800\nco rd 16\t800\nav jean moulin\t800\nzlota\t800\npansionat\t800\npuc\t801\nolaya\t801\nschlesir\t801\nfrancoise\t801\nparallel\t801\nbrickyard\t801\n818\t801\nparkdale\t801\ngonglu\t801\nabasolo\t801\nfris\t801\ngallina\t801\nharapan\t801\nlinda ln\t801\nmanchester rd\t801\npurgos\t801\ns22\t801\nhampstead\t801\nsubdistrict\t802\nbiber\t802\nruss\t802\nrover\t802\nsr 4\t802\nlinina prospikt\t802\ncretan\t802\njysk\t802\nnab\t802\nvasiliia\t802\nmontgomery st\t802\nyainr\t802\nzee\t802\nosa\t802\nainzyz\t802\n596\t802\nfelsen\t802\nserdan\t802\nblacks\t802\nfounders\t802\nk 45\t802\nparchi\t802\nmt1\t802\npescara\t802\nnis\t803\nccc\t803\nprayer\t803\nlisova vulitsia\t803\naleflbhr\t803\nburning\t803\nafflunte\t803\nelia\t803\nespejo\t803\nshkola 3\t803\nhighland st\t803\n170th st\t803\nm 18\t803\nauriol\t803\nkasa\t803\nul furmanova\t803\nvogt\t803\nb 47\t803\nkathy\t803\n29a\t803\nco rd 17\t803\ncurvo\t803\n688\t803\nholly dr\t803\nb5\t803\nkordon\t804\npanificadora\t804\nzigelei st\t804\ninfotafel\t804\n2005\t804\nwaco\t804\nhokkaido exp\t804\ndelmar\t804\nplatinum\t804\nlavandires\t804\nstato\t804\nze5\t804\nelectro\t804\nukrainskaia\t804\nimmeuble\t804\nalemania\t804\nrostilikom\t804\nyadkin\t804\ninvestment\t804\ncisa\t804\naparicio\t804\nkwong\t804\nnadaii\t804\nora\t804\nb 236\t804\ntristan\t804\noberfeld\t804\njalan desa\t804\nhermann lons st\t804\ncooper st\t804\nvendeghaz\t804\ndublior\t804\nlarche\t804\nborg\t804\nstrandweg\t805\nadda\t805\njam\t805\nbeard\t805\ntaimuzu\t805\nzviozdnaia ul\t805\nochsen\t805\nslaska\t805\nstoneridge\t805\nsoniachna\t805\ngruppe\t805\nreliance\t805\nrussel\t805\nweil\t805\nwaffle\t805\nromagna\t805\nstanhope\t806\neglise st jean bapti ste\t806\n1st av n\t806\nyonge st\t806\nverbena\t806\nkirchsteig\t806\nainrq\t806\nabo\t806\nparkside dr\t806\nheather ln\t806\na 96\t806\niglesia ni cristo\t806\ngrenz st\t806\nsacro\t806\nspruce dr\t807\nptda\t807\ningeniria\t807\nxxiv\t807\nss2\t807\nhavelock\t807\nbendigo\t807\ncarwash\t807\nm56\t807\nregi des transports marseillais\t807\nthrush\t807\nco rd 15\t807\nkearney\t807\nolympian\t807\notlk\t807\nhofe\t807\nsurabaya\t807\naztec\t807\nnh66\t808\n794\t808\npalmeira\t808\nokruzhnaia\t808\nsatama\t808\nvivinda\t808\njane st\t808\nboak\t808\nbazarnaia\t808\npedrera\t808\nvertrib\t808\nnaziyat\t808\nheartland\t808\ncuore\t808\nr6\t808\nedison st\t808\npalmera\t808\neddi\t808\ndiamant\t808\nrotonde\t808\nsatu\t808\ngordon rd\t808\norange av\t808\nblucher\t808\nmex 2\t808\nsirinivaia ul\t808\nwinter st\t809\nvitiranov\t809\nslym\t809\nmokra\t809\nhor\t809\ncul\t809\nmerchant\t809\nvisiolaia\t809\npredio\t809\nvival\t809\n4wd\t809\nmt pleasant\t809\nalagoas\t809\nboreole\t809\nheuvel\t809\n150th st\t809\nshiwi\t809\ns85\t809\nryder\t809\nv del lavoro\t809\nd 911\t809\nosidlowa\t810\njagillonska\t810\nstalingrad\t810\nleophoros\t810\nheitor\t810\nlindo\t810\npleasant valley rd\t810\nreiger\t810\nmarcina\t810\nvizd\t810\nmahattat\t810\nnalefzyte\t810\naspen dr\t810\nwright st\t810\nbrede\t810\nhusca\t810\ntires\t810\nlakotelep\t810\ncolumbia av\t810\nsculpture\t810\nn 240\t810\nwolka\t810\npenedo\t811\nhiroshima\t811\nrusso\t811\npokrovka\t811\neminescu\t811\nmutiara\t811\nparoisse\t811\nticino\t811\ncustoms\t811\nernstings family\t811\nalvorada\t811\nunirii\t811\nfriar\t811\nmelody ln\t811\nuda\t811\nbrice\t811\ns state st\t811\n182nd\t811\nr des bruyeres\t811\nshelly\t811\napart\t811\ngornja\t812\nbirkenhof\t812\nplacido\t812\na 57\t812\np5\t812\npolni\t812\nbettenlager\t812\npolonia\t812\nenchanted\t812\n852\t812\nbelisario\t812\nv goffredo mameli\t812\nd 143\t812\nmt pleasant rd\t812\nportola\t812\nhope st\t812\nporos\t812\ncapel\t812\n2260\t812\nporters\t813\nsixt\t813\ntulipanes\t813\nb 300\t813\ndenison\t813\n2607901\t813\nbqaleflte\t813\ndamas\t813\ntelefonica o2\t813\n1ra\t813\nn 31\t813\nhurley\t813\nbosweg\t813\nrossilkhozbank\t813\nreedy cr\t813\n748\t813\nkalamata\t813\ntorunska\t813\nzakladna\t813\nheid\t814\nsosa\t814\nbars\t814\ncanterbury rd\t814\nmetano\t814\nbattlefild\t814\npeu\t814\neichholz\t814\nneuss\t814\nstadtmaur\t814\nmicro\t814\nbarney\t814\n947\t814\nbramar\t815\nsp33\t815\ndy\t815\nhanging\t815\nmaiskaia ul\t815\n2012\t815\nnome\t815\nmainz\t815\nperdana\t815\ncharleroi\t815\njazmines\t815\nsaad\t815\nbmx\t815\nranch rd\t815\nkiivskii\t815\nliningradskoi\t815\ntract\t815\ngiovi\t815\nmtalefr\t815\nvenecia\t815\ntaj\t815\nbell rd\t815\nvaleri\t815\nalcazar\t815\nr des sources\t815\nwilkopolskich\t816\ngalindo\t816\nsike\t816\nlifestyle\t816\nblackthorn\t816\npalm av\t816\npomocy\t816\nzhovtnia\t816\npozharnaia chast\t816\nv bruno buozzi\t816\nmorada\t816\nkereszt\t816\nr du village\t816\ntrabajo\t816\nwarrington\t816\ndippe\t816\nbrenda\t816\nplacid\t816\nsta barbara\t816\nlupo\t816\nirq\t816\ncuto\t816\nbildstock\t816\nquang\t816\npatos\t816\ngyula\t816\npoor\t817\nspence\t817\nsh 29\t817\nherculano\t817\nreggio\t817\nbeauvoir\t817\nprincess st\t817\nk2\t817\nabaixo\t817\nnanjiang ln\t817\nksicia\t817\nmountainviw\t817\nwiland\t817\n99w\t817\nlamaasatvisarga\t817\ncambio\t817\nstag\t817\novidio\t817\ne 07\t817\nhimmelfahrt\t817\nhalsey\t817\nkatholischer\t818\nus 309\t818\nring v\t818\nfp\t818\nreunion\t818\nvidin\t818\nfloor\t818\nryans\t818\nbrunel\t818\ncardinal dr\t818\nrotten\t818\n956\t818\nraunsantananvinenlasinsan\t818\npervomayskaya st\t818\ncerda\t818\nconstrucao\t818\njr han guan xian\t818\n729\t819\npaya\t819\nl190\t819\nt6\t819\nsaikyo\t819\nb 80\t819\n1 87\t819\nemslandautobahn\t819\nstresemann\t819\nmontaigne\t819\nboleslawa prusa\t819\ngauguin\t819\nv amerigo vespucci\t819\nw dr\t819\nmain av\t819\naura\t819\ndip\t819\nl 30\t819\nhdfc\t819\nrogers rd\t819\nelderberry\t819\ncr 28\t819\niug\t819\narcangelo\t819\nzwischen\t819\nbharat\t819\nstausee\t819\nostfrisenspiss\t819\nbeatriz\t820\nxiang1\t820\naleflsflalef\t820\nleme\t820\nvictorian\t820\nzyd\t820\nbuyuk\t820\nelmore\t820\ntat\t820\njmainyte\t820\nrochus\t820\nlavalleja\t820\nparrish\t820\nalvin\t820\n679\t820\npanera bread\t820\netr\t820\nearls\t820\nhristo\t820\ncomunita\t820\nr des primeveres\t821\ntreviso\t821\nv pitro mascagni\t821\ncamel\t821\nvoskhod\t821\nfusion\t821\nhorace\t821\ngb\t821\nusj\t821\nglan\t821\nroberta\t821\nesdoorn\t821\nhei chuan\t821\nlichten\t821\nalcaldia\t821\nwhisper\t821\nseventh day adventist church\t821\numgeungs\t821\nsidler\t821\nzhyr\t821\nencanto\t821\nted\t821\ntokyu\t822\nleonidas\t822\nserna\t822\natlantis\t822\nbulgaria\t822\nsure\t822\nrk\t822\npescadores\t822\nd 141\t822\njingzhu\t822\ndik\t822\n225th\t822\napron\t822\nyongizbat\t822\nshi tian gao su\t822\nschone aussicht\t822\ndewitt\t822\nsh4\t822\nchua\t822\nseitenkanal\t822\nkoh\t822\nrollins\t822\nconstantino\t822\nruskin\t822\nhtl\t822\nnazare\t823\nwatsons\t823\nlabor\t823\nsivir\t823\nbassi\t823\nbulls\t823\nvasquz\t823\nqullen\t823\nbolnichni\t823\nbeauvais\t823\ngarazhni\t823\nlaghetto\t823\nzweirad\t823\ndeadman\t823\nd 920\t823\nremi\t823\nalfred st\t823\n215th\t823\nb 241\t823\nkotliarivskogo\t823\nbree\t824\nul kutuzova\t824\nstipova vulitsia\t824\nalefyralefn\t824\nhermann st\t824\nb10\t824\nb 76\t824\npiski\t824\nquintas\t824\naudio\t824\nsp64\t824\nav d\t824\nepinettes\t824\natkins\t824\nco rd 8\t824\nestes\t824\nstarenweg\t824\nrochefort\t824\nmitskivicha\t824\nbritton\t824\nmadonnina\t824\ncynthia\t824\nmbou\t824\nlode\t824\nrudolf breitscheid st\t824\nmirror\t824\nbhardlgariia\t824\ndalnii\t824\nseniunija\t825\nobuv\t825\npretty\t825\nc so italia\t825\nnationwide\t825\nspolem\t825\nzeedijk\t825\nwiza\t825\nze6\t825\nappleby\t825\nambrose\t825\nmaywood\t825\n014\t825\nknoxville\t825\nlongno\t825\ndeiriyamazaki\t825\nvergine\t825\nionian\t825\nn 15th st\t825\nsenhor\t826\nshkolnaya st\t826\ncheryl\t826\nr des coqulicots\t826\nnederland\t826\npk cr\t826\nr dr\t826\nsours\t826\ncordero\t826\ngorzdrav\t826\nwanderwege\t826\ncreekside dr\t826\nrush cr\t826\nempr\t826\nlan hai gao su\t826\nozdorovitilni\t826\ncartwright\t826\nbirch av\t826\noakhurst\t826\nunicredit bank\t826\nmansur\t826\nridgewood dr\t826\nitzhak\t826\nradcliffe\t826\ndenseignement\t826\nals\t826\n169th\t826\nainbdalefllh\t826\nbonifica\t826\nmatisse\t826\nconstruccion\t826\npressing\t826\nb 38\t826\nyu chuan\t826\nnigeria\t827\nn elm st\t827\nsaur\t827\nrichmond av\t827\nul 40 lit pobidy\t827\nretirement\t827\nmoniuszki\t827\nronsard\t827\nferroviaria\t827\ncomando\t827\nspusk\t827\nlanse\t827\nfohrenweg\t827\nherradura\t827\nn35\t827\nconstituyentes\t827\nwhataburger\t827\ncharca\t827\nricheliu\t828\nswisscom\t828\nbaumana\t828\naller\t828\n16th av\t828\ndarah\t828\nus 150\t828\nshkolnaia vulitsa\t828\nfurlong\t828\nm 11\t828\nwhisky\t828\nhaye\t828\nrossignols\t828\nsia\t828\ngiulia\t828\nevans rd\t828\ncuritiba\t828\nlocean\t828\nsoftware\t828\nhummingbird ln\t828\n12b\t828\nchambre\t829\nm9\t829\nareia\t829\ncamas\t829\njaguar\t829\nasahi\t829\ntikhaia ul\t829\nss113\t829\nrheinstrecke\t829\npl de lhotel de ville\t829\nhooker\t829\npl wolnosci\t829\nlos angeles\t829\npolaris\t829\nnovas\t830\ncrocus\t830\nprirodni\t830\nlesage\t830\n1136\t830\nrua h\t830\nsige\t830\nabruzzi\t830\npreescolar\t830\nmanastirea\t830\ncalles\t830\naquarium\t830\nbessemer\t830\ntechnisches\t830\nresorts\t830\nzwarte\t830\n110th st\t830\nartl\t830\nluneburger\t830\nthralefn\t830\nllbnaleft\t830\nlatelir\t830\nszosa\t830\n1010\t830\nperon 2\t831\na teich\t831\ngoli\t831\nrn 5\t831\nlorena\t831\nfrisen\t831\nbarnsley\t831\nzell\t831\nmacquari\t831\nr du college\t831\npollard\t831\ncra 12\t831\ndostoivskogo\t831\neat\t831\nthru\t831\namparo\t831\ns 11th st\t831\nhaldenweg\t831\nvigna\t831\nloureiro\t831\nmontero\t831\nvasutallomas\t831\nheimatmuseum\t831\ngallego\t831\nsergipe\t832\nmariz\t832\nnko\t832\nsoldirs\t832\nappaloosa\t832\nbirch rd\t832\nwilkigo\t832\nmckee\t832\nbombay\t832\nsomerville\t832\npedestrian\t832\na 39\t832\nrp11\t832\n220th st\t832\nelwood\t832\niasnaia\t832\nmonjas\t832\nabri\t832\nmarianne\t833\nvondel\t833\ntei\t833\nrentals\t833\naachen\t833\nvoyage\t833\nd 132\t833\n974\t833\nkinney\t833\nthin\t833\npichincha\t833\nwear\t833\nkea 3\t833\nfaraday\t833\nbalefzalefr\t833\nshoppers drug mart\t833\najoncs\t833\ncapucins\t833\nfairviw dr\t833\nkhao\t833\na s\t833\n2nd av n\t834\nf3\t834\n985\t834\nzuni\t834\nr des moulins\t834\nniz\t834\nkellys\t834\npioneer rd\t834\nniderrhein\t834\neastfild\t834\ngrants\t834\naon\t834\nernstings\t834\ncarrick\t834\nizvor\t834\njodlowa\t834\nv marco polo\t834\nsabana\t834\nemma st\t834\nrack\t834\ngorse\t834\nm11\t834\nbrd\t834\nainyalefdte\t834\nrozas\t835\nsr 15\t835\nlejas\t835\nleblanc\t835\n1941\t835\ncra 13\t835\nserwis\t835\ngesamtschule\t835\nguarani\t835\nhelsinki\t835\ncline\t835\nparodos\t835\nnewton rd\t835\nabbotsford\t835\nhuda\t835\n32a\t835\nfalmouth\t835\njungle\t835\n853\t835\ntweed\t835\nmostowa\t835\nsaut\t835\nnar\t835\nlavadero\t835\nparadero\t835\n3100\t835\ncosmos\t836\nhenritta\t836\njoban exp\t836\njeunesse\t836\ntatum\t836\ns106\t836\nmuralla\t836\nn18\t836\ndryden\t836\njohnsons\t836\nrobidog\t836\npolivoi\t836\ndanisches\t836\npatagonia\t836\nkalinovka\t836\nphare\t836\ncinega\t836\ngive wy\t836\nfalla\t836\ngounod\t836\ntumulus\t836\nss309\t837\nyani\t837\npegasus\t837\nb9\t837\n1 275\t837\nkyzyl\t837\ndamian\t837\ndrumul\t837\n173rd\t837\nb 294\t837\nbudowi\t837\nst 2\t837\nroosevelt st\t837\nchilis\t837\nrazvitiia\t837\nr de bellevu\t837\nnoto\t837\nkosmos\t837\ne walnut st\t837\ncorpo\t837\nkubanskaia\t837\nschwarzenbach\t837\nacapulco\t837\nbr 282\t837\nwerk st\t838\nrelax\t838\nrevolution\t838\note\t838\nbamberger\t838\nlem\t838\nkastanje ln\t838\nn19\t838\nqnalefte\t838\nges\t838\ngrammar\t838\nkontora\t838\nhickory dr\t838\npervomayskaya\t838\n171st\t838\n11b\t838\ncantine\t838\ncamp rd\t838\nst peter\t838\nfaye\t838\nchinti\t838\nbhavan\t838\ndreick\t838\nrisparmio\t839\nroussillon\t839\nd 98\t839\nexclusive\t839\nwhite rd\t839\nlofts\t839\nalondra\t839\npunt\t839\nushakova\t839\n965\t839\nkirpichni\t839\ne 532\t839\nkapell\t839\nk 46\t839\ncayo\t839\nbananghanin\t839\nboulodrome\t839\nlevis\t839\nionia odos\t839\nterpel\t839\nholman\t839\ncane cr\t839\ncr 27\t839\nlamm\t839\nnaturler\t839\nquatorze\t840\nlang st\t840\nmyosotis\t840\nvaasan\t840\nca 99\t840\ngiusti\t840\nlakeshore rd\t840\nsaginaw\t840\nus 30 alternate\t840\ncascata\t840\n192nd\t840\nevangeliqu\t840\nmasia\t840\numspannwerk\t840\nborden\t840\nmela\t840\nstusa\t840\nliv\t840\neinstein st\t840\npirimogi vulitsia\t840\nsukhumvit\t840\ndalefyrte\t840\nkarya\t840\ndisney\t841\nfirs\t841\nr des fontaines\t841\ntuin\t841\naleflalefhmr\t841\nuudd\t841\ngodfrey\t841\ngdn state pwy\t841\ndraper\t841\nyukari\t841\nplacette\t841\nrabelais\t841\ntecumse\t841\nkhlyj\t841\nkneza\t841\nsp47\t841\ncomptoir\t841\ndris\t841\n013\t841\ntimber ln\t841\nul kotovskogo\t841\nparini\t841\nchapaiva vulitsia\t841\nmcarthur\t841\nsleep\t842\nmclaughlin\t842\nsp51\t842\ncoon cr\t842\nchiliuskintsiv\t842\nvillard\t842\naxel\t842\ntata\t842\nbodegas\t842\njoya\t842\nklubnaia ul\t842\nquarto\t842\nring 3\t842\nbloom\t842\nfugo\t842\nd200\t842\ncottonwood dr\t842\nschloss pl\t842\nwinchester rd\t842\ncamos\t842\nheinrich st\t843\njezero\t843\nschooner\t843\ntelford\t843\nmerino\t843\ncr 23\t843\ncalmette\t843\ntile\t843\nwindham\t843\nrookery\t843\nperdu\t843\nkoyu\t843\nporfirio\t843\nbyk\t843\nrobinsons\t843\nwoman\t843\nnaturale\t843\ntapas\t843\nkirchengasse\t843\nomnibus\t843\nprofi\t843\nholding\t843\nqarah\t843\n330th\t843\nbarid\t843\nmade\t844\nmoorland\t844\nlanguage\t844\nbonaparte\t844\nweymouth\t844\ncostilla\t844\nuniqu\t844\nlocanda\t844\nzao tandir\t844\nsotsialistichiskaia\t844\nd 160\t844\njoly\t844\ndales\t844\nmorgen\t844\nmtn vw dr\t844\nhainan\t844\nsp43\t844\nczarna\t844\nmainlh\t845\nktm\t845\nbuzzard\t845\njohor\t845\n30th st\t845\nc ramon cajal\t845\nstadtsparkasse\t845\n1021\t845\nr des jonquilles\t845\ncanberra\t845\nharmoni\t845\nbethune\t845\nwaterman\t845\nobrero\t845\nmostovaia\t845\ntacoma\t845\nroller\t845\nmoscow\t846\nwacholderweg\t846\norlik\t846\nuniversita\t846\nlinea de alta velocidad madrid zaragoza barcelona frontera francesa\t846\ntransportes\t846\nrangel\t846\nmushola\t846\nvalley vw rd\t846\ndanau\t846\nbufe\t846\njin ji ri ben t dao ming gu wu xian\t846\nkrzyza\t846\nmastra\t846\nceramica\t846\nsidlungs st\t846\nkosumo shi you\t846\naustralian\t846\n745\t846\nhlavna\t846\nlaurel dr\t847\nmoron\t847\n015\t847\nvcto\t847\npiscina mun\t847\nvinh\t847\npwy dr\t847\nd 136\t847\nastor\t847\next\t847\nholle\t847\nralefh\t847\nhallen\t847\nnankai\t847\nr des remparts\t847\njalefl\t847\nklingen\t847\nhamzah\t847\nschmide st\t847\nats\t847\nperon 1\t848\nfamiliar\t848\nzagalnoosvitnia\t848\nbreda\t848\nlevequ\t848\nav ccvcn\t848\n33a\t848\norchard c\t848\nsidlungsweg\t848\nangeli\t848\nmarseillais\t848\nchemical\t848\ne 761\t848\ngutshof\t848\nwanderpark pl\t848\nus 431\t849\nlost cr\t849\ncapucines\t849\nlet\t849\naugsburger st\t849\nfossil\t849\nread\t849\nconiston\t849\ngardiner\t849\ndan in luan huang xin gyeongbu hsl\t849\nonyx\t849\nkoko\t849\nholderlin st\t849\ngudes\t849\njiu dong hai dao\t849\nbete\t849\ns16\t849\nuniversitats\t849\nlekarna\t849\ng2501\t849\nss 106 jonica\t849\nbotanichnii\t849\n98k\t849\nbirkdale\t849\nconestoga\t850\nvs\t850\nus 385\t850\nrvo\t850\ndaffodil\t850\nd 916\t850\nhogeweg\t850\ntsutaya\t850\nul bilinskogo\t850\n1029\t851\npontiac\t851\nmoltke st\t851\nallendale\t851\nevergreen rd\t851\nlaser\t851\nul chaikovskogo\t851\nfirro\t851\ncats\t851\nd 936\t851\nchininxanin\t851\nwijk\t851\nbulak\t851\n35e\t851\nkuchen\t851\nbla\t851\nbait\t851\n827\t851\npaud\t851\noptic\t851\nguo daodasdassdang hao\t851\ndaodasdassdang\t851\nhessen\t851\ndau\t851\nverge\t851\nriki\t851\ngallegos\t851\nlucena\t851\nmilnitsa\t851\namro\t851\nstep\t852\nsilskaia\t852\nrondeau\t852\natlantica\t852\nnorthway\t852\nneuapostolische kirche\t852\nnh53\t852\nmorgan st\t852\nbst\t852\nvenustiano carranza\t852\noceano\t852\nshkolnaya\t852\ngenoa\t852\ndodd\t852\nostbahn\t852\nsalmon r\t852\nb 45\t852\n808\t852\nfilzi\t852\ndassisi\t852\ncatherine st\t852\nfora\t852\nzarichna vulitsia\t853\njuminsenteo\t853\nxl\t853\nvicenza\t853\nautobuses\t853\n860\t853\nlatham\t853\nperforming\t853\nmess\t853\nlondis\t853\nhenritte\t853\ninfantes\t853\njalefygalefh\t853\nsfantul\t853\n990\t853\nobshchistvo\t853\nlaranjeiras\t853\nrocio\t854\n44a\t854\n101 05\t854\ntailor\t854\nthird av\t854\nnewland\t854\nfairy\t854\nnewton st\t854\nelm rd\t854\ncecile\t854\noperations\t854\nnamur\t854\nlagunas\t854\njolit\t854\nparador\t854\ndate\t854\nlirio\t854\namericana\t854\nfortis\t854\njug\t854\nwaltham\t854\ntyrsova\t854\nross rd\t854\n1 grund\t854\nmanege\t855\njugendherberge\t855\nfortress\t855\nuniversitesi\t855\nstipova\t855\nleith\t855\nwestbourne\t855\ngraca\t855\ntargowa\t855\nantalya\t855\nhort\t855\nw walnut st\t855\n17 35\t855\nrua sao pedro\t855\naramburu\t855\nsp37\t855\nbottega\t855\nriggs\t855\nsemard\t855\n25th st\t855\nmarchand\t855\nwawa\t855\nalbano\t856\ntana\t856\n20k\t856\ncramer\t856\nismal\t856\narmenia\t856\ncolumbia st\t856\nautolib\t856\ntiroler st\t856\nfrantsiia\t856\nliceul\t856\nulu\t856\nlucerne\t856\nlocale\t856\npmr\t856\ntampines\t856\nmacau\t856\nmsainp\t856\nschulz\t856\ntorreon\t856\nmorike st\t856\ntoma\t856\nvitnam veterans memorial hwy\t857\nregensburger\t857\nchoi\t857\nhamilton av\t857\nabidjan\t857\nsuburban\t857\nabelardo\t857\nsr 3\t857\nholdings\t857\nk1\t857\nsukhaia\t857\ngorni\t857\nwhetstone\t857\ncallao\t857\nlivre\t857\nfranc\t857\nwaldfridhof\t857\nlen\t857\ngrover\t857\njungbu exp\t857\ngrandviw dr\t858\nr de garenne\t858\nsteeple\t858\nhoyos\t858\ntroitskii\t858\nr des hirondelles\t858\nparaguai\t858\nd 78\t858\nseeblick\t858\nalpina\t858\npobida\t858\n1004\t858\npaterson\t858\ngat\t858\nwesttangente\t858\nweirweg\t858\nunis\t858\npeople\t858\nabbey rd\t859\ndecembri\t859\ntouch\t859\ncontainer\t859\namarillo\t859\nenkanlasensaninan\t859\ncasera\t859\n2300\t859\nahl\t859\nbriarcliff\t859\nmeio\t859\nabbaye\t859\n1016\t859\nsunset rd\t859\ncibc\t859\ncar wash\t859\nk 53\t859\nv john fitzgerald kennedy\t859\nbirch ln\t859\ntherapy\t859\nafb\t859\nrua sao joao\t859\ndri\t859\nlebuhraya utara selatan\t860\nterrell\t860\nlarbre\t860\nlanka\t860\nstadt witten\t860\njinja\t860\nheaton\t860\narnaud\t860\nbudynek\t860\ncoop jednota\t860\npkn\t860\ncasa de cultura\t860\nelm dr\t860\nrust\t860\nsemmering\t860\narchi\t860\nravens\t860\n1 45\t860\namphitheatre\t860\nborja\t860\ns elm st\t860\nbouchard\t860\nkingston rd\t860\nbarstow\t860\nl 85\t861\nmezra\t861\nvecinal\t861\ncreekwood\t861\ndao13\t861\nlugovoi\t861\narabian\t861\nguo dao38 hao\t861\ntide\t861\npima\t861\nwimbledon\t861\nbuckland\t861\nturpan\t861\npoprzeczna\t861\ndelhaize\t861\n1110\t861\nbridal\t861\npeaceful\t861\nmersey\t861\ntandoori\t861\nv bologna\t861\ntully\t861\ninspiktsiia\t861\nl2\t861\nleader price\t861\njmalefl\t861\nbreckenridge\t861\nvub\t862\ncassino\t862\ncomunidade\t862\nyerushalaim\t862\ncelle\t862\nstaats\t862\nr traversire\t862\ndowney\t862\ndeutsch\t862\n1d\t862\nb50\t862\nrivires\t862\nc principal\t862\nadult\t862\nnut\t863\naleflalefmyr\t863\noca\t863\npali\t863\nandriivka\t863\nbare\t863\ndelight\t863\nkyrko\t863\nbenavente\t863\nsupport\t863\nquzon\t863\neconomic\t863\nb17\t863\ndunlap\t863\nhaskell\t863\nrobinson st\t864\nk 44\t864\nbeeline\t864\ncrowsnest\t864\nlong cr\t864\nrobert st\t864\nsfs gyeongbu\t864\ntaylor av\t864\nshowa\t864\nb 70\t864\nchip\t864\npekao\t864\nwheatley\t864\npilgrims\t864\nvana\t864\nbillings\t864\nreims\t864\natwood\t864\n790\t864\nmagdeburger st\t865\nplads\t865\ndahr\t865\nferrand\t865\netna\t865\nhero\t865\nbarth\t865\nlanxin\t865\nknife\t865\nr du 11 novembre\t865\nhaid\t865\nfy rd\t865\nconsulting\t865\ndenise\t865\nbrir\t865\nd 150\t865\nvsi\t865\nquarenta\t865\nhallmark\t865\nmuntzer\t865\nwa 99\t865\nstawowa\t865\nchasseurs\t865\nneuhof\t866\ns201\t866\nhedwig\t866\nkhngngkolyoiingltthllliisoko\t866\nhelm\t866\nitu\t866\namistad\t866\nsalzburger st\t866\n697\t866\nertu\t866\ntatnift\t866\nmaior\t866\ndahl\t866\nbilefeld\t866\nserpentine\t866\nzili\t866\nparrilla\t866\nsmithy\t866\nconcept\t866\nfai\t866\nfellows\t867\nsanitatshaus\t867\nrua 7 de setembro\t867\nhartman\t867\nrelif\t867\nmedici\t867\nold rd\t867\nbrethren\t867\nr jeanne darc\t867\nn 232\t867\nulmen st\t867\nmchs\t867\nbolnichnaia\t867\nnorthland\t867\nsafe\t867\nsvincolo\t867\nkessler\t867\nklooster st\t867\ngregg\t867\nspirits\t867\ncanning\t867\nss38\t867\nsham\t868\nsherman st\t868\nbastide\t868\nquince\t868\ncresta\t868\nah62\t868\ncr 30\t868\nzsilinszky\t868\nul budionnogo\t868\nsablire\t868\nr des fleurs\t868\nv michelangelo buonarroti\t868\nhansestadt lubeck\t868\nwinona\t868\noverseas\t868\nwindsong\t868\nnan bei da dao\t868\nprince st\t868\npiastowska\t868\ncarri\t868\nzviozdnaia\t868\nrusskaia\t869\nforestir\t869\nkel\t869\nwillamette\t869\nkeats\t869\nplatja\t869\nlights\t869\nsel\t869\npsaje 2\t869\nv vincenzo bellini\t869\nprada\t869\nnt\t869\narche\t869\nalfons\t869\ncharlemagne\t869\nandorra\t869\ngr trunk rd\t869\ngriboidova\t870\nsp36\t870\nv umberto 1\t870\nnevez\t870\nrossiiskaia ul\t870\nteichweg\t870\npalu\t870\nnautiqu\t870\ntyres\t870\nferinwohnungen\t870\nfamous\t870\nrodano\t870\nsp45\t870\ndouglas rd\t870\nkhola\t870\ne 14\t870\nmoya\t870\nd 925\t870\n855\t870\neemaliger\t870\nvirginia st\t870\nsenegal\t870\nabra\t871\nseward\t871\naviles\t871\nmoskovskoi shossi\t871\ndesjardins\t871\njana kilinskigo\t871\ns301\t871\nkenmore\t871\npang\t871\npackard\t871\npatrol\t871\nwilhelmina st\t871\npolicji\t871\nsavitskaia vulitsa\t871\nnaviglio\t871\ncaserma\t871\nbond st\t871\nthoir\t871\nbosqus\t872\nrutledge\t872\na d heide\t872\nbath rd\t872\nauditorio\t872\nalimentation\t872\ncard\t872\nsport pl st\t872\nautov rias baixas\t872\ndonaldson\t872\nji tian chuan\t872\n774\t872\npig\t872\n1 91\t872\npape\t872\ngreenland\t872\ntodo\t872\nshowroom\t873\njewelers\t873\nparkers\t873\nalso\t873\nmino\t873\nquartire\t873\nchurch of god\t873\noldham\t873\nprestwick\t873\nplover\t873\nkwm\t873\nnotch\t873\ntuna\t873\nss53\t873\nprirodi\t873\nmurat\t873\n055\t873\nabn\t873\nn 113\t873\nchornovola\t873\nr de croix\t873\nlaurel av\t873\nrn11\t873\ngei\t873\ndunham\t874\nsherwin\t874\ngoose cr\t874\ngoulart\t874\nnegri\t874\ndubrovka\t874\ngarnir\t874\nm60\t874\nolgi\t874\nizba\t874\nconstantine\t874\narchibald\t874\nroxbury\t874\nwindsor dr\t874\npenha\t874\nnorthwestern\t874\nkosmetik\t874\nlili\t874\ns walnut st\t874\nedgemont\t874\nviario\t874\nfidiralnoi\t875\npte\t875\npit r\t875\nangelina\t875\nwarren rd\t875\npea\t875\nmidas\t875\nsabadell\t875\nv gatano donizetti\t875\nmunchner st\t875\ndrexel\t875\nvado\t875\nwilkins\t875\nboyaca\t875\nmodulo\t875\nbainbridge\t875\ngreyhound\t875\nschulze\t875\nmedford\t875\nkrdy\t876\nverga\t876\nhwy 17 trans canada\t876\nuwe\t876\nikebukuro\t876\ndoria\t876\nvos\t876\ndao113\t876\nteton\t876\nparkovochnogo\t876\nmallory\t876\nhwy 401\t876\ncoimbra\t876\nrua sta catarina\t876\nstudiia\t876\ngku administrator moskovskogo parkovochnogo prostranstva\t876\nwestpac\t876\npandora\t877\nwatling\t877\nadmirala\t877\ncoal cr\t877\nagri\t877\nmatyas\t877\nter dr\t877\nafton\t877\nnya\t877\nturner rd\t877\nprostranstva\t877\ncadillac\t877\nheller\t877\ntwilight\t877\nsummerhill\t877\nheathfild\t877\nnagel\t877\nmorningside dr\t877\nzino\t878\nunderground\t878\ngreve\t878\nfressnapf\t878\ncraven\t878\n320th\t878\noreilly\t878\n977\t878\nze1\t878\nd 97\t878\nbeograd bar\t878\nsanitar\t878\ntacos\t878\nd 999\t878\ntsui\t878\nniles\t878\nprogresso\t878\nmrt\t878\nd 140\t878\nceiba\t878\ntremblay\t878\nbajcsy\t878\ngiuliano\t878\nfurth\t878\nc e\t878\nlupine\t878\nv fratelli rosselli\t879\naosta\t879\nsolidarnosci\t879\nningjingyan exp\t879\nghana\t879\nposolstvo\t879\ndonji\t879\njing chuan\t879\nbotanichiskii\t879\nstang\t879\nhonorio\t879\nbaseline rd\t879\niaroslava\t879\nze3\t879\nfuno\t879\n160th st\t879\nbaki\t879\nsiglo\t879\neventos\t879\ngananmanzeninrain\t879\nningjingyan\t879\ngrazer\t879\nnarva\t879\nfamily dollar\t879\n4x4\t879\nrosco\t879\nzhu jing yan gao su\t879\npst\t879\nk 41\t879\ncampestre\t879\ns33\t879\nkolyma\t879\nseville\t879\n2da\t879\navtodublir\t880\nbucherei\t880\nsirinivaia\t880\nkos\t880\nperdrix\t880\nvodokhranilishchi\t880\nbrecht\t880\navtodublir bama\t880\nhofmann\t880\ncr 24\t880\nrobin ln\t880\nv della pace\t880\nkavkaz\t880\nhongha luan huang yuki ze\t880\nv montello\t880\nwallis\t880\n2400\t880\ncda\t880\nbaznycia\t880\ngrimes\t880\nbatteri\t880\ntizi\t880\nminimarkit\t880\nmadina\t880\nmillan\t881\nbig branch\t881\n949\t881\nsysteme\t881\n923\t881\nlucca\t881\nenmedio\t881\nromains\t881\npumpkin\t881\nquirino\t881\nathenon\t881\ncg\t881\nvail\t881\n49k\t882\nhuman\t882\ns4\t882\nlyman\t882\nrua sete\t882\nnaples\t882\nkham\t882\nritz\t882\ncarles\t882\nmalom\t882\nw ln\t882\nschutzenverein\t882\ngorda\t882\nbrucker\t882\ngradina\t882\nvalhalla\t882\nhci\t882\ngirl\t882\nfore\t882\n846\t882\nkhlong\t882\nlawton\t882\nguba\t882\n24th st\t882\nmoreland\t882\nsp44\t882\nlandry\t882\ntho\t882\nmiddenweg\t882\ntannen st\t882\ndirettissima\t883\njwalefd\t883\nabilio\t883\nmerrick\t883\nstryd\t883\nproduction\t883\nobroncow\t883\nlee rd\t883\nspragu\t883\nmort\t883\nspringbrook\t883\nalefljdydte\t883\naquiles\t883\niop\t883\npfarrheim\t883\nburro\t883\nvalery\t883\nul timiriaziva\t883\nwestport\t883\ntaquria\t883\nbelgrade bar\t883\ntanglewood dr\t883\ncolchester\t883\nlilinweg\t883\nbok\t883\nlisbon\t883\ntroon\t883\nname no\t884\nrigole\t884\nbramley\t884\nfoxwood\t884\ntoby\t884\nkristall\t884\nbooker\t884\nroseaux\t884\nelton\t884\nn s exp\t884\nerik\t884\ncavalcante\t884\na 25\t884\nloteamento\t884\nmikhanizatorov\t884\ndactivites\t884\nkatharina\t884\nahorro\t884\ncomm technician name no\t884\nfc s martin\t884\nul truda\t884\njewish\t885\n497\t885\nsanzio\t885\n017\t885\ncher\t885\nmais\t885\nlockhart\t885\nprior\t885\nyanjiang\t885\nalbert heijn\t885\ne 38 ah61\t885\ntejar\t885\npainted\t885\nkelten\t885\npaketshop\t885\nd 129\t885\npionirska\t886\nfrida\t886\ndubh\t886\nnos\t886\nboyne\t886\nkofi\t886\noktiabrskoi\t886\ncharcot\t886\ngarfild st\t886\nzwycistwa\t886\nlaroport\t886\nnimen\t886\nbong\t886\nmanastir\t886\nhais\t886\nbreiten\t886\ndbyrstalefn\t886\nzurcher\t886\nliman\t886\npolar\t886\ndandenong\t886\nsassafras\t886\ndorfkirche\t886\ntill\t886\noutback\t886\nmarton\t887\nbangor\t887\nsh 73\t887\nmillwood\t887\nentre rios\t887\nmonika\t887\nmitchell rd\t887\nandy\t887\ndepartemental\t887\nbonfim\t887\nr102\t887\nc cervantes\t887\nmt2\t887\nlek\t887\nn59\t888\n828\t888\nkriz\t888\nhomestead rd\t888\nrufino\t888\nsilos\t888\nkeio\t888\ntec\t888\nflorence st\t888\nkanali\t888\nslovnaft\t888\nv gioacchino rossini\t888\nkommunalnaia ul\t888\nberggasse\t888\nnmp\t888\nfakultit\t888\nsuan\t888\nnasiliniia\t888\nhudson st\t888\ngranger\t888\npoza\t888\nwurzburger st\t888\n778\t888\nterrasses\t889\namo\t889\ng207\t889\ncolette\t889\nukrnafta\t889\npembina\t889\nkoltsivaia ul\t889\nkaminni\t889\nbona\t889\ncook st\t889\nbernd\t889\nlewis rd\t889\nsydenham\t889\nrajon\t889\nkrasina\t889\nwake\t889\ns203\t889\nborisa\t889\nbygade\t889\nmerida\t889\nencino\t889\nbrookhaven\t889\nzg\t889\ncinq\t890\ncompanis\t890\nbingo\t890\ntraian\t890\nbourgeois\t890\nvicuna\t890\ncrespo\t890\n2630\t890\nvillanova\t890\ncattail\t890\ngrunewald\t890\nstauffen\t890\npusteria\t890\n176th\t890\nkristianskaia\t890\nquretaro\t890\nthrift\t890\nmojave\t890\nhankyu\t891\nkivit\t891\npozulo\t891\nd 955\t891\nkapliczka\t891\nsp65\t891\nairline\t891\nbelgium\t891\nbuntu\t891\nkola\t891\nlegend\t891\nfk\t891\nmatilde\t891\nhospitalir\t891\nheu\t891\nthiar\t891\neuclid av\t891\nlansi\t891\nzalioji g\t891\nphilippines\t892\nwhitfild\t892\ncarla\t892\nkastner\t892\nav du 8 mai 1945\t892\ntourterelles\t892\neski\t892\ngoldenrod\t892\nolumpia odos\t892\nvodopad\t892\nszobor\t892\ngainsborough\t892\neastman\t892\nparcel\t892\noliksandra\t892\nkar\t892\ne 12th st\t892\nkum\t893\npischanaia\t893\nhorta\t893\ng st\t893\njacarandas\t893\ncentro de salud\t893\nhokuriku shinkansen\t893\nav getulio vargas\t893\negypt\t893\nbus stn\t893\nnoah\t893\nordonez\t893\ndepartement\t893\nkosa\t893\n843\t893\nzahnarzt\t893\nr 22\t894\nadair\t894\ntif\t894\ntakasaki\t894\ngioia\t894\ntrindade\t894\n14th av\t894\nheads\t894\nstarling\t894\nreformatus\t894\ndrogaria\t894\nartisans\t894\nolinda\t894\ndelivery\t894\ntedi\t894\nbowls\t894\nambulatoriia\t895\nmercator\t895\nsava\t895\njasna\t895\ngar\t895\nhwy 2\t895\nbaldy\t895\npalau\t895\nhammam\t895\nus 35\t895\nneuqun\t895\nlian huo exp\t895\n599\t895\nalefmyn\t895\n754\t896\nparnu\t896\ncipriano\t896\nweldon\t896\nhardwick\t896\nalefslalefmy\t896\ns 1\t896\ngroblje\t896\nespanola\t896\n1 71\t896\nditsad\t896\n658\t896\nlobster\t896\nmup\t896\nd 131\t896\norta\t896\n183rd\t896\nteknik\t896\na wein bg\t897\nogolnoksztalcace\t897\nr de labreuvoir\t897\nd 933\t897\nrua amazonas\t897\nbaixa\t897\nmerton\t897\nsudharzautobahn\t897\nbymalefrstalefn\t897\nchanoine\t897\nlonsdale\t897\nwodna\t897\nilan\t897\n789\t897\nturm st\t897\nrose av\t898\nmuddy cr\t898\nmoral\t898\nenclave\t898\nsr 17\t898\ncambridge st\t898\npubliczne\t898\ncra 9\t898\nlibano\t898\nyes\t898\nuferweg\t898\npaola\t898\nslpe\t898\njacopo\t898\nfairhaven\t898\ncale\t898\nkendal\t898\nsingapore\t899\npensiunea\t899\nvordere\t899\nsonoma\t899\nhoyt\t899\n888\t899\nbenedict\t899\nalpino\t899\nmalinovka\t899\ncolima\t899\nbuis\t899\nnana\t899\nrohr\t899\nchic\t899\nskylark\t899\ngusde\t899\nmannheimer\t899\nuna\t899\nssr\t899\nvivero\t899\nmason rd\t899\npearce\t899\ndis\t899\nradisson\t899\ngreat western main ln\t900\nuruguai\t900\ncambrian\t900\nbei lu xin gan xian\t900\nmodrzewiowa\t900\nxin cun\t900\ndwalefr\t900\ndesarrollo\t900\nmizuho in xing\t900\narana\t900\nmirim\t900\npanorama st\t900\nsande\t900\nsupirmarkit\t900\nwichita\t900\nbruce hwy\t900\nhospedaje\t900\nferrovia del brennero\t900\nauto del mediterraneo\t901\nmilani\t901\nvee\t901\nnene\t901\nhatton\t901\necm1\t901\ncheong\t901\nlgv mediterranee ln5\t901\nr11\t901\nklubnaia\t901\nselby\t901\n1920\t901\nysgol\t901\nhajar\t901\npinheiros\t901\nshea\t901\nkuchai\t901\nhunts\t902\nprimrose ln\t902\nm29\t902\n23rd st\t902\nhonghli\t902\ngdyr\t902\nlarkin\t902\nnajd\t902\npoplar av\t902\ntancsics mialy u\t903\nsh 3\t903\nal st\t903\ntoul\t903\nparamo\t903\nareas\t903\nabdel\t903\nlunga\t903\nveit\t903\ncoombe\t903\ntinh\t903\natherton\t903\nnaciones\t903\nbowi\t903\ncenterville\t903\nrideau\t903\n927\t903\nwave\t903\nrud\t903\npil\t903\nmelani\t903\njudicial\t904\nberta\t904\nhickman\t904\npickering\t904\nznachiniia\t904\nmoulay\t904\nlipu\t904\ncastle st\t904\nwagner st\t904\nv della liberta\t904\ngreece\t904\nfridhofweg\t904\nleones\t904\nschultz\t904\ntuv\t904\npramen\t904\nmrkhz\t904\ncaldera\t904\nfoxglove\t904\nbarclays bank plc\t904\npasubio\t905\nangle\t905\nkosta\t905\nmcbride\t905\notish\t905\nnaberezhnaya\t905\nbixio\t905\nhilario\t905\nkleist\t905\ngesellschaft\t905\nantiqu\t905\n1060\t905\nn 16th st\t905\ncra 6\t906\nedmondo\t906\nanson\t906\nsista\t906\nfrisor\t906\ne 61\t906\nuplands\t906\n1026\t906\nv fiume\t906\nhaley\t906\ngiratoire\t906\naktiv\t906\ns21\t906\nfishing cr\t906\npinon\t906\nschuster\t906\n35a\t906\npozos\t906\ne 11\t906\nkhoztovary\t906\nninth\t906\naulnes\t906\nmil rd\t907\nmathews\t907\nveilchenweg\t907\nlucni\t907\n683\t907\ne35\t907\nroig\t907\nforo\t907\n785\t907\nkungs\t907\nemory\t907\nrau\t907\nwestern union\t907\ncorbett\t907\namigo\t907\ndauphin\t907\nmiasokombinat\t907\npushkina vulitsia\t907\nlincoln hwy\t907\nd300\t907\nprospikt pobidy\t907\ncocos\t907\nbain\t908\ndiogo\t908\naustral\t908\nmaxx\t908\ncali\t908\nstadtgraben\t908\nv grenoble\t908\nkent st\t908\nlimoges\t908\ncatamarca\t908\ntechnische\t908\nfabre\t908\nhubertus st\t908\nstroitil\t908\nfife\t908\ndi3\t909\nbarranquillo\t909\nschweizer\t909\nshirokaia ul\t909\n795\t909\nbison\t909\npane\t909\nul tolstogo\t909\nr des violettes\t909\n21a\t909\neasement\t909\nn walnut st\t909\nm25\t909\nmarion st\t909\ngalvao\t909\njing zhu gao su\t909\nchang pan zi dong ch dao\t909\naleflnyl\t910\nglenbrook\t910\nbeaconsfild\t910\nhofacker\t910\nwhiteouse\t910\nc 34\t910\nv giotto\t910\nsyr\t910\nvuka\t910\n823\t910\narret\t910\nhighline\t910\nanselmo\t910\neatery\t911\naussenring\t911\nrua 10\t911\ngottingen\t911\ndalefrwkhalefnh\t911\nhurto\t911\nmelgar\t911\nss42\t911\nmahal\t911\nsandhill\t911\nlabelle\t911\nbalef\t911\nshetland\t911\nferrovia adriatica\t911\nelmer\t911\npokrova\t911\nindustrigebit\t911\nkrd\t912\nrudolf disel st\t912\nasen\t912\nautov mudejar\t912\ngsp\t912\ndruzhbi\t912\ngolf course rd\t912\nsamsung\t912\nobern\t912\nkiril\t912\nhutan\t912\nkirova st\t912\nr des rosirs\t913\nkeene\t913\n17b\t913\nitaly\t913\nntra\t913\nnoor\t913\nt mobile\t913\ncarnation\t913\nhanshin\t913\nrudolfsbahn\t913\nwestland\t913\nss45bis\t913\ndns\t913\nshan tian chuan\t913\ngreenbank\t913\njorg\t913\nlilin\t913\nl1\t913\nr des cerisirs\t913\n1733\t914\nbarreiro\t914\nkhalil\t914\nheckenweg\t914\n570 000\t914\ndag\t914\nungwan\t914\ntraders\t914\notto hahn st\t914\nwarrior\t914\nd 902\t914\n667\t914\ningeniros\t914\ncornelio\t914\naroma\t915\naleflvn\t915\nmoll\t915\nadministrator\t915\nsavitskaia\t915\niona\t915\nrt nationale\t915\nwincentego witosa\t915\nmnr dr\t915\nlez\t915\nsp49\t915\nvoz\t915\nzero\t915\nmerchants\t916\ndubai\t916\nward st\t916\nruinas\t916\nstyles\t916\nnah\t916\norla\t916\nbock\t916\njing bang ji xing dian t ben xian\t916\nevangelische kirche\t916\nford rd\t916\nkoppel\t916\nsluzhby\t916\nlintas\t916\nolumpia\t916\nr georges clemenceau\t916\nambassador\t917\nst michal\t917\ndisco\t917\nmedway\t917\nouadi\t917\nsawmill rd\t917\nfeurwache\t917\npo tribovaniiu\t917\naltenheim\t917\npl de liberte\t917\njalefmainte\t917\nbps sbirbank\t917\njansen\t917\nmainzer st\t917\nkarin\t917\nsunset bd\t917\nd 92\t918\nwillow av\t918\nmartel\t918\nbuckskin\t918\nvik\t918\nrott\t918\ncampagna\t918\nsagaidachnogo\t918\npublix\t918\nvf\t918\ndarya\t918\nsorgente\t918\nlafayette st\t918\npista deportiva\t918\nwendy\t918\ntuohyeong\t918\ns49\t918\nbender\t918\ncaron\t918\nstrazacka\t918\nhandels\t918\nhmwd\t919\npottery\t919\nmorel\t919\nstollen\t919\ntiziano\t919\nagora\t919\npirshotravniva vulitsia\t919\nrasa\t919\nshy\t919\ntempel\t919\ngolo\t919\ntawi\t919\nfelde\t919\npasse\t919\npilon\t919\nhwang\t919\npomme\t919\nmouttes\t919\nlowry\t919\nbadia\t919\nharris st\t919\nv pitro nenni\t920\nsukhoi\t920\nsovereign\t920\ncristiana\t920\nareal\t920\nbanbury\t920\npnjm\t920\nq yang dao\t920\neo6\t920\ne 372\t920\nregents\t920\nairport bd\t920\nfirst united methodist church\t920\ningo\t920\nkonzum\t920\nze4\t920\nb 470\t920\n2014\t920\n695\t920\ncabildo\t920\nmay st\t921\nainlwalefn\t921\nclaveles\t921\nrockaway\t921\nbhalefr\t921\nlynx\t921\nlobato\t921\naxis\t921\ncustodio\t921\nkaminna\t921\neducational\t921\nemef\t921\nredwood hwy\t921\nvaldez\t921\nsta ana\t921\nsturt\t921\ntomb\t922\nluhu\t922\nmanresa\t922\ndalias\t922\nsloan\t922\nvaca\t922\ngive\t922\ngrub\t922\ncambridge rd\t922\ns88\t922\ncutler\t922\nd 142\t922\nseguin\t922\nmildred\t922\nnasir\t922\nbway av\t922\n867\t922\nrua parana\t922\ncentura\t922\ngoddard\t922\na46\t922\n1 av\t923\nwelfare\t923\ne 802\t923\nm 3\t923\ns308\t923\ninnere\t923\njudischer\t923\ngamma\t923\nvento\t923\nadvanced\t923\nmolenbeek\t923\nolimpio\t923\nodenwald\t923\nrenner\t923\nmarine dr\t923\n1090\t923\nsalaf\t923\ncsob\t923\nrainir\t923\nw 12th st\t923\nnebo\t923\nasb\t923\nmeseta\t924\nsofiia\t924\nb 107\t924\nharcourt\t924\ncas\t924\nkohi\t924\npedroso\t924\npsaje 1\t924\njerez\t924\nkings hwy\t924\nlill\t924\nsfax\t924\nlaavu\t924\nstewart st\t924\nq jia bian li shang dian\t924\nwrights\t924\ndecheteri\t924\nwarszawy\t924\nlonghorn\t924\nvidyalaya\t924\nedmonton\t924\nutica\t924\nschwarzbach\t924\ntalon\t924\n1003\t925\nupravliniia\t925\nditer\t925\ndelano\t925\nnaturelle\t925\ncaseys\t925\nss47\t925\npalisades\t925\nschmitz\t925\nd 901\t925\nalsace\t925\ncra 11\t925\nhockey\t925\nsilvia\t925\nprudente\t925\nperfect\t925\nkantine\t925\npaderewskigo\t925\n1011\t925\neagle dr\t925\nnikolskoi\t926\nmolly\t926\njustus\t926\nfence\t926\njasminowa\t926\nstadtweg\t926\nmunster st\t926\nbordes\t926\ndanbury\t926\ndokomosiyotupu\t926\nmartinus\t926\ndeledda\t926\nd 149\t926\nsibir\t926\n1140\t926\nbrunnengasse\t926\nturk\t926\n870\t926\nkarls\t926\namorim\t927\nschwab\t927\nkauno\t927\nd 128\t927\ngaleana\t927\nschleenweg\t927\ngoutte\t927\nvoinkomat\t927\nassembleia\t927\njiangno\t927\n649\t927\ncampina\t927\nr des pins\t927\npugachiova\t927\nsukiya\t927\nsherry\t927\nr de legalite\t927\nsfly\t927\nmisiones\t927\ndocomo\t927\nvalleyviw\t927\npicardi\t927\nholly st\t928\ntemps\t928\ntita\t928\n568\t928\nzagrebacka\t928\ndrainage\t928\ntannery\t928\nr du marais\t928\nlivorno\t928\nyai\t928\na 92\t928\nvivo\t928\nterritorial\t928\nzahnarztpraxis\t928\nliffey\t928\nwalnut cr\t928\nhathaway\t928\nsp48\t928\nbasswood\t929\nf4\t929\nlichfild\t929\nteachers\t929\nbroadviw\t929\nthorne\t929\nb 88\t929\nsedlo\t929\nkhabb\t929\nmid fork feather r\t929\nseaplane\t929\ndalia\t929\nnikolai\t929\nbaltic\t929\nbr 158\t929\nintesa\t929\nhewitt\t929\noptiqu\t929\nivory\t929\nentry\t929\ns a\t929\nming gu wu t dao ming gu wu ben xian\t930\nd 943\t930\nr du bois\t930\nlinzer st\t930\nmemory ln\t930\nhuang chuan\t930\nlewiatan\t930\nsputnik\t930\nmiddletown\t930\nponti\t930\ntifenbach\t930\nrn5\t930\nfrederik\t930\nzapovidnik\t930\nbeuken ln\t930\ndroim\t930\nindian oil\t930\nbr 381\t930\nligne de paris austerlitz a bordeaux st jean\t930\ngreer\t930\ngoldbach\t930\nantico\t931\ntorquato\t931\ncra 3\t931\ncra 8\t931\ngia\t931\nraco\t931\nainbwd\t931\npolana\t931\npius\t931\ntogo\t931\nfenwick\t931\nisral national trl\t931\nlia\t931\nbocca\t931\nmarengo\t931\ncorneille\t931\n677\t932\nb 214\t932\naleflsryain\t932\nnoria\t932\nalefbtdalefyyte\t932\nhelsingin t\t932\nrua sem denominacao\t932\nyves rocher\t932\nelster\t932\ng1511\t932\nstour\t932\nsudheide\t932\n1015\t932\nsteinacker\t932\nlider\t932\nc 33\t932\ndps\t932\nfichten st\t932\nnh52\t932\nlauter\t933\nskov\t933\nv filippo turati\t933\nfalaise\t933\nuncle\t933\nhmlk\t933\ndenmark\t933\njacksonville\t933\nwisma\t933\nlemann\t933\ndoshkolnoi\t933\npirvaia\t933\nus 79\t933\ngervais\t934\n2690\t934\npequno\t934\npfarr\t934\ndanjou\t934\nmos burger\t934\naussichtsturm\t934\nkiosqu\t934\nvicenc\t934\nloo\t934\nforsyth\t934\nchapel rd\t934\namaru\t934\nlininskaia ul\t934\nloges\t934\nerno\t934\nbakker\t934\nestetica\t934\nnan hai dian qi t dao nan hai ben xian\t934\nextreme\t934\n45a\t934\njuncal\t934\n826\t935\nganga\t935\nodizhda\t935\nwarden\t935\nsadovaya st\t935\nsecundario\t935\nrua seis\t935\ne 371\t935\nproposed\t935\nwohnen\t935\nvitor\t935\nskholeio\t935\nautostrada serenissima\t935\npalazzina\t935\ntus\t935\nshoppe\t935\nfig\t935\na 75\t935\na d kirche\t935\nlots\t935\nevitement\t936\npontes\t936\nnelken st\t936\nnusayn\t936\nbennington\t936\ntulipan\t936\nallmend\t936\njude\t936\nciti\t936\nplacer\t936\nb6\t936\nn15\t936\nvojvodi\t936\nhals\t936\nr lamartine\t936\n3900\t936\nminskaia\t936\nsima\t937\ncatherines\t937\nkingsland\t937\nbaker rd\t937\ncr 22\t937\nmaz\t937\nahmet\t937\nreja\t937\nspringvale\t937\nwanda\t937\nvoiny\t937\npotenza\t937\nforeign\t937\ncasar\t937\nkate\t937\nlapa\t937\nchengde\t938\ncaptains\t938\ntown cr\t938\nreithalle\t938\nlilinthal\t938\nmaple rd\t938\ngallini\t938\nkaroly\t938\npata\t938\nfunes\t938\nss 3 bis tiberina\t938\ns103\t938\nevening\t938\nd 1075\t938\nprusa\t938\nelba\t938\nrana\t938\nudoli\t939\ngreggs\t939\ncommerce st\t939\ne25\t939\npusat\t939\nsamsun\t939\nrector\t939\nodessa\t939\n60n\t939\nkc\t939\nd 87\t939\nwastewater\t939\ndeal\t939\nplasencia\t939\nperry st\t939\ngoncalo\t939\nmallorca\t939\nul girtsina\t939\nmetropolitano\t940\nrunway\t940\nukraine\t940\ntrainte\t940\nplano\t940\ncoq\t940\n12 de octubre\t940\ncortina\t940\niceland\t940\nv provinciale\t940\nbobcat\t940\nstarlight\t940\narsenal\t940\njaww\t940\n24a\t940\nligne de st germain des fosses a nimes courbessac\t940\ntoti\t941\nmalone\t941\ndusseldorfer\t941\n1800\t941\ngenesis\t941\nturner st\t941\nvolleyball\t941\ncrete\t941\nwindmuhle\t941\njusticia\t941\nsidli\t941\ngalway\t941\nsila\t941\n2017\t941\ndobson\t942\nioan\t942\npapa johns\t942\nmenahem\t942\nuralskaia\t942\nerika\t942\nbabcock\t942\njing gang ao gao su\t942\nkiler\t942\nkumano kaido\t942\nmudejar\t942\ndorogi\t942\nparcours\t942\nscouts\t942\na59\t943\nmawr\t943\nsaitama\t943\npirandello\t943\nprolitarskii\t943\nconoco\t943\nparmentir\t943\nthalefnwyte\t943\ncolonial dr\t943\njunho\t943\nrua minas gerais\t943\nparsonage\t943\ntopeka\t943\ntransportnaia ul\t943\napotek\t944\nautobusz\t944\ng310\t944\nbrifkasten\t944\ns31\t944\nbellaire\t944\nfulton st\t944\npogodna\t944\njornalista\t944\negret\t944\nresidenz\t944\nsecond st\t944\nd 148\t944\nisidoro\t944\nholderlin\t944\nriverwood\t944\ntribovaniiu\t944\nband\t944\ncitadel\t944\nmh\t944\npirshotravniva\t944\ng3012\t945\n837\t945\n793\t945\nlamas\t945\nmerkur\t945\nboleslawa chrobrego\t945\nalois\t945\nnh16\t945\nkarlsruher\t945\npnc\t945\nnizavisimosti\t945\ntransilvania\t945\nlouisa\t945\ndagua\t945\nfitch\t945\ntravelodge\t945\nbanc\t945\nkolbe\t945\nfarmatsiia\t945\ndarcy\t945\nd 89\t945\nbest buy\t945\nkamila\t945\n20 de novimbre\t946\nmoore rd\t946\nyuma\t946\nmarilyn\t946\nr jean mermoz\t946\ngalilee\t946\n686\t946\nmoshe\t946\nco rd 1\t946\nv dellartigianato\t946\npira\t946\nbrem\t946\npreparatory\t946\nwhitley\t946\ncanova\t946\nangola\t946\n28k\t946\nmnr farm\t946\nn 14th st\t946\ncanal rd\t947\nchatelet\t947\ninwood\t947\ncru\t947\nrodoviario\t947\n976\t947\nmcmillan\t947\ns52\t947\narago\t947\ntasman\t947\nfranks\t947\nmk\t947\nr de source\t947\nnative\t947\ncheikh\t947\nnemzeti\t947\nolivet\t947\nmugut\t948\n166th\t948\ngazprombank\t948\nc4\t948\nrockingham\t948\nnbu\t948\ndamiano\t948\ng209\t948\nchiquito\t948\nsnp\t948\nmuniz\t948\nzalioji\t948\nsinger\t948\ndionisio\t948\nskatepark\t948\n1 74\t948\nsilishchi\t948\nellison\t948\nhyo\t949\nlocke\t949\n905000\t949\nbotica\t949\nokrezna\t949\nparker rd\t949\nkenyon\t949\nbft\t949\nbayonne\t949\nzayed\t949\npraga\t949\nlr rd\t949\nt4\t949\n957\t950\nroosevelt av\t950\nludlow\t950\nlittoral\t950\nst v\t950\nvivian\t950\nbiscayne\t950\nver\t950\nbiskupa\t950\nmidden\t950\n591\t950\nmiddlesex\t950\narmada\t950\ncary\t950\nrbc\t951\ne 119 ah8\t951\nlesperance\t951\nalternative\t951\na bahndamm\t951\nspaulding\t951\nheilige\t951\nfils\t951\nus 180\t951\nnikolaivka\t951\npushkinskaia\t951\ncanarias\t951\normeaux\t951\nteluk\t951\nrawson\t951\n1604\t951\nco rd 10\t951\nyarmouth\t951\na 73\t951\nmass\t951\nipe\t952\nrams\t952\ntule\t952\nponton\t952\n737\t952\nathenes\t952\nlhomme\t952\nus 422\t952\nkanto\t952\n824\t952\neighth\t952\nsummit dr\t952\nleach\t952\nrurale\t952\nul 1 maia\t953\nsayli\t953\n841\t953\ncra 10\t953\n844\t953\nr5\t953\nbills\t953\nb 104\t953\ndiderot\t953\nemam\t953\nnova vulitsia\t953\nst johns rd\t953\njm\t953\nsonnenhof\t953\nthompson st\t954\na 11\t954\nrosebud\t954\nsergent\t954\nny 5\t954\nkochanowskigo\t954\n982\t954\nmana\t954\npennsylvania tpk\t954\nalbverein\t954\nelagazas\t954\nreeds\t954\nb 176\t955\nsavoy\t955\nbaixas\t955\nsubaru\t955\nravenna\t955\nsbi\t955\nnorthumberland\t955\nerhard\t955\nraionu\t955\ncra 4\t955\nsign\t955\nd 90\t955\nsubs\t955\nmerzweckhalle\t955\nsaleflm\t956\nbabushkina\t956\nbusan\t956\notp bank\t956\nsavio\t956\nresende\t956\ngentry\t956\ngranby\t956\n767\t956\n693\t956\npech\t956\n1005\t956\nparker st\t956\nservis\t957\nmachi\t957\nrostand\t957\nkoroliova\t957\nlm\t957\nhein\t957\nsltalefn\t957\nsandringham\t957\nmoller\t957\ncullen\t957\ndrury\t957\nark\t957\nhardwood\t957\nul enirgitikov\t957\nsteven\t958\nbhshty\t958\nselect\t958\nweber st\t958\nmossen\t958\nalpi\t958\nonion\t958\npadana\t958\njockey\t958\nkanaalweg\t958\nharris rd\t958\nbuck cr\t958\nkathleen\t958\nfilling\t958\nvalerio\t958\nspree\t959\nmalec\t959\namur yakutsk mainline\t959\npave\t959\nkentrikes\t959\nd4\t959\nsetor\t960\naga\t960\ndenny\t960\nok 66\t960\ntourism\t960\nnordic\t960\ncaciqu\t960\nkamp st\t960\nyusuf\t960\nmaxima\t960\nslot\t960\nlaurel ln\t960\n975\t960\nhwy 7\t961\ng307\t961\nxian exp\t961\nvorderer\t961\nturf\t961\nhaiti\t961\nregistro\t961\nr des alouttes\t961\nforest preserve district of cook co\t961\nsouthport\t961\nsargent\t961\nallis\t961\nlansing\t961\ngeorgios\t962\nd 928\t962\neifel\t962\nkneipp\t962\nbeta\t962\nsalina\t962\ndiz\t962\ncaballo\t962\nlise\t962\nholly ln\t962\nword\t962\nstomatologichiskaia\t962\ncanteras\t962\nalefystgalefh\t962\n4000\t962\nheritage dr\t962\n11e\t962\nwaterviw\t963\ngu chuan\t963\nilkokulu\t963\nah31\t963\nzimmer\t963\nrose ln\t963\nst johns church\t963\nyour\t963\nbirds\t963\nbrigadeiro\t963\niva\t963\nb 303\t963\npuyrredon\t963\nlian huo gao su gong lu\t963\nlocation\t963\nwhitaker\t963\nlister\t963\nguo dao56 hao\t963\ngornaia ul\t963\nelevated\t963\nerlen st\t963\n163rd\t963\nsheriff\t964\nstriltsiv\t964\narmas\t964\nchagas\t964\nsing\t964\nmadrasat\t964\niia\t964\nkreta\t964\nfoz\t964\npotrero\t964\ncortile\t965\ne 58 e 571\t965\nedmundo\t965\nhochbealter\t965\naleflqdym\t965\nus 129\t965\nql 1a\t965\ng206\t965\ne 68\t965\nav independencia\t966\nmargaret st\t966\ntrout cr\t966\npaw\t966\ncasals\t966\nrshyd\t966\nb 56\t966\njuwelir\t966\nuddhko\t966\nligne de marseille a vintimille\t966\nthu\t966\nmorozova\t966\nboulogne\t966\npam\t966\nmarceau\t966\nannette\t966\ndhi\t966\ns14\t966\ngorkogo vulitsia\t966\nhdwd\t966\nrup\t966\ngalvani\t966\ng214\t966\njr ri li xian\t966\nwaska\t967\nchickasaw\t967\nbirig\t967\nligne de moret veneux les sablons a lyon perrache\t967\nproduktovi magazin\t967\nbronson\t967\ncourbessac\t967\neucaliptos\t967\nv belvedere\t967\npavilon\t967\ncomunal\t967\nlyndhurst\t968\nzigel\t968\na 15\t968\nmajora\t968\nsalle polyvalente\t968\nmargurites\t968\nmanse\t968\nalefrd\t968\ntransformator\t968\nlindbergh\t968\nlennox\t968\naleflsyalefraleft\t968\nola\t968\nfarnham\t968\nadrin\t968\nsummer st\t968\ndivine\t969\nkelso\t969\nmusholla\t969\nplatt\t969\nzarichi\t969\n09 27\t969\nchaika\t969\nw 11th st\t969\nstadthalle\t969\n1 d au\t969\nbankasi\t970\ne 17\t970\nkly\t970\nsampson\t970\ncitibank\t970\nyaylasi\t970\ns bway\t970\nlarge\t970\ngolfo\t970\ntis\t970\npernambuco\t970\nvalence\t970\n10e\t970\ncinnamon\t970\ndaly\t970\nmjmain\t970\ndidir\t970\nsidlungs\t970\noktiabr\t970\n946\t970\nf st\t970\ndalt\t971\nchaucer\t971\ngemeindeverwaltung\t971\nlegionow\t971\ncathedrale\t971\nfc belgrano\t971\njewelry\t971\n30a\t971\nbucks\t971\na bach\t971\nsp39\t971\nanders\t972\nbegraafplaats\t972\nsumac\t972\n937\t972\nrezende\t972\nbaracca\t972\npolizei\t972\nalp\t972\ngertrude\t972\nmetropolitana\t972\nnotarius\t972\nbrandenburger\t972\ncosme\t972\noo\t972\nwhippoorwill\t972\nthuringer bahn\t973\n836\t973\nnalefnwalefyy\t973\nerlenbach\t973\naun\t973\nbassiin\t973\nkykr\t973\nguru\t973\nosipinko\t973\nbutchers\t973\nhelios\t973\nb 247\t973\nsiberia\t973\nji ye jia\t973\n3004\t973\npenny ln\t973\nzelena\t973\nmrkhzy\t973\ncajon\t973\ncurve\t973\nzeno\t974\nstate bank of india\t974\nbreezy\t974\naman\t974\n499\t974\nv salvo dacquisto\t974\nhebert\t974\nregent st\t974\nlitchfild\t974\n57k\t974\nconca\t974\nb 44\t974\nsavi\t975\ntelstra\t975\n807\t975\ncaseta\t975\nmisisipo\t975\nlp rd\t975\ndelices\t975\neulalia\t975\nshl\t975\nb 188\t975\n687\t975\nn 122\t975\ncolmenar\t975\nazzurra\t975\nadams av\t975\nt7\t975\nkiivska vulitsia\t975\njing hu xian\t975\nsklodowskij\t975\nmandalay\t975\nst des fridens\t976\nwohnhaus\t976\nr de vallee\t976\nbuttercup\t976\nschwarzwald st\t976\nbroadmoor\t976\ndans\t976\near\t976\neaster\t976\nian\t977\nfranck\t977\ndelaware av\t977\nprix\t977\nbucher\t977\nsadovi piriulok\t977\nsept\t977\npomoshchi\t977\nbenizelou\t977\nwalmart supercenter\t977\nfryderyka szopena\t977\nvlksm\t977\nartesia\t977\ncagayan\t977\ndhaka\t977\nsportzentrum\t977\nfeldgasse\t977\ndzialkowy\t977\nsdla\t978\nprim\t978\nsr 14\t978\npepinire\t978\nvotweg\t978\ndescartes\t978\neben\t978\nadams rd\t978\nus 127\t978\nitalo\t978\nn washington st\t978\n694\t978\nrockland\t978\nwoodhouse\t978\nvente\t978\npolje\t978\nmstfalef\t978\ncommissariat\t978\nfuha yu luan huang yuki ze seohaan exp\t978\nkreuzung\t978\ndao38\t978\n861\t978\nhumphrey\t979\ngauthir\t979\nmetallbau\t979\nfreeport\t979\nswr\t979\nr anatole france\t979\ngilberto\t979\njr ao yu xian\t979\nul shchorsa\t979\nt 01\t979\ntitan\t979\nbcr\t979\nwildwood dr\t979\nallomas\t979\nfati\t979\ntrolley\t979\necheverria\t979\npuri\t979\nplzla\t979\nd 85\t979\nsilla\t980\nmarston\t980\nyokohama\t980\nfahrrad\t980\nn 110\t980\n913\t980\nsadowa\t980\nlarson\t980\ntupac\t980\nolympia odos\t980\nah70\t980\nlann\t980\nbackpackers\t980\neastviw\t980\nrua g\t980\nfrederick st\t980\ndao112\t980\nd 145\t980\nwebster st\t980\nmining\t980\n1201\t980\ncamps\t981\nseptembre\t981\nveneux\t981\ns102\t981\nk 38\t981\ncr 21\t981\nparaiba\t981\nrubi\t981\nfalefrs\t981\nama\t981\nzst\t981\nsunday\t981\npiscinas\t981\nelaine\t981\nbayard\t981\nrosecrans\t981\njollibee\t981\ns306\t982\ntowpath\t982\ndemetriou\t982\ntsby\t982\ngeorgian\t982\nnewmarket\t982\njens\t982\npolova vulitsia\t982\nlawrence st\t982\nd 910\t982\njoint\t982\nming shen gao su dao lu\t983\nmate\t983\nbal\t983\nr aristide briand\t983\nd 126\t983\nvarity\t983\nmoriah\t983\nkratka\t983\nbru\t983\ncutt\t983\ndollar tree\t983\n981\t983\nvergara\t983\nbajas\t983\npine rd\t983\nshhr\t983\ncochran\t983\n847\t984\npolig\t984\nlandsberger\t984\nflanders\t984\ntsrb\t984\nmossy\t984\n753\t984\neton\t984\nrestauracja\t984\n709\t984\ngul\t984\nron\t984\nstrandbad\t984\nkanal st\t984\nbeag\t984\nkoinoteta\t984\nlivingstone\t985\npine ln\t985\nbts\t985\ne 53\t985\nvester\t985\n11 listopada\t985\nrom\t985\ngerardo\t985\nmain ln\t985\ncheese\t985\nketteler\t985\nakker\t985\nhaw\t985\naia\t985\naleflwtny\t985\nd 133\t985\nmontano\t986\ngov\t986\nplough\t986\n597\t986\nbarron\t986\nagentur\t986\nlaar\t986\na44\t986\nnua\t986\nkommunalnaia\t986\nbernardes\t986\nlandweg\t986\nangelica\t986\nmhic\t986\nstars\t986\nariosto\t986\nhumber\t986\nvilniaus\t986\nspessart\t987\nkale\t987\nshepard\t987\nparoquia\t987\nlords\t987\ngleann\t987\nsteamboat\t987\n918\t987\nvolgy\t987\nshare\t987\nyakutsk\t987\nn dr\t987\nus 190\t987\nexpedicionario\t987\nrigas\t987\nnift\t987\nchardonnerets\t988\ntrailway\t988\nus 92\t988\nplum st\t988\ndroite\t988\nwellington rd\t988\n880\t988\nmoinho\t988\noctavio\t988\npete\t988\nrodgers\t988\nzentral\t988\nn17\t988\nkaserne\t988\nstahl\t988\naron\t988\ndisused\t988\npolice stn\t989\nulmen\t989\nceres\t989\nholanda\t989\nmyrtle st\t989\ncaminito\t989\ndanville\t989\nmeadow rd\t989\nus 119\t989\nzalefdh\t989\nescobar\t989\nbhd\t989\na 72\t989\nmaiskaia\t989\nleonel\t989\nmccarthy\t990\ngemini\t990\nprinz\t990\nkiowa\t990\nrua bahia\t990\nmcpherson\t990\ngartner\t990\nkessel\t990\nr 23\t990\nmariia\t990\nwein st\t990\nnoyer\t990\nmalaysia\t991\nbiru\t991\nbeltran\t991\ncormir\t991\nlinden av\t991\nviktor\t991\nsycamore dr\t991\nunivirmag\t991\n790000\t992\nokulu\t992\ngiorgiia\t992\ne 03\t992\nhamn\t992\nsp38\t992\n656\t992\naleflainrby\t992\nmockingbird ln\t992\ngiv\t992\naleflshhyd\t992\nswanson\t992\nwoodville\t993\nzigler\t993\nus 18\t993\nus 191\t993\nhokuriku jidosha do\t993\npelayo\t993\nkurt schumacher st\t993\nchist\t993\nmshrwain\t993\nradi\t993\nmeitetsu\t993\nbrava\t993\nnk\t993\nbayern\t994\nedson\t994\ncerros\t994\nupa\t994\ncancer\t994\nv po\t994\narbeit\t994\nul volodarskogo\t994\nhansestadt\t994\nloree\t994\ncrimson\t994\nphardt\t994\nlimerick\t994\nmel\t994\n743\t994\nalefbalef\t994\nfraun\t994\nconifer\t994\nanthonys\t994\neusebio\t995\ndellartigianato\t995\nbotanico\t995\ndong hai dao xin gan xian jr tokaido shinkansen\t995\ncrag\t995\nbalzac\t995\nkere\t995\nfeira\t995\na 24\t995\nlerchen st\t995\nromania\t995\nvhutobankusiyotupu\t995\njordi\t995\n749\t995\n587\t996\nherder\t996\n28a\t996\ncomet\t996\nrua 8\t996\nkilomitr\t996\nmediterrania\t996\ncba\t996\ngrado\t996\n14n\t996\ngras\t996\nmgc\t996\n684\t996\nmorne\t996\nerica\t996\nmays\t996\nv santantonio\t996\nik\t996\nmateus\t997\nparliament\t997\nrathenau\t997\nramiro\t997\nokq8\t997\nghost\t997\n791\t997\nripina\t997\n101 02\t997\nwines\t997\nfarley\t997\njp\t997\nfoundry\t997\nchristi\t997\ne 251\t997\nd 96\t997\nlininu\t997\ncds\t998\nalefby\t998\nforest ln\t998\ndoo\t998\ncochrane\t998\n577\t998\ngilman\t998\nisles\t998\nflynn\t998\nhusova\t998\nb8\t998\nsoldir\t999\nmarcello\t999\nassunta\t999\n953\t999\nkraft\t999\nnelken\t999\nmoat\t999\nfryderyka chopina\t999\nm20\t999\nunita\t999\njunin\t999\nsciri\t999\neo1\t999\nwashburn\t999\nlgv mediterranee\t1000\nbanen\t1000\nbukowa\t1000\najuntament\t1000\npreston rd\t1000\nwonderland\t1000\ncontact\t1000\nolimp\t1000\nblancs\t1000\nfirst st\t1000\nrodzinny\t1000\nprestige\t1000\nwaterway\t1000\nsantangelo\t1000\ntnt\t1000\n781\t1000\nmaquis\t1000\nul chirnyshivskogo\t1000\nkronen\t1001\nhamlin\t1001\nbleriot\t1001\nlong ln\t1001\nruta nacional 9\t1001\ncolmado\t1001\ngku\t1001\nfrancesca\t1001\nmohammad\t1001\ncrenshaw\t1001\ntamiami trl\t1001\nk 42\t1001\nfeliz\t1001\nfrau\t1001\n205th\t1001\ncvs pharmacy\t1001\nkrasoty\t1001\nskogs\t1001\nwindsor rd\t1001\nmalraux\t1001\npereulok\t1002\njakuba\t1002\nhasen\t1002\nkurchatova\t1002\n945\t1002\nbest western\t1002\ns digo fwy\t1002\ng324\t1002\nautozone\t1002\nchaume\t1002\ncsatorna\t1002\nmonmouth\t1002\nphan\t1002\nkhutor\t1002\ntango\t1002\nriverfront\t1002\njarnvags\t1002\npedreira\t1002\nhandel st\t1002\na 16\t1003\ncoill\t1003\ngemeenteuis\t1003\nplacita\t1003\nlaunay\t1003\nchemist\t1003\ntent\t1003\nshalefrain 1\t1003\nmahatma\t1003\nlesglesia\t1003\ndavignon\t1003\nbrookside dr\t1003\nsaale\t1003\nmosubaga\t1003\nbeeches\t1004\ndespensa\t1004\ntirishkovoi\t1004\nllys\t1004\npana\t1004\ns washington st\t1004\nwesleyan\t1004\nv dellindustria\t1004\nconner\t1004\nszabadsag u\t1004\nr st jean\t1004\noakville\t1004\ncorbin\t1004\ncementiri\t1004\nstadtische\t1004\nkerkhof\t1005\nmagna\t1005\nthailand\t1005\nkamen\t1005\nanchorage\t1005\nvillage hall\t1005\nd 900\t1005\ngeist\t1005\na 70\t1005\nomaha\t1005\nzarichni\t1005\n310th\t1005\nriccardo\t1005\narpad u\t1005\na61\t1005\n783\t1006\nspain\t1006\nbarri\t1006\nzolotaia\t1006\ns 10th st\t1006\ngibdd\t1006\nlada\t1006\nlecluse\t1006\nwashington bd\t1006\nqbr\t1006\nnkd\t1006\n22nd st\t1006\n2015\t1006\nbatea\t1006\nstipnoi\t1006\nararat\t1006\npiaui\t1006\ntomba\t1006\npunto enel\t1006\nralston\t1006\njing ban dian qi t dao jing ban ben xian\t1006\nrayon\t1007\nrostocker\t1007\narbol\t1007\nnikolaou\t1007\nugarte\t1007\ndacia\t1007\nnave\t1007\nmaidan\t1007\nmanula\t1007\nboule\t1007\n814\t1007\nlist\t1007\nbeatty\t1008\nklyte\t1008\nbjada\t1008\nfinley\t1008\nberlingur\t1008\nv dei mille\t1008\ncr 16\t1008\nxi i gao su\t1008\nmoorweg\t1008\npeaje\t1008\nmargarida\t1008\nkrasnykh\t1008\ndessous\t1008\nvenancio\t1008\nseguros\t1008\nbui\t1008\nlonesome\t1008\nmenhir\t1008\nk 33\t1009\ngaillard\t1009\nr du presbytere\t1009\nplane\t1009\npogibshim\t1009\nlydia\t1009\ncheney\t1009\nistochnik\t1009\n21st st\t1009\nd 88\t1009\nwestend\t1009\npodlesi\t1009\nmillstone\t1009\nbora\t1009\naime\t1009\nsagrada\t1009\nmono\t1010\nladeira\t1010\nginasio\t1010\nr des saules\t1010\nsquire\t1010\nlinden pl\t1010\npemberton\t1010\nfv\t1010\ninformatica\t1010\n1025\t1010\nhike\t1010\nmagnolia dr\t1010\nmartial\t1010\nsbida\t1010\nrestaurant brands intl inc\t1010\nazalefdralefh\t1011\nhrvatska\t1011\npelourinho\t1011\naltas\t1011\njuliana st\t1011\npets\t1011\nrontgen st\t1011\npica\t1011\nharrit\t1011\nkot\t1011\npharma\t1011\nb100\t1011\nskunk\t1012\ngerber\t1012\nfullerton\t1012\nmesquita\t1012\n834\t1012\n290th\t1012\nlic\t1012\ncommercial st\t1012\nbrampton\t1012\nsilta\t1012\nprairis\t1012\nmontt\t1012\nunion av\t1012\nrojo\t1012\nkala\t1013\n986\t1013\n2002\t1013\nguadiana\t1013\njeff\t1013\njanusza\t1013\nluch\t1013\nbergamo\t1013\nross st\t1013\noxley\t1013\naleflalefmalefm\t1013\nokko\t1013\nchick fil a\t1013\ncarrasco\t1013\nm 04\t1013\nsudan\t1013\n6b\t1013\nanzac\t1013\nslavy\t1013\ngervasio\t1013\n161st\t1013\ncircolo\t1013\nforn\t1013\nbasic\t1013\ngiselabahn\t1013\ncroydon\t1013\nr st martin\t1013\nbackstube\t1014\npack\t1014\narce\t1014\nkolonka\t1014\nretraite\t1014\nhang rui gao su\t1014\nkirova vulitsia\t1014\na 42\t1014\nbischof\t1014\nhastanesi\t1014\nobhardizdnaia\t1014\nchestnut av\t1014\ntwelve\t1014\ngiugno\t1014\neder\t1014\npiaski\t1014\njacquline\t1014\npetrom\t1014\nn 13th st\t1015\noccidental\t1015\nortodoxa\t1015\npriv\t1015\nopet petrolculuk a s\t1015\nclothing\t1015\nfuha yu luan huang yuki ze\t1015\nliquors\t1015\nmenendez\t1015\nhayward\t1015\nlinden ln\t1015\nannapolis\t1015\nmuara\t1015\ncedar rd\t1015\na17\t1016\ntysiaclecia\t1016\nlake shore dr\t1016\nladis\t1016\nbr 364\t1016\nasternweg\t1016\nflight\t1016\nami\t1016\ngrapevine\t1016\nd 951\t1016\nbale\t1016\nseaton\t1016\ncrewe\t1016\nhell\t1016\nseohaangosokdoro\t1017\n773\t1017\ndachni\t1017\naristides\t1017\nrhode\t1017\nsp42\t1017\n736\t1017\nneedle\t1017\nsteeles\t1017\nd 121\t1017\ndane\t1017\ncalinte\t1017\npetrolculuk\t1017\ncatalpa\t1017\nstrong\t1017\nchifa\t1017\nparkviw dr\t1017\n1250\t1017\nd 76\t1017\nd 122\t1018\nmcintyre\t1018\ng65w\t1018\nv xx settembre\t1018\n78k\t1018\nqui\t1018\nzavodskoi\t1018\nbolt\t1018\nsingh\t1018\npopolo\t1018\nus 76\t1018\ntheo\t1018\nspringfild rd\t1018\nlauren\t1018\ntrilha\t1018\nise\t1018\nlila\t1018\nmanzanita\t1018\nbeata\t1018\n917\t1018\nrigo\t1018\nsvit\t1018\nbaskin\t1018\nembajada\t1018\nd 952\t1019\n15d\t1019\nunter df\t1019\nd 201\t1019\ngemeindezentrum\t1019\nsporta\t1019\nmariners\t1019\nesculas\t1019\nolson\t1019\njingzhang\t1019\nenzo\t1019\ncreperi\t1019\ne 117\t1020\nboulder cr\t1020\ngelato\t1020\nfrainy\t1020\napex\t1020\npoland\t1020\nenfild\t1020\nhuhangyong\t1020\norchard dr\t1020\nmolini\t1020\ndammweg\t1020\ns r o\t1020\nus 183\t1020\nkonigs\t1020\nfrancisco villa\t1020\nr de lindustri\t1021\nbarda\t1021\nzacisze\t1021\npotters\t1021\nindomaret\t1021\nscenic dr\t1021\nbanyan\t1021\nmerry\t1021\nd 100\t1021\nah30\t1021\npasteleria\t1021\nlodi\t1021\nsalz bg tiroler bahn\t1021\n172nd\t1022\nnasan\t1022\nrapide\t1022\ncasars\t1022\nneru\t1022\nplinio\t1022\nhabana\t1022\nhalefdy\t1022\nprivado\t1022\nmimorial\t1022\nln5\t1022\nerzsebet\t1023\nparko\t1023\nhigh rd\t1023\njump\t1023\nsr 26\t1023\nkelvin\t1023\ncana\t1023\naleflalefbtdalefyyte\t1023\nmica\t1023\n12th av\t1023\naqabat\t1023\n15k\t1023\nrn 3\t1024\n904\t1024\nbiriozka\t1024\ndipl\t1024\nsimons\t1024\npanagia\t1024\nkrasnaya\t1024\nus 160\t1024\nslade\t1024\n756\t1024\nrivas\t1025\nmandiri\t1025\n101 03\t1025\nnachtegaal\t1025\npoincare\t1025\ntuscany\t1025\ne 92\t1025\noverlook dr\t1025\nplanita\t1025\nbarrios\t1025\nsorrento\t1025\npetrus\t1025\n815\t1025\nb 65\t1025\nhamburger st\t1025\nghar\t1026\nnolan\t1026\nsunset av\t1026\n750000\t1026\nagostino\t1026\nsweets\t1026\nwyatt\t1026\nneedles subdivision\t1026\ndn7\t1026\ntulipes\t1026\nrua cinco\t1026\nacademic\t1026\ne 47\t1026\nkios\t1026\nlade\t1026\nfabryczna\t1026\ncolt\t1027\nacton\t1027\nweisse\t1027\nmalibu\t1027\nbutts\t1027\nguidan\t1027\ng93\t1027\nscottsdale\t1027\njessi\t1027\nbey\t1027\nburma\t1027\nnational rt 9\t1027\ncluster\t1027\nbartolomeu\t1028\nm39\t1028\nmcgee\t1028\nxix\t1028\nexterior\t1028\n732\t1028\nchair\t1028\nlanzhou\t1028\nteofilo\t1028\nfussweg\t1028\n594\t1028\naleflainbd\t1028\nbleiche\t1028\n757\t1028\ngyeongbu exp s\t1028\nmindiliiva\t1028\nrussia\t1029\nmiteo\t1029\ntot\t1029\ndaudet\t1029\nlogrono\t1029\nrochdale\t1029\nsolnyshko\t1029\npure\t1029\ngoffredo\t1029\ndahlinweg\t1029\nrua 7\t1029\ndikabristov\t1029\nbici\t1029\nmorike\t1029\ndave\t1029\nsully\t1029\ngornji\t1030\nlomond\t1030\nrichchia\t1030\ngidan\t1030\n929\t1030\nnikolaos\t1030\nwee\t1030\nveicle\t1030\nkirchen st\t1030\nspringer\t1030\ntaxiway\t1030\nrussell rd\t1030\nmagistralnaia ul\t1030\nsp27\t1030\ns30\t1030\nbrel\t1030\ncavalir\t1030\nfourmile\t1031\nhospice\t1031\nsorbirs\t1031\ncr 19\t1031\nasagi\t1031\nneville\t1031\ncarn\t1031\nmaynard\t1031\neo8a\t1031\nalbatros\t1031\nrossiiskaia\t1031\nclinton st\t1031\nsundown\t1031\nkuhn\t1032\nconego\t1032\nstephani\t1032\nsquaw cr\t1032\nzbvtynsqy\t1032\nav de verdun\t1032\nvalparaiso\t1032\nv carolina\t1032\ntenth\t1032\nisinina\t1032\nsynagogu\t1032\n980\t1032\nhorner\t1032\nroll\t1032\nshore rd\t1032\ndeans\t1032\neducativo\t1032\nsharqi\t1032\nbrabant\t1032\nhire\t1033\nodawara\t1033\nbahr\t1033\nmirage\t1033\nwyzwolenia\t1033\nwelt\t1033\ndive\t1033\nsavon\t1033\nb 83\t1033\narmady\t1033\nsarsfild\t1033\n168th\t1033\nwinters\t1034\nvauban\t1034\nmusiqu\t1034\nclavel\t1034\nmerkez\t1034\ngeorgen\t1034\nulysses\t1034\ntobias\t1034\nmanga\t1034\ncleveland av\t1034\nstochod\t1034\nd 124\t1035\nvid\t1035\nsokol\t1035\nsugar cr\t1035\nfoli\t1035\njanet\t1035\nlaburnum\t1035\nsimon bolivar\t1035\ntechnician\t1035\nkhngngnyphthuuddhghlllng\t1035\nferin\t1035\npaulista\t1035\n012\t1035\nroadhouse\t1035\njujuy\t1035\nminsk\t1035\nb 26\t1035\ne 123\t1035\nslater\t1035\nr st pirre\t1036\ncarrion\t1036\nc 29\t1036\ngrantham\t1036\nmelvin\t1036\nausterlitz\t1036\ngeang\t1036\nlaboratoire\t1036\ncollege rd\t1036\n915\t1036\nbottle\t1036\ngor\t1036\ngastronom\t1036\naparcaminto\t1036\npoik\t1036\nhoog st\t1036\namerigo\t1037\nadolphe\t1037\nloust\t1037\nd 94\t1037\nmidlands\t1037\nkhlyl\t1037\nhaydn st\t1037\nsummers\t1037\nveterinaire\t1037\namandirs\t1037\nsangu\t1037\noxbow\t1037\nsp40\t1037\nkebangsaan\t1038\nvillage dr\t1038\n576\t1038\nmechanic\t1038\n914\t1038\npaxton\t1038\n930\t1038\nn14\t1038\naval\t1038\ndortmund\t1038\norange st\t1038\nfrio\t1038\nbrant\t1038\nmonza\t1038\nchiara\t1039\nmex 200\t1039\nmitchell st\t1039\nbet\t1039\nmargrit\t1039\nchirniakhovskogo\t1039\npas\t1039\njc\t1039\npimentel\t1039\nbeausejour\t1039\nr voltaire\t1039\nsonder\t1039\nsp35\t1039\nlar\t1040\nolmedo\t1040\nduna\t1040\nriverbend\t1040\nsunrise dr\t1040\nbalefg\t1040\nmrs\t1040\nmeadow dr\t1040\n1 29\t1040\nbelleza\t1040\nshino\t1040\nionia\t1041\npalme\t1041\nbockler\t1041\namador\t1041\ndhr\t1041\ngird\t1041\n960\t1041\ne rd\t1042\ndagi\t1042\ndentistry\t1042\nkovil\t1042\n758\t1042\nlori\t1042\nking rd\t1042\npineda\t1042\nbathurst\t1042\nleen\t1042\namedeo\t1042\njesu\t1043\nwolff\t1043\nbric\t1043\njing ha xian\t1043\n566\t1043\nsuvbatukusu\t1043\nhutton\t1043\nss106\t1043\nsamson\t1043\n23a\t1043\nmhsn\t1043\nappalachian trl\t1043\nziab\t1043\ndao56\t1043\nshrewsbury\t1043\ndepuration\t1043\nzaliv\t1043\nloge\t1043\nluisen st\t1044\ncheltenham\t1044\nscarlet\t1044\nkrebsbach\t1044\nhilltop rd\t1044\na31\t1044\nnadrazi\t1044\nnelson rd\t1044\ndicks\t1044\ncantonale\t1044\ncampanile\t1044\noberdan\t1044\nnoodle\t1044\nibarra\t1044\nrozhdistva\t1044\nmartinho\t1044\nsecondo\t1044\nwurzburger\t1044\nhinton\t1044\nrozsa\t1044\ns29\t1045\nmuro\t1045\niasli\t1045\nmississippi r\t1045\njung\t1045\nbartok\t1045\nirmaos\t1045\nsenator\t1045\ndorn\t1045\nraffale\t1045\nc 30\t1045\nmassa\t1045\nronchi\t1045\nzi2\t1045\nsimeon\t1045\nctr av\t1045\nkenny\t1045\nrodez\t1046\nlif\t1046\nspokane\t1046\nbanco popular\t1046\ninntal autobahn\t1046\niana\t1046\nsprint\t1046\nadventista\t1046\nkangaroo\t1046\nszopena\t1046\nr du puits\t1046\ntirimok\t1046\npacific av\t1046\nblanches\t1046\ncra 5\t1046\n29n\t1047\nkanaaldijk\t1047\nheaven\t1047\nn 611\t1047\nmadani\t1047\nborsellino\t1047\ncil\t1047\ntrillium\t1047\nmena\t1047\ne 38\t1047\ncorrectional\t1047\nprospikt mira\t1048\ngenerala wladyslawa sikorskigo\t1048\nstump\t1048\nmig\t1048\ncerrito\t1048\nbobby\t1048\n646\t1048\nenvironmental\t1048\n567\t1048\nhedge\t1048\nhalsted\t1048\nwick\t1049\npetrolimex\t1049\nmurray st\t1049\njudy\t1049\n589\t1049\naranha\t1049\nmontfort\t1049\nseng\t1049\n2001\t1049\npride\t1049\nrakoczi ferenc u\t1049\ninnes\t1049\nprist\t1049\nchipotle\t1049\ngifts\t1050\nusine\t1050\nd5\t1050\nbankia\t1050\nkhngngiinyuunniikosodd\t1050\nep4\t1050\ndeck\t1050\nlorme\t1050\nyen\t1050\nfilia\t1050\npaivakoti\t1050\nholzweg\t1050\nsklep spozywczy\t1050\nav du general leclerc\t1050\nkiss\t1051\nbore\t1051\ndotorukohisiyotupu\t1051\nboom\t1051\ndiniz\t1051\ne 27\t1051\nchester rd\t1051\nporcupine\t1051\nstrickland\t1051\nmiasta\t1051\nderesi\t1051\nstroimatirialy\t1052\navsw\t1052\nfriuli\t1052\nloft\t1052\ncake\t1052\naquatic\t1052\nny 17\t1052\nreese\t1052\nbistrot\t1052\nselecta\t1052\nchatillon\t1052\nzac\t1052\nvilikaia\t1052\nn 21\t1052\n489\t1052\naccuil\t1052\njoana\t1052\ndoze\t1052\nturia\t1052\n716\t1053\nosada\t1053\nluce\t1053\nshanno\t1053\nalumni\t1053\nabate\t1053\nreka\t1053\nsouthviw\t1053\nwilloughby\t1053\n488\t1053\nv francesco petrarca\t1053\nleland\t1053\nlinton\t1053\nhotel de ville\t1053\nharrison av\t1054\nk 50\t1054\nukrsibbank\t1054\nbelair\t1054\nmid st\t1054\netoile\t1054\npanificio\t1054\nze2\t1054\nplaines\t1054\nhuy\t1055\nferrara\t1055\nwellesley\t1055\nbingham\t1055\nshenyang\t1055\n167th\t1055\nhillside rd\t1055\nverts\t1055\n04k\t1055\nhuddersfild\t1055\nthompson cr\t1055\ne 11th st\t1055\ngeorgi\t1055\nethel\t1055\nautov ruta de plata\t1055\npl du general de gaulle\t1055\ncollet\t1055\nsmokey\t1056\ns38\t1056\nredmond\t1056\nsh1\t1056\neucalyptus\t1056\nseniorenzentrum\t1056\ncaletera\t1056\ne3\t1056\n195th\t1056\nsosnovka\t1056\nwye\t1056\nwomen\t1056\ngail\t1056\nd 93\t1056\nchute\t1057\nevangelisch\t1057\ngirolamo\t1057\nmvd\t1057\nb 243\t1057\nmetropole\t1057\nwilliam flinn hwy\t1057\nb 39\t1057\nul matrosova\t1057\ntikhaia\t1057\ngemeente\t1057\nsosnovi\t1057\npushkina st\t1057\nus 93\t1057\nthomas rd\t1057\nfrobel\t1057\nvoinni\t1057\nbutter\t1058\nrecanto\t1058\naccs rd\t1058\nwesola\t1058\npotsdamer\t1058\nzachodnia\t1058\ncelestino\t1058\noxford rd\t1058\nwickham\t1058\ngharbi\t1058\nunnamed\t1058\ntriunfo\t1059\nprinting\t1059\nd 84\t1059\nav de constitucion\t1059\nkhalefld\t1059\nstamford\t1059\nlugo\t1059\nintegral\t1059\nlund\t1059\nfou\t1059\nfleetwood\t1059\nbashnift\t1059\n1914\t1059\nprovidencia\t1059\nautov del noro ste\t1059\ngluck\t1059\nlaghi\t1059\n9e\t1060\njackson rd\t1060\nbama\t1060\nglinki\t1060\nnahal\t1060\nsz\t1060\nblumenweg\t1060\nobb\t1060\nhines\t1060\nwahdat\t1060\nage\t1060\nborki\t1060\nwspolna\t1060\niz\t1061\nsabina\t1061\n1 49\t1061\nanderungsschneiderei\t1061\nglover\t1061\nstrom\t1061\nsvetog\t1062\ncaro\t1062\nsoftball\t1062\nsora\t1062\nkeswick\t1062\nerfurt\t1062\nvorosmarty\t1062\nhaupt pl\t1062\nadministrative\t1062\nwalloni\t1062\nney\t1062\nvasut\t1063\nr des bleuts\t1063\nsmile\t1063\nevaristo\t1063\npyongyang\t1063\nmercure\t1063\ngenevive\t1063\nnum\t1063\ncolbert\t1063\nmid cr\t1063\nslaskich\t1063\nd 130\t1063\npoblacion\t1064\nalmeria\t1064\n639\t1064\ncommunication\t1064\natrium\t1064\nshooting\t1064\ncustom\t1064\ndrama\t1064\nashfild\t1064\nigrexa\t1064\nbungalows\t1064\nslobodka\t1065\nkerry\t1065\nwheat\t1065\nmola\t1065\nrolf\t1065\n628\t1065\ng108\t1065\nc 35\t1065\ngermano\t1065\nnikole\t1065\nraj\t1065\ncourtland\t1065\nsolis\t1065\nvaughan\t1065\n16 de septimbre\t1065\nelectronic\t1066\ntvorchistva\t1066\ntala\t1066\n2100\t1066\nkardynala\t1066\nostring\t1066\nzarichna\t1066\nbittencourt\t1066\ncherry av\t1066\naachener\t1066\nsummit st\t1066\nvioleta\t1066\nmaggi\t1066\nriba\t1066\nfl a1a\t1067\ngaray\t1067\n1900\t1067\naustrale\t1067\nbeato\t1067\njack 1 box\t1067\nrwd\t1067\ngrady\t1067\nnorre\t1067\nloteria\t1067\ntanqu\t1067\nmarszalka jozefa pilsudskigo\t1067\nhesse\t1068\nanhangura\t1068\npanera\t1068\ne5\t1068\nsmithfild\t1068\nnaka\t1068\nheijn\t1068\n681\t1068\nsr 11\t1068\ngage\t1069\ngalena\t1069\nenglewood\t1069\ns 9th st\t1069\nkanjo\t1069\nsecond av\t1069\nbuddha\t1069\nlogging\t1069\njr lu er dao ben xian\t1069\nsaigon\t1069\ndannunzio\t1069\nputi\t1070\nrepos\t1070\nschloss bg\t1070\napa\t1070\nstanley st\t1070\nzhong zheng lu\t1070\nhwy 97\t1070\narok\t1070\n685\t1070\nyu zhan luan huang yuki ze\t1070\nhwd\t1070\nud\t1070\ntm\t1070\nprzychodnia\t1070\namtsgericht\t1070\njembatan\t1070\nleonards\t1070\nschlossweg\t1070\nchang shen gao su\t1070\na47\t1070\nhayy\t1070\ng204\t1070\nguarda\t1070\nmemphis\t1070\nhighland rd\t1071\nnga\t1071\ncleaning\t1071\nmagde\t1071\nparma\t1071\ntaverne\t1071\nolavo\t1071\nsteve\t1071\nnext\t1072\nlevy\t1072\nespanha\t1072\nwoodland rd\t1072\ndkhtr\t1072\nzrt\t1072\n588\t1072\nrantarata\t1072\ncanadian national\t1072\nkossuth u\t1072\ngn rd\t1073\nprofesora\t1073\nruili\t1073\nharden\t1073\nkoopirativ\t1073\ngladys\t1073\ndvur\t1073\nreymonta\t1073\nkt\t1073\npakistan\t1073\nblasco\t1074\nprimitive\t1074\nkalman\t1074\nwhite st\t1074\ngrillhutte\t1074\ngracia\t1074\nyeuda\t1075\ntroitsy\t1075\nrua rui barbosa\t1075\nul voroshilova\t1075\ndellindustria\t1075\nrobert bosch st\t1075\nparedes\t1075\nverizon\t1075\ngudang\t1075\nfixme\t1075\nbowers\t1075\ngdn st\t1075\nmhp\t1075\napplebees\t1075\nsp22\t1075\npina\t1076\nldera\t1076\nolivar\t1076\nanimas\t1076\nlibrairi\t1076\nhirro\t1076\niakuba\t1076\n1083\t1076\nlangudoc\t1077\nembankment\t1077\n1 295\t1077\npl du marche\t1077\nchange\t1077\nd 940\t1077\ntesoro\t1077\noldenburger\t1077\nmittlere\t1077\ndauphine\t1077\nplate\t1077\nwad\t1078\ngp\t1078\nsilver st\t1078\neleanor\t1078\nboxwood\t1078\npesca\t1078\npha\t1078\naleflgrby\t1078\nbanqu postale\t1079\nuyng\t1079\nbirgarten\t1079\nmoises\t1079\nsot\t1079\n731\t1079\nestanislao\t1079\nd 80\t1079\nlenox\t1079\ntennisclub\t1079\ngrille\t1080\ngrazia\t1080\ncappuccini\t1080\nvilanova\t1080\ncheck\t1080\nwestmoreland\t1080\nmares\t1080\nsh 6\t1080\ntx 6\t1080\nnewberry\t1080\nn 57\t1080\nmaranhao\t1080\nasa\t1080\nproctor\t1080\nforest st\t1080\nizmir\t1080\nbiznis\t1081\nhobbs\t1081\nnashville\t1081\nriad\t1081\n1 2\t1081\nsigma\t1081\nwexford\t1081\nchudotvortsa\t1081\nmelissa\t1081\nmirni\t1081\ncolby\t1081\nc 37\t1081\nstnw\t1081\na35\t1082\nperipheriqu\t1082\nlaleflh\t1082\nalter postweg\t1082\ncivile\t1082\nst1\t1082\nzen\t1082\nler\t1082\n300th\t1082\nsudbury\t1082\nhealthcare\t1082\ngos\t1082\nhelio\t1082\nshkola 2\t1083\nsh6\t1083\norti\t1083\nmiracle\t1083\nd 73\t1083\nfriars\t1083\necole elementaire\t1083\nb 33\t1083\nkuo\t1083\nnovaia pochta 1\t1083\naris\t1083\n3801\t1083\nd 91\t1083\njesse\t1084\nkruisweg\t1084\ndresdner st\t1084\nbf pl\t1084\ntakeaway\t1084\nmuirfild\t1084\ncofe\t1084\nwestlake\t1084\njudith\t1084\nwattle\t1084\nmandarin\t1084\ntambo\t1084\nbridgeport\t1084\nlope\t1085\nsummit av\t1085\nus 16\t1085\nvarennes\t1085\nneuhaus\t1085\nsenna\t1085\nwirzbowa\t1085\nfsr\t1085\nkolej\t1086\nm 06\t1086\nsparta\t1086\npotato\t1086\nsaule\t1086\nliceum\t1086\noccidentale\t1086\n816\t1086\namicis\t1086\nstaszica\t1086\n18 36\t1086\nringvej\t1086\nwetlands\t1086\njeffrey\t1086\nd 612\t1086\nmercir\t1086\nberken\t1086\nhamel\t1086\ncement\t1087\n009\t1087\nguangzhou\t1087\npasquale\t1087\nfrankreich\t1087\ndongha\t1087\npendleton\t1087\nv primo maggio\t1087\ns 8th st\t1088\neglise notre dame\t1088\ngm\t1088\nchadwick\t1088\nmaterna\t1088\nmittelschule\t1088\nbord\t1088\neasy st\t1088\ng8511\t1088\nhuis\t1088\n10k\t1088\nresources\t1088\noneida\t1089\nnatchez\t1089\nleighton\t1089\ntamaris\t1089\nbandira\t1089\ncabrillo\t1089\nnationalpark\t1089\nsaudade\t1089\nrainer\t1089\nchrysler\t1089\nremo\t1089\ningles\t1089\nglenmore\t1089\nslide\t1089\nalfaro\t1089\nensenada\t1089\ngradinita\t1089\nus 25\t1089\ncongregation\t1090\ntokaido sinkansen\t1090\nbucuresti\t1090\nvorstadt\t1090\nn 550\t1090\nbelfast\t1090\nbrookviw\t1090\n2020\t1090\ndearborn\t1090\ns western av\t1090\ngospodnia\t1090\ncaney\t1090\ntakko\t1090\nv fratelli cervi\t1090\nkane\t1090\nwoda\t1090\nveterans memorial hwy\t1090\nchalets\t1090\ndhy\t1090\nr des erables\t1091\n782\t1091\nministris\t1091\nelan\t1091\ndeerwood\t1091\ninsurgentes\t1091\nrowy\t1091\nchristmas\t1091\nvirkh\t1091\nplanina\t1091\nferre\t1091\nosceola\t1091\nul ordzhonikidzi\t1091\nunivirsam\t1091\nrp\t1091\ndufferin\t1091\nblackwell\t1091\ncain\t1091\nn 11th st\t1092\ncanary\t1092\nn 420\t1092\nrives\t1092\npalomas\t1092\nkpr\t1092\nlutz\t1092\nboarding\t1092\nobstetrics\t1092\ncot\t1092\nus 285\t1092\nsarl\t1092\npremium\t1092\njessica\t1092\ninmaculada\t1093\nindio\t1093\nhalde\t1093\nberthelot\t1093\nfalkenweg\t1093\nfeliciano\t1093\nancint\t1093\necureuils\t1093\nbianchi\t1093\nmuhlengraben\t1093\nsalzburger\t1093\nriding\t1093\nwalefd\t1094\nbrigitte\t1094\naus\t1094\ndwight\t1094\ngranitsa\t1094\nnacion\t1094\nquvedo\t1094\nastoria\t1094\nglycines\t1094\nlongs\t1094\nperch\t1094\nqarn\t1095\nsp68\t1095\nrn12\t1095\nauxiliadora\t1095\ngagarina ul\t1095\nsalomon\t1095\nlipova\t1095\niwa\t1095\ngottfrid\t1095\nfreirr\t1095\nfournil\t1095\nfu man namazu xian shuanghwan luan huang yuki ze\t1096\ncompania\t1096\nss 16 adriatica\t1096\nk 40\t1096\ntoo\t1096\nhillcrest av\t1096\nkotsiubinskogo\t1096\ncruce ruta 5\t1096\ne 10th st\t1096\nbranden\t1096\nr de forge\t1096\nzhong shan lu\t1096\nk 32\t1096\nsparks\t1096\npowerline\t1096\n741\t1096\neisen\t1097\noch\t1097\nvives\t1097\neo3\t1097\nfrancis st\t1097\nv castello\t1097\nstifter\t1097\njackson av\t1097\nboisko\t1097\nsalah\t1097\nleman\t1097\nzakladni\t1097\narruda\t1097\nsimi\t1097\nkraftwerk\t1098\nimmobilin\t1098\nfishermans\t1098\npedregal\t1098\nbenso\t1098\njama\t1098\nmoccasin\t1098\nbuozzi\t1098\nloups\t1098\nqur st\t1098\nbata\t1098\ncr 20\t1098\nparrocchiale\t1098\ncowan\t1098\nseeweg\t1099\nloan\t1099\ne 712\t1099\ncarnegi\t1099\nsoftbank\t1099\nboi\t1099\nnavas\t1099\nmontclair\t1099\nzavodska\t1099\ntartu\t1099\nbatalla\t1099\ncalabria\t1099\nmzrainte\t1099\nbr 163\t1099\npollos\t1100\ngynecology\t1100\nb 12\t1100\nkomsomolskaya st\t1100\nkom\t1100\nhauser\t1100\nwood ln\t1100\nlillian\t1100\nbocage\t1100\ntil\t1100\nchiya\t1100\nludalt\t1100\ncairn\t1100\nsantissima\t1100\nhardin\t1100\ntaksi\t1100\nb 61\t1101\nkrasnoi biloi\t1101\nus 99 psh 1\t1101\n2009\t1101\nlhasa bahn\t1101\ncristiano\t1101\nhugelgrab\t1101\nbicentenario\t1101\n988\t1101\nqingzang railway\t1101\nxiv\t1101\nal jana pawla 2\t1101\npiccadilly\t1101\necke\t1101\ngort\t1102\nautostrada bursztynowa\t1102\nlavenir\t1102\nctra panamericana\t1102\nbromley\t1102\nheer st\t1102\nlondres\t1102\nbeograd\t1102\nstsw\t1102\nqlainh\t1102\n080\t1102\ncumbres\t1103\nrichmond rd\t1103\nmorley\t1103\ncarrascal\t1103\ns isidro\t1103\nespino\t1103\nmonks\t1103\ndiablo\t1103\ngyeongbu exp n\t1103\nbrookdale\t1103\nleys\t1103\nkeskus\t1103\norchard ln\t1103\npee\t1103\ncarry\t1103\nchaumont\t1103\nwitt\t1104\nalfiri\t1104\neglinton\t1104\ntransfer\t1104\nwiley\t1104\nneumann\t1104\npalackeo\t1104\npompirs\t1104\nascaill\t1104\nlinzer\t1104\nautostradale\t1104\nhavana\t1104\nardmore\t1104\ncarolyn\t1104\nkiur\t1105\ndaimler st\t1105\nfranche\t1105\nbunga\t1105\nvis\t1105\npennington\t1105\npviramaraathamik\t1105\nmunchener st\t1105\nnizalizhnosti\t1105\nli qun luan huang yuki ze\t1105\nprefectural\t1105\npavon\t1105\nandriia\t1105\nc 27\t1105\ncreative\t1105\nbrossolette\t1106\nmuang\t1106\nwestridge\t1106\n825\t1106\ntambak\t1106\njadwigi\t1106\napotheek\t1106\nmax planck st\t1106\nsherwood dr\t1106\nstewarts\t1106\nhydro\t1106\nmalik\t1106\nbhaile\t1106\nqala\t1106\nching\t1106\nnarodnaia\t1106\ntaxis\t1106\nyorktown\t1107\nroberts rd\t1107\na 29\t1107\nmikhailovka\t1107\nmarinho\t1107\n1600\t1107\nsalefhte\t1107\nroost\t1107\nlda\t1107\nsil\t1107\nconnaught\t1107\nsardegna\t1107\nkellogg\t1108\ngerhart hauptmann st\t1108\nradial\t1108\nklondike\t1108\nolivia\t1108\nbower\t1108\n149th\t1108\n154th\t1108\ncr 18\t1108\npatra\t1108\ncinemas\t1109\nsoler\t1109\ngdanska\t1109\nkostil\t1109\nqingzang\t1109\nwills\t1109\n742\t1109\nsp29\t1109\nsocidad\t1109\nuniv dr\t1109\nphysical\t1109\nhelmut\t1109\nauweg\t1110\njnwby\t1110\ncleveland st\t1110\nstrecke\t1110\nriverwalk\t1110\ndero\t1110\neiffel\t1110\nhwy 17\t1110\nboss\t1110\ns303\t1110\nstarr\t1110\ntamiami\t1110\nbwlwalefr\t1111\nchhalefrm\t1111\nishim\t1111\npolnocna\t1111\npetla\t1111\nlangford\t1111\ntsb\t1111\nkenton\t1111\nmatsuya\t1111\nrealty\t1111\npartyzantow\t1112\njewell\t1112\nwsi\t1112\nv circonvallazione\t1112\ngruber\t1112\nww\t1112\nrio negro\t1112\nferrovia jonica\t1112\nalmendros\t1112\nrussian\t1112\ngr rd\t1112\nst marys church\t1113\nmaki\t1113\nzeller\t1113\nduran\t1113\nlhota\t1113\ncaleta\t1113\ncastelli\t1113\nnoname\t1113\nmodesto\t1113\npamela\t1113\nvladimir\t1113\npecheurs\t1113\ncatholiqu\t1113\njinggangao exp\t1113\n498\t1113\nantirrio ioannina\t1113\nskinner\t1113\njinggangao\t1113\ncotswold\t1113\nsteam\t1114\nmarshall st\t1114\nzoll\t1114\nv s francesco\t1114\nvilela\t1114\nfinn\t1114\nhumboldt st\t1114\ndickinson\t1114\nfarmer\t1114\ntiro\t1114\nmecanica\t1114\nwestwood dr\t1114\nalhambra\t1115\nmira ul\t1115\neuropcar\t1115\nlaredo\t1115\ncento\t1115\nprazska\t1115\nhohle\t1115\nlibknecht\t1115\njeova\t1115\neki\t1115\nsiu\t1115\n676\t1115\ncarrillo\t1115\nsherbrooke\t1115\nrodney\t1115\noverton\t1115\namar\t1115\nhatchery\t1116\nmartin luther st\t1116\nstudis\t1116\nmorrow\t1116\nenea\t1116\ndecharge\t1116\nsp20\t1116\n755\t1116\nbuses\t1116\navtomagistrala\t1116\ncornelius\t1116\nantler\t1117\n280th\t1117\nmeidoorn\t1117\nhlavni\t1117\nbikeway\t1117\nlitoral\t1117\nantiqus\t1117\nkecamatan\t1117\nburo\t1117\nmedi\t1117\nbaix\t1117\npetofi u\t1117\nlux\t1117\nceara\t1117\nlynwood\t1117\nmathiu\t1117\ndeak\t1118\namin\t1118\nrua f\t1118\n780\t1118\nul turginiva\t1118\nbadajoz\t1118\na58\t1118\ngene\t1118\npay\t1118\npoints\t1118\nv firenze\t1118\nvintimille\t1119\npyramid\t1119\nm 03\t1119\nkhb\t1119\nvoss\t1119\nd 906\t1119\njr sanyo hauptlini\t1119\nainysalef\t1119\nhout\t1119\nnatali\t1119\ncalvert\t1119\ntesla\t1120\nposilok\t1120\nstift\t1120\nmex 15\t1120\nkulturi\t1120\nxxi\t1120\nrt nationale 1\t1120\n939\t1121\ncaribbean\t1121\nr du port\t1121\nkyoto\t1121\nmedicina\t1121\nsusquhanna\t1121\nyamazaki\t1121\nnile\t1121\n842\t1121\nfoley\t1122\nanderson st\t1122\nulan\t1122\nindipendenza\t1122\ncornelia\t1122\nrabochii\t1122\nguthri\t1122\nglenco\t1122\nkalna\t1122\narndt\t1122\notil\t1123\nfreiit\t1123\ndoi\t1123\ns202\t1123\nnoisetirs\t1123\n8e\t1123\n153rd\t1123\nbr 262\t1123\nwetering\t1123\n1940\t1123\nkohl\t1123\ndvt\t1123\nhohl\t1123\ntut\t1124\nbernmobil\t1124\nschleife\t1124\nhabitat\t1124\nov\t1124\n159th\t1124\ngeschaftsstelle\t1124\nbpi\t1124\nneus\t1125\nsp34\t1125\nskazka\t1125\ncandlewood\t1125\nd 110\t1125\naleflainzyz\t1125\nramada\t1125\nprospect av\t1125\npamiatka\t1125\nparamount\t1125\ntorrey\t1125\nmackay\t1126\ncarters\t1126\nbalfour\t1126\n7b\t1126\nprivokzalnaia ul\t1126\ncezanne\t1126\ngillis\t1126\nhobart\t1126\nwhitman\t1126\ncampi\t1126\nflat cr\t1126\nvrouw\t1126\nc 28\t1127\nmolodiozhni\t1127\nxiaridalg\t1127\nkirkland\t1127\nkiivskaia ul\t1127\ncadorna\t1127\nctr rd\t1127\nuri\t1128\ntenmile\t1128\nbookstore\t1128\npirogova\t1128\nfrey\t1128\nresidencias\t1128\ngrenze\t1128\nsinna\t1128\naleksandar\t1128\nhay cr\t1128\nsamara\t1128\naleflainlyalef\t1128\nmeyers\t1128\ndata\t1129\ncorinth\t1129\ntsiolkovskogo\t1129\npyhrn autobahn\t1129\nmoltke\t1129\nnabrezi\t1129\nbel air\t1129\n948\t1129\n821\t1129\nanns\t1129\npct\t1129\ndabrowa\t1130\nboczna\t1130\nanglais\t1130\nschmitt\t1130\nkelsey\t1130\nkastaninallee\t1130\nd 79\t1130\njr sanyo main ln\t1130\nneuville\t1130\nrua duqu de caxias\t1130\noakfild\t1130\npadilla\t1130\ngalvez\t1131\nevangelischer\t1131\ncr 13\t1131\nwinton\t1131\nah45\t1131\naxa\t1131\ncampbell rd\t1131\nhoughton\t1131\nianki\t1131\nscott rd\t1131\nparcare\t1131\nr des genets\t1132\nnaturpark\t1132\n151st\t1132\ntossal\t1132\nexhibition\t1132\n157th\t1132\nhaul\t1132\nsp32\t1132\nkurze st\t1132\nperes\t1132\nwarren st\t1133\nstol\t1133\ncr 14\t1133\nportales\t1133\ncedars\t1133\njob\t1133\neemaliges\t1133\npkld\t1133\nspbu\t1133\nvisinniaia ul\t1133\ngreenviw\t1133\nhurtado\t1133\nhadi\t1133\nsenor\t1133\nreisen\t1133\npine dr\t1134\nhey\t1134\nlegalite\t1134\nm31\t1134\nchuo exp\t1134\nives\t1134\nbassett\t1134\ngyeongbugosokdoro\t1134\nindoor\t1134\nnorthviw\t1134\n164th\t1134\namos\t1134\ntheresa\t1134\ncamellia\t1135\n777\t1135\nsmoky\t1135\nsunset ln\t1135\nrobinson rd\t1135\nmanfred\t1135\nsipen\t1135\nwinfild\t1135\nrichnoi\t1135\nul uritskogo\t1135\nsr 2\t1135\np4\t1136\nbandeirantes\t1136\nsandalwood\t1136\nchartres\t1136\nrichka\t1136\nsuite\t1136\nyoshinoya\t1136\n733\t1137\nvinne\t1137\nadvance\t1137\nteile\t1137\nstations pln\t1137\nbalnr\t1137\nmly\t1137\nv aurelia\t1137\n6340\t1137\nnormal\t1137\nschwabischer\t1138\nyu in neng cu luan huang yuki ze\t1138\ntraversire\t1138\nkung\t1138\nherring\t1138\nmule\t1138\ntextil\t1138\nbiotop\t1138\naparcabicis\t1138\nchak\t1138\n11th av\t1138\nfontes\t1138\nvallees\t1139\ntampa\t1139\ncampagne\t1139\nkabir\t1139\ncomedor\t1139\nforty\t1140\npossum\t1140\nnatura\t1140\nlg\t1140\nlyndon\t1140\nmjtmain\t1140\nnational rt 2\t1140\ne 134\t1140\nsavage\t1140\n747\t1140\nkestrel\t1140\npemukiman\t1140\nhodges\t1140\ncaldas\t1140\nplastic\t1140\nhercules\t1141\naw\t1141\nflinn\t1141\nmemet\t1141\nsp24\t1141\nss9\t1141\nitaliana\t1141\nwrzosowa\t1141\nedna\t1141\nd 127\t1141\ne 571\t1141\nmasonic\t1141\nallees\t1141\nguinea\t1141\nchalk\t1141\nwigury\t1142\npitrovskogo\t1142\nimmaculate\t1142\nnaves\t1142\nbullock\t1142\njazmin\t1142\npalmar\t1142\nsp28\t1142\n973\t1142\nalban\t1142\nstefana zeromskigo\t1143\nv silvio pellico\t1143\nlongfellow\t1143\ne 14th st\t1143\ntha\t1143\nnadizhda\t1143\n548\t1143\ndubrava\t1144\nhamm\t1144\nshangridalg\t1144\ncherrywood\t1144\ndickens\t1144\nasri\t1144\neuropaweg\t1144\n909\t1145\nlinke\t1145\ntropa\t1145\nyonge\t1145\nclark rd\t1146\npapin\t1146\ncalcada\t1146\ndrayton\t1146\nthatched roof\t1146\nsvitlaia ul\t1146\nfrindly\t1146\ncommunautaire\t1146\nedgewood dr\t1146\npineta\t1146\nsaskatchewan\t1146\nsuq\t1146\nkollwitz\t1146\nplanche\t1146\nmakhfar\t1146\ndecathlon\t1146\ncovert\t1146\nyukon\t1146\nrino\t1147\noak rd\t1147\nterezinha\t1147\nimage\t1147\neastern av\t1147\nfleury\t1147\nrum\t1147\ncaledonia\t1147\npetri\t1147\namg\t1147\nol\t1147\ndua\t1147\nzimmermann\t1147\nvorovskogo\t1147\nubayd\t1147\nlouisville\t1147\n728\t1148\norpi\t1148\nelisa\t1148\nritchi\t1148\nvalley vw dr\t1148\ndominiqu\t1148\n31a\t1148\nbranka\t1148\nluno\t1148\nmarsala\t1148\nmattei\t1148\nbelgin\t1149\nnetwork\t1149\nautoservice\t1149\nboden\t1149\nbarneage\t1149\nbnzyn\t1149\nntt\t1149\nb 16\t1149\nlongu\t1149\nurbana\t1149\nflorencio\t1149\nbliss\t1149\nsauveur\t1149\narenales\t1149\njuanita\t1149\ngrecia\t1149\nseikomato\t1150\nav c\t1150\nrocky cr\t1150\nsimao\t1150\nllobregat\t1150\nsyngl\t1150\nkiosco\t1150\ngwangju\t1150\numar\t1150\n260th\t1150\ncheng kun xian\t1150\nili\t1150\nparquo\t1150\nmuslim\t1150\naldama\t1151\ncomputers\t1151\ncumbre\t1151\ncharco\t1151\nbizet\t1151\ngermania\t1151\ncampsa\t1151\nkelley\t1151\nviktoria\t1151\nbarnard\t1151\nwet\t1152\ncayetano\t1152\nreabilitation\t1152\nr haute\t1152\nthirs\t1152\namado\t1152\ns av\t1152\ncopec\t1152\nbaita\t1152\ncordeiro\t1152\nv italia\t1152\nbrent\t1153\nculver\t1153\nenero\t1153\nguys\t1153\n930000\t1153\nalefdalefrh\t1153\n158th\t1153\ncolor\t1153\nann st\t1154\ntallinn\t1154\nsmith cr\t1154\nadana\t1154\nlube\t1154\n22a\t1154\nputra\t1155\nhofladen\t1155\nkevin\t1155\nikatirin\t1155\nguo dao1 hao xian\t1155\nnorway\t1155\nacosta\t1155\nwqwd\t1155\ntifgarage\t1155\nobuvi\t1155\ndresdener st\t1156\njing hu gao su gong lu\t1156\nfutebol\t1156\ntampereen\t1156\nmojon\t1156\n691\t1156\nrua quatro\t1156\nsiam\t1156\nmckinney\t1156\n1 wisengrund\t1156\nvinogradnaia ul\t1156\nnew york state thruway\t1156\njasmin\t1156\nsonnenhang\t1156\ndusty\t1157\nmarketing\t1157\nn 340a\t1157\nmt zion church\t1157\nus 74\t1157\ndao8\t1157\nzrini\t1158\namt\t1158\npalmerston\t1158\npyhrn\t1158\nsachs\t1158\ncreamery\t1158\ncycleway\t1158\njungbu\t1158\noakviw\t1158\nticket\t1158\ns19\t1158\nfernao\t1158\nsulzbach\t1158\neinheit\t1158\nrqm\t1158\npks\t1158\ndenki\t1158\nblack r\t1159\nbradshaw\t1159\nr des roses\t1159\nipswich\t1159\nbeaute\t1159\nrepublika\t1159\nss7\t1159\ntafel\t1159\n1700\t1159\necolirs\t1159\ndobra\t1159\nbim\t1159\nco rd 2\t1159\nsvaty\t1159\nfeurwerhaus\t1159\naptos\t1159\nfenton\t1159\nferdinando\t1160\nbiriozovaia ul\t1160\nbrj\t1160\ncercle\t1160\nsta lucia\t1160\nnorthampton\t1160\ncrss rd\t1160\ntes\t1160\nmagallanes\t1160\nn 332\t1160\ncr 17\t1160\nkht\t1160\nhohen st\t1160\nmagnus\t1161\nvinto\t1161\nfichten\t1161\ng 3\t1161\nn 12th st\t1161\ngordon st\t1161\n664\t1161\npalestra\t1161\nfairviw rd\t1161\nwertstoffhof\t1161\n011\t1161\ntasso\t1161\nstokhid\t1161\nzwirki\t1162\nligne lyon marseille\t1162\nkilinskigo\t1162\nsim\t1162\nmarius\t1162\nfarm rd\t1162\nskolni\t1162\ncompass\t1162\nvasile\t1163\nkiivska\t1163\nraccordement\t1163\nwestfalen\t1163\nzhukovskogo\t1163\nblackhawk\t1163\na 52\t1163\nlangevin\t1163\nkoshivogo\t1163\nhorse cr\t1163\nsupercenter\t1163\ngoshen\t1163\nkillarney\t1164\nwarga\t1164\ncharity\t1164\ncros\t1164\nb 299\t1164\ngreenleaf\t1164\nind dr\t1164\nbiuro\t1164\n139th\t1164\njosipa\t1164\n942\t1164\nfrazir\t1164\nmusikschule\t1165\n771\t1165\nv palmiro togliatti\t1165\ntama\t1165\nmccormick\t1165\n1960\t1165\ng72\t1165\nbraunschweig\t1165\nrailway st\t1165\noliga\t1165\nekspriss\t1165\n270th\t1165\ndisel st\t1165\nbkhsh\t1166\npreem\t1166\ncypress st\t1166\ndoktora\t1166\nanibal\t1166\njr dong bei xian\t1166\ntaiwan\t1166\nrowe\t1166\npionirskii\t1166\nroz\t1167\nauckland\t1167\neugenia\t1167\nalgonquin\t1167\ntoren\t1167\nmascagni\t1167\nmigul hidalgo\t1167\ninntal\t1167\ncitta\t1167\nwoodland av\t1167\nbrana\t1167\newing\t1167\ndorleans\t1168\nbethel church\t1168\ngiotto\t1168\na 46\t1168\nulster\t1168\ndarling\t1168\nzox\t1168\nchesapeake forest lands\t1168\njakarta\t1168\nrua 6\t1168\n3807\t1168\nsektion\t1168\ncatawba\t1168\npl de constitucion\t1169\npflegeeim\t1169\nc d\t1169\nwalker rd\t1169\nwindward\t1169\nvespucci\t1169\naleflshrqy\t1169\nfeu\t1169\nfronton\t1169\nraposo\t1169\nnorde\t1169\nburbank\t1170\nhillsborough\t1170\ntaho\t1170\nmunro\t1170\n809\t1170\nmiss\t1170\nmeredith\t1170\n021\t1170\nmijska\t1171\nhalefjy\t1171\nautoroute est oust alefltryq aleflsyalefr shrq grb\t1171\npagnol\t1171\nautostrada del brennero\t1171\nverlaine\t1171\ndow\t1171\nkunst\t1171\nmilitaire\t1171\nss18\t1172\npitir\t1172\nd 907\t1172\nnaranjo\t1172\ngunter\t1172\nsturzo\t1172\nzhong guo dao\t1172\nflood\t1172\nv emilia\t1172\nlakewood dr\t1172\nbros\t1172\npkt\t1172\neuropean\t1173\nc3\t1173\ndacha\t1173\nbanner\t1173\nbuxton\t1173\nsp41\t1173\nbrewster\t1173\ntulpen st\t1173\nfinken\t1173\nbreton\t1173\nr de letang\t1173\nwillowbrook\t1173\nnwr\t1174\nadalbert\t1174\nadria\t1174\nv gorizia\t1174\nwalther\t1174\nnivskogo\t1174\ndezembro\t1174\nhillcrest rd\t1174\n1 495\t1174\nhinterm\t1175\nkonig st\t1175\nadige\t1175\nwestover\t1175\nsrvirama\t1175\nshirokaia\t1175\nmusashino\t1175\nhomewood\t1175\nstratton\t1175\nd 125\t1175\nselma\t1175\nmerle\t1175\nlauferstein\t1176\ntreff\t1176\nlinin olitsa\t1176\nasse\t1176\nhooper\t1176\nbaia\t1176\ndavila\t1177\ntanya\t1177\njuzgado\t1177\nbilain\t1177\npm\t1177\narodrom\t1177\nsorozo\t1177\ndormitory\t1177\n88n\t1177\nseminario\t1177\ns32\t1177\ntren\t1177\ngabor\t1178\nfairbanks\t1178\npeloponnese\t1178\npirikristok\t1178\nmartin rd\t1178\nbaptista\t1178\n99e\t1178\nregione\t1178\n1150\t1178\ncolinas\t1178\ncra 7\t1178\nrabat\t1179\nhatfild\t1179\nelk cr\t1179\nsp25\t1179\npje\t1179\nmameli\t1179\n919\t1179\ncr 11\t1179\ngsm\t1179\npung\t1179\nconcha\t1179\nrea\t1179\nkhristo\t1179\nlios\t1180\ncamelia\t1180\n752\t1180\ngemeinschaftspraxis\t1180\nhameenlinnan\t1180\nbuttu\t1180\nkaple\t1180\nflinders\t1180\nwinslow\t1180\nfundacion\t1180\npusto\t1180\nhol\t1180\nbotanical\t1180\nmix\t1180\nnakhimova\t1181\nyoung st\t1181\ntelegraph rd\t1181\nernst thalmann st\t1181\ndez\t1181\nedmund\t1181\nmahdi\t1181\nmira st\t1181\nweiler\t1181\nrn 1\t1181\n143rd\t1182\nstadtpark\t1182\nshkola 1\t1182\n865\t1182\nnorbert\t1182\nchu guang\t1182\nvilikoi\t1182\nsand st\t1182\nmalcolm\t1182\n871\t1182\n806\t1182\npetronas\t1183\nwaller\t1183\nrobins\t1183\nverwaltung\t1183\nhideaway\t1183\nfc mitre\t1183\nbol\t1183\na mkt\t1184\nwarm\t1184\nhobby\t1184\nallen rd\t1184\nfinanzamt\t1184\nshade\t1184\n875\t1184\nvaldivia\t1184\n496\t1184\nmqhalef\t1184\ndiversion\t1184\ndepartamentos\t1184\nwinds\t1185\nautobidea\t1185\ndelikatesy\t1185\npotosi\t1185\nn16\t1185\nsolferino\t1185\nphelps\t1185\nbelgica\t1185\nbrookville lake fee title bdy\t1185\nouter ring rd\t1185\nandad\t1186\nul komarova\t1186\nnogal\t1186\nr du general leclerc\t1186\nsmpn\t1186\ncharmilles\t1186\nerfurter\t1186\n32k\t1186\nlimes\t1186\nasis\t1186\nmatteo\t1186\nyucca\t1186\nv martiri della liberta\t1186\nparkovi\t1186\njanka\t1186\nlarami\t1186\n722\t1186\nv isonzo\t1186\ncentral st\t1186\nsection 2\t1186\nhonam exp\t1186\nbroom\t1187\ndorfe\t1187\nhatch\t1187\nkazakhstan\t1187\nneil\t1187\ncantabria\t1187\nguan yu zi dong ch dao\t1187\ncolin\t1187\nblaine\t1187\nalte post st\t1187\neiken\t1187\nkingsbury\t1187\ndoire\t1187\nramo\t1187\nexcelsior\t1187\nmontauban\t1187\nseit\t1187\nholiness\t1187\npanoramica\t1187\nmaso\t1187\nfria\t1188\nconception\t1188\nperal\t1188\nw 9th st\t1188\na29\t1188\ncoldwater\t1188\nclaus\t1188\nveronica\t1188\ninland\t1188\nbone\t1189\nlance\t1189\nkennedy rd\t1189\n1c\t1189\nvov\t1189\nfournir\t1189\nr notre dame\t1189\nhinterer\t1189\nperrin\t1189\nsr 1\t1189\nmontpellir\t1189\nmaiden\t1190\ngreenbelt\t1190\nhaines\t1190\nseaside\t1190\nbrandywine\t1190\npapeleria\t1190\nenfants\t1190\nministro\t1191\nep2\t1191\npivo\t1191\ncy\t1191\njonathan\t1191\nwinthrop\t1191\npatriot\t1191\ncr dr\t1191\nwholesale\t1191\n744\t1191\nmurirs\t1191\nkama\t1191\ncele\t1192\nloco\t1192\n726\t1192\ndantas\t1192\nbr 230\t1192\nmonastyr\t1192\nhartmann\t1192\noaklands\t1192\npomona\t1192\nnido\t1193\nhillsboro\t1193\nnovara\t1193\nkumano\t1193\nhays\t1193\nfontan\t1193\nvespucio\t1193\nsalta\t1193\nhri\t1193\nyellowstone\t1193\ngalloway\t1193\narias\t1193\nyainqb\t1194\n768\t1194\ntownhomes\t1194\na 33\t1194\npremire\t1194\nnives\t1194\nrbyn\t1194\nclay st\t1194\nkommunarov\t1194\nmccoy\t1194\nnz\t1194\nplantes\t1194\neinaudi\t1195\nlos pinos\t1195\nzyx\t1195\nmoore st\t1195\nbia\t1195\napostol\t1195\nbethesda\t1195\nlagir\t1195\nwork\t1195\nbacon\t1195\ndadao\t1195\ngem\t1195\nzahradni\t1196\nboot\t1196\njohnson cr\t1196\nold mill rd\t1196\nminor\t1196\nravin\t1196\nclemens\t1196\nainlyalef\t1196\nneo\t1196\nnenni\t1196\nferia\t1196\nazinda\t1197\nold us 99\t1197\nholloway\t1197\nringweg\t1197\nhera\t1197\nus 277\t1197\npalestine\t1197\nblancas\t1197\nindianapolis\t1197\nloi\t1198\nwhiskey\t1198\nface\t1198\nnouveau\t1198\nfell\t1198\nmoonlight\t1198\nus 91\t1198\nasema\t1198\nb 55\t1198\nneuapostolische\t1199\nhaarstudio\t1199\ntransportnaia\t1199\ncairoli\t1199\navtomobilnaia\t1199\ncub\t1199\nkinderhaus\t1199\ncanadian r\t1199\nets\t1199\nhackberry\t1199\nrisco\t1200\nmaddalena\t1200\ngarni\t1200\nbori\t1200\naustralia post\t1200\nmint\t1200\nmink\t1200\nbarthelemy\t1200\nd 74\t1200\nv giovanni xxiii\t1200\nlhasa\t1200\nalligator\t1200\nsobiskigo\t1201\ntercera\t1201\nsheraton\t1201\nbaird\t1201\nk 39\t1201\ndachi\t1201\nhmzte\t1201\n1400\t1201\nrua sete de setembro\t1201\nk 28\t1202\nirtysh\t1202\nbibliothek\t1202\nribas\t1202\neldridge\t1202\nselo\t1202\nbeatrice\t1202\nlonghai ln\t1202\nelmhurst\t1202\nmenez\t1202\ncollingwood\t1202\nbeke u\t1202\nfestival\t1202\ncarbon\t1202\n657\t1203\n024\t1203\npecos\t1203\neastside\t1203\nyeni\t1203\nbuonarroti\t1203\nviktoriia\t1204\ne 9th st\t1204\nmid rd\t1204\nschutzhutte\t1204\ndonizetti\t1204\nyeongdong exp\t1204\nwestautobahn\t1204\nbnk\t1204\nnewlands\t1204\nulmer\t1204\nettore\t1204\ncr 6\t1204\nquintino\t1204\nneubau\t1204\nkurpark\t1204\nbell st\t1204\nbrake\t1204\nbaren\t1205\nlaurel st\t1205\nvilika\t1205\nqimmat\t1205\nmaha\t1206\nhigura\t1206\nviadotto\t1206\nmulberry st\t1206\nd400\t1206\n146th\t1206\ngino\t1206\names\t1206\ng210\t1207\ne 23\t1207\nholbrook\t1207\npa 8\t1207\nhilda\t1207\nbuchhandlung\t1207\nus 33\t1207\nholunderweg\t1207\nd 123\t1207\ncardiff\t1207\nspringwood\t1207\nmodena\t1208\nsp18\t1208\nklinichiskaia\t1208\nberkley\t1208\ncliffs\t1208\ncindy\t1209\nsp30\t1209\nkompleks\t1209\nt3\t1209\njustin\t1209\nkrug\t1209\nsparda\t1209\narlindo\t1209\ntraffic\t1209\ncommunications\t1209\nrampa\t1209\nlug\t1210\nav de liberation\t1210\n999\t1210\nsaline\t1210\nmaximo\t1211\nshmidta\t1211\nraintree\t1211\nmetsa\t1211\n023\t1211\njapan\t1211\naan\t1212\nbanana\t1212\ncarls\t1212\nrit\t1212\nrosal\t1212\ncoma\t1212\noddzial\t1212\nlewis st\t1212\nluhli\t1212\nnorthridge\t1213\nlincoln rd\t1213\nudine\t1213\njudas\t1213\ng316\t1213\nserenissima\t1213\nrozana\t1213\n162nd\t1213\nshywy\t1213\nsingle\t1213\nquit\t1213\nb 22\t1213\nbeal\t1213\nstall\t1214\nco op\t1214\nhalfway\t1214\nus 65\t1214\njj\t1214\nsylvia\t1214\nnuo\t1214\nrupert\t1214\nlavoisir\t1214\nvv\t1215\nelms\t1215\nlake av\t1215\nakazinweg\t1215\nakademi\t1215\nshalom\t1215\nhokkaido\t1215\nhaas\t1215\ncedarwood\t1216\nbelfort\t1216\nbratskaia\t1216\nreichenbach\t1216\n678\t1216\nsp26\t1216\n340a\t1216\npartizan\t1216\njr ji shi xian\t1216\nscarborough\t1217\nsection 1\t1217\ngall\t1217\nvinogradnaia\t1217\ngoodman\t1217\ndellinfanzia\t1217\nmistsivogo\t1217\npl de espana\t1217\nbermuda\t1218\nharz\t1218\n582\t1218\nfif\t1218\nivanho\t1218\ntirgarten\t1218\nhwy 11\t1218\nv lombardia\t1218\nbreitscheid\t1218\nd 108\t1218\n595\t1218\ngyeongbuseon\t1218\nboise\t1218\npiana\t1219\ntest\t1219\nkoltso\t1219\ntsarkva\t1219\nconselheiro\t1219\nmaldonado\t1219\n5 de mayo\t1220\n3806\t1220\nlabrador\t1220\ng105\t1220\nquad\t1220\nabou\t1220\nfirst av\t1220\ncuartel\t1220\ntouche\t1220\nmontello\t1220\nstan\t1220\n811\t1220\nlaluan\t1221\npadua\t1221\nwillow dr\t1221\ncerrillo\t1221\nkerkweg\t1221\nk 35\t1221\nbni\t1221\nschron\t1222\ninglewood\t1222\nw 10th st\t1222\nstiftung\t1222\njewel\t1222\nkhlib\t1222\nmensa\t1223\ndickson\t1223\nvostok\t1223\noso\t1223\ncrockett\t1223\navtomagistral tiugoku\t1223\nzags\t1223\ncrestviw dr\t1223\nchrobrego\t1224\nhannoversche\t1224\nn 85\t1224\ng107\t1224\nr 21\t1224\nrua santo antonio\t1224\nd 83\t1224\naula\t1224\npizzo\t1224\nlonghai\t1224\nchopina\t1224\nadobe\t1224\nrua sao jose\t1224\nadi\t1224\ncerca\t1224\nperalta\t1224\nzhun\t1224\nhall st\t1224\nbuttes\t1224\nwoodford\t1225\nnational rt 1\t1225\nchiang\t1225\nschwalbenweg\t1225\nvial\t1225\nlagerhaus\t1225\ncarrefour express\t1225\n185th\t1225\nmillpond\t1225\ncornerstone\t1226\ntiberina\t1226\ndosso\t1226\nmuir\t1226\nschreinerei\t1226\ndouro\t1226\n912\t1226\npolova\t1227\nchacabuco\t1227\nbrandy\t1227\nheuweg\t1227\ntiugoku\t1227\ntrujillo\t1227\nbeuken\t1227\npromyshlinnaia ul\t1227\nrankin\t1227\ncreuse\t1227\nevzoni\t1227\nbrahms\t1228\n932\t1228\nqinhuangdao\t1228\nklang\t1228\ngifhorn\t1228\ncyclable\t1228\npoole\t1228\nvali\t1228\naleflkbyr\t1228\ncrazy\t1228\nserenity\t1228\n936\t1229\n156th\t1229\ngedenkstein\t1229\ncarmine\t1229\nnatwest\t1229\nbobs\t1229\nsadovaya\t1229\nd 66\t1229\nvisinniaia\t1229\nengen\t1230\nfest\t1230\n479\t1230\nbarrel\t1230\ncountry club rd\t1230\ngables\t1230\nm 1\t1230\nnatal\t1231\nk 24\t1231\ne 462\t1231\nhameen\t1231\ncarpet\t1231\ngalen\t1231\nbrgy\t1231\n20th st\t1231\n569\t1232\nbastion\t1232\nleagu\t1232\nrejon\t1232\nayt\t1232\nbarrera\t1232\nescondido\t1232\nshoppers\t1232\ncornish\t1232\ncowboy\t1232\nblick\t1232\nguildford\t1232\nbahnhofs\t1232\nsalerno\t1232\nschlosspark\t1233\nmedica\t1233\nafter\t1233\noleander\t1233\nladen\t1233\nweisser\t1233\nlay\t1233\navtomagistral sanhardio\t1233\ncaserne\t1234\naleman\t1234\ncarleton\t1234\nchugoku exp\t1234\nfin\t1234\ngeral\t1234\nchat\t1234\ntrans canada\t1234\n822\t1234\ng80\t1235\n881\t1235\nhide\t1235\nfeeder\t1235\narzteaus\t1235\ngarner\t1235\nrowland\t1236\nargos\t1236\nlecia\t1236\nbachgasse\t1236\ncarlson\t1236\nmis\t1236\nr lenine\t1236\nsura\t1236\nequstrian\t1236\nbasso\t1236\ndollar general\t1236\ninnovation\t1236\nkomsomolskaya\t1237\nhoang\t1237\nferris\t1237\nginsterweg\t1237\nstruma\t1237\nsummerfild\t1237\nhokurikuzidousiyadou\t1237\nnose\t1237\nmaza\t1237\nrochelle\t1237\ntrassa\t1237\npradera\t1237\nceska sporitelna\t1238\nvillirs\t1238\nquito\t1238\nykhm\t1238\njohannis\t1238\ncarnes\t1238\nbyvshii\t1238\nescolar\t1239\nnalefsr\t1239\ngrant av\t1239\nbarley\t1239\nohg\t1239\nchamber\t1239\nhongha\t1239\nhinden bg st\t1239\npmp\t1239\nalvear\t1239\ngoodwill\t1240\nhen\t1240\nmoser\t1240\nbader\t1240\n586\t1240\nqalefain\t1240\nfraga\t1240\nhuit\t1241\ndireccion\t1241\n934\t1241\nnixon\t1241\nskyway\t1241\nclass\t1241\nav charles de gaulle\t1241\nmains\t1241\nb7\t1241\nvenice\t1241\ncatfish\t1241\nkupaly\t1241\nnewbury\t1242\nswbr\t1242\ntaunus\t1242\nr des champs\t1242\nappleton\t1242\nhugel\t1242\nojo\t1242\nstory\t1242\nlauri\t1242\norchard rd\t1242\nrand\t1242\nkrishna\t1242\narma dei carabiniri\t1242\nlorenz\t1242\ngermany\t1242\nbourbon\t1242\nshrtte\t1242\nrahman\t1242\nchiropractic\t1242\nsapporo\t1242\nmarii konopnickij\t1242\nbasses\t1242\nsou\t1243\nkosmodimianskoi\t1243\nrakoczi u\t1243\nbrea\t1243\nvenustiano\t1243\nerr\t1243\nwalnut av\t1243\nbilinvistbank\t1243\nncleo\t1243\nswedbank\t1243\nhadley\t1243\ndalam\t1243\nbelem\t1243\nus 78\t1244\nneve\t1244\nfarmhouse\t1244\n659\t1244\nivo\t1244\nbutterfild\t1244\n735\t1244\ngould\t1244\nsaind\t1244\nrosalia\t1244\njr shan in xian\t1244\neliza\t1244\nsr2\t1244\ncanas\t1245\nrozen\t1245\nsviaznoi\t1245\niminia\t1245\ngasolinera\t1245\ne 29\t1245\ntepe\t1245\n674\t1245\nmolle\t1245\npyrgos\t1245\nmontenegro\t1246\nmoskvy\t1246\nfortunato\t1246\nochoa\t1246\ngk\t1246\ngrenz\t1247\nul maksima gorkogo\t1247\na39\t1247\ngaidara\t1247\nfonda\t1247\nk 34\t1247\nn 19\t1247\ncloverdale\t1247\nd 114\t1248\nmichelet\t1248\nfausto\t1248\nmaximilian\t1248\nkasseler\t1248\noblastnaia\t1248\ntransports\t1248\nsalao\t1249\nhh\t1249\nmahanaviramadaviramara raaajaviramamaaaraviramagavirama\t1249\nraaajaviramamaaaraviramagavirama\t1249\nr nationale\t1249\nhonduras\t1249\nqunha\t1249\nved\t1249\nszpital\t1249\ndacquisto\t1250\nch dexploitation\t1250\ndaang\t1250\nvtb\t1250\nkatherine\t1250\nsetany\t1250\noficial\t1250\npotraviny\t1250\nsomme\t1250\npolizia\t1250\nb 49\t1250\nkrylova\t1250\ntomei kosoku doro\t1251\nesprit\t1251\nah1 ah2\t1251\ncampbell st\t1251\ntoumeikousokudouro\t1251\npetro canada\t1251\nkil\t1251\nnurnberger st\t1251\ncollege av\t1252\nasociacion\t1252\namendola\t1252\nemt\t1252\ndukes\t1252\npinsons\t1252\nzufahrt\t1252\nalefljzalefyr\t1252\nelvira\t1252\nheinrich heine st\t1252\nmingo\t1252\nkur\t1253\nportes\t1253\nbremer st\t1253\nvest\t1253\nlazaro cardenas\t1253\nkolasa\t1253\ndaevsviramathaaan\t1253\nbur\t1253\nvictoire\t1253\nvicente gurrero\t1253\nvasilia\t1253\nvalley dr\t1253\nwhitetail\t1253\ncivico\t1254\nhaltestelle\t1254\ncuarto\t1255\nmontevideo\t1255\nblackwood\t1255\nmikolaja kopernika\t1255\ncovenant\t1255\nestados\t1255\nveracruz\t1255\nobrin\t1255\nhawks\t1255\nburgers\t1255\nenergi\t1255\ntobacco\t1256\ndarlington\t1256\nrot\t1256\nmanzano\t1256\nbogota\t1256\nguynemer\t1257\nciro\t1257\ngurin\t1257\nshelley\t1257\ngorges\t1257\nmoret\t1257\nstonewall\t1257\nrosselli\t1257\nshmalefly\t1257\nwitosa\t1257\n717\t1257\nbrennerautobahn\t1257\nvet\t1257\nvalentino\t1258\nkeisei\t1258\nd 72\t1258\naltamira\t1258\ncorn\t1258\nsally\t1258\nsp16\t1258\naleflslalefm\t1258\nbonhoffer\t1259\nsapphire\t1259\nwadsworth\t1259\nvigo\t1259\nshinensananxanvinenvinin\t1259\ndrop\t1259\nduval\t1259\nmiliu\t1259\n19th st\t1260\nanker\t1260\nul lunacharskogo\t1260\nhana\t1260\neuropa ln\t1260\nwisniowa\t1260\ncopeland\t1260\nk 37\t1260\ng205\t1261\nellsworth\t1261\nbombeiros\t1261\ne washington st\t1261\nlisova\t1261\nmiditsinskii\t1261\ndub\t1261\nkruidvat\t1261\nrijn\t1262\nglavni\t1262\nn vi\t1262\nr gambetta\t1262\nvioletas\t1262\ngrandi\t1262\n665\t1262\ncargo\t1262\nxi chuan\t1262\npura\t1262\nwog\t1263\nchugoku\t1263\nfish cr\t1263\nnatsionalni\t1263\nhaz\t1263\nrua tiradentes\t1263\nparkovka\t1263\nhampden\t1263\ncanadian pacific railway\t1263\nkubitschek\t1264\nbilarus\t1264\nfriseursalon\t1264\nconseil\t1264\nflavio\t1264\nvancouver\t1264\nschwarze\t1265\nganges\t1265\nphysiotherapi\t1265\nistasyonu\t1265\nbasisschool\t1265\nhyatt\t1265\nxino\t1265\nirun\t1265\nboyer\t1265\nalden\t1266\nsand cr\t1266\nniccolo\t1266\nestacio\t1266\ndix\t1266\nchang shen gao su gong lu\t1266\nr du ctr\t1266\ncr 15\t1267\nnazareth\t1267\nmichelle\t1267\n672\t1267\nshire\t1267\n557\t1267\n719\t1268\nroza\t1268\nv giacomo puccini\t1268\nrema\t1268\ntaurn autobahn\t1268\ndum\t1268\nblazes\t1268\nfirst presbyterian church\t1268\ncornelis\t1268\nwolfs\t1268\nkentucky frid chicken\t1268\n2200\t1269\nbahnweg\t1269\nkauppa\t1269\nbana\t1269\n141st\t1269\nraffallo\t1269\nkarlsruhe\t1269\nliszt\t1269\ndemotiko\t1269\nfurte\t1269\nnatur\t1269\nkepler\t1269\nprata\t1270\nuchastkovi\t1270\nentree\t1270\nr des chenes\t1270\nandrzeja\t1270\nvazquz\t1270\nlepine\t1270\nhungry\t1270\nalexander st\t1270\n133rd\t1270\naleflalef\t1270\nbogdana khmilnitskogo vulitsia\t1271\n862\t1271\nhau\t1271\ndanile\t1271\neloy\t1271\npassos\t1271\napi\t1271\nsanyo exp\t1271\nmittlerer\t1271\nscotch\t1271\nclements\t1271\nmonet\t1271\nmaritta\t1272\nbluffs\t1272\n721\t1272\ncr 25\t1272\nd 109\t1272\nmesnil\t1272\nturnberry\t1272\nloyola\t1273\nchili\t1273\nw washington st\t1273\nwalkers\t1273\nmargaritas\t1273\nsp46\t1273\nd 81\t1274\nadriano\t1274\nv staz\t1274\nstokes\t1274\nligne de paris est a mulhouse ville\t1274\nret\t1274\nchevalir\t1274\nhamra\t1275\ngeschwister scholl st\t1275\ncartagena\t1275\nfoothill bd\t1275\nstraight\t1275\nspoldzilczy\t1275\nphong\t1275\ngreenbrir\t1275\nconti\t1275\nbuchen st\t1275\nbramble\t1275\nfildstone\t1276\nober df\t1276\naltstadt\t1276\nunidos\t1276\npia\t1276\n921\t1276\nmonde\t1276\nespecial\t1276\nbiala\t1276\nira\t1276\ntalweg\t1276\nholm\t1276\nselkirk\t1276\nsophia\t1277\nrettungswache\t1277\npizarro\t1277\nmahanaviramadaviramara\t1277\nkastanje\t1277\nyosemite\t1277\naubin\t1277\nbruder\t1277\n708\t1277\napplewood\t1278\nsabor\t1278\ntimothy\t1278\nkonrad adenaur st\t1278\ngorodishchi\t1278\nyoga\t1278\nmarquis\t1278\nhushan exp\t1278\nmagasin\t1279\nmurphys\t1279\ngrenzstein\t1279\nseibu\t1279\n030\t1279\nr basse\t1279\nplanes\t1279\nbrunner\t1280\nvalverde\t1280\nvance\t1280\n682\t1280\ngirona\t1280\n931\t1280\nvicinal\t1280\nborde\t1281\njovana\t1281\nbarnett\t1281\nromeo\t1281\nforcella\t1281\nnaranjos\t1281\na21\t1281\nbonanza\t1281\ngarza\t1281\nkirch bg\t1282\nfabrik st\t1282\nwalls\t1282\nsouthampton\t1282\ndivizii\t1282\nbruck\t1282\ncopy\t1282\nevergreen dr\t1282\npovorot\t1282\ndaira\t1282\nmidland main ln\t1282\nverdes\t1283\nmenor\t1283\ndab\t1283\nufficio\t1283\nsion\t1283\ncitgo\t1283\nmagnolia av\t1283\nturkey cr\t1283\nbracken\t1284\nv s martino\t1284\njetty\t1284\ncamacho\t1284\nbrandao\t1284\nhq\t1285\nober df st\t1285\nwar memorial\t1285\nkhawr\t1285\n1500\t1285\nhiawatha\t1285\nolivo\t1285\nantunes\t1285\ngrimm\t1286\nferraz\t1286\nparrocchia\t1286\ngurion\t1286\nn 13\t1286\nduomo\t1286\ntransporte\t1286\nsancho\t1286\nromerweg\t1286\ndz\t1287\nulisses\t1287\nkleinen\t1287\nschmalspurbahn\t1287\na 28\t1287\nmahogany\t1287\ngala\t1287\nrua 5\t1287\npressoir\t1287\ngodoy\t1288\n593\t1288\notis\t1288\nwilde\t1288\n558\t1288\ntommy\t1288\nsp23\t1288\ncanyon cr\t1289\nwaldeck\t1289\nmikoli\t1289\nhaller\t1289\nufer st\t1289\neloi\t1289\nfrunze\t1289\nst martin\t1290\nwethouder\t1290\ngeneve\t1290\nperiphereiake\t1290\nthanon\t1290\ne 73\t1290\noxford st\t1290\nd 77\t1290\nv xxv aprile\t1290\nnen\t1291\nsana\t1291\nknolls\t1291\nfairgrounds\t1291\ngonzalo\t1291\ntate\t1291\nwschodnia\t1291\nfuha\t1291\ndirk rossmann gmbh\t1292\nletoile\t1292\nsavoi\t1292\ndyer\t1292\ngra rd\t1292\npenon\t1292\nmagistrale\t1292\ncalumet\t1292\ntangno\t1292\nclot\t1292\nworthington\t1293\nmcintosh\t1293\nsp14\t1293\nhamlet\t1293\nhohlweg\t1293\ncia\t1293\ntoilets\t1293\nsosnovaia ul\t1293\nsundance\t1293\nsewage\t1294\nrn1\t1294\npiccolo\t1294\nves\t1294\nturati\t1294\ncaminos\t1294\nmex 45\t1294\ndc\t1294\ncyr\t1295\nweingarten\t1295\ntandir\t1295\nalencar\t1295\nfranklin av\t1295\nsalazar\t1295\nplaing\t1295\nchica\t1295\naugsburger\t1296\npfarrgasse\t1296\nav 1\t1296\nk 36\t1296\nshenandoah\t1296\nep3\t1296\nv nazario sauro\t1296\ncomanche\t1296\nantonigo\t1297\nc iglesia\t1297\nlt cr\t1297\noswald\t1297\ntrudovaia ul\t1297\nolmos\t1298\nlacerda\t1298\ntabakwaren\t1298\nigarape\t1298\nrua e\t1298\n152nd\t1298\noverpass\t1298\njuice\t1298\nsuzanne\t1299\nd 107\t1299\nglstalefn\t1299\nmag\t1299\ncampillo\t1299\nsebastin\t1299\ngornaia\t1299\nv sandro pertini\t1299\npatricio\t1299\nlavalle\t1300\nbritannia\t1300\n18th st\t1300\nus 270\t1301\nano\t1301\nox\t1301\nmillbrook\t1301\nsporting\t1301\nvolodimira\t1301\nlesni\t1301\n776\t1301\ndeodoro\t1301\nsportheim\t1301\nconstantin\t1301\nd 75\t1302\nsau\t1302\nhernan\t1302\nsouthfild\t1302\nvella\t1303\njazirat\t1303\ntrikala\t1303\nsac\t1303\nwoodruff\t1303\nhabib\t1303\ncunca\t1303\na 14\t1303\ngrunen\t1303\nfix\t1303\nav b\t1304\nolden\t1304\ngian\t1304\nst 1\t1304\ntoukaidousinkansen\t1304\nkwik\t1304\n547\t1304\nheras\t1304\nbara\t1305\nrinok\t1305\ncoiffeur\t1305\nbiagio\t1305\nbarracks\t1305\nnook\t1305\nfairviw av\t1305\naout\t1305\naway\t1306\nfoothills\t1306\nhushan\t1306\nmovistar\t1306\ndore\t1306\nlogis\t1306\njeunes\t1307\nacqua\t1307\nmaritsa\t1307\njal\t1307\nv armando diaz\t1307\nconad\t1307\n3810\t1307\nambroise\t1307\nstanica\t1307\npellico\t1307\nlira\t1307\nnextbike\t1307\nsheppard\t1307\nsong shan zi dong ch dao\t1308\nmaterska\t1308\neje\t1308\ntina\t1308\nmonterrey\t1308\nzhiloi\t1308\nhillsdale\t1308\nskol\t1308\nallen st\t1308\ntur\t1308\nshree\t1308\ntia\t1309\nbdo\t1309\njericho\t1309\nsent\t1309\ntravnia\t1309\nmision\t1309\niuriia\t1309\nvelke\t1309\nakadimiia\t1309\ntyre\t1310\nnike\t1310\nkap\t1310\njb\t1310\nspital\t1310\nwatch\t1310\ndajeon\t1310\nkb\t1310\nripley\t1311\n724\t1311\npeck\t1311\nbarbe\t1311\nywlalef\t1312\nmoskovskogo\t1312\nbrennerbahn\t1312\nd 71\t1312\nv della repubblica\t1312\nabi\t1312\nwoodviw\t1312\nluci\t1312\noakmont\t1312\nware\t1312\nrohrbach\t1313\nelm av\t1313\n775\t1313\nch des vignes\t1313\n644\t1313\nprivate rd\t1313\ndouglas st\t1313\ndanube\t1313\nmtrio\t1313\nr du four\t1313\n7e\t1313\ngewerbe st\t1313\n175th\t1314\nrestaurace\t1314\nbrdo\t1314\nkurgan\t1314\nfleur\t1314\nwilcox\t1314\ncristal\t1315\nfougeres\t1315\ncr 9\t1315\n070\t1315\nsportivni\t1315\ns17\t1315\nshepherds\t1315\nvela\t1316\nd 106\t1316\nus 322\t1316\nobecni\t1316\nyvsp\t1316\npko bp\t1316\nkha\t1316\ngames\t1316\nainbyd\t1316\npop\t1316\ngalaxy\t1317\neisenbahn st\t1317\npalomino\t1317\nbusbahnhof\t1317\nsouto\t1317\nsociale\t1317\nbag\t1317\ns20\t1317\n1 85\t1318\nr emile zola\t1318\ng1501\t1318\nmarias\t1318\nreception\t1318\ntobaccoland\t1318\nmikes\t1318\nstroitilstvo\t1318\ncedar dr\t1318\narodrome\t1319\nlins\t1319\natkinson\t1319\nwellington st\t1319\nmnkhm\t1319\ncheshire\t1319\nalbergu\t1319\ngade\t1319\nsingel\t1319\n250th\t1319\nrouges\t1319\ne 48\t1319\niran\t1319\ngalli\t1320\n592\t1320\ncorrintes\t1320\nstables\t1320\nomer\t1320\ncolumbine\t1320\n916\t1320\njungbunaryuk exp\t1320\nrua tres\t1321\nespresso\t1321\nhammock\t1321\nolitsa\t1321\niubiliini\t1321\ne 65 e 71\t1321\nbarrire\t1321\njeux\t1321\nporsche\t1321\ntechnologis\t1321\nhop\t1321\nvalli\t1322\nchasse\t1322\nsacre\t1322\ngrain\t1322\nfi\t1322\nbosqut\t1322\nmungammad\t1323\nsridnii\t1323\nkuh\t1323\n1006\t1323\nsigfrid\t1323\nbastos\t1323\npl de gare\t1323\nsus\t1323\nblenheim\t1324\njager st\t1324\ntischlerei\t1324\nmap\t1324\nnaturreservat\t1324\nbayside\t1324\nregiment\t1324\nsouthwood\t1324\nmobility genossenschaft\t1324\nk 22\t1324\nlandkreis\t1325\nnanjiang\t1325\nrokiv\t1325\nbachweg\t1325\npawnee\t1325\nodakyu\t1325\nrathaus pl\t1326\njensen\t1326\nvinna\t1326\nlauderdale\t1326\navtostantsiia\t1326\nferree\t1326\nclean\t1326\na 30\t1326\nc 24\t1326\nsiviro\t1326\n647\t1326\n18a\t1326\nbranche\t1326\nbroughton\t1326\ngongno\t1326\nd 111\t1326\ncummings\t1326\nsabino\t1327\nvaughn\t1327\nsabine\t1327\nsig\t1327\ngioacchino\t1327\nbelgrave\t1327\nedwin\t1327\naubepines\t1327\ntous\t1327\njava\t1327\ntecnologico\t1327\nindustrille\t1327\ngong chuan\t1328\ns 7th st\t1328\nyamaha\t1328\nyamada\t1328\nolmo\t1328\nkosumo\t1328\nmang\t1329\nsachsen\t1329\netorb\t1329\nstonebridge\t1329\nbr 153\t1329\ndepot st\t1329\nchamberlain\t1329\nwillow rd\t1329\nderry\t1329\nhereford\t1329\ncork\t1329\nfischbach\t1329\nsimos\t1329\n764\t1329\nfrancesa\t1329\ncell\t1330\nexpo\t1330\naquino\t1330\nmep\t1330\nmsrf\t1330\nthoma\t1330\nflaminia\t1330\nulm\t1331\nminigolf\t1331\nn 120\t1331\nchateaubriand\t1331\nlandgraben\t1331\ngeronimo\t1331\nbraurei\t1331\ndump\t1331\ncolfax\t1331\ncomprensivo\t1331\nherren\t1331\nprzemyslowa\t1332\ndole\t1332\nchisholm\t1332\ncyber\t1332\nrolland\t1332\nemery\t1332\nkelurahan\t1332\n1 59\t1332\nmonkey\t1332\nrwdte\t1333\ncorreo\t1333\nridgecrest\t1333\nparkland\t1333\nria\t1333\ncordillera\t1333\nmichigan av\t1333\ndao yang zi dong ch dao\t1334\ngibbs\t1334\npasa\t1334\nbudionnogo\t1334\n539\t1334\nbonito\t1334\nb 62\t1334\nd 938\t1334\nencina\t1334\ncascades\t1334\nbarbers\t1335\ne 10\t1335\n663\t1335\n666\t1335\n9th av\t1335\nblackstone\t1335\nd010\t1335\ndrift\t1336\n105 01\t1336\n001000\t1336\nverlengde\t1336\ntrida\t1336\nroun\t1336\nlikarnia\t1336\nrn3\t1336\nb 15\t1337\nbusway\t1337\ndorozhnaia ul\t1337\nhohe st\t1337\ncody\t1337\ntsing\t1337\ngobirno\t1337\nprofesseur\t1337\ncostco\t1337\ncalgary\t1337\nweir st\t1337\nsucker\t1337\nesquina\t1337\nbarco\t1337\nservice rd\t1337\nviddilinnia\t1338\nbuckley\t1338\nseb\t1338\ndla\t1338\nrujm\t1338\na57\t1338\ndabrowskigo\t1338\ncara\t1338\n4b\t1339\nchristoph\t1339\nshaaale\t1339\n165th\t1339\nfranko\t1339\nfiguira\t1339\nlassomption\t1339\niskusstv\t1339\nogrod\t1339\nmamedialtaasattaiungaasat\t1340\nmister\t1340\ntremont\t1340\nkorn\t1340\nemanul\t1340\na 43\t1340\naddition\t1340\nhalefj\t1340\n673\t1340\nnarrows\t1340\nei\t1340\npala\t1340\nmens\t1340\nr de paris\t1340\nrockwood\t1340\nstones\t1341\nshhrkh\t1341\ncentar\t1341\ntulul\t1341\nparkweg\t1341\n772\t1341\nbilinskogo\t1341\npoludniowa\t1341\ngarazh\t1341\nrijksstraatweg\t1341\nvalladolid\t1342\naleflhsyn\t1342\ndraw\t1342\nvisitors\t1342\nbudalg\t1342\ncarmelo\t1342\nkwai\t1342\nfaure\t1342\na 40\t1343\nluisen\t1343\nhortensias\t1343\nitaliano\t1343\nkathe\t1343\nul kosmonavtov\t1343\nmcgregor\t1343\nb 180\t1344\nd 61\t1344\n565\t1344\npulperia\t1344\npineviw\t1344\nlibknikhta\t1344\npedras\t1345\naur\t1345\ndivino\t1345\nvilikii\t1345\npine av\t1345\ngreek\t1345\ncass\t1345\nbuchholz\t1345\nzamkowa\t1345\nsagewerk\t1346\nutja\t1346\natalaya\t1346\nschneise\t1346\nk 26\t1347\ndresdener\t1347\ncng\t1348\nspr\t1348\nb 13\t1348\nvictoria av\t1348\nbeverley\t1348\nevangelista\t1348\nalexandru\t1348\nequipment\t1349\ncsx\t1349\nn34\t1349\nwinkler\t1349\ntra\t1349\ngoods\t1349\nteich st\t1349\nmathias\t1350\nfolly\t1350\nmagistralnaia\t1350\ntucuman\t1351\nlistopada\t1351\ncontra\t1351\nsp21\t1351\nlarry\t1351\nk 19\t1351\nfrancisco 1 madero\t1351\nbelgi\t1351\npoppy\t1351\ncassa\t1351\nnewark\t1351\nrabin\t1351\ncentenary\t1351\nbangkok\t1352\njoli\t1352\ncrcs\t1352\nforstweg\t1352\nthornhill\t1352\nsport ln\t1352\nbasilio\t1352\n556\t1352\nedelweiss\t1352\nnabirizhna vulitsia\t1352\nmadeira\t1352\nsantandrea\t1352\nchaco\t1353\nlinares\t1353\nhamilton st\t1353\nstable\t1353\nsicula\t1353\nr de foret\t1353\nkobe\t1353\nbezerra\t1353\nb 31\t1353\npisa\t1354\njungbunaryuk\t1354\nrontgen\t1354\nnora\t1354\nremedios\t1354\nlavanderia\t1354\n137th\t1354\n5b\t1355\nforskola\t1355\nch de halage\t1355\nbps\t1355\nlaureles\t1355\n15a\t1355\nduke st\t1356\nschleuse\t1356\njones st\t1356\nquattro\t1356\nprime\t1356\nauchan\t1356\narundel\t1356\nsp7\t1356\na 62\t1357\nsagrado\t1357\nnavigation\t1357\nmercedes benz\t1357\ndenominacao\t1357\nn 88\t1357\ntereza\t1357\nd 102\t1358\ncanal st\t1358\ncondominiums\t1358\n138th\t1358\n690\t1358\nn13\t1358\njonas\t1358\ndene\t1359\ndi1\t1359\nplaisance\t1359\ncatering\t1359\nwestchester\t1359\nus 63\t1360\nagriculture\t1360\nturo\t1360\ntripoli\t1360\nb 28\t1360\nyong tai wen gao su\t1360\nludwika\t1360\npalmiro\t1361\n578\t1361\nhuta\t1361\nconsulate\t1361\nsahara\t1362\ncanteen\t1362\n766\t1362\nnach\t1362\n955\t1362\na 27\t1362\nwalker st\t1362\nemlekmu\t1362\ntopolowa\t1362\nhansa\t1363\nxiong ye ji dao guo dao42 hao\t1363\nmarlin\t1363\n60k\t1363\nbrauhaus\t1363\ntalleres\t1363\nore\t1363\ngosudarstvinnoi\t1363\ndorfgemeinschaftshaus\t1363\narthur st\t1363\ningram\t1363\nmemorial dr\t1363\nhugh\t1363\nkemp\t1363\nindigena\t1363\nmunchener\t1364\ntax\t1364\ncr 10\t1364\nk 31\t1364\nnic\t1364\nbanos\t1364\nshuai\t1364\nlaurentius\t1364\nyokosuka\t1364\nalte land st\t1364\nnewell\t1364\ne 81\t1364\n928\t1364\nsuperstore\t1364\nkundenpark\t1365\ntesco express\t1365\nd 116\t1365\nnarciso\t1365\nlasalle\t1365\nclock\t1366\ncrabtree\t1366\nbrittany\t1366\neverest\t1366\nunidas\t1366\nalbans\t1366\nv giuseppe di vittorio\t1366\nbarranca\t1366\ncaribe\t1366\n22k\t1366\nmarkham\t1367\ngovernors\t1367\nthompson rd\t1367\nn 9th st\t1367\nreifen\t1367\nquinn\t1367\nsaba\t1367\nhoracio\t1367\npou\t1367\nrsc\t1367\ndrew\t1368\ncilo\t1368\nbohaterow\t1368\njason\t1368\nzilina vulitsia\t1368\nobrazovatilnoi\t1368\ncuster\t1368\nus 290\t1368\nkiwi\t1369\nbarroso\t1369\nmerritt\t1369\nkirkevej\t1369\nramona\t1369\nevangelisches\t1369\nerenmal\t1369\neis\t1369\nhochschule\t1369\nmubles\t1370\ne 37\t1370\nhaim\t1370\ndamm st\t1370\ns26\t1370\nnicaragua\t1370\nv 25 aprile\t1370\nseri\t1371\ntwenty\t1371\n760\t1371\nkinotiatr\t1371\nlancin\t1371\n812\t1371\nalbino\t1371\n762\t1371\nanny\t1372\nul lomonosova\t1372\nfarm trk\t1372\nbiograd bar\t1372\npertamina\t1372\nhangzhou\t1372\ndeichmann\t1372\nc major\t1372\nsena\t1372\ncourtney\t1373\ntrap\t1373\nkant st\t1373\ndirt\t1373\na 67\t1373\nhamilton rd\t1373\nstomatologiia\t1373\nbergeri\t1374\ndistribuidor\t1374\narmii krajowej\t1375\nm 14\t1375\nmwsalef\t1375\nriverviw dr\t1375\ntomahawk\t1375\ncoubertin\t1375\nah47\t1375\nfillmore\t1375\nraadhuis\t1375\nelite\t1376\npolyvalente\t1376\n706\t1376\nlpg\t1376\nhiking\t1377\nbrod\t1377\nwalsh\t1377\nrua 4\t1377\nforest av\t1377\nhas\t1377\na 81\t1377\nr du calvaire\t1377\ne 8th st\t1377\nchick\t1377\nvallone\t1378\nbalefb\t1378\ndd\t1378\ntanah\t1378\nesther\t1378\nforest dr\t1378\njalur\t1378\nnin\t1378\npalos\t1378\nlorne\t1378\nv s rocco\t1378\ngminy\t1378\nv risorgimento\t1378\nyongtaiwen\t1379\nfrankfurt\t1379\nchacara\t1379\ngrape\t1379\nphilips\t1379\namigos\t1379\nyongtaiwen exp\t1379\nw av\t1380\ncalera\t1380\nobservatory\t1380\nlininskii\t1380\nnation\t1380\nditii\t1380\njiu zhou zi dong ch dao\t1380\nscala\t1380\nmassey\t1380\ntras\t1380\n922\t1380\nwilbur\t1380\ne 119\t1381\nggmbh\t1381\nber\t1381\nfrenes\t1381\nn 12\t1381\ncomunitario\t1381\nd 120\t1381\nstark\t1381\nlluis\t1381\nrising\t1382\nrockwell\t1382\nalte st\t1382\nsandy cr\t1383\nlabreuvoir\t1383\nresource\t1383\ndiane\t1383\nfista\t1383\nmoskovskoi\t1383\n147th\t1383\ncherry ln\t1383\ngraben st\t1383\nhal\t1384\nbola\t1384\ntheodor heuss st\t1384\nus 460\t1384\nknollwood\t1384\nhalden\t1384\na bg\t1384\nseebach\t1384\nparafia\t1384\nthunderbird\t1384\nmarken\t1385\nhare\t1385\nsophi\t1385\n645\t1385\ncalvo\t1385\nmendonca\t1385\namy\t1385\nrb\t1385\nweissen\t1385\nd 118\t1385\nchocolate\t1386\na 93\t1386\nbrativ\t1386\nbudinok\t1386\ngibraltar\t1386\nav central\t1386\nplas\t1386\nyrvshlym\t1386\nosidla\t1386\ndepartamento de educacion\t1386\noptika\t1387\nyat\t1387\nca 82\t1387\nlaszlo\t1387\nfornace\t1387\nrota\t1387\n537\t1387\nshek\t1387\nlahn\t1388\nchatsworth\t1388\nata\t1388\nsilk\t1388\n478\t1388\nguatemala\t1389\nmacil\t1389\nspinney\t1389\ntoros\t1389\nfriden st\t1389\nhartley\t1389\npacific coast hwy\t1389\nely\t1389\ncitizens\t1390\nculturel\t1390\nracecourse\t1390\nct st\t1390\n142nd\t1390\nstrandvej\t1390\ntay\t1390\nmoskovskii prospikt\t1391\naro\t1391\nzal\t1391\nsiyoukasen\t1392\nlinn\t1392\n723\t1392\nwestring\t1392\nc 26\t1392\nus 278\t1392\nk 25\t1392\nboca de incendio\t1392\nshokasen\t1392\nmelchor\t1393\nf1\t1393\nzhiliznodorozhni\t1393\nbrook st\t1393\nvian\t1393\nchirnyshivskogo\t1393\ntulpen\t1393\na90\t1393\narno\t1394\nd st\t1394\nmitsubishi\t1394\nluiza\t1394\nr2\t1394\niglesias\t1394\nnaar\t1394\nrosemont\t1394\nunger\t1394\nanchita\t1394\nfairmount\t1395\nsegovia\t1395\nedward st\t1395\nautostrada del mediterraneo\t1395\noakwood dr\t1395\ncret\t1396\ns101\t1396\nskovvej\t1396\naaron\t1396\nvaart\t1396\nsuki jia\t1396\nbake\t1396\nd 105\t1396\nxiao fang shuan\t1396\nshakespeare\t1396\nsl\t1397\nhp\t1397\nfang huo shui cao\t1397\nholden\t1397\n715\t1397\np3\t1397\naliksandrovka\t1397\nknapp\t1397\ncountry ln\t1397\nfridhofskapelle\t1397\nljubljana\t1397\n10th av\t1397\nbaumgarten\t1398\ncoconut\t1398\nrevere\t1398\nimmanul\t1398\nda gu chuan\t1398\naugustine\t1398\nukraini\t1399\njefferson av\t1399\nbruxelles\t1399\nn11\t1399\nbegonia\t1399\nc c\t1399\nolive st\t1400\na19\t1400\ndennys\t1401\nmarigold\t1401\njohanna\t1401\nsvitlaia\t1401\nleonhard\t1401\nbutternut\t1402\ngarfild av\t1402\nkapolna\t1402\nbotschaft\t1402\ncharmes\t1402\nd 68\t1402\nkleingartenanlage\t1402\nc nuva\t1403\njozsef attila u\t1403\nbeit\t1403\ncascada\t1403\nn 10th st\t1403\nskyviw\t1403\nweidenweg\t1403\ncoteaux\t1404\nbus stop\t1404\nr des vergers\t1404\nb4\t1404\nd 112\t1404\nbagno\t1405\npappelweg\t1405\nchou\t1405\nrestoran\t1405\nqarat\t1405\nappia\t1406\nnordring\t1406\nkrolowej\t1406\ndebussy\t1406\nforce\t1406\njw\t1406\ndan in luan huang yuki ze\t1406\nb 101\t1407\nstay\t1407\ndalefnshgalefh\t1407\ncougar\t1407\ns28\t1407\ncrab\t1407\naleflmlk\t1407\npercorso\t1408\nwc\t1408\nnor\t1408\nost st\t1408\nsnowmobile\t1408\nalefsmalefainyl\t1408\nvoluntarios\t1408\nhorno\t1408\nstuttgarter st\t1408\nmoses\t1408\nkarditsa\t1409\nceinture\t1409\npoirir\t1409\nok 3\t1409\npzta\t1409\nhighviw\t1409\nbarbusse\t1409\ng85\t1410\nvtb24\t1410\nkosoku\t1410\ndecker\t1410\nginger\t1410\nstil\t1410\nsp13\t1410\nbozhiii\t1410\nrusskii\t1410\njarvis\t1410\nmair\t1410\ntorg\t1411\noiseaux\t1411\nfry\t1411\nvocational\t1411\nkolner st\t1411\naba\t1411\nsafety\t1411\n230th\t1411\ndreve\t1412\nmollevej\t1412\navnw\t1412\n786\t1412\ntoni\t1412\nleao\t1412\nolivirs\t1412\nligne de paris a strasbourg\t1412\nrenoir\t1412\nprevert\t1412\nmast\t1412\n538\t1413\nwestbury\t1413\nfire hydrant\t1414\nhelens\t1414\nobregon\t1414\nmole\t1414\npenny mkt\t1414\ngreystone\t1415\ngrays\t1415\npasadena\t1415\nlarchenweg\t1415\n134th\t1415\nnider\t1415\notero\t1415\nprospekt\t1415\n155th\t1415\nom\t1416\nmesto\t1416\nkostel\t1416\njozef\t1416\nagzs\t1416\nbrewer\t1416\nheide st\t1416\nniuw st\t1417\npartner\t1417\nnils\t1417\nvivir\t1417\ncastellana\t1417\nofis\t1418\nsp6\t1418\na1a\t1418\nvoinam\t1418\nelkhorn\t1418\nutah\t1418\ntamar\t1419\nuber\t1419\nry\t1419\ne 56\t1420\nquiroga\t1420\n817\t1420\ncall\t1420\nleicester\t1420\nalcides\t1420\njosephine\t1420\nw 8th st\t1420\nintermediate\t1420\nshivchinko ul\t1420\nnom\t1421\ntaurn\t1421\npatis\t1421\nrevolucion\t1421\nbyrd\t1421\nhilltop dr\t1421\nmula\t1421\nfrom\t1421\ncaballero\t1421\nmesse\t1421\nsp12\t1421\nuniv av\t1422\nqrn\t1422\nbriggs\t1422\nmagnolias\t1422\nlv\t1422\nenirgitikov\t1422\nc 32\t1423\npronto\t1423\napartman\t1423\namalia\t1423\nmontebello\t1423\nres rd\t1423\nus 231\t1423\n121st\t1423\nfortaleza\t1423\nilce\t1424\nwillow ln\t1424\noptical\t1424\nb 169\t1424\nhisn\t1424\nbk ln\t1424\nhutchinson\t1425\ntiglio\t1425\nuzhd\t1425\nestrela\t1425\nextremadura\t1425\nportela\t1425\ngvryvn\t1425\n136th\t1426\nd 119\t1426\nr4\t1426\nkarim\t1426\nredbud\t1426\nwillows\t1426\nbarrir\t1426\ntrung\t1427\nparikmakhirskaia\t1427\nministere\t1427\nmarvin\t1427\ngilmore\t1427\nlavka\t1427\ndurer\t1427\nbutterfly\t1427\nvirginia av\t1427\nshilds\t1427\nm8\t1427\nb171\t1427\ndoncaster\t1427\npoligon\t1427\ndanila\t1427\nhutten\t1427\nrider\t1428\nfortin\t1428\nresistenza\t1428\nchiltern\t1429\nr des mesanges\t1429\nvp\t1429\njohnny\t1429\nshet\t1430\noriginal\t1430\ncassin\t1430\n17th st\t1430\n6e\t1431\ndong bei xin gan xian\t1431\nkolping st\t1431\ntohoku shinkansen\t1431\nerreka\t1431\nbank st\t1431\nconcorde\t1431\nbarclay\t1431\nporvenir\t1431\nglenviw\t1431\nhurtas\t1431\nclough\t1431\nzeromskigo\t1431\njoachim\t1431\nludwig st\t1431\njami\t1432\ntt\t1432\nwoodhaven\t1432\npelham\t1432\nincendio\t1432\nlamb\t1433\npauline\t1433\novoda\t1433\ncanaan\t1433\nprito\t1433\nchapel ln\t1433\ntrasa\t1433\nmasters\t1434\nmoran\t1434\nbarranc\t1434\nstructure\t1434\ndijon\t1434\nbradesco\t1434\nnes\t1434\njour\t1435\nv ugo foscolo\t1435\nantiga\t1435\nslf\t1435\ncalais\t1436\nhokuriku exp\t1436\nsadi\t1436\nmetairi\t1436\nd 113\t1436\npisgah\t1436\nmartires\t1436\ndumas\t1436\n492\t1436\nlobos\t1436\noverland\t1436\ntimberline\t1437\nwings\t1437\nupland\t1437\nparroquial\t1437\nmtry\t1437\nkeian\t1437\nr du cimetire\t1437\nsalengro\t1437\nddat\t1437\nbou\t1437\nm 8\t1438\ngrazi\t1438\ndavao\t1438\nmarquz\t1438\ncapo\t1438\n006\t1438\ndevant\t1438\nmercy\t1438\nsevero\t1438\nzoi\t1439\nd 82\t1439\nguvara\t1439\ndistribuidora\t1439\nalicia\t1439\notavio\t1439\ncoca\t1439\noswaldo\t1439\nnarodni\t1439\nkultur\t1440\nvelka\t1440\nmagdeburger\t1440\nrondweg\t1440\nlogistik\t1440\npreschool\t1440\nresto\t1440\nfirestone\t1441\n908\t1441\nbandeira\t1441\njamison\t1441\netterem\t1441\nzaria\t1441\nsicilia\t1441\n393\t1441\nznachinnia\t1441\nembalse\t1442\nuniversidade\t1442\nsluzhba\t1442\nmoreau\t1442\nhogan\t1442\nneri\t1442\nabt\t1442\nmutual\t1442\nxudal\t1443\nforst st\t1443\nnoyers\t1443\npalmeras\t1443\nlor\t1443\ngreenhouse\t1443\nobi\t1443\ndessus\t1443\nraoul\t1443\nsp11\t1443\npart\t1444\nbrewing\t1444\nasahikawa\t1444\nepiceri\t1444\nkyushu\t1444\namanda\t1444\nmagenta\t1445\ncr 5\t1445\ncandy\t1445\nanderson rd\t1445\nsteps\t1445\na 13\t1445\ncouvent\t1445\ntov\t1445\nsepulveda\t1445\nslymalefn\t1445\nsp9\t1446\nalefwlalefd\t1446\ndigu\t1447\nmelville\t1447\nk 23\t1447\nrodoviaria\t1447\nnelson st\t1447\n662\t1447\ntilmana\t1447\nbesar\t1447\nbukhta\t1448\ngusto\t1448\nmibil\t1448\nt2\t1448\nmagyar\t1448\nmorena\t1449\nkonstantinou\t1449\ngara\t1449\ntete\t1449\nstor g\t1449\nivana franka vulitsia\t1450\ncalvin\t1450\nskiforeningen\t1450\nmaiak\t1450\ncr 3\t1450\nberlioz\t1450\nrampe\t1450\nbrush cr\t1450\nr de liberte\t1451\nainqbte\t1451\nagung\t1451\nbila\t1451\nmotos\t1451\ncuauhtemoc\t1451\nlautoroute\t1451\nristoran\t1452\nlola\t1452\nimre\t1452\nsmoke\t1452\nrubio\t1452\nmichit\t1452\n123rd\t1452\nmaitland\t1452\nah61\t1452\ncafe amazon\t1452\ntigre\t1453\n131st\t1453\ngorizia\t1453\nbaker st\t1453\nluky\t1453\nschwarzer weg\t1453\nflag\t1454\nbrisbane\t1454\nk 27\t1455\nn 8th st\t1455\niu\t1455\ne 63\t1455\nremington\t1456\nagostinho\t1456\nulmenweg\t1456\nquinto\t1456\ncuchilla\t1456\ncosmo\t1457\nmeadowviw\t1457\npfarrhaus\t1457\nejercito\t1457\nvarela\t1457\nbazaar\t1457\nmello\t1457\nmiller st\t1457\nantonia\t1457\nyamanote\t1457\n638\t1457\npais\t1457\ns 6th st\t1457\nreagan\t1458\nbgyn\t1458\nminimarket\t1458\ntarn\t1458\nwoodcrest\t1458\nc 23\t1458\nhajj\t1458\nusadba\t1458\n240th\t1458\ncastor\t1458\nrua um\t1459\n563\t1459\nfinance\t1459\nminers\t1459\nerwin\t1459\njail\t1459\nfndq\t1459\nlleida\t1459\nisonzo\t1459\nsilvestre\t1459\nheidel\t1460\ns12\t1460\nstrilka\t1460\nfaustino\t1460\nzolotoi\t1460\nzygmunta\t1460\ncr 12\t1461\nlandmark\t1461\nbay st\t1461\nblanchard\t1461\nhof st\t1461\ndubois\t1461\n564\t1461\nino\t1461\narany janos u\t1461\ngiordano\t1461\nwangdah\t1461\nbz\t1461\nramen\t1462\ntajo\t1462\npuch\t1462\ntechniqu\t1462\nassociacao\t1462\n1050\t1462\nnumero\t1462\nkarl marx st\t1462\nnicole\t1462\nalbergo\t1462\nav de leurope\t1462\nlomo\t1462\nhallenbad\t1463\nstroitilnaia ul\t1463\nmother\t1463\nsvateo\t1463\nprati\t1463\nfurmanova\t1463\nschwarzen\t1463\nalpen\t1464\nwoodfild\t1464\nbutcher\t1464\nplius\t1464\nness\t1464\npitts\t1464\nbarlow\t1464\nthang\t1464\nivrosit\t1464\nguo dao1 hao\t1464\nd 45\t1465\norint\t1465\nperimetral\t1465\ndining\t1466\nsoldado\t1466\nyates\t1466\ndogwood dr\t1466\nnapir\t1466\nah\t1466\nd 115\t1467\npimonte\t1467\nproducts\t1467\ntomei exp\t1467\nul krupskoi\t1467\nsviato\t1467\nhempstead\t1468\nayacucho\t1468\nalbert schweitzer st\t1468\ne 09\t1468\nsr 18\t1468\nambassade\t1468\nswirkowa\t1468\nmolire\t1469\nkochosu\t1469\nshasta\t1469\nmisto\t1469\nplank\t1469\nlom\t1469\nmcleod\t1469\nbamboo\t1470\nxv\t1470\nalexis\t1470\nrozc\t1470\ncervi\t1470\ndino\t1470\nhaar\t1470\nprokuratura\t1470\nkleingartenverein\t1470\nmotorcycle\t1471\npadaria\t1471\n148th\t1471\nheim\t1472\nwards\t1472\nvaillant\t1472\nhafen st\t1472\nmoi\t1472\nprzy\t1472\nniang\t1472\nebro\t1472\nrifle\t1472\nlerchen\t1472\nboggy\t1473\nfay\t1473\nkura\t1473\nerlen\t1473\nd 69\t1473\neugen\t1473\n943\t1473\nhillside av\t1473\nv iv novembre\t1473\n070000\t1474\nportsmouth\t1474\nzhongshan\t1474\napril\t1474\nanz\t1474\ncr 7\t1474\nseattle\t1474\njuillet\t1474\npraza\t1474\nyeongdong\t1475\ncup\t1475\nentuziastov\t1475\nholme\t1475\nhilaire\t1475\ntarragona\t1475\nmatamoros\t1475\natlantic av\t1475\nutama\t1475\nharrow\t1476\ntrudovaia\t1476\nwaldemar\t1476\nxiantuop\t1476\ncompound\t1476\ndarby\t1476\neo2\t1476\nkerr\t1476\nneal\t1476\nkrym\t1476\nallegheny\t1476\npaulino\t1476\nrua dois\t1476\ngite\t1476\n3000\t1476\nautov del cantabrico\t1477\n734\t1477\nhofen\t1477\nklooster\t1477\ndesembargador\t1477\nnipodleglosci\t1477\nligne de noisy sec a strasbourg\t1477\n210th\t1477\nspringhill\t1477\nwilkinson\t1477\n770\t1477\nalberti\t1477\notter cr\t1477\njungang exp\t1477\nsaw\t1477\na50\t1477\nstagecoach\t1478\nhistory\t1478\ndivide\t1478\nchoctaw\t1478\nglobe\t1478\ne w hwy algeria\t1478\nikony\t1479\nc 22\t1479\nwolf cr\t1479\nmoli\t1479\nidemitsu\t1479\nlirios\t1479\ntertre\t1479\nrandweg\t1479\nascot\t1479\nfridhofsweg\t1480\nsavings\t1480\n765\t1480\na hang\t1480\nmelton\t1480\nsp31\t1480\nthong\t1480\nfranken st\t1480\nschwarzwald\t1480\nwilder\t1480\n129th\t1481\ngreco\t1481\nexpert\t1481\nshevchenka\t1481\n397\t1481\nwatt\t1481\n924\t1481\ncortez\t1481\ndurand\t1481\nkonopnickij\t1481\nsp5\t1482\nd 56\t1482\ncouto\t1482\nkhalaf\t1482\nhellweg\t1482\nhickory ln\t1482\nloc\t1483\ns lorenzo\t1483\n3 maja\t1483\nalexandrou\t1483\nviaduto\t1483\nallianz\t1483\nus 220\t1483\nsimens st\t1483\nsobu\t1483\ncarpark\t1483\nburnham\t1484\nmadera\t1484\ncordova\t1484\npalmeiras\t1485\nbegin\t1485\nmace\t1485\nhok\t1485\nkhalefn\t1485\ncolline\t1485\nltda\t1485\nmargarets\t1486\nr des peuplirs\t1486\nlumire\t1486\nremy\t1486\nfloral\t1487\nroda\t1487\nbilorusnift\t1487\ntruman\t1487\ntancsics\t1487\ngirtsina\t1487\n19a\t1487\nfrancaise\t1487\ntarasa shivchinka vulitsia\t1487\ngrossen\t1487\nkarang\t1487\ns jingnoripaku\t1488\nrotunda\t1488\nn 83\t1488\npid\t1488\ndune\t1488\npadang\t1488\nprivokzalnaia\t1488\nmusica\t1488\nasturias\t1488\nviaduc\t1488\nklinikum\t1489\nparra\t1489\nharley\t1489\nkirchenweg\t1489\ngerhart\t1489\nchoice\t1489\nlimon\t1490\nwhitewater\t1490\ns 5th st\t1490\ngato\t1490\ng76\t1490\ntoys\t1490\nausbau\t1490\nfussball\t1490\nasbury\t1491\nlenine\t1491\narnaldo\t1491\npermanent\t1491\ndresdner\t1492\nmustafa\t1492\nshoals\t1493\nminerva\t1493\nroshcha\t1493\nus 95\t1493\na 71\t1493\nlandfill\t1493\nligne plm de paris a lyon\t1493\n58k\t1493\ncedar av\t1493\na24\t1494\naussere\t1494\nmtn rd\t1494\npolicing\t1494\ntreasure\t1494\nquens rd\t1494\npondok\t1494\nmannheim\t1494\ntaylor rd\t1495\ndirect\t1495\nwroclawska\t1495\nmachine\t1495\nsalvo\t1495\nlui\t1495\nhove\t1495\n9 de julio\t1496\ngrube\t1496\nhaynes\t1496\nloh\t1496\naudubon\t1497\nirwin\t1497\ncairo\t1497\nphilippine\t1497\n467\t1497\naldi sud\t1497\nklonowa\t1497\n03k\t1497\nayala\t1497\njamestown\t1498\nd 49\t1498\nnarrow\t1498\nbasilica\t1498\nkuala\t1498\nsinai\t1498\nkoloni\t1498\nwoodrow\t1498\nwoody\t1499\nrepublik\t1499\nliningradskaia ul\t1499\nhon\t1499\n144th\t1499\njerry\t1499\nyork st\t1499\nalefltryq aleflsyalefr shrq grb\t1500\ncrooked cr\t1500\navelino\t1500\ngastillo\t1500\niroquois\t1500\n126th\t1500\nlaurir\t1500\ntitova\t1500\ntaunton\t1500\nbrok\t1501\nr jules fy\t1501\nmoselle\t1501\nsplit\t1501\ntikhnikum\t1502\nlucy\t1502\njsr\t1502\ncine\t1503\nd 104\t1503\nbruckner\t1503\ngaronne\t1503\nluth\t1503\nlungomare\t1503\natb\t1503\nhrtsl\t1503\nlinz\t1503\n1300\t1503\nhu shan gao su\t1503\nbrassens\t1503\nvillers\t1504\njerzego\t1504\nwinery\t1504\nhenley\t1504\nhollis\t1504\nfossa\t1504\nlina\t1504\nlogistics\t1505\ncharlton\t1505\nfung\t1505\nartes\t1505\nideal\t1505\ndinas\t1505\nnapa\t1506\nav a\t1506\nita\t1506\nmezzo\t1506\nmarian\t1506\nampere\t1506\ngh\t1506\nlines\t1506\nsingngiyah\t1507\nsapins\t1507\ns luis\t1507\npellegrini\t1507\nrf\t1507\ngalgen\t1507\nrcda\t1508\nguo dao9 hao\t1508\nkorut\t1508\npubliczna\t1508\nmediathequ\t1508\nsteig 2\t1508\nharwood\t1508\nlevante\t1508\ndaosta\t1509\nwbk\t1509\nsolomon\t1509\nblubell\t1509\nd 46\t1509\nole\t1509\npl mayor\t1509\nvrh\t1509\nalefwl\t1510\nbrule\t1510\nballard\t1510\nmuzykalnaia\t1510\nbozej\t1510\nchiornaia\t1510\ncountry club dr\t1510\ntabak\t1510\nmaple ln\t1511\npiao\t1511\nberwick\t1512\nboreios odikos axonas kretes\t1512\nnamha exp\t1512\nr du chateau deau\t1512\nannexe\t1512\nscotiabank\t1512\nd 64\t1513\npaulus\t1513\nodikos\t1513\nflyover\t1513\nv venezia\t1513\nsaunders\t1513\ntlwl\t1513\nagencia\t1513\n008\t1513\neichendorff st\t1514\nataturk\t1514\nje\t1514\nsalgado\t1514\nmat\t1514\npittsburgh\t1514\nrondon\t1514\nbudapest\t1515\nshyte\t1515\nrua 3\t1515\npaper\t1515\nsommer\t1515\nbayberry\t1515\nflur st\t1515\npgind\t1515\nlester\t1516\nlaz\t1516\nclovis\t1516\ncic\t1516\nvell\t1516\naxonas\t1517\ncorrales\t1517\nus 83\t1517\nanadolu\t1517\nbrunnenweg\t1517\n935\t1518\ncou\t1518\nunterm\t1518\nnelkenweg\t1518\nuch\t1518\neich\t1518\ngarnet\t1519\ncovington\t1519\nfichtenweg\t1519\nlininskaia\t1519\nuniversitario\t1520\nwyszynskigo\t1520\neuronet sp z o o\t1520\nosnovna\t1520\npaco\t1520\nirvine\t1520\ngris\t1520\nrose st\t1520\nruhr\t1521\ncad\t1521\nrama\t1521\nrussell st\t1521\nrichard wagner st\t1521\nvishniovaia ul\t1521\nmiska\t1522\njune\t1522\nshatt\t1522\nboreios\t1522\nathens thessaloniki evzonoi\t1523\n545\t1523\nposten\t1523\nsalt cr\t1523\nmwy 1 athens thessaloniki evzonoi\t1523\nrn40\t1523\njol\t1524\ngagarina vulitsia\t1524\nhmd\t1524\nmonsenor\t1524\nschroder\t1524\n740\t1524\nankara\t1524\ncincinnati\t1525\nmarkus\t1525\nlibig\t1525\nbury\t1525\nostanovka\t1525\nalfa bank\t1526\n718\t1526\nmnzl\t1526\ncorp\t1526\ncarey\t1526\nsettlers\t1526\ncorreios\t1526\nministop\t1526\nbrescia\t1526\ne av\t1526\na41\t1526\nkiivskaia\t1526\nbaixo\t1527\nlaurirs\t1527\nshelton\t1527\nsalim\t1528\nindonesia\t1528\nh m\t1528\noka\t1528\nstudy\t1528\ncluain\t1528\nmarcelo\t1528\nspecial\t1529\npirres\t1529\nlombardia\t1529\nwong\t1529\nkin\t1529\nreeves\t1530\nd 70\t1530\nd 137\t1530\nb 20\t1530\nwoodbridge\t1531\nlan xin xian\t1531\nvelo\t1531\nbikes\t1531\nwhittir\t1532\njr zhong yang xian\t1532\ntetsudo\t1532\nbelgrade\t1532\nvillar\t1532\nwilliams rd\t1533\narma\t1533\nserrat\t1533\n00\t1533\nloisirs\t1533\ne40\t1533\nbrown rd\t1534\npabellon\t1534\ntitle\t1534\ntechnik\t1534\ncongo\t1534\nguo dao42 hao\t1534\nvalentine\t1534\nduro\t1534\nlindsey\t1535\nmull\t1535\njoliot\t1535\nvolvo\t1535\nacude\t1535\nseal\t1535\ntanner\t1535\nmosel\t1535\nautoroute du soleil\t1536\nstationsweg\t1536\nsonora\t1536\nneustadter\t1536\ncotes\t1536\ndantut\t1536\nthomson\t1537\nargine\t1537\nbilaia\t1537\nburgweg\t1537\negg\t1537\n387\t1537\npipe\t1537\ncola\t1537\nneruda\t1537\nsunoco\t1537\ndoyle\t1538\nursula\t1538\nenterprises\t1538\nrua sao paulo\t1538\nrdalef\t1538\nwildflower\t1538\naleflhalefj\t1538\nparadiso\t1539\nd 58\t1539\nandover\t1539\nhunyadi\t1539\nolivir\t1539\ngogh\t1539\ndaily\t1539\nstein st\t1539\nahorn st\t1539\n13a\t1539\ncedros\t1539\ndark\t1539\neuclides\t1539\nwisteria\t1539\nmona\t1539\njokai\t1539\n127th\t1540\nywsf\t1540\nzhong shan gao su gong lu\t1540\nmassimo\t1540\nmnr rd\t1540\nmetrobus\t1540\nbanqu populaire\t1541\ninca\t1541\npopova\t1541\nmalvern\t1541\npfarramt\t1541\ntanzox\t1541\nezbet\t1541\npick\t1542\nprimeiro\t1542\nul engilsa\t1542\nkliuch\t1542\nmonsenhor\t1542\ndiamante\t1542\n573\t1542\n20a\t1542\ncommission\t1542\nsudeten st\t1543\nkenneth\t1543\n536\t1543\nautostrada adriatica\t1543\ntar\t1543\nsawyer\t1543\nalvares\t1544\nrn7\t1544\nhaza\t1544\nrecreational\t1544\neddy\t1544\nwireless\t1544\nlisesi\t1544\ncay\t1544\nris\t1544\nwilmington\t1544\ntemplo\t1544\nsevern\t1545\nmartini\t1545\nrundweg\t1545\nsiti\t1545\ncristovao\t1545\ntaberna\t1545\ngreenhill\t1545\ncrkva\t1546\nded\t1546\nwolfe\t1546\nn10\t1546\nparty\t1546\ncoutinho\t1546\npavlova\t1546\n3b\t1546\nbiudzhitnoi\t1546\nss3bis\t1546\npuntal\t1547\nathletic\t1547\nav de republiqu\t1547\nsandweg\t1547\n648\t1547\n707\t1547\ndogwood ln\t1547\njolly\t1548\nneur weg\t1548\n529\t1548\nd 47\t1548\noskar\t1548\nlaval\t1548\nlook\t1549\n714\t1549\npita\t1549\nd 54\t1549\nkato\t1549\npuskesmas\t1549\npasticceria\t1549\nwoodridge\t1549\ndistribution\t1550\nbashnia\t1550\ndayr\t1550\ndoris\t1550\nmolinos\t1550\nfly\t1550\nlagrange\t1550\ndoor\t1551\nari\t1551\nd 51\t1551\nsuper u\t1551\nstroitilni\t1551\nd 101\t1552\n483\t1552\nprefecture\t1552\n493\t1552\nfalling\t1552\nhydrant\t1552\nteso\t1553\nzeppelin st\t1553\nputnam\t1553\nhebron\t1553\nciclovia\t1553\nanlage\t1553\nraphal\t1553\ngenossenschaft\t1553\nsta cruz\t1554\nul chikhova\t1554\nraionni\t1554\nboloto\t1554\ntimiriaziva\t1554\njara\t1554\nah4\t1554\n398\t1554\nlune\t1554\nrite aid\t1555\nmisericordia\t1555\nrossiia\t1555\na25\t1555\ngordo\t1555\nmclean\t1556\nsumner\t1556\nus 421\t1556\nkohler\t1556\noblastnoi\t1556\nlift\t1556\ndreef\t1557\nfoire\t1557\nosh\t1557\nsp17\t1557\nguten bg st\t1557\nmuhlgasse\t1557\n579\t1557\nshaft\t1557\nbeulah\t1558\nalberdi\t1558\ns rd\t1558\n830\t1558\nblau\t1558\nmotta\t1558\ntreze\t1558\nmizuho\t1558\nwer\t1559\nrazina\t1559\nlemos\t1559\ngeo\t1559\nmolodizhna vulitsia\t1559\nmayflower\t1559\n220th\t1559\nsonic\t1559\nprofessionnel\t1559\n09780\t1559\nrashid\t1560\nlisi ukrainki vulitsia\t1560\nberliner ring\t1560\ngarda\t1560\narcos\t1560\navtosirvis\t1560\nrad\t1560\nleader\t1560\nintersport\t1560\nlois\t1561\nav jean jaures\t1561\nliberty st\t1561\ncreux\t1561\nkvetna\t1561\nuchilishchi\t1561\nprato\t1561\n671\t1561\nrua d\t1561\nchristina\t1561\nmeuse\t1562\nvino\t1562\nturun\t1562\nhomer\t1562\nrjm\t1563\nsaturn\t1564\ntrou\t1564\nul kuibyshiva\t1564\nmazda\t1564\nlazare\t1564\n128th\t1564\neconomica\t1565\nalcala\t1565\nwestbrook\t1565\nsauce\t1565\nhuckleberry\t1565\nfauvettes\t1565\nlovers\t1565\nasilo\t1566\nsugarloaf\t1566\nivanovka\t1566\ng320\t1566\nburr\t1566\nbdy rd\t1566\ndorozhnaia\t1566\npromyshlinnaia\t1567\nbackhaus\t1567\nah34\t1567\npila\t1567\n761\t1567\nlongwood\t1567\nredonda\t1567\nfrancesc\t1567\nstephenson\t1567\nbridgewater\t1567\nbreite st\t1567\ndicimbre\t1568\nul ostrovskogo\t1568\ncollir\t1568\njapanese\t1568\nhaag\t1568\nnathan\t1568\ncoolidge\t1568\nharmon\t1568\nrenard\t1569\nchin\t1569\nsanford\t1569\ngewerbe\t1569\nshkilna vulitsia\t1569\nfrancisca\t1569\nrat\t1569\npowder\t1569\nschone\t1570\nwurz\t1570\nregens\t1570\ncreu\t1570\nyoungs\t1570\njingnoripaku\t1571\nv monte grappa\t1571\ntony\t1571\nplot\t1571\na 61\t1571\nwojcicha\t1571\nmaharlika hwy\t1571\nvaz\t1571\nhall rd\t1572\nau st\t1572\ndaodalg\t1572\nvolodarskogo\t1572\nferinhaus\t1572\nseca\t1572\nc2\t1572\nbout\t1572\northodox\t1572\nlungo\t1573\ngrunwaldzka\t1573\nshow\t1573\nmystic\t1573\nc b\t1573\n941\t1573\nk 21\t1573\n660\t1573\nkroger\t1574\nadh\t1574\neight\t1574\nbourne\t1575\nseat\t1575\nofframp\t1575\nphilipp\t1575\nsp19\t1576\nroten\t1576\nkings rd\t1576\ngimnasio\t1576\narbys\t1576\nrumah penduduk\t1576\ntogliatti\t1576\n050\t1576\nul shivchinko\t1577\nrozy\t1577\nmonarch\t1577\nquntin\t1577\nstettiner st\t1577\nmaya\t1577\nspokojna\t1577\nbancroft\t1577\nrast\t1578\nhannah\t1578\nashwood\t1578\ndexter\t1578\nkorner\t1578\ncrrdo\t1578\nanse\t1578\ndali\t1578\norchard st\t1579\nresidences\t1579\nsafari\t1579\nr de po ste\t1579\njana pawla 2\t1579\ntriple\t1579\nmesquite\t1579\nbelgiqu\t1579\ncicha\t1579\nbark\t1580\nmosquito\t1580\nokrug\t1580\npodgornaia ul\t1580\n119th\t1580\nmeade\t1580\n8th av\t1580\ncarrington\t1581\nmariposa\t1581\nsauces\t1581\nchapel st\t1581\nghr\t1581\nwomens\t1581\ns n\t1582\nmahall\t1582\nruiny\t1582\nburnett\t1582\nd3\t1582\nrutherford\t1583\nreya\t1583\nbonnet\t1583\nsaone\t1584\n617\t1584\nmckay\t1584\nkit\t1584\n585\t1584\nsudeten\t1584\nvip\t1584\nk 20\t1585\naradi\t1585\nperiferico\t1585\nprivat\t1585\ngagarin\t1585\naliakmonas\t1585\njurgen\t1585\nfreight\t1586\nrachel\t1587\n752000\t1587\ntennyson\t1587\nd 59\t1587\necole maternelle\t1587\ndames\t1587\nd 103\t1587\nspozywczy\t1587\ntribunal\t1587\nhoofdweg\t1588\normes\t1588\ngoodwin\t1588\nperla\t1588\nhinden\t1588\nindustriale\t1588\nweide\t1588\npetrarca\t1588\n553\t1589\nreit\t1589\nautos\t1589\nludovico\t1589\neschenweg\t1589\nprimeveres\t1589\nkipling\t1590\nasda\t1590\ntrinta\t1590\namor\t1590\nsobor\t1590\nbasket\t1590\nstony cr\t1591\nrec\t1591\na34\t1591\nlhopital\t1591\nponta\t1591\nb 173\t1591\ndrummond\t1592\n653\t1592\nsalas\t1592\ndn6\t1592\nus 26\t1593\nuniversitaire\t1593\nmandela\t1593\nruine\t1594\nv torino\t1594\nsears\t1594\nhauptmann\t1594\ngin\t1595\nco rd\t1595\ngoias\t1595\nkhwr\t1595\n704\t1595\nrebecca\t1595\nloja\t1595\npsh 1\t1596\nhing\t1596\nprotection\t1596\ngrosso\t1596\njuliusza slowackigo\t1596\npotomac\t1597\nsalam\t1597\nschulgasse\t1597\nb 75\t1598\nmkhlp\t1598\npitt\t1598\nmilana\t1598\nkasztanowa\t1599\npalomar\t1599\nsp10\t1599\nus 9\t1599\nminisutotupu\t1599\nhalles\t1599\nlind\t1600\n835\t1600\nwyndham\t1600\ndimitrova\t1600\n14a\t1600\nsocorro\t1600\na18\t1600\nserres\t1601\nfundo\t1601\nchain\t1601\ngumes\t1601\ne4\t1601\nav s martin\t1602\npant\t1602\npercy\t1602\n484\t1602\nwilson av\t1602\nschuman\t1602\nalcantara\t1602\naldeia\t1602\nyork rd\t1602\nk 30\t1603\narapaho\t1603\nriverdale\t1603\nmdr\t1604\npenzion\t1604\ngroot\t1604\nmeson\t1604\ncoopers\t1604\nengine\t1604\nmenezes\t1604\nseverino\t1604\nk 15\t1604\n27k\t1604\nnations\t1604\nmaris\t1604\njunio\t1604\nmillenium\t1605\nrua 2\t1605\npaiva\t1605\nseminary\t1605\nw 7th st\t1605\nella\t1606\ncraft\t1606\ngenesee\t1606\nbalsa\t1606\ndrum\t1606\naugust bebel st\t1606\ne 7th st\t1606\nlongitudinal\t1606\ne 51\t1606\nkbysh\t1606\nrote\t1606\nsh 2\t1606\nfeldweg\t1607\nuzytek\t1607\nalpini\t1607\ngauge\t1607\nd 62\t1607\nsonne\t1607\nnightingale\t1607\nlindustri\t1607\ncooks\t1608\n804\t1608\nobrazovaniia\t1608\ncolectora\t1608\nmagnolia st\t1608\nul 8 marta\t1609\nmerrill\t1609\nvosges\t1609\nhalte\t1609\nschwarz\t1609\nvelazquz\t1610\nv 4 novembre\t1610\ngoya\t1610\ngleis\t1610\nsong wu\t1611\npalacios\t1611\nhelsingin\t1611\nrough\t1611\nmarcus\t1611\nscuole\t1612\nwelch\t1612\npanoramaweg\t1612\n113th\t1612\nlong branch\t1612\nmike\t1613\nashby\t1613\nmbh\t1613\ndillon\t1613\nmurillo\t1613\n642\t1613\n624\t1613\nbh\t1613\nsr 7\t1614\nfayette\t1614\ncobblestone\t1614\njennifer\t1614\nmcdowell\t1614\ngendarmeri nationale\t1614\nroutire\t1614\ndipo\t1614\nintendente\t1615\nislam\t1615\nsalvation\t1615\nstoianka\t1615\nvereinsheim\t1615\nstill\t1616\ngerald\t1616\nbuffalo cr\t1616\nuniversitaria\t1616\nrex\t1616\njerome\t1616\njeu\t1616\ntecnico\t1617\nkaiser st\t1617\nperron\t1618\nmini mkt\t1618\npochtovaia ul\t1618\ngereja\t1618\nspringdale\t1619\nley\t1619\nbandera blanca\t1619\nmatias\t1619\npeaks\t1620\npantai\t1620\nsouthside\t1620\naston\t1620\nmerkezi\t1621\nhun\t1621\nphillip\t1621\ninter\t1621\nmqbrte\t1621\nnimes\t1621\npompidou\t1621\nmalefrkt\t1621\nmarcelino\t1621\nzob\t1622\ndulce\t1622\nsecret\t1622\nplm\t1622\nmiai\t1622\nquarry rd\t1622\nliberdade\t1622\nnurnberger\t1623\nsiquira\t1623\nvelky\t1623\nligne de paris montparnasse a brest\t1623\nflug\t1624\nan post\t1624\nautostrada del sole\t1624\npope\t1624\nbwlk\t1624\npolski\t1624\ngrafton\t1624\npommirs\t1624\nkpp\t1624\nc 21\t1624\nzamek\t1625\nkiraly\t1625\nus 395\t1625\nnagoya\t1625\nuse\t1625\nlitiia\t1625\nkeys\t1626\naussicht\t1626\nrezerwat\t1626\ngiardini\t1626\nallan\t1627\nhoward st\t1627\nkanaal\t1627\nbraz\t1628\nislamic\t1629\n813\t1629\nkokudo\t1629\nearth\t1629\ndalla\t1629\nrobert koch st\t1629\npumping\t1630\nalb\t1630\nbri rd\t1630\nmkhfr\t1630\nstruga\t1630\ns francisco\t1631\nsta fe\t1631\nrialto\t1631\ndundee\t1631\nomega\t1631\nkingswood\t1631\nstaw\t1631\nvirge\t1631\nlava\t1632\ngebel\t1632\ns migul\t1632\nambulance\t1633\nfalcone\t1633\nboucher\t1633\noder\t1633\nrch\t1633\norquideas\t1633\ngriffith\t1633\nlenin st\t1633\n581\t1633\nluc\t1634\napostolic\t1634\npreto\t1634\nderwent\t1634\n851\t1634\nachille\t1635\nemily\t1635\nkhmyny\t1635\npartizanska\t1635\nprogress\t1635\nitau\t1636\njugend\t1637\ncr 4\t1637\nsauro\t1637\n16a\t1637\nsp15\t1637\nmurcia\t1637\nfap\t1638\nrioja\t1638\n1 77\t1638\nmacedo\t1638\nkimball\t1638\nkirkwood\t1638\nsuisse\t1638\nr du parc\t1638\netangs\t1638\ndinh\t1639\npikarnia\t1639\noliva\t1639\nschuh\t1639\nreino\t1639\nbrow\t1640\nalgeri\t1640\nvital\t1640\naguiar\t1640\nmarqutte\t1640\nng\t1640\nsraid\t1640\ncasablanca\t1640\nnicolau\t1641\ncommerzbank\t1641\nhoffman\t1641\nvir\t1641\nprison\t1641\nmahmud\t1642\nmigros\t1642\nminzoni\t1642\nlavender\t1642\nsunkus\t1642\nchamplain\t1643\ncommunal\t1643\nkebap\t1643\nrye\t1644\nberri\t1644\ncaracas\t1645\nznqte\t1645\noak av\t1645\ncountryside\t1645\nindustris\t1646\ngheorghe\t1646\naction\t1646\naugs\t1646\nadirondack pk\t1646\nbrooke\t1646\nstn st\t1646\nirrigation\t1646\nhill rd\t1646\nsycamore st\t1647\npopolare\t1647\na40\t1647\n145th\t1647\nd 55\t1648\nrosengarten\t1648\nsinkansen\t1648\nsheriffs\t1648\ncamus\t1648\nbeech st\t1648\n117th\t1649\nmiqul\t1649\nversailles\t1649\nsteige\t1649\nmediterranee\t1649\npennsylvania av\t1649\nrenaissance\t1649\nrego\t1650\nconstant\t1650\nlevant\t1650\nbelleville\t1651\nv giovanni pascoli\t1651\nnaftal\t1651\n469\t1651\nc 31\t1651\nelectrical\t1651\njones rd\t1651\nabdullah\t1651\ncoqulicots\t1651\nmhdy\t1651\ndelgado\t1651\nalte df st\t1652\nzand\t1652\nrutland\t1652\nlipa\t1652\nangus\t1652\n124th\t1652\ntiatr\t1652\nintersection\t1652\nferndale\t1652\nbs\t1653\nwaverley\t1653\nbruyere\t1653\nbundes st\t1653\nmeat\t1653\n584\t1653\ndavenport\t1653\n725\t1653\ntower rd\t1653\nschnellfahrstrecke\t1653\nc 19\t1653\n394\t1653\n1 76\t1653\nindustriweg\t1654\nbiograd\t1654\noja\t1654\nharlem\t1655\npaddy\t1655\nchaux\t1655\nmauricio\t1656\ncavendish\t1656\ntancredo\t1656\nskoda\t1656\n905\t1656\ncora\t1656\ntip\t1656\ngonzales\t1656\npliazh\t1656\nroter\t1656\nhighland dr\t1657\ncr 8\t1657\nk 17\t1657\nmaple dr\t1657\nextended\t1657\nhoofd st\t1657\nantirrio\t1657\njoshua\t1657\n399\t1657\nliuksim\t1658\nkingsley\t1658\nbianca\t1658\nplanck\t1658\nsonnen st\t1658\nsolano\t1658\nfliss\t1658\nmobel\t1659\nwe\t1659\nhauptschule\t1659\n396\t1659\nwester\t1659\nlindenallee\t1659\npress\t1660\nsonnenweg\t1660\ncel\t1661\nlockwood\t1661\nch du moulin\t1662\nhonore\t1662\ne6\t1662\nfortune\t1662\nv giacomo leopardi\t1662\n903\t1663\nr de liberation\t1663\nruben\t1663\nopera\t1663\nenlace\t1663\nlauro\t1663\nmercadona\t1663\ndiramazione\t1664\nsola\t1664\nd 86\t1665\nd 65\t1665\nalefralefdy\t1665\nterminus\t1665\ntracy\t1665\npitch\t1665\n713\t1665\ntake\t1666\nmakdonalds\t1666\nfarmington\t1666\nliutenant\t1666\nbrookville\t1666\nchata\t1667\nponto\t1667\nd 53\t1667\nsteig 1\t1667\nlana\t1667\nponts\t1668\nunderwood\t1668\ngerais\t1668\nwola\t1668\nhoog\t1668\nleal\t1668\n911\t1669\nleft\t1669\nhardt\t1669\nwyoming\t1669\ndoc\t1670\nd2\t1670\nwelsh\t1670\nfat\t1670\nfarias\t1670\npuma\t1670\n643\t1670\n590\t1670\nbeaverdam cr\t1670\npink\t1671\nshing\t1671\nlige\t1671\nbursztynowa\t1671\ntepesi\t1672\ndachnaia ul\t1672\nhom\t1672\nmunchner\t1672\nsosnovaia\t1672\nkommune\t1672\nbldgs\t1673\nalberta\t1673\ntryn\t1673\n654\t1673\ncantr\t1673\n703\t1674\nscotts\t1674\nfun\t1674\n16th st\t1674\ngoroda\t1674\nciclabile\t1674\nlarkspur\t1674\nriga\t1674\nblqu\t1674\nmuseu\t1674\ndoma\t1674\nmiro\t1675\nbrian\t1675\nsegura\t1675\ne 6th st\t1675\nk 29\t1675\ncamp cr\t1675\nsandstone\t1675\npiaskowa\t1676\nlva\t1676\n1075\t1676\nnestor\t1677\nswm\t1677\ncommerciale\t1677\nsaxon\t1677\nisabella\t1677\nvic\t1677\nrennes\t1678\nkrone\t1678\ne 19\t1678\nturismo\t1679\ndecatur\t1679\ns50\t1679\nmb\t1679\nibanez\t1679\nv papa giovanni xxiii\t1680\nloon\t1680\noak dr\t1680\nperth\t1680\ncaritas\t1680\npatria\t1680\nfrederico\t1681\nkomenskeo\t1681\nperumahan\t1681\nlcl\t1681\nkelapa\t1681\njuscelino\t1681\nthw\t1682\naleflsyd\t1682\nhibiscus\t1682\ntemeto\t1682\nrias\t1682\neglise st pirre\t1683\ncapitaine\t1683\n122nd\t1683\nlindenhof\t1683\nshoppu\t1683\nthalmann\t1683\nn6\t1684\ndavis rd\t1684\n5e\t1684\npestalozzi st\t1684\ngirard\t1684\nmacon\t1684\nul suvorova\t1684\nmoores\t1685\nagra\t1686\nmaisons\t1686\nwayside\t1686\ne 46\t1686\nfo u\t1686\nbiriozovaia\t1687\ncincias\t1687\nzdanii\t1687\nelsa\t1687\nd 60\t1688\nplatanes\t1688\ncattle\t1688\nmatsuyama\t1688\nrosso\t1688\njonquilles\t1688\naleksandra\t1688\nshkolni piriulok\t1688\naltalanos\t1688\nul nikrasova\t1688\nquartz\t1688\nchristophe\t1688\n114th\t1688\ns 1st st\t1688\nute\t1688\nocampo\t1689\nah42\t1689\nmontserrat\t1689\nraduga\t1689\ntabac\t1689\ngift\t1689\npony\t1690\nrodnik\t1690\narenal\t1690\ng18\t1690\nwaterside\t1690\nasian\t1691\nwilshire\t1691\nretiro\t1691\ncandelaria\t1691\nbart\t1691\nnogales\t1691\ntsikh\t1692\neichen st\t1692\nmalo\t1692\nc st\t1693\nchaves\t1693\ns3\t1693\npalms\t1693\nhaj\t1694\nmanila\t1694\ncura\t1694\n1 69\t1694\nfold\t1694\nheilig\t1694\nikea\t1694\nstuttgarter\t1695\nharav\t1695\njebel\t1696\npolitsii\t1696\nptilo\t1696\nduca\t1696\n389\t1696\nbunavista\t1696\nairstrip\t1696\nschon\t1697\navtovokzal\t1697\njennings\t1697\n920\t1697\nkei\t1697\nwith\t1697\neko\t1697\n803\t1697\nk 18\t1697\npubla\t1698\nsoria\t1698\nbalboa\t1698\nplanta\t1699\nveld\t1699\nstoke\t1699\ncmentarna\t1699\nplc\t1699\nrath\t1699\ntoms\t1700\n906\t1700\nwatkins\t1700\npavillion\t1700\n763\t1700\nsims\t1700\nses\t1701\nneighborhood\t1701\nnebraska\t1701\nchataignirs\t1701\nrenhomu\t1701\nnone\t1701\nnina\t1702\nsportpark\t1702\nmigafon\t1702\n705\t1702\nhmyd\t1703\ntemporary\t1703\nhs2\t1703\nyhvdh\t1703\ntiffany\t1703\nlotto\t1704\nchowk\t1704\njeans\t1704\ndeu\t1705\nbonner\t1705\nep1\t1705\nfrontir\t1705\nchurch of christ\t1706\n633\t1706\nhin\t1706\nsainyd\t1706\nd 63\t1706\ncarrefour mkt\t1706\nsalado\t1706\nimmobilir\t1706\nd 48\t1707\ns6\t1707\nkombinat\t1707\n132nd\t1707\nregi\t1708\neduard\t1708\nus 412\t1708\ncoat\t1709\noak ln\t1709\nsampaio\t1709\ndeep cr\t1709\n938\t1709\nadrian\t1710\nfinancial\t1710\ncentral telephoniqu\t1710\nbolz pl\t1710\nsuffolk\t1710\nbala\t1710\ne w hwy\t1710\nanglican\t1710\nukrposhta\t1710\ndwor\t1710\n549\t1711\nstart\t1711\nhaydn\t1711\npiro\t1711\nlantern\t1711\nbowl\t1711\nluisa\t1712\ntivoli\t1712\nqasr\t1712\nrudnia\t1712\nstephan\t1712\nopposite\t1712\n805\t1713\ncid\t1713\ncoppice\t1713\njacaranda\t1713\nkyle\t1713\nnero\t1713\nnamha\t1713\npive\t1713\nsheldon\t1714\nprofesor\t1714\nharrington\t1714\ndalsace\t1714\nsolnichni\t1714\n730\t1714\nkgv\t1714\ndike\t1714\nmdrsh\t1715\nonramp\t1715\ncollection\t1715\ntramway\t1715\nalexandria\t1715\nstadtwerke\t1715\nsuki\t1716\nvilar\t1716\n616\t1716\nsolo\t1716\n1001\t1717\njamaica\t1717\nsovkhoznaia ul\t1718\nmaipu\t1718\notoyolu\t1718\ncasey\t1718\ncomendador\t1720\nboris\t1720\nqalefrte\t1720\nbrady\t1721\nremparts\t1721\nengels\t1721\nconsultorio\t1721\nbif\t1721\nconference\t1721\ncasanova\t1721\ncitrus\t1722\ndunbar\t1722\nkam\t1722\npicard\t1723\nmur\t1723\nstadio\t1723\n135th\t1723\npatch\t1723\ng7011\t1723\nmunicipios\t1724\ngewerbepark\t1724\nbertha\t1724\nshore ln\t1724\nschweiz\t1724\noshchadbank\t1724\nbulu\t1724\ngyeongbu hsl\t1725\nschubert st\t1725\nyellowhead hwy\t1725\ntsvity\t1725\nforster\t1725\nbuy\t1725\nleone\t1725\npascual\t1726\nwilson rd\t1726\nmori\t1726\nmkad\t1726\nhogar\t1726\nindustry\t1726\nnavarra\t1727\nburgess\t1727\nreformed\t1727\n1deg\t1727\nrizal\t1727\ndenton\t1728\nchesterfild\t1728\ntel\t1728\ncondor\t1728\ncamelot\t1728\n1 55\t1728\ndept\t1729\nhavre\t1729\ncache\t1729\ngraveyard\t1729\nqa\t1729\nlansdowne\t1730\nancins\t1730\ng104\t1730\nspice\t1731\ndorothy\t1731\nfontane\t1731\nlandwer\t1731\nhazelwood\t1731\nthorpe\t1732\nobkhod\t1732\nwitte\t1732\npola\t1732\nb 87\t1732\ndavis st\t1732\nbrands\t1732\nnf\t1732\nveiga\t1733\nkurze\t1733\nnagornaia ul\t1734\ngobernador\t1734\n810\t1734\npoco\t1734\nmadame\t1734\noakley\t1735\nagricultural\t1735\nshahid\t1735\nbivio\t1736\nnot\t1736\nquarters\t1736\nsr11\t1736\ncrosby\t1736\ngrushivskogo\t1736\ndir\t1736\ndarwin\t1736\nshan yang xin gan xian\t1736\nabbe\t1736\n118th\t1736\nmodern\t1736\nopal\t1736\nthistle\t1737\nlok\t1737\nul druzhby\t1737\nhog\t1737\nfloresta\t1738\n636\t1738\nsteg\t1738\nn5\t1739\npulaski\t1739\ntrenton\t1739\nlahden\t1739\nk 14\t1740\nkruger\t1740\nrailway av\t1740\ncuvas\t1740\nhouses\t1740\ndispansir\t1741\nprint\t1741\nsy\t1742\nsteiner\t1742\nsulphur\t1742\njednota\t1743\nbunos aires\t1743\nforras\t1744\ncorps\t1744\nlotos\t1744\nseaviw\t1744\nups\t1744\n2eme\t1744\nsberbank\t1745\nservicios\t1745\nkenilworth\t1745\nkagoshima\t1745\ne 08\t1746\nwerkstatt\t1746\ne 30 ah6\t1746\nintirnatsionalnaia ul\t1746\nsalles\t1746\n626\t1747\nchopin\t1747\nprofessional\t1747\nd 41\t1747\nquiroz\t1747\nr de verdun\t1747\nhar\t1747\ns 4th st\t1748\nhain\t1748\nmatthias\t1748\nmack\t1749\nc 25\t1749\ngrouse\t1749\na 38\t1749\nclifford\t1749\nfedex\t1749\nyrigoyen\t1750\nusa\t1750\nchevrolet\t1750\narden\t1750\n456\t1750\nkretes\t1750\nalvarado\t1750\nwabash\t1750\npadova\t1751\na23\t1751\ncarrires\t1751\ntsvitochnaia ul\t1751\na 20\t1752\nw rd\t1752\nkenwood\t1752\nzhuo\t1752\nlt r\t1753\niga\t1753\ndario\t1753\nskyline dr\t1753\nmintaqat\t1753\ntruda\t1753\ncolli\t1754\nkekurinituku\t1755\nblind\t1755\nchif\t1755\nadj\t1755\nmainzer\t1756\n25 de mayo\t1756\nfiliale\t1756\ndan in luan huang xin\t1756\nbahnstrecke\t1756\nfridens st\t1756\nfurnace\t1757\nwoodbury\t1757\nfabio\t1757\nreiseburo\t1757\n25a\t1757\nsp8\t1758\nus 202\t1758\n458\t1758\ncredito\t1758\nr des pres\t1758\ncomisaria\t1758\ndowning\t1758\nmiru vulitsia\t1759\nhess\t1759\nr neuve\t1759\novido\t1759\nsasso\t1759\nevangelica\t1759\nbonn\t1759\nmm\t1760\nstroitilnaia\t1760\nbrisas\t1760\nconstitution\t1760\nelephant\t1760\nmateos\t1760\nzdorovia\t1761\nrivoliutsii\t1761\nwillard\t1761\nhoi\t1761\nvelho\t1761\ngrune\t1761\ncatedral\t1762\nmarkit\t1762\nsovitskii\t1762\nclaudia\t1762\npershing\t1763\nchef\t1763\nd 42\t1763\nmartina\t1763\nbro\t1763\nguard\t1764\n940\t1764\nstambanan\t1764\nlinina ul\t1765\nsoda\t1765\ncatania\t1765\ngasuto\t1765\nkompaniia\t1766\nkhlf\t1766\nw 6th st\t1766\nnavy\t1766\nalegria\t1766\nc 20\t1767\nhamad\t1767\nr du 19 mars 1962\t1767\nshah\t1767\nbayshore\t1767\nvishniovaia\t1767\nsanhardio\t1767\ns10\t1768\npalaia\t1768\ntio\t1768\nminh\t1768\nmobility\t1769\nfernwood\t1769\npinecrest\t1769\natlantiqu\t1769\nalbuqurqu\t1770\nisa\t1770\nproduktovi\t1771\ndozsa gyorgy u\t1771\npidmont\t1771\njenny\t1771\n109th\t1771\n200th\t1771\nwalters\t1772\ndeutsche bank\t1772\nmila\t1772\nmalta\t1772\ndao42\t1772\ncr rd\t1772\nwellness\t1772\nlarisa\t1773\nstuttgart\t1773\nnail\t1773\na28\t1773\nkhashm\t1773\nmorse\t1774\nwoolworths\t1774\nb 14\t1774\nvall\t1774\nsirgiia\t1774\nbouleaux\t1775\nlowe\t1775\npochtovaia\t1775\nd 67\t1775\nkutuzova\t1775\nbridges\t1776\nfoscolo\t1776\nniva\t1777\npardo\t1777\nwilton\t1777\nmelody\t1778\n17a\t1778\ne 5th st\t1778\nleng\t1778\nnajswitszej\t1779\ndao9\t1779\nbrowning\t1779\nohiggins\t1780\nrosemary\t1780\nlilly\t1780\nxxv\t1780\nhanna\t1781\nmasseria\t1781\nb 71\t1781\nmorrisons\t1782\nwatts\t1782\nsra\t1782\nfee\t1782\nadventure\t1782\nady endre u\t1782\nr3\t1782\nsandy ln\t1783\nlee st\t1783\nkebun\t1783\nkafe\t1783\nus 13\t1783\nupton\t1783\ncrtjo\t1784\nmadison av\t1784\nzilina\t1784\nbolshii\t1785\nlaunch\t1785\nhiggins\t1786\ngreenwich\t1786\ndi2\t1786\nzhong yang zi dong ch dao\t1787\nforges\t1787\ngiles\t1787\npare\t1787\npepe\t1787\nsubstation\t1787\nturginiva\t1788\nlumber\t1788\namsterdam\t1788\nvillaggio\t1788\nbanco do brasil\t1788\nbarca\t1788\ndeutsche bahn\t1789\ns 2nd st\t1789\nfrazione\t1789\na 45\t1789\nus 51\t1789\nbab\t1789\navis\t1789\norr\t1790\nwein bg st\t1790\nnagy\t1790\namir\t1791\ngraniczna\t1791\nzapadnaia ul\t1791\nditrich\t1791\nbeaufort\t1791\nd 43\t1792\nruins\t1792\nv galileo galilei\t1792\nswiss\t1792\n619\t1792\nukraina\t1792\nmary st\t1793\nbarrington\t1793\nurbano\t1793\n950\t1793\neastbound\t1794\npater\t1794\nd100\t1794\nastrid\t1794\n116th\t1794\nsandwich\t1794\ndoce\t1795\notp\t1795\nmayfair\t1795\nrio grande\t1795\nsandra\t1795\nsas\t1796\nespirito\t1796\nlivestock\t1796\n543\t1797\nbrk\t1797\ng312\t1797\nparallelweg\t1797\nliningradskaia\t1797\nfriden\t1798\ns 3rd st\t1799\nbuckhorn\t1799\nakacjowa\t1799\nyankee\t1799\nara\t1799\ntrafalgar\t1799\nparking lot\t1800\nosorio\t1800\nmiklos\t1800\nkommunistichiskaia ul\t1801\npizzaria\t1801\nvelez\t1801\nalem\t1801\nsnyder\t1801\nshd\t1802\n447\t1802\nmusa\t1802\ntaylor st\t1803\nveterinaria\t1803\naguilar\t1803\n007\t1803\ncampana\t1804\nguadalajara\t1804\nmarka\t1804\navellaneda\t1804\nsport pl\t1804\nus 82\t1804\nvoor\t1805\nbonne\t1805\ng318\t1805\nmemory\t1805\nkapel\t1806\ncheval\t1806\nyuba\t1806\nschumann\t1807\ngalicia\t1807\nelb\t1807\nunidade\t1807\nhawr\t1807\nn 4\t1807\n720\t1807\nc mayor\t1807\nbeth\t1807\nm 2\t1808\nbooks\t1808\ncable\t1808\nfleischerei\t1808\noakridge\t1808\nmimosas\t1809\nweiden\t1809\ncondominium\t1809\ncatalunya\t1809\nlacs\t1810\n711\t1810\nv giosu carducci\t1810\nlevi\t1811\nfarma\t1811\nnara\t1811\nw 5th st\t1812\nbat\t1812\ngawa\t1812\nstaples\t1812\nhag\t1812\nmorin\t1812\nmancha\t1812\nsharp\t1812\nbelen\t1813\ntsv\t1813\ntome\t1813\nlaboratorio\t1813\n12a\t1813\nmatthew\t1813\nelectoral\t1813\nswitej\t1813\n428\t1814\nsalle des fetes\t1814\nwestbound\t1815\nflughafen\t1815\nsteen\t1815\nmodel\t1815\nconvention\t1815\njeep\t1815\npairc\t1816\nprescott\t1816\n952\t1816\nschoolhouse\t1816\nwynd\t1816\nbraun\t1817\ntherese\t1817\nbarr\t1817\nd 44\t1817\nlager\t1818\nsf\t1818\nsviatoi\t1818\nbranca\t1818\nfra\t1818\neducacao\t1818\ncedro\t1818\nbahndamm\t1819\nworcester\t1819\nslovenska\t1819\nbreuil\t1819\nbeatrix\t1819\ne 442\t1820\nsans\t1820\nmulino\t1820\ncova\t1820\n487\t1820\ncaterina\t1820\nc1\t1820\nmaggiore\t1820\nt1\t1820\neichendorff\t1821\n575\t1821\ntelephoniqu\t1822\na 10\t1822\n702\t1822\ngerhard\t1822\nwestern av\t1823\nneptune\t1823\ncarniceria\t1823\nkhshm\t1823\nvit\t1823\nvelocidad\t1824\npodgornaia\t1824\ndairy quen\t1824\nkloster st\t1825\nbrug\t1825\nsaar\t1825\nsantanna\t1825\ng1\t1825\nserena\t1825\npratt\t1826\nkarel\t1826\nsaavedra\t1826\njinghu\t1826\ndelhi\t1827\ne 105 ah8\t1827\npresse\t1827\nros\t1827\n710\t1827\nvalea\t1827\nvoroshilova\t1827\ngatve\t1827\nbert\t1827\ndorset\t1827\nmaxi\t1828\nshoreline\t1828\npiliakalnis\t1828\npeacock\t1829\ndavids\t1829\nmitterrand\t1829\nfrog\t1829\nchaikovskogo\t1829\ntommaso\t1830\ntulpenweg\t1830\nrathaus st\t1831\ntoscana\t1831\nmonnet\t1831\nhansen\t1831\ncam\t1831\nhanson\t1831\ntaylors\t1832\nlorca\t1832\nseasons\t1832\ndolce\t1833\ngiorgi\t1833\n655\t1833\nismail\t1833\nnorthside\t1833\nalain\t1833\ngunther\t1833\ngedung\t1833\nbuda\t1834\nmercato\t1834\ncabot\t1834\ninstitution\t1834\nus 98\t1834\nuni\t1834\nul svobody\t1835\nfrancais\t1836\ne leclerc\t1836\naddison\t1837\nmontagu\t1837\nkifernweg\t1837\nhirondelles\t1838\nlake dr\t1838\nbudget\t1838\nspot\t1838\n614\t1838\ntsdng\t1839\nsalman\t1839\ncorazon\t1840\ninferiore\t1840\nfalken\t1840\ngorod\t1841\nbray\t1841\nmiller rd\t1842\nc 18\t1842\nmauro\t1842\nkreuz st\t1842\nmarker\t1842\nrus\t1843\nirma\t1843\nwater tank\t1843\nafrica\t1844\ngrosvenor\t1844\nbogen\t1844\nostre\t1845\na32\t1845\nnormandy\t1845\nolivos\t1845\nvelasco\t1845\naldea\t1845\nargentino\t1846\nvivaldi\t1846\ntransportation\t1846\npeoria\t1847\ncolina\t1847\nluca\t1847\ngelateria\t1847\nblackburn\t1847\nnicolo\t1848\n661\t1848\nnorthbound\t1849\ncone\t1849\nhurricane\t1849\nphoto\t1849\nfiguroa\t1849\na26\t1849\nmud cr\t1850\npowers\t1850\ncamera\t1850\ninfant\t1850\nanillo\t1851\nquaker\t1851\neaux\t1851\ncimarron\t1852\nker\t1852\nalefldyn\t1852\nintirnatsionalnaia\t1852\nk 9\t1853\nbloomfild\t1853\n111th\t1854\npiper\t1854\nlouisiana\t1854\nvestre\t1854\nfull\t1855\nyew\t1855\nlakeland\t1855\nmshh\t1855\nsoledad\t1856\nhintere\t1856\ndora\t1856\n101st\t1856\nr de paix\t1857\ngraves\t1857\nrispubliki\t1857\nsal\t1857\ncarver\t1858\nural\t1858\nsegundo\t1858\njoffre\t1858\ndelicias\t1858\nralph\t1859\ndigital\t1859\nw 1st st\t1859\n46k\t1859\nrer\t1860\ns pedro\t1860\ne 12\t1860\nr du 8 mai 1945\t1860\npagoda\t1860\nartigas\t1860\npeachtree\t1861\nkomsomolska vulitsia\t1862\nregionale\t1862\ncyu\t1862\nnew st\t1862\nforbes\t1862\nsilver cr\t1862\nmktb\t1863\nd 40\t1863\ngovt\t1863\nbrown st\t1863\nhoher\t1864\nwincentego\t1864\nbertrand\t1864\nnazario\t1865\n1 84\t1865\nferrer\t1866\n528\t1866\nwilliams st\t1866\nunity\t1866\nvalero\t1867\ndong bei zi dong ch dao\t1867\nangels\t1867\nmeeting\t1868\n583\t1868\nwindermere\t1869\nly\t1869\ns5\t1869\ndartmouth\t1869\ncompton\t1869\nbuhl\t1869\nronco\t1870\nforno\t1870\nlinwood\t1870\nprincesa\t1870\ndominion\t1870\nhome depot\t1870\ngron\t1870\nmontparnasse\t1870\ngreenbriar\t1870\nplessis\t1870\nzs\t1871\nhenryka sinkiwicza\t1871\nsakura\t1871\nfawy dr\t1872\nchildren\t1872\njohnson st\t1873\nanni\t1873\nmonticello\t1873\na52\t1873\nrooms\t1874\nalicante\t1874\nquinze\t1874\n907\t1874\nbeauliu\t1874\nki\t1874\nkopernika\t1875\nkr\t1875\nsella\t1875\nlaboratory\t1875\nmal\t1876\nhickory st\t1876\nstirling\t1876\nprospect st\t1876\nmendez\t1876\ngonzaga\t1876\nsteele\t1877\ncr 2\t1877\nssh\t1877\nfabrik\t1877\nsud st\t1877\nabbott\t1877\ng35\t1877\niso\t1877\nscott st\t1878\nvasil\t1878\noriole\t1878\ncanon\t1879\nshbyl yshralefl\t1880\ndebowa\t1880\ntap\t1880\nhautes\t1880\nxiong ye ji dao\t1880\nvogel\t1880\nnurul\t1880\nchau\t1880\nvogelsang\t1881\nmahallesi\t1882\n005\t1882\nd 52\t1882\ntownline\t1882\nkhyym\t1883\ncedar ln\t1883\npersimmon\t1883\nlegacy\t1884\nd 57\t1884\nfairmont\t1884\neaston\t1884\nsobrinho\t1884\nzan\t1885\npalefrkh\t1885\nireland\t1886\nmoody\t1886\necuador\t1886\nmajestic\t1887\ncompj\t1888\n368\t1888\npozzo\t1888\ncassia\t1888\nbandar\t1888\nsouthbound\t1888\nswallow\t1888\nnoisy\t1889\ncaceres\t1889\ns7\t1889\nharrison st\t1889\nussuri\t1889\ndance\t1890\ndream\t1890\nvasconcelos\t1891\nkingdom hall of jeovahs witnesses\t1891\nouled\t1891\nceip\t1891\nsequoia\t1891\nluxem\t1891\nhoffmann\t1891\nchips\t1891\nmarlborough\t1891\nzhiliznaia\t1892\ncarmo\t1892\nevelyn\t1892\nn 6th st\t1892\n609\t1892\nbartlett\t1892\nqia\t1892\nn12\t1892\nmarszalka\t1892\nnilo\t1893\nsturgeon\t1893\nbattery\t1893\npiotra\t1894\neel\t1894\nkazmunaigaz\t1894\nviking\t1894\nd 117\t1894\ndick\t1895\nbrookwood\t1895\ng109\t1895\nviolettes\t1895\nk 13\t1895\nplatte\t1896\nponce\t1896\ntroncal\t1896\npway\t1896\npl de republiqu\t1897\ntecnica\t1897\nus 71\t1897\nkruis\t1898\ncaribou\t1898\nkapellen st\t1898\nkis\t1898\nus 54\t1898\ncappella\t1898\npirvomaiskii\t1898\nblackberry\t1898\nflur\t1899\nmerced\t1899\nv alessandro volta\t1899\nv nazionale\t1899\nwaterhole\t1900\n46n\t1900\ntopaz\t1901\naleflwtnyte\t1901\nsovkhoznaia\t1901\nmulhouse\t1901\nneedles\t1901\nsisters\t1901\nzurich\t1902\nolga\t1902\nkeikyu\t1902\nvinas\t1902\neducativa\t1902\ngore\t1903\noyster\t1903\noutdoor\t1904\njura\t1904\npriure\t1904\nschwimmbad\t1904\n449\t1905\ncollege st\t1905\nraionnaia\t1906\npetites\t1906\nruchii\t1906\n951\t1906\nmonts\t1906\nvisconde\t1906\nbidea\t1907\nnicholson\t1907\nsady\t1907\ncromwell\t1907\nkommunistichiskaia\t1908\nhubbard\t1909\noutubro\t1909\nss11\t1909\n86k\t1909\nsteak\t1910\nbeijing\t1911\ngilles\t1911\namaro\t1911\nchance\t1911\nbellini\t1912\naleflhsn\t1912\natlas\t1913\nwood st\t1913\naugustin\t1913\nuritskogo\t1913\narboretum\t1913\ndivision st\t1913\ncoronation\t1914\nclearviw\t1915\npertini\t1915\navtozapchasti\t1915\ndoctors\t1915\n125th\t1916\nk 11\t1916\nshrkte\t1916\nagias\t1916\ncongress\t1916\nsioux\t1916\njuli\t1916\nalouttes\t1917\nland st\t1917\nbahn st\t1919\ngs\t1919\nr jean moulin\t1920\nthi\t1920\npota\t1920\nluzia\t1920\nbway st\t1920\nshossiinaia ul\t1921\ncruzeiro\t1921\n97th\t1921\nalmond\t1921\nalef\t1922\nmalaga\t1922\nlmg\t1922\nn 3\t1922\ne 57\t1922\ndeich\t1922\nborough\t1923\nsmk\t1923\ngeschwister\t1923\nsecours\t1923\nburnside\t1923\nphone\t1923\nrua c\t1923\nshuiku\t1924\nfiguiredo\t1925\ninsel\t1925\ncorniche\t1925\nrustic\t1925\nglobus\t1926\nmeisenweg\t1926\nkarl st\t1926\nviola\t1927\ncelso\t1927\nskate\t1928\n93rd\t1928\ntwy\t1928\nkastaninweg\t1928\nmoritz\t1928\nosage\t1928\nypf\t1928\nmeadowlark\t1929\nmanhattan\t1929\ndetroit\t1929\ng20\t1929\ngrau\t1929\n485\t1930\nprados\t1931\njln\t1931\n15th st\t1931\ntattoo\t1931\nfc roca\t1932\nborne\t1932\n641\t1933\nco operative food\t1933\npch\t1933\ncalhoun\t1933\n1944\t1933\ntnk\t1934\nconrad\t1934\nmarga\t1934\nbaikalo amurskaia magistral bam\t1934\nchino\t1935\nsmiths\t1935\nesch\t1935\narany\t1935\ngreenville\t1935\npound\t1935\nus 67\t1936\nvas\t1936\nfiat\t1936\nnuovo\t1936\ncycles\t1937\nshrqy\t1937\nprimary school\t1937\nus 81\t1937\n41a\t1937\nproperty\t1938\nmaas\t1938\nvirgin\t1938\nsong shan dao\t1939\nblaise\t1939\nishan\t1939\ntheodore\t1939\nbrenner\t1939\n1 65\t1939\nherzog\t1939\npearson\t1939\nbem\t1939\nsudring\t1940\nmartin st\t1940\nklinika\t1940\ncarranza\t1940\nabad\t1941\ntlwy\t1941\nbil\t1941\nviva\t1942\n060\t1942\n379\t1942\nhunting\t1943\nmuhl st\t1943\nr des vignes\t1943\nmolodizhna\t1944\nracine\t1944\nnepal\t1944\ncombes\t1945\naurelio\t1945\nawo\t1945\nfasanenweg\t1945\nmiraflores\t1946\nmustang\t1946\nlarga\t1946\nemiliano zapata\t1946\nclarendon\t1946\ngarrison\t1947\nstanford\t1947\ncornell\t1947\nlandgasthof\t1947\nsilskii\t1947\ndaimler\t1948\nwilliamson\t1948\nmtr\t1948\ngrizzly\t1949\nsikorskigo\t1949\nwedgewood\t1949\nc real\t1949\nphiladelphia\t1950\noito\t1950\nbrigada\t1950\ndijk\t1951\n542\t1952\n1 winkel\t1952\nkommun\t1952\n541\t1952\npartizanskaia ul\t1952\n457\t1953\nbells\t1953\njoyce\t1953\npra\t1953\nhansalini\t1953\nautokinetodromos pathe\t1953\ne 261\t1953\ncapri\t1954\ntravis\t1954\n701\t1954\nleona\t1955\n106th\t1955\nsimply\t1955\ndrogeri\t1955\nlamar\t1956\nzhovtniva vulitsia\t1956\nr de lecole\t1956\ncardenal\t1957\nnoi\t1957\nzabka\t1957\nachter\t1958\nhard\t1958\nprospikt linina\t1958\ninverness\t1958\njidoshado\t1959\nhayden\t1959\nsparrow\t1959\nslowackigo\t1959\npleasant st\t1960\nsquirrel\t1961\namherst\t1961\nacademia\t1962\nmonro st\t1962\ngeorgiou\t1962\nsupplis\t1963\nw coast main ln\t1963\n180th\t1963\nwhiteall\t1963\na 23\t1963\nspacerowa\t1964\nbianco\t1964\ng50\t1964\nledge\t1964\nforks\t1964\n476\t1964\nrichter\t1965\nstudios\t1965\nwoodbine\t1965\nbellavista\t1965\ndnt oslo og omegn\t1965\nbuffet\t1966\nclark st\t1966\noptica\t1966\nszecheni\t1967\n534\t1967\nferinwohnung\t1967\nherz\t1967\ninacio\t1967\ndrei\t1967\nerin\t1967\nlys\t1967\ndistrito\t1967\noratorio\t1967\nvt\t1968\nantiguo\t1968\ntrift\t1968\nzhukova\t1968\nkendall\t1969\n190th\t1969\n94th\t1969\ne 95\t1969\ne 1st st\t1969\nr du pont\t1969\nmere\t1969\n629\t1970\nbergweg\t1971\nmarriott\t1971\n359\t1972\nn 7th st\t1972\ne 97\t1972\nexxon\t1972\ncill\t1973\npermai\t1973\nsecondaire\t1973\ncajal\t1973\nsalamanca\t1973\nshack\t1974\nposada\t1974\nnobel\t1974\nperi\t1975\ncachoira\t1975\nkali\t1975\ntsvitochnaia\t1976\ndf pl\t1976\nus 15\t1976\nslmalefn\t1976\nrc\t1977\nlena\t1977\ntengah\t1977\nquensway\t1977\nmatriz\t1977\nyr\t1977\nv cavour\t1978\ncrater\t1978\nbeke\t1979\nsosnowa\t1979\nbnp paribas\t1979\nworkshop\t1979\ns antonio\t1979\ngraaf\t1979\nsarai\t1980\ntokaido hauptlini\t1981\n618\t1982\n04n\t1982\ncouture\t1982\n562\t1983\nordzhonikidzi\t1983\nantica\t1983\nlevee\t1983\njohnson rd\t1983\n89th\t1983\ncoronado\t1984\nn h\t1984\nmhor\t1984\nlandevej\t1984\nhamid\t1984\n680\t1984\n474\t1985\nhillside dr\t1985\nhoofd\t1985\nlamartine\t1985\n66n\t1986\nluciano\t1986\nmiramar\t1986\n546\t1987\nuniv of cambridge\t1987\nring rd\t1988\nprovince\t1988\nfu er mo sha gao su gong lu\t1988\nrandall\t1988\nneun\t1989\nverein\t1989\nbangunan\t1989\nn 340\t1989\nfiori\t1990\n453\t1990\nmeir\t1990\nfootpath\t1990\nsable\t1990\nseohaan exp\t1990\ncr 1\t1991\nkramer\t1991\ncredit mutul\t1991\nmatiri\t1991\npacifico\t1991\nhenry st\t1991\ncombattants\t1991\nnorthfild\t1992\ntui\t1992\nasuncion\t1993\nromaine\t1993\ncresent\t1994\nstrato\t1994\nmeer\t1994\nfloyd\t1994\nymca\t1994\nnabirizhna\t1994\ncongregational\t1994\nwestbahn\t1995\nregis\t1995\ncedres\t1996\nprimero\t1997\nmarin st\t1997\noranje\t1997\ngali\t1998\nhermitage\t1998\nbartolomeo\t1998\ngourmet\t1998\nbowen\t1999\ngaz\t1999\ndanils\t1999\ncontorno\t1999\nschmid\t1999\nleroy\t2000\ndriving\t2000\nassociates\t2000\nglas\t2000\nstillwater\t2000\nfil\t2000\n554\t2001\nwarung\t2001\nmos\t2001\ndaono\t2002\ncool\t2002\nrty\t2002\npineurst\t2002\ne 34\t2002\nnoir\t2002\na22\t2002\nkreis\t2003\nahorn\t2003\ne coast main ln\t2004\nnaval\t2004\nhopewell\t2005\nuniversite\t2005\ndurango\t2006\nbeltway\t2006\nuhland st\t2007\nright\t2007\nogden\t2007\nbch rd\t2007\nseohaan\t2008\nagriturismo\t2008\ngalp\t2008\ngoat\t2009\nsovit\t2009\nkonditorei\t2009\nspeedway\t2010\ncamelias\t2010\nmia\t2010\nein\t2010\npasserelle\t2010\nchaparral\t2011\nmartyrs\t2011\njumbo\t2011\nchampion\t2011\ntannen\t2011\nmilwaukee\t2011\narcadia\t2013\ngrby\t2013\nnovy\t2013\narpad\t2013\ngardenia\t2013\nmunicipalidad\t2014\nburgerhaus\t2015\nvictoria rd\t2015\nguzman\t2015\nunited states postal service\t2015\nreuter\t2015\nk 16\t2015\nn 5th st\t2015\nhotels\t2015\nflorist\t2016\n75k\t2016\nhicks\t2016\naffairs\t2016\ntenis\t2016\nauditorium\t2016\nah14\t2016\nm7\t2017\nbussteig\t2017\naziz\t2017\nreine\t2017\ncart\t2018\nsidney\t2018\nstrp\t2018\nsuzuki\t2019\ntwns\t2019\ncicero\t2019\nhuber\t2019\nluka\t2020\npessoa\t2020\nortsmitte\t2020\nzealand\t2021\n439\t2021\nbishops\t2021\nruda\t2021\nrefugio\t2021\nbarreto\t2021\nplateia\t2021\n13th st\t2021\nzhovtniva\t2022\n14th st\t2022\nploshchadka\t2022\nsporitelna\t2022\nwah\t2023\nantoni\t2023\nd 36\t2023\nhaji\t2024\nsar\t2024\n040\t2024\netsu\t2025\nalliance\t2025\nbaum\t2025\nnha\t2025\nhegy\t2026\nsebastiano\t2026\ndeutsches\t2026\nforestry\t2026\ninfo\t2026\nshossiinaia\t2027\ntilleul\t2027\nrenato\t2027\n115th\t2027\nkoopirativnaia ul\t2028\nironwood\t2028\npostnl\t2028\neric\t2029\nfuture\t2029\nait\t2029\nllc\t2030\nomegn\t2030\ncomplexe\t2030\n464\t2030\nszabadsag\t2030\n933\t2030\naquduct\t2030\npini\t2031\n910\t2031\nkolner\t2032\nsons\t2032\nss13\t2032\n572\t2033\nfoyer\t2033\na st\t2033\np2\t2033\nr des tilleuls\t2033\nraccoon\t2033\nsandpiper\t2033\nrosirs\t2034\nsta rosa\t2034\nexecutive\t2034\ndusun\t2035\nroot\t2036\nhurst\t2036\nspoor\t2036\nfrost\t2037\nk 10\t2037\nphilip\t2038\ngbr\t2038\nkhribit\t2038\ndayton\t2038\nlindsay\t2038\n102nd\t2039\neiche\t2039\nstarbucks coffee\t2040\nengel\t2040\nv enrico fermi\t2040\nrira\t2040\naster\t2040\nnunez\t2041\n98th\t2042\nbench\t2042\nlakeshore dr\t2042\nhoch st\t2043\npeel\t2043\nconvent\t2044\nbains\t2044\nsihiy\t2045\n4e\t2045\nvom\t2045\nwanderpark\t2045\ncabane\t2045\nkazim\t2046\n517\t2046\nestacionamento\t2046\nmassachusetts\t2046\nbug\t2046\nbwstalefn\t2047\ninfante\t2047\nkant\t2047\nlarch\t2047\nairfild\t2047\nxiii\t2048\nranger\t2048\ntaverna\t2049\nus 22\t2049\noziornaia ul\t2050\nmedeiros\t2051\nnice\t2051\ndim\t2051\nus 61\t2051\norts st\t2051\nrowan\t2051\nk 12\t2052\nuchastok\t2052\nsanz\t2053\nbook\t2053\n7th av\t2053\n491\t2053\nochotnicza\t2054\ns2\t2054\ncheung\t2054\nda yan gao su\t2054\nsadova vulitsia\t2054\ncasal\t2055\ncoruna\t2055\n627\t2055\ngranville\t2055\nconnecticut\t2056\nah7\t2056\nthorn\t2057\nlons\t2057\nmaritime\t2057\nsma\t2057\nlukes\t2058\n637\t2058\ngostinitsa\t2059\navery\t2059\ndussel\t2059\nr des acacias\t2059\ndonato\t2059\nsfs\t2059\nlunacharskogo\t2060\ne 42\t2060\nrich\t2060\ne 87\t2060\nbound\t2060\nmalvinas\t2061\nloreto\t2061\nplebania\t2062\nmilan\t2062\nospedale\t2063\nmanning\t2063\nrhodes\t2063\ndvwy\t2064\nresidencia\t2064\n107th\t2064\nistanbul\t2064\nblubird\t2064\ntelefonica\t2064\nsteakhouse\t2064\npampa\t2065\nhook\t2066\nebenezer\t2066\nhalage\t2067\nap 7\t2067\nbalai\t2067\nd 33\t2068\nmarathon\t2068\nus 169\t2068\nica\t2068\ntail\t2068\n1 81\t2069\nrichnaia ul\t2069\nsables\t2070\n358\t2070\ngabrile\t2071\nhondo\t2071\nsudbahn\t2072\ncasale\t2072\nxa\t2072\nwb\t2072\nlazo\t2073\ngaosu\t2073\nrembrandt\t2073\nvintage\t2073\nantonius\t2073\nsimone\t2073\nsafeway\t2073\nbaxter\t2074\nrobbins\t2074\nwiner st\t2074\nblack cr\t2074\nlubeck\t2074\nindigo\t2075\nthuringer\t2075\nteal\t2075\ncruces\t2076\nelliot\t2076\nchristine\t2076\nhalls\t2077\nzara\t2077\nkwiatowa\t2077\naviation\t2077\nknights\t2078\n486\t2078\n112th\t2078\nkrakowska\t2078\na 44\t2078\nnaturschutzgebit\t2079\nkalefzm\t2079\nplana\t2079\nsixth\t2079\nd 38\t2079\nmohammed\t2080\nmolenweg\t2080\n494\t2080\nzhisenv\t2080\nul michurina\t2080\nbiblioteka\t2080\npidras\t2081\npyrenees\t2081\nhartford\t2082\nwojska polskigo\t2082\ncommunes\t2082\nsutherland\t2082\nsadok\t2082\nlucin\t2082\nouteiro\t2082\nexpreso\t2082\nouro\t2083\noy\t2083\nbinh\t2083\ndn1\t2083\nclassic\t2084\nflorian\t2084\nthruway\t2084\nnewtown\t2084\nrubens\t2085\nnagornaia\t2085\nv trento\t2085\ntsintralna vulitsia\t2086\nsunflower\t2087\nwestside\t2087\nlanger\t2087\nah43\t2087\nlandhaus\t2087\nkeiin\t2087\ndart\t2087\nems\t2087\ngrappa\t2088\nhandel\t2089\nul maiakovskogo\t2089\nheinz\t2089\nstettiner\t2089\nd 37\t2089\nflowers\t2089\nsp2\t2089\nrai\t2090\nrepustos\t2090\n438\t2091\nscoala\t2091\npeoples\t2092\npvt\t2093\n27a\t2093\npepper\t2093\ngard\t2093\njr tokaido shinkansen\t2094\nfuneral\t2094\nfruit\t2095\nvulitsa linina\t2095\nshelby\t2095\npho\t2095\ncoon\t2095\nus 84\t2095\n850\t2096\n632\t2096\nmonsignor\t2096\ndahlia\t2096\nmixte\t2096\nhassan\t2096\ndexploitation\t2096\nnadrazni\t2096\nzilioni\t2096\nverne\t2096\nmadison st\t2097\nkimberly\t2097\ngenova\t2098\n477\t2098\nmatos\t2098\negnatia mwy\t2098\nmara\t2099\npayne\t2099\npraceta\t2100\nlevada\t2100\nfuchs\t2100\nkoopirativnaia\t2101\nleger\t2101\narenas\t2101\nathina thessaloniki evzonoi\t2101\ncorporate\t2102\nmagic\t2102\nshkilna\t2103\ncheyenne\t2103\nditalia\t2104\ndorfbach\t2104\nblum\t2104\ndundas\t2104\nhoyo\t2104\nk 8\t2104\nlivingston\t2104\nyacht\t2104\nberge\t2105\ncanti\t2105\nul lirmontova\t2105\nw 4th st\t2106\npasta\t2106\nbilly\t2106\nbaby\t2107\nbleuts\t2107\n544\t2108\narroio\t2108\nmanoir\t2108\npanda\t2109\nfliderweg\t2109\ncamii\t2109\ntell\t2109\nhillcrest dr\t2110\nparki\t2110\nmajada\t2111\ntrafik\t2111\nkonigsberger st\t2111\ndluga\t2111\nlisle\t2111\nkiln\t2112\nprojetada\t2112\nalan\t2112\nrome\t2112\nrode\t2112\nhertz\t2113\nbeauregard\t2113\nlinia\t2113\nlabbaye\t2113\nlongviw\t2113\nregal\t2113\ngiosu\t2114\nannes\t2115\nzhongno\t2115\n670\t2115\ndanziger st\t2115\nul svirdlova\t2116\nn 5\t2116\nmetal\t2116\npodere\t2117\nd 50\t2118\n508\t2118\nfleuri\t2118\nsn\t2118\nnoire\t2118\ngarland\t2119\nwoodstock\t2119\nv milano\t2119\nnazarene\t2120\nlino\t2120\nkralja\t2120\ncolombir\t2121\n574\t2121\nrnde\t2121\nkotovskogo\t2121\nngo\t2122\nshos\t2122\nn 1st st\t2123\ndh\t2123\nroaring\t2123\n652\t2123\ndeportiva\t2124\ntobu\t2124\nclarks\t2125\nbalmoral\t2126\nsocite generale\t2126\nidaho\t2127\nfleet\t2127\ncuatro\t2127\nqalat\t2127\nlest\t2127\nbacker\t2127\nee\t2128\ne 4th st\t2128\ncream\t2128\nagro\t2128\nlast\t2129\ndyr\t2129\nr1\t2129\nbelo\t2129\nclarke\t2129\neli\t2129\njuliusza\t2129\nsouvenir\t2129\nbirigovaia ul\t2130\nsp4\t2130\ne 3rd st\t2130\ngarrett\t2131\ncabrera\t2131\nmilk\t2131\nqur\t2131\neureka\t2132\nmoskva\t2132\n1200\t2132\n640\t2132\nkia\t2132\n6th av\t2133\nk 6\t2133\nsportif\t2133\nessen\t2134\nschool ln\t2134\n108th\t2134\nculture\t2134\nmonaco\t2134\ninterna\t2134\nreforma\t2135\nsurf\t2135\nmercury\t2136\nrealschule\t2136\nnorris\t2136\nbarre\t2137\nbassin\t2137\nseafood\t2137\nerg\t2137\npresbytere\t2138\nfrance telecom\t2138\ngruner weg\t2138\n481\t2138\ncaves\t2139\nul gogolia\t2139\nthomas st\t2139\nzimnik\t2139\nmaster\t2139\nwaterfront\t2140\nbates\t2140\n004\t2141\nsheikh\t2141\nkaty\t2141\nstrauss\t2142\nsta maria\t2142\ntuileri\t2142\ngrounds\t2143\ndeposito\t2143\nschulzentrum\t2143\nmermoz\t2144\nvenelle\t2144\nhull\t2144\ndupont\t2144\ncostanera\t2144\nosprey\t2145\nroux\t2145\nbakers\t2145\nvalta\t2146\nbenoit\t2147\nsdng\t2147\nramsey\t2147\ngiant\t2147\njimmy\t2148\nmerlin\t2148\npatricks\t2148\npostale\t2148\nbonni\t2148\nglowna\t2148\nromain\t2149\nmassage\t2149\nkalefny\t2150\nvokzalnaia ul\t2150\nacker\t2152\njasim\t2152\nrojas\t2153\nprotoka\t2154\nkeith\t2155\nlangley\t2155\namazon\t2155\nraleigh\t2155\ningeniro\t2156\ndepartementale\t2156\nmontrose\t2156\nyorkshire\t2157\ntito\t2157\nus 34\t2157\nteodoro\t2158\n902\t2158\nzeppelin\t2158\nstephen\t2159\n1 ah26\t2159\nrbra\t2159\nwww\t2160\nstockton\t2160\njosefa\t2161\nkarir\t2161\ndrosselweg\t2161\nroth\t2161\npostbank\t2162\npuccini\t2162\nderrire\t2163\nvirgilio\t2163\nmichelangelo\t2163\nuniao\t2163\nroble\t2164\nvaux\t2164\ntiradentes\t2164\nsablons\t2164\nmessina\t2165\nwelcome\t2165\nkatholische\t2165\npartizanskaia\t2166\nuganda\t2166\nkorean\t2166\nlon\t2166\nditskii sad\t2167\nbentley\t2167\nkomsomolskii\t2167\nbashi\t2167\nrua b\t2167\nleau\t2167\nmz\t2168\nhummingbird\t2168\nwhites\t2168\nglory\t2168\nmota\t2169\nspirit\t2169\n99th\t2169\npetrobras\t2169\ne 43\t2170\nconway\t2170\nmstshfalef\t2170\ndispensary\t2170\nbari\t2171\ndays\t2171\n925\t2171\nmio\t2172\nr du lavoir\t2172\nbruhl\t2173\n353\t2173\nkn\t2173\npq\t2173\nform\t2173\nstorm\t2173\nmockingbird\t2173\ndruzhba\t2174\nw 2nd st\t2174\nlake rd\t2175\nkingsway\t2175\nrattlesnake\t2176\nhyeon\t2176\n391\t2176\nterme\t2176\nrisorgimento\t2176\nbungalow\t2177\n170th\t2177\nbrigadir\t2177\nfacultad\t2178\ndom kultury\t2178\nctyd\t2179\nstations st\t2179\nus 85\t2180\nmariscal\t2180\nedgewater\t2181\nmist\t2181\nparaguay\t2181\ndisem\t2181\ncalderon\t2181\npearl st\t2182\nmackenzi\t2182\ne 44\t2182\nkuibyshiva\t2183\ntrees\t2183\nbismarck st\t2184\nlombard\t2185\nbowman\t2185\nwall st\t2185\ngrave\t2185\nbbq\t2185\nvo\t2185\n437\t2186\npaloma\t2186\narkansas\t2186\nschutzenhaus\t2186\na16\t2187\nqsr\t2187\nrabochaia ul\t2187\nlz\t2188\nbirken st\t2188\nr de chapelle\t2188\naqua\t2188\nmad\t2188\nislas\t2189\nvladimira\t2189\nbair\t2189\nvillanuva\t2189\nextra\t2190\nemergency\t2190\ncommune\t2190\ncecil\t2190\nmunitsipalnoi\t2190\nexeter\t2191\nnorthwood\t2192\ne 31\t2192\nsportivnaia ul\t2192\nnegra\t2192\nkft\t2192\nabhainn\t2193\nk 7\t2193\njonica\t2193\nrua 1\t2193\nlucio\t2193\ndana\t2193\n651\t2193\n621\t2194\nb 10\t2194\nditiachii\t2195\nrunning\t2195\nviolet\t2196\nortega\t2196\napartmani\t2196\nkettle\t2196\n103rd\t2197\nuniversal\t2197\nvar\t2197\ngemeindeamt\t2197\nartur\t2197\nlung\t2197\nkirchengemeinde\t2197\nlau\t2198\nbetty\t2198\nfranciszka\t2198\nsananjhananraon\t2199\nsinkiwicza\t2199\nbac\t2199\nvitnam\t2200\nlibraminto\t2200\nsmith rd\t2200\nton\t2200\na anger\t2200\naliksandra\t2202\nd 24\t2202\naguila\t2202\ndonna\t2202\npkp\t2202\nus 301\t2202\nvin\t2202\nco ln rd\t2202\nteam\t2202\n105th\t2202\nkorea\t2203\nkaren\t2203\nsadovi\t2204\nrite\t2204\n519\t2204\nniger\t2205\nalejandro\t2205\nshrine\t2206\ncod\t2206\njadranska magistrala\t2206\nwarschaur al\t2206\ntabernacle\t2207\nus 281\t2208\nmestre\t2209\nmogila\t2209\npc\t2210\ncaptain\t2211\ncalder\t2212\navondale\t2212\nagia\t2212\nelementare\t2212\n526\t2212\ntsirkva\t2213\nhus\t2214\nlakeside dr\t2214\ncornwall\t2214\nr des lilas\t2214\nlancinne\t2214\nluxembourg\t2215\nsaloon\t2216\nashford\t2216\nnovoi\t2217\nroja\t2217\nneustadt\t2217\npetofi sandor u\t2217\nmarronnirs\t2217\nperimeter\t2218\nwestviw\t2218\nqino\t2219\nus 45\t2219\ndachnaia\t2219\nrod\t2220\n446\t2221\nsleepy\t2221\npsh\t2222\ndong hai dao\t2222\nb 19\t2222\nearly\t2222\nfloriano\t2222\nfuller\t2223\nkirby\t2223\nbzrgralefh\t2223\na27\t2223\ngarde\t2224\nqing cang t lu\t2224\npembroke\t2225\ndewey\t2225\naguirre\t2225\ngaspar\t2225\nthunder\t2226\nmittelweg\t2226\n535\t2226\npozarna\t2227\ncaxias\t2227\nsweetwater\t2227\npaint\t2228\nmariana\t2228\nfernand\t2228\nbulivar\t2228\nnava\t2230\ndot\t2232\nmilford\t2233\nbrasilia\t2233\nformosa\t2234\nchemins\t2234\nclaremont\t2235\nmatki\t2235\nmahalle\t2235\nnight\t2235\ncerisirs\t2235\nvalles\t2235\nafon\t2236\nrn9\t2236\nhowe\t2236\n625\t2237\nsandro\t2237\nlara\t2238\nhyundai\t2238\nborn\t2238\ntropical\t2238\nmp\t2239\ncava\t2240\nprefeitura\t2240\nsinclair\t2240\nwoodland dr\t2241\nbrzozowa\t2241\nnewman\t2241\ninlet\t2241\n1 maja\t2242\nbalsam\t2242\njulho\t2242\nnikola\t2243\ncmentarz parafialny\t2243\npine cr\t2243\nkomsomolska\t2244\ndil\t2244\ntau\t2244\nboone\t2244\nsm\t2245\nathina\t2245\nbluberry\t2246\ndome\t2247\nn av\t2247\nrico\t2247\n367\t2247\ntowne\t2248\ncnoc\t2249\nur\t2249\nkrigerdenkmal\t2249\nbello\t2250\nwalden\t2250\nnet\t2251\nvents\t2251\n559\t2251\ncomunidad\t2251\na 31\t2251\nv cristoforo colombo\t2252\nbc\t2252\nskvir\t2252\ncomo\t2252\nstevenson\t2253\npoznanska\t2253\nbenito juarez\t2253\n524\t2254\nshamrock\t2254\nbroken\t2254\ncaldwell\t2254\nfryderyka\t2255\nlourenco\t2255\nparkwood\t2255\n383\t2255\nroyale\t2256\ne2\t2256\nmunicipality\t2257\ndent\t2257\nsusan\t2257\ncunningham\t2257\ngrone\t2258\nmons\t2259\nretorno\t2259\ns juan\t2259\ngissen\t2259\nnichols\t2260\nn4\t2260\nberkeley\t2261\nbarrett\t2262\ntsar\t2262\njoban\t2262\nbaikalo amurskaia magistral\t2262\ncutoff\t2263\noktiabrskii\t2263\nanatole\t2263\nshosi\t2263\npascoli\t2264\nadmiral\t2264\n452\t2264\nsem\t2264\ncabanas\t2264\nmayer\t2264\nalaska\t2264\nn 4th st\t2265\nr du general de gaulle\t2265\nkino\t2265\ngral\t2265\n514\t2265\nhalf\t2266\nkreuzweg\t2266\nlessing st\t2266\navtomoika\t2267\nparsons\t2267\nattila\t2268\nbaikalo\t2268\nm 10\t2268\nlerchenweg\t2269\nqubec\t2269\nmexican\t2269\nmichala\t2269\nquintana\t2269\nconte\t2270\nitalian\t2270\nmoda\t2271\n81st\t2271\n802\t2272\nqmte\t2272\ngay\t2272\nmuhlgraben\t2272\nffw\t2272\nreedy\t2272\nroanoke\t2273\nsp3\t2273\ngrenzweg\t2273\nfaria\t2274\nsimmons\t2274\nbuchen\t2274\n38n\t2274\ncarre\t2275\nusfs\t2276\nint\t2277\nwkwy\t2277\nkasteel\t2277\nbaikal amur mainline\t2278\ntassigny\t2278\nisola\t2279\nowen\t2279\nlowen\t2279\nib\t2280\nchimney\t2280\ngarazhi\t2280\nzhui\t2281\ntaft\t2281\nrotes\t2281\nnh48\t2281\nbrushy\t2281\n298\t2282\nnord st\t2282\nmyers\t2283\n840\t2284\npad\t2284\nraccordo\t2285\ngazprom\t2285\nshanghai\t2286\nterrasse\t2286\nautomotive\t2286\nwatershed\t2287\n73rd\t2288\nparkhaus\t2288\nblake\t2288\nviwpoint\t2288\nomar\t2289\nffcc belgrano\t2290\nid\t2291\nfowler\t2291\nolde\t2292\nindustria\t2292\n615\t2292\n444\t2293\nus 441\t2293\ntol\t2293\ncabezo\t2294\nd 34\t2294\nnavarro\t2294\n378\t2295\nus 87\t2296\npilgrim\t2296\nmtainm\t2297\nbread\t2297\ncomercio\t2297\nmountains\t2297\nweser\t2297\n459\t2298\n77th\t2298\nmolen st\t2299\nbuch\t2301\nb2\t2301\nlattre\t2301\nosteria\t2301\ncatano\t2302\nmura\t2303\nul stroitilii\t2303\njuin\t2303\nfreire\t2303\nelbe\t2304\nbright\t2305\ntiroler\t2306\nod\t2306\npirimogi\t2306\noktyabrskaya st\t2306\ncadiz\t2306\nuhland\t2306\nwade\t2306\nbremen\t2307\naleflmrkz\t2308\nrichnaia\t2309\neldorado\t2309\nleopardi\t2309\nopet\t2309\nrimont\t2309\npenduduk\t2311\nministerio\t2311\npour\t2312\nritter\t2312\nprima\t2312\nkingfisher\t2312\nlong hai xian\t2313\neco\t2314\nb3\t2314\ngosudarstvinni\t2314\nav de gare\t2314\nbassa\t2314\nfamiri mato\t2314\npoczta polska\t2315\ne 2nd st\t2315\narcher\t2316\nelectronics\t2316\nus 2\t2316\nbosc\t2317\nwaverly\t2317\npatton\t2318\nbog\t2318\nlakowa\t2318\nship\t2318\ncoteau\t2319\nlavoro\t2319\ndominos pizza\t2319\nmlynska\t2320\nsosh\t2320\nmillers\t2321\nclermont\t2321\nbeg\t2322\nstanton\t2322\ngovernor\t2322\n751\t2322\nrua a\t2323\n12th st\t2323\nd 29\t2323\n355\t2323\nfamiri\t2323\ngory\t2323\ntelephone\t2324\nschafer\t2324\nc 17\t2324\n91st\t2324\ninternet\t2325\ndenver\t2326\ntruong\t2326\nk 4\t2327\nbreakfast\t2327\ncalea\t2328\nnash\t2329\nbrito\t2329\nmercer\t2329\nlowell\t2330\nn 3rd st\t2330\ndriftwood\t2331\nshady ln\t2331\ndirection\t2331\nlowes\t2331\ntranscanada hwy\t2332\ncmdt\t2332\nhorton\t2332\nkani\t2332\nlanes\t2333\nlim\t2333\nserre\t2333\n96th\t2333\nfrans\t2333\nnizhniaia\t2334\n363\t2334\nbebel\t2334\ncottonwood cr\t2334\nlibertador\t2335\ndunes\t2335\nbiloi\t2335\nkara\t2336\nsud autobahn\t2336\nsirvis\t2336\ngull\t2336\nsbirbank rossii\t2336\nnl\t2336\n88th\t2338\ndulo\t2339\nkamin\t2339\nclear cr\t2339\ngrun\t2340\nkirchen\t2340\nmarch\t2340\nwijska\t2340\ngabrila\t2340\nsteinweg\t2340\nb 51\t2341\nvodafone\t2341\nnorwich\t2342\n454\t2342\nschumacher\t2342\nclare\t2343\nsanders\t2345\nbenedetto\t2345\nshoal\t2346\nbolton\t2346\nsegunda\t2347\neemalige\t2347\nlagos\t2347\nlebanon\t2348\nsavannah\t2349\nbenson\t2349\neagles\t2350\ntelegraph\t2350\nmaintenance\t2350\nvers\t2350\nleipziger st\t2350\nb 54\t2350\nus 10\t2350\ndwm\t2351\nargyle\t2351\nbarrage\t2351\nnh27\t2351\naleflshy\t2352\ndorchester\t2352\nlinin uramy\t2352\noziornaia\t2353\nobispo\t2353\ndworcowa\t2353\ngary\t2353\nd 27\t2354\n466\t2354\njaume\t2355\nshkolni\t2356\ntodd\t2356\nnishi\t2357\ns jose\t2357\ndeer cr\t2357\npear\t2357\ngimnazjum\t2358\nmorningside\t2359\nbonifacio\t2359\nfrontera\t2359\nautomobile\t2359\n11a\t2359\nstaroi\t2360\nrossa\t2360\nnascimento\t2360\nhorizonte\t2360\nboucheri\t2360\nkintetsu\t2360\nvimuzu\t2361\narmand\t2361\njr shan yang ben xian\t2362\nangela\t2362\nwilson st\t2362\nnova poshta\t2363\n635\t2363\nalgeria\t2363\nerables\t2363\nschool rd\t2363\nesmeralda\t2363\nvittoria\t2365\neurope\t2365\nhume\t2365\nlocust st\t2366\nbuisson\t2366\nquincy\t2366\nul frunzi\t2366\nvoltaire\t2367\nbryan\t2368\n1 64\t2369\nzapadni\t2369\natlanta\t2369\nschulhaus\t2369\nscotland\t2370\nbogoroditsy\t2370\na38\t2370\nadams st\t2371\n473\t2371\nalamos\t2371\n675\t2372\nabdul\t2372\nbicycle\t2373\nvolcan\t2373\natlantico\t2373\np1\t2373\ncharli\t2374\npestalozzi\t2374\nself\t2375\nfrinds\t2375\nnn\t2376\nul chkalova\t2376\nallison\t2377\ncovered\t2377\nriva\t2377\nhubertus\t2377\niles\t2377\nniagara\t2379\nmidi\t2379\nalton\t2379\n1e\t2379\n69th\t2379\nelliott\t2379\nperrache\t2379\nriacho\t2380\nappalachian\t2380\nrichards\t2380\npk pl\t2380\nautov del mediterraneo\t2381\nchavez\t2382\n622\t2382\nharold\t2382\nprivata\t2382\nhorne\t2382\nbean\t2383\n76th\t2383\nronald\t2383\ns11\t2384\nrodolfo\t2385\nmorais\t2385\nn 2nd st\t2386\nbauhof\t2386\nrabobank\t2387\nbrock\t2387\nkancelaria\t2387\ncoin\t2387\nhangar\t2387\nkirkko\t2387\nraja\t2388\ngrenoble\t2388\nestacionaminto\t2388\ndominguz\t2388\nunder\t2389\njuana\t2389\nethnike\t2390\n606\t2390\nredondo\t2390\nav brasil\t2391\nkern\t2392\nseco\t2392\nparkovaia ul\t2392\n92nd\t2393\nhttp\t2393\ncharter\t2394\n369\t2394\nmah\t2394\n104th\t2395\naparecida\t2396\ngorodok\t2396\nvideo\t2396\nscholl\t2397\nd8\t2397\nmesjid\t2398\nkarola\t2398\nheideweg\t2399\nlimestone\t2400\naltos\t2400\ntourisme\t2400\nguillaume\t2400\na30\t2401\nainmr\t2401\ngranges\t2401\npraspikt\t2401\nesperanca\t2402\nm 4\t2402\nallotments\t2403\nintirnat\t2403\ntc\t2403\ntranscanada\t2404\nbeni\t2404\ncrestwood\t2405\ndresden\t2405\nalefyshalefn\t2405\nmille\t2406\neisenhower\t2407\n436\t2407\ncuisine\t2407\nlage\t2408\n1 44\t2408\nbridle\t2408\njbalefl\t2409\nbe\t2409\ntam\t2410\ngasteaus\t2410\nsave\t2410\nglobal\t2410\nm 7\t2411\nsteinbruch\t2412\nfirma\t2412\nkonigsberger\t2412\nlibre\t2413\npathe\t2413\ngiardino\t2413\ngreater\t2414\n516\t2415\nez\t2415\nstipana\t2416\nvatutina\t2417\nbilbao\t2417\nwarschaur\t2418\n1o\t2419\nus 29\t2419\nr st\t2419\n465\t2420\nkaufland\t2421\n418\t2421\npyeong\t2422\ngrant st\t2423\nd 23\t2424\n455\t2425\nproject\t2425\nwanderweg\t2425\nsousa\t2425\nnouvelle\t2426\nhermosa\t2426\npiatirochka\t2426\npoplar st\t2427\ncommunaute\t2427\nalbrecht\t2428\ngandhi\t2429\ngr army of republic hwy\t2429\nelizabeth st\t2429\n1918\t2430\njardines\t2430\nrosedale\t2430\n419\t2431\nqiang\t2431\n571\t2432\nzigelei\t2432\ncampsite\t2434\neglise st martin\t2435\ndunant\t2436\nn 20\t2436\nfuntes\t2437\nvent\t2437\norts\t2437\nvelha\t2438\ncharleston\t2438\ncrss st\t2438\nd 39\t2438\nejido\t2438\nparkowa\t2439\nmukhaviramay\t2439\nwells fargo\t2439\n490\t2439\nfam\t2439\nsams\t2439\ns1\t2440\nkrajowej\t2440\noakdale\t2441\ndeportivo\t2441\nresistance\t2441\n386\t2442\nhammond\t2442\nottawa\t2443\ntroy\t2443\nwheel\t2443\ngiulio\t2443\nprodukti\t2444\nwilhelm st\t2444\nsydlyte\t2445\nseymour\t2445\n1 25\t2445\nsussex\t2445\npascal\t2445\nmarti\t2446\nc 15\t2446\nligne principale tokaido\t2446\nstacja\t2446\ncn\t2446\nbrandt\t2447\nvidal\t2447\nvostochni\t2447\nlake st\t2447\nk 5\t2448\nsofia\t2448\nfaro\t2449\nveterinary\t2449\ncomandante\t2449\nsviatogo\t2449\nger\t2449\nady\t2449\nshawnee\t2451\ndong ming gao su dao lu\t2451\nmorales\t2452\nkapellenweg\t2452\nalbert st\t2453\ne 79\t2453\nnan jiang xian\t2453\ntak\t2453\ncastell\t2453\npousada\t2453\nreid\t2454\nvokzal\t2454\nsolutions\t2455\ndennis\t2456\noktyabrskaya\t2457\ne 115\t2457\nfirst baptist church\t2458\n570\t2458\npiter\t2458\ncatarina\t2458\ndeputado\t2458\nhawkins\t2459\nprogreso\t2460\nprong\t2460\npopulaire\t2461\njasper\t2461\nbank of america\t2461\nxx\t2462\nzhong guo zi dong ch dao\t2462\n521\t2463\nlemon\t2464\nleandro\t2464\nbirigovaia\t2465\nhat\t2465\nselva\t2465\npetroleum\t2466\nmoos\t2466\narm\t2467\ndyke\t2467\nr jean jaures\t2468\narodromo\t2468\nosaka\t2468\nosborne\t2469\nstatale\t2469\nb 9\t2469\ncno real\t2470\n346\t2470\n74th\t2471\njalefsm\t2471\ncoles\t2471\nfranken\t2471\nsmart\t2472\nbiao\t2473\nc 16\t2473\nguilherme\t2473\nninos\t2473\nrecycling\t2473\n362\t2474\nuk\t2474\npinnacle\t2474\ns8\t2475\nover\t2475\npansion\t2475\n604\t2476\nfondo\t2477\nn 630\t2477\nd 32\t2478\ndolphin\t2478\nwilli\t2479\n388\t2479\n429\t2480\ncamin\t2480\nwren\t2480\n390\t2482\nn 10\t2482\nlyons\t2482\nhoneysuckle\t2482\nboy\t2483\nw 3rd st\t2484\nellen\t2485\nfrid\t2485\nsdot\t2486\n560\t2486\nsimpang\t2487\nsources\t2487\nchasovnia\t2488\npamplona\t2490\nalabama\t2490\nsteel\t2490\ndeus\t2491\nbremer\t2491\ncemetary\t2491\nbolz\t2491\nrichland\t2492\njohan\t2492\nus 36\t2492\nquick\t2492\nmalga\t2493\ndevonshire\t2493\nconnection\t2493\nchippewa\t2493\nbud\t2493\nulrich\t2493\nsali\t2494\nshivchinka vulitsia\t2494\nbergen\t2495\nrosales\t2495\n328\t2495\nd 35\t2495\nneckar\t2495\nkua\t2496\nadama mickiwicza\t2496\ntarget\t2497\n85th\t2498\nmhmwd\t2498\ngeorgetown\t2499\npozharnaia\t2500\ngrotta\t2500\n801\t2502\ncabinet\t2502\nferrari\t2502\njust\t2503\norchid\t2503\ndawn\t2503\ngarth\t2505\nmedio\t2505\nep\t2506\npasture\t2506\nvokzalnaia\t2506\njenkins\t2506\neastwood\t2506\ncorreia\t2507\nwasserturm\t2507\npatricia\t2507\nvine st\t2508\naroporto\t2509\n750\t2510\nberkshire\t2511\nv leonardo da vinci\t2512\nskala\t2513\nndr\t2513\nbirch st\t2514\nayuntaminto de madrid\t2514\nfresno\t2514\nleipzig\t2514\ntownsend\t2514\nliniia tokaido\t2514\nkotilnaia\t2514\ntokaidolinjen\t2515\nnikolaia\t2515\nsaleflh\t2515\nrodeo\t2515\nantioch\t2515\njibal\t2516\nurad\t2516\nsignal\t2517\noffices\t2517\ntenente\t2517\nlinea principale tokaido\t2517\nb 96\t2517\nn7\t2517\nzola\t2518\nbrookfild\t2518\nb 5\t2518\npenas\t2518\npanther\t2519\ndanziger\t2519\n2611606\t2519\nquarter\t2519\nsuperiore\t2520\nhli\t2521\ngeneva\t2521\nfaculty\t2522\nmimosa\t2522\n518\t2522\nforestale\t2523\ngn st\t2523\nguo dao2 hao\t2523\nd 28\t2523\nbreslaur st\t2523\nfinca\t2524\n608\t2524\nsacred\t2524\ndalmatina\t2524\nrodrigo\t2524\njohnston\t2524\n623\t2525\nsilo\t2525\nbb\t2525\nsydney\t2525\nwitnesses\t2525\nbrewery\t2525\ndevils\t2525\nrive\t2525\ncamillo\t2525\npetro\t2525\nmckenzi\t2525\npeterson\t2525\ng60\t2527\nduc\t2527\nsteinbach\t2527\nwillow st\t2527\ndee\t2528\nstor\t2528\npfarrkirche\t2529\nfundamental\t2529\nnursing\t2530\nmetz\t2530\nn8\t2531\nbili\t2531\ne 71\t2531\nalmacen\t2531\narte\t2532\nschacht\t2532\nflamingo\t2533\n339\t2534\nhopkins\t2534\nnoguira\t2535\nb 85\t2535\nshan yang zi dong ch dao\t2536\nannex\t2537\nalex\t2537\nbomberos\t2538\nvito\t2538\nheuss\t2538\nsmith st\t2538\nlynch\t2539\nhowell\t2539\nlangen\t2540\nrossini\t2540\nwilhelmina\t2540\nabbas\t2541\ntunis\t2541\nmargherita\t2541\neix\t2542\ntanglewood\t2542\nphu\t2543\ncatolica\t2544\nabraham\t2544\njunta\t2544\nburgos\t2545\nfairfax\t2545\nd 26\t2545\nlead\t2545\n561\t2545\n140th\t2546\ng22\t2547\ntannenweg\t2547\nkorte\t2548\nkk\t2549\nlibreria\t2549\nfabrika\t2549\njadranska\t2550\nmacedonia\t2550\nburlington northern sta fe r\t2550\npak\t2551\nmiles\t2551\ndeutsche telekom\t2551\nfast\t2552\nexupery\t2553\nus 31\t2553\neb\t2554\nss12\t2555\n160th\t2555\nbig cr\t2555\nfelice\t2555\ntokaido honsen\t2556\nn 634\t2556\nkay\t2556\nhoover\t2556\ndolmen\t2557\ng75\t2557\nterres\t2557\n83rd\t2557\npalmetto\t2558\nviana\t2558\nuruguay\t2558\ntsun\t2559\nabreu\t2559\nsportowa\t2560\nrh st\t2560\n820\t2560\nlido\t2561\nwildcat\t2564\nhampshire\t2565\njidosha\t2565\nptt\t2566\ncrril\t2567\nfortuna\t2567\n3e\t2568\npasir\t2568\nmans\t2568\ndirk\t2568\nus 89\t2569\ncolombia\t2569\nsargento\t2570\nmhl\t2570\nlab\t2570\nmacarthur\t2571\nedmond\t2571\nkaminka\t2571\nsklad\t2572\n366\t2572\nzilona\t2572\n11k\t2572\nwitten\t2572\ndiscovery\t2573\nsystems\t2573\nmiddleton\t2573\nd 30\t2573\nridgeviw\t2573\n95th\t2573\nbuckeye\t2574\nkrasnaia ul\t2574\ndnt\t2574\nm 5\t2574\npacific hwy\t2574\ndunn\t2575\ne 52\t2575\nengilsa\t2575\nkosmonavtov\t2576\nwoodward\t2576\nmargarita\t2576\niar\t2577\nverona\t2578\nmatrosova\t2578\ncaja\t2579\n356\t2579\ngates\t2579\ntorgovi\t2579\nsitesi\t2579\nsdr\t2580\n296\t2580\njr tokaido honsen\t2580\nfarmacias\t2581\ngreene\t2581\nnur\t2581\nandes\t2581\nmango\t2581\nrousseau\t2582\nfederation\t2582\nines\t2583\ndowntown\t2583\nrobles\t2584\nrental\t2586\nvirkhniaia\t2586\nbarrow\t2586\nviii\t2586\nd 16\t2587\nbak\t2587\nbaja\t2587\n607\t2587\nrata\t2588\nslate\t2588\nytskhq\t2588\nmaloi\t2588\ndudley\t2588\nurquiza\t2590\ne 49\t2590\n463\t2590\nemmanul\t2590\nsaid\t2591\n555\t2591\n527\t2592\ncollado\t2592\nklaus\t2592\nul dzirzhinskogo\t2592\nvalley rd\t2595\nmelbourne\t2595\nlote\t2595\nforest rd\t2595\nada\t2596\ncoll\t2596\nmoney\t2598\nosrodek\t2599\nesc\t2599\npeatonal\t2599\nv alessandro manzoni\t2601\nlees\t2601\nsnake\t2601\npotter\t2602\n22n\t2602\n426\t2604\n443\t2604\n150th\t2605\nzhk\t2605\nbaseball\t2605\nluke\t2606\npatisseri\t2606\nplatform\t2609\nabel\t2609\nhwr\t2609\nstraz\t2609\nk 3\t2610\n61st\t2610\nserrano\t2610\njzyrte\t2611\nnol\t2611\nhumberto\t2611\ntanjung\t2612\nc 14\t2613\ncamara\t2613\ntim hortons\t2613\njalefdte\t2613\noster\t2614\nswq\t2614\nbriand\t2614\ncure\t2616\nbali\t2616\nv cesare battisti\t2617\nvermont\t2617\nn 6\t2618\nr des jardins\t2618\ncem\t2618\nvolga\t2618\nd 22\t2620\ngospel\t2620\nss16\t2620\nhillviw\t2620\njasmine\t2621\nix\t2622\navto\t2622\nglasgow\t2623\nbooth\t2623\notdykha\t2624\nhendrik\t2624\nzongtuop\t2624\n440\t2624\n68th\t2625\ndvorits\t2625\nborda\t2625\npolideportivo\t2625\nmineral\t2625\nnoro\t2625\nlessing\t2625\nsarah\t2625\namaral\t2625\nlobo\t2626\ndworzec\t2626\nzaklad\t2628\nbaseline\t2628\n79th\t2628\ncarducci\t2628\npigeon\t2630\nhalifax\t2631\nwasserwerk\t2631\njupiter\t2631\nbrigade\t2631\nwaterford\t2632\nkolping\t2632\nace\t2632\ncloud\t2632\nbania\t2632\nfinch\t2632\nv alcide de gasperi\t2633\npollo\t2633\nlevel\t2633\nera\t2633\nabajo\t2634\nash st\t2634\nanchor\t2635\nbustan\t2635\nkoscilna\t2636\nsaratoga\t2636\nosp\t2637\n86th\t2638\nbroad st\t2638\nvicarage\t2638\nmgr\t2639\nnine\t2639\njeovahs\t2639\nn rd\t2639\nmijski\t2640\nreserva\t2640\ndunkin donuts\t2640\nrtt\t2640\ndong hai dao xin gan xian\t2640\npinar\t2640\nburke\t2641\nwilly\t2641\n506\t2641\ncobb\t2641\npat\t2641\nheine\t2641\n130th\t2643\nfriseur\t2643\nfermi\t2643\nvalentin\t2643\norion\t2644\nrapids\t2645\ngijon\t2647\nus 69\t2647\ncranberry\t2648\nbrooklyn\t2648\nfrankfurter st\t2648\nsergio\t2648\npochtovoi\t2649\nrhin\t2649\nquality\t2649\noblast\t2649\nkolonii\t2650\nroi\t2650\ndodge\t2651\nav du general de gaulle\t2651\n348\t2651\npeluquria\t2651\nfit\t2651\nfridrich st\t2651\neneosu\t2651\ncortes\t2651\ntavares\t2651\nreading\t2652\ntung\t2652\nabzweigung\t2653\ncantabrico\t2653\nvul\t2653\nbpost\t2653\not\t2654\nm6\t2654\n382\t2654\nsportivo\t2654\nclaro\t2654\ngardner\t2654\nkoltsivaia\t2655\nvolkswagen\t2655\ncomfort\t2655\nprinces hwy\t2655\nmuzeum\t2656\nmlyn\t2656\n613\t2656\ntucker\t2657\nrv\t2657\ngol\t2657\namurskaia\t2658\nsara\t2658\nang\t2658\nschmide\t2658\nvallon\t2658\nmansfild\t2659\n1100\t2659\nbun\t2660\n84th\t2660\nvlt\t2661\n551\t2661\nkrotka\t2662\nseminole\t2663\nknight\t2663\ngartenweg\t2663\npowstancow\t2664\n361\t2664\ncristina\t2664\namelia\t2665\nhofer\t2666\nginirala\t2666\njr tokaido main ln\t2666\naid\t2666\ndiksi\t2666\ndalton\t2666\n64th\t2666\namerico\t2667\nr victor hugo\t2667\nweiss\t2667\npatio\t2667\nvineyard\t2667\nkreissparkasse\t2668\nnea\t2670\nshuanghwan\t2671\n284\t2672\nvallejo\t2672\ntulip\t2672\nboots\t2672\nrapid\t2672\n461\t2673\nroc\t2674\nwhitney\t2676\ntoilet\t2676\neuro\t2676\nnedre\t2676\nlesli\t2676\nneck\t2677\nrabochaia\t2677\nlabbe\t2678\nbyron\t2678\nreno\t2679\nhoa\t2679\ncaisse depargne\t2679\namazonas\t2679\n292\t2680\n10a\t2680\ngrassy\t2682\ndepartamento\t2682\nsurrey\t2683\nsolar\t2683\ntara\t2684\npractice\t2684\ndeerfild\t2684\nsankanonlasan\t2684\nseis\t2685\nrugby\t2686\nonly\t2686\n451\t2686\nnurn\t2687\n1 94\t2687\ncanto\t2687\njacks\t2689\ndorp\t2689\nlark\t2690\nkik\t2690\nzapadnaia\t2690\nforte\t2691\nmulti\t2692\naustralia\t2692\npice\t2693\nsainsburys\t2693\ne 28\t2693\nsht\t2693\ncontrol\t2694\ngustavo\t2694\nhr\t2694\nbarker\t2695\nstock\t2695\napp\t2696\nmacdonald\t2696\nalbion\t2696\ndvd\t2696\nradianska vulitsia\t2697\nashland\t2697\n495\t2698\nkaplica\t2699\ngloucester\t2699\nbmw\t2699\nplanet\t2700\nkafr\t2700\n468\t2701\nchung\t2701\ngutirrez\t2701\nriley\t2702\nmaharlika\t2702\ndalefr\t2702\n531\t2703\npires\t2704\nsacramento\t2705\ncarol\t2705\nwakefild\t2706\ntamarack\t2706\nmutul\t2707\naudi\t2707\ncedar cr\t2708\n475\t2708\nbandera\t2708\ntsvmt\t2709\nfregusia\t2709\nroches\t2709\nwarszawska\t2710\nus 14\t2711\nrossi\t2712\nv tri ste\t2712\nnovimbre\t2713\nnormandi\t2713\nmitro\t2713\naustria\t2714\n11th st\t2714\nrent\t2714\nstaraia\t2714\nventa\t2715\n384\t2715\nreef\t2718\nmontreal\t2719\n445\t2721\nnil\t2721\nprud\t2722\nhighland av\t2722\nauthority\t2723\nmama\t2723\ntsintralna\t2724\ngalilei\t2724\ndiner\t2725\nlama\t2725\nmntqte\t2725\nwilliam st\t2727\nroof\t2727\noao sbirbank rossii\t2727\nrodovia governador mario covas\t2727\n533\t2728\n712\t2729\notdil\t2729\nkapellen\t2730\n78th\t2730\nrifugio\t2731\nhung\t2731\nmunoz\t2731\npilot\t2731\nunicredit\t2731\ntrailhead\t2732\nfranklin st\t2732\nfranka\t2733\nvr\t2733\nk 2\t2733\nlinina vulitsia\t2734\nkirk\t2734\nsanti\t2734\nenergy\t2735\nhub\t2735\nfoundation\t2736\n423\t2736\nioannina\t2736\nbuno\t2736\ncommonwealth\t2736\nvergers\t2736\nkok\t2737\nshops\t2737\nkea\t2738\nabalefr\t2739\ngladstone\t2739\nwok\t2739\nhoge\t2739\ncomte\t2740\nrectory\t2740\nsanatorii\t2740\nmarble\t2740\n2b\t2741\nhelene\t2741\nnapoleon\t2742\neverett\t2743\nwentworth\t2744\nestancia\t2744\nsekolah\t2745\nponds\t2745\naceq\t2745\ngenets\t2745\nheadquarters\t2746\npresa\t2746\nn9\t2746\ngorki\t2747\nmandir\t2748\ne 59\t2748\ndutra\t2749\nhipolito\t2749\nc 13\t2749\nfifth\t2749\nedith\t2750\nbeira\t2750\nadirondack\t2751\n357\t2751\nd 21\t2752\ninner\t2752\nmundo\t2752\ncarneiro\t2753\neau\t2754\nfar\t2755\ntabor\t2755\nsenador\t2755\n66th\t2756\n424\t2757\ncaroline\t2757\nr de republiqu\t2757\nferro\t2757\n71st\t2758\nlapangan\t2758\nfrances\t2758\nclube\t2759\nkfr\t2759\nsnd\t2759\noji\t2760\nrika\t2761\nnikolaus\t2761\nainbalefs\t2762\neuclid\t2762\npays\t2762\nnew rd\t2762\nvegas\t2764\nfinkenweg\t2765\nafrican\t2765\nseine\t2766\ntalbot\t2766\netxea\t2766\nherman\t2768\ncham\t2768\nblumen st\t2769\nmateo\t2769\ntunel\t2770\n374\t2770\nlisa\t2771\npurple\t2771\n523\t2772\ngmina\t2772\nkeystone\t2773\ncuba\t2774\n82nd\t2774\npk dr\t2775\nbenton\t2775\nbrandon\t2775\ndead\t2776\nsopra\t2777\n433\t2777\ntd\t2778\nalphonse\t2778\nfridrich ebert st\t2779\n010\t2779\nrescu\t2779\njcdecaux\t2779\nmunster\t2779\nchild\t2780\n337\t2780\nleopoldo\t2781\nds\t2781\n416\t2782\nd 18\t2783\naropurto\t2783\nhala\t2783\nobwodnica\t2783\nlomonosova\t2784\nkath\t2784\nfrtg rd\t2785\nsalto\t2785\nbrick\t2785\nxiao huo shuan\t2785\nsakuruk\t2786\n78n\t2787\nlisnoi\t2788\nhorst\t2788\n020\t2788\n448\t2789\nmawatha\t2789\ntrent\t2790\nstate st\t2790\ne 66\t2791\nlenin\t2791\ncamargo\t2792\nhuilyp\t2792\nsylvan\t2793\nsalinas\t2793\ncoulee\t2793\npacheco\t2793\nukrainki\t2795\nkolkhoznaia ul\t2796\nllanos\t2797\n67th\t2797\nkocesi\t2798\nharper\t2798\n1 15\t2799\njeronimo\t2799\nguillermo\t2800\nosvaldo\t2800\ndk\t2800\njungang\t2801\numbria\t2803\nbarclays\t2803\n580\t2803\nchris\t2803\ncroissant\t2804\nus 77\t2804\nn3\t2804\nbattle\t2805\ncir k\t2805\n90th\t2805\nbreslaur\t2806\n87th\t2806\nsh 1\t2806\nroson\t2807\nlloyds\t2807\n434\t2808\nun\t2808\nthanh\t2809\ncs\t2809\nweaver\t2810\nbent\t2810\ntoronto\t2810\n472\t2812\nshed\t2812\navila\t2812\nkrupskoi\t2813\nhardy\t2813\nallah\t2813\n336\t2813\nhannover\t2813\nkossuth lajos u\t2813\n16k\t2814\nrandolph\t2814\nkomarova\t2814\ncivic\t2815\ntokaido shinkansen\t2816\nparibas\t2816\nsystem\t2816\nion\t2816\nv vittorio veneto\t2817\na11\t2817\nshchorsa\t2817\nclearwater\t2819\ngazpromnift\t2819\nmisty\t2820\nrs\t2821\nferguson\t2821\ng42\t2822\npeixoto\t2822\nnews\t2823\nbuckingham\t2824\nmesanges\t2824\n552\t2824\n377\t2825\noklahoma\t2825\nliverpool\t2825\nagnes\t2825\n376\t2826\nwashington av\t2827\nbrink\t2827\nbolivia\t2827\nhortons\t2827\nprimera\t2828\nmaxwell\t2828\nn 1\t2829\n631\t2829\nmoto\t2829\ntrinidad\t2830\nparkovaia\t2831\n65th\t2831\nbatu\t2831\ntimes\t2831\nfling\t2832\nashton\t2832\nvictoria st\t2832\nautokinetodromos 1\t2833\npetits\t2834\nendre\t2835\nalbu\t2835\nrosenweg\t2836\nmonastery\t2837\nlisboa\t2837\nlincoln av\t2838\nshykh\t2838\nkrasnoi\t2841\nabar\t2841\neras\t2842\ngranj\t2843\npassagem\t2843\nignacego\t2844\nnewcastle\t2844\ntransport\t2845\nresidential\t2846\nd 25\t2848\nmoines\t2848\ncreche\t2849\nbra\t2849\nswift\t2849\nobshchiobrazovatilnaia\t2850\nsiniri\t2852\nrosnift\t2852\nminami\t2853\nshbyl\t2853\nliquor\t2853\nclemente\t2853\nmadero\t2854\nhighfild\t2854\nfetes\t2854\nmetropolitan\t2854\npanama\t2855\nala\t2856\ne 62\t2856\ngartnerei\t2858\nhirsch\t2858\nstefano\t2858\nradweg\t2858\nnissan\t2858\nrica\t2858\nd 31\t2859\nrds\t2859\nrailroad av\t2859\ne 85\t2860\noval\t2860\nmontes\t2860\ntrade\t2861\nerich\t2861\n540\t2863\nath\t2863\nwolnosci\t2863\nfine\t2864\ncarrire\t2864\nyellowhead\t2864\neni\t2864\nlaundry\t2864\nshepherd\t2866\nbeethoven st\t2866\nchatham\t2867\ngroupement des mousqutaires\t2867\nsanctuary\t2867\ngamle\t2868\nceska posta s p\t2868\ncamilo\t2869\nelgin\t2870\nwis\t2871\ndunkin\t2872\nbidronka\t2872\nvenus\t2872\nnfd\t2872\njerusalem\t2872\ndolni\t2873\ncabeza\t2874\nvision\t2874\nfosses\t2874\nabzw\t2874\nmound\t2876\na 66\t2876\nmaine\t2878\nesteban\t2878\nahmed\t2879\ng6\t2879\nmatthews\t2880\nwillis\t2880\nhonam\t2880\npicasso\t2880\nearl\t2880\nkrankenhaus\t2881\ncerrada\t2882\n59th\t2882\nbasica\t2883\nindian cr\t2885\nagence\t2888\njalefmain\t2888\nhastings\t2889\nkazimirza\t2890\ntennessee\t2890\nrochester\t2890\njefferson st\t2891\ninternal\t2892\nmarzo\t2892\ncartir\t2892\ngrotte\t2895\neaton\t2896\nels\t2896\nvilleneuve\t2896\nwolfgang\t2896\npol\t2897\npal\t2897\ncepsa\t2898\ngebaude\t2898\nunivirsitit\t2898\nkoln\t2899\nkim\t2900\nsoccer\t2900\nus 19\t2900\nperkins\t2902\nnikrasova\t2902\nfitzgerald\t2902\nevangelical\t2902\nmississippi\t2903\nbrunswick\t2903\nwhdte\t2904\nniuw\t2904\nvolksschule\t2904\n482\t2905\nmayfild\t2905\nsands\t2905\ncala\t2907\nfaydat\t2907\n414\t2907\nrid\t2908\nsaules\t2908\nedgar\t2908\n58th\t2909\nsnack\t2910\nsalvatore\t2910\ninternacional\t2910\ndsa\t2911\nfreeman\t2911\n326\t2911\n343\t2912\nfilial\t2912\nrocca\t2913\nsucre\t2914\ngc\t2914\nallt\t2914\ngerman\t2915\nstyle\t2915\nisolato\t2916\ndao1\t2916\nbow\t2916\nbaden\t2916\nsin nombre\t2917\nowens\t2918\nchikhova\t2918\nbuchanan\t2918\nmagalhas\t2919\npiano\t2919\nc a\t2919\nclarence\t2919\nsecurity\t2920\ncreekside\t2920\ndeutschland\t2921\nlugar\t2922\ncitron\t2922\ntechnical\t2922\nnantes\t2924\nsloboda\t2924\nbreite\t2924\nrj\t2925\nv piave\t2925\narizona\t2926\nshirley\t2926\n62nd\t2927\npb\t2927\nramirez\t2928\nv giuseppe verdi\t2928\nensino\t2929\nmuddy\t2930\ncliniqu\t2931\n72nd\t2931\nelder\t2932\nsquaw\t2932\nvenezula\t2933\nvecchio\t2934\ndozsa\t2934\nsalz\t2934\nzun\t2935\nherrera\t2936\nchampagne\t2936\nmonterey\t2936\nfred\t2937\nbei lu zi dong ch dao\t2938\nmeadowbrook\t2940\nhector\t2940\ns p\t2940\nkirchgasse\t2940\nromano\t2940\ndrake\t2941\nandalucia\t2941\nd 19\t2941\nmeadow ln\t2941\ngn ln\t2942\nsebunirebunziyapan\t2942\nforsthaus\t2943\nchelsea\t2943\nraimundo\t2943\ntreatment\t2943\nbadger\t2943\ngaststatte\t2944\njacobs\t2945\nbern\t2945\nravel\t2946\norganismo descentralizado de secretaria de educacion publica\t2947\nbraga\t2947\ndrove\t2947\nhora\t2947\npain\t2947\nzamora\t2947\nui\t2948\nworth\t2951\nschutzen st\t2951\nmega\t2951\ncecilia\t2951\nb 7\t2952\n327\t2952\nlions\t2953\nblair\t2954\naleflsyalefr\t2955\ndolores\t2955\n329\t2956\nphilippe\t2957\nram\t2958\nmol\t2958\naristide\t2959\nus 59\t2959\nharding\t2959\nmoskovskaia ul\t2960\n901\t2960\nhumboldt\t2960\n435\t2961\npaddock\t2961\nisaac\t2961\nsede\t2961\ndonau\t2962\nazevedo\t2962\nenel\t2962\nmarkaz\t2962\n80th\t2963\nlincoln st\t2963\nbethleem\t2963\nmaryland\t2965\nwal\t2965\nbeaverdam\t2965\nbairro\t2965\nmac\t2965\nnassau\t2966\n334\t2967\nthames\t2967\nbirchwood\t2968\ngetulio\t2969\nhahn\t2970\nautoroute est oust\t2970\n612\t2971\nrobertson\t2971\ndepargne\t2972\nschwarzer\t2973\njade\t2973\npostweg\t2973\nlegion\t2973\npeugeot\t2974\n100th\t2974\n509\t2974\nlts\t2975\njaneiro\t2975\ndorps st\t2977\nv europa\t2977\nout\t2977\nd 17\t2978\npelican\t2978\ntamoil\t2979\nsmp\t2979\ngeng\t2979\ncomune\t2980\noxxo\t2980\nbarry\t2980\ncabana\t2980\ncoto\t2980\nlinks\t2980\ncars\t2981\nm5\t2982\n53rd\t2983\nsheep\t2984\nradar\t2984\novest\t2984\nls\t2985\nnorma\t2986\n511\t2987\nraven\t2988\nrivadavia\t2988\nclyde\t2989\nsilska\t2989\nv antonio gramsci\t2990\nhorizon\t2991\nweingut\t2991\ncentenario\t2992\nclaudio\t2992\ngrocery\t2994\n512\t2995\ngreens\t2995\nbbva\t2995\ngroupement\t2996\ngr r\t2996\ncalvario\t2996\nkolkhoznaia\t2996\nfonseca\t2996\nadelaide\t2996\ntiger\t2997\n57th\t2997\n9a\t2998\nsettembre\t2999\npentecostal\t2999\ng55\t3000\nsp1\t3000\nchandler\t3001\nshrq\t3001\nbrand\t3003\nexpwy\t3003\nteninte\t3003\nemil\t3004\nchristopher\t3004\ncidade\t3005\nprivee\t3005\nprisviatoi\t3005\nmillennium\t3006\nplain\t3006\njalefdh\t3007\n20n\t3008\nlhotel\t3009\n5th av\t3009\ncarpenter\t3009\nmaple av\t3009\n003\t3009\nd 11\t3010\nopel\t3010\nmaplewood\t3010\n602\t3012\nmadeleine\t3013\nchast\t3013\n75th\t3014\nbrucken st\t3015\nerlenweg\t3015\nmotte\t3015\nusps\t3015\naa\t3019\nuchrizhdinii\t3020\nfletcher\t3020\nadventist\t3020\nmode\t3020\nss1\t3021\nleeds\t3022\nibis\t3023\nmittel st\t3023\n291\t3023\ntoulouse\t3024\ndutch\t3024\ndorado\t3024\ntaco bell\t3024\norleans\t3025\nwill\t3025\nbethany\t3026\nmousqutaires\t3026\nguten\t3029\nus 17\t3029\nhammer\t3030\n532\t3031\n530\t3033\nhorni\t3034\n110th\t3034\nkids\t3035\n513\t3036\nbanks\t3036\ng56\t3036\n373\t3037\ngrupo\t3038\ngurra\t3040\ngalileo\t3040\nlloyd\t3040\npuy\t3040\nroch\t3040\nwaterfall\t3040\nd 9\t3041\nvigne\t3041\n41k\t3042\ndao2\t3043\naurelia\t3043\ncontinental\t3044\nhanover\t3044\nrosen st\t3045\nul pobidy\t3045\nnorwood\t3045\nmuhlenbach\t3046\nn 7\t3047\nbrentwood\t3049\n427\t3049\nspruce st\t3049\ngrade\t3049\nkirch pl\t3049\nschnell\t3050\nbismarck\t3051\nmines\t3052\n65k\t3052\nv giacomo matteotti\t3054\nbond\t3056\ne 01\t3056\nmargurite\t3057\nvostochnaia ul\t3057\ncultura\t3057\nbr 116\t3058\nflint\t3059\nsullivan\t3059\nbnp\t3059\nreina\t3061\nlitsii\t3062\ngallo\t3062\nwisconsin\t3062\nsettlement\t3063\nkfz\t3063\nlisi\t3064\nclubhouse\t3065\nrgwy\t3065\nantelope\t3066\nlilac\t3066\nkoulu\t3066\ncrestviw\t3066\nyves\t3067\ndry cr\t3067\nclaire\t3067\nhamburger\t3068\nspeed\t3068\nclemenceau\t3070\nlazy\t3070\nvija\t3071\nhrb\t3071\nus 24\t3071\ngammel\t3071\nsmall\t3071\nwisengrund\t3072\nbirken\t3073\nstatu\t3074\nmoura\t3075\nempire\t3076\nbeau\t3077\ndarc\t3077\nhohenweg\t3078\napollo\t3078\nhale\t3078\n830000\t3079\nk 1\t3079\nbecker\t3081\nbee\t3081\nalefl\t3081\nponderosa\t3081\nus 52\t3081\nd 20\t3083\nfydte\t3083\ncash\t3083\ncharles st\t3084\n349\t3084\nbreeze\t3086\nufer\t3086\nmolina\t3087\nsente\t3087\nposiolok\t3088\nbasketball\t3088\njoy\t3088\n268\t3089\ncir dr\t3089\nbody\t3089\noknoname\t3090\nwv\t3090\ngorka\t3090\nlile\t3091\nnkhl\t3091\nus 90\t3092\neck\t3092\nb st\t3093\ngatano\t3093\nmwy 1\t3093\nmckinley\t3095\nhermes\t3095\nformer\t3096\nkollidzh\t3096\npoczta\t3096\nupravlinii\t3096\nmozart st\t3097\nsodu\t3098\nvoda\t3099\nonze\t3099\n345\t3099\n408\t3099\npanny\t3100\nbldg\t3100\nleipziger\t3101\nshiloh\t3103\n650\t3104\nszkol\t3105\nns\t3106\nkyrka\t3106\nquatro\t3106\nmohawk\t3107\n288\t3108\nkinder\t3109\nbruch\t3109\ncurry\t3109\nsitio\t3110\nhancock\t3110\nshort st\t3111\nwagon\t3111\npoliana\t3111\nregency\t3111\njavir\t3111\nradianska\t3111\ngsk\t3112\nffordd\t3113\n297\t3114\nsalisbury\t3114\nqlainte\t3114\nbriarwood\t3115\nts\t3116\nfreibad\t3119\n375\t3120\ne1\t3120\nbilla\t3122\nbritish\t3122\nmarshala\t3122\naddaviramadda\t3122\n279\t3123\n510\t3123\nprimavera\t3123\n4th av\t3123\nhsl\t3124\nbajo\t3125\nestado\t3125\nkolejowa\t3126\nmon\t3127\nuniversitat\t3127\nrace\t3129\ntoro\t3132\nmissouri\t3132\nnao\t3133\ncorners\t3133\nagency\t3133\nalonso\t3134\nwales\t3136\na 5\t3137\nestero\t3138\nnancy\t3139\nc 11\t3139\nmartha\t3141\npage\t3141\nkota\t3141\njimenez\t3141\nsportivnaia\t3141\ntwrs\t3141\ncoleman\t3141\nard\t3142\n409\t3142\nrabbit\t3142\npuig\t3142\nfreedom\t3143\ntw\t3143\npfarrer\t3143\nbio\t3144\ncnvto\t3146\n10th st\t3146\nverger\t3146\nridgewood\t3146\nd 14\t3148\nturnhalle\t3148\nanita\t3149\npace\t3150\n347\t3150\nontario\t3150\nmickiwicza\t3151\ngemeindeaus\t3151\nsimens\t3152\ncamden\t3153\nhawthorn\t3153\nprinceton\t3155\n1b\t3156\nprovincialeweg\t3157\n365\t3159\nbaur\t3159\nstipnaia ul\t3160\njager\t3161\nparafialny\t3161\nbrasseri\t3161\nr pasteur\t3162\ngrb\t3163\nv aldo moro\t3163\n63rd\t3164\namber\t3166\njames st\t3166\nahornweg\t3167\ngarenne\t3167\nabandoned\t3167\nauberge\t3168\ncactus\t3168\nvina\t3168\nirish\t3169\ntolstogo\t3169\nwalking\t3169\nfamilia\t3169\njohn st\t3169\njosep\t3170\ncolho\t3170\nhsbc\t3171\nbeaver cr\t3172\nlinha de agua\t3172\nterry\t3173\nus 27\t3173\nbstalefn\t3174\nrepubblica\t3175\n2e\t3176\ng3\t3176\ngraz\t3178\n503\t3178\neiscafe\t3179\nwarner\t3179\nbibliothequ\t3179\nraiffeisen st\t3179\nul chapaiva\t3179\ncarnot\t3179\ncoventry\t3179\na sport pl\t3181\nruth\t3181\nhwa\t3181\na bf\t3182\ntomei\t3183\npost office\t3183\nd 12\t3183\ngorge\t3183\nbiyeob\t3184\nugo\t3184\ncarroll\t3184\nczada\t3185\nfoto\t3185\nscout\t3187\n392\t3187\nirving\t3188\n54th\t3189\nmorton\t3189\nbarra\t3190\nprovincia\t3191\nhomestay\t3192\nstrawberry\t3192\ntadeusza kosciuszki\t3195\nboyd\t3196\nrivers\t3198\npozarowy\t3198\nmill ln\t3199\nalpes\t3200\n70th\t3201\n385\t3201\nstandard\t3201\nalm\t3201\nd 15\t3201\nfremont\t3201\ninterior\t3202\nlis\t3203\ntech\t3203\nolympia\t3204\nmonti\t3205\nciag\t3205\ngregory\t3206\nneu st\t3206\nknox\t3207\nmorrison\t3207\niskola\t3207\ntre\t3207\ndragon\t3208\npic\t3209\nfoch\t3209\npth\t3209\npriory\t3209\ngustave\t3211\npersiaran\t3211\nzavodskaia ul\t3213\n605\t3214\nalba\t3214\nalamo\t3215\nhousing\t3215\nneto\t3215\nwise\t3216\nlande\t3216\nmill rd\t3218\nliving\t3218\nb 4\t3219\nbleu\t3220\nxii\t3220\n274\t3220\nhelen\t3223\ntudor\t3224\nministry\t3224\nalcalde\t3225\nmarne\t3226\nschulweg\t3228\nfontaines\t3228\nblas\t3230\nhermanos\t3230\nsecundaria\t3232\nberger\t3233\nspanish\t3233\nlucky\t3233\nconcordia\t3233\ndvor\t3233\nnon\t3234\ne 54\t3235\napteka\t3235\ndavidson\t3236\ntokyo\t3236\nlotus\t3237\nzh\t3238\ndaisy\t3238\npoli\t3239\nsari\t3240\nstern\t3241\nwinding\t3242\njulius\t3242\nbodega\t3243\nbretagne\t3243\nrailroad st\t3244\n286\t3245\nthornton\t3247\n603\t3248\nhem\t3249\nprive\t3249\nlebuhraya\t3251\nnova poshta 1\t3251\na15\t3252\nbologna\t3252\ng4\t3252\nbaikal\t3253\nv giuseppe mazzini\t3253\n55th\t3253\nsotto\t3253\nschubert\t3254\nunion st\t3256\nchambers\t3258\nd 8\t3259\nceska posta\t3260\nmou\t3261\nboleslawa\t3262\nfacility\t3262\nmikolaja\t3263\nust\t3263\nphase\t3263\ncapilla\t3267\nostrovskogo\t3267\ndol\t3267\nmanzana\t3268\nhyde\t3269\nadenaur\t3271\n8a\t3273\ncarlisle\t3273\neichenweg\t3274\ncorona\t3276\n198\t3276\ndojazd\t3277\nprincipe\t3277\nsharon\t3277\n515\t3279\nsale\t3279\ne 58\t3279\nmuhlweg\t3279\ngerard\t3280\nmonica\t3280\na 9\t3280\npet\t3282\nbryn\t3284\n276\t3284\npetron\t3284\nizbat\t3285\nfca\t3287\n1962\t3287\nnovembro\t3288\nrelais\t3288\nkaya\t3288\ntsintralni\t3289\nfleurs\t3290\n120th\t3290\njet\t3290\nsilvio\t3290\nql\t3292\nhlu\t3293\nforrest\t3293\nlindenweg\t3293\nmialy\t3294\ntrain\t3298\nbruyeres\t3299\nus 64\t3299\npavillon\t3299\nul gorkogo\t3300\nregion\t3302\natelir\t3303\ncorrea\t3303\n324\t3303\nsayid\t3304\nantigua\t3305\nch rural\t3305\ntrading\t3305\navalon\t3306\n3rd av\t3307\n380\t3308\nvulta\t3309\nsantantonio\t3309\nassis\t3309\niowa\t3309\nrynek\t3310\n335\t3311\nflats\t3311\nmistral\t3311\ncon\t3312\nb 8\t3312\nbeek\t3312\nstora\t3312\ncristoforo\t3313\ndoner\t3313\nblackwater\t3315\niuzhnaia ul\t3315\nzongho\t3315\nmontessori\t3316\ndeportes\t3316\nbaba\t3318\nbeim\t3318\nfellowship\t3318\npiscine\t3319\nvasco\t3319\na13\t3320\nus 23\t3320\nsuarez\t3322\ndp\t3322\nkerk st\t3323\ncapitan\t3325\nfourth\t3325\ngriffin\t3326\nlakeviw dr\t3326\nwebb\t3328\nhurta\t3328\nbirmingham\t3328\npubliqu\t3328\ncane\t3329\nlirmontova\t3329\n505\t3330\nlilla\t3330\ntrlr\t3330\ntaller\t3332\ncardenas\t3332\ncui\t3333\nbrothers\t3334\n372\t3334\nogrodowa\t3335\nm4\t3336\ndevon\t3339\nmaksima\t3340\naragon\t3341\nbrunnen st\t3342\nptge\t3342\nhoney\t3343\naroport\t3344\nff\t3344\nobshchizhitii\t3345\nathena thessalonike euzonoi\t3345\nsauna\t3345\nty\t3346\njackson st\t3346\neasy\t3347\neuzonoi\t3347\nscinces\t3347\nsalita\t3347\niubiliinaia ul\t3349\nsee st\t3350\npartridge\t3351\nlenina st\t3351\nryan\t3352\njusto\t3354\ncourts\t3354\npedra\t3354\ndiana\t3355\nnottingham\t3356\nsawmill\t3357\njane\t3358\nv giuseppe garibaldi\t3358\ngimnaziia\t3359\nmoras\t3360\nhagen\t3361\ngai\t3362\nipiranga\t3362\nkhmilnitskogo\t3363\nunidad\t3363\nnonghyup\t3364\nbaan\t3364\nbible\t3365\nstrad\t3366\nd 10\t3367\ngama\t3368\nvitoria\t3369\nfahrschule\t3369\nfebrero\t3370\npopular\t3373\nnunes\t3373\npilsudskigo\t3374\ncrd\t3374\nca 1\t3376\npko\t3376\ndonald\t3377\ninsurance\t3377\n522\t3378\nhood\t3379\nalcide\t3380\n406\t3381\nus 287\t3381\ncps\t3381\nsderot\t3381\nduqu\t3382\ncherry st\t3383\ndescentralizado\t3383\njosephs\t3385\ndumont\t3388\nploshcha\t3389\noslo\t3390\nacorn\t3390\noficina\t3392\njakob\t3393\n1 20\t3394\nbattista\t3394\nstatoil\t3395\n504\t3395\nbuchenweg\t3395\nclosed\t3398\nstipnaia\t3398\nhauts\t3402\norganismo\t3402\nsheffild\t3402\nlei\t3403\nakadimika\t3405\nmoose\t3406\nhollywood\t3408\ngalleria\t3411\nsuvorova\t3412\nortiz\t3413\nelektro\t3414\nharry\t3414\nbankomat\t3415\ncleaners\t3415\npebble\t3415\ndui\t3416\ncarabiniri\t3417\nprefeito\t3417\ne 39\t3418\n56th\t3420\nsankusu\t3421\nhigher\t3421\nwestminster\t3422\npinewood\t3422\n338\t3425\n318\t3427\ncoco\t3428\nbautista\t3428\neinstein\t3428\n425\t3428\nquen st\t3429\ndiscount\t3433\nul karla marksa\t3433\nowl\t3434\nrim\t3434\ndixon\t3434\nbattisti\t3435\nveg\t3435\nkh\t3436\nalliia\t3436\nname\t3438\nloup\t3439\ns martin\t3440\ncabral\t3440\ndm\t3440\nalefbralefhym\t3442\nwin\t3443\nnoble\t3443\nemiliano\t3443\nheer\t3444\njustice\t3444\nsawah\t3445\nbarao\t3445\nvii\t3446\nnd\t3446\n323\t3447\nestacao\t3448\nhoch\t3448\naguas\t3448\nclayton\t3449\nsrl\t3449\npiney\t3449\ndios\t3450\nbos\t3452\npraxis\t3453\nestrella\t3453\n273\t3454\nnevada\t3454\nburnt\t3454\nsend\t3454\nsivirni\t3454\ndisel\t3455\n1 35\t3455\nmorelos\t3458\npomnik przyrody\t3459\nmoskovskii\t3459\ncandido\t3459\nhl\t3460\nlord\t3461\ngrandes\t3462\nv dante alighiri\t3462\nopp\t3464\ndrug\t3464\n9th st\t3464\novre\t3464\ngill\t3465\nwerk\t3466\n52nd\t3467\nbald\t3468\narrowhead\t3471\nnsg\t3474\n371\t3475\ndawson\t3477\ngyorgy\t3477\nromer st\t3477\npinheiro\t3477\npos\t3478\nhent\t3479\nsto\t3479\ncapitol\t3480\nedinburgh\t3480\nbaron\t3481\ndominos\t3481\nconceicao\t3481\nservicio\t3482\ngr av\t3482\ncway\t3483\napache\t3483\nfawn\t3484\nrei\t3484\nvanha\t3486\nmedina\t3488\npeuplirs\t3488\nsunset dr\t3488\nliceo\t3488\nglenn\t3489\nburns\t3489\nbrest\t3489\no2\t3489\ncrane\t3489\ndonuts\t3490\nmann\t3494\nbryant\t3495\n432\t3496\ngiroiv\t3496\navia\t3496\npeace\t3498\nturm\t3498\njos\t3499\nirene\t3500\nmonteiro\t3502\ntyler\t3502\nmarino\t3503\nplymouth\t3504\n299\t3504\nhuron\t3505\n507\t3505\namselweg\t3505\njezioro\t3507\ncatalina\t3507\n351\t3508\nfray\t3508\njulian\t3508\nhusayn\t3509\ncrossroads\t3510\ngreenfild\t3510\nrocade\t3511\ngusthouse\t3512\nhafen\t3512\nmit\t3513\nsilveira\t3514\nrakoczi\t3515\nconvenince\t3518\ncapitao\t3518\ntoko\t3519\nm3\t3519\nnou\t3520\nsvirdlova\t3521\nportage\t3521\nparkside\t3524\nhighlands\t3525\ncapela\t3527\nmagdalena\t3527\nmendoza\t3527\namericas\t3528\noost\t3529\ntexaco\t3529\nwendys\t3529\nmikhaila\t3529\nramal\t3531\npemex\t3531\nbayviw\t3531\narriba\t3531\npeninsula\t3532\nrain\t3533\nchevron\t3533\nmunicipale\t3534\nbgm\t3536\n51st\t3536\ngaston\t3537\nstafford\t3538\n197\t3538\ntram\t3540\nlipowa\t3541\n525\t3541\ngymnase\t3542\ndello\t3545\nunknown\t3547\nwoodlawn\t3547\nstratford\t3548\nalexandra\t3548\nd 6\t3550\nfrederick\t3551\nseptimbre\t3553\nshib\t3554\nterrain\t3554\nhughes\t3554\nhopital\t3554\narch\t3555\njacinto\t3555\nchapman\t3556\nrosewood\t3557\nken\t3557\nparana\t3557\n471\t3558\ndorps\t3560\nseneca\t3564\nazalea\t3565\nmusee\t3565\nkampung\t3566\ndaro\t3566\n415\t3568\ndenkmal\t3569\ngr st\t3569\nir\t3571\nwinston\t3572\nregent\t3572\nilha\t3572\nemerson\t3573\nalpha\t3573\noctubre\t3573\npao\t3575\nvida\t3575\nfargo\t3577\npo ste italiane\t3577\npublico\t3577\nkrasnoarmiiskaia ul\t3578\nth\t3579\neisenbahn\t3580\n480\t3581\nromero\t3582\ndell\t3583\nina\t3583\nwojska\t3583\nkui\t3583\niuzhni\t3584\ndiu\t3585\nfg\t3586\nagosto\t3586\nsevilla\t3587\nklaranlage\t3587\nterre\t3588\nsydy\t3588\nstella\t3589\ncannon\t3590\nhohen\t3590\n325\t3591\ncanada post\t3593\nklinik\t3594\nd 13\t3596\nyale\t3596\nprat\t3597\ncourthouse\t3600\nleigh\t3600\nprzyrody\t3602\nstage\t3603\nswimming\t3604\nvita\t3604\nfishing\t3605\nhand\t3605\n46th\t3605\n49th\t3606\nagiou\t3606\ndruzhby\t3607\nrvra\t3608\noptik\t3609\ncemetery rd\t3610\nharvard\t3610\nwheeler\t3612\nus 62\t3613\n620\t3614\nhill st\t3615\nsovetskaya st\t3615\njulin\t3616\nwestfild\t3618\nravine\t3619\ncircular\t3621\nzhiliznodorozhnaia ul\t3621\nemma\t3624\nforestire\t3625\nevzonoi\t3625\npintor\t3627\nstefan\t3627\nrock cr\t3628\nmelrose\t3628\ncho\t3630\nn 2\t3630\nmarginal\t3630\nkust\t3630\nbartolome\t3631\nprzedszkole\t3632\nlam\t3633\ngeb\t3634\n60th\t3635\ncamille\t3635\narmstrong\t3638\nkuang\t3638\nbonita\t3638\nvisitor\t3638\ngeraldo\t3639\nplay\t3639\nd 5\t3639\nmedico\t3639\nreynolds\t3640\nsolnichnaia ul\t3640\nnorfolk\t3641\nd 4\t3642\npolk\t3643\nfridhof st\t3643\narc\t3644\npast\t3644\nwaldweg\t3645\nbundes\t3645\ntable\t3647\ncarson\t3647\nsoto\t3648\ngurrero\t3650\nnicholas\t3652\nvu\t3653\ncervantes\t3654\npalermo\t3655\ne 16\t3657\nkut\t3658\nran\t3658\nfraser\t3659\nleite\t3660\npl de mairi\t3662\nsonnen\t3663\nurzad\t3664\npheasant\t3665\nr du stade\t3666\nfarmers\t3667\nfreitas\t3667\nfrederic\t3668\nessex\t3669\nentd\t3669\nsaude\t3670\nlourdes\t3670\npalmas\t3670\nspring st\t3671\nsocite\t3671\ngambetta\t3671\nbnsf\t3673\nweston\t3673\nleisure\t3674\nbogdana\t3674\nsimpson\t3675\nsolana\t3678\nforst\t3681\nrocher\t3681\nwhispering\t3681\nnh44\t3681\nbourgogne\t3683\nnazionale\t3683\nelmwood\t3685\nfoods\t3686\nmiami\t3688\npipeline\t3688\neczanesi\t3689\ncrow\t3689\ncox\t3690\nistituto\t3691\n269\t3691\ncardoso\t3691\nselatan\t3691\nzapata\t3693\nr de mairi\t3694\n7a\t3697\nribeirao\t3698\ngros\t3699\nrepair\t3702\n47th\t3702\neye\t3702\nfrnt st\t3703\ndin\t3704\nprovence\t3704\narrow\t3705\n199\t3706\nmaiakovskogo\t3707\nprtal\t3708\nvirkhnii\t3708\nmagistrala\t3710\nchuang\t3710\nglass\t3712\neva\t3713\ngaleri\t3713\nve\t3715\njaime\t3715\nbed\t3715\nm2\t3716\nnapoli\t3716\nsalida\t3717\ndublin\t3718\n342\t3718\n364\t3719\nriverside dr\t3720\nholt\t3720\nnhj\t3721\ncabo\t3721\nsina\t3722\nvera\t3723\nsg\t3726\nhubert\t3726\nguy\t3727\nstroitilii\t3728\ng40\t3728\nsovetskaya\t3730\nstaff\t3730\ntrento\t3730\nstuart\t3730\nmansion\t3730\nchestnut st\t3731\nmoulins\t3733\nbeechwood\t3733\nshainb\t3734\npalo\t3735\npastor\t3735\nnorton\t3735\nholmes\t3736\n2nd av\t3736\norlando\t3737\nfiume\t3738\nsunnyside\t3739\nbarat\t3739\n341\t3739\nviille\t3740\nfeather\t3741\ndb\t3741\nmarx\t3741\nlily\t3742\ngua\t3742\nc 10\t3742\ntupik\t3743\n283\t3743\neuronet\t3744\ngibson\t3745\n272\t3747\nnv\t3750\nvd\t3751\nus 11\t3752\ncolonel\t3752\ncat\t3753\nauburn\t3753\nfrancia\t3753\nherbert\t3756\n1er\t3756\nfridens\t3757\nuno\t3757\n294\t3758\nvrch\t3760\ngta\t3762\ngravel\t3762\n381\t3763\nfrindship\t3763\nbrucken\t3763\nboys\t3763\n259\t3764\ntorino\t3765\ngasperi\t3765\nprofessora\t3768\n319\t3769\npei\t3769\nholz\t3770\nmtb\t3771\n462\t3771\nchurch of jesus christ of latter day saints\t3771\nparcheggio\t3772\ng45\t3774\n344\t3774\nfrankfurter\t3775\nwasser\t3778\nlambert\t3779\nlick\t3779\nmanzoni\t3780\nus 66\t3781\nburen\t3783\ncoyote\t3785\nguardia\t3785\nistvan\t3787\ntrg\t3787\nskole\t3788\nmilitar\t3789\nathens\t3792\nr de fontaine\t3792\n354\t3793\ncurtis\t3793\nimbiss\t3794\nindependence\t3795\ntj\t3797\npiave\t3797\ncastel\t3798\n1st av\t3799\ngramsci\t3799\nc 9\t3799\nnant\t3801\nadler\t3801\nmain rd\t3802\n6a\t3803\nlecole\t3805\necole primaire\t3806\nwma\t3809\ncovas\t3810\npionirskaia ul\t3810\nyshralefl\t3810\noi\t3811\nrush\t3814\njubilee\t3815\naberdeen\t3816\ngeorge st\t3817\nkhan\t3817\nscolaire\t3819\nhigashi\t3819\n520\t3819\nmoskovskaia\t3819\nne corridor\t3820\ntrattoria\t3821\nkensington\t3821\ngun\t3822\nalvarez\t3822\nb 1\t3823\n293\t3823\ncotton\t3823\nsloneczna\t3823\ncricket\t3823\nparkviw\t3825\nmora\t3826\nsho\t3826\nsoil\t3826\nlondon rd\t3827\nfoot\t3828\n370\t3831\n413\t3831\nbaldwin\t3832\nintermarche\t3832\nbeaumont\t3834\njim\t3834\ndeux\t3836\nus 75\t3839\nindiana\t3839\nyouth\t3840\nrtda\t3842\nthatched\t3844\npidra\t3844\ncuo\t3845\ne 105\t3847\nborges\t3847\nfurniture\t3848\nlorraine\t3848\ncasas\t3849\nnizhnii\t3850\noasis\t3851\npetra\t3852\nmcdonald\t3852\ncirconvallazione\t3852\nkrasnoarmiiskaia\t3853\nspring cr\t3853\nlearning\t3854\nibrahim\t3855\neichen\t3855\nlough\t3855\nseventh\t3857\n48th\t3857\ncvs\t3857\nloire\t3858\nemilia\t3859\npasar\t3860\nventura\t3861\nadolf\t3862\na20\t3864\ngewerbegebit\t3864\npirce\t3864\n249\t3866\nclement\t3866\nshannon\t3866\nitaliane\t3866\ngloria\t3868\nutara\t3869\n7 11\t3870\ngraf\t3870\ncathedral\t3871\nstephens\t3871\n196\t3874\nschneider\t3874\nduarte\t3876\nrocks\t3877\nsix\t3878\nheol\t3878\ncraig\t3879\ncow\t3881\ncavo\t3881\nbeer\t3884\nbusch\t3884\ncomputer\t3886\nrt transcanadinne\t3891\n189\t3895\nlove\t3899\npost st\t3901\ncaisse\t3903\n266\t3910\ntarasa\t3912\nacre\t3913\nd 7\t3913\nbill\t3914\nqy\t3915\njozsef\t3916\nfond\t3919\nnove\t3923\neri\t3923\nsandor\t3925\nmonument aux morts\t3925\nrichardson\t3927\ndown\t3928\nchico\t3928\nboard\t3931\n267\t3932\nkhwchh\t3932\n263\t3935\ndomenico\t3936\ne 41\t3938\ncw\t3939\nlomas\t3942\nsivirnaia ul\t3943\nmunchen\t3946\nalvaro\t3946\nnombre\t3946\ng2\t3946\nraul\t3948\nlighthouse\t3949\nbenz\t3949\nperu\t3952\nquartir\t3953\nbernhard\t3953\nroland\t3956\ne 04\t3956\npar\t3956\nreyes\t3957\nalla\t3959\nbear cr\t3959\nfulton\t3961\nwarwick\t3964\nschweitzer\t3964\npanamericana\t3965\nrios\t3966\nforum\t3970\ne 67\t3970\nlateral\t3975\npaix\t3975\npv\t3980\npot\t3981\nsang\t3981\nmallard\t3983\npilar\t3984\nkonig\t3986\npunto\t3987\nsetembro\t3989\ntk\t3990\niubiliinaia\t3990\nservidao\t3990\nfirenze\t3991\nwisen st\t3991\nanthony\t3992\nsamul\t3992\nkst\t3993\nevangelische\t3993\ngustav\t3993\nnb\t3995\nbalka\t3995\nvreda\t3995\nglendale\t3996\ngogolia\t3999\ncircuito\t4002\nszkolna\t4003\nkp\t4003\n238\t4003\nnino\t4004\nstolovaia\t4006\nquatre\t4007\nc 12\t4008\nrocco\t4009\nzavodskaia\t4010\nrbla\t4010\nkingdom\t4010\nmeridian\t4011\ntankstelle\t4012\nwillow cr\t4012\nra\t4014\npeach\t4014\nwalton\t4017\n41st\t4019\ndal\t4019\nzoo\t4021\nhuntington\t4022\nzeng\t4024\npk ln\t4025\nderby\t4028\n278\t4033\ng70\t4033\nzespol\t4034\nlagoon\t4034\npalais\t4034\nturtle\t4035\nus 12\t4035\nwaters\t4036\ngame\t4037\nsub\t4037\ntorrent\t4038\nhenryka\t4042\n179\t4043\n194\t4043\ne 4\t4044\nsadova\t4045\n193\t4046\nvostochnaia\t4046\nconcepcion\t4047\nmidway\t4048\n43rd\t4048\ntranscanadinne\t4048\npblo\t4048\n248\t4049\nnails\t4049\nalfa\t4050\nminnesota\t4050\nprol\t4051\n45th\t4051\nfilippo\t4051\nbrennero\t4051\nzakaznik\t4053\n44th\t4053\nrefuge\t4054\nbeverly\t4055\n502\t4055\nprolitarskaia ul\t4055\nroses\t4056\nrijksweg\t4057\npolskigo\t4059\nschools\t4061\nsvobody\t4062\nnest\t4063\nalbany\t4067\n8th st\t4068\nndeg\t4069\nisle\t4069\nbento\t4072\n002\t4072\nfutbol\t4074\n314\t4075\nort\t4077\ndar\t4079\nkurt\t4079\nshaykh\t4080\njay\t4081\nplains\t4083\nwaterloo\t4083\nbradford\t4084\nburton\t4084\nstudent\t4090\ngrass\t4091\nmetzgerei\t4092\nbarangay\t4093\nquadra\t4093\nwindy\t4095\nbom\t4096\nlatter\t4096\nbaltimore\t4096\n333\t4096\nfresh\t4098\nnegeri\t4098\ne 06\t4099\ndolina\t4100\nparadis\t4102\nfall\t4103\nboca\t4103\npodhardizd\t4103\nhostal\t4103\nralefs\t4104\nelena\t4104\ncuva\t4104\nfatima\t4108\ncole\t4108\n417\t4109\nglebe\t4109\nfootball\t4109\nadministration\t4109\n352\t4112\ncoastal\t4114\njersey\t4114\ncaduti\t4115\ncinco\t4116\nestadual\t4117\nvijo\t4117\nhy\t4119\n258\t4120\ncentury\t4121\nnamazu\t4121\nbordeaux\t4122\n245\t4122\nrivera\t4126\nmurphy\t4126\npoghots\t4128\nchui\t4130\nprimrose\t4131\nwesley\t4131\nsterling\t4132\n247\t4132\nb 6\t4133\nathena\t4134\nfranca\t4135\n317\t4135\n271\t4135\nbravo\t4137\nkentucky\t4138\ncoach\t4139\nhokuriku\t4139\nneves\t4141\npionirskaia\t4142\n50th\t4142\nsebunirebun\t4144\nr des ecoles\t4146\ngreat wall of china\t4147\nd 2\t4147\ncarriage\t4148\nernest\t4150\nsantana\t4150\nwalgreens\t4152\nlock\t4156\nafonso\t4156\ndouble\t4156\nagricola\t4157\nmts\t4157\nc 8\t4160\nchinesische maur\t4162\ncvn\t4163\nribeira\t4166\nrdge rd\t4171\nsnow\t4172\ngruner\t4173\nbelt\t4173\n900\t4173\nharvey\t4176\n37th\t4178\nbilarusbank\t4180\nlgv\t4181\nassembly\t4182\nkosciuszki\t4183\nruby\t4183\nrossmann\t4184\nvenezia\t4184\n800\t4188\npecan\t4189\npanaderia\t4200\nbottom\t4200\ncanterbury\t4201\ne 77\t4201\nsenda\t4201\nferdinand\t4202\nandrew\t4202\naltes\t4205\nemanule\t4209\n264\t4211\ncalvary\t4211\ndover\t4213\nzui\t4213\nbunos\t4214\ntire\t4214\nmarg\t4215\nchinesische\t4216\ncrawford\t4216\nb 2\t4221\nsole\t4223\nsurgery\t4224\nespace\t4225\nmuhl\t4226\nbrush\t4226\nmead\t4232\nmadre\t4232\nshores\t4232\nacacia\t4234\nd 3\t4236\nwindmill\t4238\nksidza\t4239\nfischer\t4240\nedouard\t4241\nvolunteer\t4241\nvariante\t4242\ntime\t4242\nl st\t4244\ngum\t4244\nkoch\t4245\nmargaret\t4246\nsaddle\t4246\nstoney\t4247\n42nd\t4249\nancin\t4249\nkindertagesstatte\t4250\nlandes\t4252\nsaozhup\t4252\nadriatica\t4252\nmittel\t4253\n257\t4254\n634\t4254\nlagoa\t4256\nlaw\t4257\nmakudonarudo\t4257\ntir\t4257\nxavir\t4260\ncooperative\t4260\n422\t4260\n246\t4263\nimam\t4264\nbiantel\t4264\ntts\t4264\nmiru\t4265\ncarlton\t4267\n1 75\t4267\nruiz\t4269\nreis\t4270\nski\t4272\nleopold\t4273\npla\t4274\ncarr\t4275\nyuansenv\t4277\nzhiliznodorozhnaia\t4280\ncedar st\t4281\niuzhnaia\t4283\n610\t4284\ndurham\t4284\nsideroad\t4284\npatrick\t4287\noktiabria\t4287\npau\t4288\nporter\t4288\nstores\t4292\nconstruction\t4292\nkansas\t4293\ncordoba\t4294\nmuhlen st\t4295\njahn st\t4295\nolympic\t4295\nparaiso\t4296\nsolnichnaia\t4296\ncredit agricole\t4298\n289\t4298\nchile\t4299\nfeld st\t4301\n601\t4302\nfreres\t4305\nchinese\t4305\n39th\t4307\ntirra\t4307\ndzirzhinskogo\t4308\nshuan\t4308\nchesapeake\t4309\nentre\t4310\nmichurina\t4311\npremir\t4311\nhelena\t4312\nmeyer\t4312\nsos\t4312\nschloss st\t4314\npro\t4315\nminas\t4315\nlugovaia ul\t4319\ngrey\t4320\ndowns\t4320\nmissionary\t4321\njeanne\t4322\ndock\t4323\nlaura\t4323\ntourist\t4324\ncapital\t4325\numberto\t4325\nbob\t4326\nleurope\t4327\npiatiorochka\t4329\nedison\t4329\nebert\t4331\njulia\t4334\nmontagne\t4335\npavilion\t4337\ngroupe\t4337\nbass\t4337\nul kalinina\t4337\n470\t4338\n450\t4339\nalmirante\t4339\n405\t4343\nd1\t4343\nbernardino\t4344\nwat\t4345\nmainline\t4345\nsunshine\t4345\nkeller\t4345\n253\t4350\nlime\t4351\nduke\t4352\nhenriqu\t4352\nduncan\t4353\n1 5\t4353\nbath\t4356\ndia\t4357\nschutzen\t4358\nchurch ln\t4358\n282\t4358\ncemiterio\t4358\n407\t4361\nmichals\t4361\naprile\t4361\ncavour\t4361\ncal\t4364\nful\t4365\n460\t4366\nhernandez\t4366\nbach st\t4367\nurban\t4368\nillinois\t4369\nbarnes\t4374\navtomagistral\t4376\ntheater\t4378\nliberte\t4378\n295\t4380\nsanyo shinkansen\t4380\ngregorio\t4384\nprincess\t4385\nmohamed\t4389\narmii\t4391\nbrookside\t4392\nn2\t4392\npitra\t4393\nsb\t4395\njuliana\t4398\ntraining\t4402\npump\t4402\nvinte\t4403\n360\t4404\nmoreira\t4404\ntours\t4404\nalighiri\t4404\nwater st\t4404\ntim\t4406\npatterson\t4407\noff\t4407\nneur\t4407\nwinchester\t4411\nparroquia\t4413\ndois\t4414\nmorro\t4419\nlea\t4420\nnorman\t4422\nphonix\t4422\n227\t4424\nandreas\t4424\ndallas\t4425\nmhtte\t4429\nomv\t4429\ncaixa\t4432\n442\t4432\ngranada\t4432\nclair\t4432\ncentennial\t4436\npinos\t4436\nhunt\t4437\n237\t4439\n195\t4439\nrada\t4439\na8\t4440\nkey\t4442\n411\t4442\npicnic\t4444\nkirke\t4445\nretail\t4445\nprolitarskaia\t4447\nwareouse\t4449\ncorporation\t4450\nsultan\t4452\nmolen\t4452\nflower\t4453\npetofi\t4454\n187\t4456\ng65\t4458\nb 27\t4459\nsarminto\t4460\ne 6\t4460\nmarks\t4461\nchlet\t4462\npizza hut\t4462\ntraversa\t4465\nblossom\t4465\n186\t4468\nlakewood\t4469\nbenedito\t4472\ncant\t4473\nwebster\t4475\nwhrf\t4476\nmitte\t4478\nbennett\t4481\nthessalonike\t4482\narmando\t4483\nalma\t4483\ngirls\t4486\necho\t4486\nflor\t4487\n28n\t4491\ntoyota\t4492\nlenina\t4496\nglenwood\t4498\nbosch\t4502\nwayne\t4502\nlazaro\t4507\n350\t4508\nlexington\t4508\na14\t4512\n244\t4512\nsantu\t4516\npiscina\t4519\nbr 101\t4520\ncorreos\t4520\ncaltex\t4520\n431\t4521\nten\t4521\nesp\t4524\nrw\t4524\n38th\t4527\n192\t4530\nromana\t4531\nshun\t4540\nberliner st\t4542\nmarc\t4542\npostal\t4545\nadama\t4546\ntimur\t4547\n308\t4547\n307\t4550\nmobil\t4552\nchildrens\t4553\nwisenweg\t4554\nb1\t4555\nconde\t4556\nskyline\t4559\nyuhag\t4559\n315\t4559\nlajos\t4559\nbrowns\t4561\nfaith\t4563\ngrandviw\t4565\nak\t4566\nschmidt\t4568\nsheridan\t4571\nguido\t4573\nahmad\t4574\ntavern\t4576\nspace\t4576\nsante\t4577\n1 70\t4579\nparks\t4580\npatak\t4580\nmato\t4581\ngeorgia\t4582\nadam\t4582\nr du chateau\t4586\ntah 1\t4587\nc 7\t4587\ncunha\t4590\nwoodside\t4594\nhbf\t4594\nalice\t4595\nlands\t4598\nteixeira\t4599\nfamili\t4601\nisral\t4604\nsunny\t4605\nalder\t4605\nwind\t4607\noregon\t4607\nliberation\t4608\nmor\t4608\nhayes\t4608\nivan\t4610\nhutte\t4612\ngothe st\t4612\ngrands\t4614\nbothar\t4615\ndakota\t4618\nsupply\t4623\nsomerset\t4625\nus 80\t4626\ncano\t4627\nwoodlands\t4628\nmosque\t4629\nbriar\t4629\nabzweig\t4631\nprovidence\t4633\ntaxi\t4637\nmastro\t4639\nmarseille\t4641\nwalmart\t4641\ngrund\t4642\neneos\t4643\n331\t4647\norlen\t4648\nrosas\t4650\ncharlotte\t4652\nkebab\t4652\nleonard\t4652\ncoal\t4654\naleflshykh\t4657\nd 1\t4657\nteatro\t4658\n430\t4658\npins\t4659\n4a\t4659\n33rd\t4664\nportland\t4668\nharvest\t4670\nq8\t4670\nja\t4673\nfoothill\t4673\ngendarmeri\t4674\n402\t4675\nbaserria\t4678\ngym\t4680\nelias\t4682\ngg\t4684\n239\t4684\nelisabeth\t4684\nthird\t4685\nfederico\t4686\ncoiffure\t4689\ncommons\t4691\nbaru\t4692\narturo\t4693\nairport rd\t4693\ngermain\t4694\ndit\t4694\nwerner\t4698\nkafi\t4698\nengenheiro\t4702\n321\t4703\nharmony\t4703\nmydalefn\t4703\ngranite\t4704\nsilsovit\t4704\nheros\t4706\ncold\t4709\nalefbn\t4711\nliberta\t4712\nstevens\t4713\n316\t4713\nfrunzi\t4714\n404\t4715\npk rd\t4719\ntf\t4720\nsklep\t4721\n228\t4723\noblasti\t4725\njaya\t4726\nboa\t4726\ngorodskaia\t4726\noliver\t4727\nchkalova\t4730\noz\t4732\nclifton\t4732\nalpe\t4736\nmelo\t4737\nesperanza\t4738\nglacir\t4741\nluz\t4742\nfashion\t4744\nmichele\t4746\naugu\t4746\nslough\t4747\nwing\t4748\nouter\t4749\nzuid\t4752\nball\t4754\ne st\t4755\nplaine\t4756\nbras\t4758\nfernandes\t4759\nbri st\t4761\ng30\t4763\nbam\t4764\nmonumento\t4765\nvor\t4766\nrondo\t4770\n177\t4771\n188\t4778\npen\t4779\ntrakt\t4780\naraujo\t4781\nah6\t4784\nbanka\t4785\nvereador\t4785\nadministratsiia\t4786\nneuf\t4788\ndln\t4789\ncima\t4790\n256\t4792\ntrout\t4793\n262\t4795\ngut\t4795\navon\t4796\nzarichnaia ul\t4796\nfir\t4797\ndhsa\t4797\nsecretaria\t4798\nshaw\t4798\netinne\t4800\npodstawowa\t4801\ntal st\t4802\ncastilla\t4808\nride\t4810\nhay\t4813\nvincenzo\t4815\nwestwood\t4815\nnh\t4817\ngale\t4819\nhenderson\t4821\nshadow\t4822\nmorning\t4823\nellis\t4824\nking st\t4824\nsalmon\t4824\nstari\t4824\ncatherine\t4824\nul pushkina\t4829\nmaio\t4831\nbrooks\t4836\nenriqu\t4837\n320\t4838\nedgewood\t4839\nlawn\t4839\n166\t4842\nanger\t4845\nbeethoven\t4846\ngetranke\t4847\nfranco\t4848\nplage\t4848\nzaragoza\t4848\nschiller st\t4849\nkonrad\t4852\nmill st\t4853\narco\t4853\nbalefnkh\t4858\nmys\t4859\nbedford\t4861\nmusic\t4861\nceng\t4862\n243\t4863\nhazel\t4864\nwine\t4865\ncultural\t4872\nhomes\t4874\nbowling\t4874\n236\t4876\npoggio\t4876\nplat\t4878\ngyo\t4880\ncentral av\t4880\nverdun\t4881\nmer\t4883\nlilas\t4883\ncom\t4884\ncombe\t4885\n421\t4891\nic\t4893\nalegre\t4894\nengineering\t4894\nainzbte\t4904\nlive\t4905\nnoord\t4905\nbau\t4913\nfleming\t4914\nstations\t4914\ndixi\t4914\nsoares\t4916\nsenior\t4919\nurochishchi\t4920\nguterweg\t4920\nbradley\t4923\ndenis\t4925\n34th\t4926\npolo\t4926\nzentrum\t4928\ngilbert\t4930\npere\t4930\nexchange\t4931\n31st\t4932\n1000\t4935\ndlia\t4936\nteich\t4938\ncrooked\t4940\nernesto\t4940\nkhrbte\t4943\nautumn\t4944\n35th\t4947\nah8\t4947\n2000\t4947\nbw\t4952\nraiffeisenbank\t4956\n7th st\t4958\n395\t4961\njanos\t4962\ners\t4962\nwatson\t4964\ncalvaire\t4964\nus 60\t4966\nelectric\t4966\nkrasni\t4967\nauk\t4968\n306\t4968\nll\t4970\nprivatbank\t4970\n5a\t4972\nhawk\t4972\nnguyen\t4974\nasia\t4975\nchenes\t4976\nbloco\t4976\n36th\t4977\nsor\t4979\ndomingos\t4980\ncarmel\t4980\na10\t4981\nvolta\t4983\nus 70\t4983\nnegro\t4986\nbunker\t4993\nresearch\t5002\nmartino\t5003\ndeli\t5004\nsporthalle\t5005\nmartiri\t5007\ncristobal\t5008\ncameron\t5009\nlugovaia\t5012\nbishop\t5014\nwiner\t5015\ndollar\t5015\nmy\t5016\npolivaia ul\t5016\nmorts\t5017\n550\t5020\nc 6\t5021\n302\t5023\nromer\t5023\nrao\t5023\nmiranda\t5024\nah3\t5027\nsherman\t5029\n159\t5034\nborgo\t5036\nras\t5040\ngiorgio\t5042\nhoya\t5042\nit\t5044\nprovinciale\t5044\nkompliks\t5048\nbatiment\t5049\n182\t5051\npreston\t5052\nengland\t5054\nparts\t5054\nferreteria\t5059\nassociation\t5060\nnewport\t5060\nbv\t5065\nhunters\t5066\noakland\t5066\nheather\t5068\ndrk\t5074\n184\t5076\nagios\t5083\nmatteotti\t5084\nfr\t5085\nfosse\t5086\nguimaras\t5086\nalpine\t5087\nmore\t5087\ncopper\t5087\ne 05\t5087\ncancha\t5092\nmkt pl\t5092\nwilderness\t5093\n277\t5096\nwo\t5099\nboulangeri\t5101\nbarton\t5104\n40th\t5106\n178\t5107\nazs\t5108\n332\t5110\nferenc\t5110\na7\t5113\nrolling\t5115\nanimal\t5119\nhi\t5121\nlog\t5122\n611\t5127\nadolfo\t5128\nv guglilmo marconi\t5130\nhemlock\t5131\npenn\t5131\nuramy\t5137\nfernandez\t5137\ngl\t5138\nbrighton\t5138\nwinkel\t5138\nkhirbat\t5141\ncastelo\t5141\nbor\t5145\nintg\t5145\nchome\t5146\nashley\t5149\nnj\t5150\n174\t5150\nmuhlenweg\t5152\nmichigan\t5153\nreed\t5154\nus 99\t5155\nayn\t5156\nandrade\t5157\nsales\t5158\nsage\t5159\nstorage\t5163\nus 20\t5164\nnm\t5165\nhardware\t5168\nshivchinko\t5169\nprimo\t5170\ndhl\t5170\n313\t5172\narlington\t5172\nhorsesho\t5176\noperative\t5176\n254\t5176\nfalcon\t5178\nimini\t5179\n172\t5180\nsviazi\t5180\ndelaware\t5180\nnear\t5186\nlancaster\t5187\nrhone\t5191\nshinomontazh\t5193\nmazzini\t5194\nbosqu\t5200\nhilton\t5204\nshivchinka\t5205\n312\t5208\nlinde\t5209\nr c\t5210\ndoro\t5211\ntravel\t5212\nfer\t5212\n1 80\t5214\nsutton\t5215\nallende\t5215\nev\t5216\nbeacon\t5217\n420\t5217\nffcc\t5219\ntrunk\t5220\npowell\t5221\nchene\t5221\ntraverse\t5222\ndove\t5225\n216\t5226\nllano\t5226\nblm\t5226\nwildwood\t5226\nkan\t5227\ncut\t5228\nmeng\t5228\nisidro\t5229\nkloster\t5230\nbela\t5231\ntea\t5231\n233\t5231\ncinema\t5233\nre\t5235\nvictory\t5237\nplata\t5238\nice\t5239\npalmer\t5242\nhuai\t5244\ngarfild\t5246\nlibertad\t5249\nmyrtle\t5249\nr principale\t5250\nsete\t5251\nbarber\t5255\nmir\t5257\na9\t5260\nestadio\t5260\nah26\t5262\n630\t5262\npawla\t5264\npolska\t5266\ncolombo\t5266\nfoster\t5270\nindah\t5270\nchurch rd\t5280\ncafeteria\t5286\n265\t5289\ntoledo\t5291\nul kirova\t5292\n403\t5293\nenglish\t5296\n217\t5298\nour\t5301\neugenio\t5303\nalfonso\t5303\nmendes\t5311\nbt\t5314\n412\t5318\ne 25\t5318\noscar\t5319\nsir\t5320\nalefllh\t5323\nmitre\t5327\nsuperior\t5327\nexit\t5327\nbasn\t5330\nhasan\t5336\nindustri st\t5336\ngly\t5337\nray\t5339\nneuve\t5340\npublica\t5342\nsoleil\t5342\n234\t5342\ntaco\t5348\nhonda\t5350\ngoose\t5351\ntangenziale\t5352\nbazar\t5352\npennsylvania\t5353\nletang\t5357\nseoul\t5359\nbahia\t5360\nhot\t5368\neugene\t5368\nrosen\t5371\nwillem\t5372\nagustin\t5373\n32nd\t5374\nstrasbourg\t5374\ncoral\t5374\npunkt\t5376\nmidland\t5379\nflora\t5382\nvinci\t5386\nkula\t5389\nconnector\t5392\n700\t5394\nzarichnaia\t5394\nhauptlini\t5394\ngenerale\t5395\nleo\t5395\nkossuth\t5399\ntilleuls\t5399\ninformation\t5402\n305\t5403\nsala\t5403\nmaggio\t5403\n252\t5404\nzilionaia ul\t5405\nzuoteo\t5409\nbukit\t5411\nalexandre\t5412\nr de gare\t5415\nazul\t5416\nsupermercado\t5417\npolna\t5420\nsource\t5423\nkao\t5425\na 3\t5427\ngateway\t5429\nconstitucion\t5430\nsai\t5430\ntadeusza\t5433\nbenjamin\t5434\nrenault\t5447\nccvcn\t5449\nedwards\t5455\nclover\t5458\n285\t5458\nelementaire\t5459\ncomunale\t5459\nbibliotika\t5460\nctr st\t5463\nko\t5464\noutlet\t5464\nscolo\t5468\nlaurent\t5468\nworks\t5468\ns st\t5469\ncrral\t5477\nlogan\t5484\n29th\t5486\nfairfild\t5491\npian\t5495\ndroga\t5495\nschool st\t5507\nbuna\t5510\n241\t5511\nlouise\t5515\nzhe\t5517\n226\t5520\napartment\t5521\nparti\t5522\n168\t5522\naires\t5523\narnold\t5532\na12\t5533\ngraham\t5534\narbor\t5536\nmontana\t5543\nrruga\t5545\nmina\t5546\n1 40\t5548\nstefana\t5550\npp\t5551\npg\t5552\nwallace\t5553\nus 40\t5554\n275\t5557\nsivirnaia\t5561\nterra\t5562\notter\t5565\nrybnik\t5565\nmill cr\t5566\n330\t5568\nlinin\t5568\nagricole\t5568\nsri\t5573\nstony\t5574\ndesign\t5576\n242\t5577\nclinton\t5581\nhawthorne\t5581\nmata\t5583\nthessaloniki\t5584\nmaia\t5584\nweber\t5587\nraiona\t5589\nkladbishchi\t5592\nbailey\t5592\neg\t5592\ncolumbus\t5592\ncroce\t5593\nida\t5598\n441\t5600\ndean\t5602\nestatal\t5602\na 6\t5604\nabc\t5605\nvicinale\t5606\npio\t5607\nsyd\t5608\nverdi\t5611\nlinda\t5613\n185\t5618\nkamp\t5620\nconcord\t5622\nboston\t5626\nsect\t5626\npolivaia\t5627\nemerald\t5633\nlakeshore\t5633\nbutler\t5633\ncaminho\t5634\nflorence\t5635\ngulf\t5638\nabril\t5640\na 4\t5640\nnuova\t5644\nheron\t5645\ngrote\t5650\nus 30\t5651\npozo\t5652\nkoz\t5653\nenterprise\t5655\nfisher\t5655\nog\t5659\nopen\t5661\ncycle\t5664\n223\t5667\n162\t5667\nindia\t5669\ne 35\t5670\nostrov\t5672\n304\t5673\npauls\t5677\nkingston\t5679\nshao\t5691\npaula\t5692\nus 41\t5692\nsocity\t5692\ngori\t5695\nbarros\t5699\nmuzii\t5705\nedge\t5712\ngyeongbu\t5712\nangeles\t5714\nperon\t5714\nspencer\t5716\nancinne\t5716\nceska\t5716\n322\t5718\ncarter\t5718\nprinces\t5722\nriverviw\t5722\ncjto\t5723\nlafayette\t5725\nshelter\t5726\ncase\t5726\noro\t5726\ndang\t5732\n410\t5735\ntransit\t5741\naldo\t5741\nholland\t5742\nportugal\t5742\nveneto\t5748\ngross\t5749\nramp\t5749\n208\t5750\ngray\t5752\ncumberland\t5755\nlopes\t5756\npulau\t5759\n218\t5762\ng5\t5764\nmg\t5766\nsweet\t5774\nmoon\t5778\nkrasnaia\t5783\nfree\t5786\nmarii\t5786\nrcon\t5787\nmontgomery\t5788\ntrois\t5789\njiron\t5791\nklub\t5792\ncesar\t5796\nimperial\t5799\ngulch\t5802\ninterstate\t5814\nc 5\t5817\n229\t5818\nbatista\t5821\nchannel\t5823\ned\t5823\nchapaiva\t5826\nbolivar\t5827\na 2\t5828\nwright\t5828\nmarta\t5829\npraia\t5830\nroom\t5831\ndelta\t5832\nregina\t5836\n1 95\t5836\nalefhmd\t5836\nbanqu\t5838\n167\t5840\nrewe\t5843\n164\t5844\ncolon\t5844\nlone\t5848\n235\t5848\nbapti\t5848\ntechnology\t5851\nstand\t5857\nalternate\t5858\n260\t5858\nmercedes\t5859\n147\t5861\nvecchia\t5861\nlynn\t5869\nwalnut st\t5870\nnicola\t5871\nlucas\t5874\ncc\t5875\njoan\t5875\nsdn\t5875\nohio\t5875\ngorodskoi\t5876\ntheodor\t5877\nlimited\t5877\ntaman\t5878\nul gagarina\t5879\nw main st\t5880\nlounge\t5884\n309\t5887\ne 20\t5890\nmuhlbach\t5894\nmud\t5900\ndor\t5902\namur\t5903\nr du moulin\t5904\npk av\t5907\ntinda\t5907\nriu\t5911\n6th st\t5913\nplum\t5919\nhidalgo\t5919\nchicago\t5923\nfair\t5923\n146\t5925\nduck\t5925\nmexico\t5926\nhilltop\t5928\ntah\t5930\nmilton\t5935\nbaza\t5937\ncivil\t5937\n181\t5945\nnustra\t5947\n1945\t5948\nvargas\t5950\nbirkenweg\t5953\nmanchester\t5963\njahn\t5968\ngothe\t5968\ndiao\t5971\ndesa\t5973\nkhyalefbalefn\t5975\ne main st\t5976\nswitego\t5978\nain\t5979\nrepsol\t5979\npalazzo\t5979\nniuwe\t5981\nwisen\t5987\n149\t5988\nfritz\t5993\nbon\t6001\n26th\t6002\n310\t6002\nsanchez\t6003\n255\t6004\n501\t6008\nmalaia\t6008\nbasse\t6013\nricardo\t6013\nmozart\t6014\na 1\t6029\njuarez\t6035\nc 4\t6037\nbristol\t6043\noverlook\t6044\nsenora\t6051\n311\t6057\ngomez\t6057\nrocha\t6065\nabalefd\t6065\njacob\t6066\nbiserica\t6068\nramos\t6070\naral\t6074\nchurchill\t6074\ntemplom\t6074\n261\t6076\nhsyn\t6077\nhouston\t6080\n171\t6084\n27th\t6085\nheart\t6086\nmarcos\t6086\n219\t6088\nkuai\t6090\nhomestead\t6090\n154\t6098\nacesso\t6098\n280\t6100\nmikroraion\t6102\nroy\t6107\nah2\t6108\naurora\t6109\npomnik\t6111\ndesert\t6116\ntrans canada hwy\t6117\npino\t6120\nmotors\t6121\nn1\t6121\nuniversidad\t6122\nhorn\t6122\nkaido\t6125\n176\t6126\natlantic\t6127\nmaur\t6127\nchicken\t6128\nrbhddh\t6129\nszent\t6132\n303\t6133\n28th\t6135\ntrails\t6137\nkri\t6139\n251\t6146\naustin\t6146\nfern\t6150\nboulder\t6151\nrudolf\t6152\nfarms\t6157\nhameau\t6157\npor\t6157\nembassy\t6159\ngoncalves\t6160\nmulberry\t6162\ncardinal\t6163\nleaf\t6163\n157\t6163\nhunter\t6165\nnavajo\t6165\ntexas\t6168\nandrea\t6170\nrepublic\t6171\nbelmont\t6171\ndrain\t6173\nkaiser\t6174\nbruce\t6177\npanorama\t6180\nindependencia\t6181\ngood\t6182\nrainbow\t6182\nmuhammad\t6186\nxxiii\t6186\nepiscopal\t6187\nmarais\t6188\ncollins\t6191\nquinta\t6201\nseven eleven\t6201\npalac\t6201\npole\t6202\nstanley\t6203\nsherwood\t6205\nguadalupe\t6205\nmotor\t6208\n148\t6208\nspil\t6212\nnagar\t6213\n1 10\t6214\nzilionaia\t6214\nfive\t6219\nkirchweg\t6221\ncabin\t6221\nlini\t6225\n209\t6228\n225\t6231\ncascade\t6233\ng15\t6236\nforge\t6238\nhart\t6238\ng25\t6238\ngrande r\t6242\noud\t6242\nshin\t6244\ntrust\t6248\n207\t6248\nnovaia ul\t6249\ncherokee\t6249\necoles\t6254\ncolonial\t6259\napt\t6260\narms\t6262\nkhram\t6263\nfountain\t6263\nmrdor\t6265\ntelecom\t6269\nargentina\t6275\nmason\t6278\n144\t6279\nile\t6282\nviira\t6284\nditskaia\t6286\nrynok\t6298\npreserve\t6300\nponinte\t6303\nlion\t6303\noakwood\t6309\n139\t6310\nmrkz\t6311\nroger\t6311\nwahdah\t6312\ncentrale\t6317\n30th\t6318\nsalud\t6326\nn st\t6333\nbureau\t6336\nfrench\t6337\nus 101\t6337\nblanche\t6342\naleflwhdte\t6344\nroberts\t6348\n281\t6348\ncolle\t6352\nwashington st\t6357\nprice\t6369\ntohoku\t6372\nibn\t6372\nb 3\t6374\npirvomaiskaia ul\t6398\nfawy\t6407\nwinter\t6409\nweir\t6412\nbruno\t6412\nindependent\t6413\nheliport\t6417\nturner\t6424\nburlington\t6431\nm1\t6435\nyoung\t6440\nemilio\t6440\ncaffe\t6441\nturkey\t6442\na6\t6445\nedeka\t6447\nlesna\t6447\nschiller\t6448\njoaquin\t6452\naugusta\t6452\ndomaine\t6456\nbull\t6456\ncesare\t6459\nciudad\t6460\nermita\t6463\nmedia\t6470\ngi\t6473\nlight\t6473\nvc\t6475\nhappy\t6484\nus 50\t6486\ngymnasium\t6489\nacacias\t6493\ntruck\t6499\nclinica\t6507\nblanco\t6514\npico\t6515\nbayt\t6515\nmarion\t6516\nredwood\t6518\nalefltryq\t6524\nsihiyah\t6525\nsteig\t6530\nbranco\t6532\n3a\t6533\narab\t6536\nkultury\t6538\narmy\t6541\nscince\t6542\nbiblioteca\t6543\n\t6550\niris\t6551\nspringfild\t6554\n143\t6556\nsous\t6556\npalma\t6557\ngust\t6559\nshdrvt\t6564\nbeco\t6572\niron\t6573\nkon\t6574\nphillips\t6578\nroberto\t6578\nayuntaminto\t6579\naleflshyte\t6580\n156\t6580\nkiosk\t6583\nfrei\t6583\nbird\t6589\nwar\t6590\n215\t6591\nprimaria\t6592\neden\t6592\nmaple st\t6597\nfratelli\t6604\nmoreno\t6607\nlavoir\t6608\nmartinez\t6612\nrnd\t6613\nsky\t6623\nchai\t6632\nblumen\t6633\npri\t6635\nuliza\t6641\nradio\t6643\nevans\t6645\npolicia\t6648\nrogers\t6652\nsungai\t6653\nxuan\t6654\nw st\t6655\n240\t6657\ncap\t6660\nhinter\t6663\nka\t6666\nmay\t6670\nislands\t6672\nvernon\t6676\nmediterraneo\t6676\nclay\t6683\nrita\t6683\nferrocarril\t6683\nteresa\t6686\nconcession\t6694\npasso\t6695\njogi\t6696\ncape\t6697\nme\t6700\nmayor\t6701\nrey\t6704\ndairy\t6705\nbush\t6708\nluna\t6708\nschwarzwaldverein\t6710\n211\t6711\nkelly\t6715\njaures\t6715\nantoine\t6720\nvallee\t6721\n155\t6722\nshaib\t6722\ninfantil\t6724\nmark\t6726\nvert\t6726\nforet\t6726\n173\t6726\nkorpus\t6727\nfonte\t6732\nwein\t6733\nrou\t6738\ntomas\t6738\nchong\t6740\nbanca\t6740\n224\t6741\negnatia odos\t6742\ncooper\t6745\nsam\t6750\nr rd\t6753\nrice\t6762\n25th\t6762\nbuck\t6763\nsebastiao\t6763\nabbey\t6773\nbelvedere\t6774\nsummer\t6776\na 8\t6776\n161\t6776\njuniper\t6777\nroche\t6778\nfontana\t6780\n142\t6782\nzang\t6783\nivy\t6785\nmoss\t6792\ncarolina\t6793\nnuvo\t6794\nheath\t6794\ntin\t6795\n165\t6801\nvine\t6804\nmuseo\t6806\nzha\t6808\nmoro\t6817\nclaude\t6821\nwald st\t6822\nbenito\t6826\nn main st\t6826\nfont\t6826\npai\t6830\nstantsiia\t6841\nfamilymart\t6843\n600\t6845\npenny\t6846\nandres\t6847\nszkola\t6848\nparada\t6854\nperry\t6854\nlisnaia ul\t6855\nou\t6855\nvlls\t6857\ntn\t6866\ndeep\t6866\nisabel\t6868\ngallery\t6868\nsidi\t6869\nlimite\t6871\nporte\t6872\nplus\t6873\nsin\t6876\nboat\t6877\n290\t6886\nroca\t6889\nbaile\t6891\nanton\t6892\nbayou\t6896\ns main st\t6900\nmiao\t6901\njohannes\t6902\n231\t6907\nmars\t6916\netang\t6919\nroqu\t6921\nraymond\t6923\ncusta\t6926\nfelipe\t6928\nmdrste\t6932\nlucia\t6934\ngonzalez\t6934\n270\t6936\naire\t6936\neducation\t6937\nleonardo\t6942\npirvomaiskaia\t6942\nmuhlen\t6946\nlost\t6946\narena\t6949\nmadonna\t6949\neduardo\t6951\n145\t6953\nprincipal\t6955\ntriq\t6957\nbani\t6960\nc 3\t6965\nc 2\t6971\nbernard\t6976\nalefmalefm\t6977\nmilano\t6979\nmaja\t6980\nfilho\t6981\nkv\t6981\nhsn\t6984\nruo\t6989\nstewart\t6996\nurb\t6997\n5th st\t6999\nmurray\t6999\nfilds\t7001\nscenic\t7002\nalt\t7005\nober\t7017\n175\t7020\n221\t7024\nplan\t7027\nroundabout\t7032\nwladyslawa\t7039\nainrb\t7043\nnovo\t7044\nmorris\t7048\n183\t7049\npetrol\t7051\ncontrada\t7055\nrm\t7057\nshainyb\t7058\nbarbosa\t7060\nknoll\t7063\nchester\t7073\n232\t7076\ngran\t7076\nrest\t7083\nmosqu\t7083\n214\t7083\ncristo\t7087\naugust\t7095\ngreenwood\t7099\nlocalita\t7104\nqin\t7108\nkitchen\t7108\nespana\t7109\nham\t7112\nc 1\t7120\nberry\t7121\ncomercial\t7125\ncleveland\t7126\npl de leglise\t7132\n222\t7136\nmariano\t7137\ntv\t7141\n163\t7144\ntom\t7145\nedward\t7161\nmarksa\t7164\n1 90\t7164\nniu\t7165\nkochasi\t7167\ndante\t7173\nkirch st\t7174\ncotts\t7174\npe\t7175\naspen\t7179\nbourg\t7184\njordan\t7187\nmontee\t7196\nbernardo\t7196\nnabirizhnaia ul\t7196\nknob\t7215\nposto\t7215\npower\t7218\nmarshall\t7219\ncliff\t7226\npine st\t7231\n213\t7234\ngovernador\t7234\nbella\t7240\ntor\t7247\nkeng\t7268\n128\t7276\nwagner\t7278\nnewton\t7281\nalfredo\t7281\nsidlung\t7281\nhaute\t7284\ngla\t7286\ndeau\t7296\nkomsomolskaia ul\t7299\nperez\t7299\n191\t7302\nunion pacific railroad\t7302\nhistoric\t7306\nlit\t7310\ndiaz\t7322\npaso\t7325\nlakeside\t7326\ntheatre\t7327\njr dong hai dao ben xian\t7330\nsridniaia\t7332\nsec\t7344\n23rd\t7348\n204\t7360\nswan\t7360\nverte\t7365\nhudson\t7367\nsebastian\t7368\nthai\t7369\ninstituto\t7370\ngordon\t7376\n133\t7394\nangelo\t7400\nbarcelona\t7403\nson\t7404\nferme\t7404\nmkt st\t7423\nblwalefr\t7423\nkent\t7424\nautokinetodromos\t7426\ncp\t7429\nalmeida\t7430\nbolshaia\t7442\nburn\t7466\nrodriguz\t7473\nrancho\t7476\n206\t7478\nsalt\t7479\ncommunale\t7485\naugusto\t7492\nalessandro\t7495\ncuri\t7499\nmanagement\t7500\nring st\t7501\ncolorado\t7507\njohann\t7507\npension\t7511\nberlin\t7514\nshhyd\t7517\nhohe\t7519\nelm st\t7520\nunit\t7526\nklein\t7531\ntuan\t7535\ntesco\t7538\n22nd\t7541\ngunung\t7545\nnovi\t7549\ne 18\t7553\nbelgrano\t7554\n250\t7555\npamiatnik\t7557\nenrico\t7558\nrobinson\t7559\n001\t7571\nhalle\t7572\neducacion\t7572\n340\t7575\npeng\t7577\ncarvalho\t7578\nsushi\t7579\ndog\t7579\n212\t7586\nmajor\t7600\neem\t7602\nkol\t7606\n21st\t7615\nunter\t7615\ncolony\t7618\nchao\t7619\n07\t7626\npapa\t7631\nrosario\t7643\nblanca\t7650\nmunicipio\t7660\nstn rd\t7664\nmil\t7665\ncastello\t7670\nann\t7672\ndun\t7673\nbel\t7676\nburger king\t7680\nprivada\t7685\nyellow\t7692\nskola\t7693\nyd\t7696\ngeorg\t7697\num\t7699\ncalifornia\t7706\nvalencia\t7706\nvignes\t7710\nxiu\t7713\ncu\t7721\ncmentarz\t7726\nrh\t7728\nraya\t7735\nah5\t7735\nblanc\t7740\ntrval\t7743\ncook\t7747\nlady\t7748\nbeck\t7750\nmarqus\t7754\ncastillo\t7757\nul mira\t7760\n203\t7767\nstanislawa\t7769\nbrunnen\t7777\ndias\t7782\ngasthof\t7785\nernst\t7790\nac\t7790\nholy\t7804\nristorante\t7814\noak st\t7816\nvej\t7825\nlun\t7829\n190\t7829\nstaz\t7833\npaolo\t7836\nhacinda\t7841\nop\t7843\nrobin\t7846\npearl\t7848\nbethel\t7849\nagip\t7860\ncft\t7862\npioneer\t7865\nsocial\t7873\nmachado\t7875\nbolnitsa\t7876\nkantor\t7879\nwell\t7880\nparadise\t7893\n126\t7896\nnp\t7900\ncrs\t7907\n205\t7908\nboutiqu\t7908\npara\t7909\nguglilmo\t7910\nfosso\t7918\nrr\t7919\nbeauty\t7921\n24th\t7934\nelk\t7936\nrepublica\t7941\nmolino\t7944\nsunrise\t7947\nfitness\t7952\nmarine\t7958\ngemeinde\t7965\ncorridor\t7968\nmost\t7988\n158\t7990\nbase\t7996\nfo\t7996\ncz kct\t7998\nfs\t8006\nqubrada\t8007\nkomsomolskaia\t8014\nlocal\t8016\norinte\t8023\nkun\t8023\nmorgan\t8038\nchen\t8042\nmarcel\t8049\n08\t8050\n170\t8054\nparker\t8062\n230\t8070\nnetto\t8071\nmian\t8074\n153\t8075\ndale\t8082\ndamm\t8088\n137\t8098\ne 90\t8120\nap\t8138\ncrown\t8140\n287\t8144\nignacio\t8146\nclara\t8148\ncampos\t8156\nsuites\t8157\nlife\t8168\npresbyterian\t8169\n152\t8200\ncjon\t8201\ntoll\t8212\ncave\t8212\nroggia\t8214\npochta rossii\t8216\nbny\t8226\nchang cheng\t8228\nclear\t8235\n129\t8239\n136\t8244\n500\t8247\nhole\t8249\nbakery\t8261\npista\t8264\nflorida\t8264\ntryq\t8274\ngorkogo\t8283\nip\t8284\noxford\t8292\nkapelle\t8293\ncorrego\t8297\nmitchell\t8299\nstates\t8305\nfc\t8308\nvincent\t8321\nor\t8335\n141\t8342\nmonro\t8354\ncrystal\t8357\nplayground\t8360\nyagateteu\t8360\nabd\t8363\ndogwood\t8370\npinto\t8371\nmali\t8372\npines\t8375\nsugar\t8379\nlocust\t8386\nraion\t8386\nhonsen\t8391\nkalinina\t8392\nwellington\t8398\nraiffeisen\t8403\nmoore\t8421\npalace\t8422\ncondominio\t8423\ncementerio\t8435\nbox\t8441\nrussell\t8456\ninstitute\t8460\nquail\t8462\nkerk\t8470\nainyn\t8470\nbellevu\t8474\nbarn\t8483\nfactory\t8486\ncommerce\t8488\ngenerala\t8488\ncarmen\t8492\nnovembre\t8493\nrepubliqu\t8497\n138\t8503\nsalem\t8508\n2a\t8513\npir\t8513\ndomingo\t8516\n169\t8517\ne 15\t8517\nbolshoi\t8520\nloch\t8534\n135\t8545\n4th st\t8546\nlisnaia\t8551\nkita\t8551\nmarin\t8553\ntranssibirskaia magistral\t8555\nmuller\t8556\ngomes\t8557\nparco\t8559\n19th\t8559\nhampton\t8562\nbest\t8563\nroman\t8567\ntranssibirskaia\t8576\ncimitero\t8577\nlorong\t8583\namerican\t8583\ntrva\t8595\nlkt\t8599\ncarl\t8608\nwalter\t8609\nemile\t8612\nvirgen\t8613\n20th\t8614\nem\t8618\ne 70\t8621\npasteur\t8623\nplaya\t8627\nniao\t8645\ne 50\t8648\nautohaus\t8656\nhuamirimato\t8657\nmerc\t8662\nbosco\t8663\narts\t8664\nvla\t8668\nsupermarket\t8680\npobidy\t8690\nnatural\t8692\nmuhle\t8694\nkfc\t8700\nhostel\t8706\n127\t8707\nhermann\t8709\nnu\t8709\nshort\t8710\njardim\t8711\ntrans siberian railway\t8714\ngap\t8718\nisla\t8750\nmn\t8755\nangel\t8757\nalfred\t8759\nhet\t8759\noktiabrskaia ul\t8763\noao\t8768\nmarconi\t8773\njardins\t8782\nnuva\t8784\nhillcrest\t8789\n131\t8790\nsiberian\t8791\nsul\t8792\nheide\t8794\nlycee\t8794\nnian\t8797\nchuo\t8801\njack\t8804\nbloc\t8806\n09\t8814\nbistro\t8817\nstadium\t8826\n401\t8840\nspar\t8841\ngrace\t8844\nnossa\t8850\ntimber\t8852\ngrnd\t8852\ncasino\t8858\ndoroga\t8862\nsaints\t8874\ncz\t8879\nrichmond\t8881\ncct\t8884\n0\t8889\nludwig\t8896\nsncf\t8911\ntorres\t8934\nsantander\t8937\namerica\t8940\ntwo\t8948\nrui\t8952\nus 1\t8959\nmaurice\t8960\nvega\t8961\nhoward\t8964\nalle\t8968\ne 65\t8977\nandrews\t8982\n301\t8985\nindustri\t9006\ngaribaldi\t9019\nfrank\t9023\nronda\t9038\nsecond\t9038\nmolodiozhnaia ul\t9043\ncampground\t9048\nsoi\t9049\nauzoa\t9064\nzavod\t9074\nrumah\t9076\nost\t9080\nkang\t9089\nwells\t9090\nholiday\t9093\nlinden st\t9094\nfrancis\t9095\nbaker\t9098\nzion\t9098\nfelix\t9100\n220\t9107\nus 6\t9110\nwildlife\t9116\nstream\t9120\nribeiro\t9128\ngreenway\t9128\nrsviramate\t9134\nwarren\t9139\nestcn\t9157\nlinha\t9162\na5\t9165\n151\t9175\na 7\t9179\negnatia\t9181\nzone\t9183\nrene\t9188\nevergreen\t9199\nbranc\t9206\nharrison\t9214\nstadion\t9214\nlorenzo\t9215\ndigo\t9218\natm\t9224\ncampbell\t9226\nrodrigus\t9234\nplantation\t9243\nquens\t9249\nshkolnaia ul\t9273\nmolodiozhnaia\t9295\npk st\t9296\nsenhora\t9298\npunta\t9302\nharbour\t9310\nveterans\t9312\ndiamond\t9318\nmr\t9322\nput\t9326\ncomplex\t9330\nitalia\t9337\nthree\t9337\npin\t9362\n18th\t9378\n98\t9379\nwindsor\t9385\nmoor\t9397\n000\t9404\nalten\t9404\ndanil\t9407\na3\t9411\npushkina\t9416\ndeutsche telekom ag\t9417\n124\t9419\nent\t9430\njosef\t9430\nab\t9435\nplant\t9438\nsd\t9452\nrovn\t9453\n134\t9455\nhidden\t9493\ncambridge\t9497\norintal\t9513\nkarla\t9524\ngasthaus\t9524\n3rd st\t9535\napple\t9548\nks\t9551\nroosevelt\t9554\ngarten st\t9569\n1st st\t9569\nsui\t9579\nvirginia\t9580\nworld\t9588\ndou\t9605\nbarbara\t9627\nfei\t9661\nflores\t9671\nbutte\t9695\ntrace\t9700\nsentiro\t9700\nmaternelle\t9711\nkirova\t9714\noktiabrskaia\t9720\n132\t9722\nlawrence\t9737\n210\t9738\nsilskoi\t9740\npit\t9740\nrow\t9743\nhillside\t9746\ntal\t9773\nfranz\t9786\ndona\t9790\nsimon\t9796\nharris\t9800\npoliklinika\t9802\ncouncil\t9806\nsadovaia ul\t9808\nwalker\t9819\ngovernment\t9824\n400\t9844\nmobile\t9856\nah1\t9857\nstein\t9865\nbuffalo\t9873\ne 80\t9875\nprince\t9886\nmarco\t9901\nchez\t9901\nigreja\t9903\nrond\t9910\nsanyo\t9914\nanne\t9919\nbelle\t9925\njozefa\t9930\nrafal\t9935\notdilinii\t9941\nchamps\t9958\n201\t9965\nlawson\t9977\nfairviw\t9979\nscuola\t9993\nmarche\t9995\nmills\t9999\n17th\t10007\nsycamore\t10007\nposhta\t10009\nocean\t10022\nmichel\t10022\ndels\t10025\ne 30\t10033\nbdy\t10042\nposta\t10049\nross\t10053\nnai\t10055\nwild\t10064\nrouge\t10065\ncour\t10081\nfeld\t10093\ncottonwood\t10094\ncascina\t10109\nzao\t10109\ncong\t10140\ninstitut\t10142\n123\t10142\ndiag\t10148\ncruce\t10157\ne 75\t10169\nhugo\t10179\ne 55\t10184\nneng\t10192\nbeech\t10196\nvico\t10203\ncommercial\t10208\nteng\t10226\ngod\t10227\npw\t10234\ncentrum\t10236\nfazenda\t10248\nbyr\t10265\nshady\t10267\nsnt\t10270\nzona\t10270\nrichard\t10277\ncolumbia\t10309\nmagnit\t10317\ndegli\t10319\nrestaurante\t10327\nthompson\t10349\ndouglas\t10352\nviux\t10387\nlewis\t10390\nresid\t10394\nallen\t10409\nconservation\t10412\nautobahn\t10429\nolive\t10434\nhaut\t10438\nv roma\t10441\nkai\t10457\ndocteur\t10469\n2nd st\t10506\npub\t10509\nbroad\t10531\ndirivnia\t10539\nbas\t10540\n130\t10562\nprado\t10566\nlutheran\t10597\nmarsh\t10597\ne 40\t10614\ne 22\t10624\ninc\t10632\njo\t10643\nshkolnaia\t10650\nparish\t10655\ncanale\t10678\nper\t10678\ntres\t10682\nlyon\t10688\nquarry\t10696\nlakeviw\t10700\ngold\t10707\nivana\t10723\nanderson\t10724\nalexander\t10726\ntour\t10728\nainly\t10746\nshopping\t10760\n202\t10766\n160\t10778\nkreuz\t10798\ngroup\t10801\n300\t10801\n125\t10810\n118\t10815\nfreiwillige\t10818\ne 60\t10842\nwai\t10843\naptika\t10847\ntsintralnaia ul\t10865\nleclerc\t10887\niv\t10901\nkong\t10906\nsea\t10912\ncanadian\t10922\ntsirkov\t10943\nwolf\t10944\ngrant\t10959\ndivision\t10972\nwi\t10992\narthur\t10996\n16th\t10997\ngraben\t11019\nelizabeth\t11023\nprospect\t11025\nflat\t11038\n122\t11055\nmesa\t11081\n180\t11088\npeters\t11090\nvolksbank\t11096\nfernando\t11125\nalberto\t11125\nstudio\t11134\nporto\t11148\n140\t11154\nspa\t11167\n150\t11177\nana\t11181\ncao\t11183\nnicolas\t11191\nlondon\t11194\ngrundschule\t11208\nmc\t11211\nbrasil\t11224\nmichal\t11226\ntrinity\t11229\ngora\t11236\notto\t11246\nmartins\t11248\nprodukty\t11252\nferrovia\t11272\n114\t11275\njoaquim\t11290\nart\t11299\noil\t11328\nrecreation\t11354\nserra\t11358\ntri\t11361\nheinrich\t11372\ngabril\t11381\ncote\t11387\nmsjd\t11388\nmagnolia\t11390\npaulo\t11391\ncourse\t11398\naz\t11416\npaz\t11417\nstarbucks\t11423\nditch\t11426\nsection\t11433\n03\t11436\nhans\t11454\nzhai\t11455\nmd\t11457\nchun\t11502\nhamilton\t11517\nnursery\t11521\nluther\t11537\nluiz\t11557\njorge\t11615\ntiao\t11619\nmarys\t11630\nkct\t11648\nvi\t11649\n119\t11681\ntwin\t11686\nalves\t11694\n109\t11696\njules\t11712\nmare\t11748\ngiacomo\t11750\npresidente\t11760\nlukoil\t11761\nsalvador\t11764\naldi\t11765\nnc\t11770\npalm\t11777\nlima\t11781\nmission\t11786\nnabirizhnaia\t11794\nwash\t11803\ngaulle\t11806\nfrnt\t11821\ncoronel\t11824\nposilinii\t11858\ncastro\t11861\nmagistral\t11864\nscott\t11867\npnte\t11885\nmedicine\t11891\npde\t11892\nanna\t11896\nlopez\t11907\nmhmd\t11925\nr de leglise\t11935\nchurch st\t11959\ngasse\t11984\n13th\t12001\nramon\t12012\none\t12013\npitro\t12020\nsummit\t12050\ngagarina\t12054\njnc\t12069\nnationale\t12091\nhair\t12108\nvittorio\t12119\nseven\t12120\nsadovaia\t12121\ntp\t12139\nborder\t12151\ncypress\t12156\nnature\t12165\nfrancois\t12166\nheritage\t12171\ngou\t12174\nward\t12174\nsouza\t12236\n15th\t12241\nferreira\t12244\nberliner\t12259\nspruce\t12261\n06\t12287\n117\t12287\ncare\t12317\nholly\t12333\nfour\t12339\nzavulak\t12353\nluigi\t12355\n121\t12368\nschul st\t12370\nnelson\t12385\nmadison\t12410\ncarlo\t12424\nkanal\t12427\ntrrnt\t12438\nhead\t12454\n14th\t12469\npoplar\t12472\n89\t12475\neuropa\t12476\nbike\t12478\nmini\t12508\npetite\t12520\nprincipale\t12527\nclark\t12528\npuits\t12541\nml\t12553\na4\t12559\npointe\t12564\nliberty\t12576\nhut\t12581\nooo\t12585\nhope\t12586\n108\t12591\nbiag\t12591\nbend\t12612\nok\t12616\nnad\t12619\nbir\t12663\npablo\t12673\noude\t12686\nlk\t12704\njan\t12726\nbackerei\t12739\nfe\t12743\nkosciol\t12744\nsalle\t12763\nx\t12770\nsun\t12775\ntee\t12787\nrocky\t12795\n93\t12800\nregional\t12807\nadams\t12818\nhaven\t12826\nhenry\t12831\n111\t12834\ndry\t12862\nwald\t12928\nsantiago\t12949\nhigh st\t12959\n86\t12964\nstade\t12992\nwoodland\t12997\nfrtg\t13072\n1a\t13087\npochta\t13093\nes\t13105\nharbor\t13111\n200\t13120\nmadrid\t13127\nmonument\t13129\nmax\t13136\nainbd\t13141\nwall\t13153\nfederal transferido\t13159\nshinkansen\t13164\neastern\t13168\nacres\t13192\npool\t13193\nby\t13201\n97\t13228\nbk\t13276\nalter\t13286\n107\t13297\nbis\t13308\n112\t13311\nmanol\t13327\nkg\t13345\nzai\t13348\ntennis\t13353\non\t13370\numm\t13372\ncoop\t13375\nnotre\t13386\nqaryat\t13391\nalta\t13395\ntransferido\t13448\ncimetire\t13463\nliao\t13465\nwilhelm\t13468\n88\t13476\nspur\t13502\nmayo\t13511\nservices\t13521\nbluff\t13534\nrail\t13538\njulio\t13540\nbn\t13543\nlinea\t13546\n96\t13558\nagua\t13568\nnovaia\t13576\nsecondary\t13590\n106\t13595\nduo\t13611\ne 45\t13623\nsee\t13648\n116\t13650\npereira\t13657\norange\t13679\n113\t13723\nacces\t13736\nmiller\t13751\ncite\t13764\ntop\t13777\ncredit\t13781\nmas\t13799\nmetro\t13860\nul linina\t13889\nsouthern\t13955\nliniia\t13959\nha\t13995\nhorse\t14006\nsovitskaia ul\t14013\npena\t14029\ndeng\t14070\nestates\t14080\ncampus\t14095\nmall\t14100\nmario\t14110\ndepot\t14110\n12th\t14119\nandre\t14125\nsandy\t14180\ntpk\t14191\ncongpateu\t14198\ncan\t14200\nchina\t14206\noust\t14224\nlidl\t14243\nali\t14244\nsol\t14251\nlaguna\t14266\nbyt\t14281\ncrst\t14289\njohns\t14332\n91\t14339\nstadt\t14380\ncth\t14401\nloma\t14403\ntotal\t14422\nfrancesco\t14431\nldg\t14431\ngarcia\t14457\ndavid\t14482\ndame\t14519\ncarrefour\t14520\njefferson\t14530\nlakes\t14541\nchamp\t14548\n103\t14550\n05\t14554\ntsintralnaia\t14554\nrathaus\t14593\nbg st\t14596\nprom\t14606\ntaylor\t14606\njacqus\t14610\ntou\t14651\nmdws\t14665\n04\t14668\nluo\t14732\n120\t14738\nford\t14744\nschul\t14764\n115\t14779\n11th\t14779\npta\t14791\nsuper\t14807\nesso\t14820\nbeaver\t14846\ncm\t14859\nni\t14887\nfamily\t14888\njun\t14958\nair\t14959\nsbwy\t14961\ngra\t14988\ngarage\t14989\nmwy\t14991\ncompany\t15014\nriverside\t15016\npharmacy\t15017\njdin\t15021\n84\t15041\ntx\t15062\nquen\t15068\nsovitskaia\t15086\nai\t15086\nshuang\t15109\nfunte\t15128\nsentir\t15132\nmao\t15148\nchestnut\t15184\nnorthern\t15230\noziro\t15237\npto\t15271\njones\t15288\nmarechal\t15299\nhickory\t15307\nky\t15313\nltd\t15319\nprairi\t15327\nhenri\t15359\nedifc\t15365\n78\t15368\ngarten\t15394\nxiong\t15410\nzhang\t15424\nprimaire\t15442\nchapelle\t15450\nwilliam\t15450\nfy\t15461\n110\t15515\n76\t15542\nburger\t15550\nkirch\t15587\nhang\t15620\nfor\t15647\ndori\t15659\nfranklin\t15713\ndavis\t15736\nalefm\t15755\nmasjid\t15757\nbirch\t15764\nschule\t15792\nmira\t15801\nad\t15822\nauf\t15839\ntelekom\t15841\nvictor\t15851\nsports\t15879\nlago\t15892\nfrance\t15912\nhou\t15918\nfur\t15948\nresort\t15967\nfridrich\t15969\n02\t16045\nos\t16092\njl\t16112\nmotel\t16171\nrulle\t16196\nvicente\t16274\n92\t16275\nbrown\t16276\nnam\t16282\nmary\t16357\nrang\t16374\nkennedy\t16392\nrossii\t16394\nsirra\t16403\nmai\t16461\nprivate\t16483\nbp\t16498\ndai\t16508\nyork\t16526\njunior\t16610\ndem\t16612\naccs\t16616\n87\t16618\n74\t16633\nhuo\t16651\nwilliams\t16673\n83\t16714\nlaurel\t16720\nmarina\t16725\npeter\t16753\nprof\t16773\n82\t16775\nta\t16805\ngolden\t16808\nlao\t16824\n102\t16852\nneu\t16858\nleon\t16888\nsebun irebun\t16890\n69\t16896\nodos\t16902\npre\t16931\nfeurwer\t16932\n94\t16982\nday\t17030\nverde\t17035\nbahn\t17037\nescola\t17040\ntao\t17130\nchaussee\t17148\nacademy\t17172\ncoast\t17191\nshore\t17193\n104\t17223\nirebun\t17227\ngrill\t17250\ngil\t17299\nkarl\t17365\nschloss\t17371\nao\t17376\npan\t17380\nfen\t17380\n68\t17488\n10th\t17515\nman\t17559\nfood\t17623\nlotissement\t17623\nkings\t17652\npizzeria\t17669\ncatholic\t17679\nhighland\t17681\nbway\t17698\nchristian\t17733\nsebun\t17748\nsv\t17777\nterminal\t17795\nside\t17799\ntorre\t17821\n79\t17832\nzhuan\t17845\ngan\t17857\nkl\t17935\nend\t17939\ngen\t17945\napts\t17969\n72\t17986\nswamp\t18022\njohnson\t18034\njesus\t18062\nstwg\t18067\njana\t18073\nzou\t18075\njackson\t18085\ntall\t18094\n9th\t18102\nzu\t18103\ncol\t18118\nqryte\t18155\nsand\t18186\nbell\t18197\nstar\t18367\ncoffee\t18367\ntsintr\t18431\nfa\t18482\nsparkasse\t18490\nlee\t18514\nmar\t18531\nintl\t18589\npadre\t18626\ncd\t18628\nbanco\t18638\nlot\t18663\npeak\t18668\nkharunchinan\t18676\nmaison\t18711\ncnr\t18727\ncolegio\t18730\ncai\t18768\nhealth\t18773\nhan\t18822\nville\t18845\nheng\t18849\nmagazin\t18859\nfarmacia\t18868\n73\t18910\npharmaci\t18925\na2\t18944\nchrist\t18950\nsunset\t18993\ndental\t18994\nwa\t19046\nfontaine\t19094\neagle\t19121\nnahr\t19130\nautoroute\t19141\n81\t19156\nwilson\t19248\nkirche\t19259\noliveira\t19292\ncami\t19322\nmex\t19325\n95\t19337\nsilver\t19346\nstone\t19398\ncampg\t19457\ndeer\t19465\ntuo\t19520\npotok\t19588\ntr\t19598\nfalls\t19611\n99\t19690\nnr\t19733\npres\t19737\napotheke\t19747\nsalon\t19803\nwang\t19828\nreal\t19846\ngui\t19857\ntongri\t19864\nsant\t19990\n105\t20053\nkm\t20057\nbyp\t20087\n63\t20196\nparis\t20199\nhof\t20219\nroma\t20220\ngas\t20248\norchard\t20316\ncherry\t20339\ncang\t20420\nqiu\t20421\nbear\t20488\ncottage\t20565\nfish\t20585\nmethodist\t20611\nhei\t20625\nsc\t20670\nila\t20676\nalam\t20682\n8th\t20697\nlinden\t20710\nmart\t20767\nabu\t20787\nfridhof\t20791\nzhao\t20825\nnacional\t20827\nfox\t20869\n53\t20890\n7 eleven\t21015\nsantos\t21034\ntl\t21084\nwoods\t21111\nsbirbank\t21148\nlan\t21225\nfl\t21230\nchisa\t21289\ntrans\t21325\ngeorges\t21339\n56\t21354\nshossi\t21371\nling\t21527\n47\t21570\ncastle\t21646\nro\t21695\nliang\t21739\n48\t21742\ndeutsche post ag\t21806\ntun\t21823\nti\t21861\nrobert\t21999\nsite\t22042\ncroix\t22071\nwalnut\t22109\nvoi\t22157\nku\t22191\nclos\t22207\n57\t22220\nyolu\t22268\nlian\t22382\noaks\t22406\nalefbw\t22413\nsanto\t22425\n85\t22431\nvila\t22433\nalto\t22455\nroyal mail\t22459\njoseph\t22482\nranch\t22559\n100\t22590\nex\t22591\n58\t22598\nny\t22622\n67\t22676\nmen\t22686\nlincoln\t22698\n59\t22742\nsmith\t22749\nproizd\t22770\nrosa\t22793\nbin\t22797\nrn\t22809\n61\t22943\nind\t22956\nft\t23013\nfederal\t23112\n64\t23292\npod\t23405\nval\t23469\nautostrada\t23471\naux\t23509\ngare\t23530\npleasant\t23535\n77\t23599\nchan\t23691\npetit\t23694\nprovincial\t23704\nblk\t23721\nmari\t23767\n7th\t23812\ndf st\t23906\n46\t23941\nru\t23973\niglesia\t24010\nmanul\t24017\ndepartment\t24027\nhts\t24037\nescula\t24065\ntemple\t24126\nvon\t24236\ngeorge\t24238\nmus\t24243\nexpress\t24275\nzur\t24277\nbf st\t24334\nnong\t24462\nleglise\t24465\nelm\t24484\nzheng\t24555\nyun\t24563\nlo\t24580\nduan\t24590\nmnr\t24590\nshou\t24633\nrose\t24694\ntu\t24769\nautov\t24772\ndoutor\t24775\njames\t24776\nms\t24795\nkindergarten\t24807\ncha\t24834\nso\t24965\narry\t25038\nrural\t25188\n54\t25352\n71\t25362\n49\t25372\nvictoria\t25373\ntokaido\t25374\nmin\t25498\nya\t25519\nmcdonalds\t25532\nwestern\t25637\nlodge\t25764\nvulica\t25862\nport\t25909\npu\t25916\nparc\t25920\nnhr\t25943\nxun\t25947\nbing\t25957\nthomas\t25977\npolice\t26007\ndevelopment\t26198\nmail\t26234\nss\t26235\nlou\t26272\nfirst\t26384\nglen\t26402\nsen\t26501\npraca\t26562\ngreat\t26704\nchu\t26738\nmairi\t26742\ncosta\t26766\n62\t26814\nlinina\t26851\nsport\t26954\n6th\t26994\nalbert\t27041\nmid\t27109\nmed\t27190\nluis\t27284\nditskii\t27304\nlouis\t27315\nar\t27367\nwen\t27380\ncruz\t27564\ncar\t27661\n43\t27719\nunited\t27764\nmigul\t27834\npo ste\t27955\n38\t28034\npacific\t28055\nsilva\t28060\nindian\t28137\n37\t28187\nash\t28213\nge\t28217\nfm\t28289\ngiovanni\t28308\ncarlos\t28356\neleven\t28358\nrivire\t28429\ngiuseppe\t28629\ntower\t28689\nland\t28718\n39\t28773\nsha\t28793\ncanada\t28821\n52\t29048\npath\t29140\nstop\t29219\n51\t29251\nvalle\t29255\ntank\t29459\nfeng\t29475\nzhuang\t29552\ndelle\t29559\nyuki\t29561\npi\t29606\nblack\t29615\nmain st\t29615\nfild\t29647\nprovulok\t29735\nlang\t29988\nnova\t30275\n5th\t30439\nlai\t30468\nhome\t30553\nnumber\t30841\npln\t30869\nnorte\t30969\nchateau\t31005\ncountry\t31137\nut\t31138\n42\t31157\nwillow\t31224\ning\t31252\nalte\t31262\nwashington\t31324\nbach\t31401\nresidence\t31417\nhaus\t31433\n66\t31469\nzhan\t31495\nsad\t31541\nlibrary\t31641\n90\t31677\n65\t31679\nhollow\t31759\nfan\t31777\nau\t31828\n01\t31888\ncharles\t31908\ndistrict\t31960\npublic\t32008\nchapel\t32219\nrodovia\t32287\ngolf\t32328\n44\t32430\nmaple\t32464\ncanyon\t32513\nhuan\t32526\na1\t32605\nren\t32607\n36\t32651\npont\t32671\ncamp\t32699\nluan\t32727\ntree\t32746\nhills\t32852\nsprings\t32854\nbl\t32968\nbai\t33054\njabal\t33224\nnei\t33241\ndeutsche post\t33284\ncrss\t33336\nup\t33421\n33\t33429\nlr\t33446\ngo\t33491\n41\t33684\npr\t33804\npqu\t33815\nte\t33825\ndon\t33858\nbang\t33873\ntown\t33970\nnord\t33971\ntrk\t33982\nblu\t34198\npa\t34486\nwlk\t34562\nmine\t34590\n4th\t34616\nyong\t34666\n32\t34698\nsud\t34850\nfwy\t35052\ndom\t35084\nzhou\t35204\nwater\t35221\nzuo\t35310\nke\t35425\nmei\t35452\nbois\t35619\nci\t35667\n34\t35764\ncerro\t35787\npizza\t35851\neglise\t35880\nest\t36076\nhong\t36127\nruta\t36199\nat\t36250\nvsta\t36335\n55\t36356\nrailroad\t36523\nestda\t36571\n75\t36587\npirre\t36647\njbl\t36709\nmoulin\t36711\nyao\t36718\ntang\t36915\ndan\t37000\nia\t37050\nliu\t37065\nshe\t37152\n80\t37450\nkj\t37799\nwan\t38034\n3rd\t38101\nuniv\t38304\ninn\t38352\n101\t38386\nmeadow\t38445\nshell\t38518\njohn\t38651\nchi\t38902\ncedar\t38927\n70\t38993\njiao\t39047\ntan\t39564\n29\t39660\nlin\t39807\nhaupt st\t39850\nfire\t39867\nbig\t39989\n1st\t40093\npaul\t40325\nq\t40411\nshkola\t40538\nguang\t40751\nzhen\t40796\nwhite\t40864\nwood\t41246\npsaje\t41393\nto\t41429\nxia\t41541\nmun\t41573\nprospikt\t41627\nclinic\t41731\n60\t41766\nhigh\t41803\nno\t41890\n2nd\t42062\ntravessa\t42121\njoao\t42221\nbaptist\t42330\nding\t42547\nhs\t42649\nmo\t42664\nsubashiri\t42946\nkou\t42991\nunion\t43101\nred\t43110\npedro\t43133\nvulitsa\t43278\n28\t43318\ncentro\t43549\narea\t43697\n31\t43754\ngrande\t43777\nfang\t43797\nshop\t44139\nping\t44225\nbian\t44268\n26\t44914\nshu\t44945\nsuo\t44969\n45\t45093\nba\t45139\nking\t45400\nps\t45517\ndei\t45891\nsong\t45915\nairport\t45915\nbo\t46143\nas\t46583\nj\t46759\nsheng\t46913\ncomm\t46971\nroyal\t47011\n35\t47126\nmemorial\t47231\nag\t47261\nrock\t47375\nwei\t47422\nming\t47531\ntwp\t47709\nligne\t48058\nrun\t48153\nca\t48587\nh\t48838\nbf\t49002\nqing\t49106\nbch\t49383\nhaupt\t49593\nqun\t49638\nfrancisco\t49774\nhistorical\t50153\n27\t50197\nsur\t50222\nauto\t50309\nsubdivision\t50333\nshui\t50358\nsh\t50614\necole\t50720\nhuang\t50815\nsq\t50999\ntong\t51054\nshen\t51085\njuan\t51506\ncasa\t51658\nspring\t51698\nf\t51887\nring\t51990\nhosp\t52226\nbi\t52273\nlac\t52298\n23\t52469\nbu\t52502\nparking\t52537\n50\t52748\njiang\t52810\npond\t52906\nmi\t52975\nmonte\t52983\nin\t53365\nzong\t53683\nservice\t54145\n24\t54306\nrnge\t54330\nhua\t54648\ndos\t54690\nhui\t54778\n21\t54840\nsao\t54843\nshalefrain\t54949\nvilla\t54974\nrailway\t55004\nma\t55286\ncollege\t55538\nwadi\t55696\nsp\t55918\njian\t56759\ncentral\t56798\ngmbh\t57668\nbuilding\t57941\nrestaurant\t57995\nqian\t58235\ncanal\t58349\nprimary\t58355\npine\t58939\nfork\t59062\nbus\t59092\nwalefdy\t59701\n40\t59916\nmartin\t59929\nstate\t60068\nbao\t60070\nyang\t60348\n30\t60532\ngeneral\t61243\ndella\t61416\nhai\t61518\nri\t61538\nlp\t62036\nz\t62227\n22\t62480\nelementary\t62555\nsk\t63126\ngang\t63300\nvillage\t63354\njean\t63390\ncno\t63692\n19\t63828\nqiao\t63997\nres\t64000\nban\t64142\nbay\t64306\ntai\t64343\ncty\t64656\n25\t64886\nruisseau\t65062\ncun\t66188\n18\t66430\nshang\t66598\nyan\t67479\n17\t68301\ndam\t68764\nzhu\t69205\n16\t69497\nben\t69679\nlong\t70045\nrong\t70327\nmill\t70565\nbr\t70863\njiu\t71012\nsi\t71116\nbrook\t71129\nza\t71491\nbri\t71830\noffice\t71965\nlt\t72733\nnew\t73340\n13\t73893\nguan\t73951\ndeutsche\t74130\nqu\t74204\nvw\t74909\nctra\t75117\nis\t75214\nbar\t75258\n14\t75360\ner\t75636\ngn\t76708\n20\t76850\nantonio\t76980\njia\t77146\ndian\t77214\ncra\t77620\nmtn\t78205\nmaria\t78369\nclub\t78614\nhu\t79849\ncv\t80840\ncafe\t80861\nnational\t81218\nsr\t81383\nyou\t81623\npwy\t81763\ncheng\t81948\nqi\t81973\noak\t82366\nxing\t82697\njr\t85189\nmu\t85596\n15\t85937\nmt\t86408\nhall\t86508\npt\t86936\ngdn\t87358\n12\t89973\nfarm\t90082\nzhi\t92470\njin\t92996\nting\t93199\nju\t93546\nye\t94266\nforest\t94898\nvalley\t95558\npiriulok\t95976\nrdge\t95987\ngu\t96835\nnan\t96955\n11\t100782\nmkt\t102885\n9\t103700\nxu\t105576\nxiang\t105992\nbranch\t106901\nter\t106992\nbei\t107237\njalan\t107405\no\t111032\njose\t111122\n10\t112150\nwu\t114385\ndf\t115113\nbank\t116575\nan\t118367\npo\t118808\nmain\t119153\nsta\t119997\n8\t120303\nhotel\t124402\nles\t124562\nlas\t124958\nimp\t125292\nzi\t125401\nxin\t126669\nstn\t127305\nchang\t128223\nze\t130400\nm\t130476\nrio\t131521\nexp\t132573\njing\t134771\npost\t135622\nweg\t135769\nfu\t136761\nxiao\t137133\nho\t137474\nhao\t138644\nold\t139352\nse\t140655\n6\t141057\nsu\t143572\ntian\t145728\nhe\t146233\nxi\t147676\nste\t148083\nguo\t148686\ndo\t148931\ncemetery\t152551\nzhong\t157373\nsw\t157423\nlos\t158575\n5\t159912\nli\t160414\n7\t161870\ni\t163043\nne\t164323\nshan\t170441\nyu\t173470\ngao\t173761\n4\t174622\ngr\t180258\np\t181854\nof\t182568\ngong\t184716\nhill\t202083\nji\t202858\ndong\t206101\nyuan\t214501\nu\t215042\ncir\t217761\nctr\t221309\ndi\t224884\nvulitsia\t229773\n3\t236911\nshi\t238272\nhwy\t243335\ntrl\t246437\nlake\t251993\ndao\t258484\nrt\t280539\nus\t285677\nchurch\t294961\nl\t297582\ng\t299909\nb\t308815\nk\t309866\nschool\t315017\nco\t318714\nwy\t318861\nbd\t328499\nbg\t348255\ndel\t352599\nda\t360873\n2\t361083\nlu\t369480\nchuan\t400442\npk\t406423\nch\t439801\nt\t452465\nal\t454893\nxian\t501470\ndes\t522073\nw\t585861\ndu\t594005\nd\t656627\npl\t693404\nct\t703008\na\t790949\n1\t812319\nul\t927384\nrua\t943026\nn\t994578\ne\t1001521\ns\t1009933\ncr\t1030312\nc\t1234820\nln\t1313273\nv\t1485853\ndr\t1579142\nr\t1682785\nav\t1996028\nde\t2473104\nrd\t3585705\nst\t5557484\n\\.\n\n\n--\n-- PostgreSQL database dump complete\n--\n\n-- prefill word table\n\nselect count(precompute_words(v)) from (select distinct svals(name) as v from place) as w where v is not null;\nselect count(getorcreate_housenumber_id(make_standard_name(v))) from (select distinct address->'housenumber' as v from place where address ? 'housenumber') as w;\n\n-- copy the word frequencies\nupdate word set search_name_count = count from word_frequencies wf where wf.word_token = word.word_token;\n\n-- and drop the temporary frequency table again\ndrop table word_frequencies;\n"
  },
  {
    "path": "docs/admin/Advanced-Installations.md",
    "content": "# Advanced installations\n\nThis page contains instructions for setting up multiple countries in \nyour Nominatim database. It is assumed that you have already successfully\ninstalled the Nominatim software itself, if not return to the \n[installation page](Installation.md).\n\n## Importing with a database user without superuser rights\n\nNominatim usually creates its own PostgreSQL database at the beginning of the\nimport process. This makes usage easier for the user but means that the\ndatabase user doing the import needs the appropriate rights.\n\nIf you prefer to run the import with a database user with limited rights,\nyou can do so by changing the import process as follows:\n\n1. Run the command for database preparation with a database user with\n   superuser rights. For example, to use a db user 'dbadmin' for a\n   database 'nominatim', execute:\n\n   ```\n   NOMINATIM_DATABASE_DSN=\"pgsql:dbname=nominatim;user=dbadmin\" nominatim import --prepare-database\n   ```\n\n2. Grant the import user the right to create tables. For example, foe user 'import-user':\n\n   ```\n   psql -d nominatim -c 'GRANT CREATE ON SCHEMA public TO \"import-user\"'\n   ```\n\n3. Now run the reminder of the import with the import user:\n\n   ```\n   NOMINATIM_DATABASE_DSN=\"pgsql:dbname=nominatim;user=import-user\" nominatim import --continue import-from-file --osm-file file.pbf\n   ```\n\n## Importing multiple regions (without updates)\n\nTo import multiple regions in your database you can simply give multiple\nOSM files to the import command:\n\n```\nnominatim import --osm-file file1.pbf --osm-file file2.pbf\n```\n\nIf you already have imported a file and want to add another one, you can\nuse the add-data function to import the additional data as follows:\n\n```\nnominatim add-data --file <FILE>\nnominatim refresh --postcodes\nnominatim index -j <NUMBER OF THREADS>\n```\n\nPlease note that adding additional data is always significantly slower than\nthe original import.\n\n## Importing multiple regions (with updates)\n\nIf you want to import multiple regions _and_ be able to keep them up-to-date\nwith updates, then you can use the scripts provided in the `utils` directory.\n\nThese scripts will set up an `update` directory in your project directory,\nwhich has the following structure:\n\n```bash\nupdate\n ├── europe\n │    ├── andorra\n │    │    └── sequence.state\n │    └── monaco\n │         └── sequence.state\n └── tmp\n      └── europe\n           ├── andorra-latest.osm.pbf\n           └── monaco-latest.osm.pbf\n\n```\n\nThe `sequence.state` files contain the sequence ID for each region. They will\nbe used by pyosmium to get updates. The `tmp` folder is used for import dump and\ncan be deleted once the import is complete.\n\n\n### Setting up multiple regions\n\nCreate a project directory as described for the\n[simple import](Import.md#creating-the-project-directory). If necessary,\nyou can also add an `.env` configuration with customized options. In particular,\nyou need to make sure that `NOMINATIM_REPLICATION_UPDATE_INTERVAL` and\n`NOMINATIM_REPLICATION_RECHECK_INTERVAL` are set according to the update\ninterval of the extract server you use.\n\nCopy the scripts `utils/import_multiple_regions.sh` and `utils/update_database.sh`\ninto the project directory.\n\nNow customize both files as per your requirements\n\n1. List of countries. e.g.\n\n        COUNTRIES=\"europe/monaco europe/andorra\"\n\n2. URL to the service providing the extracts and updates. eg:\n\n        BASEURL=\"https://download.geofabrik.de\"\n        DOWNCOUNTRYPOSTFIX=\"-latest.osm.pbf\"\n\n5. Followup in the update script can be set according to your installation.\n   E.g. for Photon,\n\n        FOLLOWUP=\"curl http://localhost:2322/nominatim-update\"\n\n    will handle the indexing.\n\n\nTo start the initial import, change into the project directory and run\n\n```\n    bash import_multiple_regions.sh\n```\n\n### Updating the database\n\nChange into the project directory and run the following command:\n\n    bash update_database.sh\n\nThis will get diffs from the replication server, import diffs and index\nthe database. The default replication server in the\nscript ([Geofabrik](https://download.geofabrik.de)) provides daily updates.\n\n## Using an external PostgreSQL database\n\nYou can install Nominatim using a database that runs on a different server.\nSimply point the configuration variable `NOMINATIM_DATABASE_DSN` to the\nserver and follow the standard import documentation.\n\nThe import will be faster, if the import is run directly from the database\nmachine. You can easily switch to a different machine for the query frontend\nafter the import.\n\n## Moving the database to another machine\n\nFor some configurations it may be useful to run the import on one machine, then\nmove the database to another machine and run the Nominatim service from there.\nFor example, you might want to use a large machine to be able to run the import\nquickly but only want a smaller machine for production because there is not so\nmuch load. Or you might want to do the import once and then replicate the\ndatabase to many machines.\n\nThe important thing to keep in mind when transferring the Nominatim installation\nis that you need to transfer the database _and the project directory_. Both\nparts are essential for your installation.\n\nThe Nominatim database can be transferred using the `pg_dump`/`pg_restore` tool.\nMake sure to use the same version of PostgreSQL and PostGIS on source and\ntarget machine.\n\n!!! note\n    Before creating a dump of your Nominatim database, consider running\n    `nominatim freeze` first. Your database looses the ability to receive further\n    data updates but the resulting database is only about a third of the size\n    of a full database.\n\nNext install nominatim-api on the target machine by following the standard\ninstallation instructions. Again, make sure to use the same version as the\nsource machine.\n\nCreate a project directory on your destination machine and set up the `.env`\nfile to match the configuration on the source machine. That's all.\n"
  },
  {
    "path": "docs/admin/Deployment-Python.md",
    "content": "# Deploying the Nominatim Python frontend\n\nNominatim can be run as a Python-based\n[ASGI web application](https://asgi.readthedocs.io/en/latest/). You have the\nchoice between [Falcon](https://falcon.readthedocs.io/en/stable/)\nand [Starlette](https://www.starlette.io/) as the ASGI framework.\n\nThis section gives a quick overview on how to configure Nginx to serve\nNominatim. Please refer to the documentation of\n[Nginx](https://nginx.org/en/docs/) for background information on how\nto configure it.\n\n### Installing the required packages\n\n!!! warning\n    ASGI support in gunicorn requires at least version 25.0. If you need\n    to work with an older version of gunicorn, please refer to\n    [older Nominatim deployment documentation](https://nominatim.org/release-docs/5.2/admin/Deployment-Python/)\n    to learn how to run gunicorn with uvicorn.\n\nThe Nominatim frontend is best run from its own virtual environment. If\nyou have already created one for the database backend during the\n[installation](Installation.md#building-nominatim), you can use that. Otherwise\ncreate one now with:\n\n```sh\nsudo apt-get install virtualenv\nvirtualenv /srv/nominatim-venv\n```\n\nThe Nominatim frontend is contained in the 'nominatim-api' package. To\ninstall directly from the source tree run:\n\n```sh\ncd Nominatim\n/srv/nominatim-venv/bin/pip install packaging/nominatim-api\n```\n\nThe recommended way to deploy a Python ASGI application is to run\nthe [gunicorn](https://gunicorn.org/) HTTP server. We use\nFalcon here as the web framework.\n\nAdd the necessary packages to your virtual environment:\n\n``` sh\n/srv/nominatim-venv/bin/pip install falcon gunicorn\n```\n\n### Setting up Nominatim as a systemd job\n\n!!! Note\n    These instructions assume your Nominatim project directory is\n    located in `/srv/nominatim-project`. If you have put it somewhere else,\n    you need to adjust the commands and configuration accordingly.\n\nNext you need to set up the service that runs the Nominatim frontend. This is\neasiest done with a systemd job.\n\nFirst you need to tell systemd to create a socket file to be used by\ngunicorn. Create the following file `/etc/systemd/system/nominatim.socket`:\n\n``` systemd\n[Unit]\nDescription=Gunicorn socket for Nominatim\n\n[Socket]\nListenStream=/run/nominatim.sock\nSocketUser=www-data\n\n[Install]\nWantedBy=multi-user.target\n```\n\nNow you can add the systemd service for Nominatim itself.\nCreate the following file `/etc/systemd/system/nominatim.service`:\n\n``` systemd\n[Unit]\nDescription=Nominatim running as a gunicorn application\nAfter=network.target\nRequires=nominatim.socket\n\n[Service]\nType=simple\nUser=www-data\nGroup=www-data\nWorkingDirectory=/srv/nominatim-project\nExecStart=/srv/nominatim-venv/bin/gunicorn -b unix:/run/nominatim.sock -w 4 --worker-class asgi --protocol uwsgi --worker-connections 1000 \"nominatim_api.server.falcon.server:run_wsgi()\"\nExecReload=/bin/kill -s HUP $MAINPID\nPrivateTmp=true\nTimeoutStopSec=5\nKillMode=mixed\n\n[Install]\nWantedBy=multi-user.target\n```\n\nThis sets up gunicorn with 4 workers (`-w 4` in ExecStart). Each worker runs\nits own Python process using\n[`NOMINATIM_API_POOL_SIZE`](../customize/Settings.md#nominatim_api_pool_size)\nconnections to the database to serve requests in parallel. The parameter\n`--worker-connections` restricts how many requests gunicorn will queue for\neach worker. This can help distribute work better when the server is under\nhigh load.\n\nMake the new services known to systemd and start it:\n\n``` sh\nsudo systemctl daemon-reload\nsudo systemctl enable nominatim.socket\nsudo systemctl start nominatim.socket\nsudo systemctl enable nominatim.service\nsudo systemctl start nominatim.service\n```\n\nThis sets the service up so that Nominatim is automatically started\non reboot.\n\n### Configuring nginx\n\nTo make the service available to the world, you need to proxy it through\nnginx. We use the binary uwsgi protocol to speed up communication\nbetween nginx and gunicorn. Add the following definition to the default\nconfiguration:\n\n``` nginx\nupstream nominatim_service {\n  server unix:/run/nominatim.sock fail_timeout=0;\n}\n\nserver {\n    listen 80;\n    listen [::]:80;\n\n    root /var/www/html;\n    index /search;\n\n    location / {\n        uwsgi_pass nominatim_service;\n        include uwsgi_params;\n    }\n}\n```\n\nReload nginx with\n\n```\nsudo systemctl reload nginx\n```\n\nand you should be able to see the status of your server under\n`http://localhost/status`.\n"
  },
  {
    "path": "docs/admin/Faq.md",
    "content": "# Troubleshooting Nominatim Installations\n\n## Installation Issues\n\n### Can a stopped/killed import process be resumed?\n\n\"I accidentally killed the import process after it has been running for many hours. Can it be resumed?\"\n\nIt is possible if the import already got to the indexing stage.\nCheck the last line of output that was logged before the process\nwas killed. If it looks like this:\n\n\n    Done 844 in 13 @ 64.923080 per second - Rank 26 ETA (seconds): 7.886255\n\nthen you can resume with the following command:\n\n```sh\nnominatim import --continue indexing\n```\n\nIf the reported rank is 26 or higher, you can also safely add `--index-noanalyse`.\n\n\n### PostgreSQL crashed \"invalid page in block\"\n\nUsually serious problem, can be a hardware issue, not all data written to disc\nfor example. Check PostgreSQL log file and search PostgreSQL issues/mailing\nlist for hints.\n\nIf it happened during index creation you can try rerunning the step with\n\n```sh\nnominatim import --continue indexing\n```\n\nOtherwise it's best to start the full setup from the beginning.\n\n\n### I see the error: \"ERROR: mmap (remap) failed\"\n\nThis may be a simple out-of-memory error. Try reducing the memory used\nfor `--osm2pgsql-cache`. Also make sure that overcommitting memory is\nallowed: `cat /proc/sys/vm/overcommit_memory` should print 0 or 1.\n\nIf you are using a flatnode file, then it may also be that the underlying\nfilesystem does not fully support 'mmap'. A notable candidate is virtualbox's\nvboxfs.\n\n### nominatim UPDATE failed: ERROR: buffer 179261 is not owned by resource owner Portal\n\nSeveral users [reported this](https://github.com/openstreetmap/Nominatim/issues/1168)\nduring the initial import of the database. It's\nsomething PostgreSQL internal Nominatim doesn't control. And PostgreSQL forums\nsuggest it's threading related but definitely some kind of crash of a process.\nUsers reported either rebooting the server, different hardware or just trying\nthe import again worked.\n\n### The website shows: \"Could not get word tokens\"\n\nThe server cannot access your database. Add `&debug=1` to your URL\nto get the full error message.\n\n\n### Website reports \"DB Error: insufficient permissions\"\n\nThe user the webserver, e.g. Apache, runs under needs to have access to the\nNominatim database. You can find the user like\n[this](https://serverfault.com/questions/125865/finding-out-what-user-apache-is-running-as),\nfor default Ubuntu operating system for example it's `www-data`.\n\n1. Repeat the `createuser` step of the installation instructions.\n\n2. Give the user permission to existing tables\n\n```\n   GRANT usage ON SCHEMA public TO \"www-data\";\n   GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"www-data\";\n```\n\n### Setup fails with \"DB Error: extension not found\"\n\nMake sure you have the PostgreSQL extensions \"hstore\" and \"postgis\" installed.\nSee the installation instructions for a full list of required packages.\n\n\n### UnicodeEncodeError: 'ascii' codec can't encode character\n\nMake sure that the operating system's locale is UTF-8. With some prebuilt\nimages (e.g. LXC containers from Proxmox, see\n[discussion](https://github.com/osm-search/Nominatim/discussions/2343)) or\nimages that optimize for size it might be missing.\n\nOn Ubuntu you can check the locale is installed:\n\n```\n   grep UTF-8 /etc/default/locale\n```\n\nAnd install it using\n\n```\n   dpkg-reconfigure locales\n```\n\n### I forgot to delete the flatnodes file before starting an import.\n\nThat's fine. For each import the flatnodes file get overwritten.\nSee [https://help.openstreetmap.org/questions/52419/nominatim-flatnode-storage](https://help.openstreetmap.org/questions/52419/nominatim-flatnode-storage)\nfor more information.\n\n\n## Running your own instance\n\n### Can I import negative OSM ids into Nominatim?\n\nNo, negative IDs are no longer supported by osm2pgsql. You can use\nlarge 64-bit IDs that are guaranteed not to clash with OSM IDs. However,\nyou will not able to use a flatnode file with them.\n"
  },
  {
    "path": "docs/admin/Import.md",
    "content": "# Importing the Database\n\nThe following instructions explain how to create a Nominatim database\nfrom an OSM planet file. It is assumed that you have already successfully\ninstalled the Nominatim software itself and the `nominatim` tool can be found\nin your `PATH`. If this is not the case, return to the\n[installation page](Installation.md).\n\n## Creating the project directory\n\nBefore you start the import, you should create a project directory for your\nnew database installation. This directory receives all data that is related\nto a single Nominatim setup: configuration, extra data, etc. Create a project\ndirectory apart from the Nominatim software and change into the directory:\n\n```\nmkdir ~/nominatim-project\ncd ~/nominatim-project\n```\n\nIn the following, we refer to the project directory as `$PROJECT_DIR`. To be\nable to copy&paste instructions, you can export the appropriate variable:\n\n```\nexport PROJECT_DIR=~/nominatim-project\n```\n\nThe Nominatim tool assumes per default that the current working directory is\nthe project directory but you may explicitly state a different directory using\nthe `--project-dir` parameter. The following instructions assume that you run\nall commands from the project directory.\n\n!!! tip \"Migration Tip\"\n\n    Nominatim used to be run directly from the build directory until version 3.6.\n    Essentially, the build directory functioned as the project directory\n    for the database installation. This setup still works and can be useful for\n    development purposes. It is not recommended anymore for production setups.\n    Create a project directory that is separate from the Nominatim software.\n\n### Configuration setup in `.env`\n\nThe Nominatim server can be customized via an `.env` configuration file in the \nproject directory. This is a file in [dotenv](https://github.com/theskumar/python-dotenv)\nformat which looks the same as variable settings in a standard shell environment.\nYou can also set the same configuration via environment variables. All\nsettings have a `NOMINATIM_` prefix to avoid conflicts with other environment\nvariables.\n\nThere are lots of configuration settings you can tweak. A full reference\ncan be found in the chapter [Configuration Settings](../customize/Settings.md).\nMost should have a sensible default.\n\n#### Flatnode files\n\nIf you plan to import a large dataset (e.g. Europe, North America, planet),\nyou should also enable flatnode storage of node locations. With this\nsetting enabled, node coordinates are stored in a simple file instead\nof the database. This will save you import time and disk storage.\nAdd to your `.env`:\n\n    NOMINATIM_FLATNODE_FILE=\"/path/to/flatnode.file\"\n\nReplace the second part with a suitable path on your system and make sure\nthe directory exists. There should be at least 75GB of free space.\n\n## Downloading additional data\n\n### Wikipedia/Wikidata rankings\n\nWikipedia can be used as an optional auxiliary data source to help indicate\nthe importance of OSM features. Nominatim will work without this information\nbut it will improve the quality of the results if this is installed.\nThis data is available as a binary download. Put it into your project directory:\n\n    cd $PROJECT_DIR\n    wget https://nominatim.org/data/wikimedia-importance.csv.gz\n    wget -O secondary_importance.sql.gz https://nominatim.org/data/wikimedia-secondary-importance.sql.gz\n\nThe files are about 400MB and add around 4GB to the Nominatim database. For\nmore information about importance,\nsee [Importance Customization](../customize/Importance.md).\n\n!!! tip\n    If you forgot to download the wikipedia rankings, then you can\n    also add importances after the import. Download the SQL files, then\n    run `nominatim refresh --wiki-data --secondary-importance --importance`.\n    Updating importances for a planet will take a couple of hours.\n\n### External postcodes\n\nNominatim can use postcodes from an external source to improve searching with\npostcodes. We provide precomputed postcodes sets for the US (using TIGER data)\nand the UK (using the [CodePoint OpenData set](https://osdatahub.os.uk/downloads/open/CodePointOpen).\nThis data can be optionally downloaded into the project directory:\n\n    cd $PROJECT_DIR\n    wget https://nominatim.org/data/gb_postcodes.csv.gz\n    wget https://nominatim.org/data/us_postcodes.csv.gz\n\nYou can also add your own custom postcode sources, see\n[Customization of postcodes](../customize/Postcodes.md).\n\n## Choosing the data to import\n\nIn its default setup Nominatim is configured to import the full OSM data\nset for the entire planet. Such a setup requires a powerful machine with\nat least 64GB of RAM and around 900GB of SSD hard disks. Depending on your\nuse case there are various ways to reduce the amount of data imported. This\nsection discusses these methods. They can also be combined.\n\n### Using an extract\n\nIf you only need geocoding for a smaller region, then precomputed OSM extracts\nare a good way to reduce the database size and import time.\n[Geofabrik](https://download.geofabrik.de) offers extracts for most countries.\nThey even have daily updates which can be used with the update process described\n[in the next section](Update.md). There are also\n[other providers for extracts](https://wiki.openstreetmap.org/wiki/Planet.osm#Downloading).\n\nPlease be aware that some extracts are not cut exactly along the country\nboundaries. As a result some parts of the boundary may be missing which means\nthat Nominatim cannot compute the areas for some administrative areas.\n\n### Dropping Data Required for Dynamic Updates\n\nAbout half of the data in Nominatim's database is not really used for serving\nthe API. It is only there to allow the data to be updated from the latest\nchanges from OSM. For many uses these dynamic updates are not really required.\nIf you don't plan to apply updates, you can run the import with the\n`--no-updates` parameter. This will drop the dynamic part of the database as\nsoon as it is not required anymore.\n\nYou can also drop the dynamic part later using the following command:\n\n```\nnominatim freeze\n```\n\nNote that you still need to provide for sufficient disk space for the initial\nimport. So this option is particularly interesting if you plan to transfer the\ndatabase or reuse the space later.\n\n!!! warning\n    The data structure for updates are also required when adding additional data\n    after the import, for example [TIGER housenumber data](../customize/Tiger.md).\n    If you plan to use those, you must not use the `--no-updates` parameter.\n    Do a normal import, add the external data and once you are done with\n    everything run `nominatim freeze`.\n\n\n### Reverse-only Imports\n\nIf you only want to use the Nominatim database for reverse lookups or\nif you plan to use the installation only for exports to a\n[photon](https://photon.komoot.io/) database, then you can set up a database\nwithout search indexes. Add `--reverse-only` to your setup command above.\n\nThis saves about 5% of disk space, import time won't be significant faster.\n\n### Filtering Imported Data\n\nNominatim normally sets up a full search database containing administrative\nboundaries, places, streets, addresses and POI data. There are also other\nimport styles available which only read selected data:\n\n* **admin**\n  Only import administrative boundaries and places.\n* **street**\n  Like the admin style but also adds streets.\n* **address**\n  Import all data necessary to compute addresses down to house number level.\n* **full**\n  Default style that also includes points of interest.\n* **extratags**\n  Like the full style but also adds most of the OSM tags into the extratags\n  column.\n\nThe style can be changed with the configuration `NOMINATIM_IMPORT_STYLE`.\n\nTo give you an idea of the impact of using the different styles, the table\nbelow gives rough estimates of the final database size after import of a\n2020 planet and after using the `--drop` option. It also shows the time\nneeded for the import on a machine with 64GB RAM, 4 CPUS and NVME disks.\nNote that the given sizes are just an estimate meant for comparison of\nstyle requirements. Your planet import is likely to be larger as the\nOSM data grows with time.\n\nstyle     | Import time  |  DB size   |  after drop\n----------|--------------|------------|------------\nadmin     |    4h        |  215 GB    |   20 GB\nstreet    |   22h        |  440 GB    |  185 GB\naddress   |   36h        |  545 GB    |  260 GB\nfull      |   54h        |  640 GB    |  330 GB\nextratags |   54h        |  650 GB    |  340 GB\n\nYou can also customize the styles further.\nA [description of the style format](../customize/Import-Styles.md)\ncan be found in the customization guide.\n\n## Initial import of the data\n\n!!! danger \"Important\"\n    First try the import with a small extract, for example from\n    [Geofabrik](https://download.geofabrik.de).\n\nDownload the data to import. Then issue the following command\nfrom the **project directory** to start the import:\n\n```sh\nnominatim import --osm-file <data file> 2>&1 | tee setup.log\n```\n\nThe **project directory** is the one that you have set up at the beginning.\nSee [creating the project directory](#creating-the-project-directory).\n\n### Notes on full planet imports\n\nEven on a perfectly configured machine\nthe import of a full planet takes around 2 days. Once you see messages\nwith `Rank .. ETA` appear, the indexing process has started. This part takes\nthe most time. There are 30 ranks to process. Rank 26 and 30 are the most complex.\nThey take each about a third of the total import time. If you have not reached\nrank 26 after two days of import, it is worth revisiting your system\nconfiguration as it may not be optimal for the import.\n\n### Notes on memory usage\n\nIn the first step of the import Nominatim uses [osm2pgsql](https://osm2pgsql.org)\nto load the OSM data into the PostgreSQL database. This step is very demanding\nin terms of RAM usage. osm2pgsql and PostgreSQL are running in parallel at \nthis point. PostgreSQL blocks at least the part of RAM that has been configured\nwith the `shared_buffers` parameter during\n[PostgreSQL tuning](Installation.md#tuning-the-postgresql-database)\nand needs some memory on top of that. osm2pgsql needs at least 2GB of RAM for\nits internal data structures, potentially more when it has to process very large\nrelations. In addition it needs to maintain a cache for node locations. The size\nof this cache can be configured with the parameter `--osm2pgsql-cache`.\n\nWhen importing with a flatnode file, it is best to disable the node cache\ncompletely and leave the memory for the flatnode file. Nominatim will do this\nby default, so you do not need to configure anything in this case.\n\nFor imports without a flatnode file, set `--osm2pgsql-cache` approximately to\nthe size of the OSM pbf file you are importing. The size needs to be given in\nMB. Make sure you leave enough RAM for PostgreSQL and osm2pgsql as mentioned\nabove. If the system starts swapping or you are getting out-of-memory errors,\nreduce the cache size or even consider using a flatnode file.\n\n\n### Testing the installation\n\nRun this script to verify that all required tables and indices got created\nsuccessfully.\n\n```sh\nnominatim admin --check-database\n```\n\nIf you have installed the `nominatim-api` package, then you can try out\nyour installation by executing a simple query on the command line:\n\n``` sh\nnominatim search --query Berlin\n```\n\nor, when you have a reverse-only installation:\n\n``` sh\nnominatim reverse --lat 51 --lon 45\n```\n\nIf you want to run Nominatim as a service, make sure you have installed\nthe right packages as per [Installation](Installation.md#software).\n\n#### Testing the Python frontend\n\nTo run the test server against the Python frontend, you must choose a\nweb framework to use, either starlette or falcon. Make sure the appropriate\npackages are installed. Then run\n\n``` sh\nnominatim serve\n```\n\nor, if you prefer to use Starlette instead of Falcon as webserver,\n\n``` sh\nnominatim serve --engine starlette\n```\n\nGo to `http://localhost:8088/status` and you should see the message `OK`.\nYou can also run a search query, e.g. `http://localhost:8088/search?q=Berlin`\nor, for reverse-only installations a reverse query,\ne.g. `http://localhost:8088/reverse?lat=27.1750090510034&lon=78.04209025`.\n\nDo not use this test server in production.\nTo run Nominatim via webservers like Apache or nginx, please continue reading\n[Deploy the Python frontend](Deployment-Python.md).\n\n\n## Enabling search by category phrases\n\nTo be able to search for places by their type using\n[special phrases](https://wiki.openstreetmap.org/wiki/Nominatim/Special_Phrases)\nyou also need to import these key phrases like this:\n\n```sh\nnominatim special-phrases --import-from-wiki\n```\n\nNote that this command downloads the phrases from the wiki link above. You\nneed internet access for the step.\n\nYou can also import special phrases from a csv file, for more \ninformation please see the [Customization part](../customize/Special-Phrases.md).\n"
  },
  {
    "path": "docs/admin/Installation.md",
    "content": "# Basic Installation\n\nThis page contains generic installation instructions for Nominatim and its\nprerequisites. There are also step-by-step instructions available for\nthe following operating systems:\n\n  * [Ubuntu 24.04](Install-on-Ubuntu-24.md)\n  * [Ubuntu 22.04](Install-on-Ubuntu-22.md)\n\nThese OS-specific instructions can also be found in executable form\nin the `vagrant/` directory.\n\nUsers have created instructions for other frameworks. We haven't tested those\nand can't offer support.\n\n  * [Docker](https://github.com/mediagis/nominatim-docker)\n  * [Docker on Kubernetes](https://github.com/peter-evans/nominatim-k8s)\n  * [Kubernetes with Helm](https://github.com/robjuz/helm-charts/blob/master/charts/nominatim/README.md)\n  * [Ansible](https://github.com/synthesio/infra-ansible-nominatim)\n\n## Prerequisites\n\n### Software\n\nFor running Nominatim:\n\n  * [PostgreSQL](https://www.postgresql.org) (12+ will work, 13+ strongly recommended)\n  * [PostGIS](https://postgis.net) (3.0+ will work, 3.2+ strongly recommended)\n  * [osm2pgsql](https://osm2pgsql.org) (1.8+)\n  * [Python 3](https://www.python.org/) (3.9+)\n\nFurthermore the following Python libraries are required:\n\n  * [Psycopg3](https://www.psycopg.org)\n  * [Python Dotenv](https://github.com/theskumar/python-dotenv)\n  * [psutil](https://github.com/giampaolo/psutil)\n  * [Jinja2](https://palletsprojects.com/p/jinja/)\n  * [PyICU](https://pypi.org/project/PyICU/)\n  * [PyYaml](https://pyyaml.org/) (5.1+)\n  * [mwparserfromhell](https://github.com/earwig/mwparserfromhell/)\n\nThese will be installed automatically when using pip installation.\n\nFor running continuous updates:\n\n  * [pyosmium](https://osmcode.org/pyosmium/)\n\nFor running the Python frontend:\n\n  * [SQLAlchemy](https://www.sqlalchemy.org/) (1.4.31+ with greenlet support)\n  * [asyncpg](https://magicstack.github.io/asyncpg) (0.8+, only when using SQLAlchemy < 2.0)\n  * one of the following web frameworks:\n    * [falcon](https://falconframework.org/) (3.0+)\n    * [starlette](https://www.starlette.io/)\n  * [uvicorn](https://www.uvicorn.org/)\n\nFor dependencies for running tests and building documentation, see\nthe [Development section](../develop/Development-Environment.md).\n\n### Hardware\n\nA minimum of 2GB of RAM is required or installation will fail. For a full\nplanet import 128GB of RAM or more are strongly recommended. Do not report\nout of memory problems if you have less than 64GB RAM.\n\nFor a full planet install you will need at least 1TB of hard disk space.\nTake into account that the OSM database is growing fast.\nFast disks are essential. Using NVME disks is recommended.\n\nEven on a well configured machine the import of a full planet takes\naround 2.5 days. When using traditional SSDs, 4-5 days are more realistic.\n\n## Tuning the PostgreSQL database\n\nYou might want to tune your PostgreSQL installation so that the later steps\nmake best use of your hardware. You should tune the following parameters in\nyour `postgresql.conf` file.\n\n    shared_buffers = 2GB\n    maintenance_work_mem = (10GB)\n    autovacuum_work_mem = 2GB\n    work_mem = (50MB)\n    synchronous_commit = off\n    max_wal_size = 1GB\n    checkpoint_timeout = 60min\n    checkpoint_completion_target = 0.9\n    random_page_cost = 1.0\n    wal_level = minimal\n    max_wal_senders = 0\n\nThe numbers in brackets behind some parameters seem to work fine for\n128GB RAM machine. Adjust to your setup. A higher number for `max_wal_size`\nmeans that PostgreSQL needs to run checkpoints less often but it does require\nthe additional space on your disk.\n\nAutovacuum must not be switched off because it ensures that the\ntables are frequently analysed. If your machine has very little memory,\nyou might consider setting:\n\n    autovacuum_max_workers = 1\n\nand even reduce `autovacuum_work_mem` further. This will reduce the amount\nof memory that autovacuum takes away from the import process.\n\n## Installing the latest release\n\nNominatim is easiest installed directly from Pypi. Make sure you have installed\nosm2pgsql, PostgreSQL/PostGIS and libICU together with its header files.\n\nThen you can install Nominatim with:\n\n    pip install nominatim-db nominatim-api\n\n## Downloading and building Nominatim\n\n### Downloading the latest release\n\nYou can download the [latest release from nominatim.org](https://nominatim.org/downloads/).\nThe release contains all necessary files. Just unpack it.\n\n### Downloading the latest development version\n\nIf you want to install latest development version from github:\n\n```\ngit clone https://github.com/osm-search/Nominatim.git\n```\n\nThe development version does not include the country grid. Download it separately:\n\n```\nwget -O Nominatim/data/country_osm_grid.sql.gz https://nominatim.org/data/country_grid.sql.gz\n```\n\n### Building Nominatim\n\nNominatim is easiest to run from its own virtual environment. To create one, run:\n\n    sudo apt-get install virtualenv\n    virtualenv /srv/nominatim-venv\n\nTo install Nominatim directly from the source tree into the virtual environment, run:\n\n    /srv/nominatim-venv/bin/pip install packaging/nominatim-{db,api}\n\n\nNow continue with [importing the database](Import.md).\n"
  },
  {
    "path": "docs/admin/Maintenance.md",
    "content": "This chapter describes the various operations the Nominatim database administrator\nmay use to clean and maintain the database. None of these operations is mandatory\nbut they may help improve the performance and accuracy of results.\n\n\n## Updating postcodes\n\nCommand: `nominatim refresh --postcodes`\n\nPostcode centroids (aka 'calculated postcodes') are generated by looking at all\npostcodes of a country, grouping them and calculating the geometric centroid.\nThere is currently no logic to deal with extreme outliers (typos or other\nmistakes in OSM data). There is also no check if a postcodes adheres to a\ncountry's format, e.g. if Swiss postcodes are 4 digits.\n\nWhen running regular updates, postcodes results can be improved by running\nthis command on a regular basis. Note that only the postcode table and the\npostcode search terms are updated. The postcode that is assigned to each place\nis only updated when the place is updated.\n\nThe command takes around 70min to run on the planet and needs ca. 40GB of\ntemporary disk space.\n\n\n## Updating word counts\n\nCommand: `nominatim refresh --word-counts`\n\nNominatim keeps frequency statistics about all search terms it indexes. These\nstatistics are currently used to optimise queries to the database. Thus better\nstatistics mean better performance. Word counts are created once after import\nand are usually sufficient even when running regular updates. You might want\nto rerun the statistics computation when adding larger amounts of new data,\nfor example, when adding an additional country via `nominatim add-data`.\n\n\n## Forcing recomputation of places and areas\n\nCommand: `nominatim refresh --data-object [NWR]<id> --data-area [NWR]<id>`\n\nWhen running replication updates, Nominatim tries to recompute the search\nand address information for all places that are affected by a change. But it\nneeds to restrict the total number of changes to make sure it can keep up\nwith the minutely updates. Therefore it will refrain from propagating changes\nthat affect a lot of objects.\n\nThe administrator may force an update of places in the database.\n`nominatim refresh --data-object` invalidates a single OSM object.\n`nominatim refresh --data-area` invalidates an OSM object and all dependent\nobjects. That are usually the places that inside its area or around the\ncenter of the object. Both commands expect the OSM object as an argument\nof the form OSM type + OSM id. The type must be `N` (node), `W` (way) or\n`R` (relation).\n\nAfter invalidating the object, indexing must be run again. If continuous\nupdate are running in the background, the objects will be recomputed together\nwith the next round of updates. Otherwise you need to run `nominatim index`\nto finish the recomputation.\n\n\n## Removing large deleted objects\n\nCommand: `nominatim admin --clean-deleted <PostgreSQL Time Interval>`\n\nNominatim refuses to delete very large areas because often these deletions are\naccidental and are reverted within hours. Instead the deletions are logged in\nthe `import_polygon_delete` table and left to the administrator to clean up.\n\nTo run this command you will need to pass a PostgreSQL time interval. For example to \ndelete any objects that have been deleted more than a month ago you would run:\n`nominatim admin --clean-deleted '1 month'`\n\n"
  },
  {
    "path": "docs/admin/Migration.md",
    "content": "# Database Migrations\n\nNominatim offers automatic migrations for versions 4.3+. Please follow\nthe following steps:\n\n* Stop any updates that are potentially running\n* Update the backend: `pip install -U nominatim-db`\n* Go to your project directory and run `nominatim admin --migrate`\n* Update the frontend: `pip install -U nominatim-api`\n* (optionally) Restart updates\n\nBelow you find additional migrations and hints about other structural and\nbreaking changes. **Please read them before running the migration.**\n\n!!! note\n    If you are migrating from a version <4.3, you need to install 4.3\n    and migrate to 4.3 first. Then you can migrate to the current\n    version. It is strongly recommended to do a reimport instead.\n\n## 5.2.0 -> 5.3.0\n\n#### Expensive table migrations\n\nThis version introduces new tables for postcodes, interpolations and\nassociatedStreet relations. Migration is possible but will take a bit\nlonger. It is recommended to take Nominatim offline while migrating to 5.3.\n\n## 5.1.0 -> 5.2.0\n\n### Lua import style: required extratags removed\n\nTags that are required by Nominatim as extratags are now always included\nindependent of what is defined in the style. The line\n\n    flex.add_for_extratags('required')\n\nis no longer required in custom styles and will throw an error. Simply\nremove the line from your style.\n\n## 4.5.0 -> 5.0.0\n\n### PHP frontend removed\n\nThe PHP frontend has been completely removed. Please switch to the Python\nfrontend.\n\nWithout the PHP code, the `nominatim refresh --website` command is no longer\nneeded. It currently omits a warning and does otherwise nothing. It will be\nremoved in later versions of Nominatim. So make sure you remove it from your\nscripts.\n\n### CMake building removed\n\nNominatim can now only be installed via pip. Please follow the installation\ninstructions for the current version to change to pip.\n\n### osm2pgsql no longer vendored in\n\nNominatim no longer ships its own version of osm2pgsql. Please install a\nstock version of osm2pgsql from your distribution. See the\n[installation instruction for osm2pgsql](https://osm2pgsql.org/doc/install.html)\nfor details. A minimum version of 1.8 is required. The current stable versions\nof Ubuntu and Debian already ship with an appropriate versions. For older\ninstallations, you may have to compile a newer osm2pgsql yourself.\n\n### Legacy tokenizer removed\n\nThe `legacy` tokenizer is no longer enabled. This tokenizer has been superseded\nby the `ICU` tokenizer a long time ago. In the unlikely case that your database\nstill uses the `legacy` tokenizer, you must reimport your database.\n\n### osm2pgsql style overhauled\n\nThere are some fundamental changes to how customized osm2pgsql styles should\nbe written. The changes are mostly backwards compatible, i.e. custom styles\nshould still work with the new implementation. The only exception is a\ncustomization of the `process_tags()` function. This function is no longer\nconsidered public and neither are the helper functions used in it.\nThey currently still work but will be removed at some point. If you have\nbeen making changes to `process_tags`, please review your style and try\nto switch to the new convenience functions.\n\nFor more information on the changes, see the\n[pull request](https://github.com/osm-search/Nominatim/pull/3615)\nand read the new\n[customization documentation](https://nominatim.org/release-docs/latest/customize/Import-Styles/).\n\n## 4.4.0 -> 4.5.0\n\n### New structure for Python packages\n\nThe nominatim Python package has been split into `nominatim-db` and `nominatim-api`.\nAny imports need to be adapted accordingly.\n\nIf you are running the Python frontend, change the server module from\n`nominatim.server.falcon.server` to `nominatim_api.server.falcon.server`.\n\nIf you are using the Nominatim library, all imports need to be changed\nfrom `nominatim.api.<module>` to `nominatim_api.<module>`.\n\nIf you have written custom tokenizers or sanitizers, the appropriate modules\nare now found in `nominatim_db`.\n\n## 4.2.0 -> 4.3.0\n\n### New indexes for reverse lookup\n\nThe reverse lookup algorithm has changed slightly to improve performance.\nThis change needs a different index in the database. The required index\nwill be automatically build during migration. Until the new index is available\nperformance of the /reverse endpoint is significantly reduced. You should\ntherefore either remove traffic from the machine before attempting a\nversion update or create the index manually **before** starting the update\nusing the following SQL:\n\n```sql\nCREATE INDEX IF NOT EXISTS idx_placex_geometry_reverse_lookupPlaceNode\n  ON placex USING gist (ST_Buffer(geometry, reverse_place_diameter(rank_search)))\n  WHERE rank_address between 4 and 25 AND type != 'postcode'\n    AND name is not null AND linked_place_id is null AND osm_type = 'N';\n```\n\n## 4.0.0 -> 4.1.0\n\n### ICU tokenizer is the new default\n\nNominatim now installs the [ICU tokenizer](../customize/Tokenizers.md#icu-tokenizer)\nby default. This only has an effect on newly installed databases. When\nupdating older databases, it keeps its installed tokenizer. If you still\nrun with the legacy tokenizer, make sure to compile Nominatim with the\nPostgreSQL module, see [Installation](Installation.md#building-nominatim).\n\n### geocodejson output changed\n\nThe `type` field of the geocodejson output has changed. It now contains\nthe address class of the object instead of the value of the OSM tag. If\nyour client has used the `type` field, switch them to read `osm_value`\ninstead.\n\n## 3.7.0 -> 4.0.0\n\n### NOMINATIM_PHRASE_CONFIG removed\n\nCustom blacklist configurations for special phrases now need to be handed\nwith the `--config` parameter to `nominatim special-phrases`. Alternatively\nyou can put your custom configuration in the project directory in a file\nnamed `phrase-settings.json`.\n\nVersion 3.8 also removes the automatic converter for the php format of\nthe configuration in older versions. If you are updating from Nominatim < 3.7\nand still work with a custom `phrase-settings.php`, you need to manually\nconvert it into a json format.\n\n### PHP utils removed\n\nThe old PHP utils have now been removed completely. You need to switch to\nthe appropriate functions of the nominatim  command line tool. See\n[Introducing `nominatim` command line tool](#introducing-nominatim-command-line-tool)\nbelow.\n\n## 3.6.0 -> 3.7.0\n\n### New format and name of configuration file\n\nThe configuration for an import is now saved in a `.env` file in the project\ndirectory. This file follows the dotenv format. For more information, see\nthe [installation chapter](Import.md#configuration-setup-in-env).\n\nTo migrate to the new system, create a new project directory, add the `.env`\nfile and port your custom configuration from `settings/local.php`. Most\nsettings are named similar and only have received a `NOMINATIM_` prefix.\nUse the default settings in `settings/env.defaults` as a reference.\n\n### New location for data files\n\nExternal data files for Wikipedia importance, postcodes etc. are no longer\nexpected to reside in the source tree by default. Instead they will be searched\nin the project directory. If you have an automated setup script you must\neither adapt the download location or explicitly set the location of the\nfiles to the old place in your `.env`.\n\n### Introducing `nominatim` command line tool\n\nThe various php utilities have been replaced with a single `nominatim`\ncommand line tool. Make sure to adapt any scripts. There is no direct 1:1\nmatching between the old utilities and the commands of nominatim CLI. The\nfollowing list gives you a list of nominatim sub-commands that contain\nfunctionality of each script:\n\n* ./utils/setup.php: `import`, `freeze`, `refresh`\n* ./utils/update.php: `replication`, `add-data`, `index`, `refresh`\n* ./utils/specialphrases.php: `special-phrases`\n* ./utils/check_import_finished.php: `admin`\n* ./utils/warm.php: `admin`\n* ./utils/export.php: `export`\n\nTry `nominatim <command> --help` for more information about each subcommand.\n\n`./utils/query.php` no longer exists in its old form. `nominatim search`\nprovides a replacement but returns different output.\n\n### Switch to normalized house numbers\n\nThe housenumber column in the placex table uses now normalized version.\nThe automatic migration step will convert the column but this may take a\nvery long time. It is advisable to take the machine offline while doing that.\n\n## 3.5.0 -> 3.6.0\n\n### Change of layout of search_name_* tables\n\nThe table need a different index for nearest place lookup. Recreate the\nindexes using the following shell script:\n\n```bash\nfor table in `psql -d nominatim -c \"SELECT tablename FROM pg_tables WHERE tablename LIKE 'search_name_%'\" -tA | grep -v search_name_blank`;\ndo\n    psql -d nominatim -c \"DROP INDEX idx_${table}_centroid_place; CREATE INDEX idx_${table}_centroid_place ON ${table} USING gist (centroid) WHERE ((address_rank >= 2) AND (address_rank <= 25)); DROP INDEX idx_${table}_centroid_street; CREATE INDEX idx_${table}_centroid_street ON ${table} USING gist (centroid) WHERE ((address_rank >= 26) AND (address_rank <= 27))\";\ndone\n```\n\n### Removal of html output\n\nThe debugging UI is no longer directly provided with Nominatim. Instead we\nnow provide a simple Javascript application. Please refer to\n[Setting up the Nominatim UI](Setup-Nominatim-UI.md) for details on how to\nset up the UI.\n\nThe icons served together with the API responses have been moved to the\nnominatim-ui project as well. If you want to keep the `icon` field in the\nresponse, you need to set `CONST_MapIcon_URL` to the URL of the `/mapicon`\ndirectory of nominatim-ui.\n\n### Change order during indexing\n\nWhen reindexing places during updates, there is now a different order used\nwhich needs a different database index. Create it with the following SQL command:\n\n```sql\nCREATE INDEX idx_placex_pendingsector_rank_address\n  ON placex\n  USING BTREE (rank_address, geometry_sector)\n  WHERE indexed_status > 0;\n```\n\nYou can then drop the old index with:\n\n```sql\nDROP INDEX idx_placex_pendingsector;\n```\n\n### Unused index\n\nThis index has been unused ever since the query using it was changed two years ago. Saves about 12GB on a planet installation.\n\n```sql\nDROP INDEX idx_placex_geometry_reverse_lookupPoint;\n```\n\n### Switching to dotenv\n\nAs part of the work changing the configuration format, the configuration for\nthe website is now using a separate configuration file. To create the\nconfiguration file, run the following command after updating:\n\n```sh\n./utils/setup.php --setup-website\n```\n\n### Update SQL code\n\nTo update the SQL code to the leatest version run:\n\n```\n./utils/setup.php --create-functions --enable-diff-updates --create-partition-functions\n```\n\n## 3.4.0 -> 3.5.0\n\n### New Wikipedia/Wikidata importance tables\n\nThe `wikipedia_*` tables have a new format that also includes references to\nWikidata. You need to update the computation functions and the tables as\nfollows:\n\n  * download the new Wikipedia tables as described in the import section\n  * reimport the tables: `./utils/setup.php --import-wikipedia-articles`\n  * update the functions: `./utils/setup.php --create-functions --enable-diff-updates`\n  * create a new lookup index:\n```sql\nCREATE INDEX idx_placex_wikidata\n  ON placex\n  USING BTREE ((extratags -> 'wikidata'))\n  WHERE extratags ? 'wikidata'\n    AND class = 'place'\n    AND osm_type = 'N'\n    AND rank_search < 26;\n```\n  * compute importance: `./utils/update.php --recompute-importance`\n\nThe last step takes about 10 hours on the full planet.\n\nRemove one function (it will be recreated in the next step):\n\n```sql\nDROP FUNCTION create_country(hstore,character varying);\n```\n\nFinally, update all SQL functions:\n\n```sh\n./utils/setup.php --create-functions --enable-diff-updates --create-partition-functions\n```\n\n## 3.3.0 -> 3.4.0\n\n### Reorganisation of location_area_country table\n\nThe table `location_area_country` has been optimized. You need to switch to the\nnew format when you run updates. While updates are disabled, run the following\nSQL commands:\n\n```sql\nCREATE TABLE location_area_country_new AS\n  SELECT place_id, country_code, geometry FROM location_area_country;\nDROP TABLE location_area_country;\nALTER TABLE location_area_country_new RENAME TO location_area_country;\nCREATE INDEX idx_location_area_country_geometry ON location_area_country USING GIST (geometry);\nCREATE INDEX idx_location_area_country_place_id ON location_area_country USING BTREE (place_id);\n```\n\nFinally, update all SQL functions:\n\n```sh\n./utils/setup.php --create-functions --enable-diff-updates --create-partition-functions\n```\n\n## 3.2.0 -> 3.3.0\n\n### New database connection string (DSN) format\n\nPreviously database connection setting (`CONST_Database_DSN` in `settings/*.php`) had the format\n\n   * (simple) `pgsql://@/nominatim`\n   * (complex) `pgsql://johndoe:secret@machine1.domain.com:1234/db1`\n\nThe new format is\n\n   * (simple) `pgsql:dbname=nominatim`\n   * (complex) `pgsql:dbname=db1;host=machine1.domain.com;port=1234;user=johndoe;password=secret`\n\n### Natural Earth country boundaries no longer needed as fallback\n\n```sql\nDROP TABLE country_naturalearthdata;\n```\n\nFinally, update all SQL functions:\n\n```sh\n./utils/setup.php --create-functions --enable-diff-updates --create-partition-functions\n```\n\n### Configurable Address Levels\n\nThe new configurable address levels require a new table. Create it with the\nfollowing command:\n\n```sh\n./utils/update.php --update-address-levels\n```\n\n## 3.1.0 -> 3.2.0\n\n### New reverse algorithm\n\nThe reverse algorithm has changed and requires new indexes. Run the following\nSQL statements to create the indexes:\n\n```sql\nCREATE INDEX idx_placex_geometry_reverse_lookupPoint\n  ON placex\n  USING gist (geometry)\n  WHERE (name IS NOT null or housenumber IS NOT null or rank_address BETWEEN 26 AND 27)\n    AND class NOT IN ('railway','tunnel','bridge','man_made')\n    AND rank_address >= 26\n    AND indexed_status = 0\n    AND linked_place_id IS null;\nCREATE INDEX idx_placex_geometry_reverse_lookupPolygon\n  ON placex USING gist (geometry)\n  WHERE St_GeometryType(geometry) in ('ST_Polygon', 'ST_MultiPolygon')\n    AND rank_address between 4 and 25\n    AND type != 'postcode'\n    AND name is not null\n    AND indexed_status = 0\n    AND linked_place_id is null;\nCREATE INDEX idx_placex_geometry_reverse_placeNode\n  ON placex USING gist (geometry)\n  WHERE osm_type = 'N'\n    AND rank_search between 5 and 25\n    AND class = 'place'\n    AND type != 'postcode'\n    AND name is not null\n    AND indexed_status = 0\n    AND linked_place_id is null;\n```\n\nYou also need to grant the website user access to the `country_osm_grid` table:\n\n```sql\nGRANT SELECT ON table country_osm_grid to \"www-user\";\n```\n\nReplace the `www-user` with the user name of your website server if necessary.\n\nYou can now drop the unused indexes:\n\n```sql\nDROP INDEX idx_placex_reverse_geometry;\n```\n\nFinally, update all SQL functions:\n\n```sh\n./utils/setup.php --create-functions --enable-diff-updates --create-partition-functions\n```\n\n## 3.0.0 -> 3.1.0\n\n### Postcode Table\n\nA new separate table for artificially computed postcode centroids was introduced.\nMigration to the new format is possible but **not recommended**.\n\nCreate postcode table and indexes, running the following SQL statements:\n\n```sql\nCREATE TABLE location_postcode\n  (place_id BIGINT, parent_place_id BIGINT, rank_search SMALLINT,\n   rank_address SMALLINT, indexed_status SMALLINT, indexed_date TIMESTAMP,\n   country_code varchar(2), postcode TEXT,\n   geometry GEOMETRY(Geometry, 4326));\nCREATE INDEX idx_postcode_geometry ON location_postcode USING GIST (geometry);\nCREATE UNIQUE INDEX idx_postcode_id ON location_postcode USING BTREE (place_id);\nCREATE INDEX idx_postcode_postcode ON location_postcode USING BTREE (postcode);\nGRANT SELECT ON location_postcode TO \"www-data\";\nDROP TYPE IF EXISTS nearfeaturecentr CASCADE;\nCREATE TYPE nearfeaturecentr AS (\n  place_id BIGINT,\n  keywords int[],\n  rank_address smallint,\n  rank_search smallint,\n  distance float,\n  isguess boolean,\n  postcode TEXT,\n  centroid GEOMETRY\n);\n```\n\nAdd postcode column to `location_area` tables with SQL statement:\n\n```sql\nALTER TABLE location_area ADD COLUMN postcode TEXT;\n```\n\nThen reimport the functions:\n\n```sh\n./utils/setup.php --create-functions --enable-diff-updates --create-partition-functions\n```\n\nCreate appropriate triggers with SQL:\n\n```sql\nCREATE TRIGGER location_postcode_before_update BEFORE UPDATE ON location_postcode\n    FOR EACH ROW EXECUTE PROCEDURE postcode_update();\n```\n\nFinally populate the postcode table (will take a while):\n\n```sh\n./utils/setup.php --calculate-postcodes --index --index-noanalyse\n```\n\nThis will create a working database. You may also delete the old artificial\npostcodes now. Note that this may be expensive and is not absolutely necessary.\nThe following SQL statement will remove them:\n\n```sql\nDELETE FROM place_addressline a USING placex p\n WHERE a.address_place_id = p.place_id and p.osm_type = 'P';\nALTER TABLE placex DISABLE TRIGGER USER;\nDELETE FROM placex WHERE osm_type = 'P';\nALTER TABLE placex ENABLE TRIGGER USER;\n```\n"
  },
  {
    "path": "docs/admin/Setup-Nominatim-UI.md",
    "content": "# Setting up the Nominatim UI\n\nNominatim is a search API, it does not provide a website interface on its\nown. [nominatim-ui](https://github.com/osm-search/nominatim-ui) offers a\nsmall website for testing your setup and inspecting the database content.\n\nThis section provides a quick start how to use nominatim-ui with your\ninstallation. For more details, please also have a look at the\n[README of nominatim-ui](https://github.com/osm-search/nominatim-ui/blob/master/README.md).\n\n## Installing nominatim-ui\n\nWe provide regular releases of nominatim-ui that contain the packaged website.\nThey do not need any special installation. Just download, configure\nand run it. Grab the latest release from\n[nominatim-ui's Github release page](https://github.com/osm-search/nominatim-ui/releases)\nand unpack it. You can use `nominatim-ui-x.x.x.tar.gz` or `nominatim-ui-x.x.x.zip`.\n\nNext you need to adapt the UI to your installation. Custom settings need to be\nput into `dist/theme/config.theme.js`. At a minimum you need to\nset `Nominatim_API_Endpoint` to point to your Nominatim installation:\n\n    cd nominatim-ui\n    echo \"Nominatim_Config.Nominatim_API_Endpoint='https://myserver.org/nominatim/';\" > dist/theme/config.theme.js\n\nFor the full set of available settings, have a look at `dist/config.defaults.js`.\n\nThen you can just test it locally by spinning up a webserver in the `dist`\ndirectory. For example, with Python:\n\n    cd nominatim-ui/dist\n    python3 -m http.server 8765\n\nThe website is now available at `http://localhost:8765`.\n\n## Forwarding searches to nominatim-ui\n\nNominatim used to provide the search interface directly by itself when\n`format=html` was requested. For the `/search` endpoint this even used\nto be the default.\n\nThe following section describes how to set up Apache or nginx, so that your\nusers are forwarded to nominatim-ui when they go to a URL that formerly presented\nthe UI.\n\n### Setting up forwarding in Nginx\n\nFirst of all make nominatim-ui available under `/ui` on your webserver:\n\n``` nginx\nserver {\n\n    # Here is the Nominatim setup as described in the Installation section\n\n    location /ui/ {\n        alias <full path to the nominatim-ui directory>/dist/;\n        index index.html;\n    }\n}\n```\n\nNow we need to find out if a URL should be forwarded to the UI. Add the\nfollowing `map` commands *outside* the server section:\n\n``` nginx\n# Inspect the format parameter in the query arguments. We are interested\n# if it is set to html or something else or if it is missing completely.\nmap $args $format {\n    default                  default;\n    ~(^|&)format=html(&|$)   html;\n    ~(^|&)format=            other;\n}\n\n# Determine from the URI and the format parameter above if forwarding is needed.\nmap $uri/$format $forward_to_ui {\n    default               0;  # no forwarding by default\n    ~/search.*/default    1;  # Use this line only, if search should go to UI by default.\n    ~/reverse.*/html      1;  # Forward API calls that UI supports, when\n    ~/status.*/html       1;  #   format=html is explicitly requested.\n    ~/search.*/html       1;\n    ~/details.*/html      1;\n}\n```\n\nThe `$forward_to_ui` parameter can now be used to conditionally forward the\ncalls:\n\n``` nginx\nlocation / {\n    if ($forward_to_ui) {\n        rewrite ^(/[^/.]*) https://$http_host/ui$1.html redirect;\n    }\n\n    # proxy_pass commands\n}\n```\n\nReload nginx and the UI should be available.\n\n### Setting up forwarding in Apache\n\nFirst of all make nominatim-ui available in the `ui/` subdirectory where\nNominatim is installed. For example, given you have set up an alias under\n`nominatim` like this:\n\n``` apache\nAlias /nominatim /home/vagrant/build/website\n```\n\nyou need to insert the following rules for nominatim-ui before that alias:\n\n```\n<Directory \"/home/vagrant/nominatim-ui/dist\">\n  DirectoryIndex search.html\n  Require all granted\n</Directory>\n\nAlias /nominatim/ui /home/vagrant/nominatim-ui/dist\n```\n\nReplace `/home/vagrant/nominatim-ui` with the directory where you have cloned\nnominatim-ui.\n\n!!! important\n    The alias for nominatim-ui must come before the alias for the Nominatim\n    website directory.\n\nTo set up forwarding, the Apache rewrite module is needed. Enable it with:\n\n``` sh\nsudo a2enmod rewrite\n```\n\nThen add rewrite rules to the `Directory` directive of the Nominatim website\ndirectory like this:\n\n``` apache\n<Directory \"/home/vagrant/build/website\">\n  Options FollowSymLinks MultiViews\n  AddType text/html   .php\n  Require all granted\n\n  RewriteEngine On\n\n  # This must correspond to the URL where nominatim can be found.\n  RewriteBase \"/nominatim/\"\n\n  # If no endpoint is given, then use search.\n  RewriteRule ^(/|$)   \"search\"\n\n  # If format-html is explicitly requested, forward to the UI.\n  RewriteCond %{QUERY_STRING} \"format=html\"\n  RewriteRule ^([^/.]+) ui/$1.html [R,END]\n\n  # Optionally: if no format parameter is there then forward /search.\n  RewriteCond %{QUERY_STRING} \"!format=\"\n  RewriteCond %{REQUEST_URI}  \"/search\"\n  RewriteRule ^([^/.]+) ui/$1.html [R,END]\n</Directory>\n```\n\nRestart Apache and the UI should be available.\n"
  },
  {
    "path": "docs/admin/Update.md",
    "content": "# Updating the Database\n\nThere are many different ways to update your Nominatim database.\nThe following section describes how to keep it up-to-date using\nan [online replication service for OpenStreetMap data](https://wiki.openstreetmap.org/wiki/Planet.osm/diffs)\nFor a list of other methods to add or update data see the output of\n`nominatim add-data --help`.\n\n!!! important\n    If you have configured a flatnode file for the import, then you\n    need to keep this flatnode file around for updates.\n\n### Installing the newest version of Pyosmium\n\nThe replication process uses\n[Pyosmium](https://docs.osmcode.org/pyosmium/latest/updating_osm_data.html)\nto download update data from the server.\nIt is recommended to install Pyosmium via pip.\nRun (as the same user who will later run the updates):\n\n```sh\npip3 install --user osmium\n```\n\n### Setting up the update process\n\nNext the update process needs to be initialised. By default Nominatim is configured\nto update using the global minutely diffs.\n\nIf you want a different update source you will need to add some settings\nto `.env`. For example, to use the daily country extracts\ndiffs for Ireland from Geofabrik add the following:\n\n    # base URL of the replication service\n    NOMINATIM_REPLICATION_URL=\"https://download.geofabrik.de/europe/ireland-and-northern-ireland-updates\"\n    # How often upstream publishes diffs (in seconds)\n    NOMINATIM_REPLICATION_UPDATE_INTERVAL=86400\n    # How long to sleep if no update found yet (in seconds)\n    NOMINATIM_REPLICATION_RECHECK_INTERVAL=900\n\nTo set up the update process now run the following command:\n\n    nominatim replication --init\n\nIt outputs the date where updates will start. Recheck that this date is\nwhat you expect.\n\nThe `replication --init` command needs to be rerun whenever the replication\nservice is changed.\n\n### Updating Nominatim\n\nNominatim supports different modes how to retrieve the update data from the\nserver. Which one you want to use depends on your exact setup and how often you\nwant to retrieve updates.\n\nThese instructions are for using a single source of updates. If you have\nimported multiple country extracts and want to keep them\nup-to-date, [Advanced installations section](Advanced-Installations.md)\ncontains instructions to set up and update multiple country extracts.\n\n#### One-time mode\n\nWhen the `--once` parameter is given, then Nominatim will download exactly one\nbatch of updates and then exit. This one-time mode still respects the\n`NOMINATIM_REPLICATION_UPDATE_INTERVAL` that you have set. If according to\nthe update interval no new data has been published yet, it will go to sleep\nuntil the next expected update and only then attempt to download the next batch.\n\nThe one-time mode is particularly useful if you want to run updates continuously\nbut need to schedule other work in between updates. For example, you might\nwant to regularly recompute postcodes -- a process that\nmust not be run while updates are in progress. An update script refreshing\npostcodes regularly might look like this:\n\n```sh\n#!/bin/bash\n\n# Switch to your project directory.\ncd /srv/nominatim\n\nwhile true; do\n  nominatim replication --once\n  if [ -f \"/srv/nominatim/schedule-maintenance\" ]; then\n    rm /srv/nominatim/schedule-maintenance\n    nominatim refresh --postcodes\n  fi\ndone\n```\n\nA cron job then creates the file `/srv/nominatim/schedule-maintenance` once per night.\n\n##### One-time mode with systemd\n\nYou can run the one-time mode with a systemd timer & service.\n\nCreate a timer description like `/etc/systemd/system/nominatim-updates.timer`:\n\n```\n[Unit]\nDescription=Timer to start updates of Nominatim\n\n[Timer]\nOnActiveSec=2\nOnUnitActiveSec=1min\nUnit=nominatim-updates.service\n\n[Install]\nWantedBy=multi-user.target\n```\n\n`OnUnitActiveSec` defines how often the individual update command is run.\n\nThen add a service definition for the timer in `/etc/systemd/system/nominatim-updates.service`:\n\n```\n[Unit]\nDescription=Single updates of Nominatim\n\n[Service]\nWorkingDirectory=/srv/nominatim-project\nExecStart=/srv/nominatim-venv/bin/nominatim replication --once\nStandardOutput=journald\nStandardError=inherit\nUser=nominatim\nGroup=nominatim\nType=simple\n\n[Install]\nWantedBy=multi-user.target\n```\n\nReplace the `WorkingDirectory` with your project directory. `ExecStart` points\nto the nominatim binary that was installed in your virtualenv earlier.\nFinally, you might need to adapt user and group names as required.\n\nNow activate the service and start the updates:\n\n```\nsudo systemctl daemon-reload\nsudo systemctl enable nominatim-updates.timer\nsudo systemctl start nominatim-updates.timer\n```\n\nYou can stop future data updates while allowing any current, in-progress\nupdate steps to finish, by running `sudo systemctl stop\nnominatim-updates.timer` and waiting until `nominatim-updates.service` isn't\nrunning (`sudo systemctl is-active nominatim-updates.service`).\n\nTo check the output from the update process, use journalctl: `journalctl -u\nnominatim-updates.service`\n\n\n#### Catch-up mode\n\nWith the `--catch-up` parameter, Nominatim will immediately try to download\nall changes from the server until the database is up-to-date. The catch-up mode\nstill respects the parameter `NOMINATIM_REPLICATION_MAX_DIFF`. It downloads and\napplies the changes in appropriate batches until all is done.\n\nThe catch-up mode is foremost useful to bring the database up to date after the\ninitial import. Give that the service usually is not in production at this\npoint, you can temporarily be a bit more generous with the batch size and\nnumber of threads you use for the updates by running catch-up like this:\n\n```\ncd /srv/nominatim-project\nNOMINATIM_REPLICATION_MAX_DIFF=5000 nominatim replication --catch-up --threads 15\n```\n\nThe catch-up mode is also useful when you want to apply updates at a lower\nfrequency than what the source publishes. You can set up a cron job to run\nreplication catch-up at whatever interval you desire.\n\n!!! hint\n    When running scheduled updates with catch-up, it is a good idea to choose\n    a replication source with an update frequency that is an order of magnitude\n    lower. For example, if you want to update once a day, use an hourly updated\n    source. This ensures that you don't miss an entire day of updates when\n    the source is unexpectedly late to publish its update.\n\n    If you want to use the source with the same update frequency (e.g. a daily\n    updated source with daily updates), use the\n    once mode together with a frequently run systemd script as described above.\n    It ensures to re-request the newest update until they have been published.\n\n\n#### Continuous updates\n\n!!! danger\n    This mode is no longer recommended to use and will removed in future\n    releases. systemd is much better\n    suited for running regular updates. Please refer to the setup\n    instructions for running one-time mode with systemd above.\n\nThis is the easiest mode. Simply run the replication command without any\nparameters:\n\n    nominatim replication\n\nThe update application keeps running forever and retrieves and applies\nnew updates from the server as they are published.\n"
  },
  {
    "path": "docs/api/Details.md",
    "content": "# Place details\n\nShow all details about a single place saved in the database.\n\nThis API endpoint is meant for visual inspection of the data in the database,\nmainly together with [Nominatim-UI](https://github.com/osm-search/nominatim-ui/).\nThe parameters of the endpoint and the output may change occasionally between\nversions of Nominatim. Do not rely on the output in scripts or applications.\n\n!!! warning\n    The details endpoint at https://nominatim.openstreetmap.org\n    may not used in scripts or bots at all.\n    See [Nominatim Usage Policy](https://operations.osmfoundation.org/policies/nominatim/).\n\n\n\nThe details API supports the following two request formats:\n\n``` xml\nhttps://nominatim.openstreetmap.org/details?osmtype=[N|W|R]&osmid=<value>&class=<value>\n```\n\n`osmtype` and `osmid` are required parameters. The type is one of node (N), way (W)\nor relation (R). The id must be a number. The `class` parameter is optional and\nallows to distinguish between entries, when the corresponding OSM object has more\nthan one main tag. For example, when a place is tagged with `tourism=hotel` and\n`amenity=restaurant`, there will be two place entries in Nominatim, one for a\nrestaurant, one for a hotel. You need to specify `class=tourism` or `class=amentity`\nto get exactly the one you want. If there are multiple places in the database\nbut the `class` parameter is left out, then one of the places will be chosen\nat random and displayed.\n\n``` xml\nhttps://nominatim.openstreetmap.org/details?place_id=<value>\n```\n\nPlace IDs are assigned sequentially during Nominatim data import. The ID\nfor a place is different between Nominatim installation (servers) and\nchanges when data gets reimported. Therefore it cannot be used as\na permanent id and shouldn't be used in bug reports.\n\n!!! danger \"Deprecation warning\"\n    The API can also be used with the URL\n    `https://nominatim.openstreetmap.org/details.php`. This is now deprecated\n    and will be removed in future versions.\n\n\n## Parameters\n\nThis section lists additional optional parameters.\n\n### Output format\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| json_callback | function name | _unset_ |\n\nWhen set, then JSON output will be wrapped in a callback function with\nthe given name. See [JSONP](https://en.wikipedia.org/wiki/JSONP) for more\ninformation.\n\n### Output details\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| addressdetails | 0 or 1 | 0 |\n\nWhen set to 1, include a breakdown of the address into elements.\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| keywords  | 0 or 1 | 0 |\n\nWhen set to 1, include a list of name keywords and address keywords\nin the result.\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| linkedplaces  | 0 or 1 | 1 |\n\nInclude details of places that are linked with this one. Places get linked\ntogether when they are different forms of the same physical object. Nominatim\nlinks two kinds of objects together: place nodes get linked with the\ncorresponding administrative boundaries. Waterway relations get linked together with their\nmembers.\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| hierarchy  | 0 or 1 | 0 |\n\nInclude details of POIs and address that depend on the place. Only POIs\nthat use this place to determine their address will be returned.\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| group_hierarchy  | 0 or 1 | 0 |\n\nWhen set to 1, the output of the address hierarchy will be\ngrouped by type.\n\n| Parameter | Value  | Default |\n|-----------| -----  | ------- |\n| polygon_geojson | 0 or 1 | 0 |\n\n\nInclude geometry of result.\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| entrances | 0 or 1 | 0 |\n\nWhen set to 1, include the tagged entrances in the result.\n\n\n### Language of results\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| accept-language | browser language string | content of \"Accept-Language\" HTTP header |\n\nPreferred language order for showing search results. This may either be\na simple comma-separated list of language codes or have the same format\nas the [\"Accept-Language\" HTTP header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language).\n\n\n## Examples\n\n##### JSON\n\n[https://nominatim.openstreetmap.org/details?osmtype=W&osmid=38210407&format=json](https://nominatim.openstreetmap.org/details?osmtype=W&osmid=38210407&format=json)\n\n\n```json\n{\n  \"place_id\": 85993608,\n  \"parent_place_id\": 72765313,\n  \"osm_type\": \"W\",\n  \"osm_id\": 38210407,\n  \"category\": \"place\",\n  \"type\": \"square\",\n  \"admin_level\": \"15\",\n  \"localname\": \"Pariser Platz\",\n  \"names\": {\n    \"name\": \"Pariser Platz\",\n    \"name:be\": \"Парыжская плошча\",\n    \"name:de\": \"Pariser Platz\",\n    \"name:es\": \"Plaza de París\",\n    \"name:he\": \"פאריזר פלאץ\",\n    \"name:ko\": \"파리저 광장\",\n    \"name:la\": \"Forum Parisinum\",\n    \"name:ru\": \"Парижская площадь\",\n    \"name:uk\": \"Паризька площа\",\n    \"name:zh\": \"巴黎廣場\"\n  },\n  \"addresstags\": {\n    \"postcode\": \"10117\"\n  },\n  \"housenumber\": null,\n  \"calculated_postcode\": \"10117\",\n  \"country_code\": \"de\",\n  \"indexed_date\": \"2018-08-18T17:02:45+00:00\",\n  \"importance\": 0.339401620591472,\n  \"calculated_importance\": 0.339401620591472,\n  \"extratags\": {\n    \"wikidata\": \"Q156716\",\n    \"wikipedia\": \"de:Pariser Platz\"\n  },\n  \"calculated_wikipedia\": \"de:Pariser_Platz\",\n  \"rank_address\": 30,\n  \"rank_search\": 30,\n  \"isarea\": true,\n  \"centroid\": {\n    \"type\": \"Point\",\n    \"coordinates\": [\n      13.3786822618517,\n      52.5163654\n    ]\n  },\n  \"geometry\": {\n    \"type\": \"Point\",\n    \"coordinates\": [\n      13.3786822618517,\n      52.5163654\n    ]\n  }\n}\n```\n"
  },
  {
    "path": "docs/api/Faq.md",
    "content": "# Frequently Asked Questions\n\n## API Results\n\n#### 1. The address of my search results contains far-away places that don't belong there.\n\nNominatim computes the address from two sources in the OpenStreetMap data:\nfrom administrative boundaries and from place nodes. Boundaries are the more\nuseful source. They precisely describe an area. So it is very clear for\nNominatim if a point belongs to an area or not. Place nodes are more complicated.\nThese are only points without any precise extent. So Nominatim has to take a\nguess and assume that an address belongs to the closest place node it can find.\nIn an ideal world, Nominatim would not need the place nodes but there are\nmany places on earth where there are no precise boundaries available for\nall parts that make up an address. This is in particular true for the more\nlocal address parts, like villages and suburbs. Therefore it is not possible\nto completely dismiss place nodes. And sometimes they sneak in where they\ndon't belong.\n\nAs a OpenStreetMap mapper, you can improve the situation in two ways: if you\nsee a place node for which already an administrative area exists, then you\nshould _link_ the two by adding the node with a 'label' role to the boundary\nrelation. If there is no administrative area, you can add the approximate\nextent of the place and tag it place=<something> as well.\n\n#### 2. When doing reverse search, the address details have parts that don't contain the point I was looking up.\n\nThere is a common misconception how the reverse API call works in Nominatim.\nReverse does not give you the address of the point you asked for. Reverse\nreturns the closest object to the point you asked for and then returns the\naddress of that object. Now, if you are close to a border, then the closest\nobject may be across that border. When Nominatim then returns the address,\nit contains the county/state/country across the border.\n\n#### 3. I get different counties/states/countries when I change the zoom parameter in the reverse query. How is that possible?\n\nThis is basically the same problem as in the previous answer.\nThe zoom level influences at which [search rank](../customize/Ranking.md#search-rank) Nominatim starts looking\nfor the closest object. So the closest house number maybe on one side of the\nborder while the closest street is on the other. As the address details contain\nthe address of the closest object found, you might sometimes get one result,\nsometimes the other for the closest point.\n\n#### 4. Can you return the continent?\n\nNominatim assigns each map feature one country. Those outside any administrative\nboundaries are assigned a special no-country. Continents or other super-national\nadministrations (e.g. European Union, NATO, Custom unions) are not supported,\nsee also [Administrative Boundary](https://wiki.openstreetmap.org/wiki/Tag:boundary%3Dadministrative#Super-national_administrations).\n\n#### 5. Can you return the timezone?\n\nSee this separate OpenStreetMap-based project [Timezone Boundary Builder](https://github.com/evansiroky/timezone-boundary-builder).\n\n#### 6. I want to download a list of streets/restaurants of a city/region\n\nThe [Overpass API](https://wiki.openstreetmap.org/wiki/Overpass_API) is more\nsuited for these kinds of queries.\n\nThat said if you installed your own Nominatim instance you can use the\n`nominatim export` PHP script as basis to return such lists.\n\n#### 7. My result has a wrong postcode. Where does it come from?\n\nMost places in OSM don't have a postcode, so Nominatim tries to interpolate\none. It first look at all the places that make up the address of the place.\nIf one of them has a postcode defined, this is the one to be used. When\nnone of the address parts has a postcode either, Nominatim interpolates one\nfrom the surrounding objects. If the postcode is for your result is one, then\nmost of the time there is an OSM object with the wrong postcode nearby.\n\nTo find the bad postcode, go to\n[https://nominatim.openstreetmap.org](https://nominatim.openstreetmap.org)\nand search for your place. When you have found it, click on the 'details' link\nunder the result to go to the details page. There is a field 'Computed Postcode'\nwhich should display the bad postcode. Click on the 'how?' link. A small\nexplanation text appears. It contains a link to a query for Overpass Turbo.\nClick on that and you get a map with all places in the area that have the bad\npostcode. If none is displayed, zoom the map out a bit and then click on 'Run'.\n\nNow go to [OpenStreetMap](https://openstreetmap.org) and fix the error you\nhave just found. It will take at least a day for Nominatim to catch up with\nyour data fix. Sometimes longer, depending on how much editing activity is in\nthe area.\n\n"
  },
  {
    "path": "docs/api/Lookup.md",
    "content": "# Address lookup\n\nThe lookup API allows to query the address and other details of one or\nmultiple OSM objects like node, way or relation.\n\n## Endpoint\n\nThe lookup API has the following format:\n\n```\n  https://nominatim.openstreetmap.org/lookup?osm_ids=[N|W|R]<value>,…,…,&<params>\n```\n\n`osm_ids` is mandatory and must contain a comma-separated list of OSM ids each\nprefixed with its type, one of node(N), way(W) or relation(R). Up to 50 ids\ncan be queried at the same time.\n\n!!! danger \"Deprecation warning\"\n    The API can also be used with the URL\n    `https://nominatim.openstreetmap.org/lookup.php`. This is now deprecated\n    and will be removed in future versions.\n\n\n## Parameters\n\nThis section lists additional optional parameters.\n\n### Output format\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| format    | one of: `xml`, `json`, `jsonv2`, `geojson`, `geocodejson` | `jsonv2` |\n\nSee [Place Output Formats](Output.md) for details on each format.\n\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| json_callback | function name | _unset_ |\n\nWhen given, then JSON output will be wrapped in a callback function with\nthe given name. See [JSONP](https://en.wikipedia.org/wiki/JSONP) for more\ninformation.\n\nOnly has an effect for JSON output formats.\n\n\n### Output details\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| addressdetails | 0 or 1 | 1 |\n\nWhen set to 1, include a breakdown of the address into elements.\nThe exact content of the address breakdown depends on the output format.\n\n!!! tip\n    If you are interested in a stable classification of address categories\n    (suburb, city, state, etc), have a look at the `geocodejson` format.\n    All other formats return classifications according to OSM tagging.\n    There is a much larger set of categories and they are not always consistent,\n    which makes them very hard to work with.\n\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| extratags | 0 or 1 | 0 |\n\nWhen set to 1, the response include any additional information in the result\nthat is available in the database, e.g. wikipedia link, opening hours.\n\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| namedetails | 0 or 1 | 0 |\n\nWhen set to 1, include a full list of names for the result. These may include\nlanguage variants, older names, references and brand.\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| entrances | 0 or 1 | 0 |\n\nWhen set to 1, include the tagged entrances in the result.\n\n\n### Language of results\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| accept-language | browser language string | content of \"Accept-Language\" HTTP header |\n\nPreferred language order for showing search results. This may either be\na simple comma-separated list of language codes or have the same format\nas the [\"Accept-Language\" HTTP header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language).\n\n!!! tip\n    First-time users of Nominatim tend to be confused that they get different\n    results when using Nominatim in the browser versus in a command-line tool\n    like wget or curl. The command-line tools\n    usually don't send any Accept-Language header, prompting Nominatim\n    to show results in the local language. Browsers on the contrary always\n    send the currently chosen browser language.\n\n\n### Polygon output\n\n| Parameter | Value  | Default |\n|-----------| -----  | ------- |\n| polygon_geojson | 0 or 1 | 0 |\n| polygon_kml     | 0 or 1 | 0 |\n| polygon_svg     | 0 or 1 | 0 |\n| polygon_text    | 0 or 1 | 0 |\n\nAdd the full geometry of the place to the result output. Output formats\nin GeoJSON, KML, SVG or WKT are supported. Only one of these\noptions can be used at a time.\n\n| Parameter | Value  | Default |\n|-----------| -----  | ------- |\n| polygon_threshold | floating-point number | 0.0 |\n\nWhen one of the polygon_* outputs is chosen, return a simplified version\nof the output geometry. The parameter describes the\ntolerance in degrees with which the geometry may differ from the original\ngeometry. Topology is preserved in the geometry.\n\n\n### Other\n\n| Parameter | Value  | Default |\n|-----------| -----  | ------- |\n| email     | valid email address | _unset_ |\n\nIf you are making large numbers of request please include an appropriate email\naddress to identify your requests. See Nominatim's\n[Usage Policy](https://operations.osmfoundation.org/policies/nominatim/) for more details.\n\n\n| Parameter | Value  | Default |\n|-----------| -----  | ------- |\n| debug     | 0 or 1 | 0       |\n\nOutput assorted developer debug information. Data on internals of Nominatim's\n\"search loop\" logic, and SQL queries. The output is HTML format.\nThis overrides the specified machine readable format.\n\n\n## Examples\n\n##### XML\n\n[https://nominatim.openstreetmap.org/lookup?osm_ids=R146656,W104393803,N240109189](https://nominatim.openstreetmap.org/lookup?osm_ids=R146656,W50637691,N240109189)\n\n```xml\n  <lookupresults timestamp=\"Mon, 28 Mar 22 14:38:54 +0000\" attribution=\"Data &#xA9; OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright\" querystring=\"R146656,W50637691,N240109189\" more_url=\"\">\n    <place place_id=\"282236157\" osm_type=\"relation\" osm_id=\"146656\" place_rank=\"16\" address_rank=\"16\" boundingbox=\"53.3401044,53.5445923,-2.3199185,-2.1468288\" lat=\"53.44246175\" lon=\"-2.2324547359718547\" display_name=\"Manchester, Greater Manchester, North West England, England, United Kingdom\" class=\"boundary\" type=\"administrative\" importance=\"0.35\">\n      <city>Manchester</city>\n      <county>Greater Manchester</county>\n      <state_district>North West England</state_district>\n      <state>England</state>\n      <country>United Kingdom</country>\n      <country_code>gb</country_code>\n    </place>\n    <place place_id=\"115462561\" osm_type=\"way\" osm_id=\"50637691\" place_rank=\"30\" address_rank=\"30\" boundingbox=\"52.3994612,52.3996426,13.0479574,13.0481754\" lat=\"52.399550700000006\" lon=\"13.048066846939687\" display_name=\"Brandenburger Tor, Brandenburger Stra&#xDF;e, Historische Innenstadt, Innenstadt, Potsdam, Brandenburg, 14467, Germany\" class=\"tourism\" type=\"attraction\" importance=\"0.29402874005524\">\n      <tourism>Brandenburger Tor</tourism>\n      <road>Brandenburger Stra&#xDF;e</road>\n      <suburb>Historische Innenstadt</suburb>\n      <city>Potsdam</city>\n      <state>Brandenburg</state>\n      <postcode>14467</postcode>\n      <country>Germany</country>\n      <country_code>de</country_code>\n    </place>\n    <place place_id=\"567505\" osm_type=\"node\" osm_id=\"240109189\" place_rank=\"15\" address_rank=\"16\" boundingbox=\"52.3586925,52.6786925,13.2396024,13.5596024\" lat=\"52.5186925\" lon=\"13.3996024\" display_name=\"Berlin, 10178, Germany\" class=\"place\" type=\"city\" importance=\"0.78753902824914\">\n      <city>Berlin</city>\n      <state>Berlin</state>\n      <postcode>10178</postcode>\n      <country>Germany</country>\n      <country_code>de</country_code>\n    </place>\n  </lookupresults>\n```\n\n##### JSON with extratags\n\n[https://nominatim.openstreetmap.org/lookup?osm_ids=W50637691&format=json&extratags=1](https://nominatim.openstreetmap.org/lookup?osm_ids=W50637691&format=json&extratags=1)\n\n```json\n[\n   {\n      \"place_id\": 115462561,\n      \"licence\": \"Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright\",\n      \"osm_type\": \"way\",\n      \"osm_id\": 50637691,\n      \"boundingbox\": [\n        \"52.3994612\",\n        \"52.3996426\",\n        \"13.0479574\",\n        \"13.0481754\"\n      ],\n      \"lat\": \"52.399550700000006\",\n      \"lon\": \"13.048066846939687\",\n      \"display_name\": \"Brandenburger Tor, Brandenburger Straße, Historische Innenstadt, Innenstadt, Potsdam, Brandenburg, 14467, Germany\",\n      \"class\": \"tourism\",\n      \"type\": \"attraction\",\n      \"importance\": 0.2940287400552381,\n      \"address\": {\n        \"tourism\": \"Brandenburger Tor\",\n        \"road\": \"Brandenburger Straße\",\n        \"suburb\": \"Historische Innenstadt\",\n        \"city\": \"Potsdam\",\n        \"state\": \"Brandenburg\",\n        \"postcode\": \"14467\",\n        \"country\": \"Germany\",\n        \"country_code\": \"de\"\n      },\n      \"extratags\": {\n        \"image\": \"http://commons.wikimedia.org/wiki/File:Potsdam_brandenburger_tor.jpg\",\n        \"heritage\": \"4\",\n        \"wikidata\": \"Q695045\",\n        \"architect\": \"Carl von Gontard;Georg Christian Unger\",\n        \"wikipedia\": \"de:Brandenburger Tor (Potsdam)\",\n        \"wheelchair\": \"yes\",\n        \"description\": \"Kleines Brandenburger Tor in Potsdam\",\n        \"heritage:website\": \"http://www.bldam-brandenburg.de/images/stories/PDF/DML%202012/04-p-internet-13.pdf\",\n        \"heritage:operator\": \"bldam\",\n        \"architect:wikidata\": \"Q68768;Q95223\",\n        \"year_of_construction\": \"1771\"\n      }\n   }\n]\n```\n"
  },
  {
    "path": "docs/api/Output.md",
    "content": "# Place Output\n\nThe [/reverse](Reverse.md), [/search](Search.md) and [/lookup](Lookup.md)\nAPI calls produce very similar output which is explained in this section.\nThere is one section for each format. The format correspond to what was\nselected via the `format` parameter.\n\n## JSON\n\nThe JSON format returns an array of places (for search and lookup) or\na single place (for reverse) of the following format:\n\n```\n  {\n    \"place_id\": 100149,\n    \"licence\": \"Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright\",\n    \"osm_type\": \"node\",\n    \"osm_id\": \"107775\",\n    \"boundingbox\": [\"51.3473219\", \"51.6673219\", \"-0.2876474\", \"0.0323526\"],\n    \"lat\": \"51.5073219\",\n    \"lon\": \"-0.1276474\",\n    \"display_name\": \"London, Greater London, England, SW1A 2DU, United Kingdom\",\n    \"class\": \"place\",\n    \"type\": \"city\",\n    \"importance\": 0.9654895765402,\n    \"icon\": \"https://nominatim.openstreetmap.org/images/mapicons/poi_place_city.p.20.png\",\n    \"address\": {\n      \"city\": \"London\",\n      \"state_district\": \"Greater London\",\n      \"state\": \"England\",\n      \"ISO3166-2-lvl4\": \"GB-ENG\",\n      \"postcode\": \"SW1A 2DU\",\n      \"country\": \"United Kingdom\",\n      \"country_code\": \"gb\"\n    },\n    \"extratags\": {\n      \"capital\": \"yes\",\n      \"website\": \"http://www.london.gov.uk\",\n      \"wikidata\": \"Q84\",\n      \"wikipedia\": \"en:London\",\n      \"population\": \"8416535\"\n    }\n  }\n```\n\nThe possible fields are:\n\n * `place_id` - reference to the Nominatim internal database ID ([see notes](#place_id-is-not-a-persistent-id))\n * `osm_type`, `osm_id` - reference to the OSM object ([see notes](#osm-reference))\n * `boundingbox` - area of corner coordinates ([see notes](#boundingbox))\n * `lat`, `lon` - latitude and longitude of the centroid of the object\n * `display_name` - full comma-separated address\n * `class`, `type` - key and value of the main OSM tag\n * `importance` - computed importance rank\n * `icon` - link to class icon (if available)\n * `address` - dictionary of address details (only with `addressdetails=1`,\n   [see notes](#addressdetails))\n * `extratags` - dictionary with additional useful tags like website or maxspeed\n   (only with `extratags=1`)\n * `namedetails` - dictionary with full list of available names including ref etc.\n * `geojson`, `svg`, `geotext`, `geokml` - full geometry\n   (only with the appropriate `polygon_*` parameter)\n * `entrances` - array of objects representing tagged entrances for the object, or\n   null if none are found (only with `entrances=1`)\n\n## JSONv2\n\nThis is the same as the JSON format with two changes:\n\n * `class` renamed to `category`\n * additional field `place_rank` with the search rank of the object\n\n## GeoJSON\n\nThis format follows the [RFC7946](https://geojson.org). Every feature includes\na bounding box (`bbox`).\n\nThe properties object has the following fields:\n\n * `place_id` - reference to the Nominatim internal database ID ([see notes](#place_id-is-not-a-persistent-id))\n * `osm_type`, `osm_id` - reference to the OSM object ([see notes](#osm-reference))\n * `category`, `type` - key and value of the main OSM tag\n * `display_name` - full comma-separated address\n * `place_rank` - class search rank\n * `importance` - computed importance rank\n * `icon` - link to class icon (if available)\n * `address` - dictionary of address details (only with `addressdetails=1`,\n   [see notes](#addressdetails))\n * `extratags` - dictionary with additional useful tags like `website` or `maxspeed`\n   (only with `extratags=1`)\n * `namedetails` - dictionary with full list of available names including ref etc.\n * `entrances` - array of objects representing tagged entrances for the object, or\n   null if none are found (only with `entrances=1`)\n\nUse `polygon_geojson` to output the full geometry of the object instead\nof the centroid.\n\n## GeocodeJSON\n\nThe GeocodeJSON format follows the\n[GeocodeJSON spec 0.1.0](https://github.com/geocoders/geocodejson-spec).\nThe following feature attributes are implemented:\n\n * `osm_type`, `osm_id` - reference to the OSM object (unofficial extension, [see notes](#osm-reference))\n * `type` - the 'address level' of the object ('house', 'street', `district`, `city`,\n            `county`, `state`, `country`, `locality`)\n * `osm_key`- key of the main tag of the OSM object (e.g. boundary, highway, amenity)\n * `osm_value` - value of the main tag of the OSM object (e.g. residential, restaurant)\n * `label` - full comma-separated address\n * `name` - localised name of the place\n * `housenumber`, `street`, `locality`, `district`, `postcode`, `city`,\n   `county`, `state`, `country` -\n   provided when it can be determined from the address (only with `addressdetails=1`)\n * `admin` - list of localised names of administrative boundaries (only with `addressdetails=1`)\n * `extra` - dictionary with additional useful tags like `website` or `maxspeed`\n   (only with `extratags=1`)\n * `entrances` - array of objects representing tagged entrances for the object, or\n   null if none are found (only with `entrances=1`)\n\n\nUse `polygon_geojson` to output the full geometry of the object instead\nof the centroid.\n\n## XML\n\nThe XML response returns one or more place objects in slightly different\nformats depending on the API call.\n\n### Reverse\n\n```\n<reversegeocode timestamp=\"Sat, 11 Aug 18 11:53:21 +0000\"\n                attribution=\"Data © OpenStreetMap contributors, ODbL 1.0. https://www.openstreetmap.org/copyright\"\n                querystring=\"lat=48.400381&lon=11.745876&zoom=5&format=xml\">\n  <result place_id=\"179509537\" osm_type=\"relation\" osm_id=\"2145268\" ref=\"BY\" place_rank=\"15\" address_rank=\"15\"\n          lat=\"48.9467562\" lon=\"11.4038717\"\n          boundingbox=\"47.2701114,50.5647142,8.9763497,13.8396373\">\n       Bavaria, Germany\n  </result>\n  <addressparts>\n     <state>Bavaria</state>\n     <ISO3166-2-lvl4>DE-BY</ISO3166-2-lvl4>\n     <country>Germany</country>\n     <country_code>de</country_code>\n  </addressparts>\n  <extratags>\n    <tag key=\"place\" value=\"state\"/>\n    <tag key=\"wikidata\" value=\"Q980\"/>\n    <tag key=\"wikipedia\" value=\"de:Bayern\"/>\n    <tag key=\"population\" value=\"12520000\"/>\n    <tag key=\"name:prefix\" value=\"Freistaat\"/>\n  </extratags>\n</reversegeocode>\n```\n\nThe attributes of the outer `reversegeocode` element return generic information\nabout the query, including the time when the response was sent (in UTC),\nattribution to OSM and the original querystring.\n\nThe place information can be found in the `result` element. The attributes of that element contain:\n\n * `place_id` - reference to the Nominatim internal database ID ([see notes](#place_id-is-not-a-persistent-id))\n * `osm_type`, `osm_id` - reference to the OSM object ([see notes](#osm-reference))\n * `ref` - content of `ref` tag if it exists\n * `lat`, `lon` - latitude and longitude of the centroid of the object\n * `boundingbox` - comma-separated list of corner coordinates ([see notes](#boundingbox))\n\nThe full address of the result can be found in the content of the\n`result` element as a comma-separated list.\n\nAdditional information requested with `addressdetails=1`, `extratags=1`,\n`namedetails=1`, and `entrances=1` can be found in extra elements.\n\n### Search and Lookup\n\n```\n<searchresults timestamp=\"Sat, 11 Aug 18 11:55:35 +0000\"\n               attribution=\"Data © OpenStreetMap contributors, ODbL 1.0. https://www.openstreetmap.org/copyright\"\n               querystring=\"london\" polygon=\"false\" exclude_place_ids=\"N107775\"\n               more_url=\"https://nominatim.openstreetmap.org/search?q=london&addressdetails=1&extratags=1&exclude_place_ids=N107775&format=xml&accept-language=en-US%2Cen%3Bq%3D0.7%2Cde%3Bq%3D0.3\">\n  <place place_id=\"100149\" osm_type=\"node\" osm_id=\"107775\" place_rank=\"15\" address_rank=\"15\"\n         boundingbox=\"51.3473219,51.6673219,-0.2876474,0.0323526\" lat=\"51.5073219\" lon=\"-0.1276474\"\n         display_name=\"London, Greater London, England, SW1A 2DU, United Kingdom\"\n         class=\"place\" type=\"city\" importance=\"0.9654895765402\"\n         icon=\"https://nominatim.openstreetmap.org/images/mapicons/poi_place_city.p.20.png\">\n    <extratags>\n      <tag key=\"capital\" value=\"yes\"/>\n      <tag key=\"website\" value=\"http://www.london.gov.uk\"/>\n      <tag key=\"wikidata\" value=\"Q84\"/>\n      <tag key=\"wikipedia\" value=\"en:London\"/>\n      <tag key=\"population\" value=\"8416535\"/>\n    </extratags>\n    <city>London</city>\n    <state_district>Greater London</state_district>\n    <state>England</state>\n    <ISO3166-2-lvl4>GB-ENG</ISO3166-2-lvl4>\n    <postcode>SW1A 2DU</postcode>\n    <country>United Kingdom</country>\n    <country_code>gb</country_code>\n  </place>\n</searchresults>\n```\n\nThe attributes of the outer `searchresults` or `lookupresults` element return\ngeneric information about the query:\n\n * `timestamp` - UTC time when the response was sent\n * `attribution` - OSM licensing information\n * `querystring` - original query\n * `polygon` - true when extra geometry information was requested\n * `exclude_place_ids` - IDs of places that should be ignored in a follow-up request (OSM IDs where possible, otherwise `place_id`s)\n * `more_url` - search call that will yield additional results for the query\n   just sent\n\nThe place information can be found in the `place` elements, of which there may\nbe more than one. The attributes of that element contain:\n\n * `place_id` - reference to the Nominatim internal database ID ([see notes](#place_id-is-not-a-persistent-id))\n * `osm_type`, `osm_id` - reference to the OSM object ([see notes](#osm-reference))\n * `ref` - content of `ref` tag if it exists\n * `lat`, `lon` - latitude and longitude of the centroid of the object\n * `boundingbox` - comma-separated list of corner coordinates ([see notes](#boundingbox))\n * `place_rank` - class [search rank](../customize/Ranking.md#search-rank)\n * `address_rank` - place [address rank](../customize/Ranking.md#address-rank)\n * `display_name` - full comma-separated address\n * `class`, `type` - key and value of the main OSM tag\n * `importance` - computed importance rank\n * `icon` - link to class icon (if available)\n\nWhen `addressdetails=1` is requested, the localised address parts appear\nas subelements with the type of the address part.\n\nAdditional information requested with `extratags=1`, `namedetails=1`, and\n`entrances=1` can be found in extra elements as sub-element of `extratags`,\n`namedetails`, and `entrances` respectively.\n\n\n## Notes on field values\n\n### place_id is not a persistent id\n\nThe `place_id` is an internal identifier that is assigned data is imported\ninto a Nominatim database. The same OSM object will have a different value\non another server. It may even change its ID on the same server when it is\nremoved and reimported while updating the database with fresh OSM data.\nIt is thus not useful to treat it as permanent for later use.\n\nThe combination `osm_type`+`osm_id` is slightly better but remember in\nOpenStreetMap mappers can delete, split, recreate places (and those\nget a new `osm_id`), there is no link between those old and new ids.\nPlaces can also change their meaning without changing their `osm_id`,\ne.g. when a restaurant is retagged as supermarket. For a more in-depth\ndiscussion see [Permanent ID](https://wiki.openstreetmap.org/wiki/Permanent_ID).\n\nIf you need an ID that is consistent over multiple installations of Nominatim,\nthen you should use the combination of `osm_type`+`osm_id`+`class`.\n\n### OSM reference\n\nNominatim may sometimes return special objects that do not correspond directly\nto an object in OpenStreetMap. These are:\n\n* **Postcodes**. Nominatim returns an postcode point created from all mapped\n  postcodes of the same name. The class and type of these object is `place=postcdode`.\n  No `osm_type` and `osm_id` are included in the result.\n* **Housenumber interpolations**. Nominatim returns a single interpolated\n  housenumber from the interpolation way. The class and type are `place=house`\n  and `osm_type` and `osm_id` correspond to the interpolation way in OSM.\n* **TIGER housenumber.** Nominatim returns a single interpolated housenumber\n  from the TIGER data. The class and type are `place=house`\n  and `osm_type` and `osm_id` correspond to the street mentioned in the result.\n\nPlease note that the `osm_type` and `osm_id` returned may be changed in the\nfuture. You should not expect to only find `node`, `way` and `relation` for\nthe type.\n\n### boundingbox\n\nComma separated list of min latitude, max latitude, min longitude, max longitude.\nThe whole planet would be `-90,90,-180,180`.\n\nCan be used to pan and center the map on the result, for example with leafletjs\nmapping library\n`map.fitBounds([[bbox[0],bbox[2]],[bbox[1],bbox[3]]], {padding: [20, 20], maxzoom: 16});`\n\nBounds crossing the antimeridian have a min latitude -180 and max latitude 180,\nessentially covering the entire planet\n(see [issue 184](https://github.com/openstreetmap/Nominatim/issues/184)).\n\n### addressdetails\n\nAddress details in the xml and json formats return a list of names together\nwith a designation label. Per default the following labels may appear:\n\n * continent\n * country, country_code\n * region, state, state_district, county, ISO3166-2-lvl<admin_level>\n * municipality, city, town, village\n * city_district, district, borough, suburb, subdivision\n * hamlet, croft, isolated_dwelling\n * neighbourhood, allotments, quarter\n * city_block, residential, farm, farmyard, industrial, commercial, retail\n * road\n * house_number, house_name\n * emergency, historic, military, natural, landuse, place, railway,\n   man_made, aerialway, boundary, amenity, aeroway, club, craft, leisure,\n   office, mountain_pass, shop, tourism, bridge, tunnel, waterway\n * postcode\n\nThey roughly correspond to the classification of the OpenStreetMap data\naccording to either the `place` tag or the main key of the object.\n\n### entrances\n\nEntrance details in the xml and json formats return the latitude and longitude\nof the entrance, the osm node ID, the [type of\nentrance](https://wiki.openstreetmap.org/wiki/Key:entrance), and any extra tags\nassociated with the entrance node.\n\n * osm_id\n * type\n * lat\n * lon\n * extratags\n\nThey roughly correspond to the classification of the OpenStreetMap data\naccording to either the `place` tag or the main key of the object.\n\n#### Example\n\n##### JSON\n\n[https://nominatim.openstreetmap.org/details?osmtype=W&osmid=32619803&entrances=1&format=json](https://nominatim.openstreetmap.org/details?osmtype=W&osmid=32619803&entrances=1&format=json)\n\n\n```json\n{\n  \"place_id\": 124325848,\n  \"parent_place_id\": 123936289,\n  \"osm_type\": \"W\",\n  \"osm_id\": 32619803,\n  \"category\": \"shop\",\n  \"type\": \"supermarket\",\n  \"admin_level\": 15,\n  \"localname\": \"PENNY\",\n  ...\n  \"entrances\": [\n    {\n      \"osm_id\": 1733488238,\n      \"type\": \"yes\",\n      \"lat\": \"51.0466704\",\n      \"lon\": \"12.8077106\",\n      \"extratags\": {\n        \"foot\": \"yes\"\n      }\n    },\n    {\n      \"osm_id\": 1733488256,\n      \"type\": \"main\",\n      \"lat\": \"51.0467197\",\n      \"lon\": \"12.8078448\",\n      \"extratags\": {\n        \"foot\": \"yes\"\n      }\n    },\n    {\n      \"osm_id\": 1733498087,\n      \"type\": \"exit\",\n      \"lat\": \"51.0467081\",\n      \"lon\": \"12.8078131\",\n      \"extratags\": {\n        \"foot\": \"yes\"\n      }\n    },\n    {\n      \"osm_id\": 7914950851,\n      \"type\": \"service\",\n      \"lat\": \"51.0468487\",\n      \"lon\": \"12.8075876\",\n      \"extratags\": {\n        \"access\": \"delivery\"\n      }\n    }\n  ]\n}\n```\n"
  },
  {
    "path": "docs/api/Overview.md",
    "content": "This section describes the API V1 of the Nominatim web service. The\nservice offers the following endpoints:\n\n * __[/search](Search.md)__ - search OSM objects by name or type\n * __[/reverse](Reverse.md)__ - search OSM object by their location\n * __[/lookup](Lookup.md)__ - look up address details for OSM objects by their ID\n * __[/status](Status.md)__ - query the status of the server\n * __/deletable__ - list objects that have been deleted in OSM but are held\n                    back in Nominatim in case the deletion was accidental\n * __/polygons__ - list of broken polygons detected by Nominatim\n * __[/details](Details.md)__ - show internal details for an object (for debugging only)\n\n\n\n"
  },
  {
    "path": "docs/api/Reverse.md",
    "content": "# Reverse Geocoding\n\nReverse geocoding generates an address from a coordinate given as\nlatitude and longitude.\n\n## How it works\n\nThe reverse geocoding API does not exactly compute the address for the\ncoordinate it receives. It works by finding the closest suitable OSM object\nand returning its address information. This may occasionally lead to\nunexpected results.\n\nFirst of all, Nominatim only includes OSM objects in\nits index that are suitable for searching. Small, unnamed paths for example\nare missing from the database and can therefore not be used for reverse\ngeocoding either.\n\nThe other issue to be aware of is that the closest OSM object may not always\nhave a similar enough address to the coordinate you were requesting. For\nexample, in dense city areas it may belong to a completely different street.\n\n## Endpoint\n\nThe main format of the reverse API is\n\n```\nhttps://nominatim.openstreetmap.org/reverse?lat=<value>&lon=<value>&<params>\n```\n\nwhere `lat` and `lon` are latitude and longitude of a coordinate in WGS84\nprojection. The API returns exactly one result or an error when the coordinate\nis in an area with no OSM data coverage.\n\n\n!!! tip\n    The reverse API allows a lookup of object by coordinate. If you want\n    to look up an object by ID, use the [Address Lookup API](Lookup.md) instead.\n\n!!! danger \"Deprecation warning\"\n    The API can also be used with the URL\n    `https://nominatim.openstreetmap.org/reverse.php`. This is now deprecated\n    and will be removed in future versions.\n\n\n## Parameters\n\nThis section lists additional parameters to further influence the output.\n\n### Output format\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| format    | one of: `xml`, `json`, `jsonv2`, `geojson`, `geocodejson` | `xml` |\n\nSee [Place Output Formats](Output.md) for details on each format.\n\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| json_callback | function name | _unset_ |\n\nWhen given, then JSON output will be wrapped in a callback function with\nthe given name. See [JSONP](https://en.wikipedia.org/wiki/JSONP) for more\ninformation.\n\nOnly has an effect for JSON output formats.\n\n\n### Output details\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| addressdetails | 0 or 1 | 1 |\n\nWhen set to 1, include a breakdown of the address into elements.\nThe exact content of the address breakdown depends on the output format.\n\n!!! tip\n    If you are interested in a stable classification of address categories\n    (suburb, city, state, etc), have a look at the `geocodejson` format.\n    All other formats return classifications according to OSM tagging.\n    There is a much larger set of categories and they are not always consistent,\n    which makes them very hard to work with.\n\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| extratags | 0 or 1 | 0 |\n\nWhen set to 1, the response include any additional information in the result\nthat is available in the database, e.g. wikipedia link, opening hours.\n\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| namedetails | 0 or 1 | 0 |\n\nWhen set to 1, include a full list of names for the result. These may include\nlanguage variants, older names, references and brand.\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| entrances | 0 or 1 | 0 |\n\nWhen set to 1, include the tagged entrances in the result.\n\n\n### Language of results\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| accept-language | browser language string | content of \"Accept-Language\" HTTP header |\n\nPreferred language order for showing search results. This may either be\na simple comma-separated list of language codes or have the same format\nas the [\"Accept-Language\" HTTP header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language).\n\n!!! tip\n    First-time users of Nominatim tend to be confused that they get different\n    results when using Nominatim in the browser versus in a command-line tool\n    like wget or curl. The command-line tools\n    usually don't send any Accept-Language header, prompting Nominatim\n    to show results in the local language. Browsers on the contrary always\n    send the currently chosen browser language.\n\n\n### Result restriction\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| zoom      | 0-18  | 18      |\n\nLevel of detail required for the address. This is a number that\ncorresponds roughly to the zoom level used in XYZ tile sources in frameworks\nlike Leaflet.js, Openlayers etc.\nIn terms of address details the zoom levels are as follows:\n\n zoom | address detail\n -----|---------------\n  3   | country\n  5   | state\n  8   | county\n  10  | city\n  12  | town / borough\n  13  | village / suburb\n  14  | neighbourhood\n  15  | any settlement\n  16  | major streets\n  17  | major and minor streets\n  18  | building\n\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| layer     | comma-separated list of: `address`, `poi`, `railway`, `natural`, `manmade` | `address,poi` |\n\nThe layer filter allows to select places by themes.\n\nThe `address` layer contains all places that make up an address:\naddress points with house numbers, streets, inhabited places (suburbs, villages,\ncities, states etc.) and administrative boundaries.\n\nThe `poi` layer selects all point of interest. This includes classic points\nof interest like restaurants, shops, hotels but also less obvious features\nlike recycling bins, guideposts or benches.\n\nThe `railway` layer includes railway infrastructure like tracks.\nNote that in Nominatim's standard configuration, only very few railway\nfeatures are imported into the database.\n\nThe `natural` layer collects features like rivers, lakes and mountains while\nthe `manmade` layer functions as a catch-all for features not covered by the\nother layers.\n\n\n### Polygon output\n\n| Parameter | Value  | Default |\n|-----------| -----  | ------- |\n| polygon_geojson | 0 or 1 | 0 |\n| polygon_kml     | 0 or 1 | 0 |\n| polygon_svg     | 0 or 1 | 0 |\n| polygon_text    | 0 or 1 | 0 |\n\nAdd the full geometry of the place to the result output. Output formats\nin GeoJSON, KML, SVG or WKT are supported. Only one of these\noptions can be used at a time.\n\n| Parameter | Value  | Default |\n|-----------| -----  | ------- |\n| polygon_threshold | floating-point number | 0.0 |\n\nWhen one of the polygon_* outputs is chosen, return a simplified version\nof the output geometry. The parameter describes the\ntolerance in degrees with which the geometry may differ from the original\ngeometry. Topology is preserved in the geometry.\n\n\n### Other\n\n| Parameter | Value  | Default |\n|-----------| -----  | ------- |\n| email     | valid email address | _unset_ |\n\nIf you are making large numbers of request please include an appropriate email\naddress to identify your requests. See Nominatim's\n[Usage Policy](https://operations.osmfoundation.org/policies/nominatim/) for more details.\n\n\n| Parameter | Value  | Default |\n|-----------| -----  | ------- |\n| debug     | 0 or 1 | 0       |\n\nOutput assorted developer debug information. Data on internals of Nominatim's\n\"search loop\" logic, and SQL queries. The output is HTML format.\nThis overrides the specified machine readable format.\n\n\n## Examples\n\n* [https://nominatim.openstreetmap.org/reverse?format=xml&lat=52.5487429714954&lon=-1.81602098644987&zoom=18&addressdetails=1&layer=address](https://nominatim.openstreetmap.org/reverse?format=xml&lat=52.5487429714954&lon=-1.81602098644987&zoom=18&addressdetails=1&layer=address)\n\n```xml\n  <reversegeocode timestamp=\"Fri, 06 Nov 09 16:33:54 +0000\" querystring=\"...\">\n    <result place_id=\"1620612\" osm_type=\"node\" osm_id=\"452010817\">\n      135, Pilkington Avenue, Wylde Green, City of Birmingham, West Midlands (county), B72, United Kingdom\n    </result>\n    <addressparts>\n      <house_number>135</house_number>\n      <road>Pilkington Avenue</road>\n      <village>Wylde Green</village>\n      <town>Sutton Coldfield</town>\n      <city>City of Birmingham</city>\n      <county>West Midlands (county)</county>\n      <postcode>B72</postcode>\n      <country>United Kingdom</country>\n      <country_code>gb</country_code>\n    </addressparts>\n  </reversegeocode>\n```\n\n##### Example with `format=jsonv2`\n\n* [https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=-34.44076&lon=-58.70521&layer=address](https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=-34.44076&lon=-58.70521&layer=address)\n\n```json\n{\n  \"place_id\":\"134140761\",\n  \"licence\":\"Data © OpenStreetMap contributors, ODbL 1.0. https:\\/\\/www.openstreetmap.org\\/copyright\",\n  \"osm_type\":\"way\",\n  \"osm_id\":\"280940520\",\n  \"lat\":\"-34.4391708\",\n  \"lon\":\"-58.7064573\",\n  \"place_rank\":\"26\",\n  \"category\":\"highway\",\n  \"type\":\"motorway\",\n  \"importance\":\"0.1\",\n  \"addresstype\":\"road\",\n  \"display_name\":\"Autopista Pedro Eugenio Aramburu, El Triángulo, Partido de Malvinas Argentinas, Buenos Aires, 1.619, Argentina\",\n  \"name\":\"Autopista Pedro Eugenio Aramburu\",\n  \"address\":{\n    \"road\":\"Autopista Pedro Eugenio Aramburu\",\n    \"village\":\"El Triángulo\",\n    \"state_district\":\"Partido de Malvinas Argentinas\",\n    \"state\":\"Buenos Aires\",\n    \"postcode\":\"1.619\",\n    \"country\":\"Argentina\",\n    \"country_code\":\"ar\"\n  },\n  \"boundingbox\":[\"-34.44159\",\"-34.4370994\",\"-58.7086067\",\"-58.7044712\"]\n}\n```\n\n##### Example with `format=geojson`\n\n* [https://nominatim.openstreetmap.org/reverse?format=geojson&lat=44.50155&lon=11.33989&layer=address](https://nominatim.openstreetmap.org/reverse?format=geojson&lat=44.50155&lon=11.33989&layer=address)\n\n```json\n{\n  \"type\": \"FeatureCollection\",\n  \"licence\": \"Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright\",\n  \"features\": [\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"place_id\": \"18512203\",\n        \"osm_type\": \"node\",\n        \"osm_id\": \"1704756187\",\n        \"place_rank\": \"30\",\n        \"category\": \"place\",\n        \"type\": \"house\",\n        \"importance\": \"0\",\n        \"addresstype\": \"place\",\n        \"name\": null,\n        \"display_name\": \"71, Via Guglielmo Marconi, Saragozza-Porto, Bologna, BO, Emilia-Romagna, 40122, Italy\",\n        \"address\": {\n          \"house_number\": \"71\",\n          \"road\": \"Via Guglielmo Marconi\",\n          \"suburb\": \"Saragozza-Porto\",\n          \"city\": \"Bologna\",\n          \"county\": \"BO\",\n          \"state\": \"Emilia-Romagna\",\n          \"postcode\": \"40122\",\n          \"country\": \"Italy\",\n          \"country_code\": \"it\"\n        }\n      },\n      \"bbox\": [\n        11.3397676,\n        44.5014307,\n        11.3399676,\n        44.5016307\n      ],\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          11.3398676,\n          44.5015307\n        ]\n      }\n    }\n  ]\n}\n```\n\n##### Example with `format=geocodejson`\n\n[https://nominatim.openstreetmap.org/reverse?format=geocodejson&lat=60.2299&lon=11.1663&layer=address](https://nominatim.openstreetmap.org/reverse?format=geocodejson&lat=60.2299&lon=11.1663&layer=address)\n\n```json\n{\n  \"type\": \"FeatureCollection\",\n  \"geocoding\": {\n    \"version\": \"0.1.0\",\n    \"attribution\": \"Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright\",\n    \"licence\": \"ODbL\",\n    \"query\": \"60.229917843587,11.16630979382\"\n  },\n  \"features\": {\n    \"type\": \"Feature\",\n    \"properties\": {\n      \"geocoding\": {\n        \"place_id\": \"42700574\",\n        \"osm_type\": \"node\",\n        \"osm_id\": \"3110596255\",\n        \"type\": \"house\",\n        \"accuracy\": 0,\n        \"label\": \"1, Løvenbergvegen, Mogreina, Ullensaker, Akershus, 2054, Norway\",\n        \"name\": null,\n        \"housenumber\": \"1\",\n        \"street\": \"Løvenbergvegen\",\n        \"postcode\": \"2054\",\n        \"county\": \"Akershus\",\n        \"country\": \"Norway\",\n        \"admin\": {\n          \"level7\": \"Ullensaker\",\n          \"level4\": \"Akershus\",\n          \"level2\": \"Norway\"\n        }\n      }\n    },\n    \"geometry\": {\n      \"type\": \"Point\",\n      \"coordinates\": [\n        11.1658572,\n        60.2301296\n      ]\n    }\n  }\n}\n```\n\n"
  },
  {
    "path": "docs/api/Search.md",
    "content": "# Search queries\n\nThe search API allows you to look up a location from a textual description\nor address. Nominatim supports structured and free-form search queries.\n\nThe search query may also contain\n[special phrases](https://wiki.openstreetmap.org/wiki/Nominatim/Special_Phrases)\nwhich are translated into specific OpenStreetMap (OSM) tags (e.g. Pub => `amenity=pub`).\nThis can be used to narrow down the kind of objects to be returned.\n\n!!! note\n    Special phrases are not suitable to query all objects of a certain type in an\n    area. Nominatim will always just return a collection of the best matches. To\n    download OSM data by object type, use the [Overpass API](https://overpass-api.de/).\n\n## Endpoint\n\nThe search API has the following format:\n\n```\n   https://nominatim.openstreetmap.org/search?<params>\n```\n\n!!! danger \"Deprecation warning\"\n    The API can also be used with the URL\n    `https://nominatim.openstreetmap.org/search.php`. This is now deprecated\n    and will be removed in future versions.\n\nThe query term can be given in two different forms: free-form or structured.\n\n### Free-form query\n\n| Parameter | Value |\n|-----------| ----- |\n| q         | Free-form query string to search for |\n\nIn this form, the query can be unstructured.\nFree-form queries are processed first left-to-right and then right-to-left if that fails. So you may search for\n[pilkington avenue, birmingham](https://nominatim.openstreetmap.org/search?q=pilkington+avenue,birmingham) as well as for\n[birmingham, pilkington avenue](https://nominatim.openstreetmap.org/search?q=birmingham,+pilkington+avenue).\nCommas are optional, but improve performance by reducing the complexity of the search.\n\nThe free-form may also contain special phrases to describe the type of\nplace to be returned or a coordinate to search close to a position.\n\n### Structured query\n\n| Parameter  | Value |\n|----------- | ----- |\n| amenity    | name and/or type of POI |\n| street     | housenumber and streetname |\n| city       | city |\n| county     | county |\n| state      | state |\n| country    | country |\n| postalcode | postal code |\n\nThe structured form of the search query allows to lookup up an address\nthat is already split into its components. Each parameter represents a field\nof the address. All parameters are optional. You should only use the ones\nthat are relevant for the address you want to geocode.\n\n!!! Attention\n    Cannot be combined with the `q=<query>` parameter. Newer versions of\n    the API will return an error if you do so. Older versions simply return\n    unexpected results.\n\n## Parameters\n\nThe following parameters can be used to further restrict the search and\nchange the output. They are usable for both forms of the search query.\n\n### Output format\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| format    | one of: `xml`, `json`, `jsonv2`, `geojson`, `geocodejson` | `jsonv2` |\n\nSee [Place Output Formats](Output.md) for details on each format.\n\n!!! note\n    The Nominatim service at\n    [https://nominatim.openstreetmap.org](https://nominatim.openstreetmap.org)\n    has a different default behaviour for historical reasons. When the\n    `format` parameter is omitted, the request will be forwarded to the Web UI.\n\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| json_callback | function name | _unset_ |\n\nWhen given, then JSON output will be wrapped in a callback function with\nthe given name. See [JSONP](https://en.wikipedia.org/wiki/JSONP) for more\ninformation.\n\nOnly has an effect for JSON output formats.\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| limit     | number | 10 |\n\nLimit the maximum number of returned results. Cannot be more than 40.\nNominatim may decide to return less results than given, if additional\nresults do not sufficiently match the query.\n\n\n### Output details\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| addressdetails | 0 or 1 | 0 |\n\nWhen set to 1, include a breakdown of the address into elements.\nThe exact content of the address breakdown depends on the output format.\n\n!!! tip\n    If you are interested in a stable classification of address categories\n    (suburb, city, state, etc), have a look at the `geocodejson` format.\n    All other formats return classifications according to OSM tagging.\n    There is a much larger set of categories and they are not always consistent,\n    which makes them very hard to work with.\n\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| extratags | 0 or 1 | 0 |\n\nWhen set to 1, the response include any additional information in the result\nthat is available in the database, e.g. wikipedia link, opening hours.\n\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| namedetails | 0 or 1 | 0 |\n\nWhen set to 1, include a full list of names for the result. These may include\nlanguage variants, older names, references and brand.\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| entrances | 0 or 1 | 0 |\n\nWhen set to 1, include the tagged entrances in the result.\n\n\n### Language of results\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| accept-language | browser language string | content of \"Accept-Language\" HTTP header |\n\nPreferred language order for showing search results. This may either be\na simple comma-separated list of language codes or have the same format\nas the [\"Accept-Language\" HTTP header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language).\n\n!!! tip\n    First-time users of Nominatim tend to be confused that they get different\n    results when using Nominatim in the browser versus in a command-line tool\n    like wget or curl. The command-line tools\n    usually don't send any Accept-Language header, prompting Nominatim\n    to show results in the local language. Browsers on the contrary always\n    send the currently chosen browser language.\n\n### Result restriction\n\nThere are two ways to influence the results. *Filters* exclude certain\nkinds of results completely. *Boost parameters* only change the order of the\nresults and thus give a preference to some results over others.\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| countrycodes | comma-separated list of country codes | _unset_ |\n\nFilter that limits the search results to one or more countries.\nThe country code must be the\n[ISO 3166-1alpha2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) code\nof the country, e.g. `gb` for the United Kingdom, `de` for Germany.\n\nEach place in Nominatim is assigned to one country code based\non OSM country boundaries. In rare cases a place may not be in any country\nat all, for example, when it is in international waters. These places are\nalso excluded when the filter is set.\n\n!!! Note\n    This parameter should not be confused with the 'country' parameter of\n    the structured query. The 'country' parameter contains a search term\n    and will be handled with some fuzziness. The `countrycodes` parameter\n    is a hard filter and as such should be preferred. Having both parameters\n    in the same query will work. If the parameters contradict each other,\n    the search will come up empty.\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| layer     | comma-separated list of: `address`, `poi`, `railway`, `natural`, `manmade` | _unset_ (no restriction) |\n\nThe layer filter allows to select places by themes.\n\nThe `address` layer contains all places that make up an address:\naddress points with house numbers, streets, inhabited places (suburbs, villages,\ncities, states tec.) and administrative boundaries.\n\nThe `poi` layer selects all point of interest. This includes classic POIs like\nrestaurants, shops, hotels but also less obvious features like recycling bins,\nguideposts or benches.\n\nThe `railway` layer includes railway infrastructure like tracks.\nNote that in Nominatim's standard configuration, only very few railway\nfeatures are imported into the database.\n\nThe `natural` layer collects features like rivers, lakes and mountains while\nthe `manmade` layer functions as a catch-all for features not covered by the\nother layers.\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| featureType | one of: `country`, `state`, `city`, `settlement` | _unset_ |\n\nThe featureType allows to have a more fine-grained selection for places\nfrom the address layer. Results can be restricted to places that make up\nthe 'state', 'country' or 'city' part of an address. A featureType of\n`settlement` selects any human inhabited feature from 'state' down to\n'neighbourhood'.\n\nWhen featureType is set, then results are automatically restricted\nto the address layer (see above).\n\n!!! tip\n    Instead of using the featureType filters `country`, `state` or `city`,\n    you can also use a structured query without the finer-grained parameters\n    amenity or street.\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| exclude_place_ids | comma-separated list of ids (OSM IDs where possible, otherwise place_ids) |\n\nIf you do not want certain OSM objects to appear in the search\nresult, give a comma separated list of the ids you want to skip.\n\nEach entry may be one of:\n\n* a Nominatim internal `place_id` (for example `125279639`)\n* an OSM object reference in the form `<osm_type><osm_id>` where `<osm_type>` is one of `N` (node), `W` (way) or `R` (relation), for example `N107775`\n\nUsage of OSM IDs is recommended because they are server independent. `place_id`s are stil required for results without an OSM object reference (for example, postcodes and countries). When a street is excluded via its OSM ID, then interpolations and TIGER data derived from that street are excluded as well.\n\nThis can be used to retrieve additional search results. For example, if a\nprevious query only returned a few results, then including those here would\ncause the search to return other, less accurate, matches (if possible).\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| viewbox   | `<x1>,<y1>,<x2>,<y2>` | _unset_ |\n\nBoost parameter which focuses the search on the given area.\nAny two corner points of the box are accepted as long as they make a proper\nbox. `x` is longitude, `y` is latitude.\n\n| Parameter | Value  | Default |\n|-----------| -----  | ------- |\n| bounded   | 0 or 1 | 0       |\n\nWhen set to 1, then it turns the 'viewbox' parameter (see above) into\na filter parameter, excluding any results outside the viewbox.\n\nWhen `bounded=1` is given and the viewbox is small enough, then an amenity-only\nsearch is allowed. Give the special keyword for the amenity in square\nbrackets, e.g. `[pub]` and a selection of objects of this type is returned.\nThere is no guarantee that the result returns all objects in the area.\n\n\n### Polygon output\n\n| Parameter | Value  | Default |\n|-----------| -----  | ------- |\n| polygon_geojson | 0 or 1 | 0 |\n| polygon_kml     | 0 or 1 | 0 |\n| polygon_svg     | 0 or 1 | 0 |\n| polygon_text    | 0 or 1 | 0 |\n\nAdd the full geometry of the place to the result output. Output formats\nin GeoJSON, KML, SVG or WKT are supported. Only one of these\noptions can be used at a time.\n\n| Parameter | Value  | Default |\n|-----------| -----  | ------- |\n| polygon_threshold | floating-point number | 0.0 |\n\nWhen one of the polygon_* outputs is chosen, return a simplified version\nof the output geometry. The parameter describes the\ntolerance in degrees with which the geometry may differ from the original\ngeometry. Topology is preserved in the geometry.\n\n### Other\n\n| Parameter | Value  | Default |\n|-----------| -----  | ------- |\n| email     | valid email address | _unset_ |\n\nIf you are making large numbers of request please include an appropriate email\naddress to identify your requests. See Nominatim's\n[Usage Policy](https://operations.osmfoundation.org/policies/nominatim/) for more details.\n\n| Parameter | Value  | Default |\n|-----------| -----  | ------- |\n| dedupe    | 0 or 1 | 1       |\n\nSometimes you have several objects in OSM identifying the same place or\nobject in reality. The simplest case is a street being split into many\ndifferent OSM ways due to different characteristics. Nominatim will\nattempt to detect such duplicates and only return one match. Setting\nthis parameter to 0 disables this deduplication mechanism and\nensures that all results are returned.\n\n| Parameter | Value  | Default |\n|-----------| -----  | ------- |\n| debug     | 0 or 1 | 0       |\n\nOutput assorted developer debug information. Data on internals of Nominatim's\n\"search loop\" logic, and SQL queries. The output is HTML format.\nThis overrides the specified machine readable format.\n\n\n## Examples\n\n\n##### XML with KML polygon\n\n* [https://nominatim.openstreetmap.org/search?q=135+pilkington+avenue,+birmingham&format=xml&polygon_kml=1&addressdetails=1](https://nominatim.openstreetmap.org/search?q=135+pilkington+avenue,+birmingham&format=xml&polygon_kml=1&addressdetails=1)\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<searchresults timestamp=\"Tue, 08 Aug 2023 15:45:41 +00:00\"\n               attribution=\"Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright\"\n               querystring=\"135 pilkington avenue, birmingham\"\n               more_url=\"https://nominatim.openstreetmap.org/search?q=135+pilkington+avenue%2C+birmingham&amp;polygon_kml=1&amp;addressdetails=1&amp;limit=20&amp;exclude_place_ids=W90394480&amp;format=xml\"\n               exclude_place_ids=\"W90394480\">\n  <place place_id=\"125279639\"\n         osm_type=\"way\"\n         osm_id=\"90394480\"\n         lat=\"52.5487921\"\n         lon=\"-1.8164308\"\n         boundingbox=\"52.5487473,52.5488481,-1.8165130,-1.8163464\"\n         place_rank=\"30\"\n         address_rank=\"30\"\n         display_name=\"135, Pilkington Avenue, Maney, Sutton Coldfield, Wylde Green, Birmingham, West Midlands Combined Authority, England, B72 1LH, United Kingdom\"\n         class=\"building\"\n         type=\"residential\"\n         importance=\"9.999999994736442e-08\">\n    <geokml>\n      <Polygon>\n        <outerBoundaryIs>\n          <LinearRing>\n            <coordinates>-1.816513,52.5487566 -1.816434,52.5487473 -1.816429,52.5487629 -1.8163717,52.5487561 -1.8163464,52.5488346 -1.8164599,52.5488481 -1.8164685,52.5488213 -1.8164913,52.548824 -1.816513,52.5487566</coordinates>\n          </LinearRing>\n        </outerBoundaryIs>\n      </Polygon>\n    </geokml>\n    <house_number>135</house_number>\n    <road>Pilkington Avenue</road>\n    <hamlet>Maney</hamlet>\n    <town>Sutton Coldfield</town>\n    <village>Wylde Green</village>\n    <city>Birmingham</city>\n    <ISO3166-2-lvl8>GB-BIR</ISO3166-2-lvl8>\n    <state_district>West Midlands Combined Authority</state_district>\n    <state>England</state>\n    <ISO3166-2-lvl4>GB-ENG</ISO3166-2-lvl4>\n    <postcode>B72 1LH</postcode>\n    <country>United Kingdom</country>\n    <country_code>gb</country_code>\n  </place>\n</searchresults>\n```\n\n##### JSON with SVG polygon\n\n[https://nominatim.openstreetmap.org/search?q=Unter%20den%20Linden%201%20Berlin&format=json&addressdetails=1&limit=1&polygon_svg=1](https://nominatim.openstreetmap.org/search?q=Unter%20den%20Linden%201%20Berlin&format=json&addressdetails=1&limit=1&polygon_svg=1)\n\n```json\n[\n  {\n    \"address\": {\n      \"ISO3166-2-lvl4\": \"DE-BE\",\n      \"borough\": \"Mitte\",\n      \"city\": \"Berlin\",\n      \"country\": \"Deutschland\",\n      \"country_code\": \"de\",\n      \"historic\": \"Kommandantenhaus\",\n      \"house_number\": \"1\",\n      \"neighbourhood\": \"Friedrichswerder\",\n      \"postcode\": \"10117\",\n      \"road\": \"Unter den Linden\",\n      \"suburb\": \"Mitte\"\n    },\n    \"boundingbox\": [\n      \"52.5170798\",\n      \"52.5173311\",\n      \"13.3975116\",\n      \"13.3981577\"\n    ],\n    \"class\": \"historic\",\n    \"display_name\": \"Kommandantenhaus, 1, Unter den Linden, Friedrichswerder, Mitte, Berlin, 10117, Deutschland\",\n    \"importance\": 0.8135042058306902,\n    \"lat\": \"52.51720765\",\n    \"licence\": \"Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright\",\n    \"lon\": \"13.397834399325466\",\n    \"osm_id\": 15976890,\n    \"osm_type\": \"way\",\n    \"place_id\": 108681845,\n    \"svg\": \"M 13.3975116 -52.5172905 L 13.397549 -52.5170798 13.397715 -52.5170906 13.3977122 -52.5171064 13.3977392 -52.5171086 13.3977417 -52.5170924 13.3979655 -52.5171069 13.3979623 -52.5171233 13.3979893 -52.5171248 13.3979922 -52.5171093 13.3981577 -52.5171203 13.398121 -52.5173311 13.3978115 -52.5173103 Z\",\n    \"type\": \"house\"\n  }\n]\n```\n\n##### JSON with address details\n\n[https://nominatim.openstreetmap.org/search?addressdetails=1&q=bakery+in+berlin+wedding&format=jsonv2&limit=1](https://nominatim.openstreetmap.org/search?addressdetails=1&q=bakery+in+berlin+wedding&format=jsonv2&limit=1)\n\n```json\n[\n  {\n    \"address\": {\n      \"ISO3166-2-lvl4\": \"DE-BE\",\n      \"borough\": \"Mitte\",\n      \"city\": \"Berlin\",\n      \"country\": \"Deutschland\",\n      \"country_code\": \"de\",\n      \"neighbourhood\": \"Sprengelkiez\",\n      \"postcode\": \"13347\",\n      \"road\": \"Lindower Straße\",\n      \"shop\": \"Ditsch\",\n      \"suburb\": \"Wedding\"\n    },\n    \"addresstype\": \"shop\",\n    \"boundingbox\": [\n      \"52.5427201\",\n      \"52.5427654\",\n      \"13.3668619\",\n      \"13.3669442\"\n    ],\n    \"category\": \"shop\",\n    \"display_name\": \"Ditsch, Lindower Straße, Sprengelkiez, Wedding, Mitte, Berlin, 13347, Deutschland\",\n    \"importance\": 9.99999999995449e-06,\n    \"lat\": \"52.54274275\",\n    \"licence\": \"Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright\",\n    \"lon\": \"13.36690305710228\",\n    \"name\": \"Ditsch\",\n    \"osm_id\": 437595031,\n    \"osm_type\": \"way\",\n    \"place_id\": 204751033,\n    \"place_rank\": 30,\n    \"type\": \"bakery\"\n  }\n]\n```\n\n##### GeoJSON\n\n[https://nominatim.openstreetmap.org/search?q=17+Strada+Pictor+Alexandru+Romano%2C+Bukarest&format=geojson](https://nominatim.openstreetmap.org/search?q=17+Strada+Pictor+Alexandru+Romano%2C+Bukarest&format=geojson)\n\n```json\n{\n  \"type\": \"FeatureCollection\",\n  \"licence\": \"Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright\",\n  \"features\": [\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"place_id\": \"35811445\",\n        \"osm_type\": \"node\",\n        \"osm_id\": \"2846295644\",\n        \"display_name\": \"17, Strada Pictor Alexandru Romano, Bukarest, Bucharest, Sector 2, Bucharest, 023964, Romania\",\n        \"place_rank\": \"30\",\n        \"category\": \"place\",\n        \"type\": \"house\",\n        \"importance\": 0.62025\n      },\n      \"bbox\": [\n        26.1156689,\n        44.4354754,\n        26.1157689,\n        44.4355754\n      ],\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          26.1157189,\n          44.4355254\n        ]\n      }\n    }\n  ]\n}\n```\n\n##### GeocodeJSON\n\n[https://nominatim.openstreetmap.org/search?q=%CE%91%CE%B3%CE%AF%CE%B1+%CE%A4%CF%81%CE%B9%CE%AC%CE%B4%CE%B1%2C+%CE%91%CE%B4%CF%89%CE%BD%CE%B9%CE%B4%CE%BF%CF%82%2C+Athens%2C+Greece&format=geocodejson](https://nominatim.openstreetmap.org/search?q=%CE%91%CE%B3%CE%AF%CE%B1+%CE%A4%CF%81%CE%B9%CE%AC%CE%B4%CE%B1%2C+%CE%91%CE%B4%CF%89%CE%BD%CE%B9%CE%B4%CE%BF%CF%82%2C+Athens%2C+Greece&format=geocodejson)\n\n```json\n{\n  \"type\": \"FeatureCollection\",\n  \"geocoding\": {\n    \"version\": \"0.1.0\",\n    \"attribution\": \"Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright\",\n    \"licence\": \"ODbL\",\n    \"query\": \"Αγία Τριάδα, Αδωνιδος, Athens, Greece\"\n  },\n  \"features\": [\n    {\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"geocoding\": {\n          \"type\": \"place_of_worship\",\n          \"label\": \"Αγία Τριάδα, Αδωνιδος, Άγιος Νικόλαος, 5º Δημοτικό Διαμέρισμα Αθηνών, Athens, Municipality of Athens, Regional Unit of Central Athens, Region of Attica, Attica, 11472, Greece\",\n          \"name\": \"Αγία Τριάδα\",\n          \"admin\": null\n        }\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          23.72949633941,\n          38.0051697\n        ]\n      }\n    }\n  ]\n}\n```\n"
  },
  {
    "path": "docs/api/Status.md",
    "content": "# Status\n\nReport on the state of the service and database. Useful for checking if the\nservice is up and running. The JSON output also reports\nwhen the database was last updated.\n\n## Endpoint\n\nThe status API has the following format:\n\n```\nhttps://nominatim.openstreetmap.org/status\n```\n\n!!! danger \"Deprecation warning\"\n    The API can also be used with the URL\n    `https://nominatim.openstreetmap.org/status.php`. This is now deprecated\n    and will be removed in future versions.\n\n\n## Parameters\n\nThe status endpoint takes a single optional parameter:\n\n| Parameter | Value | Default |\n|-----------| ----- | ------- |\n| format    | one of: `text`, `json` | 'text' |\n\nSelects the output format. See below.\n\n\n## Output\n\n#### Text format\n\nWhen everything is okay, a status code 200 is returned and a simple message: `OK`\n\nOn error it will return HTTP status code 500 and print a detailed error message, e.g.\n`ERROR: Database connection failed`.\n\n\n\n#### JSON format\n\nAlways returns a HTTP code 200, when the status call could be executed.\n\nOn success a JSON dictionary with the following structure is returned:\n\n```json\n  {\n      \"status\": 0,\n      \"message\": \"OK\",\n      \"data_updated\": \"2020-05-04T14:47:00+00:00\",\n      \"software_version\": \"3.6.0-0\",\n      \"database_version\": \"3.6.0-0\"\n  }\n```\n\nThe `software_version` field contains the version of Nominatim used to serve\nthe API. The `database_version` field contains the version of the data format\nin the database.\n\nOn error will return a shorter JSON dictionary with the error message\nand status only, e.g.\n\n```json\n   {\n       \"status\": 700,\n       \"message\": \"Database connection failed\"\n   }\n```\n"
  },
  {
    "path": "docs/customize/Country-Settings.md",
    "content": "# Customizing Per-Country Data\n\nWhenever an OSM is imported into Nominatim, the object is first assigned\na country. Nominatim can use this information to adapt various aspects of\nthe address computation to the local customs of the country. This section\nexplains how country assignment works and the principal per-country\nlocalizations.\n\n## Country assignment\n\nCountries are assigned on the basis of country data from the OpenStreetMap\ninput data itself. Countries are expected to be tagged according to the\n[administrative boundary schema](https://wiki.openstreetmap.org/wiki/Tag:boundary%3Dadministrative):\na OSM relation with `boundary=administrative` and `admin_level=2`. Nominatim\nuses the country code to distinguish the countries.\n\nIf there is no country data available for a point, then Nominatim uses the\nfallback data imported from `data/country_osm_grid.sql.gz`. This was computed\nfrom OSM data as well but is guaranteed to cover all countries.\n\nSome OSM objects may also be located outside any country, for example a buoy\nin the middle of the ocean. These object do not get any country assigned and\nget a default treatment when it comes to localized handling of data.\n\n## Per-country settings\n\n### Global country settings\n\nThe main place to configure settings per country is the file\n`settings/country_settings.yaml`. This file has one section per country that\nis recognised by Nominatim. Each section is tagged with the country code\n(in lower case) and contains the different localization information. Only\ncountries which are listed in this file are taken into account for computations.\n\nFor example, the section for Andorra looks like this:\n\n```\n    partition: 35\n    languages: ca\n    names: !include country-names/ad.yaml\n    postcode:\n      pattern: \"(ddd)\"\n      output: AD\\1\n```\n\nThe individual settings are described below.\n\n#### `partition`\n\nNominatim internally splits the data into multiple tables to improve\nperformance. The partition number tells Nominatim into which table to put\nthe country. This is purely internal management and has no effect on the\noutput data.\n\nThe default is to have one partition per country.\n\n#### `languages`\n\nA comma-separated list of ISO-639 language codes of default languages in the\ncountry. These are the languages used in name tags without a language suffix.\nNote that this is not necessarily the same as the list of official languages\nin the country. There may be officially recognised languages in a country\nwhich are only ever used in name tags with the appropriate language suffixes.\nConversely, a non-official language may appear a lot in the name tags, for\nexample when used as an unofficial Lingua Franca.\n\nList the languages in order of frequency of appearance with the most frequently\nused language first. It is not recommended to add languages when there are only\nvery few occurrences.\n\nIf only one language is listed, then Nominatim will 'auto-complete' the\nlanguage of names without an explicit language-suffix.\n\n#### `names`\n\nList of names of the country and its translations. These names are used as\na baseline. It is always possible to search countries by the given names, no\nmatter what other names are in the OSM data. They are also used as a fallback\nwhen a needed translation is not available.\n\n!!! Note\n    The list of names per country is currently fairly large because Nominatim\n    supports translations in many languages per default. That is why the\n    name lists have been separated out into extra files. You can find the\n    name lists in the file `settings/country-names/<country code>.yaml`.\n    The names section in the main country settings file only refers to these\n    files via the special `!include` directive.\n\n#### `postcode`\n\nDescribes the format of the postcode that is in use in the country.\n\nWhen a country has no official postcodes, set this to no. Example:\n\n```\nae:\n    postcode: no\n```\n\nWhen a country has a postcode, you need to state the postcode pattern and\nthe default output format. Example:\n\n```\nbm:\n    postcode:\n      pattern: \"(ll)[ -]?(dd)\"\n      output: \\1 \\2\n```\n\nThe **pattern** is a regular expression that describes the possible formats\naccepted as a postcode. The pattern follows the standard syntax for\n[regular expressions in Python](https://docs.python.org/3/library/re.html#regular-expression-syntax)\nwith two extra shortcuts: `d` is a shortcut for a single digit([0-9])\nand `l` for a single ASCII letter ([A-Z]).\n\nUse match groups to indicate groups in the postcode that may optionally be\nseparated with a space or a hyphen.\n\nFor example, the postcode for Bermuda above always consists of two letters\nand two digits. They may optionally be separated by a space or hyphen. That\nmeans that Nominatim will consider `AB56`, `AB 56` and `AB-56` spelling variants\nfor one and the same postcode.\n\nNever add the country code in front of the postcode pattern. Nominatim will\nautomatically accept variants with a country code prefix for all postcodes.\n\nThe **output** field is an optional field that describes what the canonical\nspelling of the postcode should be. The format is the\n[regular expression expand syntax](https://docs.python.org/3/library/re.html#re.Match.expand) referring back to the bracket groups in the pattern.\n\nMost simple postcodes only have one spelling variant. In that case, the\n**output** can be omitted. The postcode will simply be used as is.\n\nIn the Bermuda example above, the canonical spelling would be to have a space\nbetween letters and digits.\n\n!!! Warning\n    When your postcode pattern covers multiple variants of the postcode, then\n    you must explicitly state the canonical output or Nominatim will not\n    handle the variations correctly.\n\n### Other country-specific configuration\n\nThere are some other configuration files where you can set localized settings\naccording to the assigned country. These are:\n\n * [Place ranking configuration](Ranking.md)\n\nPlease see the linked documentation sections for more information.\n"
  },
  {
    "path": "docs/customize/Import-Styles.md",
    "content": "# Configuring the Import of OSM data\n\nIn the very first step of a Nominatim import, OSM data is loaded into the\ndatabase. Nominatim uses [osm2pgsql](https://osm2pgsql.org) for this task.\nIt comes with a [flex style](https://osm2pgsql.org/doc/manual.html#the-flex-output)\nspecifically tailored to filter and convert OSM data into Nominatim's\ninternal data representation. Nominatim ships with a few preset\nconfigurations for this import, each results in a geocoding database of\ndifferent detail. The\n[Import section](../admin/Import.md#filtering-imported-data) explains\nthese default configurations in detail.\n\nIf you want to have more control over which OSM data is added to the database,\nyou can also create your own custom style. Create a new lua style file, put it\ninto your project directory and then set `NOMINATIM_IMPORT_STYLE` to the name\nof the file. Custom style files can be used to modify the existing preset\nconfigurations or to implement your own configuration from scratch.\n\nThe remainder of the page describes how the flex style works and how to\ncustomize it.\n\n## The `flex-base` lua module\n\nThe core of Nominatim's flex import configuration is the `flex-base` module.\nIt defines the table layout used by Nominatim and provides standard\nimplementations for the import callbacks that help with customizing\nhow OSM tags are used by Nominatim.\n\nEvery custom style must include this module to make sure that the correct\ntables are created. Thus start your custom style as follows:\n\n``` lua\nlocal flex = require('flex-base')\n```\n\n### Using preset configurations\n\nIf you want to start with one of the existing presets, then you can import\nits settings using the `load_topic()` function:\n\n``` lua\nlocal flex = require('flex-base')\n\nflex.load_topic('streets')\n```\n\nThe `load_topic` function takes an optional second configuration\nparameter. The available options are explained in the\n[themepark section](#using-osm2pgsql-themepark).\n\nAvailable topics are: `admin`, `street`, `address`, `full`. These topic\ncorrespond to the [import styles](../admin/Import.md#filtering-imported-data)\nyou can choose during import. To start with the 'extratags' style, use the\n`full` topic with the appropriate config parameter:\n\n``` lua\nflex.load_topic('full', {with_extratags = true})\n```\n\n!!! note\n    You can also directly import the preset style files, e.g.\n    `local flex = require('import-street')`. It is not possible to\n    set extra configuration this way.\n\n### How processing works\n\nWhen Nominatim processes an OSM object, it looks for four kinds of tags:\nThe _main tags_ classify what kind of place the OSM object represents. One\nOSM object can have more than one main tag. In such case one database entry\nis created for each main tag. _Name tags_ represent searchable names of the\nplace. _Address tags_ are used to compute the address information of the place.\nAddress tags are used for searching and for creating a display name of the place.\n_Extra tags_ are any tags that are not directly related to search but\ncontain interesting additional information. These are just saved in the database\nand may be returned with the result [on request](../api/Search.md#output-details).\n\n!!! danger\n    Some tags in the extratags category are used by Nominatim to better\n    classify the place. These tags will always be added, independent of\n    any settings in the style.\n\nConfiguring the style means deciding which key and/or key/value is used\nin which category.\n\n## Changing the recognized tags\n\nThe flex style offers a number of functions to set the classification of\neach OSM tag. Most of these functions can also take a preset string instead\nof a tag description. These presets describe common configurations that\nare also used in the definition of the predefined styles. This section\nlists the configuration functions and the accepted presets.\n\n#### Key match lists\n\nSome of the following functions take _key match lists_. These lists can\ncontain three kinds of strings to match against tag keys:\nA string that ends in an asterisk `*` is a prefix match and accordingly matches\nagainst any key that starts with the given string (minus the `*`). \nA suffix match can be defined similarly with a string that starts with a `*`.\nAny other string is matched exactly against tag keys.\n\n###  Main tags\n\n`set/modify_main_tags()` allow to define which tags are used as main tags. It\ntakes a lua table parameter which defines for keys and key/value\ncombinations, how they are classified.\n\nThe following classifications are recognized:\n\n| classification  | meaning |\n| :-------------- | :------ |\n| always          | Unconditionally use this tag as a main tag. |\n| named           | Consider as main tag, when the object has a primary name (see [names](#name-tags) below) |\n| named_with_key  | Consider as main tag, when the object has a primary name with a domain prefix. For example, if the main tag is  `bridge=yes`, then it will only be added as an extra entry, if there is a tag `bridge:name[:XXX]` for the same object. If this property is set, all names that are not domain-specific are ignored. |\n| fallback        | Consider as main tag only when no other main tag was found. Fallback always implies `named`, i.e. fallbacks are only tried for objects with primary names. |\n| postcode_area   | Tag indicates a postcode area. Copy area into the table of postcodes but only when the object is a relation and has a postcode tagged. |\n| delete          | Completely ignore the tag in any further processing |\n| extra           | Move the tag to extratags and then ignore it for further processing |\n| `<function>`| Advanced handling, see [below](#advanced-main-tag-handling) |\n\nEach key in the table parameter defines an OSM tag key. The value may\nbe directly a classification as described above. Then the tag will\nbe considered a main tag for any possible value that is not further defined.\nTo further restrict which values are acceptable, give a table with the\npermitted values and their kind of main tag. If the table contains a simple\nvalue without key, then this is used as default for values that are not listed.\n\n`set_main_tags()` will completely replace the current main tag configuration\nwith the new configuration. `modify_main_tags()` will merge the new\nconfiguration with the existing one. Merging is done at value level.\nFor example, when the current setting is `highway = {'always', primary = 'named'}`,\nthen `set_main_tags{highway = 'delete'}` will result in a rule\n`highway = {'delete', primary = 'named'}`.\n\n!!! example\n    ``` lua\n    local flex = require('import-full')\n\n    flex.set_main_tags{\n        boundary = {administrative = 'named'},\n        highway = {'always', street_lamp = 'named', no = 'delete'},\n        landuse = 'fallback'\n    }\n    ```\n\n    In this example an object with a `boundary` tag will only be included\n    when it has a value of `administrative`. Objects with `highway` tags are\n    always included with two exceptions: the troll tag `highway=no` is\n    deleted on the spot. And when the value is `street_lamp` then the object\n    must also have a name, to be included. Finally, if a `landuse` tag is\n    present then it will be used independently of the concrete value when\n    neither boundary nor highway tags were found and the object is named.\n\n##### Presets\n\n| Name   | Description |\n| :----- | :---------- |\n| admin  | Basic tag set collecting places and administrative boundaries. This set is needed also to ensure proper address computation and should therefore always be present. You can disable selected place types like `place=locality` after adding this set, if they are not relevant for your use case. |\n| all_boundaries | Extends the set of recognized boundaries and places to all available ones. |\n| natural | Tags for natural features like rivers and mountain peaks. |\n| street/default | Tags for streets. Major streets are always included, minor ones only when they have a name. |\n| street/car | Tags for all streets that can be used by a motor vehicle. |\n| street/all | Includes all highway features named and unnamed. |\n| poi/delete | Adds most POI features with and without name. Some frequent but very domain-specific values are excluded by deleting them. |\n| poi/extra | Like 'poi/delete' but excluded values are moved to extratags. |\n\n\n##### Advanced main tag handling\n\nThe groups described above are in fact only a preset for a filtering function\nthat is used to make the final decision how a pre-selected main tag is entered\ninto Nominatim's internal table. To further customize handling you may also\nsupply your own filtering function.\n\nThe function takes up to three parameters: a Place object of the object\nbeing processed, the key of the main tag and the value of the main tag.\nThe function may return one of three values:\n\n* `nil` or `false` causes the entry to be ignored\n* the Place object causes the place to be added as is\n* `Place.copy(names=..., address=..., extratags=...) causes the\n  place to be enter into the database but with name/address/extratags\n  set to the given different values.\n\nThe Place object has some read-only values that can be used to determine\nthe handling:\n\n* **object** is the original OSM object data handed in by osm2pgsql\n* **admin_level** is the content of the admin_level tag, parsed into an integer and normalized to a value between 0 and 15\n* **has_name** is a boolean indicating if the object has a primary name tag\n* **names** is a table with the collected list of name tags\n* **address** is a table with the collected list of address tags\n* **extratags** is a table with the collected list of additional tags to save\n\n!!! example\n    ``` lua\n    local flex = require('flex-base')\n\n    flex.add_topic('street')\n\n    local function no_sidewalks(place, k, v)\n        if place.object.tags.footway == 'sidewalk' then\n            return false\n        end\n\n        -- default behaviour is to have all footways\n        return place\n    end\n\n    flex.modify_main_tags(highway = {'footway' = no_sidewalks}\n    ```\n    This script adds a custom handler for `highway=footway`. It only includes\n    them in the database, when the object doesn't have a tag `footway=sidewalk`\n    indicating that it is just part of a larger street which should already\n    be indexed. Note that it is not necessary to check the key and value\n    of the main tag because the function is only used for the specific\n    main tag.\n\n\n### Ignored tags\n\nThe function `ignore_keys()` sets the `delete` classification for keys.\nThis function takes a _key match list_ so that it is possible to exclude\ngroups of keys.\n\nNote that full matches always take precedence over suffix matches, which\nin turn take precedence over prefix matches.\n\n!!! example\n    ``` lua\n    local flex = require('flex-base')\n\n    flex.add_topic('admin')\n    flex.ignore_keys{'old_name', 'old_name:*'}\n    ```\n\n    This example uses the `admin` preset with the exception that names\n    that are no longer are in current use, are ignored.\n\n##### Presets\n\n| Name     | Description |\n| :-----   | :---------- |\n| metatags | Tags with meta information about the OSM tag like source, notes and import sources. |\n| name     | Non-names that actually describe properties or name parts. These names can throw off search and should always be removed. |\n| address  | Extra `addr:*` tags that are not useful for Nominatim. |\n\n\n### Tags for `extratags`\n\nThe function `add_for_extratags()` sets the `extra` classification for keys.\nThis function takes a\n_key match list_ so that it is possible to move groups of keys to extratags.\n\nNote that full matches always take precedence over suffix matches, which\nin turn take precedence over prefix matches.\n\n!!! example\n    ``` lua\n    local flex = require('flex-base')\n\n    flex.add_topic('street')\n    flex.add_for_extratags{'surface', 'access', 'vehicle', 'maxspeed'}\n    ```\n\n    This example uses the `street` preset but adds a couple of tags that\n    are of interest about the condition of the street.\n\n##### Presets\n\nAccepts all [presets from ignored tags](#presets_1).\n\n### General pre-filtering\n\n_(deprecated)_ `set_prefilters()` allows to set the `delete` and `extra`\nclassification for main tags.\n\nThis function removes all previously set main tags with `delete` and `extra`\nclassification and then adds the newly defined tags.\n\n`set_prefilters()` takes a table with four optional fields:\n\n* __delete_keys__ is a _key match list_ for tags that should be deleted\n* __delete_tags__ contains a table of tag keys pointing to a list of tag\n  values. Tags with matching key/value pairs are deleted.\n* __extra_keys__ is a _key match list_ for tags which should be saved into\n  extratags\n* __extra_tags__ contains a table of tag keys pointing to a list of tag\n  values. Tags with matching key/value pairs are moved to extratags.\n\n!!! danger \"Deprecation warning\"\n    Use of this function should be replaced with `modify_main_tags()` to\n    set the data from `delete_tags` and `extra_tags`, with `ignore_keys()`\n    for the `delete_keys` parameter and with `add_for_extratags()` for the\n    `extra_keys` parameter.\n\n### Name tags\n\n`set/modify_name_tags()` allow to define the tags used for naming places. Name tags\ncan only be selected by their keys. The import script distinguishes\nbetween primary and auxiliary names. A primary name is the given name of\na place. Having a primary name makes a place _named_. This is important\nfor main tags that are only included when a name is present. Auxiliary names\nare identifiers like references. They may be searched for but should not\nbe included on their own.\n\nThe functions take a table with two optional fields `main` and `extra`.\nThey take _key match lists_ for primary and auxiliary names respectively.\nA third field `house` can contain tags for names that appear in place of\nhouse numbers in addresses. This field can only contain complete key names.\n'house tags' are special in that they cause the OSM object to be added to\nthe database independently of the presence of other main tags.\n\n`set_name_tags()` overwrites the current configuration, while\n`modify_name_tags()` replaces the fields that are given. (Be aware that\nthe fields are replaced as a whole. `main = {'foo_name'}` will cause\n`foo_name` to become the only recognized primary name. Any previously\ndefined primary names are forgotten.)\n\n!!! example\n    ``` lua\n    local flex = require('flex-base')\n\n    flex.set_main_tags{highway = {traffic_light = 'named'}}\n    flex.set_name_tags{main = {'name', 'name:*'},\n                       extra = {'ref'}\n                      }\n    ```\n\n    This example creates a search index over traffic lights but will\n    only include those that have a common name and not those which just\n    have some reference ID from the city.\n\n##### Presets\n\n| Name     | Description |\n| :-----   | :---------- |\n| core     | Basic set of recognized names for all places. |\n| address  | Additional names useful when indexing full addresses. |\n| poi      | Extended set of recognized names for pois. Use on top of the core set. |\n\n### Address tags\n\n`set/modify_address_tags()` defines the tags that will be used to build\nup the address of an object. Address tags can only be chosen by their key.\n\nThe functions take a table with arbitrary fields, each defining\na key list or _key match list_. Some fields have a special meaning:\n\n| Field     | Type      | Description |\n| :---------| :-------- | :-----------|\n| main      | key list  | Tags that make a full address object out of the OSM object. This is usually the house number or variants thereof. If a main address tag appears, then the object will always be included, if necessary with a fallback of `place=house`. If the key has a prefix of `addr:` or `is_in:` this will be stripped. |\n| extra     | key match list | Supplementary tags for addresses, tags like `addr:street`, `addr:city` etc. If the key has a prefix of `addr:` or `is_in:` this will be stripped. |\n| interpolation | key list | Tags that identify address interpolation lines. |\n| country   | key match list | Tags that may contain the country the place is in. The first found value with a two-letter code will be accepted, all other values are discarded. |\n| _other_   | key match list | Summary field. If a key matches the key match list, then its value will be added to the address tags with the name of the field as key. If multiple tags match, then an arbitrary one wins. |\n\n`set_address_tags()` overwrites the current configuration, while\n`modify_address_tags()` replaces the fields that are given. (Be aware that\nthe fields are replaced as a whole.)\n\n!!! example\n    ``` lua\n    local flex = require('import-full')\n\n    flex.set_address_tags{\n        main = {'addr:housenumber'},\n        extra = {'addr:*'},\n        postcode = {'postal_code', 'postcode', 'addr:postcode'},\n        country = {'country_code', 'ISO3166-1'}\n    }\n    ```\n\n    In this example all tags which begin with `addr:` will be saved in\n    the address tag list. If one of the tags is `addr:housenumber`, the\n    object will fall back to be entered as a `place=house` in the database\n    unless there is another interested main tag to be found.\n\n    Tags with keys `country_code` and `ISO3166-1` are saved with their\n    value under `country` in the address tag list. The same thing happens\n    to postcodes, they will always be saved under the key `postcode` thus\n    normalizing the multitude of keys that are used in the OSM database.\n\n##### Presets\n\n| Name     | Description |\n| :-----   | :---------- |\n| core     | Basic set of tags needed to recognize address relationship for any place. Always include this. |\n| houses   | Additional set of tags needed to recognize proper addresses |\n\n### Handling of unclassified tags\n\n`set_unused_handling()` defines what to do with tags that remain after all tags\nhave been classified using the functions above. There are two ways in\nwhich the function can be used:\n\n`set_unused_handling(delete_keys = ..., delete_tags = ...)` deletes all\nkeys that match the descriptions in the parameters and moves all remaining\ntags into the extratags list.\n\n`set_unused_handling(extra_keys = ..., extra_tags = ...)` moves all tags\nmatching the parameters into the extratags list and then deletes the remaining\ntags. For the format of the parameters see the description in `set_prefilters()`\nabove.\n\nWhen no special handling is set, then unused tags will be discarded with one\nexception: place tags are kept in extratags for administrative boundaries.\nWhen using a custom setting, you should also make sure that the place tag\nis added for extratags.\n\n!!! example\n    ``` lua\n    local flex = require('import-full')\n\n    flex.set_address_tags{\n        main = {'addr:housenumber'},\n        extra = {'addr:*', 'tiger:county'}\n    }\n    flex.set_unused_handling{delete_keys = {'tiger:*'}}\n    ```\n\n    In this example all remaining tags except those beginning with `tiger:`\n    are moved to the extratags list. Note that it is not possible to\n    already delete the tiger tags with `set_prefilters()` because that\n    would remove tiger:county before the address tags are processed.\n\n## Filling additional tables\n\nMost of the OSM objects are saved in the main `place` table for further\nprocessing. In addition to that, there are some smaller tables that save\nspecialised information. The content of these tables can be customized as\nwell.\n\n### Entrance table\n\nThe table `place_entrance` saves information about OSM nodes that represent\nan entrance. This data is later mingled with buildings and other areas and\ncan be returned [on request](../api/Search.md#output-details). The table\nsaves the type of entrance as well as a set of custom extra tags.\n\nThe function `set_entrance_filter()` can be used to customize the table's\ncontent.\n\nWhen called without any parameter, then filling the entrance table will be\ndisabled. When called with a preset name, the appropriate preset will be\napplied.\n\nTo create a custom configuration, call the function\nwith a table with the following fields:\n\n* __main_tags__ is a list of tags that mark an entrance node. The value of the\n  first tag found in the list will be used as the entrance type.\n* __extra_include__ is an optional list of tags to be added to the extratags\n  for this entrance. When left out, all tags except for the ones defined\n  in 'main_tags' will be included. To disable saving of extra tags, set\n  this to the empty list.\n* __extra_exclude__ defines an optional list of tags to drop before including\n  the remaining tags as extratags. Note that the tags defined in 'main_tags'\n  will always be excluded, independently of this setting.\n\nTo have even more fine-grained control over the output, you can also hand\nin a callback for processing entrance information. The callback function\nreceives a single parameter, the\n[osm2pgsql object](https://osm2pgsql.org/doc/manual.html#processing-callbacks).\nThis object itself must not be modified. The callback should return either\n`nil` when the object is not an entrance. Or it returns a table with a\nmandatory `entrance` field containing a string with the type of entrance\nand an optional `extratags` field with a simple key-value table of extra\ninformation.\n\n##### Presets\n\n| Name     | Description |\n| :-----   | :---------- |\n| default  | Standard configuration used with `full` and `extratags` styles. |\n\n## Customizing osm2pgsql callbacks\n\nosm2pgsql expects the flex style to implement three callbacks, one process\nfunction per OSM type. If you want to implement special handling for\ncertain OSM types, you can override the default implementations provided\nby the flex-base module.\n\n### Enabling additional relation types\n\nOSM relations can represent very diverse\n[types of real-world objects](https://wiki.openstreetmap.org/wiki/Key:type). To\nbe able to process them correctly, Nominatim needs to understand how to\ncreate a geometry for each type. By default, the script knows how to\nprocess relations of type `multipolygon`, `boundary` and `waterway`. All\nother relation types are ignored.\n\nTo add other types relations, set `RELATION_TYPES` for\nthe type to the kind of geometry that should be created. The following\nkinds of geometries can be used:\n\n* __relation_as_multipolygon__ creates a (Multi)Polygon from the ways in\n  the relation. If the ways do not form a valid area, then the object is\n  silently discarded.\n* __relation_as_multiline__ creates a (Multi)LineString from the ways in\n  the relations. Ways are combined as much as possible without any regards\n  to their order in the relation.\n\n!!! Example\n    ``` lua\n    local flex = require('import-full')\n\n    flex.RELATION_TYPES['site'] = flex.relation_as_multipolygon\n    ```\n\n    With this line relations of `type=site` will be included in the index\n    according to main tags found. This only works when the site relation\n    resolves to a valid area. Nodes in the site relation are not part of the\n    geometry.\n\n\n### Adding additional logic to processing functions\n\nThe default processing functions are also exported by the flex-base module\nas `process_node`, `process_way` and `process_relation`. These can be used\nto implement your own processing functions with some additional processing\nlogic.\n\n!!! Example\n    ``` lua\n    local flex = require('import-full')\n\n    function osm2pgsql.process_relation(object)\n        if object.tags.boundary ~= 'administrative' or object.tags.admin_level ~= '2' then\n          flex.process_relation(object)\n        end\n    end\n    ```\n\n    This example discards all country-level boundaries and uses standard\n    handling for everything else. This can be useful if you want to use\n    your own custom country boundaries.\n\n\n### Customizing the main processing function\n\n!!! danger \"Deprecation Warning\"\n    The style used to allow overwriting the internal processing function\n    `process_tags()`. While this is currently still possible, it is no longer\n    encouraged and may stop working in future versions. The internal\n    `Place` class should now be considered read-only.\n\n\n## Using osm2pgsql-themepark\n\nThe Nominatim osm2pgsql style is designed so that it can also be used as\na theme for [osm2pgsql-themepark](https://osm2pgsql.org/themepark/). This\nmakes it easy to combine Nominatim with other projects like\n[openstreetmap-carto](https://github.com/gravitystorm/openstreetmap-carto)\nin the same database.\n\nTo set up one of the preset styles, simply include a topic with the same name:\n\n```\nlocal themepark = require('themepark')\nthemepark:add_topic('nominatim/address')\n```\n\nThemepark topics offer two configuration options:\n\n* **street_theme** allows to choose one of the sub topics for streets:\n    * _default_ - include all major streets and named minor paths\n    * _car_ - include all streets physically usable by cars\n    * _all_ - include all major streets and minor paths\n* **with_extratags**, when set to a truthy value, then tags that are\n  not specifically used for address or naming are added to the\n  extratags column\n\nThe customization functions described in the\n[Changing recognized tags](#changing-the-recognized-tags) section\nare available from the theme. To access the theme you need to explicitly initialize it.\n\n!!! Example\n    ``` lua\n    local themepark = require('themepark')\n\n    themepark:add_topic('nominatim/full', {with_extratags = true})\n\n    local flex = themepark:init_theme('nominatim')\n\n    flex.modify_main_tags{'amenity' = {\n                           'waste_basket' = 'delete'}\n                      }\n    ```\n    This example uses the full Nominatim configuration but disables\n    importing waste baskets.\n\nYou may also write a new configuration from scratch. Simply omit including\na Nominatim topic and only call the required customization functions.\n\nCustomizing the osm2pgsql processing functions as explained\n[above](#adding-additional-logic-to-processing-functions) is not possible\nwhen running under themepark. Instead include other topics that make the\nnecessary modifications or add an additional processor before including\nthe Nominatim topic.\n\n!!! Example\n    ``` lua\n    local themepark = require('themepark')\n\n    local function discard_country_boundaries(object)\n        if object.tags.boundary == 'administrative' and object.tags.admin_level == '2' then\n            return 'stop'\n        end\n    end\n\n    themepark:add_proc('relation', discard_country_boundaries)\n    -- Order matters here. The topic needs to be added after the custom callback.\n    themepark:add_topic('nominatim/full', {with_extratags = true})\n    ```\n    Discarding country-level boundaries when running under themepark.\n\n## Changing the style of existing databases\n\nThere is usually no issue changing the style of a database that is already\nimported and now kept up-to-date with change files. Just be aware that any\nchange in the style applies to updates only. If you want to change the data\nthat is already in the database, then a reimport is necessary.\n"
  },
  {
    "path": "docs/customize/Importance.md",
    "content": "## Importance\n\nSearch requests can yield multiple results which match equally well with\nthe original query. In such case Nominatim needs to order the results\naccording to a different criterion: importance. This is a measure for how\nlikely it is that a user will search for a given place. This section explains\nthe sources Nominatim uses for computing importance of a place and how to\ncustomize them.\n\n### How importance is computed\n\nThe main value for importance is derived from page ranking values for Wikipedia\npages for a place. For places that do not have their own\nWikipedia page, a formula is used that derives a static importance from the\nplace's [search rank](../customize/Ranking.md#search-rank).\n\nIn a second step, a secondary importance value is added which is meant to\nrepresent how well-known the general area is where the place is located. It\nfunctions as a tie-breaker between places with very similar primary\nimportance values.\n\nnominatim.org has preprocessed importance tables for the\n[primary Wikipedia rankings](https://nominatim.org/data/wikimedia-importance.csv.gz)\nand for [secondary importance](https://nominatim.org/data/wikimedia-secondary-importance.sql.gz)\nbased on Wikipedia importance of the administrative areas.\n\nThe source code for creating these files is available in the Github projects\n[osm-search/wikipedia-wikidata](https://github.com/osm-search/wikipedia-wikidata)\nand\n[osm-search/secondary-importance](https://github.com/osm-search/secondary-importance).\n\n### Customizing secondary importance\n\nThe secondary importance is implemented as a simple\n[Postgis raster](https://postgis.net/docs/raster.html) table, where Nominatim\nlooks up the value for the coordinates of the centroid of a place. You can\nprovide your own secondary importance raster in form of an SQL file named\n`secondary_importance.sql.gz` in your project directory.\n\nThe SQL file needs to drop and (re)create a table `secondary_importance` which\nmust as a minimum contain a column `rast` of type `raster`. The raster must\nbe in EPSG:4326 and contain 16bit unsigned ints\n(`raster_constraint_pixel_types(rast) = '{16BUI}'). Any other columns in the\ntable will be ignored. You must furthermore create an index as follows:\n\n```\nCREATE INDEX ON secondary_importance USING gist(ST_ConvexHull(gist))\n```\n\nThe following raster2pgsql command will create a table from a tiff file\nthat conforms to the requirements:\n\n```\nraster2pgsql -I -C -Y -d -t 128x128 input.tiff public.secondary_importance\n```\n"
  },
  {
    "path": "docs/customize/Overview.md",
    "content": "Nominatim comes with a predefined set of configuration options that should\nwork for most standard installations. If you have special requirements, there\nare many places where the configuration can be adapted. This chapter describes\nthe following configurable parts:\n\n* [Global Settings](Settings.md) has a detailed description of all parameters that\n  can be set in your local `.env` configuration\n* [Import styles](Import-Styles.md) explains how to write your own import style\n  in order to control what kind of OSM data will be imported\n* [API Result Formatting](Result-Formatting.md) shows how to change the\n  output of the Nominatim API\n* [Place ranking](Ranking.md) describes the configuration around classifing\n  places in terms of their importance and their role in an address\n* [Tokenizers](Tokenizers.md) describes the configuration of the module\n  responsible for analysing and indexing names\n* [Special Phrases](Special-Phrases.md) are common nouns or phrases that\n  can be used in search to identify a class of places\n\nThere are also guides for adding the following external data:\n\n* [US house numbers from the TIGER dataset](Tiger.md)\n* [External postcodes](Postcodes.md)\n"
  },
  {
    "path": "docs/customize/Postcodes.md",
    "content": "# External postcode data\n\nNominatim creates a table of known postcode centroids during import. This table\nis used for searches of postcodes and for adding postcodes to places where the\nOSM data does not provide one. These postcode centroids are mainly computed\nfrom the OSM data itself. In addition, Nominatim supports reading postcode\ninformation from an external CSV file, to supplement the postcodes that are\nmissing in OSM.\n\nTo enable external postcode support, simply put one CSV file per country into\nyour project directory and name it `<CC>_postcodes.csv`. `<CC>` must be the\ntwo-letter country code for which to apply the file. The file may also be\ngzipped. Then it must be called `<CC>_postcodes.csv.gz`.\n\nThe CSV file must use commas as a delimiter and have a header line. Nominatim\nexpects three columns to be present: `postcode`, `lat` and `lon`. All other\ncolumns are ignored. `lon` and `lat` must describe the x and y coordinates of the\npostcode centroids in WGS84.\n\nThe postcode files are loaded only when there is data for the given country\nin your database. For example, if there is a `us_postcodes.csv` file in your\nproject directory but you import only an excerpt of Italy, then the US postcodes\nwill simply be ignored.\n\nAs a rule, the external postcode data should be put into the project directory\n**before** starting the initial import. Still, you can add, remove and update the\nexternal postcode data at any time. Simply\nrun:\n\n```\nnominatim refresh --postcodes\n```\n\nto make the changes visible in your database. Be aware, however, that the changes\nonly have an immediate effect on searches for postcodes. Postcodes that were\nadded to places are only updated, when they are reindexed. That usually happens\nonly during replication updates.\n"
  },
  {
    "path": "docs/customize/Ranking.md",
    "content": "# Place Ranking in Nominatim\n\nNominatim uses two metrics to rank a place: search rank and address rank.\nThis chapter explains what place ranking means and how it can be customized.\n\n## Search rank\n\nThe search rank describes the extent and importance of a place. It is used\nwhen ranking search results. Simply put, if there are two results for a\nsearch query which are otherwise equal, then the result with the _lower_\nsearch rank will be appear higher in the result list.\n\nSearch ranks are not so important these days because many well-known\nplaces use the Wikipedia importance ranking instead.\n\nThe following table gives an overview of the kind of features that Nominatim\nexpects for each rank:\n\nrank   | typical place types             | extent\n-------|---------------------------------|-------\n1-3    | oceans, continents              | -\n4      | countries                       | -\n5-9    | states, regions, provinces      | -\n10-12  | counties                        | -\n13-16  | cities, municipalities, islands | 15 km\n17-18  | towns, boroughs                 | 4 km\n19     | villages, suburbs               | 2 km\n20     | hamlets, farms, neighbourhoods  |  1 km\n21-25  | isolated dwellings, city blocks | 500 m\n\nThe extent column describes how far a feature is assumed to reach when it\nis mapped only as a point. Larger features like countries and states are usually\navailable with their exact area in the OpenStreetMap data. That is why no extent\nis given.\n\n## Address rank\n\nThe address rank describes where a place shows up in an address hierarchy.\nUsually only administrative boundaries and place nodes and areas are\neligible to be part of an address. Places that should not appear in the\naddress must have an address rank of 0.\n\nThe following table gives an overview how ranks are mapped to address parts:\n\n rank        | address part\n-------------|-------------\n 1-3         | _unused_\n 4           | country\n 5-9         | state\n 10-12       | county\n 13-16       | city\n 17-21       | suburb\n 22-24       | neighbourhood\n 25          | squares, farms, localities\n 26-27       | street\n 28-30       | POI/house number\n\nThe country rank 4 usually doesn't show up in the address parts of an object.\nThe country is determined indirectly from the country code.\n\nRanks 5-24 can be assigned more or less freely. They make up the major part\nof the address.\n\nRank 25 is also an addressing rank but it is special because while it can be\nthe parent to a POI with an addr:place of the same name, it cannot be a parent\nto streets. Use it for place features that are technically on the same level\nas a street (e.g. squares, city blocks) or for places that should not normally\nappear in an address unless explicitly tagged so (e.g place=locality which\nshould be uninhabited and as such not addressable).\n\nThe street ranks 26 and 27 are handled slightly differently. Only one object\nfrom these ranks shows up in an address.\n\nFor POI level objects like shops, buildings or house numbers always use rank 30.\nRanks 28 is reserved for house number interpolations. 29 is for internal use\nonly.\n\n## Rank configuration\n\nSearch and address ranks are assigned to a place when it is first imported\ninto the database. There are a few hard-coded rules for the assignment:\n\n * postcodes follow special rules according to their length\n * boundaries that are not areas and railway=rail are dropped completely\n * the following are always search rank 30 and address rank 0:\n    * highway nodes\n    * landuse that is not an area\n\nOther than that, the ranks can be freely assigned via the JSON file according\nto their type and the country they are in. The name of the config file to be\nused can be changed with the setting `NOMINATIM_ADDRESS_LEVEL_CONFIG`.\n\nThe address level configuration must consist of an array of configuration\nentries, each containing a tag definition and an optional country array:\n\n```\n[ {\n    \"tags\" : {\n      \"place\" : {\n        \"county\" : 12,\n        \"city\" : 16,\n      },\n      \"landuse\" : {\n        \"residential\" : 22,\n        \"\" : 30\n      }\n    }\n  },\n  {\n    \"countries\" : [ \"ca\", \"us\" ],\n    \"tags\" : {\n      \"boundary\" : {\n        \"administrative8\" : 18,\n        \"administrative9\" : 20\n      },\n      \"landuse\" : {\n        \"residential\" : [22, 0]\n      }\n    }\n  }\n]\n```\n\nThe `countries` field contains a list of countries (as ISO 3166-1 alpha 2 code)\nfor which the definition applies. When the field is omitted, then the\ndefinition is used as a fallback, when nothing more specific for a given\ncountry exists.\n\n`tags` contains the ranks for key/value pairs. The ranks can be either a\nsingle number, in which case they are the search and address rank, or an array\nof search and address rank (in that order). The value may be left empty.\nThen the rank is used when no more specific value is found for the given\nkey.\n\nCountries and key/value combination may appear in multiple definitions. Just\nmake sure that each combination of country/key/value appears only once per\nfile. Otherwise the import will fail with a UNIQUE INDEX constraint violation\non import.\n\n"
  },
  {
    "path": "docs/customize/Result-Formatting.md",
    "content": "# Changing the Appearance of Results in the Server API\n\nThe Nominatim Server API offers a number of formatting options that\npresent search results in [different output formats](../api/Output.md).\nThese results only contain a subset of all the information that Nominatim\nhas about the result. This page explains how to adapt the result output\nor add additional result formatting.\n\n## Defining custom result formatting\n\nTo change the result output, you need to place a file `api/v1/format.py`\ninto your project directory. This file needs to define a single variable\n`dispatch` containing a [FormatDispatcher](#formatdispatcher). This class\nserves to collect the functions for formatting the different result types\nand offers helper functions to apply the formatters.\n\nThere are two ways to define the `dispatch` variable. If you want to reuse\nthe default output formatting and just make some changes or add an additional\nformat type, then import the dispatch object from the default API:\n\n``` python\nfrom nominatim_api.v1.format import dispatch as dispatch\n```\n\nIf you prefer to define a completely new result output, then you can\ncreate an empty dispatcher object:\n\n``` python\nfrom nominatim_api import FormatDispatcher\n\ndispatch = FormatDispatcher()\n```\n\n## The formatting function\n\nThe dispatcher organises the formatting functions by format and result type.\nThe format corresponds to the `format` parameter of the API. It can contain\none of the predefined format names or you can invent your own new format.\n\nAPI calls return data classes or an array of a data class which represent\nthe result. You need to make sure there are formatters defined for the\nfollowing result types:\n\n* StatusResult (single object, returned by `/status`)\n* DetailedResult (single object, returned by `/details`)\n* SearchResults (list of objects, returned by `/search`)\n* ReverseResults (list of objects, returned by `/reverse` and `/lookup`)\n* RawDataList (simple object, returned by `/deletable` and `/polygons`)\n\nA formatter function has the following signature:\n\n``` python\ndef format_func(result: ResultType, options: Mapping[str, Any]) -> str\n```\n\nThe options dictionary contains additional information about the original\nquery. See the [reference below](#options-for-different-result-types)\nabout the possible options.\n\nTo set the result formatter for a certain result type and format, you need\nto write the format function and decorate it with the\n[`format_func`](#nominatim_api.FormatDispatcher.format_func)\ndecorator.\n\nFor example, let us extend the result for the status call in text format\nand add the server URL. Such a formatter would look like this:\n\n``` python\nfrom nominatim_api import StatusResult\n\n@dispatch.format_func(StatusResult, 'text')\ndef _format_status_text(result, _):\n    header = 'Status for server nominatim.openstreetmap.org'\n    if result.status:\n        return f\"{header}\\n\\nERROR: {result.message}\"\n\n    return f\"{header}\\n\\nOK\"\n```\n\nIf your dispatcher is derived from the default one, then this definition\nwill overwrite the original formatter function. This way it is possible\nto customize the output of selected results.\n\n## Adding new formats\n\nYou may also define a completely different output format. This is as simple\nas adding formatting functions for all result types using the custom\nformat name:\n\n``` python\nfrom nominatim_api import StatusResult\n\n@dispatch.format_func(StatusResult, 'chatty')\ndef _format_status_text(result, _):\n    if result.status:\n        return f\"The server is currently not running. {result.message}\"\n\n    return \"Good news! The server is running just fine.\"\n```\n\nThat's all. Nominatim will automatically pick up the new format name and\nwill allow the user to use it. There is no need to implement formatter\nfunctions for all the result types, when you invent a new one. The\navailable formats will be determined for each API endpoint separately.\nTo find out which formats are available, you can use the `--list-formats`\noption of the CLI tool:\n\n```\nme@machine:planet-project$ nominatim status --list-formats\n2024-08-16 19:54:00: Using project directory: /home/nominatim/planet-project\ntext\njson\nchatty\ndebug\nme@machine:planet-project$\n```\n\nThe `debug` format listed in the last line will always appear. It is a\nspecial format that enables debug output via the command line (the same\nas the `debug=1` parameter enables for the server API). To not clash\nwith this built-in function, you shouldn't name your own format 'debug'.\n\n### Content type of new formats\n\nAll responses will be returned with the content type application/json by\ndefault. If your format produces a different content type, you need\nto configure the content type with the `set_content_type()` function.\n\nFor example, the 'chatty' format above returns just simple text. So the\ncontent type should be set up as:\n\n``` python\nfrom nominatim_api.server.content_types import CONTENT_TEXT\n\ndispatch.set_content_type('chatty', CONTENT_TEXT)\n```\n\nThe `content_types` module used above provides constants for the most\nfrequent content types. You set the content type to an arbitrary string,\nif the content type you need is not available.\n\n## Formatting error messages\n\nAny exception thrown during processing of a request is given to\na special error formatting function. It takes the requested content type,\nthe status code and the error message. It should return the error message\nin a form appropriate for the given content type.\n\nYou can overwrite the default formatting function with the decorator\n`error_format_func`:\n\n``` python\nimport nominatim_api.server.content_types as ct\n\n@dispatch.error_format_func\ndef _format_error(content_type: str, msg: str, status: int) -> str:\n    if content_type == ct.CONTENT_XML:\n        return f\"\"\"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n                     <message>{msg}</message>\n                \"\"\"\n    if content_type == ct.CONTENT_JSON:\n        return f'\"{msg}\"'\n\n    return f\"ERROR: {msg}\"\n```\n\n\n## Debugging custom formatters\n\nThe easiest way to try out your custom formatter is by using the Nominatim\nCLI commands. Custom formats can be chosen with the `--format` parameter:\n\n```\nme@machine:planet-project$ nominatim status --format chatty\n2024-08-16 19:54:00: Using project directory: /home/nominatim/planet-project\nGood news! The server is running just fine.\nme@machine:planet-project$\n```\n\nThey will also emit full error messages when there is a problem with the\ncode you need to debug.\n\n!!! danger\n    In some cases, when you make an error with your import statement, the\n    CLI will not give you an error but instead tell you, that the API\n    commands are no longer available:\n\n        me@machine: nominatim status\n        usage: nominatim [-h] [--version] {import,freeze,replication,special-phrases,add-data,index,refresh,admin} ...\n        nominatim: error: argument subcommand: invalid choice: 'status'\n\n    This happens because the CLI tool is meant to still work when the\n    nominatim-api package is not installed. Import errors involving\n    `nominatim_api` are interpreted as \"package not installed\".\n\n    Use the help command to find out which is the offending import that\n    could not be found:\n\n        me@machine: nominatim -h\n        ... [other help text] ...\n        Nominatim API package not found (was looking for module: nominatim_api.xxx).\n\n## Reference\n\n### FormatDispatcher\n\n::: nominatim_api.FormatDispatcher\n    options:\n        heading_level: 6\n        group_by_category: False\n\n### JsonWriter\n\n::: nominatim_api.utils.json_writer.JsonWriter\n    options:\n        heading_level: 6\n        group_by_category: False\n\n### Options for different result types\n\nThis section lists the options that may be handed in with the different result\ntypes in the v1 version of the Nominatim API.\n\n#### StatusResult\n\n_None._\n\n#### DetailedResult\n\n| Option          | Description |\n|-----------------|-------------|\n| locales         | [Locales](../library/Result-Handling.md#locale) object for the requested language(s) |\n| group_hierarchy | Setting of [group_hierarchy](../api/Details.md#output-details) parameter |\n| icon_base_url   | (optional) URL pointing to icons as set in [NOMINATIM_MAPICON_URL](Settings.md#nominatim_mapicon_url) |\n\n#### SearchResults\n\n| Option          | Description |\n|-----------------|-------------|\n| query           | Original query string |\n| more_url        | URL for requesting additional results for the same query |\n| exclude_place_ids | List of IDs already returned (OSM IDs where possible, otherwise `place_id`s) |\n| viewbox         | Setting of [viewbox](../api/Search.md#result-restriction) parameter |\n| extratags       | Setting of [extratags](../api/Search.md#output-details) parameter |\n| namedetails     | Setting of [namedetails](../api/Search.md#output-details) parameter |\n| addressdetails  | Setting of [addressdetails](../api/Search.md#output-details) parameter |\n\n#### ReverseResults\n\n| Option          | Description |\n|-----------------|-------------|\n| query           | Original query string |\n| extratags       | Setting of [extratags](../api/Search.md#output-details) parameter |\n| namedetails     | Setting of [namedetails](../api/Search.md#output-details) parameter |\n| addressdetails  | Setting of [addressdetails](../api/Search.md#output-details) parameter |\n\n#### RawDataList\n\n_None._\n"
  },
  {
    "path": "docs/customize/SQLite.md",
    "content": "A Nominatim database can be converted into an SQLite database and used as\na read-only source for geocoding queries. This sections describes how to\ncreate and use an SQLite database.\n\n!!! danger\n    This feature is in an experimental state at the moment. Use at your own\n    risk.\n\n## Installing prerequisites\n\nTo use a SQLite database, you need to install:\n\n* SQLite (>= 3.30)\n* Spatialite (> 5.0.0)\n* aiosqlite\n\nOn Ubuntu/Debian, you can run:\n\n    sudo apt install sqlite3 libsqlite3-mod-spatialite libspatialite7\n\nInstall the aiosqlite Python package in your virtual environment:\n\n    /srv/nominatim-venv/bin/pip install aiosqlite\n\n## Creating a new SQLite database\n\nNominatim cannot import directly into SQLite database. Instead you have to\nfirst create a geocoding database in PostgreSQL by running a\n[regular Nominatim import](../admin/Import.md).\n\nOnce this is done, the database can be converted to SQLite with\n\n    nominatim convert -o mydb.sqlite\n\nThis will create a database where all geocoding functions are available.\nDepending on what functions you need, the database can be made smaller:\n\n* `--without-reverse` omits indexes only needed for reverse geocoding\n* `--without-search` omit tables and indexes used for forward search\n* `--without-details` leaves out extra information only available in the\n  details API\n\n## Using an SQLite database\n\nOnce you have created the database, you can use it by simply pointing the\ndatabase DSN to the SQLite file:\n\n    NOMINATIM_DATABASE_DSN=sqlite:dbname=mydb.sqlite\n\nPlease note that SQLite support is only available for the Python frontend. To\nuse the test server with an SQLite database, you therefore need to switch\nthe frontend engine:\n\n    nominatim serve --engine falcon\n\nYou need to install falcon or starlette for this, depending on which engine\nyou choose.\n\nThe CLI query commands and the library interface already use the new Python\nfrontend and therefore work right out of the box.\n"
  },
  {
    "path": "docs/customize/Settings.md",
    "content": "This section provides a reference of all configuration parameters that can\nbe used with Nominatim.\n\n# Configuring Nominatim\n\nNominatim uses [dotenv](https://github.com/theskumar/python-dotenv) to manage\nits configuration settings. There are two means to set configuration\nvariables: through an `.env` configuration file or through an environment\nvariable.\n\nThe `.env` configuration file needs to be placed into the\n[project directory](../admin/Import.md#creating-the-project-directory). It\nmust contain configuration parameters in `<parameter>=<value>` format.\nPlease refer to the dotenv documentation for details.\n\nThe configuration options may also be set in the form of shell environment\nvariables. This is particularly useful, when you want to temporarily change\na configuration option. For example, to force the replication serve to\ndownload the next change, you can temporarily disable the update interval:\n\n    NOMINATIM_REPLICATION_UPDATE_INTERVAL=0 nominatim replication --once\n\nIf a configuration option is defined through .env file and environment\nvariable, then the latter takes precedence. \n\n## Configuration Parameter Reference\n\n### Import and Database Settings\n\n#### NOMINATIM_DATABASE_DSN\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Database connection string |\n| **Format:**        | string: `pgsql:<param1>=<value1>;<param2>=<value2>;...` |\n| **Default:**       | pgsql:dbname=nominatim |\n| **After Changes:** | run `nominatim refresh --website` |\n\nSets the connection parameters for the Nominatim database. At a minimum\nthe name of the database (`dbname`) is required. You can set any additional\nparameter that is understood by libpq. See the [Postgres documentation](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-PARAMKEYWORDS) for a full list.\n\n!!! note\n    It is usually recommended not to set the password directly in this\n    configuration parameter. Use a\n    [password file](https://www.postgresql.org/docs/current/libpq-pgpass.html)\n    instead.\n\n\n#### NOMINATIM_DATABASE_WEBUSER\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Database query user |\n| **Format:**        | string  |\n| **Default:**       | www-data |\n| **After Changes:** | cannot be changed after import |\n\nDefines the name of the database user that will run search queries. Usually\nthis is the user under which the webserver is executed. The Postgres user\nneeds to be set up before starting the import.\n\nNominatim grants minimal rights to this user to all tables that are needed\nfor running geocoding queries.\n\n\n#### NOMINATIM_TOKENIZER\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Tokenizer used for normalizing and parsing queries and names |\n| **Format:**        | string |\n| **Default:**       | icu |\n| **After Changes:** | cannot be changed after import |\n\nSets the tokenizer type to use for the import. For more information on\navailable tokenizers and how they are configured, see\n[Tokenizers](../customize/Tokenizers.md).\n\n\n#### NOMINATIM_TOKENIZER_CONFIG\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Configuration file for the tokenizer |\n| **Format:**        | path |\n| **Default:**       | _empty_ (default file depends on tokenizer) |\n| **After Changes:** | see documentation for each tokenizer |\n\nPoints to the file with additional configuration for the tokenizer.\nSee the [Tokenizer](../customize/Tokenizers.md) descriptions for details\non the file format.\n\nIf a relative path is given, then the file is searched first relative to the\nproject directory and then in the global settings directory.\n\n\n#### NOMINATIM_LIMIT_REINDEXING\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Avoid invalidating large areas |\n| **Format:**        | bool |\n| **Default:**       | yes |\n\nNominatim computes the address of each place at indexing time. This has the\nadvantage to make search faster but also means that more objects needs to\nbe invalidated when the data changes. For example, changing the name of\nthe state of Florida would require recomputing every single address point\nin the state to make the new name searchable in conjunction with addresses.\n\nSetting this option to 'yes' means that Nominatim skips reindexing of contained\nobjects when the area becomes too large.\n\n\n#### NOMINATIM_LANGUAGES\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Restrict search languages |\n| **Format:**        | string: comma-separated list of language codes |\n| **Default:**       | _empty_ |\n\nNormally Nominatim will include all language variants of name:XX\nin the search index. Set this to a comma separated list of language\ncodes, to restrict import to a subset of languages.\n\nCurrently only affects the initial import of country names and special phrases.\n\n\n#### NOMINATIM_USE_US_TIGER_DATA\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Enable searching for Tiger house number data |\n| **Format:**        | boolean |\n| **Default:**       | no |\n| **After Changes:** | run `nominatim refresh --functions` |\n\nWhen this setting is enabled, search and reverse queries also take data\nfrom [Tiger house number data](Tiger.md) into account.\n\n\n#### NOMINATIM_OSM2PGSQL_BINARY\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Location of the osm2pgsql binary |\n| **Format:**        | path |\n| **Default:**       | _empty_ (use binary shipped with Nominatim) |\n| **Comment:**       | EXPERT ONLY |\n\nNominatim uses [osm2pgsql](https://osm2pgsql.org) to load the OSM data\ninitially into the database. Nominatim comes bundled with a version of\nosm2pgsql that is guaranteed to be compatible. Use this setting to use\na different binary instead. You should do this only when you know exactly\nwhat you are doing. If the osm2pgsql version is not compatible, then the\nresult is undefined.\n\n\n#### NOMINATIM_WIKIPEDIA_DATA_PATH\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Directory with the wikipedia importance data |\n| **Format:**        | path |\n| **Default:**       | _empty_ (project directory) |\n\nSet a custom location for the\n[wikipedia ranking file](../admin/Import.md#wikipediawikidata-rankings). When\nunset, Nominatim expects the data to be saved in the project directory.\n\n#### NOMINATIM_ADDRESS_LEVEL_CONFIG\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Configuration file for rank assignments |\n| **Format:**        | path |\n| **Default:**       | address-levels.json |\n\nThe _address level configuration_ defines the rank assignments for places. See\n[Place Ranking](Ranking.md) for a detailed explanation what rank assignments\nare and what the configuration file must look like.\n\nWhen a relative path is given, then the file is searched first relative to the\nproject directory and then in the global settings directory.\n\n\n#### NOMINATIM_IMPORT_STYLE\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Configuration to use for the initial OSM data import |\n| **Format:**        | string or path |\n| **Default:**       | extratags |\n\nThe _style configuration_ describes which OSM objects and tags are taken\ninto consideration for the search database. Nominatim comes with a set\nof pre-configured styles, that may be configured here.\n\nYou can also write your own custom style and point the setting to the file\nwith the style. When a relative path is given, then the style file is searched\nfirst relative to the project directory and then in the global settings\ndirectory.\n\nSee [Import Styles](Import-Styles.md)\nfor more information on the available internal styles and the format of the\nconfiguration file.\n\n#### NOMINATIM_FLATNODE_FILE\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Location of osm2pgsql flatnode file |\n| **Format:**        | path |\n| **Default:**       | _empty_ (do not use a flatnote file) |\n| **After Changes:** | Only change when moving the file physically. |\n\nThe `osm2pgsql flatnode file` is file that efficiently stores geographic\nlocation for OSM nodes. For larger imports it can significantly speed up\nthe import. When this option is unset, then osm2pgsql uses a PsotgreSQL table\nto store the locations.\n\nWhen a relative path is given, then the flatnode file is created/searched\nrelative to the project directory.\n\n!!! warning\n\n    The flatnode file is not only used during the initial import but also\n    when adding new data with `nominatim add-data` or `nominatim replication`.\n    Make sure you keep the flatnode file around and this setting unmodified,\n    if you plan to add more data or run regular updates.\n\n\n#### NOMINATIM_TABLESPACE_*\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Group of settings for distributing the database over tablespaces |\n| **Format:**        | string |\n| **Default:**       | _empty_ (do not use a table space) |\n| **After Changes:** | no effect after initial import |\n\nNominatim allows to distribute the search database over up to 10 different\n[PostgreSQL tablespaces](https://www.postgresql.org/docs/current/manage-ag-tablespaces.html).\nIf you use this option, make sure that the tablespaces exist before starting\nthe import.\n\nThe available tablespace groups are:\n\nNOMINATIM_TABLESPACE_SEARCH_DATA\n:    Data used by the geocoding frontend.\n\nNOMINATIM_TABLESPACE_SEARCH_INDEX\n:    Indexes used by the geocoding frontend.\n\nNOMINATIM_TABLESPACE_OSM_DATA\n:    Raw OSM data cache used for import and updates.\n\nNOMINATIM_TABLESPACE_OSM_INDEX\n:    Indexes on the raw OSM data cache.\n\nNOMINATIM_TABLESPACE_PLACE_DATA\n:    Data table with the pre-filtered but still unprocessed OSM data.\n     Used only during imports and updates.\n\nNOMINATIM_TABLESPACE_PLACE_INDEX\n:    Indexes on raw data table. Used only during imports and updates.\n\nNOMINATIM_TABLESPACE_ADDRESS_DATA\n:    Data tables used for computing search terms and addresses of places\n     during import and updates.\n\nNOMINATIM_TABLESPACE_ADDRESS_INDEX\n:    Indexes on the data tables for search term and address computation.\n     Used only for import and updates.\n\nNOMINATIM_TABLESPACE_AUX_DATA\n:    Auxiliary data tables for non-OSM data, e.g. for Tiger house number data.\n\nNOMINATIM_TABLESPACE_AUX_INDEX\n:    Indexes on auxiliary data tables.\n\n\n### Replication Update Settings\n\n#### NOMINATIM_REPLICATION_URL\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Base URL of the replication service |\n| **Format:**        | url |\n| **Default:**       | https://planet.openstreetmap.org/replication/minute |\n| **After Changes:** | run `nominatim replication --init` |\n\nReplication services deliver updates to OSM data. Use this setting to choose\nwhich replication service to use. See [Updates](../admin/Update.md) for more\ninformation on how to set up regular updates.\n\n#### NOMINATIM_REPLICATION_MAX_DIFF\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Maximum amount of data to download per update cycle (in MB) |\n| **Format:**        | integer |\n| **Default:**       | 50 |\n| **After Changes:** | restart the replication process |\n\nAt each update cycle Nominatim downloads diffs until either no more diffs\nare available on the server (i.e. the database is up-to-date) or the limit\ngiven in this setting is exceeded. Nominatim guarantees to downloads at least\none diff, if one is available, no matter how small the setting.\n\nThe default for this setting is fairly conservative because Nominatim keeps\nall data downloaded in one cycle in RAM. Using large values in a production\nserver may interfere badly with the search frontend because it evicts data\nfrom RAM that is needed for speedy answers to incoming requests. It is usually\na better idea to keep this setting lower and run multiple update cycles\nto catch up with updates.\n\nWhen catching up in non-production mode, for example after the initial import,\nthe setting can easily be changed temporarily on the command line:\n\n    NOMINATIM_REPLICATION_MAX_DIFF=3000 nominatim replication\n\n\n#### NOMINATIM_REPLICATION_UPDATE_INTERVAL\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Publication interval of the replication service (in seconds) |\n| **Format:**        | integer |\n| **Default:**       | 75 |\n| **After Changes:** | restart the replication process |\n\nThis setting determines when Nominatim will attempt to download again a new\nupdate. The time is computed from the publication date of the last diff\ndownloaded. Setting this to a slightly higher value than the actual\npublication interval avoids unnecessary rechecks.\n\n\n#### NOMINATIM_REPLICATION_RECHECK_INTERVAL\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Wait time to recheck for a pending update (in seconds)  |\n| **Format:**        | integer |\n| **Default:**       | 60 |\n| **After Changes:** | restart the replication process |\n\nWhen replication updates are run in continuous mode (using `nominatim replication`),\nthis setting determines how long Nominatim waits until it looks for updates\nagain when updates were not available on the server.\n\nNote that this is different from\n[NOMINATIM_REPLICATION_UPDATE_INTERVAL](#nominatim_replication_update_interval).\nNominatim will never attempt to query for new updates for UPDATE_INTERVAL\nseconds after the current database date. Only after the update interval has\npassed it asks for new data. If then no new data is found, it waits for\nRECHECK_INTERVAL seconds before it attempts again.\n\n### API Settings\n\n#### NOMINATIM_CORS_NOACCESSCONTROL\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Send permissive CORS access headers |\n| **Format:**        | boolean |\n| **Default:**       | yes |\n| **After Changes:** | run `nominatim refresh --website` |\n\nWhen this setting is enabled, API HTTP responses include the HTTP\n[CORS](https://en.wikipedia.org/wiki/CORS) headers\n`access-control-allow-origin: *` and `access-control-allow-methods: OPTIONS,GET`.\n\n#### NOMINATIM_MAPICON_URL\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | URL prefix for static icon images |\n| **Format:**        | url |\n| **Default:**       | _empty_ |\n| **After Changes:** | run `nominatim refresh --website` |\n\nWhen a mapicon URL is configured, then Nominatim includes an additional `icon`\nfield in the responses, pointing to an appropriate icon for the place type.\n\nMap icons used to be included in Nominatim itself but now have moved to the\n[nominatim-ui](https://github.com/osm-search/nominatim-ui/) project. If you\nwant the URL to be included in API responses, make the `/mapicon`\ndirectory of the project available under a public URL and point this setting\nto the directory.\n\n\n#### NOMINATIM_DEFAULT_LANGUAGE\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Language of responses when no language is requested |\n| **Format:**        | language code |\n| **Default:**       | _empty_ (use the local language of the feature) |\n| **After Changes:** | run `nominatim refresh --website` |\n\nNominatim localizes the place names in responses when the corresponding\ntranslation is available. Users can request a custom language setting through\nthe HTTP accept-languages header or through the explicit parameter\n[accept-languages](../api/Search.md#language-of-results). If neither is\ngiven, it falls back to this setting. If the setting is also empty, then\nthe local languages (in OSM: the name tag without any language suffix) is\nused.\n\n\n#### NOMINATIM_LOOKUP_MAX_COUNT\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Maximum number of OSM ids accepted by /lookup |\n| **Format:**        | integer |\n| **Default:**       | 50 |\n| **After Changes:** | run `nominatim refresh --website` |\n\nThe /lookup point accepts list of ids to look up address details for. This\nsetting restricts the number of places a user may look up with a single\nrequest.\n\n\n#### NOMINATIM_POLYGON_OUTPUT_MAX_TYPES\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Number of different geometry formats that may be returned |\n| **Format:**        | integer |\n| **Default:**       | 1 |\n| **After Changes:** | run `nominatim refresh --website` |\n\nNominatim supports returning full geometries of places. The geometries may\nbe requested in different formats with one of the\n[`polygon_*` parameters](../api/Search.md#polygon-output). Use this\nsetting to restrict the number of geometry types that may be requested\nwith a single query.\n\nSetting this parameter to 0 disables polygon output completely.\n\n\n#### NOMINATIM_SEARCH_WITHIN_COUNTRIES\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Disable search for elements that are not in the country grid |\n| **Format:**        | boolean |\n| **Default:**       | no |\n| **After Changes:** | run `nominatim refresh --website` |\n\nEnable to search elements just within countries.\n\nWhen enabled, if, despite not finding a point within the static grid of countries, it\nfinds a geometry of a region, do not return the geometry.\nReturn \"Unable to geocode\" instead.\n\n\n#### NOMINATIM_SERVE_LEGACY_URLS\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Enable serving via URLs with a .php suffix |\n| **Format:**        | boolean |\n| **Default:**       | yes |\n| **Comment:**       | Python frontend only |\n\nWhen enabled, then endpoints are reachable as `/<name>` as well as `/<name>.php`.\nThis can be useful when you want to be backwards-compatible with previous\nversions of Nominatim.\n\n\n#### NOMINATIM_API_POOL_SIZE\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Number of parallel database connections per worker |\n| **Format:**        | number |\n| **Default:**       | 10 |\n| **Comment:**       | Python frontend only |\n\nSets the maximum number of database connections available for a single instance\nof Nominatim. When configuring the maximum number of connections that your\nPostgreSQL database can handle, you need at least\n`NOMINATIM_API_POOL_SIZE` * `<number of configured workers>` connections.\nFor configuring the number of workers, refer to the section about\n[Deploying the Python frontend](../admin/Deployment-Python.md).\n\n#### NOMINATIM_QUERY_TIMEOUT\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Timeout for SQL queries to the database |\n| **Format:**        | number (seconds) |\n| **Default:**       | 10 |\n| **Comment:**       | Python frontend only |\n\nWhen this timeout is set, then all SQL queries that run longer than the\nspecified numbers of seconds will be cancelled and the user receives a\ntimeout exceptions. Users of the API see a 503 HTTP error.\n\nThe timeout does ont apply when using the\n[low-level DB access](../library/Low-Level-DB-Access.md)\nof the library. A timeout can be manually set, if required.\n\n\n#### NOMINATIM_REQUEST_TIMEOUT\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Timeout for search queries |\n| **Format:**        | number (seconds) |\n| **Default:**       | 60 |\n| **Comment:**       | Python frontend only |\n\nWhen this timeout is set, a search query will finish sending queries\nto the database after the timeout has passed and immediately return the\nresults gathered so far.\n\nNote that under high load you may observe that users receive different results\nthan usual without seeing an error. This may cause some confusion.\n\n#### NOMINATIM_OUTPUT_NAMES\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Specifies order of name tags |\n| **Format:**        | string: comma-separated list of tag names |\n| **Default:**       | name:XX,name,brand,official_name:XX,short_name:XX,official_name,short_name,ref |\n\nSpecifies the order in which different name tags are used.\nThe values in this list determine the preferred order of name variants,\nincluding language-specific names (in OSM: the name tag with and without any language suffix).\n\nComma-separated list, where :XX stands for language suffix\n(e.g. name:en) and no :XX stands for general tags (e.g. name).\n\nSee also [NOMINATIM_DEFAULT_LANGUAGE](#nominatim_default_language).\n\n!!! note\n    If NOMINATIM_OUTPUT_NAMES = `name:XX,name,short_name:XX,short_name` the search follows\n\n        ```\n        'name', 'short_name'\n        ```\n\n    if we have no preferred language order for showing search results.\n\n    For languages ['en', 'es'] the search follows\n\n        ```\n        'name:en', 'name:es',\n        'name',\n        'short_name:en', 'short_name:es',\n        'short_name'\n        ```\n\n    For those familiar with the internal implementation, the `_place_*` expansion is added, but to simplify, it is not included in this example.\n\n### Logging Settings\n\n#### NOMINATIM_LOG_FILE\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Log requests into a file |\n| **Format:**        | path |\n| **Default:**       | _empty_ (logging disabled) |\n\nEnable logging of requests into a file with this setting by setting the log\nfile where to log to. A relative file name is assumed to be relative to\nthe project directory. The format of the log output can be set\nwith NOMINATIM_LOG_FORMAT.\n\n#### NOMINATIM_LOG_FORMAT\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Log requests into a file |\n| **Format:**        | [Python String Format](https://docs.python.org/3/library/string.html#formatstrings) string |\n| **Default:**       | `[{start}] {total_time:.4f} {results_total} {endpoint} \"{query_string}\"` |\n\nDescribes the content of a log line for a single request. The format\nmust be readable by Python's format function. Nominatim provides a number\nof metrics than can be logged. The default set of metrics is the following:\n\n/// html | div.simple-table\n| name            | type   | Description |\n| --------------- | ------ | ------------|\n| start           | time   | Point in time when the request arrived. |\n| end             | time   | Point in time when the request was done. |\n| query_start     | time   | Point in time when processing started. |\n| total_time      | float  | Total time in seconds to handle the request. |\n| wait_time       | float  | Time in seconds the request waited for a database connection to be available. |\n| query_time      | float  | Total time in seconds to process the request once a connection was available. |\n| results_total   | int    | Number of results found. |\n| endpoint        | string | API endpoint used. |\n| query_string    | string | Raw query string received. |\n///\n\nVariables of type 'time' contain a UTC timestamp string in ISO format.\n\nNominatim also exposes additional metrics to help with development. These\nare subject to change between versions:\n\n/// html | div.simple-table\n| name                      | type   | Description |\n| ------------------------- | ------ | ------------|\n| search_rounds             | int    | Total number of searches executed for the request. |\n| search_min_penalty        | float  | Minimal possible penalty for the request. |\n| search_first_result_round | int    | Number of first search to yield any result. |\n| search_min_result_penalty | float  | Minimal penalty by a result found. |\n| search_best_penalty_round | int    | Search round that yielded the best penalty result. |\n///\n\n\n#### NOMINATIM_DEBUG_SQL\n\n| Summary            |                                                     |\n| --------------     | --------------------------------------------------- |\n| **Description:**   | Enable printing of raw SQL by SQLAlchemy |\n| **Format:**        | boolean |\n| **Default:**       | no |\n| **Comment:**       | **For developers only.** |\n\nThis settings enables\n[SQL debugging](https://docs.sqlalchemy.org/en/20/core/engines.html#dbengine-logging)\nby SQLAlchemy. This can be helpful when debugging some bugs with internal\nquery handling. It should only be used together with the CLI query functions.\nEnabling it for server mode may have unintended consequences. Use the `debug`\nparameter instead, which prints information on how the search is executed\nincluding SQL statements.\n"
  },
  {
    "path": "docs/customize/Special-Phrases.md",
    "content": "# Special phrases\n\n## Importing OSM user-maintained special phrases\n\nAs described in the [Import section](../admin/Import.md), it is possible to\nimport special phrases from the wiki with the following command:\n\n```sh\nnominatim special-phrases --import-from-wiki\n```\n\n## Importing custom special phrases\n\nSpecial phrases may also be imported from any custom CSV file. The file needs\nto have a header line, use comma as delimiter and define the following\ncolumns:\n\n * **phrase**: the keyword to look for\n * **class**: key of the main tag of the place to find\n   (see [Import styles](Import-Styles.md#how-processing-works)\n * **type**: value of the main tag\n * **operator**: type of special phrase, may be one of:\n     * *in*: place is within the place defined by the search term (e.g. \"_Hotels in_ Berlin\")\n     * *near*: place is near the place defined by the search term (e.g. \"_bus stops near_ Big Ben\")\n     * *named*: special phrase is a classifier (e.g. \"_hotel_ California\")\n     * *-*: unspecified, can be any of the above\n\nIf the file contains any other columns, then they are silently ignored\n\nTo import the CSV file, use the following command:\n\n```sh\nnominatim special-phrases --import-from-csv <csv file>\n```\n\nNote that the two previous import commands will update the phrases from your database.\nThis means that if you import some phrases from a CSV file, only the phrases\npresent in the CSV file will be kept in the database. All other phrases will\nbe removed.\n\nIf you want to only add new phrases and not update the other ones you can add\nthe argument `--no-replace` to the import command. For example:\n\n```sh\nnominatim special-phrases --import-from-csv <csv file> --no-replace\n```\n\nThis will add the phrases present in the CSV file into the database without\nremoving the other ones.\n"
  },
  {
    "path": "docs/customize/Tiger.md",
    "content": "# Installing TIGER housenumber data for the US\n\nNominatim is able to use the official [TIGER](https://www.census.gov/geographies/mapping-files/time-series/geo/tiger-line-file.html)\naddress set to complement the OSM house number data in the US. You can add\nTIGER data to your own Nominatim instance by following these steps. The\nentire US adds about 10GB to your database.\n\n  1. Get preprocessed TIGER data:\n\n        cd $PROJECT_DIR\n        wget https://nominatim.org/data/tiger-nominatim-preprocessed-latest.csv.tar.gz\n\n  2. Import the data into your Nominatim database:\n\n        nominatim add-data --tiger-data tiger-nominatim-preprocessed-latest.csv.tar.gz\n\n  3. Enable use of the Tiger data in your existing `.env` file by adding:\n\n        echo NOMINATIM_USE_US_TIGER_DATA=yes >> .env\n\n  4. Apply the new settings:\n\n        nominatim refresh --functions --website\n\n\nSee the [TIGER-data project](https://github.com/osm-search/TIGER-data) for more\ninformation on how the data got preprocessed.\n\n"
  },
  {
    "path": "docs/customize/Tokenizers.md",
    "content": "# Tokenizers\n\nThe tokenizer module in Nominatim is responsible for analysing the names given\nto OSM objects and the terms of an incoming query in order to make sure, they\ncan be matched appropriately.\n\nNominatim currently offers only one tokenizer module, the ICU tokenizer. This section\ndescribes the tokenizer and how it can be configured.\n\n!!! important\n    The selection of tokenizer is tied to a database installation. You need to choose\n    and configure the tokenizer before starting the initial import. Once the import\n    is done, you cannot switch to another tokenizer anymore. Reconfiguring the\n    chosen tokenizer is very limited as well. See the comments in each tokenizer\n    section.\n\n## ICU tokenizer\n\nThe ICU tokenizer uses the [ICU library](http://site.icu-project.org/) to\nnormalize names and queries. It also offers configurable decomposition and\nabbreviation handling.\nThis tokenizer is currently the default.\n\nTo enable the tokenizer add the following line to your project configuration:\n\n```\nNOMINATIM_TOKENIZER=icu\n```\n\n### How it works\n\nOn import the tokenizer processes names in the following three stages:\n\n1. During the **Sanitizer step** incoming names are cleaned up and converted to\n   **full names**. This step can be used to regularize spelling, split multi-name\n   tags into their parts and tag names with additional attributes. See the\n   [Sanitizers section](#sanitizers) below for available cleaning routines.\n2. The **Normalization** part removes all information from the full names\n   that are not relevant for search.\n3. The **Token analysis** step takes the normalized full names and creates\n   all transliterated variants under which the name should be searchable.\n   See the [Token analysis](#token-analysis) section below for more\n   information.\n\nDuring query time, the tokeinzer is responsible for processing incoming\nqueries. This happens in two stages:\n\n1. During **query preprocessing** the incoming text is split into name\n   chunks and normalised. This usually means applying the same normalisation\n   as during the import process but may involve other processing like,\n   for example, word break detection.\n2. The **token analysis** step breaks down the query parts into tokens,\n   looks them up in the database and assigns them possible functions and\n   probabilities.\n\nQuery processing can be further customized while the rest of the analysis\nis hard-coded.\n\n### Configuration\n\nThe ICU tokenizer is configured using a YAML file which can be configured using\n`NOMINATIM_TOKENIZER_CONFIG`. The configuration is read on import and then\nsaved as part of the internal database status. Later changes to the variable\nhave no effect.\n\nHere is an example configuration file:\n\n``` yaml\nquery-preprocessing:\n    - step: split_japanese_phrases\n    - step: regex_replace\n      replacements:\n        - pattern: https?://[^\\s]* # Filter URLs starting with http or https\n          replace: ''\n    - step: normalize\n\nnormalization:\n    - \":: lower ()\"\n    - \"ß > 'ss'\" # German szet is unambiguously equal to double ss\ntransliteration:\n    - !include /etc/nominatim/icu-rules/extended-unicode-to-asccii.yaml\n    - \":: Ascii ()\"\nsanitizers:\n    - step: split-name-list\ntoken-analysis:\n    - analyzer: generic\n      variants:\n          - !include icu-rules/variants-ca.yaml\n          - words:\n              - road -> rd\n              - bridge -> bdge,br,brdg,bri,brg\n      mutations:\n          - pattern: 'ä'\n            replacements: ['ä', 'ae']\n```\n\nThe configuration file contains five sections:\n`query-preprocessing`, `normalization`, `transliteration`, `sanitizers` and `token-analysis`.\n\n#### Query preprocessing\n\nThe section for `query-preprocessing` defines an ordered list of functions\nthat are applied to the query before the token analysis.\n\nThe following is a list of preprocessors that are shipped with Nominatim.\n\n##### normalize\n\n::: nominatim_api.query_preprocessing.normalize\n    options:\n        members: False\n        heading_level: 6\n        docstring_section_style: spacy\n\n##### regex-replace\n\n::: nominatim_api.query_preprocessing.regex_replace\n    options:\n        members: False\n        heading_level: 6\n        docstring_section_style: spacy\n    description: \n        This option runs any given regex pattern on the input and replaces values accordingly\n    replacements:\n        - pattern: regex pattern\n          replace: string to replace with\n\n\n#### Normalization and Transliteration\n\nThe normalization and transliteration sections each define a set of\nICU rules that are applied to the names.\n\nThe **normalization** rules are applied after sanitation. They should remove\nany information that is not relevant for search at all. Usual rules to be\napplied here are: lower-casing, removing of special characters, cleanup of\nspaces.\n\nThe **transliteration** rules are applied at the end of the tokenization\nprocess to transfer the name into an ASCII representation. Transliteration can\nbe useful to allow for further fuzzy matching, especially between different\nscripts.\n\nEach section must contain a list of\n[ICU transformation rules](https://unicode-org.github.io/icu/userguide/transforms/general/rules.html).\nThe rules are applied in the order in which they appear in the file.\nYou can also include additional rules from external yaml file using the\n`!include` tag. The included file must contain a valid YAML list of ICU rules\nand may again include other files.\n\n!!! warning\n    The ICU rule syntax contains special characters that conflict with the\n    YAML syntax. You should therefore always enclose the ICU rules in\n    double-quotes.\n\n#### Sanitizers\n\nThe sanitizers section defines an ordered list of functions that are applied\nto the name and address tags before they are further processed by the tokenizer.\nThey allows to clean up the tagging and bring it to a standardized form more\nsuitable for building the search index.\n\n!!! hint\n    Sanitizers only have an effect on how the search index is built. They\n    do not change the information about each place that is saved in the\n    database. In particular, they have no influence on how the results are\n    displayed. The returned results always show the original information as\n    stored in the OpenStreetMap database.\n\nEach entry contains information of a sanitizer to be applied. It has a\nmandatory parameter `step` which gives the name of the sanitizer. Depending\non the type, it may have additional parameters to configure its operation.\n\nThe order of the list matters. The sanitizers are applied exactly in the order\nthat is configured. Each sanitizer works on the results of the previous one.\n\nThe following is a list of sanitizers that are shipped with Nominatim.\n\n##### split-name-list\n\n::: nominatim_db.tokenizer.sanitizers.split_name_list\n    options:\n        members: False\n        heading_level: 6\n        docstring_section_style: spacy\n\n##### strip-brace-terms\n\n::: nominatim_db.tokenizer.sanitizers.strip_brace_terms\n    options:\n        members: False\n        heading_level: 6\n        docstring_section_style: spacy\n\n##### tag-analyzer-by-language\n\n::: nominatim_db.tokenizer.sanitizers.tag_analyzer_by_language\n    options:\n        members: False\n        heading_level: 6\n        docstring_section_style: spacy\n\n##### clean-housenumbers\n\n::: nominatim_db.tokenizer.sanitizers.clean_housenumbers\n    options:\n        members: False\n        heading_level: 6\n        docstring_section_style: spacy\n\n##### clean-postcodes\n\n::: nominatim_db.tokenizer.sanitizers.clean_postcodes\n    options:\n        members: False\n        heading_level: 6\n        docstring_section_style: spacy\n\n##### clean-tiger-tags\n\n::: nominatim_db.tokenizer.sanitizers.clean_tiger_tags\n    options:\n        members: False\n        heading_level: 6\n        docstring_section_style: spacy\n\n#### delete-tags\n\n::: nominatim_db.tokenizer.sanitizers.delete_tags\n    options:\n        members: False\n        heading_level: 6\n        docstring_section_style: spacy\n\n#### tag-japanese\n\n::: nominatim_db.tokenizer.sanitizers.tag_japanese\n    options:\n        members: False\n        heading_level: 6\n        docstring_section_style: spacy\n\n#### Token Analysis\n\nToken analyzers take a full name and transform it into one or more normalized\nform that are then saved in the search index. In its simplest form, the\nanalyzer only applies the transliteration rules. More complex analyzers\ncreate additional spelling variants of a name. This is useful to handle\ndecomposition and abbreviation.\n\nThe ICU tokenizer may use different analyzers for different names. To select\nthe analyzer to be used, the name must be tagged with the `analyzer` attribute\nby a sanitizer (see for example the\n[tag-analyzer-by-language sanitizer](#tag-analyzer-by-language)).\n\nThe token-analysis section contains the list of configured analyzers. Each\nanalyzer must have an `id` parameter that uniquely identifies the analyzer.\nThe only exception is the default analyzer that is used when no special\nanalyzer was selected. There are analysers with special ids:\n\n * '@housenumber'. If an analyzer with that name is present, it is used\n   for normalization of house numbers.\n * '@potcode'. If an analyzer with that name is present, it is used\n   for normalization of postcodes.\n\nDifferent analyzer implementations may exist. To select the implementation,\nthe `analyzer` parameter must be set. The different implementations are\ndescribed in the following.\n\n##### Generic token analyzer\n\nThe generic analyzer `generic` is able to create variants from a list of given\nabbreviation and decomposition replacements and introduce spelling variations.\n\n###### Variants\n\nThe optional 'variants' section defines lists of replacements which create alternative\nspellings of a name. To create the variants, a name is scanned from left to\nright and the longest matching replacement is applied until the end of the\nstring is reached.\n\nThe variants section must contain a list of replacement groups. Each group\ndefines a set of properties that describes where the replacements are\napplicable. In addition, the word section defines the list of replacements\nto be made. The basic replacement description is of the form:\n\n```\n<source>[,<source>[...]] => <target>[,<target>[...]]\n```\n\nThe left side contains one or more `source` terms to be replaced. The right side\nlists one or more replacements. Each source is replaced with each replacement\nterm.\n\n!!! tip\n    The source and target terms are internally normalized using the\n    normalization rules given in the configuration. This ensures that the\n    strings match as expected. In fact, it is better to use unnormalized\n    words in the configuration because then it is possible to change the\n    rules for normalization later without having to adapt the variant rules.\n\n###### Decomposition\n\nIn its standard form, only full words match against the source. There\nis a special notation to match the prefix and suffix of a word:\n\n``` yaml\n- ~strasse => str  # matches \"strasse\" as full word and in suffix position\n- hinter~ => hntr  # matches \"hinter\" as full word and in prefix position\n```\n\nThere is no facility to match a string in the middle of the word. The suffix\nand prefix notation automatically trigger the decomposition mode: two variants\nare created for each replacement, one with the replacement attached to the word\nand one separate. So in above example, the tokenization of \"hauptstrasse\" will\ncreate the variants \"hauptstr\" and \"haupt str\". Similarly, the name \"rote strasse\"\ntriggers the variants \"rote str\" and \"rotestr\". By having decomposition work\nboth ways, it is sufficient to create the variants at index time. The variant\nrules are not applied at query time.\n\nTo avoid automatic decomposition, use the '|' notation:\n\n``` yaml\n- ~strasse |=> str\n```\n\nsimply changes \"hauptstrasse\" to \"hauptstr\" and \"rote strasse\" to \"rote str\".\n\n###### Initial and final terms\n\nIt is also possible to restrict replacements to the beginning and end of a\nname:\n\n``` yaml\n- ^south => s  # matches only at the beginning of the name\n- road$ => rd  # matches only at the end of the name\n```\n\nSo the first example would trigger a replacement for \"south 45th street\" but\nnot for \"the south beach restaurant\".\n\n###### Replacements vs. variants\n\nThe replacement syntax `source => target` works as a pure replacement. It changes\nthe name instead of creating a variant. To create an additional version, you'd\nhave to write `source => source,target`. As this is a frequent case, there is\na shortcut notation for it:\n\n```\n<source>[,<source>[...]] -> <target>[,<target>[...]]\n```\n\nThe simple arrow causes an additional variant to be added. Note that\ndecomposition has an effect here on the source as well. So a rule\n\n``` yaml\n- \"~strasse -> str\"\n```\n\nmeans that for a word like `hauptstrasse` four variants are created:\n`hauptstrasse`, `haupt strasse`, `hauptstr` and `haupt str`.\n\n###### Mutations\n\nThe 'mutation' section in the configuration describes an additional set of\nreplacements to be applied after the variants have been computed.\n\nEach mutation is described by two parameters: `pattern` and `replacements`.\nThe pattern must contain a single regular expression to search for in the\nvariant name. The regular expressions need to follow the syntax for\n[Python regular expressions](file:///usr/share/doc/python3-doc/html/library/re.html#regular-expression-syntax).\nCapturing groups are not permitted.\n`replacements` must contain a list of strings that the pattern\nshould be replaced with. Each occurrence of the pattern is replaced with\nall given replacements. Be mindful of combinatorial explosion of variants.\n\n###### Modes\n\nThe generic analyser supports a special mode `variant-only`. When configured\nthen it consumes the input token and emits only variants (if any exist). Enable\nthe mode by adding:\n\n```\n  mode: variant-only\n```\n\nto the analyser configuration.\n\n##### Housenumber token analyzer\n\nThe analyzer `housenumbers` is purpose-made to analyze house numbers. It\ncreates variants with optional spaces between numbers and letters. Thus,\nhouse numbers of the form '3 a', '3A', '3-A' etc. are all considered equivalent.\n\nThe analyzer cannot be customized.\n\n##### Postcode token analyzer\n\nThe analyzer `postcodes` is pupose-made to analyze postcodes. It supports\na 'lookup' variant of the token, which produces variants with optional\nspaces. Use together with the clean-postcodes sanitizer.\n\nThe analyzer cannot be customized.\n\n### Reconfiguration\n\nChanging the configuration after the import is currently not possible, although\nthis feature may be added at a later time.\n"
  },
  {
    "path": "docs/develop/Database-Layout.md",
    "content": "# Database Layout\n\n### Import tables\n\nOSM data is initially imported using [osm2pgsql](https://osm2pgsql.org).\nNominatim uses a custom flex style to create the initial import tables.\n\nThe import process creates the following tables:\n\n![osm2pgsql tables](osm2pgsql-tables.svg)\n\nThe `planet_osm_*` tables are the usual backing tables for OSM data. Note\nthat Nominatim uses them to look up special relations and to find nodes on\nways. Apart from those the osm2pgsql import produces three tables as output.\n\nThe **place_postcode** table collects postcode information that is not\nalready present on an object in the place table. That is for one thing\n[postcode area relations](https://wiki.openstreetmap.org/wiki/Tag:boundary%3Dpostal_code)\nand for another objects with a postcode tag but no other tagging that\nqualifies it for inclusion into the geocoding database.\n\nThe table has the following fields:\n\n * `osm_type` - kind of OSM object (**N** - node, **W** - way, **R** - relation)\n * `osm_id` - original OSM ID\n * `postcode` - postcode as extacted from the `postcal_code` tag\n * `country_code` - computed country code for this postcode. This field\n   functions as a cache and is only computed when the table is used for\n   the computation of the final postcodes.\n * `centroid` - centroid of the object\n * `geometry` - the full geometry of the area for postcode areas only\n\nThe **place_interpolation** table holds all\n[address interpolation lines](https://wiki.openstreetmap.org/wiki/Addresses#Interpolation)\nand has the following fields:\n\n * `osm_id` - original OSM ID\n * `type` - type of interpolation as extracted from the `addr:interpolation` tag\n * `address` - any other `addr:*` tags\n * `nodes` - list of OSM nodes contained in this interpolation,\n    needed to compute the involved housenumbers later\n * `geometry` - the linestring for the interpolation (in WSG84)\n\nThe **place** table holds all other OSM object that are interesting and\nhas the following fields:\n\n * `osm_type` - kind of OSM object (**N** - node, **W** - way, **R** - relation)\n * `osm_id` - original OSM ID\n * `class` - key of principal tag defining the object type\n * `type` - value of principal tag defining the object type\n * `name` - collection of tags that contain a name or reference\n * `admin_level` - numerical value of the tagged administrative level\n * `address` - collection of tags defining the address of an object\n * `extratags` - collection of additional interesting tags that are not\n                 directly relevant for searching\n * `geometry` - geometry of the object (in WGS84)\n\nA single OSM object may appear multiple times in this table when it is tagged\nwith multiple tags that may constitute a principal tag. Take for example a\nmotorway bridge. In OSM, this would be a way which is tagged with\n`highway=motorway` and `bridge=yes`. This way would appear in the `place` table\nonce with `class` of `highway` and once with a `class` of `bridge`. Thus the\n*unique key* for `place` is (`osm_type`, `osm_id`, `class`).\n\nHow raw OSM tags are mapped to the columns in the place table is to a certain\ndegree configurable. See [Customizing Import Styles](../customize/Import-Styles.md)\nfor more information.\n\n### Search tables\n\nThe following tables carry all information needed to do the search:\n\n![search tables](search-tables.svg)\n\nThe **placex** table is the central table that saves all information about the\nsearchable places in Nominatim. \n\nIn simpler terms, the `placex` table can be seen as the final, processed version of OSM data that is ready for search.\nWhile the `place` table contains raw imported data, `placex` stores enriched and indexed data that includes ranking, hierarchy (parent-child relationships), and computed metadata such as importance and postcode.\nMost search queries in Nominatim ultimately read from this table, making it the core table for forward and reverse geocoding.\n\nThe basic columns are the same as for the\nplace table and have the same meaning. The placex tables adds the following\nadditional columns:\n\n * `place_id` - the internal unique ID to identify the place\n * `partition` - the id to use with partitioned tables (see below)\n * `geometry_sector` - a location hash used for geographically close ordering\n * `parent_place_id` - the next higher place in the address hierarchy, only\n   relevant for POI-type places (with rank 30)\n * `linked_place_id` - place ID of the place this object has been merged with.\n   When this ID is set, then the place is invisible for search.\n * `importance` - measure how well known the place is\n * `rank_search`, `rank_address` - search and address rank (see [Customizing ranking](../customize/Ranking.md)\n * `wikipedia` - the wikipedia page used for computing the importance of the place\n * `country_code` - the country the place is located in\n * `housenumber` - normalized housenumber, if the place has one\n * `postcode` - computed postcode for the place\n * `indexed_status` - processing status of the place (0 - ready, 1 - freshly inserted, 2 - needs updating, 100 - needs deletion)\n * `indexed_date` - timestamp when the place was processed last\n * `centroid` - a point feature for the place\n * `token_info` - a dummy field used to inject information from the tokenizer\n   into the indexing process\n\nFor implementation details, see the SQL definition in `lib-sql/tables/placex.sql` and the SQLAlchemy schema in `src/nominatim_api/sql/sqlalchemy_schema.py`.\n\nThe **location_property_osmline** table is a special table for\n[address interpolations](https://wiki.openstreetmap.org/wiki/Addresses#Using_interpolation).\nThe columns have the same meaning and use as the columns with the same name in\nthe placex table. Only the following columns are special:\n\n * `startnumber`, `endnumber` and `step` - beginning and end of the number range\n    for the interpolation and the increment steps\n * `type` - a string to indicate the interval between the numbers as imported\n   from the OSM `addr:interpolation` tag; valid values are `odd`, `even`, `all`\n   or a single digit number; interpolations with other values are silently\n   dropped\n\nAddress interpolations are always ways in OSM, which is why there is no column\n`osm_type`.\n\nThe **location_postcodes** table holds computed postcode assembled from the\npostcode information available in OSM. When a postcode has a postcode area\nrelation, then the table stores its full geometry. For all other postcode\nthe centroid is computed using the position of all OSM object that reference\nthe same postoce. The `osm_id` field can be used to distinguish the two.\nWhen set, it refers to the OSM relation with the postcode area.\nThe meaning of the columns in the table is again the same as that of the\nplacex table.\n\nEvery place needs an address, a set of surrounding places that describe the\nlocation of the place. The set of address places is made up of OSM places\nthemselves. The **place_addressline** table cross-references for each place\nall the places that make up its address. Two columns define the address\nrelation:\n\n  * `place_id` - reference to the place being addressed\n  * `address_place_id` - reference to the place serving as an address part\n\nThe most of the columns cache information from the placex entry of the address\npart. The exceptions are:\n\n  * `fromarea` - is true if the address part has an area geometry and can\n    therefore be considered preceise\n  * `isaddress` - is true if the address part should show up in the address\n    output. Sometimes there are multiple places competing for for same address\n    type (e.g. multiple cities) and this field resolves the tie.\n\nThe **search_name** table contains the search index proper. It saves for each\nplace the terms with which the place can be found. The terms are split into\nthe name itself and all terms that make up the address. The table mirrors some\nof the columns from placex for faster lookup.\n\nSearch terms are not saved as strings. Each term is assigned an integer and those\nintegers are saved in the name and address vectors of the search_name table. The\n**word** table serves as the lookup table from string to such a word ID. The\nexact content of the word table depends on the [tokenizer](Tokenizers.md) used.\n\n## Address computation tables\n\nNext to the main search tables, there is a set of secondary helper tables used\nto compute the address relations between places. These tables are partitioned.\nEach country is assigned a partition number in the country_name table (see\nbelow) and the data is then split between a set of tables, one for each\npartition. Note that Nominatim still manually manages partitioned tables.\nNative support for partitions in PostgreSQL only became usable with version 13.\nIt will be a little while before Nominatim drops support for older versions.\n\n![address tables](address-tables.svg)\n\nThe **search_name_X** tables are used to look up streets that appear in the\n`addr:street` tag.\n\nThe **location_area_large_X** tables are used to look up larger areas\n(administrative boundaries and place nodes) either through their geographic\ncloseness or through `addr:*` entries.\n\nThe **location_road_X** tables are used to find the closest street for a\ndependent place.\n\nAll three table cache specific information from the placex table for their\nselected subset of places:\n\n * `keywords` and `name_vector` contain lists of term ids (from the word table)\n   that the full name of the place should match against\n * `isguess` is true for places that are not described by an area\n\nAll other columns reflect their counterpart in the placex table.\n\n## Static data tables\n\nNominatim also creates a number of static tables at import:\n\n * `nominatim_properties` saves settings that must not be changed after\n    import\n * `address_levels` save the rank information from the\n   [ranking configuration](../customize/Ranking.md)\n * `country_name` contains a fallback of names for all countries, their\n   default languages and saves the assignment of countries to partitions.\n * `country_osm_grid` provides a fallback for country geometries\n\n## Auxiliary data tables\n\nFinally there are some table for auxiliary data:\n\n * `location_property_tiger` - saves housenumber from the Tiger import. Its\n   layout is similar to that of `location_propoerty_osmline`.\n * `place_class_*` tables are helper tables to facilitate lookup of POIs\n   by their class and type. They exist because it is not possible to create\n   combined indexes with geometries.\n\n"
  },
  {
    "path": "docs/develop/Development-Environment.md",
    "content": "# Setting up Nominatim for Development\n\nThis chapter gives an overview how to set up Nominatim for development\nand how to run tests.\n\n!!! Important\n    This guide assumes you develop under the latest version of Debian/Ubuntu.\n    You can of course also use your favourite distribution. You just might have\n    to adapt the commands below slightly, in particular the commands for\n    installing additional software.\n\n## Installing Nominatim\n\nThe first step is to install Nominatim itself. Please follow the installation\ninstructions in the [Admin section](../admin/Installation.md). You don't need\nto set up a webserver for development, the webserver that can be started\nvia `nominatim serve` is sufficient.\n\nIf you want to run Nominatim in a VM via Vagrant, use the default `ubuntu24` setup.\nVagrant's libvirt provider runs out-of-the-box under Ubuntu. You also need to\ninstall an NFS daemon to enable directory sharing between host and guest. The\nfollowing packages should get you started:\n\n    sudo apt install vagrant vagrant-libvirt libvirt-daemon nfs-kernel-server\n\n## Prerequisites for testing and documentation\n\nThe Nominatim test suite consists of behavioural tests (using pytest-bdd) and\nunit tests (using pytest). It has the following additional requirements:\n\n* [flake8](https://flake8.pycqa.org/en/stable/) (CI always runs the latest version from pip)\n* [mypy](http://mypy-lang.org/) (plus typing information for external libs)\n* [Python Typing Extensions](https://github.com/python/typing_extensions) (for Python < 3.9)\n* [pytest](https://pytest.org)\n* [pytest-asyncio](https://pytest-asyncio.readthedocs.io)\n* [pytest-bdd](https://pytest-bdd.readthedocs.io)\n\nFor testing the Python search frontend, you need to install extra dependencies\ndepending on your choice of webserver framework:\n\n* [httpx](https://www.python-httpx.org/) (Starlette only)\n* [asgi-lifespan](https://github.com/florimondmanca/asgi-lifespan) (Starlette only)\n\nThe documentation is built with mkdocs:\n\n* [mkdocs](https://www.mkdocs.org/) >= 1.1.2\n* [mkdocstrings](https://mkdocstrings.github.io/) >= 0.25\n* [mkdocs-material](https://squidfunk.github.io/mkdocs-material/)\n* [mkdocs-gen-files](https://oprypin.github.io/mkdocs-gen-files/)\n\n\n### Installing prerequisites on Ubuntu/Debian\n\nThe Python tools should always be run with the most recent version.\nThe easiest way, to handle these Python dependencies is to run your\ndevelopment from within a virtual environment.\n\n```sh\nsudo apt install build-essential libsqlite3-mod-spatialite osm2pgsql \\\n                 postgresql-postgis postgresql-postgis-scripts \\\n                 pkg-config libicu-dev virtualenv\n```\n\nTo set up the virtual environment with all necessary packages run:\n\n```sh\nvirtualenv ~/nominatim-dev-venv\n~/nominatim-dev-venv/bin/pip install\\\n    psutil 'psycopg[binary]' PyICU SQLAlchemy \\\n    python-dotenv jinja2 pyYAML \\\n    mkdocs 'mkdocstrings[python]' mkdocs-gen-files mkdocs-material \\\n    pytest pytest-asyncio pytest-bdd flake8 \\\n    types-jinja2 types-markupsafe types-psutil types-psycopg2 \\\n    types-pygments types-pyyaml types-requests types-ujson \\\n    types-urllib3 typing-extensions gunicorn falcon starlette \\\n    uvicorn mypy osmium aiosqlite mwparserfromhell\n```\n\nNow enter the virtual environment whenever you want to develop:\n\n```sh\n. ~/nominatim-dev-venv/bin/activate\n```\n\n### Running Nominatim during development\n\nThe source code for Nominatim can be found in the `src` directory and can\nbe run in-place. The source directory features a special script\n`nominatim-cli.py` which does the same as the installed 'nominatim' binary\nbut executes against the code in the source tree. For example:\n\n```\nme@machine:~$ cd Nominatim\nme@machine:~Nominatim$ ./nominatim-cli.py --version\nNominatim version 5.1.0-0\n```\n\nMake sure you have activated the virtual environment holding all\nnecessary dependencies.\n\n## Executing Tests\n\nAll tests are located in the `/test` directory.\n\nTo run all tests, run make from the source root:\n\n```sh\nmake tests\n```\n\nThere are also make targets for executing only parts of the test suite.\nFor example to run linting only use:\n\n```sh\nmake lint\n```\n\nThe possible testing targets are: mypy, lint, pytest, bdd.\n\nFor more information about the structure of the tests and how to change and\nextend the test suite, see the [Testing chapter](Testing.md).\n\n## Documentation Pages\n\nThe [Nominatim documentation](https://nominatim.org/release-docs/develop/) is\nbuilt using the [MkDocs](https://www.mkdocs.org/) static site generation\nframework. The master branch is automatically deployed every night on\n[https://nominatim.org/release-docs/develop/](https://nominatim.org/release-docs/develop/)\n\nTo build the documentation run\n\n```\nmake doc\n```\n\n\nFor local testing, you can start webserver:\n\n```\nbuild> make serve-doc\n[server:296] Serving on http://127.0.0.1:8000\n[handlers:62] Start watching changes\n```\n\nIf you develop inside a Vagrant virtual machine, use a port that is forwarded\nto your host:\n\n```\nbuild> mkdocs serve --dev-addr 0.0.0.0:8088\n[server:296] Serving on http://0.0.0.0:8088\n[handlers:62] Start watching changes\n```\n"
  },
  {
    "path": "docs/develop/ICU-Tokenizer-Modules.md",
    "content": "# Writing custom sanitizer and token analysis modules for the ICU tokenizer\n\nThe [ICU tokenizer](../customize/Tokenizers.md#icu-tokenizer) provides a\nhighly customizable method to pre-process and normalize the name information\nof the input data before it is added to the search index. It comes with a\nselection of sanitizers and token analyzers which you can use to adapt your\ninstallation to your needs. If the provided modules are not enough, you can\nalso provide your own implementations. This section describes the API\nof sanitizers and token analysis.\n\n!!! warning\n    This API is currently in early alpha status. While this API is meant to\n    be a public API on which other sanitizers and token analyzers may be\n    implemented, it is not guaranteed to be stable at the moment.\n\n\n## Using non-standard modules\n\nSanitizer names (in the `step` property), token analysis names (in the\n`analyzer`) and query preprocessor names (in the `step` property)\nmay refer to externally supplied modules. There are two ways\nto include external modules: through a library or from the project directory.\n\nTo include a module from a library, use the absolute import path as name and\nmake sure the library can be found in your PYTHONPATH.\n\nTo use a custom module without creating a library, you can put the module\nsomewhere in your project directory and then use the relative path to the\nfile. Include the whole name of the file including the `.py` ending.\n\n## Custom query preprocessors\n\nA query preprocessor must export a single factory function `create` with\nthe following signature:\n\n``` python\ncreate(self, config: QueryConfig) -> Callable[[list[Phrase]], list[Phrase]]\n```\n\nThe function receives the custom configuration for the preprocessor and\nreturns a callable (function or class) with the actual preprocessing\ncode. When a query comes in, then the callable gets a list of phrases\nand needs to return the transformed list of phrases. The list and phrases\nmay be changed in place or a completely new list may be generated.\n\nThe `QueryConfig` is a simple dictionary which contains all configuration\noptions given in the yaml configuration of the ICU tokenizer. It is up to\nthe function to interpret the values.\n\nA `nominatim_api.search.Phrase` describes a part of the query that contains one or more independent\nsearch terms. Breaking a query into phrases helps reducing the number of\npossible tokens Nominatim has to take into account. However a phrase break\nis definitive: a multi-term search word cannot go over a phrase break.\nA Phrase object has two fields:\n\n * `ptype` further refines the type of phrase (see list below)\n * `text` contains the query text for the phrase\n\nThe order of phrases matters to Nominatim when doing further processing.\nThus, while you may split or join phrases, you should not reorder them\nunless you really know what you are doing.\n\nPhrase types can further help narrowing down how the tokens in the phrase\nare interpreted. The following phrase types are known:\n\n| Name           | Description |\n|----------------|-------------|\n| PHRASE_ANY     | No specific designation (i.e. source is free-form query) |\n| PHRASE_AMENITY | Contains name or type of a POI |\n| PHRASE_STREET  | Contains a street name optionally with a housenumber |\n| PHRASE_CITY    | Contains the postal city |\n| PHRASE_COUNTY  | Contains the equivalent of a county |\n| PHRASE_STATE   | Contains a state or province |\n| PHRASE_POSTCODE| Contains a postal code |\n| PHRASE_COUNTRY | Contains the country name or code |\n\n\n## Custom sanitizer modules\n\nA sanitizer module must export a single factory function `create` with the\nfollowing signature:\n\n``` python\ndef create(config: SanitizerConfig) -> Callable[[ProcessInfo], None]\n```\n\nThe function receives the custom configuration for the sanitizer and must\nreturn a callable (function or class) that transforms the name and address\nterms of a place. When a place is processed, then a `ProcessInfo` object\nis created from the information that was queried from the database. This\nobject is sequentially handed to each configured sanitizer, so that each\nsanitizer receives the result of processing from the previous sanitizer.\nAfter the last sanitizer is finished, the resulting name and address lists\nare forwarded to the token analysis module.\n\nSanitizer functions are instantiated once and then called for each place\nthat is imported or updated. They don't need to be thread-safe.\nIf multi-threading is used, each thread creates their own instance of\nthe function.\n\n### Sanitizer configuration\n\n::: nominatim_db.tokenizer.sanitizers.config.SanitizerConfig\n    options:\n        heading_level: 6\n\n### The main filter function of the sanitizer\n\nThe filter function receives a single object of type `ProcessInfo`\nwhich has with three members:\n\n * `place: PlaceInfo`: read-only information about the place being processed.\n   See PlaceInfo below.\n * `names: List[PlaceName]`: The current list of names for the place.\n * `address: List[PlaceName]`: The current list of address names for the place.\n\nWhile the `place` member is provided for information only, the `names` and\n`address` lists are meant to be manipulated by the sanitizer. It may add and\nremove entries, change information within a single entry (for example by\nadding extra attributes) or completely replace the list with a different one.\n\n#### PlaceInfo - information about the place\n\n::: nominatim_db.data.place_info.PlaceInfo\n    options:\n        heading_level: 6\n\n\n#### PlaceName - extended naming information\n\n::: nominatim_db.data.place_name.PlaceName\n    options:\n        heading_level: 6\n\n\n### Example: Filter for US street prefixes\n\nThe following sanitizer removes the directional prefixes from street names\nin the US:\n\n!!! example\n    ``` python\n    import re\n\n    def _filter_function(obj):\n        if obj.place.country_code == 'us' \\\n           and obj.place.rank_address >= 26 and obj.place.rank_address <= 27:\n            for name in obj.names:\n                name.name = re.sub(r'^(north|south|west|east) ',\n                                   '',\n                                   name.name,\n                                   flags=re.IGNORECASE)\n\n    def create(config):\n        return _filter_function\n    ```\n\nThis is the most simple form of a sanitizer module. If defines a single\nfilter function and implements the required `create()` function by returning\nthe filter.\n\nThe filter function first checks if the object is interesting for the\nsanitizer. Namely it checks if the place is in the US (through `country_code`)\nand it the place is a street (a `rank_address` of 26 or 27). If the\nconditions are met, then it goes through all available names and\nremoves any leading directional prefix using a simple regular expression.\n\nSave the source code in a file in your project directory, for example as\n`us_streets.py`. Then you can use the sanitizer in your `icu_tokenizer.yaml`:\n\n``` yaml\n...\nsanitizers:\n    - step: us_streets.py\n...\n```\n\n!!! warning\n    This example is just a simplified show case on how to create a sanitizer.\n    It is not really meant for real-world use: while the sanitizer would\n    correctly transform `West 5th Street` into `5th Street`. it would also\n    shorten a simple `North Street` to `Street`.\n\nFor more sanitizer examples, have a look at the sanitizers provided by Nominatim.\nThey can be found in the directory\n[`src/nominatim_db/tokenizer/sanitizers`](https://github.com/osm-search/Nominatim/tree/master/src/nominatim_db/tokenizer/sanitizers).\n\n\n## Custom token analysis module\n\n::: nominatim_db.tokenizer.token_analysis.base.AnalysisModule\n    options:\n        heading_level: 6\n\n\n::: nominatim_db.tokenizer.token_analysis.base.Analyzer\n    options:\n        heading_level: 6\n\n### Example: Creating acronym variants for long names\n\nThe following example of a token analysis module creates acronyms from\nvery long names and adds them as a variant:\n\n``` python\nclass AcronymMaker:\n    \"\"\" This class is the actual analyzer.\n    \"\"\"\n    def __init__(self, norm, trans):\n        self.norm = norm\n        self.trans = trans\n\n\n    def get_canonical_id(self, name):\n        # In simple cases, the normalized name can be used as a canonical id.\n        return self.norm.transliterate(name.name).strip()\n\n\n    def compute_variants(self, name):\n        # The transliterated form of the name always makes up a variant.\n        variants = [self.trans.transliterate(name)]\n\n        # Only create acronyms from very long words.\n        if len(name) > 20:\n            # Take the first letter from each word to form the acronym.\n            acronym = ''.join(w[0] for w in name.split())\n            # If that leds to an acronym with at least three letters,\n            # add the resulting acronym as a variant.\n            if len(acronym) > 2:\n                # Never forget to transliterate the variants before returning them.\n                variants.append(self.trans.transliterate(acronym))\n\n        return variants\n\n# The following two functions are the module interface.\n\ndef configure(rules, normalizer, transliterator):\n    # There is no configuration to parse and no data to set up.\n    # Just return an empty configuration.\n    return None\n\n\ndef create(normalizer, transliterator, config):\n    # Return a new instance of our token analysis class above.\n    return AcronymMaker(normalizer, transliterator)\n```\n\nGiven the name `Trans-Siberian Railway`, the code above would return the full\nname `Trans-Siberian Railway` and the acronym `TSR` as variant, so that\nsearching would work for both.\n\n## Sanitizers vs. Token analysis - what to use for variants?\n\nIt is not always clear when to implement variations in the sanitizer and\nwhen to write a token analysis module. Just take the acronym example\nabove: it would also have been possible to write a sanitizer which adds the\nacronym as an additional name to the name list. The result would have been\nsimilar. So which should be used when?\n\nThe most important thing to keep in mind is that variants created by the\ntoken analysis are only saved in the word lookup table. They do not need\nextra space in the search index. If there are many spelling variations, this\ncan mean quite a significant amount of space is saved.\n\nWhen creating additional names with a sanitizer, these names are completely\nindependent. In particular, they can be fed into different token analysis\nmodules. This gives a much greater flexibility but at the price that the\nadditional names increase the size of the search index.\n\n"
  },
  {
    "path": "docs/develop/Indexing.md",
    "content": "# Indexing Places\n\nIn Nominatim, the word __indexing__ refers to the process that takes the raw\nOpenStreetMap data from the place table, enriches it with address information\nand creates the search indexes. This section explains the basic data flow.\n\n\n## Initial import\n\nAfter osm2pgsql has loaded the raw OSM data into the place table,\nthe data is copied to the final search tables placex and location_property_osmline.\nWhile they are copied, some basic properties are added:\n\n * country_code, geometry_sector and partition\n * initial search and address rank\n\nIn addition the column `indexed_status` is set to `1` marking the place as one\nthat needs to be indexed.\n\nAll this happens in the triggers `placex_insert` and `osmline_insert`.\n\n## Indexing\n\nThe main work horse of the data import is the indexing step, where Nominatim\ntakes every place from the placex and location_property_osmline tables where\nthe indexed_status != 0 and computes the search terms and the address parts\nof the place.\n\nThe indexing happens in three major steps:\n\n1. **Data preparation** - The indexer gets the data for the place to be indexed\n   from the database.\n\n2. **Search name processing** - The prepared data is given to the\n   tokenizer which computes the search terms from the names\n   and potentially other information.\n\n3. **Address processing** - The indexer then hands the prepared data and the\n   tokenizer information back to the database via an `INSERT` statement which\n   also sets the indexed_status to `0`. This triggers the update triggers\n   `placex_update`/`osmline_update` which do the work of computing address\n   parts and filling all the search tables.\n\nWhen computing the address terms of a place, Nominatim relies on the processed\nsearch names of all the address parts. That is why places are processed in rank\norder, from smallest rank to largest. To ensure correct handling of linked\nplace nodes, administrative boundaries are processed before all other places.\n\nApart from these restrictions, each place can be indexed independently\nfrom the others. This allows a large degree of parallelization during the indexing.\nIt also means that the indexing process can be interrupted at any time and\nwill simply pick up where it left of when restarted.\n\n### Data preparation\n\nThe data preparation step computes and retrieves all data for a place that\nmight be needed for the next step of processing the search name. That includes\n\n* location information (country code)\n* place classification (class, type, ranks)\n* names (including names of linked places)\n* address information (`addr:*` tags)\n\nData preparation is implemented in pl/PgSQL mostly in the functions\n`placex_indexing_prepare()` and `get_interpolation_address()`.\n\n#### `addr:*` tag inheritance\n\nNominatim has limited support for inheriting address tags from a building\nto POIs inside the building. This only works when the address tags are on the\nbuilding outline. Any rank 30 object inside such a building or on its outline\ninherits all address tags when it does not have any address tags of its own.\n\nThe inheritance is computed in the data preparation step.\n\n### Search name processing\n\nThe prepared place information is handed to the tokenizer next. This is a\nPython module responsible for processing the names  from both name and address\nterms and building up the word index from them. The process is explained in\nmore detail in the [Tokenizer chapter](Tokenizers.md).\n\n### Address processing\n\nFinally, the preprocessed place information and the results of the search name\nprocessing are written back to the database. At this point the update trigger\nof the placex/location_property_osmline tables take over and fill all the\ndependent tables. This makes up the most work-intensive part of the indexing.\n\nNominatim distinguishes between dependent and independent places.\n**Dependent places** are all places on rank 30: house numbers, POIs etc. These\nplaces don't have a full address of their own. Instead they are attached to\na parent street or place and use the information of the parent for searching\nand displaying information. Everything else are **independent places**: streets,\nparks, water bodies, suburbs, cities, states etc.  They receive a full address\non their own.\n\nThe address processing for both types of places is very different.\n\n#### Independent places\n\nTo compute the address of an independent place Nominatim searches for all\nplaces that cover the place to compute the address for at least partially.\nFor places with an area, that area is used to check for coverage. For place\nnodes an artificial square area is computed according to the rank of\nthe place. The lower the rank the lager the area. The `location_area_large_X`\ntables are there to facilitate the lookup. All places that can function as\nthe address of another place are saved in those tables.\n\n`addr:*` and `isin:*` tags are taken into account to compute the address, too.\nNominatim will give preference to places with the same name as in these tags\nwhen looking for places in the vicinity. If there are no matching place names\nat all, then the tags are at least added to the search index. That means that\nthe names will not be shown in the result as the 'address' of the place, but\nsearching by them still works.\n\nIndependent places are always added to the global search index `search_name`.\n\n#### Dependent places\n\nDependent places skip the full address computation for performance reasons.\nInstead they just find a parent place to attach themselves to.\n\n![parenting of dependent places](parenting-flow.svg)\n\nBy default a POI\nor house number will be attached to the closest street. That can be any major\nor minor street indexed by Nominatim. In the default configuration that means\nthat it can attach itself to a footway but only when it has a name.\n\nWhen the dependent place has an `addr:street` tag, then Nominatim will first\ntry to find a street with the same name before falling back to the closest\nstreet.\n\nThere are also addresses in OSM, where the housenumber does not belong\nto a street at all. These have an `addr:place` tag. For these places, Nominatim\ntries to find a place with the given name in the indexed places with an\naddress rank between 16 and 25. If none is found, then the dependent place\nis attached to the closest place in that category and the addr:place name is\nadded as *unlisted* place, which indicates to Nominatim that it needs to add\nit to the address output, no matter what. This special case is necessary to\ncover addresses that don't really refer to an existing object.\n\nWhen an address has both the `addr:street` and `addr:place` tag, then Nominatim\nassumes that the `addr:place` tag in fact should be the city part of the address\nand give the POI the usual street number address.\n\nDependent places are only added to the global search index `search_name` when\nthey have either a name themselves or when they have address tags that are not\ncovered by the places that make up their address. The latter ensures that\naddresses are always searchable by those address tags.\n\n"
  },
  {
    "path": "docs/develop/Testing.md",
    "content": "# Nominatim Test Suite\n\nThis chapter describes the tests in the `/test` directory, how they are\nstructured and how to extend them. For a quick introduction on how to run\nthe tests, see the [Development setup chapter](Development-Environment.md).\n\n## Overall structure\n\nThere are two kind of tests in this test suite. There are functional tests\nwhich test the API interface using a BDD test framework and there are unit\ntests for the Python code.\n\nThis test directory is structured as follows:\n\n```\n -+-   bdd         Functional API tests\n  | \\\n  | +-  steps      Step implementations for test descriptions\n  | +-  osm2pgsql  Tests for data import via osm2pgsql\n  | +-  db         Tests for internal data processing on import and update\n  | +-  api        Tests for API endpoints (search, reverse, etc.)\n  |\n  +-   python      Python unit tests\n  +-   testdb      Base data for generating API test database\n  +-   testdata    Additional test data used by unit tests\n```\n\n## Python Unit Tests (`test/python`)\n\nUnit tests for Python code can be found in the `python/` directory. The goal is\nto have complete coverage of the Python library in `nominatim`.\n\nTo execute the tests run\n\n    py.test-3 test/python\n\nor\n\n    pytest test/python\n\nThe name of the pytest binary depends on your installation.\n\n## BDD Functional Tests (`test/bdd`)\n\nFunctional tests are written as BDD instructions. For more information on\nthe philosophy of BDD testing, read the Wikipedia article on\n[Behaviour-driven development](https://en.wikipedia.org/wiki/Behavior-driven_development).\n\n### General Usage\n\nTo run the functional tests, do\n\n    pytest test/bdd\n\nYou can run a single feature file using expression matching:\n\n    pytest test/bdd -k osm2pgsql/import/entrances.feature\n\nThis even works for running single tests by adding the line number of the\nscenario header like that:\n\n    pytest test/bdd -k 'osm2pgsql/import/entrances.feature and L4'\n\nThe BDD tests create databases for the tests. You can set name of the databases\nthrough configuration variables in your `pytest.ini`:\n\n * `nominatim_test_db` defines the name of the temporary database created for\n    a single test (default: `test_nominatim`)\n * `nominatim_api_test_db` defines the name of the database containing\n    the API test data, see also below (default: `test_api_nominatim`)\n * `nominatim_template_db` defines the name of the template database used\n    for creating the temporary test databases. It contains some static setup\n    which usually doesn't change between imports of OSM data\n    (default: `test_template_nominatim`)\n\nTo change other connection parameters for the PostgreSQL database, use\nthe [libpq enivronment variables](https://www.postgresql.org/docs/current/libpq-envars.html).\nNever set a password through these variables. Use a\n[password file](https://www.postgresql.org/docs/current/libpq-pgpass.html) instead.\n\nThe API test database and the template database are only created once and then\nleft untouched. This is usually what you want because it speeds up subsequent\nruns of BDD tests. If you do change code that has an influence on the content\nof these databases, you can run pytest with the `--nominatim-purge` parameter\nand the databases will be dropped and recreated from scratch.\n\nWhen running the BDD tests with make (using `make tests` or `make bdd`), then\nthe databases will always be purged.\n\nThe temporary test database is usually dropped directly after the test, so\nit does not take up unnecessary space. If you want to keep the database around,\nfor example while debugging a specific BDD test, use the parameter\n`--nominatim-keep-db`.\n\n\n### API Tests (`test/bdd/api`)\n\nThese tests are meant to test the different API endpoints and their parameters.\nThey require to import several datasets into a test database. This is normally\ndone automatically during setup of the test. The API test database is then\nkept around and reused in subsequent runs of behave. Use `--nominatim-purge`\nto force a reimport of the database.\n\nThe official test dataset is saved in the file `test/testdb/apidb-test-data.pbf`\nand compromises the following data:\n\n * Geofabrik extract of Liechtenstein\n * extract of Autauga country, Alabama, US (for tests against Tiger data)\n * additional data from `test/testdb/additional_api_test.data.osm`\n\nAPI tests should only be testing the functionality of the website frontend code.\nMost tests should be formulated as BDD DB creation tests (see below) instead.\n\n### DB Creation Tests (`test/bdd/db`)\n\nThese tests check the import and update of the Nominatim database. They do not\ntest the correctness of osm2pgsql. Each test will write some data into the `place`\ntable (and optionally the `planet_osm_*` tables if required) and then run\nNominatim's processing functions on that.\n\nThese tests use the template database and create temporary test databases for\neach test.\n\n### Import Tests (`test/bdd/osm2pgsql`)\n\nThese tests check that data is imported correctly into the place table.\n\nThese tests also use the template database and create temporary test databases\nfor each test.\n"
  },
  {
    "path": "docs/develop/Tokenizers.md",
    "content": "# Tokenizers\n\nThe tokenizer is the component of Nominatim that is responsible for\nanalysing names of OSM objects and queries. Nominatim provides different\ntokenizers that use different strategies for normalisation. This page describes\nhow tokenizers are expected to work and the public API that needs to be\nimplemented when creating a new tokenizer. For information on how to configure\na specific tokenizer for a database see the\n[tokenizer chapter in the Customization Guide](../customize/Tokenizers.md).\n\n## Generic Architecture\n\n### About Search Tokens\n\nSearch in Nominatim is organised around search tokens. Such a token represents\nstring that can be part of the search query. Tokens are used so that the search\nindex does not need to be organised around strings. Instead the database saves\nfor each place which tokens match this place's name, address, house number etc.\nTo be able to distinguish between these different types of information stored\nwith the place, a search token also always has a certain type: name, house number,\npostcode etc.\n\nDuring search an incoming query is transformed into a ordered list of such\nsearch tokens (or rather many lists, see below) and this list is then converted\ninto a database query to find the right place.\n\nIt is the core task of the tokenizer to create, manage and assign the search\ntokens. The tokenizer is involved in two distinct operations:\n\n* __at import time__: scanning names of OSM objects, normalizing them and\n  building up the list of search tokens.\n* __at query time__: scanning the query and returning the appropriate search\n  tokens.\n\n\n### Importing\n\nThe indexer is responsible to enrich an OSM object (or place) with all data\nrequired for geocoding. It is split into two parts: the controller collects\nthe places that require updating, enriches the place information as required\nand hands the place to Postgresql. The collector is part of the Nominatim\nlibrary written in Python. Within Postgresql, the `placex_update`\ntrigger is responsible to fill out all secondary tables with extra geocoding\ninformation. This part is written in PL/pgSQL.\n\nThe tokenizer is involved in both parts. When the indexer prepares a place,\nit hands it over to the tokenizer to inspect the names and create all the\nsearch tokens applicable for the place. This usually involves updating the\ntokenizer's internal token lists and creating a list of all token IDs for\nthe specific place. This list is later needed in the PL/pgSQL part where the\nindexer needs to add the token IDs to the appropriate search tables. To be\nable to communicate the list between the Python part and the pl/pgSQL trigger,\nthe `placex` table contains a special JSONB column `token_info` which is there\nfor the exclusive use of the tokenizer.\n\nThe Python part of the tokenizer returns a structured information about the\ntokens of a place to the indexer which converts it to JSON and inserts it into\nthe `token_info` column. The content of the column is then handed to the PL/pqSQL\ncallbacks of the tokenizer which extracts the required information. Usually\nthe tokenizer then removes all information from the `token_info` structure,\nso that no information is ever persistently saved in the table. All information\nthat went in should have been processed after all and put into secondary tables.\nThis is however not a hard requirement. If the tokenizer needs to store\nadditional information about a place permanently, it may do so in the\n`token_info` column. It just may never execute searches over it and\nconsequently not create any special indexes on it.\n\n### Querying\n\nAt query time, Nominatim builds up multiple _interpretations_ of the search\nquery. Each of these interpretations is tried against the database in order\nof the likelihood with which they match to the search query. The first\ninterpretation that yields results wins.\n\nThe interpretations are encapsulated in the `SearchDescription` class. An\ninstance of this class is created by applying a sequence of\n_search tokens_ to an initially empty SearchDescription. It is the\nresponsibility of the tokenizer to parse the search query and derive all\npossible sequences of search tokens. To that end the tokenizer needs to parse\nthe search query and look up matching words in its own data structures.\n\n## Tokenizer API\n\nThe following section describes the functions that need to be implemented\nfor a custom tokenizer implementation.\n\n!!! warning\n    This API is currently in early alpha status. While this API is meant to\n    be a public API on which other tokenizers may be implemented, the API is\n    far away from being stable at the moment.\n\n### Directory Structure\n\nNominatim expects two files containing the Python part of the implementation:\n\n * `src/nominatim_db/tokenizer/<NAME>_tokenizer.py` contains the tokenizer\n   code used during import and\n * `src/nominatim_api/search/<NAME>_tokenizer.py` has the code used during\n   query time.\n\n`<NAME>` is a unique name for the tokenizer consisting of only lower-case\nletters, digits and underscore. A tokenizer also needs to install some SQL\nfunctions. By convention, these should be placed in `lib-sql/tokenizer`.\n\nIf the tokenizer has a default configuration file, this should be saved in\n`settings/<NAME>_tokenizer.<SUFFIX>`.\n\n### Configuration and Persistence\n\nTokenizers may define custom settings for their configuration. All settings\nmust be prefixed with `NOMINATIM_TOKENIZER_`. Settings may be transient or\npersistent. Transient settings are loaded from the configuration file when\nNominatim is started and may thus be changed at any time. Persistent settings\nare tied to a database installation and must only be read during installation\ntime. If they are needed for the runtime then they must be saved into the\n`nominatim_properties` table and later loaded from there.\n\n### The Python modules\n\n#### `src/nominatim_db/tokenizer/`\n\nThe import Python module is expected to export a single factory function:\n\n```python\ndef create(dsn: str, data_dir: Path) -> AbstractTokenizer\n```\n\nThe `dsn` parameter contains the DSN of the Nominatim database. The `data_dir`\nis a directory in the project directory that the tokenizer may use to save\ndatabase-specific data. The function must return the instance of the tokenizer\nclass as defined below.\n\n#### `src/nominatim_api/search/`\n\nThe query-time Python module must also export a factory function:\n\n``` python\ndef create_query_analyzer(conn: SearchConnection) -> AbstractQueryAnalyzer\n```\n\nThe `conn` parameter contains the current search connection. See the\n[library documentation](../library/Low-Level-DB-Access.md#searchconnection-class)\nfor details on the class. The function must return the instance of the tokenizer\nclass as defined below.\n\n\n### Python Tokenizer Class\n\nAll tokenizers must inherit from `nominatim_db.tokenizer.base.AbstractTokenizer`\nand implement the abstract functions defined there.\n\n::: nominatim_db.tokenizer.base.AbstractTokenizer\n    options:\n        heading_level: 6\n\n### Python Analyzer Class\n\n::: nominatim_db.tokenizer.base.AbstractAnalyzer\n    options:\n        heading_level: 6\n\n\n### Python Query Analyzer Class\n\n::: nominatim_api.search.query_analyzer_factory.AbstractQueryAnalyzer\n    options:\n        heading_level: 6\n\n### PL/pgSQL Functions\n\nThe tokenizer must provide access functions for the `token_info` column\nto the indexer which extracts the necessary information for the global\nsearch tables. If the tokenizer needs additional SQL functions for private\nuse, then these functions must be prefixed with `token_` in order to ensure\nthat there are no naming conflicts with the SQL indexer code.\n\nThe following functions are expected:\n\n```sql\nFUNCTION token_get_name_search_tokens(info JSONB) RETURNS INTEGER[]\n```\n\nReturn an array of token IDs of search terms that should match\nthe name(s) for the given place. These tokens are used to look up the place\nby name and, where the place functions as part of an address for another place,\nby address. Must return NULL when the place has no name.\n\n```sql\nFUNCTION token_get_name_match_tokens(info JSONB) RETURNS INTEGER[]\n```\n\nReturn an array of token IDs of full names of the place that should be used\nto match addresses. The list of match tokens is usually more strict than\nsearch tokens as it is used to find a match between two OSM tag values which\nare expected to contain matching full names. Partial terms should not be\nused for match tokens. Must return NULL when the place has no name.\n\n```sql\nFUNCTION token_get_housenumber_search_tokens(info JSONB) RETURNS INTEGER[]\n```\n\nReturn an array of token IDs of house number tokens that apply to the place.\nNote that a place may have multiple house numbers, for example when apartments\neach have their own number. Must be NULL when the place has no house numbers.\n\n```sql\nFUNCTION token_normalized_housenumber(info JSONB) RETURNS TEXT\n```\n\nReturn the house number(s) in the normalized form that can be matched against\na house number token text. If a place has multiple house numbers they must\nbe listed with a semicolon as delimiter. Must be NULL when the place has no\nhouse numbers.\n\n```sql\nFUNCTION token_is_street_address(info JSONB) RETURNS BOOLEAN\n```\n\nReturn true if this is an object that should be parented against a street.\nOnly relevant for objects with address rank 30.\n\n```sql\nFUNCTION token_has_addr_street(info JSONB) RETURNS BOOLEAN\n```\n\nReturn true if there are street names to match against for finding the\nparent of the object.\n\n\n```sql\nFUNCTION token_has_addr_place(info JSONB) RETURNS BOOLEAN\n```\n\nReturn true if there are place names to match against for finding the\nparent of the object.\n\n```sql\nFUNCTION token_matches_street(info JSONB, street_tokens INTEGER[]) RETURNS BOOLEAN\n```\n\nCheck if the given tokens (previously saved from `token_get_name_match_tokens()`)\nmatch against the `addr:street` tag name. Must return either NULL or FALSE\nwhen the place has no `addr:street` tag.\n\n```sql\nFUNCTION token_matches_place(info JSONB, place_tokens INTEGER[]) RETURNS BOOLEAN\n```\n\nCheck if the given tokens (previously saved from `token_get_name_match_tokens()`)\nmatch against the `addr:place` tag name. Must return either NULL or FALSE\nwhen the place has no `addr:place` tag.\n\n\n```sql\nFUNCTION token_addr_place_search_tokens(info JSONB) RETURNS INTEGER[]\n```\n\nReturn the search token IDs extracted from the `addr:place` tag. These tokens\nare used for searches by address when no matching place can be found in the\ndatabase. Must be NULL when the place has no `addr:place` tag.\n\n```sql\nFUNCTION token_get_address_keys(info JSONB) RETURNS SETOF TEXT\n```\n\nReturn the set of keys for which address information is provided. This\nshould correspond to the list of (relevant) `addr:*` tags with the `addr:`\nprefix removed or the keys used in the `address` dictionary of the place info.\n\n```sql\nFUNCTION token_get_address_search_tokens(info JSONB, key TEXT) RETURNS INTEGER[]\n```\n\nReturn the array of search tokens for the given address part. `key` can be\nexpected to be one of those returned with `token_get_address_keys()`. The\nsearch tokens are added to the address search vector of the place, when no\ncorresponding OSM object could be found for the given address part from which\nto copy the name information.\n\n```sql\nFUNCTION token_matches_address(info JSONB, key TEXT, tokens INTEGER[])\n```\n\nCheck if the given tokens match against the address part `key`.\n\n__Warning:__ the tokens that are handed in are the lists previously saved\nfrom `token_get_name_search_tokens()`, _not_ from the match token list. This\nis an historical oddity which will be fixed at some point in the future.\nCurrently, tokenizers are encouraged to make sure that matching works against\nboth the search token list and the match token list.\n\n```sql\nFUNCTION token_get_postcode(info JSONB) RETURNS TEXT\n```\n\nReturn the postcode for the object, if any exists. The postcode must be in\nthe form that should also be presented to the end-user.\n\n```sql\nFUNCTION token_strip_info(info JSONB) RETURNS JSONB\n```\n\nReturn the part of the `token_info` field that should be stored in the database\npermanently. The indexer calls this function when all processing is done and\nreplaces the content of the `token_info` column with the returned value before\nthe trigger stores the information in the database. May return NULL if no\ninformation should be stored permanently.\n"
  },
  {
    "path": "docs/develop/address-tables.plantuml",
    "content": "@startuml\nskinparam monochrome true\nskinparam ObjectFontStyle bold\n\nmap search_name_X {\n  place_id => BIGINT\n  address_rank => SMALLINT\n  name_vector => INT[]\n  centroid => GEOMETRY\n}\n\nmap location_area_large_X {\n  place_id => BIGINT\n  keywords => INT[]\n  partition => SMALLINT\n  rank_search => SMALLINT\n  rank_address => SMALLINT\n  country_code => VARCHR(2)\n  isguess => BOOLEAN\n  postcode => TEXT\n  centroid => POINT\n  geometry => GEOMETRY\n}\n\nmap location_road_X {\n  place_id => BIGINT\n  partition => SMALLINT\n  country_code => VARCHR(2)\n  geometry => GEOMETRY\n}\n\nsearch_name_X -[hidden]> location_area_large_X\nlocation_area_large_X -[hidden]> location_road_X\n\n@enduml\n"
  },
  {
    "path": "docs/develop/data-sources.md",
    "content": "# Additional Data Sources\n\nThis guide explains how data sources other than OpenStreetMap mentioned in\nthe install instructions got obtained and converted.\n\n## Country grid\n\nNominatim uses pre-generated country borders data. In case one imports only\na subset of a country. And to assign each place a partition. Nominatim\ndatabase tables are split into partitions for performance.\n\nMore details in [osm-search/country-grid-data](https://github.com/osm-search/country-grid-data).\n\n## US Census TIGER\n\nFor the United States you can choose to import additional street-level data.\nThe data isn't mixed into OSM data but queried as fallback when no OSM\nresult can be found.\n\nMore details in [osm-search/TIGER-data](https://github.com/osm-search/TIGER-data).\n\n## GB postcodes\n\nFor Great Britain you can choose to import Royalmail postcode centroids.\n\nMore details in [osm-search/gb-postcode-data](https://github.com/osm-search/gb-postcode-data).\n\n\n## Wikipedia & Wikidata rankings\n\nNominatim can import \"importance\" data of place names. This greatly\nimproves ranking of results.\n\nMore details in [osm-search/wikipedia-wikidata](https://github.com/osm-search/wikipedia-wikidata)."
  },
  {
    "path": "docs/develop/osm2pgsql-tables.plantuml",
    "content": "@startuml\nskinparam monochrome true\nskinparam ObjectFontStyle bold\n\nmap planet_osm_nodes #eee {\n  id => BIGINT\n  lat => INT\n  lon => INT\n}\n\nmap planet_osm_ways #eee {\n  id => BIGINT\n  nodes => BIGINT[]\n  tags => TEXT[]\n}\n\nmap planet_osm_rels #eee {\n  id => BIGINT\n  parts => BIGINT[]\n  members => TEXT[]\n  tags => TEXT[]\n  way_off => SMALLINT\n  rel_off => SMALLINT\n}\n\nmap place {\n  osm_type => CHAR(1)\n  osm_id => BIGINT\n  class => TEXT\n  type => TEXT\n  name => HSTORE\n  address => HSTORE\n  extratags => HSTORE\n  admin_level => SMALLINT\n  geometry => GEOMETRY\n}\n\nmap place_postcode {\n  osm_type => CHAR(1)\n  osm_id => BIGINT\n  postcode => TEXT\n  country_code => TEXT\n  centroid => GEOMETRY\n  geometry => GEOMETRY\n}\n\nmap place_interpolation {\n  osm_id => BIGINT\n  type => TEXT\n  address => HSTORE\n  nodes => BIGINT[]\n  geometry => GEOMETRY\n}\n\n\nplanet_osm_nodes  -[hidden]> planet_osm_ways\nplanet_osm_ways  -[hidden]> planet_osm_rels\nplanet_osm_ways -[hidden]-> place\nplace -[hidden]-> place_postcode\nplace -[hidden]-> place_interpolation\n\nplanet_osm_nodes::id <- planet_osm_ways::nodes\nplanet_osm_nodes::id <- place_interpolation::nodes\n\n@enduml\n"
  },
  {
    "path": "docs/develop/overview.md",
    "content": "# Basic Architecture\n\nNominatim provides geocoding based on OpenStreetMap data. It uses a PostgreSQL\ndatabase as a backend for storing the data.\n\nThere are three basic parts to Nominatim's architecture: the data import,\nthe address computation and the search frontend.\n\nThe __data import__ stage reads the raw OSM data and extracts all information\nthat is useful for geocoding. This part is done by osm2pgsql, the same tool\nthat can also be used to import a rendering database. It uses the special\nflex output style defined in the directory `/lib-lua`. The result of\nthe import can be found in the database table `place`.\n\nThe __address computation__ or __indexing__ stage takes the data from `place`\nand adds additional information needed for geocoding. It ranks the places by\nimportance, links objects that belong together and computes addresses and\nthe search index. Most of this work is done in PL/pgSQL via database triggers\nand can be found in the files in the `sql/functions/` directory.\n\nThe __search frontend__ implements the actual API. It takes search\nand reverse geocoding queries from the user, looks up the data and\nreturns the results in the requested format. This part is located in the\n`nominatim-api` package. The source code can be found in `src/nominatim_api`.\n"
  },
  {
    "path": "docs/develop/parenting-flow.plantuml",
    "content": "@startuml\nskinparam monochrome true\n\nstart\n\nif (has 'addr:street'?) then (yes)\n  if (street with that name\\n nearby?) then (yes)\n    :**Use closest street**\n     **with same name**;\n     kill\n  else (no)\n    :** Use closest**\\n**street**;\n     kill\n  endif\nelseif (has 'addr:place'?) then (yes)\n  if (place with that name\\n nearby?) then (yes)\n    :**Use closest place**\n     **with same name**;\n     kill\n  else (no)\n    :add addr:place to address;\n    :**Use closest place**\\n**rank 16 to 25**;\n     kill\n  endif\nelse (otherwise)\n :**Use closest**\\n**street**;\n kill\nendif\n\n\n@enduml\n"
  },
  {
    "path": "docs/develop/search-tables.plantuml",
    "content": "@startuml\nskinparam monochrome true\nskinparam ObjectFontStyle bold\n\nleft to right direction\n\nmap placex {\n  place_id => BIGINT\n  osm_type => CHAR(1)\n  osm_id => BIGINT\n  class => TEXT\n  type => TEXT\n  name => HSTORE\n  address => HSTORE\n  extratags => HSTORE\n  admin_level => SMALLINT\n  partition => SMALLINT\n  geometry_sector => INT\n  parent_place_id => BIGINT\n  linked_place_id => BIGINT\n  importance => DOUBLE\n  rank_search => SMALLINT\n  rank_address => SMALLINT\n  wikipedia => TEXT\n  country_code => VARCHAR(2)\n  housenumber => TEXT\n  postcode => TEXT\n  indexed_status => SMALLINT\n  indexed_date => TIMESTAMP\n  centroid => GEOMETRY\n  geometry => GEOMETRY\n  token_info JSONB\n}\n\nmap search_name {\n  place_id => BIGINT\n  importance => DOUBLE\n  search_rank => SMALLINT\n  address_rank => SMALLINT\n  name_vector => INT[]\n  nameaddress_vector => INT[]\n  country_code => VARCHAR(2)\n  centroid => GEOMETRY\n}\n\nmap word {\n  word_id => INT\n  word_token => TEXT\n  ... =>\n}\n\nmap location_property_osmline {\n  place_id => BIGINT\n  osm_id => BIGINT\n  type => TEXT\n  startnumber => INT\n  endnumber => INT\n  step => int\n  address => HSTORE\n  geometry_sector => INT\n  parent_place_id => BIGINT\n  country_code => VARCHAR(2)\n  postcode => text\n  indexed_status => SMALLINT\n  indexed_date => TIMESTAMP\n  linegeo => GEOMETRY\n  token_info JSONB\n}\n\nmap place_addressline {\n  place_id => BIGINT\n  address_place_id => BIGINT\n  distance => DOUBLE\n  cached_rank_address => SMALLINT\n  fromarea => BOOLEAN\n  isaddress => BOOLEAN\n}\n\nmap location_postcodes {\n  place_id => BIGINT\n  osm_id => BIGINT\n  postcode => TEXT\n  country_code => TEXT\n  parent_place_id => BIGINT\n  rank_search => SMALLINT\n  indexed_status => SMALLINT\n  indexed_date => TIMESTAMP\n  geometry => GEOMETRY\n  centroid -> GEOMETRY\n}\n\nplacex::place_id <-- search_name::place_id\nplacex::place_id <-- place_addressline::place_id\nplacex::place_id <-- place_addressline::address_place_id\n\nsearch_name::name_vector --> word::word_id\nsearch_name::nameaddress_vector --> word::word_id\n\nplace_addressline -[hidden]> location_property_osmline\nsearch_name -[hidden]> place_addressline\nlocation_property_osmline -[hidden]-> location_postcodes\n\n@enduml\n"
  },
  {
    "path": "docs/extra.css",
    "content": ".toctree-l3 {\n    display: none!important\n}\n\n.md-content {\n    max-width: 800px\n}\n\ntable {\n    margin-bottom: 12pt\n}\n\nth, td {\n    padding: 1pt 12pt;\n}\n\nth {\n    background-color: #eee;\n}\n\n.doc-object h6 {\n    margin-bottom: 0.8em;\n    font-size: 130%;\n}\n\n.doc-object {\n    margin-bottom: 1.3em;\n}\n\n.doc-children .doc-contents {\n    margin-left: 3em;\n}\n\n.md-footer__inner {\n    display: none;\n}\n\n.headerlink {\n  filter: grayscale(100%);\n  font-size: 80%;\n}\n\n.simple-table table:not([class]) th,\n.simple-table table:not([class]) td {\n    padding: 2px 4px;\n    background: white;\n}\n"
  },
  {
    "path": "docs/index.md",
    "content": "Nominatim (from the Latin, 'by name') is a tool to search OSM data by name and\naddress and to generate synthetic addresses of OSM points (reverse geocoding).\nIt has also limited capability to search features by their type\n(pubs, hotels, churches, etc).\n\nThis guide comes in five parts:\n\n * __[API reference](api/Overview.md)__ for users of Nominatim\n * __[Administration Guide](admin/Installation.md)__ for those who want\n   to install their own Nominatim server\n * __[Customization Guide](customize/Overview.md)__ for those who want to\n   adapt their own installation to their special requirements\n * __[Library Guide](library/Getting-Started.md)__ for Python developers who\n   want to use Nominatim as a library in their project\n * __[Developer's Guide](develop/overview.md)__ for developers of the software\n"
  },
  {
    "path": "docs/library/Configuration.md",
    "content": "# Configuration\n\nWhen using Nominatim through the library, it can be configured in exactly\nthe same way as when running as a service. You may instantiate the library\nagainst the [project directory](../admin/Import.md#creating-the-project-directory)\nof your Nominatim installation. It contains all files belonging to the\nNominatim instance. This may include an `.env` file with configuration options.\nSetting configuration parameters via environment variables works as well.\nAlternatively to using the operating system's environment, a set of\nconfiguration parameters may also be passed to the Nomiantim API object.\n\nConfiguration options are resolved in the following order:\n\n* from the OS environment (or the dictionary given in `environ`,\n  (see NominatimAPI.md#nominatim.api.core.NominatimAPI.__init__)\n* from the .env file in the project directory of the installation\n* from the default installation in the configuration directory\n\nFor more information on configuration via dotenv and a list of possible\nconfiguration parameters, see the [Configuration page](../customize/Settings.md).\n\n\n## `Configuration` class\n\n::: nominatim_api.Configuration\n    options:\n        members:\n            - get_bool\n            - get_int\n            - get_str_list\n            - get_path\n        heading_level: 6\n        show_signature_annotations: True\n"
  },
  {
    "path": "docs/library/Getting-Started.md",
    "content": "# Getting Started\n\nThe Nominatim search frontend is implemented as a Python library and can as\nsuch directly be used in Python scripts and applications. You don't need to\nset up a web frontend and access it through HTTP calls. The library gives\ndirect access to the Nominatim database through similar search functions as\noffered by the web API. In addition, it will give you a more complete and\ndetailed view on the search objects stored in the database.\n\n!!! warning\n\n    The Nominatim library is used for accessing a local Nominatim database.\n    It is not meant to be used against web services of Nominatim like the\n    one on https://nominatim.openstreetmap.org. If you need a Python library\n    to access these web services, have a look at\n    [GeoPy](https://geopy.readthedocs.io). Don't forget to consult the\n    usage policy of the service you want to use before accessing such\n    a web service.\n\n## Installation\n\nTo use the Nominatim library, you need access to a local Nominatim database.\nFollow the [installation](../admin/Installation.md) and\n[import](../admin/Import.md) instructions to set up your database.\n\nThe Nominatim frontend library is contained in the Python package `nominatim-api`.\nYou can install the latest released version directly from pip:\n\n    pip install nominatim-api\n\nTo install the package from the source tree directly, run:\n\n    pip install packaging/nominatim-api\n\nUsually you would want to run this in a virtual environment.\n\n## A simple search example\n\nTo query the Nominatim database you need to first set up a connection. This\nis done by creating an Nominatim API object. This object exposes all the\nsearch functions of Nominatim that are also known from its web API.\n\nThis code snippet implements a simple search for the town of 'Brugge':\n\n!!! example\n    === \"NominatimAPIAsync\"\n        ``` python\n        import asyncio\n\n        import nominatim_api as napi\n\n        async def search(query):\n            async with napi.NominatimAPIAsync() as api:\n                return await api.search(query)\n\n        results = asyncio.run(search('Brugge'))\n        if not results:\n            print('Cannot find Brugge')\n        else:\n            print(f'Found a place at {results[0].centroid.x},{results[0].centroid.y}')\n        ```\n\n    === \"NominatimAPI\"\n        ``` python\n        import nominatim_api as napi\n\n        with napi.NominatimAPI() as api:\n            results = api.search('Brugge')\n\n        if not results:\n            print('Cannot find Brugge')\n        else:\n            print(f'Found a place at {results[0].centroid.x},{results[0].centroid.y}')\n        ```\n\nThe Nominatim library is designed around\n[asyncio](https://docs.python.org/3/library/asyncio.html). `NominatimAPIAsync`\nprovides you with an interface of coroutines.\nIf you have many requests to make, coroutines can speed up your applications\nsignificantly.\n\nFor smaller scripts there is also a synchronous wrapper around the API. By\nusing `NominatimAPI`, you get exactly the same interface using classic functions.\n\nThe examples in this chapter will always show-case both\nimplementations. The documentation itself will usually refer only to\n'Nominatim API class' when both flavours are meant. If a functionality is\navailable only for the synchronous or asynchronous version, this will be\nexplicitly mentioned.\n\n## Defining which database to use\n\nThe [Configuration](../admin/Import.md#configuration-setup-in-env)\nsection explains how Nominatim is configured using the\n[dotenv](https://github.com/theskumar/python-dotenv) library.\nThe same configuration mechanism is used with the\nNominatim API library. You should therefore be sure you are familiar with\nthe section.\n\nThere are three different ways, how configuration options can be set for\na 'Nominatim API class'. When you have set up your Nominatim database, you\nhave normally created a [project directory](../admin/Import.md#creating-the-project-directory)\nwhich stores the various configuration and customization files that Nominatim\nneeds. You may pass the location of the project directory to your\n'Nominatim API class' constructor and it will read the .env file in the\ndirectory and set the configuration accordingly. Here is the simple search\nexample, using the configuration from a pre-defined project directory in\n`/srv/nominatim-project`:\n\n!!! example\n    === \"NominatimAPIAsync\"\n        ``` python\n        import asyncio\n\n        import nominatim_api as napi\n\n        async def search(query):\n            async with napi.NominatimAPIAsync('/srv/nominatim-project') as api:\n                return await api.search(query)\n\n        results = asyncio.run(search('Brugge'))\n        if not results:\n            print('Cannot find Brugge')\n        else:\n            print(f'Found a place at {results[0].centroid.x},{results[0].centroid.y}')\n        ```\n\n    === \"NominatimAPI\"\n        ``` python\n        import nominatim_api as napi\n\n        with napi.NominatimAPI('/srv/nominatim-project') as api:\n            results = api.search('Brugge')\n\n        if not results:\n            print('Cannot find Brugge')\n        else:\n            print(f'Found a place at {results[0].centroid.x},{results[0].centroid.y}')\n        ```\n\n\nYou may also configure Nominatim by setting environment variables.\nNormally Nominatim will check the operating system environment. Lets\nsay you want to look up 'Brugge' in the special database named 'belgium' instead of the\nstandard 'nominatim' database. You can run the example script above like this:\n\n```\nNOMINATIM_DATABASE_DSN=pgsql:dbname=belgium python3 example.py\n```\n\nThe third option to configure the library is to hand in the configuration\nparameters into the 'Nominatim API class'. Changing the database would look\nlike this:\n\n!!! example\n    === \"NominatimAPIAsync\"\n        ``` python\n        import asyncio\n        import nominatim_api as napi\n\n        config_params = {\n            'NOMINATIM_DATABASE_DSN': 'pgsql:dbname=belgium'\n        }\n\n        async def search(query):\n            async with napi.NominatimAPIAsync(environ=config_params) as api:\n                return await api.search(query)\n\n        results = asyncio.run(search('Brugge'))\n        ```\n\n    === \"NominatimAPI\"\n        ``` python\n        import nominatim_api as napi\n\n        config_params = {\n            'NOMINATIM_DATABASE_DSN': 'pgsql:dbname=belgium'\n        }\n\n        with napi.NominatimAPI(environ=config_params) as api:\n            results = api.search('Brugge')\n        ```\n\nWhen the `environ` parameter is given, then only configuration variables\nfrom this dictionary will be used. The operating system's environment\nvariables will be ignored.\n\n## Presenting results to humans\n\nAll search functions return full result objects from the database. Such a\nresult object contains lots of details: names, address information, OSM tags etc.\nThis gives you lots of flexibility what to do with the results.\n\nOne of the most common things to get is some kind of human-readable label\nthat describes the result in a compact form. Usually this would be the name\nof the object and some parts of the address to explain where in the world\nit is. To create such a label, you need two things:\n\n* the address details of the place\n* all names for the label adapted to the language you wish to use for display\n\nAgain searching for 'Brugge', this time with a nicely formatted result:\n\n!!! example\n    === \"NominatimAPIAsync\"\n        ``` python\n        import asyncio\n\n        import nominatim_api as napi\n\n        async def search(query):\n            async with napi.NominatimAPIAsync() as api:\n                return await api.search(query, address_details=True)\n\n        results = asyncio.run(search('Brugge'))\n\n        locale = napi.Locales(['fr', 'en'])\n        for i, result in enumerate(results):\n            address_parts = result.address_rows.localize(locale)\n            print(f\"{i + 1}. {', '.join(address_parts)}\")\n        ```\n\n    === \"NominatimAPI\"\n        ``` python\n        import nominatim_api as napi\n\n        with napi.NominatimAPI() as api:\n            results = api.search('Brugge', address_details=True)\n\n        locale = napi.Locales(['fr', 'en'])\n        for i, result in enumerate(results):\n            address_parts = result.address_rows.localize(locale)\n            print(f\"{i + 1}. {', '.join(address_parts)}\")\n        ```\n\nTo request information about the address of a result, add the optional\nparameter 'address_details' to your search:\n\n``` python\n>>> results = api.search('Brugge', address_details=True)\n```\n\nAn additional field `address_rows` will set in results that are returned.\nIt contains a list of all places that make up the address of the place. For\nsimplicity, this includes name and house number of the place itself. With\nthe names in this list it is possible to create a human-readable description\nof the result. To do that, you first need to decide in which language the\nresults should be presented. As with the names in the result itself, the\nplaces in `address_rows` contain all possible name translation for each row.\n\nThe library has a helper class `Locales` which helps extracting a name of a\nplace in the preferred language. It takes a single parameter with a list\nof language codes in the order of preference. So\n\n``` python\nlocale = napi.Locales(['fr', 'en'])\n```\n\ncreates a helper class that returns the name preferably in French. If that is\nnot possible, it tries English and eventually falls back to the default `name`\nor `ref`.\n\nThe `Locales` object can be applied to a name dictionary to return the best-matching\nname out of it:\n\n``` python\n>>> print(locale.display_name(results[0].names))\n'Brugges'\n```\n\nThe `address_row` field has a helper function to compute the display name for each Address Line\ncomponent based on its `local_name` field. This is then utilized by the overall `result` object,\nwhich has a helper function to apply the function to all its ‘address_row’ members and saves\nthe result in the `locale_name` field. \n\nHowever, in order to set this `local_name` field in a preferred language, you must use the `Locales`\nobject which contains the function `localize_results`, which explicitly sets each `local_name field`.\n\n``` python\n>>> Locales().localize_results(results)\n>>> address_parts = results[0].address_rows\n>>> print(', '.join(address_parts))\nBruges, Flandre-Occidentale, Flandre, Belgique\n```\n\nThis is a fairly simple way to create a human-readable description. The\nplace information in `address_rows` contains further information about each\nplace. For example, which OSM `admin_level` was used, what category the place\nbelongs to or what rank Nominatim has assigned. Use this to adapt the output\nto local address formats.\n\nFor more information on address rows, see\n[detailed address description](Result-Handling.md#detailed-address-description).\n"
  },
  {
    "path": "docs/library/Input-Parameter-Types.md",
    "content": "# Input Parameter Types\n\nThis page describes in more detail some of the input parameter types used\nin the query functions of the API object.\n\n## Place identification\n\nThe [details](NominatimAPI.md#nominatim_api.NominatimAPI.details) and\n[lookup](NominatimAPI.md#nominatim_api.NominatimAPI.lookup) functions\nrequire references to places in the database. Below the possible\ntypes for place identification are listed. All types are dataclasses.\n\n### PlaceID\n\n::: nominatim_api.PlaceID\n    options:\n        heading_level: 6\n\n### OsmID\n\n::: nominatim_api.OsmID\n    options:\n        heading_level: 6\n\n## Geometry types\n\n::: nominatim_api.GeometryFormat\n    options:\n        heading_level: 6\n        members_order: source\n\n## Geometry input\n\n### Point\n\n::: nominatim_api.Point\n    options:\n        heading_level: 6\n        show_signature_annotations: True\n\n### Bbox\n\n::: nominatim_api.Bbox\n    options:\n        heading_level: 6\n        show_signature_annotations: True\n        members_order: source\n        group_by_category: False\n\n## Layers\n\nLayers allow to restrict the search result to thematic groups. This is\northogonal to restriction by address ranks, which groups places by their\ngeographic extent.\n\n\n::: nominatim_api.DataLayer\n    options:\n        heading_level: 6\n        members_order: source\n"
  },
  {
    "path": "docs/library/Low-Level-DB-Access.md",
    "content": "# Low-level connections\n\nThe `NominatimAPIAsync` class allows to directly access the underlying\ndatabase connection to explore the raw data. Nominatim uses\n[SQLAlchemy](https://docs.sqlalchemy.org/) for building queries. Please\nrefer to the documentation of the library to understand how to write SQL.\n\nTo get access to a search connection, use the `begin()` function of your\nAPI object. This returns a `SearchConnection` object described below\nwrapped in a context manager. Its\n`t` property has definitions for all Nominatim search tables. For an\noverview of available tables, refer to the\n[Development Layout](../develop/Database-Layout.md) in in the development\nchapter. Note that only tables that are needed for search are accessible\nas SQLAlchemy tables.\n\n!!! warning\n    The database layout is not part of the API definition and may change\n    without notice. If you play with the low-level access functions, you\n    need to be prepared for such changes.\n\nHere is a simple example, which prints how many places are available in\nthe placex table:\n\n```\nimport asyncio\nimport sqlalchemy as sa\nfrom nominatim_api import NominatimAPIAsync\n\nasync def print_table_size():\n    api = NominatimAPIAsync()\n\n    async with api.begin() as conn:\n        cnt = await conn.scalar(sa.select(sa.func.count()).select_from(conn.t.placex))\n        print(f'placex table has {cnt} rows.')\n\nasyncio.run(print_table_size())\n```\n\n!!! warning\n    Low-level connections may only be used to read data from the database.\n    Do not use it to add or modify data or you might break Nominatim's\n    normal functions.\n\n## SearchConnection class\n\n::: nominatim_api.SearchConnection\n    options:\n        members:\n            - scalar\n            - execute\n            - get_class_table\n            - get_db_property\n            - get_property\n        heading_level: 6\n"
  },
  {
    "path": "docs/library/NominatimAPI.md",
    "content": "# The Nominatim API classes\n\nThe API classes are the core object of the search library. Always instantiate\none of these classes first. The API classes are **not threadsafe**. You need\nto instantiate a separate instance for each thread.\n\n### NominatimAPI\n\n::: nominatim_api.NominatimAPI\n    options:\n        members:\n            - __init__\n            - config\n            - close\n            - status\n            - details\n            - lookup\n            - reverse\n            - search\n            - search_address\n            - search_category\n        heading_level: 6\n        group_by_category: False\n\n\n### NominatimAPIAsync\n\n::: nominatim_api.NominatimAPIAsync\n    options:\n        members:\n            - __init__\n            - setup_database\n            - close\n            - begin\n        heading_level: 6\n        group_by_category: False\n"
  },
  {
    "path": "docs/library/Result-Handling.md",
    "content": "# Result handling\n\nThe search functions of the Nominatim API always return a result object\nwith the raw information about the place that is available in the\ndatabase. This section discusses data types used in the results and utility\nfunctions that allow further processing of the results.\n\n## Result fields\n\n### Sources\n\nNominatim takes the result data from multiple sources. The `source_table` field\nin the result describes, from which source the result was retrieved.\n\n::: nominatim_api.SourceTable\n    options:\n        heading_level: 6\n        members_order: source\n\n### Detailed address description\n\nWhen the `address_details` parameter is set, then functions return not\nonly information about the result place but also about the place that\nmake up the address. This information is almost always required when you\nwant to present the user with a human-readable description of the result.\nSee also [Localization](#localization) below.\n\nThe address details are available in the `address_rows` field as a ordered\nlist of `AddressLine` objects with the country information last. The list also\ncontains the result place itself and some artificial entries, for example,\nfor the house number or the country code. This makes processing and creating\na full address easier.\n\n::: nominatim_api.AddressLine\n    options:\n        heading_level: 6\n        members_order: source\n\n### Detailed search terms\n\nThe `details` function can return detailed information about which search terms\nmay be used to find a place, when the `keywords` parameter is set. Search\nterms are split into terms for the name of the place and search terms for\nits address.\n\n::: nominatim_api.WordInfo\n    options:\n        heading_level: 6\n\n## Localization\n\nResults are always returned with the full list of available names. However, the\ndefault `locale_name` must be explicitly set using the `localize` function within\n`Locales`. This parses through the full list of available names to find the one \nmost preferred by the user. Once this is set, the user can simply use the\n`display_name` field within a `Result` object to retrive the localized name.\n\n### Locale\n\n::: nominatim_api.Locales\n    options:\n        heading_level: 6\n"
  },
  {
    "path": "docs/mk_install_instructions.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\nfrom pathlib import Path\n\nimport mkdocs_gen_files\n\nVAGRANT_PATH = Path(__file__, '..', '..', 'vagrant').resolve()\n\nfor infile in VAGRANT_PATH.glob('Install-on-*.sh'):\n    outfile = f\"admin/{infile.stem}.md\"\n    title = infile.stem.replace('-', ' ')\n\n    with mkdocs_gen_files.open(outfile, \"w\", encoding='utf-8') as outfd, \\\n            infile.open(encoding='utf-8') as infd:\n        print(\"#\", title, file=outfd)\n        has_empty = False\n        for line in infd:\n            line = line.rstrip()\n            docpos = line.find('#DOCS:')\n            if docpos >= 0:\n                line = line[docpos + 6:]\n            elif line == '#' or line.startswith('#!'):\n                line = ''\n            elif line.startswith('# '):\n                line = line[2:]\n            if line or not has_empty:\n                print(line, file=outfd)\n                has_empty = not bool(line)\n\n    mkdocs_gen_files.set_edit_path(outfile, \"docs/mk_install_instructions.py\")\n"
  },
  {
    "path": "docs/styles.css",
    "content": ".codehilite .hll { background-color: #ffffcc }\n.codehilite  { background: #f0f0f0; }\n.codehilite .c { color: #60a0b0; font-style: italic } /* Comment */\n.codehilite .err { /* border: 1px solid #FF0000 */ } /* Error */\n.codehilite .k { color: #007020; font-weight: bold } /* Keyword */\n.codehilite .o { color: #666666 } /* Operator */\n.codehilite .ch { color: #60a0b0; font-style: italic } /* Comment.Hashbang */\n.codehilite .cm { color: #60a0b0; font-style: italic } /* Comment.Multiline */\n.codehilite .cp { color: #007020 } /* Comment.Preproc */\n.codehilite .cpf { color: #60a0b0; font-style: italic } /* Comment.PreprocFile */\n.codehilite .c1 { color: #60a0b0; font-style: italic } /* Comment.Single */\n.codehilite .cs { color: #60a0b0; background-color: #fff0f0 } /* Comment.Special */\n.codehilite .gd { color: #A00000 } /* Generic.Deleted */\n.codehilite .ge { font-style: italic } /* Generic.Emph */\n.codehilite .gr { color: #FF0000 } /* Generic.Error */\n.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n.codehilite .gi { color: #00A000 } /* Generic.Inserted */\n.codehilite .go { color: #888888 } /* Generic.Output */\n.codehilite .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */\n.codehilite .gs { font-weight: bold } /* Generic.Strong */\n.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n.codehilite .gt { color: #0044DD } /* Generic.Traceback */\n.codehilite .kc { color: #007020; font-weight: bold } /* Keyword.Constant */\n.codehilite .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */\n.codehilite .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */\n.codehilite .kp { color: #007020 } /* Keyword.Pseudo */\n.codehilite .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */\n.codehilite .kt { color: #902000 } /* Keyword.Type */\n.codehilite .m { color: #40a070 } /* Literal.Number */\n.codehilite .s { color: #4070a0 } /* Literal.String */\n.codehilite .na { color: #4070a0 } /* Name.Attribute */\n.codehilite .nb { color: #007020 } /* Name.Builtin */\n.codehilite .nc { color: #0e84b5; font-weight: bold } /* Name.Class */\n.codehilite .no { color: #60add5 } /* Name.Constant */\n.codehilite .nd { color: #555555; font-weight: bold } /* Name.Decorator */\n.codehilite .ni { color: #d55537; font-weight: bold } /* Name.Entity */\n.codehilite .ne { color: #007020 } /* Name.Exception */\n.codehilite .nf { color: #06287e } /* Name.Function */\n.codehilite .nl { color: #002070; font-weight: bold } /* Name.Label */\n.codehilite .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */\n.codehilite .nt { color: #062873; font-weight: bold } /* Name.Tag */\n.codehilite .nv { color: #bb60d5 } /* Name.Variable */\n.codehilite .ow { color: #007020; font-weight: bold } /* Operator.Word */\n.codehilite .w { color: #bbbbbb } /* Text.Whitespace */\n.codehilite .mb { color: #40a070 } /* Literal.Number.Bin */\n.codehilite .mf { color: #40a070 } /* Literal.Number.Float */\n.codehilite .mh { color: #40a070 } /* Literal.Number.Hex */\n.codehilite .mi { color: #40a070 } /* Literal.Number.Integer */\n.codehilite .mo { color: #40a070 } /* Literal.Number.Oct */\n.codehilite .sa { color: #4070a0 } /* Literal.String.Affix */\n.codehilite .sb { color: #4070a0 } /* Literal.String.Backtick */\n.codehilite .sc { color: #4070a0 } /* Literal.String.Char */\n.codehilite .dl { color: #4070a0 } /* Literal.String.Delimiter */\n.codehilite .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */\n.codehilite .s2 { color: #4070a0 } /* Literal.String.Double */\n.codehilite .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */\n.codehilite .sh { color: #4070a0 } /* Literal.String.Heredoc */\n.codehilite .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */\n.codehilite .sx { color: #c65d09 } /* Literal.String.Other */\n.codehilite .sr { color: #235388 } /* Literal.String.Regex */\n.codehilite .s1 { color: #4070a0 } /* Literal.String.Single */\n.codehilite .ss { color: #517918 } /* Literal.String.Symbol */\n.codehilite .bp { color: #007020 } /* Name.Builtin.Pseudo */\n.codehilite .fm { color: #06287e } /* Name.Function.Magic */\n.codehilite .vc { color: #bb60d5 } /* Name.Variable.Class */\n.codehilite .vg { color: #bb60d5 } /* Name.Variable.Global */\n.codehilite .vi { color: #bb60d5 } /* Name.Variable.Instance */\n.codehilite .vm { color: #bb60d5 } /* Name.Variable.Magic */\n.codehilite .il { color: #40a070 } /* Literal.Number.Integer.Long */\n"
  },
  {
    "path": "lib-lua/flex-base.lua",
    "content": "-- This is just an alias for the Nominatim themepark theme module\nlocal flex = require('themes/nominatim/init')\n\nfunction flex.load_topic(name, cfg)\n    local topic_file = debug.getinfo(1, \"S\").source:sub(2):match(\"(.*/)\") .. 'themes/nominatim/topics/'.. name .. '.lua'\n\n    if topic_file == nil then\n        error('Cannot find topic: ' .. name)\n    end\n\n    loadfile(topic_file)(nil, flex, cfg or {})\nend\n\nreturn flex\n"
  },
  {
    "path": "lib-lua/import-address.lua",
    "content": "-- This is just an alias for the Nominatim themepark address topic\nlocal flex = require('flex-base')\n\nflex.load_topic('address')\n\nreturn flex\n"
  },
  {
    "path": "lib-lua/import-admin.lua",
    "content": "-- This is just an alias for the Nominatim themepark admin topic\nlocal flex = require('flex-base')\n\nflex.load_topic('admin')\n\nreturn flex\n"
  },
  {
    "path": "lib-lua/import-extratags.lua",
    "content": "-- This is just an alias for the Nominatim themepark full topic\nlocal flex = require('flex-base')\n\nflex.load_topic('full', {with_extratags = true})\n\nreturn flex\n"
  },
  {
    "path": "lib-lua/import-full.lua",
    "content": "-- This is just an alias for the Nominatim themepark full topic\nlocal flex = require('flex-base')\n\nflex.load_topic('full')\n\nreturn flex\n"
  },
  {
    "path": "lib-lua/import-street.lua",
    "content": "-- This is just an alias for the Nominatim themepark street topic\nlocal flex = require('flex-base')\n\nflex.load_topic('street')\n\nreturn flex\n"
  },
  {
    "path": "lib-lua/taginfo.lua",
    "content": "-- Prints taginfo project description in the standard output\n--\n\n-- create fake \"osm2pgsql\" table for flex-base, originally created by the main C++ program\nosm2pgsql = {}\nfunction osm2pgsql.define_table(...) end\n\n-- provide path to flex-style lua file\npackage.path = arg[0]:match(\"(.*/)\") .. \"?.lua;\" .. package.path\nlocal flex = require('import-' .. (arg[1] or 'extratags'))\nlocal json = require ('dkjson')\n\nlocal NAME_DESCRIPTIONS = {\n    'Searchable auxiliary name of the place',\n    main = 'Searchable primary name of the place',\n    house = 'House name part of an address, searchable'\n}\nlocal ADDRESS_DESCRIPTIONS = {\n    'Used to determine the address of a place',\n    main = 'Primary key for an address point',\n    postcode = 'Used to determine the postcode of a place',\n    country = 'Used to determine country of a place (only if written as two-letter code)',\n    interpolation = 'Primary key for an address interpolation line'\n}\n\n------------ helper functions ---------------------\n-- Sets the key order for the resulting JSON table\nlocal function set_keyorder(table, order)\n    setmetatable(table, {\n        __jsonorder = order\n    })\nend\n\nlocal function get_key_description(key, description)\n    local desc = {}\n    desc.key = key\n    desc.description = description\n    set_keyorder(desc, {'key', 'description'})\n    return desc\nend\n\nlocal function get_key_value_description(key, value, description)\n    local desc = {key = key, value = value, description = description}\n    set_keyorder(desc, {'key', 'value', 'description'})\n    return desc\nend\n\nlocal function group_table_to_keys(tags, data, descriptions)\n    for group, values in pairs(data) do\n        local desc = descriptions[group] or descriptions[1]\n        for _, key in pairs(values) do\n            if key:sub(1, 1) ~= '*' and key:sub(#key, #key) ~= '*' then\n                table.insert(tags, get_key_description(key, desc))\n            end\n        end\n    end\nend\n\n-- Prints the collected tags in the required format in JSON\nlocal function print_taginfo()\n    local taginfo = flex.get_taginfo()\n    local tags = {}\n\n    for k, values in pairs(taginfo.main) do\n        if values[1] == nil or values[1] == 'delete' or values[1] == 'extra' then\n            for v, group in pairs(values) do\n                if type(v) == 'string' and group ~= 'delete' and group ~= 'extra' then\n                    local text = 'POI/feature in the search database'\n                    if type(group) ~= 'function' then\n                        text = 'Fallback ' .. text\n                    end\n                    table.insert(tags, get_key_value_description(k, v, text))\n                end\n            end\n        elseif type(values[1]) == 'function' or values[1] == 'fallback' then\n            local desc = 'POI/feature in the search database'\n            if values[1] == 'fallback' then\n                desc = 'Fallback ' .. desc\n            end\n            local excp = {}\n            for v, group in pairs(values) do\n                if group == 'delete' or group == 'extra' then\n                    table.insert(excp, v)\n                end\n            end\n            if next(excp) ~= nil then\n                desc = desc .. string.format(' (except for values: %s)',\n                                             table.concat(excp, ', '))\n            end\n            table.insert(tags, get_key_description(k, desc))\n        end\n    end\n\n    group_table_to_keys(tags, taginfo.name, NAME_DESCRIPTIONS)\n    group_table_to_keys(tags, taginfo.address, ADDRESS_DESCRIPTIONS)\n\n    local format = {\n        data_format = 1,\n        data_url = 'https://nominatim.openstreetmap.org/taginfo.json',\n        project = {\n            name = 'Nominatim',\n            description = 'OSM search engine.',\n            project_url = 'https://nominatim.openstreetmap.org',\n            doc_url = 'https://nominatim.org/release-docs/develop/',\n            contact_name = 'Sarah Hoffmann',\n            contact_email = 'lonvia@denofr.de'\n        }\n    }\n    format.tags = tags\n\n    set_keyorder(format, {'data_format', 'data_url', 'project', 'tags'})\n    set_keyorder(format.project, {'name', 'description', 'project_url', 'doc_url',\n                    'contact_name', 'contact_email'})\n\n    print(json.encode(format))\nend\n\nprint_taginfo()\n"
  },
  {
    "path": "lib-lua/themes/nominatim/init.lua",
    "content": "-- Nominatim themepark theme.\n--\n-- The Nominatim theme creates a fixed set of import tables for use with\n-- Nominatim. Creation and object processing are directly controlled by\n-- the theme. Topics provide preset configurations. You should add exactly\n-- one topic to your project.\n--\n-- The theme also exports a number of functions that can be used to configure\n-- its behaviour. These may be directly called in the style file after\n-- importing the theme:\n--\n--      local nominatim = themepark:init_theme('nominatim')\n--      nominatim.set_main_tags{boundary = 'always'}\n--\n-- This allows to write your own configuration from scratch. You can also\n-- use it to customize topics. In that case, first add the topic, then\n-- change the configuration:\n--\n--      themepark:add_topic('nominatim/full')\n--      local nominatim = themepark:init_theme('nominatim')\n--      nominatim.ignore_tags{'amenity'}\n\nlocal module = {}\n\nlocal MAIN_KEYS = {admin_level = {'delete'}}\nlocal PRE_FILTER = {prefix = {}, suffix = {}}\nlocal NAMES = {}\nlocal NAME_FILTER = nil\nlocal ADDRESS_TAGS = {}\nlocal ADDRESS_FILTER = nil\nlocal EXTRATAGS_FILTER\nlocal REQUIRED_EXTRATAGS_FILTER\nlocal POSTCODE_FALLBACK = true\nlocal ENTRANCE_FUNCTION = nil\n\n-- This file can also be directly require'd instead of running it under\n-- the themepark framework. In that case the first parameter is usually\n-- the module name. Lets check for that, so that further down we can call\n-- the low-level osm2pgsql functions instead of themepark functions.\nlocal themepark = ...\nif type(themepark) ~= 'table' then\n    themepark = nil\nend\n\n-- The place tables carry the raw OSM information.\nlocal table_definitions = {\n    place = {\n        ids = { type = 'any', id_column = 'osm_id', type_column = 'osm_type' },\n        columns = {\n            { column = 'class', type = 'text', not_null = true },\n            { column = 'type', type = 'text', not_null = true },\n            { column = 'admin_level', type = 'smallint' },\n            { column = 'name', type = 'hstore' },\n            { column = 'address', type = 'hstore' },\n            { column = 'extratags', type = 'hstore' },\n            { column = 'geometry', type = 'geometry', projection = 'WGS84', not_null = true },\n        },\n        indexes = {}\n    },\n    place_entrance = {\n        ids = { type = 'node', id_column = 'osm_id' },\n        columns = {\n            { column = 'type', type = 'text', not_null = true },\n            { column = 'extratags', type = 'hstore' },\n            { column = 'geometry', type = 'geometry', projection = 'WGS84', not_null = true }\n        },\n        indexes = {}\n    },\n    place_postcode = {\n        ids = { type = 'any', id_column = 'osm_id', type_column = 'osm_type' },\n        columns = {\n            { column = 'postcode', type = 'text', not_null = true },\n            { column = 'country_code', type = 'text' },\n            { column = 'centroid', type = 'point', projection = 'WGS84', not_null = true },\n            { column = 'geometry', type = 'geometry', projection = 'WGS84' }\n        },\n        indexes = {\n            { column = 'postcode', method = 'btree' }\n        }\n     },\n     place_interpolation = {\n        ids = { type = 'way', id_column = 'osm_id' },\n        columns = {\n            { column = 'type', type = 'text', not_null = true },\n            { column = 'address', type = 'hstore' },\n            { column = 'nodes', type = 'text', sql_type = 'bigint[]', not_null = true },\n            { column = 'geometry', type = 'linestring', projection = 'WGS84', not_null = true },\n        },\n        indexes = {\n            { column = 'nodes', method = 'gin' }\n        }\n     },\n    place_associated_street = {\n        ids = { type = 'relation', id_column = 'relation_id' },\n        columns = {\n            { column = 'member_type', type = 'text', not_null = true },\n            { column = 'member_id', type = 'int8', not_null = true },\n            { column = 'member_role', type = 'text', not_null = true }\n        },\n        indexes = {\n            { column = { 'member_type', 'member_id' }, method = 'btree' }\n        }\n    }\n}\n\nlocal insert_row = {}\nlocal script_path = debug.getinfo(1, \"S\").source:match(\"@?(.*/)\")\nlocal PRESETS = loadfile(script_path .. 'presets.lua')()\n\nfor table_name, table_definition in pairs(table_definitions) do\n    table_definition.name = table_name\n    table_definition.data_tablespace = os.getenv(\"NOMINATIM_TABLESPACE_PLACE_DATA\")\n    table_definition.index_tablespace = os.getenv(\"NOMINATIM_TABLESPACE_PLACE_INDEX\")\n\n    if themepark then\n        themepark:add_table(table_definition)\n        insert_row[table_name] = function(columns)\n            themepark:insert(table_name, columns, {}, {})\n        end\n    else\n        local place_table = osm2pgsql.define_table(table_definition)\n        insert_row[table_name] = function(columns)\n            place_table:insert(columns)\n        end\n    end\nend\n\n------------ Geometry functions for relations ---------------------\n\nfunction module.relation_as_multipolygon(o)\n    return o:as_multipolygon()\nend\n\nfunction module.relation_as_multiline(o)\n    return o:as_multilinestring():line_merge()\nend\n\n\nmodule.RELATION_TYPES = {\n    multipolygon = module.relation_as_multipolygon,\n    boundary = module.relation_as_multipolygon,\n    waterway = module.relation_as_multiline\n}\n\n--------- Built-in place transformation functions --------------------------\n\nlocal PlaceTransform = {}\n\n-- Special transform meanings which are interpreted elsewhere\nPlaceTransform.fallback = 'fallback'\nPlaceTransform.postcode_area = 'postcode_area'\nPlaceTransform.delete = 'delete'\nPlaceTransform.extra = 'extra'\n\n-- always: unconditionally use that place\nfunction PlaceTransform.always(place)\n    return place\nend\n\n-- never: unconditionally drop the place\nfunction PlaceTransform.never()\n    return nil\nend\n\n-- named: use the place if it has a fully-qualified name\nfunction PlaceTransform.named(place)\n    if place.has_name then\n        return place\n    end\nend\n\n-- named_with_key: use place if there is a name with the main key prefix\nfunction PlaceTransform.named_with_key(place, k)\n    local names = {}\n    local prefix = k .. ':name'\n    for namek, namev in pairs(place.intags) do\n        if namek:sub(1, #prefix) == prefix\n           and (#namek == #prefix\n                or namek:sub(#prefix + 1, #prefix + 1) == ':') then\n            names[namek:sub(#k + 2)] = namev\n        end\n    end\n\n    if next(names) ~= nil then\n        return place:clone{names=names}\n    end\nend\n\n-- Special transform used with address fallbacks: ignore all names\n-- except for those marked as being part of the address.\nlocal function address_fallback(place)\n    if next(place.names) == nil or NAMES.house == nil then\n        return place\n    end\n\n    local names = {}\n    for k, v in pairs(place.names) do\n        if NAME_FILTER(k, v) == 'house' then\n            names[k] = v\n        end\n    end\n    return place:clone{names=names}\nend\n\n----------------- other helper functions -----------------------------\n\nlocal function lookup_prefilter_classification(k, v)\n    -- full matches\n    local desc = MAIN_KEYS[k]\n    local fullmatch = desc and (desc[v] or desc[1])\n    if fullmatch ~= nil then\n        return fullmatch\n    end\n    -- suffixes\n    for slen, slist in pairs(PRE_FILTER.suffix) do\n        if #k >= slen then\n            local group = slist[k:sub(-slen)]\n            if group ~= nil then\n                return group\n            end\n        end\n    end\n    -- prefixes\n    for slen, slist in pairs(PRE_FILTER.prefix) do\n        if #k >= slen then\n            local group = slist[k:sub(1, slen)]\n            if group ~= nil then\n                return group\n            end\n        end\n    end\nend\n\n\nlocal function merge_filters_into_main(group, keys, tags)\n    if keys ~= nil then\n        for _, key in pairs(keys) do\n            -- ignore suffix and prefix matches\n            if key:sub(1, 1) ~= '*' and key:sub(#key, #key) ~= '*' then\n                if MAIN_KEYS[key] == nil then\n                    MAIN_KEYS[key] = {}\n                end\n                MAIN_KEYS[key][1] = group\n            end\n        end\n    end\n\n    if tags ~= nil then\n        for key, values in pairs(tags) do\n            if MAIN_KEYS[key] == nil then\n                MAIN_KEYS[key] = {}\n            end\n            for _, v in pairs(values) do\n                MAIN_KEYS[key][v] = group\n            end\n        end\n    end\nend\n\n\nlocal function remove_group_from_main(group)\n    for key, values in pairs(MAIN_KEYS) do\n        for _, ttype in pairs(values) do\n            if ttype == group then\n                values[ttype] = nil\n            end\n        end\n        if next(values) == nil then\n            MAIN_KEYS[key] = nil\n        end\n    end\nend\n\n\nlocal function add_pre_filter(data)\n    for group, keys in pairs(data) do\n        for _, key in pairs(keys) do\n            local klen = #key - 1\n            if key:sub(1, 1) == '*' then\n                if klen > 0 then\n                    if PRE_FILTER.suffix[klen] == nil then\n                        PRE_FILTER.suffix[klen] = {}\n                    end\n                    PRE_FILTER.suffix[klen][key:sub(2)] = group\n                end\n            elseif key:sub(#key, #key) == '*' then\n                if PRE_FILTER.prefix[klen] == nil then\n                    PRE_FILTER.prefix[klen] = {}\n                end\n                PRE_FILTER.prefix[klen][key:sub(1, klen)] = group\n            end\n        end\n    end\nend\n\n------------- Place class ------------------------------------------\n\nlocal Place = {}\nPlace.__index = Place\n\nfunction Place.new(object, geom_func)\n    local self = setmetatable({}, Place)\n    self.object = object\n    self.geom_func = geom_func\n\n    self.admin_level = tonumber(self.object.tags.admin_level or 15) or 15\n    if self.admin_level == nil\n       or self.admin_level <= 0 or self.admin_level > 15\n       or math.floor(self.admin_level) ~= self.admin_level then\n        self.admin_level = 15\n    end\n\n    self.num_entries = 0\n    self.has_name = false\n    self.names = {}\n    self.address = {}\n    self.extratags = {}\n\n    self.intags = {}\n\n    local has_main_tags = false\n    for k, v in pairs(self.object.tags) do\n        local group = lookup_prefilter_classification(k, v)\n        if group == 'extra' then\n            self.extratags[k] = v\n        elseif group ~= 'delete' then\n            self.intags[k] = v\n            if group ~= nil then\n                has_main_tags = true\n            end\n        end\n    end\n\n    if not has_main_tags then\n        -- no interesting tags, don't bother processing\n        self.intags = {}\n    end\n\n    return self\nend\n\nfunction Place:clean(data)\n    for k, v in pairs(self.intags) do\n        if data.delete ~= nil and data.delete(k, v) then\n            self.intags[k] = nil\n        elseif data.extra ~= nil and data.extra(k, v) then\n            self.extratags[k] = v\n            self.intags[k] = nil\n        end\n    end\nend\n\nfunction Place:delete(data)\n    if data.match ~= nil then\n        for k, v in pairs(self.intags) do\n            if data.match(k, v) then\n                self.intags[k] = nil\n            end\n        end\n    end\nend\n\nfunction Place:grab_extratags(data)\n    local count = 0\n\n    if data.match ~= nil then\n        for k, v in pairs(self.intags) do\n            if data.match(k, v) then\n                self.intags[k] = nil\n                self.extratags[k] = v\n                count = count + 1\n            end\n        end\n    end\n\n    return count\nend\n\nlocal function strip_address_prefix(k)\n    if k:sub(1, 5) == 'addr:' then\n        return k:sub(6)\n    end\n\n    if k:sub(1, 6) == 'is_in:' then\n        return k:sub(7)\n    end\n\n    return k\nend\n\n\nfunction Place:grab_address_parts(data)\n    local count = 0\n\n    if data.groups ~= nil then\n        for k, v in pairs(self.intags) do\n            local atype = data.groups(k, v)\n\n            if atype ~= nil then\n                if atype == 'main' then\n                    self.has_name = true\n                    self.address[strip_address_prefix(k)] = v\n                    count = count + 1\n                elseif atype == 'extra' then\n                    self.address[strip_address_prefix(k)] = v\n                else\n                    self.address[atype] = v\n                end\n                self.intags[k] = nil\n            end\n        end\n    end\n\n    return count\nend\n\n\nfunction Place:grab_name_parts(data)\n    local fallback = nil\n\n    if data.groups ~= nil then\n        for k, v in pairs(self.intags) do\n            local atype = data.groups(k, v)\n\n            if atype ~= nil then\n                self.names[k] = v\n                self.intags[k] = nil\n                if atype == 'main' then\n                    self.has_name = true\n                elseif atype == 'house' then\n                    self.has_name = true\n                    fallback = {'place', 'house', address_fallback}\n                end\n            end\n        end\n    end\n\n    return fallback\nend\n\n\nfunction Place:write_place(k, v, mfunc)\n    v = v or self.intags[k]\n    if v == nil then\n        return 0\n    end\n\n    local place = mfunc(self, k, v)\n    if place then\n        local res = place:write_row(k, v)\n        self.num_entries = self.num_entries + res\n        return res\n    end\n\n    return 0\nend\n\n\nfunction Place:geometry_is_valid()\n    if self.geometry == nil then\n        self.geometry = self.geom_func(self.object)\n\n        if self.geometry == nil or self.geometry:is_null() then\n            self.geometry = false\n            return false\n        end\n\n        return true\n    end\n\n    return self.geometry ~= false\nend\n\n\nfunction Place:write_row(k, v)\n    if not self:geometry_is_valid() then\n        return 0\n    end\n\n     local extra = EXTRATAGS_FILTER(self, k, v) or {}\n\n     for tk, tv in pairs(self.object.tags) do\n         if REQUIRED_EXTRATAGS_FILTER(tk, tv) and extra[tk] == nil then\n             extra[tk] = tv\n         end\n     end\n\n     if extra and next(extra) == nil then\n         extra = nil\n     end\n\n    insert_row.place{\n        class = k,\n        type = v,\n        admin_level = self.admin_level,\n        name = next(self.names) and self.names,\n        address = next(self.address) and self.address,\n        extratags = extra,\n        geometry = self.geometry\n    }\n\n    return 1\nend\n\n\nfunction Place:clone(data)\n    local cp = setmetatable({}, Place)\n    cp.object = self.object\n    cp.geometry = data.geometry or self.geometry\n    cp.geom_func = self.geom_func\n    cp.intags = data.intags or self.intags\n    cp.admin_level = data.admin_level or self.admin_level\n    cp.names = data.names or self.names\n    cp.address = data.address or self.address\n    cp.extratags = data.extratags or self.extratags\n\n    return cp\nend\n\n\nfunction module.tag_match(data)\n    if data == nil or next(data) == nil then\n        return nil\n    end\n\n    local fullmatches = {}\n    local key_prefixes = {}\n    local key_suffixes = {}\n\n    if data.keys ~= nil then\n        for _, key in pairs(data.keys) do\n            if key:sub(1, 1) == '*' then\n                if #key > 1 then\n                    if key_suffixes[#key - 1] == nil then\n                        key_suffixes[#key - 1] = {}\n                    end\n                    key_suffixes[#key - 1][key:sub(2)] = true\n                end\n            elseif key:sub(#key, #key) == '*' then\n                if key_prefixes[#key - 1] == nil then\n                    key_prefixes[#key - 1] = {}\n                end\n                key_prefixes[#key - 1][key:sub(1, #key - 1)] = true\n            else\n                fullmatches[key] = true\n            end\n        end\n    end\n\n    if data.tags ~= nil then\n        for k, vlist in pairs(data.tags) do\n            if fullmatches[k] == nil then\n                fullmatches[k] = {}\n                for _, v in pairs(vlist) do\n                    fullmatches[k][v] = true\n                end\n            end\n        end\n    end\n\n    return function (k, v)\n        if fullmatches[k] ~= nil and (fullmatches[k] == true or fullmatches[k][v] ~= nil) then\n            return true\n        end\n\n        for slen, slist in pairs(key_suffixes) do\n            if #k >= slen and slist[k:sub(-slen)] ~= nil then\n                return true\n            end\n        end\n\n        for slen, slist in pairs(key_prefixes) do\n            if #k >= slen and slist[k:sub(1, slen)] ~= nil then\n                return true\n            end\n        end\n\n        return false\n    end\nend\n\n\nfunction module.tag_group(data)\n    if data == nil or next(data) == nil then\n        return nil\n    end\n\n    local fullmatches = {}\n    local key_prefixes = {}\n    local key_suffixes = {}\n\n    for group, tags in pairs(data) do\n        for _, key in pairs(tags) do\n            if key:sub(1, 1) == '*' then\n                if #key > 1 then\n                    if key_suffixes[#key - 1] == nil then\n                        key_suffixes[#key - 1] = {}\n                    end\n                    key_suffixes[#key - 1][key:sub(2)] = group\n                end\n            elseif key:sub(#key, #key) == '*' then\n                if key_prefixes[#key - 1] == nil then\n                    key_prefixes[#key - 1] = {}\n                end\n                key_prefixes[#key - 1][key:sub(1, #key - 1)] = group\n            else\n                fullmatches[key] = group\n            end\n        end\n    end\n\n    return function (k)\n        local val = fullmatches[k]\n        if val ~= nil then\n            return val\n        end\n\n        for slen, slist in pairs(key_suffixes) do\n            if #k >= slen then\n                val = slist[k:sub(-slen)]\n                if val ~= nil then\n                    return val\n                end\n            end\n        end\n\n        for slen, slist in pairs(key_prefixes) do\n            if #k >= slen then\n                val = slist[k:sub(1, slen)]\n                if val ~= nil then\n                    return val\n                end\n            end\n        end\n    end\nend\n\n-- Returns prefix part of the keys, and reject suffix matching keys\nlocal function process_key(key)\n    if key:sub(1, 1) == '*' then\n        return nil\n    end\n    if key:sub(#key, #key) == '*' then\n        return key:sub(1, #key - 2)\n    end\n    return key\nend\n\n-- Process functions for all data types\nfunction module.process_node(object)\n    if ENTRANCE_FUNCTION ~= nil then\n        local entrance_info = ENTRANCE_FUNCTION(object)\n        if entrance_info ~= nil then\n            insert_row.place_entrance{\n                type = entrance_info.entrance,\n                extratags = entrance_info.extratags,\n                geometry = object:as_point()\n            }\n        end\n    end\n\n    local function geom_func(o)\n        return o:as_point()\n    end\n\n    module.process_tags(Place.new(object, geom_func))\nend\n\nfunction module.process_way(object)\n\n    local function geom_func(o)\n        local geom = o:as_polygon()\n\n        if geom:is_null() then\n            geom = o:as_linestring()\n            if geom:is_null() or geom:length() > 30 then\n                return nil\n            end\n        end\n\n        return geom\n    end\n\n    module.process_tags(Place.new(object, geom_func))\nend\n\nfunction module.process_relation(object)\n    if object.tags.type == 'associatedStreet' then\n        local has_street = false\n        for _, member in ipairs(object.members) do\n            -- Streets can only be ways or relations, not nodes\n            if member.role == 'street' and (member.type == 'w' or member.type == 'r') then\n                has_street = true\n                break\n            end\n        end\n        if has_street then\n            for _, member in ipairs(object.members) do\n                -- Only insert streets that are ways or relations\n                if member.role == 'street' and (member.type == 'w' or member.type == 'r') then\n                    insert_row.place_associated_street{\n                        member_type = member.type:upper(),\n                        member_id = member.ref,\n                        member_role = member.role\n                    }\n                elseif member.role == 'house' then\n                    insert_row.place_associated_street{\n                        member_type = member.type:upper(),\n                        member_id = member.ref,\n                        member_role = member.role\n                    }\n                end\n            end\n        end\n    end\n\n    local geom_func = module.RELATION_TYPES[object.tags.type]\n\n    if geom_func ~= nil then\n        module.process_tags(Place.new(object, geom_func))\n    end\nend\n\n-- The process functions are used by default by osm2pgsql.\nif themepark then\n    themepark:add_proc('node', module.process_node)\n    themepark:add_proc('way', module.process_way)\n    themepark:add_proc('relation', module.process_relation)\nelse\n    osm2pgsql.process_node = module.process_node\n    osm2pgsql.process_way = module.process_way\n    osm2pgsql.process_relation = module.process_relation\nend\n\nfunction module.process_tags(o)\n    if next(o.intags) == nil then\n        return  -- shortcut when pre-filtering has removed all tags\n    end\n\n    -- Exception for boundary/place double tagging\n    if o.intags.boundary == 'administrative' then\n        o:grab_extratags{match = function (k, v)\n            return k == 'place' and v:sub(1,3) ~= 'isl'\n        end}\n    end\n\n    -- name keys\n    local fallback = o:grab_name_parts{groups=NAME_FILTER}\n\n    -- address keys\n    if o:grab_address_parts{groups=ADDRESS_FILTER} > 0 and fallback == nil then\n        fallback = {'place', 'house', address_fallback}\n    end\n    if o.address.country ~= nil and #o.address.country ~= 2 then\n        o.address['country'] = nil\n    end\n\n    if o.address.interpolation ~= nil and o.address.housenumber == nil\n            and o.object.type == 'way' and o.object.nodes ~= nil then\n        local extra_addr = nil\n        for k, v in pairs(o.address) do\n            if k ~= 'interpolation' then\n                if extra_addr == nil then\n                    extra_addr = {}\n                end\n                extra_addr[k] = v\n            end\n        end\n\n        insert_row.place_interpolation{\n            type = o.address.interpolation,\n            address = extra_addr,\n            nodes = '{' .. table.concat(o.object.nodes, ',') .. '}',\n            geometry = o.object:as_linestring()\n        }\n    end\n\n    -- collect main keys\n    local postcode_collect = false\n    for k, v in pairs(o.intags) do\n        local ktable = MAIN_KEYS[k]\n        if ktable then\n            local ktype = ktable[v] or ktable[1]\n            if type(ktype) == 'function' then\n                o:write_place(k, v, ktype)\n            elseif ktype == 'postcode_area' then\n                postcode_collect = true\n                if o.object.type == 'relation'\n                        and o.address.postcode ~= nil\n                        and o:geometry_is_valid() then\n                    insert_row.place_postcode{\n                        postcode = o.address.postcode,\n                        centroid = o.geometry:centroid(),\n                        geometry = o.geometry\n                    }\n                end\n            elseif ktype == 'fallback' and o.has_name then\n                fallback = {k, v, PlaceTransform.always}\n            end\n        end\n    end\n\n    if o.num_entries == 0 then\n        if fallback ~= nil then\n            o:write_place(fallback[1], fallback[2], fallback[3])\n        elseif POSTCODE_FALLBACK and not postcode_collect\n                and o.address.postcode ~= nil\n                and o:geometry_is_valid() then\n            insert_row.place_postcode{\n                postcode = o.address.postcode,\n                centroid = o.geometry:centroid()\n            }\n        end\n    end\nend\n\n--------- Extratags post-processing functions ---------------\n\nlocal function default_extratags_filter(p, k)\n    return p.extratags\nend\n\nEXTRATAGS_FILTER = default_extratags_filter\nREQUIRED_EXTRATAGS_FILTER = module.tag_match(PRESETS.EXTRATAGS)\n\n--------- Convenience functions for simple style configuration -----------------\n\nfunction module.set_prefilters(data)\n    remove_group_from_main('delete')\n    merge_filters_into_main('delete', data.delete_keys, data.delete_tags)\n\n    remove_group_from_main('extra')\n    merge_filters_into_main('extra', data.extra_keys, data.extra_tags)\n\n    PRE_FILTER = {prefix = {}, suffix = {}}\n    add_pre_filter{delete = data.delete_keys, extra = data.extra_keys}\nend\n\n\nfunction module.ignore_keys(data)\n    if type(data) == 'string' then\n        local preset = data\n        data = PRESETS.IGNORE_KEYS[data]\n        if data == nil then\n            error('Unknown preset for ignored keys: ' .. preset)\n        end\n    end\n    merge_filters_into_main('delete', data)\n    add_pre_filter{delete = data}\nend\n\n\nfunction module.add_for_extratags(data)\n    if type(data) == 'string' then\n        local preset = data\n        data = PRESETS.IGNORE_KEYS[data]\n        if data == nil then\n            error('Unknown preset for extratags: ' .. preset)\n        end\n    end\n    merge_filters_into_main('extra', data)\n    add_pre_filter{extra = data}\nend\n\n\nfunction module.set_main_tags(data)\n    for key, values in pairs(MAIN_KEYS) do\n        for _, ttype in pairs(values) do\n            if ttype == 'fallback' or type(ttype) == 'function' then\n                values[ttype] = nil\n            end\n        end\n        if next(values) == nil then\n            MAIN_KEYS[key] = nil\n        end\n    end\n    module.modify_main_tags(data)\nend\n\n\nfunction module.modify_main_tags(data)\n    if type(data) == 'string' then\n        local preset = data\n        if data:sub(1, 7) == 'street/' then\n            data = PRESETS.MAIN_TAGS_STREETS[data:sub(8)]\n        elseif data:sub(1, 4) == 'poi/' then\n            data = PRESETS.MAIN_TAGS_POIS(data:sub(5))\n        else\n            data = PRESETS.MAIN_TAGS[data]\n        end\n        if data == nil then\n            error('Unknown preset for main tags: ' .. preset)\n        end\n    end\n\n    for k, v in pairs(data) do\n        if MAIN_KEYS[k] == nil then\n            MAIN_KEYS[k] = {}\n        end\n        if type(v) == 'function' then\n            MAIN_KEYS[k][1] = v\n        elseif type(v) == 'string' then\n            MAIN_KEYS[k][1] = PlaceTransform[v]\n        elseif type(v) == 'table' then\n            for subk, subv in pairs(v) do\n                if type(subv) == 'function' then\n                    MAIN_KEYS[k][subk] = subv\n                else\n                    MAIN_KEYS[k][subk] = PlaceTransform[subv]\n                end\n            end\n        end\n    end\nend\n\n\nfunction module.modify_name_tags(data)\n    if type(data) == 'string' then\n        local preset = data\n        data = PRESETS.NAME_TAGS[data]\n        if data == nil then\n            error('Unknown preset for name keys: ' .. preset)\n        end\n    end\n\n    for k,v in pairs(data) do\n        if next(v) then\n            NAMES[k] = v\n        else\n            NAMES[k] = nil\n        end\n    end\n    NAME_FILTER = module.tag_group(NAMES)\n    remove_group_from_main('fallback:name')\n    if data.house ~= nil then\n        merge_filters_into_main('fallback:name', data.house)\n    end\nend\n\n\nfunction module.set_name_tags(data)\n    NAMES = {}\n    module.modify_name_tags(data)\nend\n\n\nfunction module.set_address_tags(data)\n    ADDRESS_TAGS = {}\n    module.modify_address_tags(data)\nend\n\n\nfunction module.modify_address_tags(data)\n    if type(data) == 'string' then\n        local preset = data\n        data = PRESETS.ADDRESS_TAGS[data]\n        if data == nil then\n            error('Unknown preset for address keys: ' .. preset)\n        end\n    end\n\n    for k, v in pairs(data) do\n        if k == 'postcode_fallback' then\n            POSTCODE_FALLBACK = v\n        elseif next(v) == nil then\n            ADDRESS_TAGS[k] = nil\n        else\n            ADDRESS_TAGS[k] = v\n        end\n    end\n\n    ADDRESS_FILTER = module.tag_group(ADDRESS_TAGS)\n\n    remove_group_from_main('fallback:address')\n    merge_filters_into_main('fallback:address', data.main)\n    merge_filters_into_main('fallback:address', data.interpolation)\n    remove_group_from_main('fallback:postcode')\n    if POSTCODE_FALLBACK then\n        merge_filters_into_main('fallback:postcode', data.postcode)\n    end\nend\n\n\nfunction module.set_address_tags(data)\n    ADDRESS_TAGS_SOURCE = {}\n    module.modify_address_tags(data)\nend\n\n\nfunction module.set_postcode_fallback(enable)\n    if POSTCODE_FALLBACK ~= enable then\n        remove_group_from_main('fallback:postcode')\n        if enable then\n            merge_filters_into_main('fallback:postcode', ADDRESS_TAGS.postcode)\n        end\n    end\n    POSTCODE_FALLBACK = enable\nend\n\n\nfunction module.set_unused_handling(data)\n    if type(data) == 'function' then\n        EXTRATAGS_FILTER = data\n    elseif data == nil then\n        EXTRATAGS_FILTER = default_extratags_filter\n    elseif data.extra_keys == nil and data.extra_tags == nil then\n        local delfilter = module.tag_match{keys = data.delete_keys, tags = data.delete_tags}\n        EXTRATAGS_FILTER = function (p, k)\n            local extra = {}\n            for kin, vin in pairs(p.intags) do\n                if kin ~= k and not delfilter(kin, vin) then\n                    extra[kin] = vin\n                end\n            end\n            if next(extra) == nil then\n                return p.extratags\n            end\n            for kextra, vextra in pairs(p.extratags) do\n                extra[kextra] = vextra\n            end\n            return extra\n        end\n    elseif data.delete_keys == nil and data.delete_tags == nil then\n        local incfilter = module.tag_match{keys = data.extra_keys, tags = data.extra_tags}\n        EXTRATAGS_FILTER = function (p, k)\n            local extra = {}\n            for kin, vin in pairs(p.intags) do\n                if kin ~= k and incfilter(kin, vin) then\n                    extra[kin] = vin\n                end\n            end\n            if next(extra) == nil then\n                return p.extratags\n            end\n            for kextra, vextra in pairs(p.extratags) do\n                extra[kextra] = vextra\n            end\n            return extra\n        end\n    else\n        error(\"unused handler can have only 'extra_keys' or 'delete_keys' set.\")\n    end\nend\n\nfunction module.set_relation_types(data)\n    module.RELATION_TYPES = {}\n    for k, v in data do\n        if v == 'multipolygon' then\n            module.RELATION_TYPES[k] = module.relation_as_multipolygon\n        elseif v == 'multiline' then\n            module.RELATION_TYPES[k] = module.relation_as_multiline\n        end\n    end\nend\n\nfunction module.set_entrance_filter(data)\n    if data == nil or type(data) == 'function' then\n        ENTRANCE_FUNCTION = data\n        return nil\n    end\n\n    if type(data) == 'string' then\n        local preset = data\n        data = PRESETS.ENTRANCE_TABLE[data]\n        if data == nil then\n            error('Unknown preset for entrance table: ' .. preset)\n        end\n    end\n\n    ENTRANCE_FUNCTION = nil\n\n    if data.main_tags ~= nil and next(data.main_tags) ~= nil then\n        if data.extra_include ~= nil and next(data.extra_include) == nil then\n            -- shortcut: no extra tags requested\n            ENTRANCE_FUNCTION = function(o)\n                for _, v in ipairs(data.main_tags) do\n                    if o.tags[v] ~= nil then\n                        return {entrance = o.tags[v]}\n                    end\n                end\n                return nil\n            end\n        else\n            if data.extra_include ~= nil then\n                local tags = {}\n                for _, v in pairs(data.extra_include) do\n                    tags[v] = true\n                end\n                if data.extra_exclude ~= nil then\n                    for _, v in pairs(data.extra_exclude) do\n                        tags[v] = nil\n                    end\n                end\n                for _, v in pairs(data.main_tags) do\n                    tags[v] = nil\n                end\n\n                ENTRANCE_FUNCTION = function(o)\n                    for _, v in ipairs(data.main_tags) do\n                        if o.tags[v] ~= nil then\n                            local entrance = o.tags[v]\n                            local extra = {}\n                            for k, v in pairs(tags) do\n                                extra[k] = o.tags[k]\n                            end\n                            if next(extra) == nil then\n                                extra = nil\n                            end\n                            return {entrance = entrance, extratags = extra}\n                        end\n                    end\n\n                    return nil\n                end\n            else\n                local notags = {}\n                if data.extra_exclude ~= nil then\n                    for _, v in pairs(data.extra_exclude) do\n                        notags[v] = 1\n                    end\n                end\n                for _, v in pairs(data.main_tags) do\n                    notags[v] = 1\n                end\n\n                ENTRANCE_FUNCTION = function(o)\n                    for _, v in ipairs(data.main_tags) do\n                        if o.tags[v] ~= nil then\n                            local entrance = o.tags[v]\n                            local extra = {}\n                            for k, v in pairs(o.tags) do\n                                if notags[k] ~= 1 then\n                                    extra[k] = v\n                                end\n                            end\n                            if next(extra) == nil then\n                                extra = nil\n                            end\n                            return {entrance = entrance, extratags = extra}\n                        end\n                    end\n\n                    return nil\n                end\n            end\n        end\n    end\nend\n\nfunction module.get_taginfo()\n    return {main = MAIN_KEYS, name = NAMES, address = ADDRESS_TAGS}\nend\n\nreturn module\n"
  },
  {
    "path": "lib-lua/themes/nominatim/presets.lua",
    "content": "-- Defines defaults used in the topic definitions.\n\nlocal module = {}\n\n-- Helper functions\n\nlocal function group_merge(group1, group2)\n    for name, values in pairs(group2) do\n        if group1[name] == nil then\n            group1[name] = values\n        else\n            for _, v in pairs(values) do\n                table.insert(group1[name], v)\n            end\n        end\n    end\n\n    return group1\nend\n\n-- Customized main tag filter functions\n\nlocal EXCLUDED_FOOTWAYS = { sidewalk = 1, crossing = 1, link = 1, traffic_aisle }\n\nlocal function filter_footways(place)\n    if place.has_name then\n        local footway = place.object.tags.footway\n        if footway == nil or EXCLUDED_FOOTWAYS[footway] ~= 1 then\n            return place\n        end\n    end\n    return false\nend\n\nlocal function include_when_tag_present(key, value, named)\n    if named then\n        return function(place)\n                   if place.has_name and place.intags[key] == value then\n                       return place\n                   end\n                   return false\n               end\n    else\n        return function(place)\n                   if place.intags[key] == value then\n                       return place\n                   end\n                   return false\n               end\n    end\nend\n\nlocal function exclude_when_key_present(key, named)\n    if named then\n        return function(place)\n                   if place.has_name and place.intags[key] == nil then\n                       return place\n                   end\n                   return false\n               end\n    else\n        return function(place)\n                   if place.intags[key] == nil then\n                       return place\n                   end\n                   return false\n               end\n\n    end\nend\n\nlocal function lock_transform(place)\n    if place.object.tags.waterway ~= nil then\n        local name = place.object.tags.lock_name\n        if name ~= nil then\n            return place:clone{names={name=name, ref=place.object.tags.lock_ref}}\n        end\n    end\n\n    return false\nend\n\n-- Main tag definition\n\nmodule.MAIN_TAGS = {}\n\nmodule.MAIN_TAGS.admin = {\n    boundary = {administrative = 'named'},\n    landuse = {residential = 'fallback',\n               farm = 'fallback',\n               farmyard = 'fallback',\n               industrial = 'fallback',\n               commercial = 'fallback',\n               allotments = 'fallback',\n               retail = 'fallback'},\n    place = {county = 'always',\n             district = 'always',\n             municipality = 'always',\n             city = 'always',\n             town = 'always',\n             borough = 'always',\n             village = 'always',\n             suburb = 'always',\n             hamlet = 'always',\n             croft = 'always',\n             subdivision = 'always',\n             allotments = 'always',\n             neighbourhood = 'always',\n             quarter = 'always',\n             isolated_dwelling = 'always',\n             farm = 'always',\n             city_block = 'always',\n             locality = 'always'}\n}\n\nmodule.MAIN_TAGS.all_boundaries = {\n    boundary = {'named',\n                place = 'delete',\n                land_area = 'delete',\n                protected_area = 'fallback',\n                postal_code = 'postcode_area'},\n    landuse = 'fallback',\n    place = 'always'\n}\n\nmodule.MAIN_TAGS.natural = {\n    waterway = {'named',\n                riverbank = 'delete'},\n    natural = {'named',\n               yes = 'delete',\n               no = 'delete',\n               coastline = 'delete',\n               saddle = 'fallback',\n               water = exclude_when_key_present('water', true)},\n    mountain_pass = {'always',\n                     no = 'delete'},\n    water = {include_when_tag_present('natural', 'water', true),\n             river = 'never',\n             stream = 'never',\n             canal = 'never',\n             ditch = 'never',\n             drain = 'never',\n             fish_pass = 'never',\n             yes = 'delete',\n             intermittent = 'delete',\n             tidal = 'delete'\n             }\n}\n\nmodule.MAIN_TAGS_POIS = function (group)\n    group = group or 'delete'\n    return {\n    aerialway = {'always',\n                 no = group,\n                 pylon = group},\n    aeroway = {'always',\n               no = group},\n    amenity = {'always',\n               no = group,\n               parking_space = group,\n               parking_entrance = group,\n               waste_disposal = group,\n               hunting_stand = group},\n    building = {'fallback',\n                no = group},\n    bridge = {'named_with_key',\n              no = group},\n    club = {'always',\n            no = group},\n    craft = {'always',\n             no = group},\n    emergency = {'always',\n                 no = group,\n                 yes = group,\n                 fire_hydrant = group},\n    healthcare = {'fallback',\n                  yes = group,\n                  no = group},\n    highway = {'always',\n               no = group,\n               turning_circle = group,\n               mini_roundabout = group,\n               noexit = group,\n               crossing = group,\n               give_way = group,\n               stop = group,\n               turning_loop = group,\n               passing_place = group,\n               street_lamp = 'named',\n               traffic_signals = 'named'},\n    historic = {'fallback',\n                yes = group,\n                no = group},\n    information = {include_when_tag_present('tourism', 'information'),\n                   yes = 'delete',\n                   route_marker = 'never',\n                   trail_blaze = 'never'},\n    junction = {'fallback',\n                no = group},\n    landuse = {cemetery = 'always'},\n    leisure = {'always',\n               nature_reserve = 'named',\n               swimming_pool = 'named',\n               garden = 'named',\n               common = 'named',\n               no = group},\n    lock = {yes = lock_transform},\n    man_made = {pier = 'always',\n                tower = 'always',\n                bridge = 'always',\n                works = 'named',\n                water_tower = 'always',\n                dyke = 'named',\n                adit = 'named',\n                lighthouse = 'always',\n                watermill = 'always',\n                tunnel = 'always'},\n    military = {'always',\n                yes = group,\n                no = group},\n    office = {'always',\n              no = group},\n    railway = {'named',\n               rail = group,\n               no = group,\n               abandoned = group,\n               disused = group,\n               razed = group,\n               level_crossing = group,\n               switch = group,\n               signal = group,\n               buffer_stop = group},\n    shop = {'always',\n            no = group},\n    tourism = {'always',\n               attraction = 'fallback',\n               no = group,\n               yes = group,\n               information = exclude_when_key_present('information')},\n    tunnel = {'named_with_key',\n              no = group}\n} end\n\nmodule.MAIN_TAGS_STREETS = {}\n\nmodule.MAIN_TAGS_STREETS.default = {\n    place = {square = 'always'},\n    highway = {motorway = 'always',\n               trunk = 'always',\n               primary = 'always',\n               secondary = 'always',\n               tertiary = 'always',\n               unclassified = 'always',\n               residential = 'always',\n               road = 'always',\n               living_street = 'always',\n               pedestrian = 'always',\n               service = 'named',\n               cycleway = 'named',\n               path = 'named',\n               footway = filter_footways,\n               steps = 'named',\n               bridleway = 'named',\n               track = 'named',\n               motorway_link = 'named',\n               trunk_link = 'named',\n               primary_link = 'named',\n               secondary_link = 'named',\n               tertiary_link = 'named'}\n}\n\nmodule.MAIN_TAGS_STREETS.car = {\n    place = {square = 'always'},\n    highway = {motorway = 'always',\n               trunk = 'always',\n               primary = 'always',\n               secondary = 'always',\n               tertiary = 'always',\n               unclassified = 'always',\n               residential = 'always',\n               road = 'always',\n               living_street = 'always',\n               service = 'always',\n               track = 'always',\n               motorway_link = 'always',\n               trunk_link = 'always',\n               primary_link = 'always',\n               secondary_link = 'always',\n               tertiary_link = 'always'}\n}\n\nmodule.MAIN_TAGS_STREETS.all = {\n    place = {square = 'always'},\n    highway = {motorway = 'always',\n               trunk = 'always',\n               primary = 'always',\n               secondary = 'always',\n               tertiary = 'always',\n               unclassified = 'always',\n               residential = 'always',\n               road = 'always',\n               living_street = 'always',\n               pedestrian = 'always',\n               service = 'always',\n               cycleway = 'always',\n               path = 'always',\n               footway = 'always',\n               steps = 'always',\n               bridleway = 'always',\n               track = 'always',\n               motorway_link = 'always',\n               trunk_link = 'always',\n               primary_link = 'always',\n               secondary_link = 'always',\n               tertiary_link = 'always'}\n}\n\n\n-- name tags\n\nmodule.NAME_TAGS = {}\n\nmodule.NAME_TAGS.core = {main = {'name', 'name:*',\n                                 'int_name', 'int_name:*',\n                                 'reg_name', 'reg_name:*',\n                                 'loc_name', 'loc_name:*',\n                                 'old_name', 'old_name:*',\n                                 'alt_name', 'alt_name:*', 'alt_name_*',\n                                 'official_name', 'official_name:*',\n                                 'place_name', 'place_name:*',\n                                 'short_name', 'short_name:*'},\n                         extra = {'ref', 'int_ref', 'nat_ref', 'reg_ref',\n                                  'loc_ref', 'old_ref', 'ISO3166-2'}\n                        }\nmodule.NAME_TAGS.address = {house = {'addr:housename'}}\nmodule.NAME_TAGS.poi = group_merge({main = {'brand'},\n                                    extra = {'iata', 'icao', 'faa'}},\n                                   module.NAME_TAGS.core)\n\n-- Address tagging\n\nmodule.ADDRESS_TAGS = {}\n\nmodule.ADDRESS_TAGS.core = { extra = {'addr:*', 'is_in:*', 'tiger:county'},\n                             postcode = {'postal_code', 'postcode', 'addr:postcode',\n                                         'tiger:zip_left', 'tiger:zip_right'},\n                             country = {'country_code', 'ISO3166-1',\n                                        'addr:country_code', 'is_in:country_code',\n                                        'addr:country', 'is_in:country'}\n                           }\n\nmodule.ADDRESS_TAGS.houses = { main = {'addr:housenumber',\n                                       'addr:conscriptionnumber',\n                                       'addr:streetnumber'},\n                               interpolation = {'addr:interpolation'}\n                             }\n\n-- Ignored tags (prefiltered away)\n\nmodule.IGNORE_KEYS = {}\n\nmodule.IGNORE_KEYS.metatags = {'note', 'note:*', 'source', 'source:*', '*source',\n                               'attribution', 'comment', 'fixme', 'created_by',\n                               'tiger:cfcc', 'tiger:reviewed', 'nysgissam:*',\n                               'NHD:*', 'nhd:*', 'gnis:*', 'geobase:*', 'yh:*',\n                               'osak:*', 'naptan:*', 'CLC:*', 'import', 'it:fvg:*',\n                               'lacounty:*', 'ref:linz:*', 'survey:*',\n                               'ref:bygningsnr', 'ref:ruian:*', 'building:ruian:type',\n                               'type',\n                               'is_in:postcode'}\nmodule.IGNORE_KEYS.name = {'*:prefix', '*:suffix', 'name:prefix:*', 'name:suffix:*',\n                           'name:etymology', 'name:etymology:*',\n                           'name:signed', 'name:botanical'}\nmodule.IGNORE_KEYS.address = {'addr:street:*', 'addr:city:*', 'addr:district:*',\n                              'addr:province:*', 'addr:subdistrict:*', 'addr:place:*',\n                              'addr:TW:dataset'}\n\n-- INTERNAL: Required extra tags\n\nmodule.EXTRATAGS = {keys = {'wikipedia', 'wikipedia:*', 'wikidata', 'capital'}}\n\n-- Defaults for the entrance table\n\nmodule.ENTRANCE_TABLE = {}\n\nmodule.ENTRANCE_TABLE.default = {main_tags = {'entrance', 'routing:entrance'},\n                                 extra_exclude = module.IGNORE_KEYS.metatags}\n\nreturn module\n"
  },
  {
    "path": "lib-lua/themes/nominatim/topics/address.lua",
    "content": "local _, flex, cfg = ...\n\nflex.set_main_tags('admin')\nflex.modify_main_tags('street/' .. (cfg.street_theme or 'default'))\nflex.modify_main_tags{boundary = {postal_code = 'always'}}\n\nflex.set_name_tags('core')\nflex.modify_name_tags('address')\n\nflex.set_address_tags('core')\nflex.modify_address_tags('houses')\n\nflex.ignore_keys('metatags')\n\nif cfg.with_extratags then\n    flex.set_unused_handling{delete_keys = {'tiger:*'}}\n    flex.add_for_extratags('name')\n    flex.add_for_extratags('address')\nelse\n    flex.ignore_keys('name')\n    flex.ignore_keys('address')\nend\n"
  },
  {
    "path": "lib-lua/themes/nominatim/topics/admin.lua",
    "content": "local _, flex, cfg = ...\n\nflex.set_main_tags('admin')\n\nflex.set_name_tags('core')\n\nflex.set_address_tags('core')\nflex.set_postcode_fallback(false)\n\nflex.ignore_keys('metatags')\n\nif cfg.with_extratags then\n    flex.set_unused_handling{delete_keys = {'tiger:*'}}\n    flex.add_for_extratags('name')\n    flex.add_for_extratags('address')\nelse\n    flex.ignore_keys('name')\n    flex.ignore_keys('address')\nend\n"
  },
  {
    "path": "lib-lua/themes/nominatim/topics/full.lua",
    "content": "local _, flex, cfg = ...\n\nlocal group\nif cfg.with_extratags then\n    group = 'extra'\nelse\n    group = 'delete'\nend\n\nflex.set_main_tags('all_boundaries')\nflex.modify_main_tags('natural')\nflex.modify_main_tags('street/' .. (cfg.street_theme or 'default'))\nflex.modify_main_tags('poi/' .. group)\n\nflex.set_name_tags('core')\nflex.modify_name_tags('address')\nflex.modify_name_tags('poi')\n\nflex.set_address_tags('core')\nflex.modify_address_tags('houses')\n\nflex.ignore_keys('metatags')\n\nif cfg.with_extratags then\n    flex.set_unused_handling{delete_keys = {'tiger:*'}}\n    flex.add_for_extratags('name')\n    flex.add_for_extratags('address')\nelse\n    flex.ignore_keys('name')\n    flex.ignore_keys('address')\nend\n\nflex.set_entrance_filter('default')\n"
  },
  {
    "path": "lib-lua/themes/nominatim/topics/street.lua",
    "content": "local _, flex, cfg = ...\n\nflex.set_main_tags('admin')\nflex.modify_main_tags('street/' .. (cfg.street_theme or 'default'))\nflex.modify_main_tags{boundary = {postal_code = 'always'}}\n\nflex.set_name_tags('core')\n\nflex.set_address_tags('core')\nflex.set_postcode_fallback(false)\n\nflex.ignore_keys('metatags')\n\nif cfg.with_extratags then\n    flex.set_unused_handling{delete_keys = {'tiger:*'}}\n    flex.add_for_extratags('name')\n    flex.add_for_extratags('address')\nelse\n    flex.ignore_keys('name')\n    flex.ignore_keys('address')\nend\n"
  },
  {
    "path": "lib-sql/functions/associated_street_triggers.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\n-- Trigger functions for associated street relations.\n\n\n-- Invalidates house members of associatedStreet relations\n-- whenever the place_associated_street table is modified.\n-- osm2pgsql flex handles updates as DELETE-all + re-INSERT, so each\n-- row-level trigger call covers exactly one member.\nCREATE OR REPLACE FUNCTION invalidate_associated_street_members()\n  RETURNS TRIGGER\n  AS $$\nDECLARE\n  object RECORD;\nBEGIN\n  IF TG_OP = 'DELETE' THEN\n    object := OLD;\n  ELSE\n    object := NEW;\n  END IF;\n\n  IF object.member_role = 'house' THEN\n    {% for otype in ('N', 'W', 'R') %}\n    IF object.member_type = '{{ otype }}' THEN\n      UPDATE placex SET indexed_status = 2\n       WHERE osm_type = '{{ otype }}'\n         AND osm_id = object.member_id\n         AND indexed_status = 0;\n    END IF;\n    {% endfor %}\n  END IF;\n\n  RETURN object;\nEND;\n$$\nLANGUAGE plpgsql;\n"
  },
  {
    "path": "lib-sql/functions/importance.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\n-- Functions for interpreting wkipedia/wikidata tags and computing importance.\n\nDROP TYPE IF EXISTS wikipedia_article_match CASCADE;\nCREATE TYPE wikipedia_article_match as (\n  language TEXT,\n  title TEXT,\n  importance FLOAT\n);\n\nDROP TYPE IF EXISTS place_importance CASCADE;\nCREATE TYPE place_importance as (\n  importance FLOAT,\n  wikipedia TEXT\n);\n\n{% if 'wikimedia_importance' in db.tables %}\n\nCREATE OR REPLACE FUNCTION get_wikipedia_match(extratags HSTORE, country_code varchar(2))\n  RETURNS wikipedia_article_match\n  AS $$\nDECLARE\n  i INT;\n  wiki_article_title TEXT;\n  wiki_article_language TEXT;\n  result wikipedia_article_match;\n  entry RECORD;\nBEGIN\n  IF extratags ? 'wikipedia' and strpos(extratags->'wikipedia', ':') IN (3,4) THEN\n    wiki_article_language := lower(trim(split_part(extratags->'wikipedia', ':', 1)));\n    wiki_article_title := trim(substr(extratags->'wikipedia',\n                                      strpos(extratags->'wikipedia', ':') + 1));\n\n    FOR result IN\n      SELECT language, title, importance FROM wikimedia_importance\n        WHERE language = wiki_article_language\n              and title = replace(wiki_article_title, ' ', '_')\n    LOOP\n      RETURN result;\n    END LOOP;\n  END IF;\n\n  FOREACH wiki_article_language IN ARRAY ARRAY['ar','bg','ca','cs','da','de','en','es','eo','eu','fa','fr','ko','hi','hr','id','it','he','lt','hu','ms','nl','ja','no','pl','pt','kk','ro','ru','sk','sl','sr','fi','sv','tr','uk','vi','vo','war','zh']\n  LOOP\n    IF extratags ? ('wikipedia:' || wiki_article_language) THEN\n        wiki_article_title := extratags->('wikipedia:' || wiki_article_language);\n\n        FOR result IN\n          SELECT language, title, importance FROM wikimedia_importance\n            WHERE language = wiki_article_language\n                  and title = replace(wiki_article_title, ' ', '_')\n        LOOP\n          RETURN result;\n        END LOOP;\n    END IF;\n\n  END LOOP;\n\n  RETURN NULL;\nEND;\n$$\nLANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;\n\n{% else %}\n\n-- See: http://stackoverflow.com/questions/6410088/how-can-i-mimic-the-php-urldecode-function-in-postgresql\nCREATE OR REPLACE FUNCTION decode_url_part(p varchar)\n  RETURNS varchar\n  AS $$\nSELECT convert_from(CAST(E'\\\\x' || array_to_string(ARRAY(\n    SELECT CASE WHEN length(r.m[1]) = 1 THEN encode(convert_to(r.m[1], 'SQL_ASCII'), 'hex') ELSE substring(r.m[1] from 2 for 2) END\n    FROM regexp_matches($1, '%[0-9a-f][0-9a-f]|.', 'gi') AS r(m)\n), '') AS bytea), 'UTF8');\n$$ \nLANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION catch_decode_url_part(p varchar)\n  RETURNS varchar\n  AS $$\nDECLARE\nBEGIN\n  RETURN decode_url_part(p);\nEXCEPTION\n  WHEN others THEN return null;\nEND;\n$$\nLANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION get_wikipedia_match(extratags HSTORE, country_code varchar(2))\n  RETURNS wikipedia_article_match\n  AS $$\nDECLARE\n  langs TEXT[];\n  i INT;\n  wiki_article TEXT;\n  wiki_article_title TEXT;\n  wiki_article_language TEXT;\n  result wikipedia_article_match;\nBEGIN\n  langs := ARRAY['english','country','ar','bg','ca','cs','da','de','en','es','eo','eu','fa','fr','ko','hi','hr','id','it','he','lt','hu','ms','nl','ja','no','pl','pt','kk','ro','ru','sk','sl','sr','fi','sv','tr','uk','vi','vo','war','zh'];\n  i := 1;\n  WHILE langs[i] IS NOT NULL LOOP\n    wiki_article := extratags->(case when langs[i] in ('english','country') THEN 'wikipedia' ELSE 'wikipedia:'||langs[i] END);\n    IF wiki_article is not null THEN\n      wiki_article := replace(wiki_article,' ','_');\n      IF strpos(wiki_article, ':') IN (3,4) THEN\n        wiki_article_language := lower(trim(split_part(wiki_article, ':', 1)));\n        wiki_article_title := trim(substr(wiki_article, strpos(wiki_article, ':')+1));\n      ELSE\n        wiki_article_title := trim(wiki_article);\n        wiki_article_language := CASE WHEN langs[i] = 'english' THEN 'en' WHEN langs[i] = 'country' THEN get_country_language_code(country_code) ELSE langs[i] END;\n      END IF;\n\n      select wikipedia_article.language,wikipedia_article.title,wikipedia_article.importance\n        from wikipedia_article \n        where language = wiki_article_language and \n        (title = wiki_article_title OR title = catch_decode_url_part(wiki_article_title) OR title = replace(catch_decode_url_part(wiki_article_title),E'\\\\',''))\n      UNION ALL\n      select wikipedia_article.language,wikipedia_article.title,wikipedia_article.importance\n        from wikipedia_redirect join wikipedia_article on (wikipedia_redirect.language = wikipedia_article.language and wikipedia_redirect.to_title = wikipedia_article.title)\n        where wikipedia_redirect.language = wiki_article_language and \n        (from_title = wiki_article_title OR from_title = catch_decode_url_part(wiki_article_title) OR from_title = replace(catch_decode_url_part(wiki_article_title),E'\\\\',''))\n      order by importance desc limit 1 INTO result;\n\n      IF result.language is not null THEN\n        return result;\n      END IF;\n    END IF;\n    i := i + 1;\n  END LOOP;\n  RETURN NULL;\nEND;\n$$\nLANGUAGE plpgsql STABLE PARALLEL SAFE;\n\n{% endif %}\n\nCREATE OR REPLACE FUNCTION compute_importance(extratags HSTORE,\n                                              country_code varchar(2),\n                                              rank_search SMALLINT,\n                                              centroid GEOMETRY)\n  RETURNS place_importance\n  AS $$\nDECLARE\n  match RECORD;\n  result place_importance;\n  osm_views_exists BIGINT;\n  views BIGINT;\nBEGIN\n  -- add importance by wikipedia article if the place has one\n  FOR match IN\n    SELECT * FROM get_wikipedia_match(extratags, country_code)\n    WHERE language is not NULL\n  LOOP\n    result.importance := match.importance;\n    result.wikipedia := match.language || ':' || match.title;\n    RETURN result;\n  END LOOP;\n\n  -- Nothing? Then try with the wikidata tag.\n  IF extratags ? 'wikidata' THEN\n    FOR match IN\n{% if 'wikimedia_importance' in db.tables %}\n      SELECT * FROM wikimedia_importance\n        WHERE wikidata = extratags->'wikidata'\n        LIMIT 1\n{% else %}\n      SELECT * FROM wikipedia_article\n        WHERE wd_page_title = extratags->'wikidata'\n        ORDER BY language = 'en' DESC, langcount DESC LIMIT 1\n{% endif %}\n    LOOP\n      result.importance := match.importance;\n      result.wikipedia := match.language || ':' || match.title;\n      RETURN result;\n    END LOOP;\n  END IF;\n\n  -- Still nothing? Fall back to a default.\n  result.importance := 0.40001 - (rank_search::float / 75);\n\n{% if 'secondary_importance' in db.tables %}\n  FOR match IN\n    SELECT ST_Value(rast, centroid) as importance\n      FROM secondary_importance\n      WHERE ST_Intersects(ST_ConvexHull(rast), centroid) LIMIT 1\n  LOOP\n    IF match.importance is not NULL THEN\n      -- Secondary importance as tie breaker with 0.0001 weight.\n      result.importance := result.importance + match.importance::float / 655350000;\n    END IF;\n  END LOOP;\n{% endif %}\n\n  RETURN result;\nEND;\n$$\nLANGUAGE plpgsql PARALLEL SAFE;\n\n"
  },
  {
    "path": "lib-sql/functions/interpolation.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\n-- Functions for address interpolation objects in location_property_osmline.\n\nCREATE OR REPLACE FUNCTION place_interpolation_insert()\n  RETURNS TRIGGER\n  AS $$\nDECLARE\n  existing RECORD;\n  existingplacex BIGINT[];\n\nBEGIN\n  IF NOT (NEW.type in ('odd', 'even', 'all') OR NEW.type similar to '[1-9]') THEN\n    -- the new interpolation is illegal, simply remove existing entries\n    DELETE FROM location_property_osmline o WHERE o.osm_id = NEW.osm_id;\n    RETURN NULL;\n  END IF;\n\n  -- Remove the place from the list of places to be deleted\n  DELETE FROM place_interpolation_to_be_deleted pdel WHERE pdel.osm_id = NEW.osm_id;\n\n  SELECT * INTO existing FROM place_interpolation p WHERE p.osm_id = NEW.osm_id;\n\n  -- Get the existing entry from the interpolation table.\n  SELECT array_agg(place_id) INTO existingplacex\n    FROM location_property_osmline o WHERE o.osm_id = NEW.osm_id;\n\n  IF array_length(existingplacex, 1) is NULL THEN\n    INSERT INTO location_property_osmline (osm_id, type, address, linegeo)\n      VALUES (NEW.osm_id, NEW.type, NEW.address, NEW.geometry);\n  ELSE\n    -- Update the interpolation table:\n    --   The first entry gets the original data, all other entries\n    --   are removed and will be recreated on indexing.\n    --   (An interpolation can be split up, if it has more than 2 address nodes)\n    -- Update unconditionally here as the changes might be coming from the\n    -- nodes on the interpolation.\n    UPDATE location_property_osmline\n      SET type = NEW.type,\n          address = NEW.address,\n          linegeo = NEW.geometry,\n          startnumber = null,\n          indexed_status = 1\n      WHERE place_id = existingplacex[1];\n    IF array_length(existingplacex, 1) > 1 THEN\n      DELETE FROM location_property_osmline WHERE place_id = any(existingplacex[2:]);\n    END IF;\n  END IF;\n\n  -- need to invalidate nodes because they might copy address info\n  IF NEW.address is not NULL\n     AND (existing.osm_id is NULL\n          OR coalesce(existing.address, ''::hstore) != NEW.address)\n  THEN\n    UPDATE placex SET indexed_status = 2\n      WHERE osm_type = 'N' AND osm_id = ANY(NEW.nodes) AND indexed_status = 0;\n  END IF;\n\n  -- finally update/insert place_interpolation itself\n\n  IF existing.osm_id is not NULL THEN\n    -- Always updates as the nodes with the housenumber might be the reason\n    -- for the change.\n    UPDATE place_interpolation p\n      SET type = NEW.type,\n          address = NEW.address,\n          nodes = NEW.nodes,\n          geometry = NEW.geometry\n      WHERE p.osm_id = NEW.osm_id;\n\n    RETURN NULL;\n  END IF;\n\n  RETURN NEW;\nEND;\n$$ LANGUAGE plpgsql;\n\n\nCREATE OR REPLACE FUNCTION place_interpolation_delete()\n  RETURNS TRIGGER\n  AS $$\nDECLARE\n  deferred BOOLEAN;\nBEGIN\n  {% if debug %}RAISE WARNING 'Delete for interpolation %', OLD.osm_id;{% endif %}\n\n  INSERT INTO place_interpolation_to_be_deleted (osm_id) VALUES(OLD.osm_id);\n\n  RETURN NULL;\nEND;\n$$ LANGUAGE plpgsql;\n\n\nCREATE OR REPLACE FUNCTION get_interpolation_address(in_address HSTORE, wayid BIGINT)\nRETURNS HSTORE\n  AS $$\nDECLARE\n  location RECORD;\n  waynodes BIGINT[];\nBEGIN\n  IF in_address ? 'street' or in_address ? 'place' THEN\n    RETURN in_address;\n  END IF;\n\n  SELECT nodes INTO waynodes FROM place_interpolation WHERE osm_id = wayid;\n\n  IF array_upper(waynodes, 1) IS NOT NULL THEN\n    FOR location IN\n      SELECT placex.address, placex.osm_id FROM placex\n       WHERE osm_type = 'N' and osm_id = ANY(waynodes)\n             and placex.address is not null\n             and (placex.address ? 'street' or placex.address ? 'place')\n             and indexed_status < 100\n    LOOP\n      -- mark it as a derived address\n      RETURN location.address || coalesce(in_address, ''::hstore) || hstore('_inherited', '');\n    END LOOP;\n  END IF;\n\n  RETURN in_address;\nEND;\n$$\nLANGUAGE plpgsql STABLE PARALLEL SAFE;\n\n\n\n-- find the parent road of the cut road parts\nCREATE OR REPLACE FUNCTION get_interpolation_parent(token_info JSONB,\n                                                    partition SMALLINT,\n                                                    centroid GEOMETRY, geom GEOMETRY)\n  RETURNS BIGINT\n  AS $$\nDECLARE\n  parent_place_id BIGINT;\n  location RECORD;\nBEGIN\n  parent_place_id := find_parent_for_address(token_info, partition, centroid);\n\n  IF parent_place_id is null THEN\n    FOR location IN SELECT place_id FROM placex\n        WHERE ST_DWithin(geom, placex.geometry, 0.001)\n              and placex.rank_search = 26\n              and placex.osm_type = 'W' -- needed for index selection\n        ORDER BY CASE WHEN ST_GeometryType(geom) = 'ST_Line' THEN\n                  (ST_distance(placex.geometry, ST_LineInterpolatePoint(geom,0))+\n                  ST_distance(placex.geometry, ST_LineInterpolatePoint(geom,0.5))+\n                  ST_distance(placex.geometry, ST_LineInterpolatePoint(geom,1)))\n                 ELSE ST_distance(placex.geometry, geom) END\n              ASC\n        LIMIT 1\n    LOOP\n      parent_place_id := location.place_id;\n    END LOOP;\n  END IF;\n\n  RETURN parent_place_id;\nEND;\n$$\nLANGUAGE plpgsql STABLE PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION osmline_insert()\n  RETURNS TRIGGER\n  AS $$\nDECLARE\n  centroid GEOMETRY;\nBEGIN\n  NEW.place_id := nextval('seq_place');\n  NEW.indexed_date := now();\n\n  IF NEW.indexed_status IS NULL THEN\n    IF NOT(NEW.type in ('odd', 'even', 'all') OR NEW.type similar to '[1-9]') THEN\n        -- alphabetic interpolation is not supported\n        RETURN NULL;\n    END IF;\n\n    centroid := get_center_point(NEW.linegeo);\n    NEW.indexed_status := 1; --STATUS_NEW\n    NEW.country_code := lower(get_country_code(centroid));\n\n    NEW.partition := get_partition(NEW.country_code);\n    NEW.geometry_sector := geometry_sector(NEW.partition, centroid);\n  END IF;\n\n  RETURN NEW;\nEND;\n$$\nLANGUAGE plpgsql;\n\n\nCREATE OR REPLACE FUNCTION osmline_update()\n  RETURNS TRIGGER\n  AS $$\nDECLARE\n  waynodes BIGINT[];\n  prevnode RECORD;\n  nextnode RECORD;\n  startnumber INTEGER;\n  endnumber INTEGER;\n  newstart INTEGER;\n  newend INTEGER;\n  moddiff SMALLINT;\n  linegeo GEOMETRY;\n  splitpoint FLOAT;\n  sectiongeo GEOMETRY;\n  postcode TEXT;\n  stepmod SMALLINT;\nBEGIN\n  -- deferred delete\n  IF OLD.indexed_status = 100 THEN\n    delete from location_property_osmline where place_id = OLD.place_id;\n    RETURN NULL;\n  END IF;\n\n  IF NEW.indexed_status != 0 OR OLD.indexed_status = 0 THEN\n    RETURN NEW;\n  END IF;\n\n  NEW.parent_place_id := get_interpolation_parent(NEW.token_info, NEW.partition,\n                                                  get_center_point(NEW.linegeo),\n                                                  NEW.linegeo);\n\n  NEW.token_info := token_strip_info(NEW.token_info);\n  IF NEW.address ? '_inherited' THEN\n    NEW.address := NULL;\n  END IF;\n\n  -- If the line was newly inserted, split the line as necessary.\n  IF NEW.parent_place_id is not NULL AND NEW.startnumber is NULL THEN\n    IF NEW.type in ('odd', 'even') THEN\n      NEW.step := 2;\n      stepmod := CASE WHEN NEW.type = 'odd' THEN 1 ELSE 0 END;\n    ELSE\n      NEW.step := CASE WHEN NEW.type = 'all' THEN 1 ELSE (NEW.type)::SMALLINT END;\n      stepmod := NULL;\n    END IF;\n\n    SELECT nodes INTO waynodes FROM place_interpolation WHERE osm_id = NEW.osm_id;\n\n    IF array_upper(waynodes, 1) IS NULL THEN\n      RETURN NEW;\n    END IF;\n\n    linegeo := null;\n    SELECT null::integer as hnr INTO prevnode;\n\n    -- Go through all nodes on the interpolation line that have a housenumber.\n    FOR nextnode IN\n      SELECT DISTINCT ON (nodeidpos)\n          osm_id, address, geometry,\n          -- Take the postcode from the node only if it has a housenumber itself.\n          -- Note that there is a corner-case where the node has a wrongly\n          -- formatted postcode and therefore 'postcode' contains a derived\n          -- variant.\n          CASE WHEN address ? 'postcode' THEN placex.postcode ELSE NULL::text END as postcode,\n          (address->'housenumber')::integer as hnr\n        FROM placex, generate_series(1, array_upper(waynodes, 1)) nodeidpos\n        WHERE osm_type = 'N' and osm_id = waynodes[nodeidpos]::BIGINT\n              and address is not NULL and address ? 'housenumber'\n              and address->'housenumber' ~ '^[0-9]{1,6}$'\n              and ST_Distance(NEW.linegeo, geometry) < 0.0005\n        ORDER BY nodeidpos\n    LOOP\n      {% if debug %}RAISE WARNING 'processing point % (%)', nextnode.hnr, ST_AsText(nextnode.geometry);{% endif %}\n      IF linegeo is null THEN\n        linegeo := NEW.linegeo;\n      ELSE\n        splitpoint := ST_LineLocatePoint(linegeo, nextnode.geometry);\n        IF splitpoint = 0 THEN\n          -- Corner case where the splitpoint falls on the first point\n          -- and thus would not return a geometry. Skip that section.\n          sectiongeo := NULL;\n        ELSEIF splitpoint = 1 THEN\n          -- Point is at the end of the line.\n          sectiongeo := linegeo;\n          linegeo := NULL;\n        ELSE\n          -- Split the line.\n          sectiongeo := ST_LineSubstring(linegeo, 0, splitpoint);\n          linegeo := ST_LineSubstring(linegeo, splitpoint, 1);\n        END IF;\n      END IF;\n\n      IF prevnode.hnr is not null\n         -- Check if there are housenumbers to interpolate between the\n         -- regularly mapped housenumbers.\n         -- (Conveniently also fails if one of the house numbers is not a number.)\n         and abs(prevnode.hnr - nextnode.hnr) > NEW.step\n         -- If the interpolation geometry is broken or two nodes are at the\n         -- same place, then splitting might produce a point. Ignore that.\n         and ST_GeometryType(sectiongeo) = 'ST_LineString'\n      THEN\n        IF prevnode.hnr < nextnode.hnr THEN\n          startnumber := prevnode.hnr;\n          endnumber := nextnode.hnr;\n        ELSE\n          startnumber := nextnode.hnr;\n          endnumber := prevnode.hnr;\n          sectiongeo := ST_Reverse(sectiongeo);\n        END IF;\n\n        -- Adjust the interpolation, so that only inner housenumbers\n        -- are taken into account.\n        IF stepmod is null THEN\n          newstart := startnumber + NEW.step;\n        ELSE\n          newstart := startnumber + 1;\n          moddiff := newstart % NEW.step - stepmod;\n          IF moddiff < 0 THEN\n            newstart := newstart + (NEW.step + moddiff);\n          ELSE\n            newstart := newstart + moddiff;\n          END IF;\n        END IF;\n        newend := newstart + ((endnumber - 1 - newstart) / NEW.step) * NEW.step;\n\n        -- If newstart and newend are the same, then this returns a point.\n        sectiongeo := ST_LineSubstring(sectiongeo,\n                              (newstart - startnumber)::float / (endnumber - startnumber)::float,\n                              (newend - startnumber)::float / (endnumber - startnumber)::float);\n        startnumber := newstart;\n        endnumber := newend;\n\n        -- determine postcode\n        postcode := coalesce(prevnode.postcode, nextnode.postcode, postcode);\n        IF postcode is NULL and NEW.parent_place_id > 0 THEN\n            SELECT placex.postcode FROM placex\n              WHERE place_id = NEW.parent_place_id INTO postcode;\n        END IF;\n        IF postcode is NULL THEN\n            postcode := get_nearest_postcode(NEW.country_code, nextnode.geometry);\n        END IF;\n\n        -- Add the interpolation. If this is the first segment, just modify\n        -- the interpolation to be inserted, otherwise add an additional one\n        -- (marking it indexed already).\n        IF NEW.startnumber IS NULL THEN\n            NEW.startnumber := startnumber;\n            NEW.endnumber := endnumber;\n            NEW.linegeo := ST_ReducePrecision(sectiongeo, 0.0000001);\n            NEW.postcode := postcode;\n        ELSE\n          INSERT INTO location_property_osmline\n                 (linegeo, partition, osm_id, parent_place_id,\n                  startnumber, endnumber, step, type,\n                  address, postcode, country_code,\n                  geometry_sector, indexed_status)\n          VALUES (ST_ReducePrecision(sectiongeo, 0.0000001),\n                  NEW.partition, NEW.osm_id, NEW.parent_place_id,\n                  startnumber, endnumber, NEW.step, NEW.type,\n                  NEW.address, postcode,\n                  NEW.country_code, NEW.geometry_sector, 0);\n        END IF;\n      END IF;\n\n      -- early break if we are out of line string,\n      -- might happen when a line string loops back on itself\n      IF linegeo is null or ST_GeometryType(linegeo) != 'ST_LineString' THEN\n          RETURN NEW;\n      END IF;\n\n      prevnode := nextnode;\n    END LOOP;\n  END IF;\n\n  RETURN NEW;\nEND;\n$$\nLANGUAGE plpgsql;\n"
  },
  {
    "path": "lib-sql/functions/partition-functions.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\nDROP TYPE IF EXISTS nearfeaturecentr CASCADE;\nCREATE TYPE nearfeaturecentr AS (\n  place_id BIGINT,\n  keywords int[],\n  rank_address smallint,\n  rank_search smallint,\n  distance float,\n  isguess boolean,\n  postcode TEXT,\n  centroid GEOMETRY\n);\n\nCREATE OR REPLACE function getNearFeatures(in_partition INTEGER, feature GEOMETRY,\n                                           feature_centroid GEOMETRY,\n                                           maxrank INTEGER)\nRETURNS setof nearfeaturecentr AS $$\nDECLARE\n  r nearfeaturecentr%rowtype;\nBEGIN\n\n{% for partition in db.partitions %}\n  IF in_partition = {{ partition }} THEN\n    FOR r IN\n      SELECT place_id, keywords, rank_address, rank_search,\n             CASE WHEN isguess THEN ST_Distance(feature, centroid)\n                  ELSE min(ST_Distance(feature_centroid, geometry))\n                       -- tie breaker when distance is the same (i.e. way is on boundary)\n                       + 0.00001 * ST_Distance(feature, centroid)\n             END as distance,\n             isguess, postcode, centroid\n      FROM location_area_large_{{ partition }}\n      WHERE geometry && feature\n        AND CASE WHEN ST_Dimension(feature) = 0\n                     THEN _ST_Covers(geometry, feature)\n                 WHEN ST_Dimension(feature) = 2\n                     THEN ST_Relate(geometry, feature, 'T********')\n                 ELSE ST_NPoints(ST_Intersection(geometry, feature)) > 1\n            END\n        AND rank_address < maxrank\n            -- Postcodes currently still use rank_search to define for which\n            -- features they are relevant.\n        AND not (rank_address in (5, 11) and rank_search > maxrank)\n      GROUP BY place_id, keywords, rank_address, rank_search, isguess, postcode, centroid\n    LOOP\n      RETURN NEXT r;\n    END LOOP;\n    RETURN;\n  END IF;\n{% endfor %}\n\n  RAISE EXCEPTION 'Unknown partition %', in_partition;\nEND\n$$\nLANGUAGE plpgsql STABLE PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION get_address_place(in_partition SMALLINT, feature GEOMETRY,\n                                             from_rank SMALLINT, to_rank SMALLINT,\n                                             extent FLOAT, token_info JSONB, key TEXT)\n  RETURNS nearfeaturecentr\n  AS $$\nDECLARE\n  r nearfeaturecentr%rowtype;\nBEGIN\n{% for partition in db.partitions %}\n  IF in_partition = {{ partition }} THEN\n      SELECT place_id, keywords, rank_address, rank_search,\n             min(ST_Distance(feature, centroid)) as distance,\n             isguess, postcode, centroid INTO r\n        FROM location_area_large_{{ partition }}\n        WHERE geometry && ST_Expand(feature, extent)\n              AND rank_address between from_rank and to_rank\n              AND token_matches_address(token_info, key, keywords)\n        GROUP BY place_id, keywords, rank_address, rank_search, isguess, postcode, centroid\n        ORDER BY bool_or(ST_Intersects(geometry, feature)) DESC, distance LIMIT 1;\n      RETURN r;\n  END IF;\n{% endfor %}\n\n  RAISE EXCEPTION 'Unknown partition %', in_partition;\nEND;\n$$\nLANGUAGE plpgsql STABLE PARALLEL SAFE;\n\n\ncreate or replace function deleteLocationArea(in_partition INTEGER, in_place_id BIGINT, in_rank_search INTEGER) RETURNS BOOLEAN AS $$\nDECLARE\nBEGIN\n\n  IF in_rank_search <= 4 THEN\n    DELETE from location_area_country WHERE place_id = in_place_id;\n    RETURN TRUE;\n  END IF;\n\n{% for partition in db.partitions %}\n  IF in_partition = {{ partition }} THEN\n    DELETE from location_area_large_{{ partition }} WHERE place_id = in_place_id;\n    RETURN TRUE;\n  END IF;\n{% endfor %}\n\n  RAISE EXCEPTION 'Unknown partition %', in_partition;\n\n  RETURN FALSE;\nEND\n$$\nLANGUAGE plpgsql;\n\ncreate or replace function insertLocationAreaLarge(\n  in_partition INTEGER, in_place_id BIGINT, in_country_code VARCHAR(2), in_keywords INTEGER[],\n  in_rank_search INTEGER, in_rank_address INTEGER, in_estimate BOOLEAN, postcode TEXT,\n  in_centroid GEOMETRY, in_geometry GEOMETRY) RETURNS BOOLEAN AS $$\nDECLARE\nBEGIN\n  IF in_rank_address = 0 THEN\n    RETURN TRUE;\n  END IF;\n\n  IF in_rank_search <= 4 THEN\n    IF not in_estimate and in_country_code is not NULL THEN\n      INSERT INTO location_area_country (place_id, country_code, geometry)\n        (SELECT in_place_id, in_country_code, geom\n         FROM split_geometry(in_geometry) as geom);\n    END IF;\n    RETURN TRUE;\n  END IF;\n\n{% for partition in db.partitions %}\n  IF in_partition = {{ partition }} THEN\n    INSERT INTO location_area_large_{{ partition }} (partition, place_id, country_code, keywords, rank_search, rank_address, isguess, postcode, centroid, geometry)\n      (SELECT in_partition, in_place_id, in_country_code, in_keywords, in_rank_search, in_rank_address, in_estimate, postcode, in_centroid, geom\n       FROM split_geometry(in_geometry) as geom);\n    RETURN TRUE;\n  END IF;\n{% endfor %}\n\n  RAISE EXCEPTION 'Unknown partition %', in_partition;\n  RETURN FALSE;\nEND\n$$\nLANGUAGE plpgsql;\n\nCREATE OR REPLACE FUNCTION getNearestNamedRoadPlaceId(in_partition INTEGER,\n                                                      point GEOMETRY,\n                                                      token_info JSONB)\n  RETURNS BIGINT\n  AS $$\nDECLARE\n  parent BIGINT;\nBEGIN\n  IF not token_has_addr_street(token_info) THEN\n    RETURN NULL;\n  END IF;\n\n{% for partition in db.partitions %}\n  IF in_partition = {{ partition }} THEN\n    SELECT place_id FROM search_name_{{ partition }}\n      INTO parent\n      WHERE token_matches_street(token_info, name_vector)\n            AND centroid && ST_Expand(point, 0.015)\n            AND address_rank between 26 and 27\n      ORDER BY ST_Distance(centroid, point) ASC limit 1;\n    RETURN parent;\n  END IF;\n{% endfor %}\n\n  RAISE EXCEPTION 'Unknown partition %', in_partition;\nEND\n$$\nLANGUAGE plpgsql STABLE PARALLEL SAFE;\n\nCREATE OR REPLACE FUNCTION getNearestNamedPlacePlaceId(in_partition INTEGER,\n                                                       point GEOMETRY,\n                                                       token_info JSONB)\n  RETURNS BIGINT\n  AS $$\nDECLARE\n  parent BIGINT;\nBEGIN\n  IF not token_has_addr_place(token_info) THEN\n    RETURN NULL;\n  END IF;\n\n{% for partition in db.partitions %}\n  IF in_partition = {{ partition }} THEN\n    SELECT place_id\n      INTO parent\n      FROM search_name_{{ partition }}\n      WHERE token_matches_place(token_info, name_vector)\n            AND centroid && ST_Expand(point, 0.04)\n            AND address_rank between 16 and 25\n      ORDER BY ST_Distance(centroid, point) ASC limit 1;\n    RETURN parent;\n  END IF;\n{% endfor %}\n\n  RAISE EXCEPTION 'Unknown partition %', in_partition;\nEND\n$$\nLANGUAGE plpgsql STABLE PARALLEL SAFE;\n\ncreate or replace function insertSearchName(\n  in_partition INTEGER, in_place_id BIGINT, in_name_vector INTEGER[],\n  in_rank_search INTEGER, in_rank_address INTEGER, in_geometry GEOMETRY)\nRETURNS BOOLEAN AS $$\nDECLARE\nBEGIN\n{% for partition in db.partitions %}\n  IF in_partition = {{ partition }} THEN\n    IF in_rank_address > 0 THEN\n      INSERT INTO search_name_{{ partition }} (place_id, address_rank, name_vector, centroid)\n        values (in_place_id, in_rank_address, in_name_vector, in_geometry);\n    END IF;\n    RETURN TRUE;\n  END IF;\n{% endfor %}\n\n  RAISE EXCEPTION 'Unknown partition %', in_partition;\n  RETURN FALSE;\nEND\n$$\nLANGUAGE plpgsql;\n\ncreate or replace function deleteSearchName(in_partition INTEGER, in_place_id BIGINT) RETURNS BOOLEAN AS $$\nDECLARE\nBEGIN\n{% for partition in db.partitions %}\n  IF in_partition = {{ partition }} THEN\n    DELETE from search_name_{{ partition }} WHERE place_id = in_place_id;\n    RETURN TRUE;\n  END IF;\n{% endfor %}\n\n  RAISE EXCEPTION 'Unknown partition %', in_partition;\n\n  RETURN FALSE;\nEND\n$$\nLANGUAGE plpgsql;\n\ncreate or replace function insertLocationRoad(\n  in_partition INTEGER, in_place_id BIGINT, in_country_code VARCHAR(2), in_geometry GEOMETRY) RETURNS BOOLEAN AS $$\nDECLARE\nBEGIN\n\n{% for partition in db.partitions %}\n  IF in_partition = {{ partition }} THEN\n    INSERT INTO location_road_{{ partition }} (partition, place_id, country_code, geometry)\n      values (in_partition, in_place_id, in_country_code, in_geometry);\n    RETURN TRUE;\n  END IF;\n{% endfor %}\n\n  RAISE EXCEPTION 'Unknown partition %', in_partition;\n  RETURN FALSE;\nEND\n$$\nLANGUAGE plpgsql;\n\ncreate or replace function deleteRoad(in_partition INTEGER, in_place_id BIGINT) RETURNS BOOLEAN AS $$\nDECLARE\nBEGIN\n\n{% for partition in db.partitions %}\n  IF in_partition = {{ partition }} THEN\n    DELETE FROM location_road_{{ partition }} where place_id = in_place_id;\n    RETURN TRUE;\n  END IF;\n{% endfor %}\n\n  RAISE EXCEPTION 'Unknown partition %', in_partition;\n\n  RETURN FALSE;\nEND\n$$\nLANGUAGE plpgsql;\n\nCREATE OR REPLACE FUNCTION getNearestRoadPlaceId(in_partition INTEGER, point GEOMETRY)\n  RETURNS BIGINT\n  AS $$\nDECLARE\n  r RECORD;\n  search_diameter FLOAT;\nBEGIN\n\n{% for partition in db.partitions %}\n  IF in_partition = {{ partition }} THEN\n    search_diameter := 0.00005;\n    WHILE search_diameter < 0.1 LOOP\n      FOR r IN\n        SELECT place_id FROM location_road_{{ partition }}\n          WHERE ST_DWithin(geometry, point, search_diameter)\n          ORDER BY ST_Distance(geometry, point) ASC limit 1\n      LOOP\n        RETURN r.place_id;\n      END LOOP;\n      search_diameter := search_diameter * 2;\n    END LOOP;\n    RETURN NULL;\n  END IF;\n{% endfor %}\n\n  RAISE EXCEPTION 'Unknown partition %', in_partition;\nEND\n$$\nLANGUAGE plpgsql STABLE PARALLEL SAFE;\n\nCREATE OR REPLACE FUNCTION getNearestParallelRoadFeature(in_partition INTEGER,\n                                                         line GEOMETRY)\n  RETURNS BIGINT\n  AS $$\nDECLARE\n  r RECORD;\n  search_diameter FLOAT;\n  p1 GEOMETRY;\n  p2 GEOMETRY;\n  p3 GEOMETRY;\nBEGIN\n\n  IF ST_GeometryType(line) not in ('ST_LineString') THEN\n    RETURN NULL;\n  END IF;\n\n  p1 := ST_LineInterpolatePoint(line,0);\n  p2 := ST_LineInterpolatePoint(line,0.5);\n  p3 := ST_LineInterpolatePoint(line,1);\n\n{% for partition in db.partitions %}\n  IF in_partition = {{ partition }} THEN\n    search_diameter := 0.0005;\n    WHILE search_diameter < 0.01 LOOP\n      FOR r IN\n        SELECT place_id FROM location_road_{{ partition }}\n          WHERE ST_DWithin(line, geometry, search_diameter)\n          ORDER BY (ST_distance(geometry, p1)+\n                    ST_distance(geometry, p2)+\n                    ST_distance(geometry, p3)) ASC limit 1\n      LOOP\n        RETURN r.place_id;\n      END LOOP;\n      search_diameter := search_diameter * 2;\n    END LOOP;\n    RETURN NULL;\n  END IF;\n{% endfor %}\n\n  RAISE EXCEPTION 'Unknown partition %', in_partition;\nEND\n$$\nLANGUAGE plpgsql STABLE PARALLEL SAFE;\n"
  },
  {
    "path": "lib-sql/functions/place_triggers.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\nCREATE OR REPLACE FUNCTION place_insert()\n  RETURNS TRIGGER\n  AS $$\nDECLARE\n  existing RECORD;\n  existingplacex RECORD;\n  newplacex RECORD;\n  is_area BOOLEAN;\n  existing_is_area BOOLEAN;\n  area_size FLOAT;\n  address_rank SMALLINT;\n  search_rank SMALLINT;\nBEGIN\n  {% if debug %}\n    RAISE WARNING 'place_insert: % % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type,st_area(NEW.geometry);\n  {% endif %}\n\n  -- Filter tuples with bad geometries.\n  IF ST_IsEmpty(NEW.geometry) OR NOT ST_IsValid(NEW.geometry) THEN\n    INSERT INTO import_polygon_error (osm_type, osm_id, class, type, name,\n                                      country_code, updated, errormessage,\n                                      prevgeometry, newgeometry)\n      VALUES (NEW.osm_type, NEW.osm_id, NEW.class, NEW.type, NEW.name,\n              NEW.address->'country', now(), ST_IsValidReason(NEW.geometry),\n              null, NEW.geometry);\n    {% if debug %}\n      RAISE WARNING 'Invalid Geometry: % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type;\n    {% endif %}\n    RETURN null;\n  END IF;\n\n  -- Remove the place from the list of places to be deleted\n  DELETE FROM place_to_be_deleted pdel\n    WHERE pdel.osm_type = NEW.osm_type and pdel.osm_id = NEW.osm_id\n          and pdel.class = NEW.class and pdel.type = NEW.type;\n\n  -- Have we already done this place?\n  SELECT * INTO existing\n    FROM place\n    WHERE osm_type = NEW.osm_type and osm_id = NEW.osm_id\n          and class = NEW.class and type = NEW.type;\n\n  {% if debug %}RAISE WARNING 'Existing: %',existing.osm_id;{% endif %}\n\n  IF existing.osm_type IS NULL THEN\n    DELETE FROM place where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class;\n  END IF;\n\n  -- Remove any old logged data.\n  DELETE from import_polygon_error where osm_type = NEW.osm_type and osm_id = NEW.osm_id;\n  DELETE from import_polygon_delete where osm_type = NEW.osm_type and osm_id = NEW.osm_id;\n\n  is_area := ST_GeometryType(NEW.geometry) in ('ST_Polygon','ST_MultiPolygon');\n  IF is_area THEN\n    area_size = ST_Area(NEW.geometry);\n  END IF;\n\n  -- When an area is changed from large to small: log and discard change\n  IF existing.geometry is not null AND ST_IsValid(existing.geometry)\n    AND ST_Area(existing.geometry) > 0.02\n    AND is_area AND area_size < ST_Area(existing.geometry) * 0.5\n  THEN\n    INSERT INTO import_polygon_error (osm_type, osm_id, class, type, name,\n                                      country_code, updated, errormessage,\n                                      prevgeometry, newgeometry)\n      VALUES (NEW.osm_type, NEW.osm_id, NEW.class, NEW.type, NEW.name,\n              NEW.address->'country', now(),\n              'Area reduced from '||st_area(existing.geometry)||' to '||st_area(NEW.geometry),\n              existing.geometry, NEW.geometry);\n\n    RETURN null;\n  END IF;\n\n  -- Get the existing placex entry.\n  SELECT * INTO existingplacex\n    FROM placex\n    WHERE osm_type = NEW.osm_type and osm_id = NEW.osm_id\n          and class = NEW.class and type = NEW.type;\n\n  {% if debug %}RAISE WARNING 'Existing PlaceX: %',existingplacex.place_id;{% endif %}\n\n  IF existingplacex.osm_type IS NULL THEN\n    -- Inserting a new placex.\n    FOR newplacex IN\n      INSERT INTO placex (osm_type, osm_id, class, type, name,\n                        admin_level, address, extratags, geometry)\n      VALUES (NEW.osm_type, NEW.osm_id, NEW.class, NEW.type, NEW.name,\n              NEW.admin_level, NEW.address, NEW.extratags, NEW.geometry)\n      RETURNING rank_address\n    LOOP\n      PERFORM update_invalidate_for_new_place(newplacex.rank_address,\n                                              is_area, area_size,\n                                              NEW.osm_Type, NEW.geometry);\n    END LOOP;\n  ELSE\n    -- Modify an existing placex.\n    IF is_rankable_place(NEW.osm_type, NEW.class, NEW.admin_level,\n                         NEW.name, NEW.extratags, is_area)\n    THEN\n      -- Recompute the ranks to look out for changes.\n      -- We use the old country assignment here which is good enough for the\n      -- purpose.\n      SELECT * INTO search_rank, address_rank\n        FROM compute_place_rank(existingplacex.country_code,\n                                CASE WHEN is_area THEN 'A' ELSE NEW.osm_type END,\n                                NEW.class, NEW.type, NEW.admin_level,\n                                (NEW.extratags->'capital') = 'yes',\n                                NEW.address->'postcode');\n\n      existing_is_area := ST_GeometryType(existingplacex.geometry) in ('ST_Polygon','ST_MultiPolygon');\n\n      IF (address_rank BETWEEN 4 and 27\n          AND (existingplacex.rank_address <= 0 OR existingplacex.rank_address > 27))\n         OR (not existing_is_area and is_area)\n      THEN\n        -- object newly relevant for addressing, invalidate new version\n        PERFORM update_invalidate_for_new_place(address_rank,\n                                                is_area, area_size,\n                                                NEW.osm_type, NEW.geometry);\n      ELSEIF (existingplacex.rank_address BETWEEN 4 and 27\n              AND (address_rank <= 0 OR address_rank > 27))\n             OR (existing_is_area and not is_area)\n      THEN\n        -- object no longer relevant for addressing, invalidate old version\n        PERFORM update_invalidate_for_new_place(existingplacex.rank_address,\n                                                existing_is_area, null,\n                                                existingplacex.osm_type,\n                                                existingplacex.geometry);\n      ELSEIF address_rank BETWEEN 4 and 27 THEN\n        IF coalesce(existing.name, ''::hstore) != coalesce(NEW.name, ''::hstore)\n           OR existing.admin_level != NEW.admin_level\n        THEN\n          -- Name changes may have an effect on searchable objects and parenting\n          -- for new and old areas.\n          PERFORM update_invalidate_for_new_place(address_rank, is_area, null,\n                                                  NEW.osm_type,\n                                                  CASE WHEN is_area and existing_is_area\n                                                    THEN ST_Union(NEW.geometry, existingplacex.geometry)\n                                                    ELSE ST_Collect(NEW.geometry, existingplacex.geometry)\n                                                  END);\n        ELSEIF existingplacex.geometry::text != NEW.geometry::text THEN\n            -- Geometry change, just invalidate the changed areas.\n            -- Changes of other geometry types are currently ignored.\n          IF is_area and existing_is_area THEN\n            PERFORM update_invalidate_for_new_place(address_rank, true, null,\n                                                    NEW.osm_type,\n                                                    ST_SymDifference(existingplacex.geometry,\n                                                                     NEW.geometry));\n          END IF;\n        END IF;\n      END IF;\n\n      -- Invalidate linked places: they potentially get a new name and addresses.\n      IF existingplacex.linked_place_id is not NULL THEN\n        UPDATE placex x\n          SET name = p.name,\n              extratags = p.extratags,\n              indexed_status = 2\n          FROM place p\n          WHERE x.place_id = existingplacex.linked_place_id\n                and x.indexed_status = 0\n                and x.osm_type = p.osm_type\n                and x.osm_id = p.osm_id\n                and x.class = p.class;\n      END IF;\n\n      -- update placex in place\n      UPDATE placex\n        SET name = NEW.name,\n            address = NEW.address,\n            parent_place_id = null,\n            extratags = NEW.extratags,\n            admin_level = NEW.admin_level,\n            rank_address = address_rank,\n            rank_search = search_rank,\n            indexed_status = 2,\n            geometry = CASE WHEN address_rank = 0\n                            THEN simplify_large_polygons(NEW.geometry)\n                            ELSE NEW.geometry END\n        WHERE place_id = existingplacex.place_id;\n    ELSE\n      -- New place is not really valid, remove the placex entry\n      UPDATE placex SET indexed_status = 100 WHERE place_id = existingplacex.place_id;\n    END IF;\n\n    -- When an existing way is updated, recalculate entrances\n    IF existingplacex.osm_type = 'W' and (existingplacex.rank_search > 27 or existingplacex.class IN ('landuse', 'leisure')) THEN\n      PERFORM place_update_entrances(existingplacex.place_id, existingplacex.osm_id);\n    END IF;\n  END IF;\n\n  -- Finally update place itself.\n  IF existing.osm_type is not NULL THEN\n    -- If there is already an entry in place, just update that, if necessary.\n    IF coalesce(existing.name, ''::hstore) != coalesce(NEW.name, ''::hstore)\n       or coalesce(existing.address, ''::hstore) != coalesce(NEW.address, ''::hstore)\n       or coalesce(existing.extratags, ''::hstore) != coalesce(NEW.extratags, ''::hstore)\n       or coalesce(existing.admin_level, 15) != coalesce(NEW.admin_level, 15)\n       or existing.geometry::text != NEW.geometry::text\n    THEN\n      UPDATE place\n        SET name = NEW.name,\n            address = NEW.address,\n            extratags = NEW.extratags,\n            admin_level = NEW.admin_level,\n            geometry = NEW.geometry\n        WHERE osm_type = NEW.osm_type and osm_id = NEW.osm_id\n              and class = NEW.class and type = NEW.type;\n    END IF;\n\n    RETURN NULL;\n  END IF;\n\n  RETURN NEW;\nEND;\n$$ LANGUAGE plpgsql;\n\nCREATE OR REPLACE FUNCTION place_delete()\n  RETURNS TRIGGER\n  AS $$\nDECLARE\n  deferred BOOLEAN;\nBEGIN\n  {% if debug %}RAISE WARNING 'Delete for % % %/%', OLD.osm_type, OLD.osm_id, OLD.class, OLD.type;{% endif %}\n\n  deferred := ST_IsValid(OLD.geometry) and ST_Area(OLD.geometry) > 2;\n  IF deferred THEN\n    SELECT bool_or(not (rank_address = 0 or rank_address > 25)) INTO deferred\n      FROM placex\n      WHERE osm_type = OLD.osm_type and osm_id = OLD.osm_id\n            and class = OLD.class and type = OLD.type;\n  END IF;\n\n  INSERT INTO place_to_be_deleted (osm_type, osm_id, class, type, deferred)\n    VALUES(OLD.osm_type, OLD.osm_id, OLD.class, OLD.type, COALESCE(deferred, FALSE));\n\n  RETURN NULL;\nEND;\n$$ LANGUAGE plpgsql;\n"
  },
  {
    "path": "lib-sql/functions/placex_triggers.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\n-- Trigger functions for the placex table.\n\n-- Information returned by update preparation.\nDROP TYPE IF EXISTS prepare_update_info CASCADE;\nCREATE TYPE prepare_update_info AS (\n  name HSTORE,\n  address HSTORE,\n  rank_address SMALLINT,\n  country_code TEXT,\n  class TEXT,\n  type TEXT,\n  linked_place_id BIGINT,\n  centroid_x float,\n  centroid_y float\n);\n\n-- Retrieve the data needed by the indexer for updating the place.\nCREATE OR REPLACE FUNCTION placex_indexing_prepare(p placex)\n  RETURNS prepare_update_info\n  AS $$\nDECLARE\n  location RECORD;\n  result prepare_update_info;\n  extra_names HSTORE;\n  default_language VARCHAR(10);\nBEGIN\n  IF not p.address ? '_inherited' THEN\n    result.address := p.address;\n  END IF;\n\n  -- For POI nodes, check if the address should be derived from a surrounding\n  -- building.\n  IF p.rank_search = 30 AND p.osm_type = 'N' THEN\n    IF p.address is null THEN\n        -- The additional && condition works around the misguided query\n        -- planner of postgis 3.0.\n        SELECT placex.address || hstore('_inherited', '') INTO result.address\n          FROM placex\n         WHERE ST_Covers(geometry, p.centroid)\n               and geometry && p.centroid\n               and placex.address is not null\n               and (placex.address ? 'housenumber' or placex.address ? 'street' or placex.address ? 'place')\n               and rank_search = 30 AND ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon')\n         LIMIT 1;\n    ELSE\n      -- See if we can inherit additional address tags from an interpolation.\n      -- These will become permanent.\n      FOR location IN\n        SELECT address FROM place_interpolation\n          WHERE ARRAY[p.osm_id] && place_interpolation.nodes AND address is not NULL\n      LOOP\n        result.address := location.address || result.address;\n      END LOOP;\n    END IF;\n  END IF;\n\n  -- remove internal and derived names\n  result.address := result.address - '_unlisted_place'::TEXT;\n  SELECT hstore(array_agg(key), array_agg(value)) INTO result.name\n    FROM each(p.name) WHERE key not like '\\_%';\n\n  result.class := p.class;\n  result.type := p.type;\n  result.country_code := p.country_code;\n  result.rank_address := p.rank_address;\n  result.centroid_x := ST_X(p.centroid);\n  result.centroid_y := ST_Y(p.centroid);\n\n  -- Names of linked places need to be merged in, so search for a linkable\n  -- place already here.\n  SELECT * INTO location FROM find_linked_place(p);\n\n  IF location.place_id is not NULL THEN\n    result.linked_place_id := location.place_id;\n\n    IF location.name is not NULL THEN\n      {% if debug %}RAISE WARNING 'Names original: %, location: %', result.name, location.name;{% endif %}\n\n      -- Add the linked-place (e.g. city) name as a searchable placename in the default language (if any)\n      default_language := get_country_language_code(location.country_code);\n      IF default_language is not NULL AND location.name ? 'name' AND NOT location.name ? ('name:' || default_language) THEN\n        location.name := location.name || hstore('name:' || default_language, location.name->'name');\n      END IF;\n\n      -- Add all names from the place nodes that deviate from the name\n      -- in the relation with the prefix '_place_'. Deviation means that\n      -- either the value is different or a given key is missing completely\n      IF result.name is null THEN\n        SELECT hstore(array_agg('_place_' || key), array_agg(value))\n          INTO result.name\n          FROM each(location.name);\n      ELSE\n        SELECT hstore(array_agg('_place_' || key), array_agg(value)) INTO extra_names\n          FROM each(location.name - result.name);\n        {% if debug %}RAISE WARNING 'Extra names: %', extra_names;{% endif %}\n\n        IF extra_names is not null THEN\n            result.name := result.name || extra_names;\n        END IF;\n      END IF;\n\n      {% if debug %}RAISE WARNING 'Final names: %', result.name;{% endif %}\n    END IF;\n  END IF;\n\n  RETURN result;\nEND;\n$$\nLANGUAGE plpgsql STABLE PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION find_associated_street(poi_osm_type CHAR(1),\n                                                  poi_osm_id BIGINT,\n                                                  bbox GEOMETRY)\n  RETURNS BIGINT\n  AS $$\nDECLARE\n  parent RECORD;\n  result BIGINT;\n  distance FLOAT;\n  new_distance FLOAT;\n  waygeom GEOMETRY;\nBEGIN\n  -- Use UNION of two queries (one for Ways, one for Relations) to allow\n  -- PostgreSQL to use partial indexes on placex.osm_type.\n  FOR parent IN\n    SELECT p.place_id, p.geometry\n      FROM place_associated_street h\n      JOIN place_associated_street s\n           ON h.relation_id = s.relation_id AND s.member_role = 'street'\n      JOIN placex p\n           ON p.osm_type = 'W'\n              AND p.osm_id = s.member_id\n              AND p.name IS NOT NULL\n              AND p.rank_search BETWEEN 26 AND 27\n     WHERE h.member_type = poi_osm_type\n       AND h.member_id = poi_osm_id\n       AND h.member_role = 'house'\n       AND s.member_type = 'W'\n    UNION ALL\n    SELECT p.place_id, p.geometry\n      FROM place_associated_street h\n      JOIN place_associated_street s\n           ON h.relation_id = s.relation_id AND s.member_role = 'street'\n      JOIN placex p\n           ON p.osm_type = 'R'\n              AND p.osm_id = s.member_id\n              AND p.name IS NOT NULL\n              AND p.rank_search BETWEEN 26 AND 27\n     WHERE h.member_type = poi_osm_type\n       AND h.member_id = poi_osm_id\n       AND h.member_role = 'house'\n       AND s.member_type = 'R'\n  LOOP\n    -- Find the closest 'street' member.\n    -- Avoid distance computation for the frequent case where there is\n    -- only one street member.\n    IF waygeom IS NULL THEN\n      result := parent.place_id;\n      waygeom := parent.geometry;\n    ELSE\n      distance := coalesce(distance, ST_Distance(waygeom, bbox));\n      new_distance := ST_Distance(parent.geometry, bbox);\n      IF new_distance < distance THEN\n        distance := new_distance;\n        result := parent.place_id;\n        waygeom := parent.geometry;\n      END IF;\n    END IF;\n  END LOOP;\n\n  RETURN result;\nEND;\n$$\nLANGUAGE plpgsql STABLE PARALLEL SAFE;\n\n\n-- Find the parent road of a POI.\n--\n-- \\returns Place ID of parent object or NULL if none\n--\n-- Copy data from linked items (POIs on ways, addr:street links, relations).\n--\nCREATE OR REPLACE FUNCTION find_parent_for_poi(poi_osm_type CHAR(1),\n                                               poi_osm_id BIGINT,\n                                               poi_partition SMALLINT,\n                                               bbox GEOMETRY,\n                                               token_info JSONB,\n                                               is_place_addr BOOLEAN)\n  RETURNS BIGINT\n  AS $$\nDECLARE\n  parent_place_id BIGINT DEFAULT NULL;\n  location RECORD;\nBEGIN\n  {% if debug %}RAISE WARNING 'finding street for % %', poi_osm_type, poi_osm_id;{% endif %}\n\n  -- Is this object part of an associatedStreet relation?\n  parent_place_id := find_associated_street(poi_osm_type, poi_osm_id, bbox);\n\n  IF parent_place_id is null THEN\n    parent_place_id := find_parent_for_address(token_info, poi_partition, bbox);\n  END IF;\n\n  IF parent_place_id is null and poi_osm_type = 'N' THEN\n    FOR location IN\n      SELECT p.place_id, p.osm_id, p.rank_search, p.address,\n             coalesce(p.centroid, ST_Centroid(p.geometry)) as centroid\n        FROM placex p, planet_osm_ways w\n       WHERE p.osm_type = 'W' and p.rank_search >= 26\n             and p.geometry && bbox\n             and w.id = p.osm_id and poi_osm_id = any(w.nodes)\n    LOOP\n      {% if debug %}RAISE WARNING 'Node is part of way % ', location.osm_id;{% endif %}\n\n      -- Way IS a road then we are on it - that must be our road\n      IF location.rank_search < 28 THEN\n        {% if debug %}RAISE WARNING 'node in way that is a street %',location;{% endif %}\n        RETURN location.place_id;\n      END IF;\n\n      parent_place_id := find_associated_street('W', location.osm_id, bbox);\n    END LOOP;\n  END IF;\n\n  IF parent_place_id is NULL THEN\n    IF is_place_addr THEN\n      -- The address is attached to a place we don't know.\n      -- Instead simply use the containing area with the largest rank.\n      FOR location IN\n        SELECT place_id FROM placex\n         WHERE bbox && geometry AND _ST_Covers(geometry, ST_Centroid(bbox))\n               AND rank_address between 5 and 25\n               AND ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon')\n         ORDER BY rank_address desc\n      LOOP\n        RETURN location.place_id;\n      END LOOP;\n    ELSEIF ST_Area(bbox) < 0.005 THEN\n      -- for smaller features get the nearest road\n      SELECT getNearestRoadPlaceId(poi_partition, bbox) INTO parent_place_id;\n      {% if debug %}RAISE WARNING 'Checked for nearest way (%)', parent_place_id;{% endif %}\n    ELSE\n      -- for larger features simply find the area with the largest rank that\n      -- contains the bbox, only use addressable features\n      FOR location IN\n        SELECT place_id FROM placex\n         WHERE bbox && geometry AND _ST_Covers(geometry, ST_Centroid(bbox))\n               AND rank_address between 5 and 25\n               AND ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon')\n        ORDER BY rank_address desc\n      LOOP\n        RETURN location.place_id;\n      END LOOP;\n    END IF;\n  END IF;\n\n  RETURN parent_place_id;\nEND;\n$$\nLANGUAGE plpgsql STABLE PARALLEL SAFE;\n\n-- Try to find a linked place for the given object.\nCREATE OR REPLACE FUNCTION find_linked_place(bnd placex)\n  RETURNS placex\n  AS $$\nDECLARE\n{% if db.middle_db_format == '1' %}\n  relation_members TEXT[];\n{% else %}\n  relation_members JSONB;\n{% endif %}\n  rel_member RECORD;\n  linked_placex placex%ROWTYPE;\n  bnd_name TEXT;\nBEGIN\n  IF bnd.rank_search >= 26 or bnd.rank_address = 0\n     or ST_GeometryType(bnd.geometry) NOT IN ('ST_Polygon','ST_MultiPolygon')\n  THEN\n    RETURN NULL;\n  END IF;\n\n  IF bnd.osm_type = 'R' THEN\n    -- see if we have any special relation members\n    SELECT members FROM planet_osm_rels WHERE id = bnd.osm_id INTO relation_members;\n    {% if debug %}RAISE WARNING 'Got relation members';{% endif %}\n\n    -- Search for relation members with role 'lable'.\n    IF relation_members IS NOT NULL THEN\n      FOR rel_member IN\n        SELECT get_rel_node_members(relation_members, ARRAY['label']) as member\n      LOOP\n        {% if debug %}RAISE WARNING 'Found label member %', rel_member.member;{% endif %}\n\n        FOR linked_placex IN\n          SELECT * from placex\n          WHERE osm_type = 'N' and osm_id = rel_member.member\n            and class = 'place'\n        LOOP\n          {% if debug %}RAISE WARNING 'Linked label member';{% endif %}\n          RETURN linked_placex;\n        END LOOP;\n\n      END LOOP;\n    END IF;\n  END IF;\n\n  IF bnd.name ? 'name' THEN\n    bnd_name := lower(bnd.name->'name');\n    IF bnd_name = '' THEN\n      bnd_name := NULL;\n    END IF;\n  END IF;\n\n  IF bnd.extratags ? 'wikidata' THEN\n    FOR linked_placex IN\n      SELECT * FROM placex\n      WHERE placex.class = 'place' AND placex.osm_type = 'N'\n        AND placex.extratags ? 'wikidata' -- needed to select right index\n        AND placex.extratags->'wikidata' = bnd.extratags->'wikidata'\n        AND (placex.linked_place_id is null or placex.linked_place_id = bnd.place_id)\n        AND placex.rank_search < 26\n        AND _st_covers(bnd.geometry, placex.geometry)\n      ORDER BY lower(name->'name') = bnd_name desc\n    LOOP\n      {% if debug %}RAISE WARNING 'Found wikidata-matching place node %', linked_placex.osm_id;{% endif %}\n      RETURN linked_placex;\n    END LOOP;\n  END IF;\n\n  -- If extratags has a place tag, look for linked nodes by their place type.\n  -- Area and node still have to have the same name.\n  IF bnd.extratags ? 'place' and bnd_name is not null\n  THEN\n    FOR linked_placex IN\n      SELECT * FROM placex\n      WHERE (position(lower(name->'name') in bnd_name) > 0\n             OR position(bnd_name in lower(name->'name')) > 0)\n        AND placex.class = 'place' AND placex.type = bnd.extratags->'place'\n        AND placex.osm_type = 'N'\n        AND (placex.linked_place_id is null or placex.linked_place_id = bnd.place_id)\n        AND placex.rank_search < 26 -- needed to select the right index\n        AND (NOT placex.extratags ? 'wikidata' OR NOT bnd.extratags ? 'wikidata'\n             OR placex.extratags->'wikidata' = bnd.extratags->'wikidata')\n        AND ST_Covers(bnd.geometry, placex.geometry)\n    LOOP\n      {% if debug %}RAISE WARNING 'Found type-matching place node %', linked_placex.osm_id;{% endif %}\n      RETURN linked_placex;\n    END LOOP;\n  END IF;\n\n  -- Name searches can be done for ways as well as relations\n  IF bnd_name is not null THEN\n    {% if debug %}RAISE WARNING 'Looking for nodes with matching names';{% endif %}\n    FOR linked_placex IN\n      SELECT placex.* from placex\n      WHERE lower(name->'name') = bnd_name\n        AND ((bnd.rank_address > 0\n              and bnd.rank_address = (compute_place_rank(placex.country_code,\n                                                         'N', placex.class,\n                                                         placex.type, 15::SMALLINT,\n                                                         false, placex.postcode)).address_rank)\n             OR (bnd.rank_address = 0 and placex.rank_search = bnd.rank_search))\n        AND placex.osm_type = 'N'\n        AND placex.class = 'place'\n        AND (placex.linked_place_id is null or placex.linked_place_id = bnd.place_id)\n        AND placex.rank_search < 26 -- needed to select the right index\n        AND (placex.extratags->'wikidata' is null OR bnd.extratags->'wikidata' is null\n             OR placex.extratags->'wikidata' = bnd.extratags->'wikidata')\n        AND ST_Covers(bnd.geometry, placex.geometry)\n    LOOP\n      {% if debug %}RAISE WARNING 'Found matching place node %', linked_placex.osm_id;{% endif %}\n      RETURN linked_placex;\n    END LOOP;\n  END IF;\n\n  RETURN NULL;\nEND;\n$$\nLANGUAGE plpgsql STABLE PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION create_poi_search_terms(obj_place_id BIGINT,\n                                                   in_partition SMALLINT,\n                                                   parent_place_id BIGINT,\n                                                   is_place_addr BOOLEAN,\n                                                   country TEXT,\n                                                   token_info JSONB,\n                                                   geometry GEOMETRY,\n                                                   OUT name_vector INTEGER[],\n                                                   OUT nameaddress_vector INTEGER[])\n  AS $$\nDECLARE\n  parent_name_vector INTEGER[];\n  parent_address_vector INTEGER[];\n  addr_place_ids INTEGER[];\n  hnr_vector INTEGER[];\n\n  addr_item RECORD;\n  addr_place RECORD;\n  parent_address_place_ids BIGINT[];\nBEGIN\n  nameaddress_vector := '{}'::INTEGER[];\n\n  SELECT s.name_vector, s.nameaddress_vector\n    INTO parent_name_vector, parent_address_vector\n    FROM search_name s\n    WHERE s.place_id = parent_place_id;\n\n  FOR addr_item IN\n    SELECT ranks.*, key,\n           token_get_address_search_tokens(token_info, key) as search_tokens\n      FROM token_get_address_keys(token_info) as key,\n           LATERAL get_addr_tag_rank(key, country) as ranks\n      WHERE not token_get_address_search_tokens(token_info, key) <@ parent_address_vector\n  LOOP\n    addr_place := get_address_place(in_partition, geometry,\n                                    addr_item.from_rank, addr_item.to_rank,\n                                    addr_item.extent, token_info, addr_item.key);\n\n    IF addr_place is null THEN\n      -- No place found in OSM that matches. Make it at least searchable.\n      nameaddress_vector := array_merge(nameaddress_vector, addr_item.search_tokens);\n    ELSE\n      IF parent_address_place_ids is null THEN\n        SELECT array_agg(parent_place_id) INTO parent_address_place_ids\n          FROM place_addressline\n          WHERE place_id = parent_place_id;\n      END IF;\n\n      -- If the parent already lists the place in place_address line, then we\n      -- are done. Otherwise, add its own place_address line.\n      IF not parent_address_place_ids @> ARRAY[addr_place.place_id] THEN\n        nameaddress_vector := array_merge(nameaddress_vector, addr_place.keywords);\n\n        INSERT INTO place_addressline (place_id, address_place_id, fromarea,\n                                       isaddress, distance, cached_rank_address)\n          VALUES (obj_place_id, addr_place.place_id, not addr_place.isguess,\n                    true, addr_place.distance, addr_place.rank_address);\n      END IF;\n    END IF;\n  END LOOP;\n\n  name_vector := COALESCE(token_get_name_search_tokens(token_info), '{}'::INTEGER[]);\n\n  -- Check if the parent covers all address terms.\n  -- If not, create a search name entry with the house number as the name.\n  -- This is unusual for the search_name table but prevents that the place\n  -- is returned when we only search for the street/place.\n\n  hnr_vector := token_get_housenumber_search_tokens(token_info);\n\n  IF hnr_vector is not null and not nameaddress_vector <@ parent_address_vector THEN\n    name_vector := array_merge(name_vector, hnr_vector);\n  END IF;\n\n  -- Cheating here by not recomputing all terms but simply using the ones\n  -- from the parent object.\n  nameaddress_vector := array_merge(nameaddress_vector, parent_name_vector);\n  nameaddress_vector := array_merge(nameaddress_vector, parent_address_vector);\n\n  -- make sure addr:place terms are always searchable\n  IF is_place_addr THEN\n    addr_place_ids := token_addr_place_search_tokens(token_info);\n    IF hnr_vector is not null AND not addr_place_ids <@ parent_name_vector\n    THEN\n      name_vector := array_merge(name_vector, hnr_vector);\n    END IF;\n    nameaddress_vector := array_merge(nameaddress_vector, addr_place_ids);\n  END IF;\nEND;\n$$\nLANGUAGE plpgsql;\n\n\n-- Insert address of a place into the place_addressline table.\n--\n-- \\param obj_place_id  Place_id of the place to compute the address for.\n-- \\param partition     Partition number where the place is in.\n-- \\param maxrank       Rank of the place. All address features must have\n--                      a search rank lower than the given rank.\n-- \\param address       Address terms for the place.\n-- \\param geometry      Geometry to which the address objects should be close.\n--\n-- \\retval parent_place_id  Place_id of the address object that is the direct\n--                          ancestor.\n-- \\retval postcode         Postcode computed from the address. This is the\n--                          addr:postcode of one of the address objects. If\n--                          more than one of has a postcode, the highest ranking\n--                          one is used. May be NULL.\n-- \\retval nameaddress_vector  Search terms for the address. This is the sum\n--                             of name terms of all address objects.\nCREATE OR REPLACE FUNCTION insert_addresslines(obj_place_id BIGINT,\n                                               partition SMALLINT,\n                                               maxrank SMALLINT,\n                                               token_info JSONB,\n                                               geometry GEOMETRY,\n                                               centroid GEOMETRY,\n                                               country TEXT,\n                                               OUT parent_place_id BIGINT,\n                                               OUT postcode TEXT,\n                                               OUT nameaddress_vector INT[])\n  AS $$\nDECLARE\n  address_havelevel BOOLEAN[];\n  place_min_distance FLOAT[];\n\n  location_isaddress BOOLEAN;\n  current_boundary GEOMETRY := NULL;\n  current_node_area GEOMETRY := NULL;\n\n  parent_place_rank INT := 0;\n  addr_place_ids BIGINT[] := '{}'::int[];\n  new_address_vector INT[];\n\n  location RECORD;\nBEGIN\n  parent_place_id := 0;\n  nameaddress_vector := '{}'::int[];\n\n  address_havelevel := array_fill(false, ARRAY[maxrank]);\n  place_min_distance := array_fill(1.0, ARRAY[maxrank]);\n\n  FOR location IN\n    SELECT apl.*, key\n      FROM (SELECT extra.*, key\n              FROM token_get_address_keys(token_info) as key,\n                   LATERAL get_addr_tag_rank(key, country) as extra) x,\n           LATERAL get_address_place(partition, geometry, from_rank, to_rank,\n                              extent, token_info, key) as apl\n      ORDER BY rank_address, distance, isguess desc\n  LOOP\n    IF location.place_id is null THEN\n      {% if not db.reverse_only %}\n      nameaddress_vector := array_merge(nameaddress_vector,\n                                        token_get_address_search_tokens(token_info,\n                                                                        location.key));\n      {% endif %}\n    ELSE\n      {% if not db.reverse_only %}\n      nameaddress_vector := array_merge(nameaddress_vector, location.keywords::INTEGER[]);\n      {% endif %}\n\n      location_isaddress := not address_havelevel[location.rank_address];\n      IF not address_havelevel[location.rank_address] THEN\n        address_havelevel[location.rank_address] := true;\n        IF parent_place_rank < location.rank_address THEN\n          parent_place_id := location.place_id;\n          parent_place_rank := location.rank_address;\n        END IF;\n      END IF;\n\n      IF location.isguess and location.distance < place_min_distance[location.rank_address] THEN\n        place_min_distance[location.rank_address] := location.distance;\n      END IF;\n\n      INSERT INTO place_addressline (place_id, address_place_id, fromarea,\n                                     isaddress, distance, cached_rank_address)\n        VALUES (obj_place_id, location.place_id, not location.isguess,\n                true, location.distance, location.rank_address);\n\n      addr_place_ids := addr_place_ids || location.place_id;\n    END IF;\n  END LOOP;\n\n  FOR location IN\n    SELECT * FROM getNearFeatures(partition, geometry, centroid, maxrank)\n    WHERE not addr_place_ids @> ARRAY[place_id]\n    ORDER BY rank_address, isguess asc,\n             distance *\n               CASE WHEN rank_address = 16 AND rank_search = 15 THEN 0.2\n                    WHEN rank_address = 16 AND rank_search = 16 THEN 0.25\n                    WHEN rank_address = 16 AND rank_search = 18 THEN 0.5\n                    ELSE 1 END ASC\n  LOOP\n    -- Ignore all place nodes that do not fit in a lower level boundary.\n    CONTINUE WHEN location.isguess\n                  and current_boundary is not NULL\n                  and not ST_Contains(current_boundary, location.centroid);\n\n    -- If this is the first item in the rank, then assume it is the address.\n    location_isaddress := not address_havelevel[location.rank_address];\n\n    -- Ignore guessed places when they are too far away compared to similar closer ones.\n    IF location.isguess THEN\n      CONTINUE WHEN not location_isaddress\n                    AND location.distance > 2 * place_min_distance[location.rank_address];\n\n      IF location.distance < place_min_distance[location.rank_address] THEN\n        place_min_distance[location.rank_address] := location.distance;\n      END IF;\n    END IF;\n\n    -- Further sanity checks to ensure that the address forms a sane hierarchy.\n    IF location_isaddress THEN\n      IF location.isguess and current_node_area is not NULL THEN\n        location_isaddress := ST_Contains(current_node_area, location.centroid);\n      END IF;\n      IF not location.isguess and current_boundary is not NULL\n         and location.rank_address != 11 AND location.rank_address != 5 THEN\n        location_isaddress := ST_Contains(current_boundary, location.centroid);\n      END IF;\n    END IF;\n\n    IF location_isaddress THEN\n      address_havelevel[location.rank_address] := true;\n      parent_place_id := location.place_id;\n\n      -- Set postcode if we have one.\n      -- (Returned will be the highest ranking one.)\n      IF location.postcode is not NULL THEN\n        postcode = location.postcode;\n      END IF;\n\n      -- Recompute the areas we need for hierarchy sanity checks.\n      IF location.rank_address != 11 AND location.rank_address != 5 THEN\n        IF location.isguess THEN\n          current_node_area := place_node_fuzzy_area(location.centroid,\n                                                     location.rank_search);\n        ELSE\n          current_node_area := NULL;\n          SELECT p.geometry FROM placex p\n              WHERE p.place_id = location.place_id INTO current_boundary;\n        END IF;\n      END IF;\n    END IF;\n\n    -- Add it to the list of search terms\n    {% if not db.reverse_only %}\n      IF location.rank_address != 11 AND location.rank_address != 5 THEN\n          nameaddress_vector := array_merge(nameaddress_vector,\n                                            location.keywords::integer[]);\n      END IF;\n    {% endif %}\n\n    INSERT INTO place_addressline (place_id, address_place_id, fromarea,\n                                     isaddress, distance, cached_rank_address)\n        VALUES (obj_place_id, location.place_id, not location.isguess,\n                location_isaddress, location.distance, location.rank_address);\n  END LOOP;\nEND;\n$$\nLANGUAGE plpgsql;\n\n\nCREATE OR REPLACE FUNCTION placex_insert()\n  RETURNS TRIGGER\n  AS $$\nDECLARE\n  postcode TEXT;\n  result INT;\n  is_area BOOLEAN;\n  country_code VARCHAR(2);\n  diameter FLOAT;\n  classtable TEXT;\nBEGIN\n  {% if debug %}RAISE WARNING '% % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type;{% endif %}\n\n  NEW.place_id := nextval('seq_place');\n  NEW.indexed_status := 1; --STATUS_NEW\n\n  NEW.centroid := get_center_point(NEW.geometry);\n  NEW.country_code := lower(get_country_code(NEW.centroid));\n\n  NEW.partition := get_partition(NEW.country_code);\n  NEW.geometry_sector := geometry_sector(NEW.partition, NEW.centroid);\n\n  IF NEW.osm_type = 'X' THEN\n    -- E'X'ternal records should already be in the right format so do nothing\n  ELSE\n    is_area := ST_GeometryType(NEW.geometry) IN ('ST_Polygon','ST_MultiPolygon');\n\n    IF NOT is_rankable_place(NEW.osm_type, NEW.class, NEW.admin_level,\n                             NEW.name, NEW.extratags, is_area)\n    THEN\n        RETURN NULL;\n    END IF;\n\n    SELECT * INTO NEW.rank_search, NEW.rank_address\n      FROM compute_place_rank(NEW.country_code,\n                              CASE WHEN is_area THEN 'A' ELSE NEW.osm_type END,\n                              NEW.class, NEW.type, NEW.admin_level,\n                              (NEW.extratags->'capital') = 'yes',\n                              NEW.address->'postcode');\n\n    -- a country code make no sense below rank 4 (country)\n    IF NEW.rank_search < 4 THEN\n      NEW.country_code := NULL;\n    END IF;\n\n    -- Simplify polygons with a very large memory footprint when they\n    -- do not take part in address computation.\n    IF NEW.rank_address = 0 THEN\n      NEW.geometry := simplify_large_polygons(NEW.geometry);\n    END IF;\n\n  END IF;\n\n  IF NEW.importance IS NULL THEN\n    NEW.importance := 0.40001 - (NEW.rank_search::float / 75);\n  END IF;\n\n  {% if debug %}RAISE WARNING 'placex_insert:END: % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type;{% endif %}\n\n{% if not disable_diff_updates %}\n  -- The following is not needed until doing diff updates, and slows the main index process down\n\n   -- add to tables for special search\n  classtable := 'place_classtype_' || NEW.class || '_' || NEW.type;\n  SELECT count(*) INTO result\n    FROM pg_tables\n    WHERE classtable NOT SIMILAR TO '%\\W%'\n          AND tablename = classtable and schemaname = current_schema();\n  IF result > 0 THEN\n    EXECUTE 'INSERT INTO ' || classtable::regclass || ' (place_id, centroid) VALUES ($1,$2)' \n    USING NEW.place_id, NEW.centroid;\n  END IF;\n\n{% endif %} -- not disable_diff_updates\n\n  RETURN NEW;\n\nEND;\n$$\nLANGUAGE plpgsql;\n\nCREATE OR REPLACE FUNCTION placex_update()\n  RETURNS TRIGGER\n  AS $$\nDECLARE\n  i INTEGER;\n  location RECORD;\n{% if db.middle_db_format == '1' %}\n  relation_members TEXT[];\n{% else %}\n  relation_member JSONB;\n{% endif %}\n\n  geom GEOMETRY;\n  parent_address_level SMALLINT;\n  place_address_level SMALLINT;\n\n  max_rank SMALLINT;\n\n  name_vector INTEGER[];\n  nameaddress_vector INTEGER[];\n  addr_nameaddress_vector INTEGER[];\n\n  linked_place BIGINT;\n\n  linked_node_id BIGINT;\n  linked_importance FLOAT;\n  linked_wikipedia TEXT;\n\n  is_place_address BOOLEAN;\n  result BOOLEAN;\nBEGIN\n  -- deferred delete\n  IF OLD.indexed_status = 100 THEN\n    {% if debug %}RAISE WARNING 'placex_update delete % %',NEW.osm_type,NEW.osm_id;{% endif %}\n    delete from placex where place_id = OLD.place_id;\n    RETURN NULL;\n  END IF;\n\n  IF NEW.indexed_status != 0 OR OLD.indexed_status = 0 THEN\n    RETURN NEW;\n  END IF;\n\n  {% if debug %}RAISE WARNING 'placex_update % % (%)',NEW.osm_type,NEW.osm_id,NEW.place_id;{% endif %}\n\n  NEW.indexed_date = now();\n\n  IF OLD.indexed_status > 1 THEN\n    {% if 'search_name' in db.tables %}\n      DELETE from search_name WHERE place_id = NEW.place_id;\n    {% endif %}\n    result := deleteSearchName(NEW.partition, NEW.place_id);\n    DELETE FROM place_addressline WHERE place_id = NEW.place_id;\n    result := deleteRoad(NEW.partition, NEW.place_id);\n    result := deleteLocationArea(NEW.partition, NEW.place_id, NEW.rank_search);\n  END IF;\n\n  NEW.extratags := NEW.extratags - 'linked_place'::TEXT;\n  IF NEW.extratags = ''::hstore THEN\n    NEW.extratags := NULL;\n  END IF;\n\n  -- NEW.linked_place_id contains the precomputed linkee. Save this and restore\n  -- the previous link status.\n  linked_place := NEW.linked_place_id;\n  NEW.linked_place_id := OLD.linked_place_id;\n\n  -- Remove linkage, if we have computed a different new linkee.\n  IF OLD.indexed_status > 1 THEN\n    UPDATE placex\n      SET linked_place_id = null,\n          indexed_status = CASE WHEN indexed_status = 0 THEN 2 ELSE indexed_status END\n      WHERE linked_place_id = NEW.place_id\n            and (linked_place is null or place_id != linked_place);\n  END IF;\n\n  -- Compute a preliminary centroid.\n  NEW.centroid := get_center_point(NEW.geometry);\n\n  -- Record the entrance node locations\n  IF NEW.osm_type = 'W' and (NEW.rank_search > 27 or NEW.class IN ('landuse', 'leisure')) THEN\n    PERFORM place_update_entrances(NEW.place_id, NEW.osm_id);\n  END IF;\n\n    -- recalculate country and partition\n  IF NEW.rank_search = 4 AND NEW.address is not NULL AND NEW.address ? 'country' THEN\n    -- for countries, believe the mapped country code,\n    -- so that we remain in the right partition if the boundaries\n    -- suddenly expand.\n    NEW.country_code := lower(NEW.address->'country');\n    NEW.partition := get_partition(lower(NEW.country_code));\n    IF NEW.partition = 0 THEN\n      NEW.country_code := lower(get_country_code(NEW.centroid));\n      NEW.partition := get_partition(NEW.country_code);\n    END IF;\n  ELSE\n    IF NEW.rank_search >= 4 THEN\n      NEW.country_code := lower(get_country_code(NEW.centroid));\n    ELSE\n      NEW.country_code := NULL;\n    END IF;\n    NEW.partition := get_partition(NEW.country_code);\n  END IF;\n  {% if debug %}RAISE WARNING 'Country updated: \"%\"', NEW.country_code;{% endif %}\n\n\n  -- recompute the ranks, they might change when linking changes\n  SELECT * INTO NEW.rank_search, NEW.rank_address\n    FROM compute_place_rank(NEW.country_code,\n                            CASE WHEN ST_GeometryType(NEW.geometry)\n                                        IN ('ST_Polygon','ST_MultiPolygon')\n                            THEN 'A' ELSE NEW.osm_type END,\n                            NEW.class, NEW.type, NEW.admin_level,\n                            (NEW.extratags->'capital') = 'yes',\n                            NEW.address->'postcode');\n\n  -- Short-cut out for linked places. Note that this must happen after the\n  -- address rank has been recomputed. The linking might nullify a shift in\n  -- address rank.\n  IF NEW.linked_place_id is not null THEN\n    NEW.token_info := null;\n    {% if debug %}RAISE WARNING 'place already linked to %', OLD.linked_place_id;{% endif %}\n    RETURN NEW;\n  END IF;\n\n  -- We must always increase the address level relative to the admin boundary.\n  IF NEW.class = 'boundary' and NEW.type = 'administrative'\n     and NEW.osm_type = 'R' and NEW.rank_address > 0\n  THEN\n    -- First, check that admin boundaries do not overtake each other rank-wise.\n    parent_address_level := 3;\n    FOR location IN\n      SELECT rank_address,\n             (CASE WHEN extratags ? 'wikidata' and NEW.extratags ? 'wikidata'\n                        and extratags->'wikidata' = NEW.extratags->'wikidata'\n                   THEN ST_Equals(geometry, NEW.geometry)\n                   ELSE false END) as is_same\n      FROM placex\n      WHERE osm_type = 'R' and class = 'boundary' and type = 'administrative'\n            and admin_level < NEW.admin_level and admin_level > 3\n            and rank_address between 1 and 25 -- for index selection\n            and ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') -- for index selection\n            and geometry && NEW.centroid and _ST_Covers(geometry, NEW.centroid)\n      ORDER BY admin_level desc LIMIT 1\n    LOOP\n      IF location.is_same THEN\n        -- Looks like the same boundary is replicated on multiple admin_levels.\n        -- Usual tagging in Poland. Remove our boundary from addresses.\n        NEW.rank_address := 0;\n      ELSE\n        parent_address_level := location.rank_address;\n        IF location.rank_address >= NEW.rank_address THEN\n          IF location.rank_address >= 24 THEN\n            NEW.rank_address := 25;\n          ELSE\n            NEW.rank_address := location.rank_address + 2;\n          END IF;\n        END IF;\n      END IF;\n    END LOOP;\n\n    IF NEW.rank_address > 9 THEN\n        -- Second check that the boundary is not completely contained in a\n        -- place area with a equal or higher address rank.\n        FOR location IN\n          SELECT rank_address\n          FROM placex,\n               LATERAL compute_place_rank(country_code, 'A', class, type,\n                                          admin_level, False, null) prank\n          WHERE class = 'place' and rank_address between 1 and 23\n                and prank.address_rank >= NEW.rank_address\n                and ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') -- select right index\n                and ST_Contains(geometry, NEW.geometry)\n                and not ST_Equals(geometry, NEW.geometry)\n          ORDER BY prank.address_rank desc LIMIT 1\n        LOOP\n          NEW.rank_address := location.rank_address + 2;\n        END LOOP;\n    END IF;\n  ELSEIF NEW.class = 'place'\n         and ST_GeometryType(NEW.geometry) in ('ST_Polygon', 'ST_MultiPolygon')\n         and NEW.rank_address between 16 and 23\n  THEN\n    -- For place areas make sure they are not completely contained in an area\n    -- with a equal or higher address rank.\n    FOR location IN\n          SELECT rank_address\n          FROM placex,\n               LATERAL compute_place_rank(country_code, 'A', class, type,\n                                          admin_level, False, null) prank\n          WHERE prank.address_rank < 24\n                and rank_address between 1 and 25 -- select right index\n                and ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') -- select right index\n                and prank.address_rank >= NEW.rank_address\n                and ST_Contains(geometry, NEW.geometry)\n                and not ST_Equals(geometry, NEW.geometry)\n          ORDER BY prank.address_rank desc LIMIT 1\n        LOOP\n          NEW.rank_address := location.rank_address + 2;\n        END LOOP;\n  ELSEIF NEW.class = 'place' and NEW.osm_type = 'N'\n         and NEW.rank_address between 16 and 23\n  THEN\n    -- If a place node is contained in an admin or place boundary with the same\n    -- address level and has not been linked, then make the node a subpart\n    -- by increasing the address rank (city level and above).\n    FOR location IN\n        SELECT rank_address\n        FROM placex,\n             LATERAL compute_place_rank(country_code, 'A', class, type,\n                                        admin_level, False, null) prank\n        WHERE osm_type = 'R'\n              and rank_address between 1 and 25 -- select right index\n              and ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') -- select right index\n              and ((class = 'place' and prank.address_rank = NEW.rank_address)\n                   or (class = 'boundary' and rank_address = NEW.rank_address))\n              and geometry && NEW.centroid and _ST_Covers(geometry, NEW.centroid)\n        LIMIT 1\n    LOOP\n      NEW.rank_address = NEW.rank_address + 2;\n    END LOOP;\n  ELSE\n    parent_address_level := 3;\n  END IF;\n\n  NEW.housenumber := token_normalized_housenumber(NEW.token_info);\n\n  NEW.postcode := null;\n\n  -- waterway ways are linked when they are part of a relation and have the same class/type\n  IF NEW.osm_type = 'R' and NEW.class = 'waterway' THEN\n{% if db.middle_db_format == '1' %}\n      FOR relation_members IN select members from planet_osm_rels r where r.id = NEW.osm_id and r.parts != array[]::bigint[]\n      LOOP\n          FOR i IN 1..array_upper(relation_members, 1) BY 2 LOOP\n              IF relation_members[i+1] in ('', 'main_stream', 'side_stream') AND substring(relation_members[i],1,1) = 'w' THEN\n                {% if debug %}RAISE WARNING 'waterway parent %, child %/%', NEW.osm_id, i, relation_members[i];{% endif %}\n                FOR linked_node_id IN SELECT place_id FROM placex\n                  WHERE osm_type = 'W' and osm_id = substring(relation_members[i],2,200)::bigint\n                  and class = NEW.class and type in ('river', 'stream', 'canal', 'drain', 'ditch')\n                  and ( relation_members[i+1] != 'side_stream' or NEW.name->'name' = name->'name')\n                LOOP\n                  UPDATE placex SET linked_place_id = NEW.place_id WHERE place_id = linked_node_id;\n                  {% if 'search_name' in db.tables %}\n                    IF OLD.indexed_status > 1 THEN\n                      DELETE FROM search_name WHERE place_id = linked_node_id;\n                    END IF;\n                  {% endif %}\n                END LOOP;\n              END IF;\n          END LOOP;\n      END LOOP;\n{% else %}\n    FOR relation_member IN\n      SELECT value FROM planet_osm_rels r, LATERAL jsonb_array_elements(r.members)\n      WHERE r.id = NEW.osm_id\n    LOOP\n      IF relation_member->>'role' IN ('', 'main_stream', 'side_stream')\n         and relation_member->>'type' = 'W'\n      THEN\n        {% if debug %}RAISE WARNING 'waterway parent %, child %', NEW.osm_id, relation_member;{% endif %}\n        FOR linked_node_id IN\n          SELECT place_id FROM placex\n          WHERE osm_type = 'W' and osm_id = (relation_member->>'ref')::bigint\n                and class = NEW.class and type in ('river', 'stream', 'canal', 'drain', 'ditch')\n                and (relation_member->>'role' != 'side_stream' or NEW.name->'name' = name->'name')\n        LOOP\n          UPDATE placex SET linked_place_id = NEW.place_id WHERE place_id = linked_node_id;\n          {% if 'search_name' in db.tables %}\n            DELETE FROM search_name WHERE place_id = linked_node_id;\n          {% endif %}\n        END LOOP;\n      END IF;\n    END LOOP;\n{% endif %}\n      {% if debug %}RAISE WARNING 'Waterway processed';{% endif %}\n  END IF;\n\n  SELECT wikipedia, importance INTO NEW.wikipedia, NEW.importance\n    FROM compute_importance(NEW.extratags, NEW.country_code, NEW.rank_search, NEW.centroid);\n\n{% if debug %}RAISE WARNING 'Importance computed from wikipedia: %', NEW.importance;{% endif %}\n\n  -- ---------------------------------------------------------------------------\n  -- For low level elements we inherit from our parent road\n  IF NEW.rank_search > 27 THEN\n\n    {% if debug %}RAISE WARNING 'finding street for % %', NEW.osm_type, NEW.osm_id;{% endif %}\n    NEW.parent_place_id := null;\n    is_place_address := not token_is_street_address(NEW.token_info);\n\n    -- We have to find our parent road.\n    NEW.parent_place_id := find_parent_for_poi(NEW.osm_type, NEW.osm_id,\n                                               NEW.partition,\n                                               ST_Envelope(NEW.geometry),\n                                               NEW.token_info,\n                                               is_place_address);\n\n    -- If we found the road take a shortcut here.\n    -- Otherwise fall back to the full address getting method below.\n    IF NEW.parent_place_id is not null THEN\n\n      -- Get the details of the parent road\n      SELECT p.country_code, p.postcode, p.name FROM placex p\n       WHERE p.place_id = NEW.parent_place_id INTO location;\n\n      IF is_place_address and NEW.address ? 'place' THEN\n        -- Check if the addr:place tag is part of the parent name\n        SELECT count(*) INTO i\n          FROM svals(location.name) AS pname WHERE pname = NEW.address->'place';\n        IF i = 0 THEN\n          NEW.address = NEW.address || hstore('_unlisted_place', NEW.address->'place');\n        END IF;\n      END IF;\n\n      NEW.country_code := location.country_code;\n      {% if debug %}RAISE WARNING 'Got parent details from search name';{% endif %}\n\n      -- determine postcode\n      NEW.postcode := coalesce(token_get_postcode(NEW.token_info),\n                               location.postcode,\n                               get_nearest_postcode(NEW.country_code, NEW.centroid));\n\n      IF NEW.name is not NULL THEN\n          NEW.name := add_default_place_name(NEW.country_code, NEW.name);\n      END IF;\n\n      {% if not db.reverse_only %}\n      IF NEW.name is not NULL OR NEW.address is not NULL THEN\n        SELECT * INTO name_vector, nameaddress_vector\n          FROM create_poi_search_terms(NEW.place_id,\n                                       NEW.partition, NEW.parent_place_id,\n                                       is_place_address, NEW.country_code,\n                                       NEW.token_info, NEW.centroid);\n\n        IF array_length(name_vector, 1) is not NULL THEN\n          INSERT INTO search_name (place_id, address_rank,\n                                   importance, country_code, name_vector,\n                                   nameaddress_vector, centroid)\n                 VALUES (NEW.place_id, NEW.rank_address,\n                         NEW.importance, NEW.country_code, name_vector,\n                         nameaddress_vector, NEW.centroid);\n          {% if debug %}RAISE WARNING 'Place added to search table';{% endif %}\n        END IF;\n      END IF;\n      {% endif %}\n\n      NEW.token_info := token_strip_info(NEW.token_info);\n\n      RETURN NEW;\n    END IF;\n\n  END IF;\n\n  -- ---------------------------------------------------------------------------\n  -- Full indexing\n  {% if debug %}RAISE WARNING 'Using full index mode for % %', NEW.osm_type, NEW.osm_id;{% endif %}\n  IF linked_place is not null THEN\n    -- Recompute the ranks here as the ones from the linked place might\n    -- have been shifted to accommodate surrounding boundaries.\n    SELECT place_id, osm_id, class, type, extratags, rank_search,\n           centroid, geometry,\n           (compute_place_rank(country_code, osm_type, class, type, admin_level,\n                              (extratags->'capital') = 'yes', null)).*\n      INTO location\n      FROM placex WHERE place_id = linked_place;\n\n    {% if debug %}RAISE WARNING 'Linked %', location;{% endif %}\n\n    -- Use the linked point as the centre point of the geometry,\n    -- but only if it is within the area of the boundary.\n    geom := coalesce(location.centroid, ST_Centroid(location.geometry));\n    IF geom is not NULL AND ST_Within(geom, NEW.geometry) THEN\n        NEW.centroid := geom;\n    END IF;\n\n    {% if debug %}RAISE WARNING 'parent address: % rank address: %', parent_address_level, location.address_rank;{% endif %}\n    IF location.address_rank > parent_address_level\n       and location.address_rank < 26\n    THEN\n      NEW.rank_address := location.address_rank;\n    END IF;\n\n    -- merge in extra tags\n    NEW.extratags := hstore('linked_' || location.class, location.type)\n                     || coalesce(location.extratags, ''::hstore)\n                     || coalesce(NEW.extratags, ''::hstore);\n\n    -- mark the linked place (excludes from search results)\n    -- Force reindexing to remove any traces from the search indexes and\n    -- reset the address rank if necessary.\n    UPDATE placex set linked_place_id = NEW.place_id, indexed_status = 2\n      WHERE place_id = location.place_id;\n\n    SELECT wikipedia, importance\n      FROM compute_importance(location.extratags, NEW.country_code,\n                              location.rank_search, NEW.centroid)\n      INTO linked_wikipedia,linked_importance;\n\n    -- Use the maximum importance if one could be computed from the linked object.\n    IF linked_importance is not null AND\n       (NEW.importance is null or NEW.importance < linked_importance)\n    THEN\n      NEW.importance := linked_importance;\n    END IF;\n  ELSE\n    -- No linked place? As a last resort check if the boundary is tagged with\n    -- a place type and adapt the rank address.\n    IF NEW.rank_address between 4 and 25 and NEW.extratags ? 'place' THEN\n      SELECT address_rank INTO place_address_level\n        FROM compute_place_rank(NEW.country_code, 'A', 'place',\n                                NEW.extratags->'place', 0::SMALLINT, False, null);\n      IF place_address_level > parent_address_level and\n         place_address_level < 26 THEN\n        NEW.rank_address := place_address_level;\n      END IF;\n    END IF;\n  END IF;\n\n  {% if not disable_diff_updates %}\n  IF OLD.rank_address != NEW.rank_address THEN\n    -- After a rank shift all addresses containing us must be updated.\n    UPDATE placex p SET indexed_status = 2 FROM place_addressline pa\n      WHERE pa.address_place_id = NEW.place_id and p.place_id = pa.place_id\n            and p.indexed_status = 0 and p.rank_address between 4 and 25;\n  END IF;\n  {% endif %}\n\n  IF NEW.admin_level = 2\n     AND NEW.class = 'boundary' AND NEW.type = 'administrative'\n     AND NEW.country_code IS NOT NULL AND NEW.osm_type = 'R'\n  THEN\n    -- Update the list of country names.\n    -- Only take the name from the largest area for the given country code\n    -- in the hope that this is the authoritative one.\n    -- Also replace any old names so that all mapping mistakes can\n    -- be fixed through regular OSM updates.\n    FOR location IN\n      SELECT osm_id FROM placex\n       WHERE rank_search = 4 and osm_type = 'R'\n             and country_code = NEW.country_code\n       ORDER BY ST_Area(geometry) desc\n       LIMIT 1\n    LOOP\n      IF location.osm_id = NEW.osm_id THEN\n        {% if debug %}RAISE WARNING 'Updating names for country ''%'' with: %', NEW.country_code, NEW.name;{% endif %}\n        UPDATE country_name SET derived_name = NEW.name WHERE country_code = NEW.country_code;\n      END IF;\n    END LOOP;\n  END IF;\n\n  -- For linear features we need the full geometry for determining the address\n  -- because they may go through several administrative entities. Otherwise use\n  -- the centroid for performance reasons.\n  IF ST_GeometryType(NEW.geometry) in ('ST_LineString', 'ST_MultiLineString') THEN\n    geom := NEW.geometry;\n  ELSE\n    geom := NEW.centroid;\n  END IF;\n\n  IF NEW.rank_address = 0 THEN\n    max_rank := geometry_to_rank(NEW.rank_search, NEW.geometry, NEW.country_code);\n    -- Rank 0 features may also span multiple administrative areas (e.g. lakes)\n    -- so use the geometry here too. Just make sure the areas don't become too\n    -- large.\n    IF NEW.class = 'natural' or max_rank > 10 THEN\n      geom := NEW.geometry;\n    END IF;\n  ELSEIF NEW.rank_address > 25 THEN\n    max_rank := 25;\n  ELSE\n    max_rank := NEW.rank_address;\n  END IF;\n\n  SELECT * FROM insert_addresslines(NEW.place_id, NEW.partition, max_rank,\n                                    NEW.token_info, geom, NEW.centroid,\n                                    NEW.country_code)\n    INTO NEW.parent_place_id, NEW.postcode, nameaddress_vector;\n\n  {% if debug %}RAISE WARNING 'RETURN insert_addresslines: %, %, %', NEW.parent_place_id, NEW.postcode, nameaddress_vector;{% endif %}\n\n  NEW.postcode := coalesce(token_get_postcode(NEW.token_info), NEW.postcode);\n\n  -- if we have a name add this to the name search table\n  name_vector := token_get_name_search_tokens(NEW.token_info);\n  IF array_length(name_vector, 1) is not NULL THEN\n    -- Initialise the name vector using our name\n    NEW.name := add_default_place_name(NEW.country_code, NEW.name);\n\n    IF NEW.rank_search <= 25 and NEW.rank_address > 0 THEN\n      result := add_location(NEW.place_id, NEW.country_code, NEW.partition,\n                             name_vector, NEW.rank_search, NEW.rank_address,\n                             NEW.postcode, NEW.geometry, NEW.centroid);\n      {% if debug %}RAISE WARNING 'added to location (full)';{% endif %}\n    END IF;\n\n    IF NEW.rank_search between 26 and 27 and NEW.class = 'highway' THEN\n      result := insertLocationRoad(NEW.partition, NEW.place_id, NEW.country_code, NEW.geometry);\n      {% if debug %}RAISE WARNING 'insert into road location table (full)';{% endif %}\n    END IF;\n\n    IF NEW.rank_address between 16 and 27 THEN\n      result := insertSearchName(NEW.partition, NEW.place_id,\n                                 token_get_name_match_tokens(NEW.token_info),\n                                 NEW.rank_search, NEW.rank_address, NEW.geometry);\n    END IF;\n    {% if debug %}RAISE WARNING 'added to search name (full)';{% endif %}\n\n    {% if not db.reverse_only %}\n        INSERT INTO search_name (place_id, address_rank,\n                                 importance, country_code, name_vector,\n                                 nameaddress_vector, centroid)\n               VALUES (NEW.place_id, NEW.rank_address,\n                       NEW.importance, NEW.country_code, name_vector,\n                       nameaddress_vector, NEW.centroid);\n    {% endif %}\n  END IF;\n\n  IF NEW.postcode is null AND NEW.rank_search > 8\n     AND (NEW.rank_address > 0\n          OR ST_GeometryType(NEW.geometry) not in ('ST_LineString','ST_MultiLineString')\n          OR ST_Length(NEW.geometry) < 0.02)\n  THEN\n    NEW.postcode := get_nearest_postcode(NEW.country_code,\n                                         CASE WHEN NEW.rank_address > 25\n                                              THEN NEW.centroid ELSE NEW.geometry END);\n  END IF;\n\n  {% if debug %}RAISE WARNING 'place update % % finished.', NEW.osm_type, NEW.osm_id;{% endif %}\n\n  NEW.token_info := token_strip_info(NEW.token_info);\n  RETURN NEW;\nEND;\n$$\nLANGUAGE plpgsql;\n\n\nCREATE OR REPLACE FUNCTION placex_delete()\n  RETURNS TRIGGER\n  AS $$\nDECLARE\n  b BOOLEAN;\n  result INT;\n  classtable TEXT;\nBEGIN\n  -- RAISE WARNING 'placex_delete % %',OLD.osm_type,OLD.osm_id;\n\n  IF OLD.linked_place_id is null THEN\n    UPDATE placex\n      SET linked_place_id = NULL,\n          indexed_status = CASE WHEN indexed_status = 0 THEN 2 ELSE indexed_status END\n      WHERE linked_place_id = OLD.place_id;\n  ELSE\n    update placex set indexed_status = 2 where place_id = OLD.linked_place_id and indexed_status = 0;\n  END IF;\n\n  IF OLD.rank_address < 30 THEN\n\n    -- mark everything linked to this place for re-indexing\n    {% if debug %}RAISE WARNING 'placex_delete:03 % %',OLD.osm_type,OLD.osm_id;{% endif %}\n    UPDATE placex set indexed_status = 2 from place_addressline where address_place_id = OLD.place_id \n      and placex.place_id = place_addressline.place_id and indexed_status = 0 and place_addressline.isaddress;\n\n    {% if debug %}RAISE WARNING 'placex_delete:04 % %',OLD.osm_type,OLD.osm_id;{% endif %}\n    DELETE FROM place_addressline where address_place_id = OLD.place_id;\n\n    {% if debug %}RAISE WARNING 'placex_delete:05 % %',OLD.osm_type,OLD.osm_id;{% endif %}\n    b := deleteRoad(OLD.partition, OLD.place_id);\n\n    {% if debug %}RAISE WARNING 'placex_delete:06 % %',OLD.osm_type,OLD.osm_id;{% endif %}\n    update placex set indexed_status = 2 where parent_place_id = OLD.place_id and indexed_status = 0;\n    {% if debug %}RAISE WARNING 'placex_delete:07 % %',OLD.osm_type,OLD.osm_id;{% endif %}\n    -- reparenting also for OSM Interpolation Lines (and for Tiger?)\n    update location_property_osmline set indexed_status = 2 where indexed_status = 0 and parent_place_id = OLD.place_id;\n\n    UPDATE location_postcodes SET indexed_status = 2 WHERE parent_place_id = OLD.place_id;\n  END IF;\n\n  {% if debug %}RAISE WARNING 'placex_delete:08 % %',OLD.osm_type,OLD.osm_id;{% endif %}\n\n  IF OLD.rank_address < 26 THEN\n    b := deleteLocationArea(OLD.partition, OLD.place_id, OLD.rank_search);\n  END IF;\n\n  {% if debug %}RAISE WARNING 'placex_delete:09 % %',OLD.osm_type,OLD.osm_id;{% endif %}\n\n  IF OLD.name is not null THEN\n    {% if 'search_name' in db.tables %}\n      DELETE from search_name WHERE place_id = OLD.place_id;\n    {% endif %}\n    b := deleteSearchName(OLD.partition, OLD.place_id);\n  END IF;\n\n  {% if debug %}RAISE WARNING 'placex_delete:10 % %',OLD.osm_type,OLD.osm_id;{% endif %}\n\n  DELETE FROM place_addressline where place_id = OLD.place_id;\n\n  {% if debug %}RAISE WARNING 'placex_delete:11 % %',OLD.osm_type,OLD.osm_id;{% endif %}\n\n  -- remove from tables for special search\n  classtable := 'place_classtype_' || OLD.class || '_' || OLD.type;\n  SELECT count(*) INTO result\n    FROM pg_tables\n    WHERE classtable NOT SIMILAR TO '%\\W%'\n          AND tablename = classtable and schemaname = current_schema();\n\n  IF result > 0 THEN\n    EXECUTE 'DELETE FROM ' || classtable::regclass || ' WHERE place_id = $1' USING OLD.place_id;\n  END IF;\n\n  {% if debug %}RAISE WARNING 'placex_delete:12 % %',OLD.osm_type,OLD.osm_id;{% endif %}\n  RETURN OLD;\n\nEND;\n$$\nLANGUAGE plpgsql;\n"
  },
  {
    "path": "lib-sql/functions/postcode_triggers.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2025 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\n-- Trigger functions for location_postcodes table.\n\n\n-- Trigger for updates of location_postcode\n--\n-- Computes the parent object the postcode most likely refers to.\n-- This will be the place that determines the address displayed when\n-- searching for this postcode.\nCREATE OR REPLACE FUNCTION postcodes_update()\n  RETURNS TRIGGER\n  AS $$\nDECLARE\n  partition SMALLINT;\n  location RECORD;\nBEGIN\n    IF NEW.indexed_status != 0 OR OLD.indexed_status = 0 THEN\n        RETURN NEW;\n    END IF;\n\n    NEW.indexed_date = now();\n\n    partition := get_partition(NEW.country_code);\n\n    NEW.parent_place_id = 0;\n    FOR location IN\n      SELECT place_id\n        FROM getNearFeatures(partition, NEW.centroid, NEW.centroid, NEW.rank_search)\n        WHERE NOT isguess ORDER BY rank_address DESC, distance asc LIMIT 1\n    LOOP\n        NEW.parent_place_id = location.place_id;\n    END LOOP;\n\n    RETURN NEW;\nEND;\n$$\nLANGUAGE plpgsql;\n\n\nCREATE OR REPLACE FUNCTION postcodes_delete()\n  RETURNS TRIGGER\n  AS $$\nBEGIN\n{% if not disable_diff_updates %}\n  UPDATE placex p SET indexed_status = 2\n   WHERE p.postcode = OLD.postcode AND ST_Intersects(OLD.geometry, p.geometry)\n         AND indexed_status = 0;\n{% endif %}\n\n  RETURN OLD;\nEND;\n$$\nLANGUAGE plpgsql;\n\n\nCREATE OR REPLACE FUNCTION postcodes_insert()\n  RETURNS TRIGGER\n  AS $$\nDECLARE\n  existing RECORD;\nBEGIN\n  IF NEW.osm_id is not NULL THEN\n    -- postcode area, remove existing from same OSM object\n    SELECT * INTO existing FROM location_postcodes p\n      WHERE p.osm_id = NEW.osm_id;\n\n    IF existing.place_id is not NULL THEN\n      IF existing.postcode != NEW.postcode or existing.country_code != NEW.country_code THEN\n        DELETE FROM location_postcodes p WHERE p.osm_id = NEW.osm_id;\n        existing := NULL;\n      END IF;\n    END IF;\n  END IF;\n\n  IF existing is NULL THEN\n    SELECT * INTO existing FROM location_postcodes p\n      WHERE p.country_code = NEW.country_code AND p.postcode = NEW.postcode;\n\n    IF existing.postcode is NULL THEN\n{% if not disable_diff_updates %}\n      UPDATE placex p SET indexed_status = 2\n       WHERE ST_Intersects(NEW.geometry, p.geometry)\n             AND indexed_status = 0\n             AND p.rank_address >= 22 AND not p.address ? 'postcode';\n{% endif %}\n\n      -- new entry, just insert\n      NEW.indexed_status := 1;\n      NEW.place_id := nextval('seq_place');\n      RETURN NEW;\n    END IF;\n  END IF;\n\n  -- update: only when there are changes\n  IF coalesce(NEW.osm_id, -1) != coalesce(existing.osm_id, -1)\n     OR (NEW.osm_id is not null AND NEW.geometry::text != existing.geometry::text)\n     OR (NEW.osm_id is null\n         AND (abs(ST_X(existing.centroid) - ST_X(NEW.centroid)) > 0.0000001\n              OR abs(ST_Y(existing.centroid) - ST_Y(NEW.centroid)) > 0.0000001))\n  THEN\n{% if not disable_diff_updates %}\n    UPDATE placex p SET indexed_status = 2\n      WHERE ST_Intersects(ST_Difference(NEW.geometry, existing.geometry), p.geometry)\n            AND indexed_status = 0\n            AND p.rank_address >= 22 AND not p.address ? 'postcode';\n\n    UPDATE placex p SET indexed_status = 2\n      WHERE ST_Intersects(ST_Difference(existing.geometry, NEW.geometry), p.geometry)\n            AND indexed_status = 0\n            AND p.postcode = OLD.postcode;\n{% endif %}\n\n    UPDATE location_postcodes p\n      SET osm_id = NEW.osm_id,\n          indexed_status = 2,\n          centroid = NEW.centroid,\n          geometry = NEW.geometry\n      WHERE p.country_code = NEW.country_code AND p.postcode = NEW.postcode;\n  END IF;\n\n  RETURN NULL;\nEND;\n$$\nLANGUAGE plpgsql;\n"
  },
  {
    "path": "lib-sql/functions/ranking.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\n-- Functions related to search and address ranks\n\n-- Check if a place is rankable at all.\n-- These really should be dropped at the lua level eventually.\nCREATE OR REPLACE FUNCTION is_rankable_place(osm_type TEXT, class TEXT,\n                                             admin_level SMALLINT, name HSTORE,\n                                             extratags HSTORE, is_area BOOLEAN)\n  RETURNS BOOLEAN\n  AS $$\nBEGIN\n  IF class = 'highway' AND is_area AND name is null\n         AND extratags ? 'area' AND extratags->'area' = 'yes'\n  THEN\n      RETURN FALSE;\n  END IF;\n\n  IF class = 'boundary' THEN\n    IF NOT is_area\n       OR (admin_level <= 4 AND osm_type = 'W')\n    THEN\n      RETURN FALSE;\n    END IF;\n  END IF;\n\n  RETURN TRUE;\nEND;\n$$\nLANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;\n\n\n-- Return an approximate search radius according to the search rank.\nCREATE OR REPLACE FUNCTION reverse_place_diameter(rank_search SMALLINT)\n  RETURNS FLOAT\n  AS $$\nBEGIN\n  IF rank_search <= 4 THEN\n    RETURN 5.0;\n  ELSIF rank_search <= 8 THEN\n    RETURN 1.8;\n  ELSIF rank_search <= 12 THEN\n    RETURN 0.6;\n  ELSIF rank_search <= 17 THEN\n    RETURN 0.16;\n  ELSIF rank_search <= 18 THEN\n    RETURN 0.08;\n  ELSIF rank_search <= 19 THEN\n    RETURN 0.04;\n  END IF;\n\n  RETURN 0.02;\nEND;\n$$\nLANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;\n\n\n-- Return an approximate update radius according to the search rank.\nCREATE OR REPLACE FUNCTION update_place_diameter(rank_search SMALLINT)\n  RETURNS FLOAT\n  AS $$\nBEGIN\n  -- postcodes\n  IF rank_search = 11 or rank_search = 5 THEN\n    RETURN 0.05;\n  -- anything higher than city is effectively ignored (polygon required)\n  ELSIF rank_search < 16 THEN\n    RETURN 0;\n  ELSIF rank_search < 18 THEN\n    RETURN 0.1;\n  ELSIF rank_search < 20 THEN\n    RETURN 0.05;\n  ELSIF rank_search = 21 THEN\n    RETURN 0.001;\n  ELSIF rank_search < 24 THEN\n    RETURN 0.02;\n  ELSIF rank_search < 26 THEN\n    RETURN 0.002;\n  ELSIF rank_search < 28 THEN\n    RETURN 0.001;\n  END IF;\n\n  RETURN 0;\nEND;\n$$\nLANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;\n\n-- Compute a base address rank from the extent of the given geometry.\n--\n-- This is all simple guess work. We don't need particularly good estimates\n-- here. This just avoids to have very high ranked address parts in features\n-- that span very large areas (or vice versa).\nCREATE OR REPLACE FUNCTION geometry_to_rank(search_rank SMALLINT, geometry GEOMETRY, country_code TEXT)\n  RETURNS SMALLINT\n  AS $$\nDECLARE\n  area FLOAT;\nBEGIN\n  IF ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') THEN\n      area := ST_Area(geometry);\n  ELSIF ST_GeometryType(geometry) in ('ST_LineString','ST_MultiLineString') THEN\n      area := (ST_Length(geometry)^2) * 0.1;\n  ELSE\n    RETURN search_rank;\n  END IF;\n\n  -- adjust for the fact that countries come in different sizes\n  IF country_code IN ('ca', 'au', 'ru') THEN\n    area := area / 5;\n  ELSIF country_code IN ('br', 'kz', 'cn', 'us', 'ne', 'gb', 'za', 'sa', 'id', 'eh', 'ml', 'tm') THEN\n    area := area / 3;\n  ELSIF country_code IN ('bo', 'ar', 'sd', 'mn', 'in', 'et', 'cd', 'mz', 'ly', 'cl', 'zm') THEN\n    area := area / 2;\n  ELSIF country_code IN ('sg', 'ws', 'st', 'kn') THEN\n    area := area * 5;\n  ELSIF country_code IN ('dm', 'mt', 'lc', 'gg', 'sc', 'nr') THEN\n    area := area * 20;\n  END IF;\n\n  IF area > 1 THEN\n    RETURN 7;\n  ELSIF area > 0.1 THEN\n    RETURN 9;\n  ELSIF area > 0.01 THEN\n    RETURN 13;\n  ELSIF area > 0.001 THEN\n    RETURN 17;\n  ELSIF area > 0.0001 THEN\n    RETURN 19;\n  ELSIF area > 0.000005 THEN\n    RETURN 21;\n  END IF;\n\n   RETURN 23;\nEND;\n$$\nLANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;\n\n\n-- Get standard search and address rank for an object.\n--\n-- \\param country        Two-letter country code where the object is in.\n-- \\param extended_type  OSM type (N, W, R) or area type (A).\n-- \\param place_class    Class (or tag key) of object.\n-- \\param place_type     Type (or tag value) of object.\n-- \\param admin_level    Value of admin_level tag.\n-- \\param is_major       If true, boost search rank by one.\n-- \\param postcode       Value of addr:postcode tag.\n-- \\param[out] search_rank   Computed search rank.\n-- \\param[out] address_rank  Computed address rank.\n--\nCREATE OR REPLACE FUNCTION compute_place_rank(country VARCHAR(2),\n                                              extended_type VARCHAR(1),\n                                              place_class TEXT, place_type TEXT,\n                                              admin_level SMALLINT,\n                                              is_major BOOLEAN,\n                                              postcode TEXT,\n                                              OUT search_rank SMALLINT,\n                                              OUT address_rank SMALLINT)\nAS $$\nDECLARE\n  classtype TEXT;\nBEGIN\n  IF extended_type = 'N' AND place_class = 'highway' THEN\n    search_rank = 30;\n    address_rank = 30;\n  ELSEIF place_class = 'landuse' AND extended_type != 'A' THEN\n    search_rank = 30;\n    address_rank = 30;\n  ELSE\n    IF place_class = 'boundary' and place_type = 'administrative' THEN\n      classtype = place_type || admin_level::TEXT;\n    ELSE\n      classtype = place_type;\n    END IF;\n\n    SELECT l.rank_search, l.rank_address INTO search_rank, address_rank\n      FROM address_levels l\n     WHERE (l.country_code = country or l.country_code is NULL)\n           AND l.class = place_class AND (l.type = classtype or l.type is NULL)\n     ORDER BY l.country_code, l.class, l.type LIMIT 1;\n\n    IF search_rank is NULL OR address_rank is NULL THEN\n      search_rank := 30;\n      address_rank := 30;\n    END IF;\n\n    -- some postcorrections\n    IF place_class = 'waterway' AND extended_type = 'R' THEN\n        -- Slightly promote waterway relations so that they are processed\n        -- before their members.\n        search_rank := search_rank - 1;\n    END IF;\n\n    IF is_major THEN\n      search_rank := search_rank - 1;\n    END IF;\n  END IF;\nEND;\n$$\nLANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;\n\nCREATE OR REPLACE FUNCTION get_addr_tag_rank(key TEXT, country TEXT,\n                                             OUT from_rank SMALLINT,\n                                             OUT to_rank SMALLINT,\n                                             OUT extent FLOAT)\n  AS $$\nDECLARE\n  ranks RECORD;\nBEGIN\n  from_rank := null;\n\n  FOR ranks IN\n    SELECT * FROM\n      (SELECT l.rank_search, l.rank_address FROM address_levels l\n        WHERE (l.country_code = country or l.country_code is NULL)\n               AND l.class = 'place' AND l.type = key\n        ORDER BY l.country_code LIMIT 1) r\n      WHERE rank_address > 0\n  LOOP\n    extent := reverse_place_diameter(ranks.rank_search);\n\n    IF ranks.rank_address <= 4 THEN\n        from_rank := 4;\n        to_rank := 4;\n    ELSEIF ranks.rank_address <= 9 THEN\n        from_rank := 5;\n        to_rank := 9;\n    ELSEIF ranks.rank_address <= 12 THEN\n        from_rank := 10;\n        to_rank := 12;\n    ELSEIF ranks.rank_address <= 16 THEN\n        from_rank := 13;\n        to_rank := 16;\n    ELSEIF ranks.rank_address <= 21 THEN\n        from_rank := 17;\n        to_rank := 21;\n    ELSEIF ranks.rank_address <= 24 THEN\n        from_rank := 22;\n        to_rank := 24;\n    ELSE\n        from_rank := 25;\n        to_rank := 25;\n    END IF;\n  END LOOP;\nEND;\n$$\nLANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION weigh_search(search_vector INT[],\n                                        rankings TEXT,\n                                        def_weight FLOAT)\n  RETURNS FLOAT\n  AS $$\nDECLARE\n  rank JSON;\nBEGIN\n  FOR rank IN\n    SELECT * FROM json_array_elements(rankings::JSON)\n  LOOP\n    IF true = ALL(SELECT x::int = ANY(search_vector) FROM json_array_elements_text(rank->1) as x) THEN\n      RETURN (rank->>0)::float;\n    END IF;\n  END LOOP;\n  RETURN def_weight;\nEND;\n$$\nLANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;\n"
  },
  {
    "path": "lib-sql/functions/updates.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n \n-- Helper functions for updates.\n\n-- Invalidate all placex affected by inserting a new place into the placex table.\nCREATE OR REPLACE FUNCTION update_invalidate_for_new_place(address_rank SMALLINT,\n                                                           is_area BOOLEAN, area_size FLOAT,\n                                                           otype TEXT, newgeom GEOMETRY)\n  RETURNS BOOLEAN\n  AS $$\nDECLARE\n  diameter FLOAT;\nBEGIN\n  diameter := update_place_diameter(address_rank);\n  is_area := COALESCE(is_area, ST_GeometryType(newgeom) in ('ST_Polygon','ST_MultiPolygon'));\n  -- Update dependencies for address parts.\n  -- Leaving countries out here because a newly inserted country is\n  -- more likely incorrect mapping.\n  IF address_rank BETWEEN 4 AND 25 THEN\n    IF is_area THEN\n      IF COALESCE(area_size, ST_Area(newgeom)) <= 2.0 THEN\n        UPDATE placex SET indexed_status = 2\n          WHERE ST_Intersects(newgeom, placex.geometry)\n            AND indexed_status = 0\n            AND ((rank_address = 0 and rank_search > address_rank)\n                 or rank_address > address_rank\n                 or (osm_type = 'N' and rank_address between 4 and 25))\n            AND (rank_search < 28 or name is not null);\n      END IF;\n    ELSEIF otype = 'N' THEN\n      IF diameter > 0 THEN\n        UPDATE placex SET indexed_status = 2\n          WHERE ST_DWithin(newgeom, placex.geometry, diameter)\n            AND indexed_status = 0\n            AND ((rank_address = 0 and rank_search > address_rank)\n                 or rank_address > address_rank\n                 or (osm_type = 'N' and rank_address between 4 and 25))\n            AND (rank_search < 28 or name is not null);\n      END IF;\n    END IF;\n    -- Addressable places may cause reparenting of addr:place-based addresses.\n    IF address_rank BETWEEN 16 AND 25 THEN\n      UPDATE placex SET indexed_status = 2\n        WHERE indexed_status = 0\n          AND rank_search > 27\n          AND address ? 'place'\n          AND ST_DWithin(newgeom, placex.geometry, diameter);\n    END IF;\n  END IF;\n  -- Roads may cause reparenting for POI places\n  IF address_rank BETWEEN 26 AND 27 THEN\n    UPDATE placex SET indexed_status = 2\n      WHERE indexed_status = 0\n        AND rank_search > 27\n        AND ST_DWithin(newgeom, placex.geometry, diameter);\n    UPDATE location_property_osmline SET indexed_status = 2\n      WHERE indexed_status = 0\n        AND startnumber is not null\n        AND ST_DWithin(newgeom, linegeo, diameter);\n  END IF;\n\n  RETURN TRUE;\nEND;\n$$ LANGUAGE plpgsql;\n"
  },
  {
    "path": "lib-sql/functions/utils.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\n-- Assorted helper functions for the triggers.\n\nCREATE OR REPLACE FUNCTION get_center_point(place GEOMETRY)\n  RETURNS GEOMETRY\n  AS $$\nDECLARE\n  geom_type TEXT;\nBEGIN\n  geom_type := ST_GeometryType(place);\n  IF geom_type = 'ST_Point' THEN\n    RETURN place;\n  END IF;\n  IF geom_type = 'ST_LineString' THEN\n    RETURN ST_ReducePrecision(ST_LineInterpolatePoint(place, 0.5), 0.0000001);\n  END IF;\n\n  RETURN ST_ReducePrecision(ST_PointOnSurface(place), 0.0000001);\nEND;\n$$\nLANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION geometry_sector(partition INTEGER, place GEOMETRY)\n  RETURNS INTEGER\n  AS $$\nBEGIN\n  RETURN (partition*1000000) + (500-ST_X(place)::INTEGER)*1000 + (500-ST_Y(place)::INTEGER);\nEND;\n$$\nLANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;\n\n\n\nCREATE OR REPLACE FUNCTION array_merge(a INTEGER[], b INTEGER[])\n  RETURNS INTEGER[]\n  AS $$\nDECLARE\n  i INTEGER;\n  r INTEGER[];\nBEGIN\n  IF array_upper(a, 1) IS NULL THEN\n    RETURN COALESCE(b, '{}'::INTEGER[]);\n  END IF;\n  IF array_upper(b, 1) IS NULL THEN\n    RETURN COALESCE(a, '{}'::INTEGER[]);\n  END IF;\n  r := a;\n  FOR i IN 1..array_upper(b, 1) LOOP\n    IF NOT (ARRAY[b[i]] <@ r) THEN\n      r := r || b[i];\n    END IF;\n  END LOOP;\n  RETURN r;\nEND;\n$$\nLANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;\n\n-- Return the node members with a given label from a relation member list\n-- as a set.\n--\n-- \\param members      Member list in osm2pgsql middle format.\n-- \\param memberLabels Array of labels to accept.\n--\n-- \\returns Set of OSM ids of nodes that are found.\n--\nCREATE OR REPLACE FUNCTION get_rel_node_members(members TEXT[],\n                                                memberLabels TEXT[])\n  RETURNS SETOF BIGINT\n  AS $$\nDECLARE\n  i INTEGER;\nBEGIN\n  FOR i IN 1..ARRAY_UPPER(members,1) BY 2 LOOP\n    IF members[i+1] = ANY(memberLabels)\n       AND upper(substring(members[i], 1, 1))::char(1) = 'N'\n    THEN\n      RETURN NEXT substring(members[i], 2)::bigint;\n    END IF;\n  END LOOP;\n\n  RETURN;\nEND;\n$$\nLANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION get_rel_node_members(members JSONB, memberLabels TEXT[])\n  RETURNS SETOF BIGINT\n  AS $$\nDECLARE\n  member JSONB;\nBEGIN\n  FOR member IN SELECT * FROM jsonb_array_elements(members)\n  LOOP\n    IF member->>'type' = 'N' and member->>'role' = ANY(memberLabels) THEN\n        RETURN NEXT (member->>'ref')::bigint;\n    END IF;\n  END LOOP;\n\n  RETURN;\nEND;\n$$\nLANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;\n\n\n-- Copy 'name' to or from the default language.\n--\n-- \\param country_code     Country code of the object being named.\n-- \\param[inout] name      List of names of the object.\n--\n-- If the country named by country_code has a single default language,\n-- then a `name` tag is copied to `name:<country_code>` if this tag does\n-- not yet exist and vice versa.\nCREATE OR REPLACE FUNCTION add_default_place_name(country_code VARCHAR(2),\n                                                  INOUT name HSTORE)\n  AS $$\nDECLARE\n  default_language VARCHAR(10);\nBEGIN\n  IF name is not null AND array_upper(akeys(name),1) > 1 THEN\n    default_language := get_country_language_code(country_code);\n    IF default_language IS NOT NULL THEN\n      IF name ? 'name' AND NOT name ? ('name:'||default_language) THEN\n        name := name || hstore(('name:'||default_language), (name -> 'name'));\n      ELSEIF name ? ('name:'||default_language) AND NOT name ? 'name' THEN\n        name := name || hstore('name', (name -> ('name:'||default_language)));\n      END IF;\n    END IF;\n  END IF;\nEND;\n$$\nLANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;\n\n\n-- Find the best-matching postcode for the given geometry\nCREATE OR REPLACE FUNCTION get_nearest_postcode(country VARCHAR(2), geom GEOMETRY)\n  RETURNS TEXT\n  AS $$\nDECLARE\n  outcode TEXT;\n  cnt INTEGER;\n  location RECORD;\nBEGIN\n    -- If the geometry is an area then only one postcode must be within\n    -- that area, otherwise consider the area as not having a postcode.\n    IF ST_GeometryType(geom) in ('ST_Polygon','ST_MultiPolygon') THEN\n      SELECT min(postcode), count(*) FROM\n        (SELECT postcode FROM location_postcodes\n           WHERE ST_Contains(geom, location_postcodes.centroid)\n                 AND country_code = country\n           LIMIT 2) sub\n        INTO outcode, cnt;\n\n        IF cnt = 1 THEN\n            RETURN outcode;\n        END IF;\n\n        RETURN null;\n    END IF;\n\n    -- Otherwise: be fully within the coverage area of a postcode\n    FOR location IN\n      SELECT postcode\n        FROM location_postcodes p\n       WHERE ST_Covers(p.geometry, geom)\n             AND p.country_code = country\n       ORDER BY osm_id is null, ST_Distance(p.centroid, geom)\n       LIMIT 1\n    LOOP\n        RETURN location.postcode;\n    END LOOP;\n\n    RETURN NULL;\nEND;\n$$\nLANGUAGE plpgsql STABLE PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION get_country_code(place geometry)\n  RETURNS TEXT\n  AS $$\nDECLARE\n  nearcountry RECORD;\n  countries TEXT[];\nBEGIN\n-- RAISE WARNING 'get_country_code, start: %', ST_AsText(place);\n\n  -- Try for a OSM polygon\n  SELECT array_agg(country_code) FROM location_area_country\n    WHERE country_code is not null and st_covers(geometry, place)\n    INTO countries;\n\n  IF array_length(countries, 1) = 1 THEN\n    RETURN countries[1];\n  END IF;\n\n  IF array_length(countries, 1) > 1 THEN\n    -- more than one country found, confirm against the fallback data what to choose\n    FOR nearcountry IN\n        SELECT country_code FROM country_osm_grid\n          WHERE ST_Covers(geometry, place) AND country_code = ANY(countries)\n          ORDER BY area ASC\n    LOOP\n        RETURN nearcountry.country_code;\n    END LOOP;\n    -- Still nothing? Choose the country code with the smallest partition number.\n    -- And failing that, just go by the alphabet.\n    FOR nearcountry IN\n        SELECT cc,\n               (SELECT partition FROM country_name WHERE country_code = cc) as partition\n        FROM unnest(countries) cc\n        ORDER BY partition, cc\n    LOOP\n        RETURN nearcountry.cc;\n    END LOOP;\n\n    -- Should never be reached.\n    RETURN countries[1];\n  END IF;\n\n-- RAISE WARNING 'osm fallback: %', ST_AsText(place);\n\n  -- Try for OSM fallback data\n  -- The order is to deal with places like HongKong that are 'states' within another polygon\n  FOR nearcountry IN\n    SELECT country_code from country_osm_grid\n    WHERE st_covers(geometry, place) order by area asc limit 1\n  LOOP\n    RETURN nearcountry.country_code;\n  END LOOP;\n\n-- RAISE WARNING 'near osm fallback: %', ST_AsText(place);\n\n  RETURN NULL;\nEND;\n$$\nLANGUAGE plpgsql STABLE PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION get_country_language_code(search_country_code VARCHAR(2))\n  RETURNS TEXT\n  AS $$\nDECLARE\n  nearcountry RECORD;\nBEGIN\n  FOR nearcountry IN\n    SELECT distinct country_default_language_code from country_name\n    WHERE country_code = search_country_code limit 1\n  LOOP\n    RETURN lower(nearcountry.country_default_language_code);\n  END LOOP;\n  RETURN NULL;\nEND;\n$$\nLANGUAGE plpgsql STABLE PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION get_partition(in_country_code VARCHAR(10))\n  RETURNS INTEGER\n  AS $$\nDECLARE\n  nearcountry RECORD;\nBEGIN\n  FOR nearcountry IN\n    SELECT partition from country_name where country_code = in_country_code\n  LOOP\n    RETURN nearcountry.partition;\n  END LOOP;\n  RETURN 0;\nEND;\n$$\nLANGUAGE plpgsql STABLE PARALLEL SAFE;\n\n\n-- Find the parent of an address with addr:street/addr:place tag.\n--\n-- \\param token_info Naming info with the address information.\n-- \\param partition  Partition where to search the parent.\n-- \\param centroid   Location of the address.\n--\n-- \\return Place ID of the parent if one was found, NULL otherwise.\nCREATE OR REPLACE FUNCTION find_parent_for_address(token_info JSONB,\n                                                   partition SMALLINT,\n                                                   centroid GEOMETRY)\n  RETURNS BIGINT\n  AS $$\nDECLARE\n  parent_place_id BIGINT;\nBEGIN\n  -- Check for addr:street attributes\n  parent_place_id := getNearestNamedRoadPlaceId(partition, centroid, token_info);\n  IF parent_place_id is not null THEN\n    {% if debug %}RAISE WARNING 'Get parent from addr:street: %', parent_place_id;{% endif %}\n    RETURN parent_place_id;\n  END IF;\n\n  -- Check for addr:place attributes.\n  parent_place_id := getNearestNamedPlacePlaceId(partition, centroid, token_info);\n  {% if debug %}RAISE WARNING 'Get parent from addr:place: %', parent_place_id;{% endif %}\n  RETURN parent_place_id;\nEND;\n$$\nLANGUAGE plpgsql STABLE PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION delete_location(OLD_place_id BIGINT)\n  RETURNS BOOLEAN\n  AS $$\nDECLARE\nBEGIN\n  DELETE FROM location_area where place_id = OLD_place_id;\n-- TODO:location_area\n  RETURN true;\nEND;\n$$\nLANGUAGE plpgsql;\n\n\n-- Return the bounding box of the geometry buffered by the given number\n-- of meters.\nCREATE OR REPLACE FUNCTION expand_by_meters(geom GEOMETRY, meters FLOAT)\n  RETURNS GEOMETRY\n  AS $$\n    SELECT ST_Envelope(ST_Buffer(geom::geography, meters, 1)::geometry)\n$$\nLANGUAGE sql IMMUTABLE PARALLEL SAFE;\n\n\n-- Create a bounding box with an extent computed from the radius (in meters)\n-- which in turn is derived from the given search rank.\nCREATE OR REPLACE FUNCTION place_node_fuzzy_area(geom GEOMETRY, rank_search INTEGER)\n  RETURNS GEOMETRY\n  AS $$\nDECLARE\n  radius FLOAT := 500;\nBEGIN\n  IF rank_search <= 16 THEN -- city\n    radius := 15000;\n  ELSIF rank_search <= 18 THEN -- town\n    radius := 4000;\n  ELSIF rank_search <= 19 THEN -- village\n    radius := 2000;\n  ELSIF rank_search  <= 20 THEN -- hamlet\n    radius := 1000;\n  END IF;\n\n  RETURN expand_by_meters(geom, radius);\nEND;\n$$\nLANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION add_location(place_id BIGINT, country_code varchar(2),\n                                        partition INTEGER, keywords INTEGER[],\n                                        rank_search INTEGER, rank_address INTEGER,\n                                        in_postcode TEXT, geometry GEOMETRY,\n                                        centroid GEOMETRY)\n  RETURNS BOOLEAN\n  AS $$\nDECLARE\n  postcode TEXT;\nBEGIN\n  -- add postcode only if it contains a single entry, i.e. ignore postcode lists\n  postcode := NULL;\n  IF in_postcode is not null AND in_postcode not similar to '%(,|;)%' THEN\n      postcode := upper(trim (in_postcode));\n  END IF;\n\n  IF ST_Dimension(geometry) = 2 THEN\n    RETURN insertLocationAreaLarge(partition, place_id, country_code, keywords,\n                                   rank_search, rank_address, false, postcode,\n                                   centroid, geometry);\n  END IF;\n\n  IF ST_Dimension(geometry) = 0 THEN\n    RETURN insertLocationAreaLarge(partition, place_id, country_code, keywords,\n                                   rank_search, rank_address, true, postcode,\n                                   centroid, place_node_fuzzy_area(geometry, rank_search));\n  END IF;\n\n  RETURN false;\nEND;\n$$\nLANGUAGE plpgsql;\n\n\nCREATE OR REPLACE FUNCTION quad_split_geometry(geometry GEOMETRY, maxarea FLOAT,\n                                               maxdepth INTEGER)\n  RETURNS SETOF GEOMETRY\n  AS $$\nDECLARE\n  xmin FLOAT;\n  ymin FLOAT;\n  xmax FLOAT;\n  ymax FLOAT;\n  xmid FLOAT;\n  ymid FLOAT;\n  secgeo GEOMETRY;\n  secbox GEOMETRY;\n  seg INTEGER;\n  geo RECORD;\n  area FLOAT;\n  remainingdepth INTEGER;\nBEGIN\n--  RAISE WARNING 'quad_split_geometry: maxarea=%, depth=%',maxarea,maxdepth;\n\n  IF not ST_IsValid(geometry) THEN\n    RETURN;\n  END IF;\n\n  IF ST_Dimension(geometry) != 2 OR maxdepth <= 1 THEN\n    RETURN NEXT geometry;\n    RETURN;\n  END IF;\n\n  remainingdepth := maxdepth - 1;\n  area := ST_AREA(geometry);\n  IF area < maxarea THEN\n    RETURN NEXT geometry;\n    RETURN;\n  END IF;\n\n  xmin := st_xmin(geometry);\n  xmax := st_xmax(geometry);\n  ymin := st_ymin(geometry);\n  ymax := st_ymax(geometry);\n  secbox := ST_SetSRID(ST_MakeBox2D(ST_Point(ymin,xmin),ST_Point(ymax,xmax)),4326);\n\n  -- if the geometry completely covers the box don't bother to slice any more\n  IF ST_AREA(secbox) = area THEN\n    RETURN NEXT geometry;\n    RETURN;\n  END IF;\n\n  xmid := (xmin+xmax)/2;\n  ymid := (ymin+ymax)/2;\n\n  FOR seg IN 1..4 LOOP\n\n    IF seg = 1 THEN\n      secbox := ST_SetSRID(ST_MakeBox2D(ST_Point(xmin,ymin),ST_Point(xmid,ymid)),4326);\n    END IF;\n    IF seg = 2 THEN\n      secbox := ST_SetSRID(ST_MakeBox2D(ST_Point(xmin,ymid),ST_Point(xmid,ymax)),4326);\n    END IF;\n    IF seg = 3 THEN\n      secbox := ST_SetSRID(ST_MakeBox2D(ST_Point(xmid,ymin),ST_Point(xmax,ymid)),4326);\n    END IF;\n    IF seg = 4 THEN\n      secbox := ST_SetSRID(ST_MakeBox2D(ST_Point(xmid,ymid),ST_Point(xmax,ymax)),4326);\n    END IF;\n\n    secgeo := st_intersection(geometry, secbox);\n    IF NOT ST_IsEmpty(secgeo) AND ST_Dimension(secgeo) = 2 THEN\n      FOR geo IN SELECT quad_split_geometry(secgeo, maxarea, remainingdepth) as geom LOOP\n        IF NOT ST_IsEmpty(geo.geom) AND ST_Dimension(geo.geom) = 2 THEN\n          RETURN NEXT geo.geom;\n        END IF;\n      END LOOP;\n    END IF;\n  END LOOP;\n\n  RETURN;\nEND;\n$$\nLANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION split_geometry(geometry GEOMETRY)\n  RETURNS SETOF GEOMETRY\n  AS $$\nDECLARE\n  geo RECORD;\nBEGIN\n  IF ST_GeometryType(geometry) = 'ST_MultiPolygon'\n     and ST_Area(geometry) * 10 > ST_Area(Box2D(geometry))\n  THEN\n    FOR geo IN\n        SELECT quad_split_geometry(g, 0.25, 20) as geom\n        FROM (SELECT (ST_Dump(geometry)).geom::geometry(Polygon, 4326) AS g) xx\n    LOOP\n      RETURN NEXT geo.geom;\n    END LOOP;\n  ELSE\n    FOR geo IN\n        SELECT quad_split_geometry(geometry, 0.25, 20) as geom\n    LOOP\n      RETURN NEXT geo.geom;\n    END LOOP;\n  END IF;\n  RETURN;\nEND;\n$$\nLANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;\n\nCREATE OR REPLACE FUNCTION simplify_large_polygons(geometry GEOMETRY)\n  RETURNS GEOMETRY\n  AS $$\nBEGIN\n  IF ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon')\n     and ST_MemSize(geometry) > 3000000\n  THEN\n    geometry := ST_SimplifyPreserveTopology(geometry, 0.0001);\n  END IF;\n  RETURN geometry;\nEND;\n$$\nLANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION place_force_delete(placeid BIGINT)\n  RETURNS BOOLEAN\n  AS $$\nDECLARE\n    osmid BIGINT;\n    osmtype character(1);\n    pclass text;\n    ptype text;\nBEGIN\n  SELECT osm_type, osm_id, class, type FROM placex WHERE place_id = placeid INTO osmtype, osmid, pclass, ptype;\n  DELETE FROM import_polygon_delete where osm_type = osmtype and osm_id = osmid and class = pclass and type = ptype;\n  DELETE FROM import_polygon_error where osm_type = osmtype and osm_id = osmid and class = pclass and type = ptype;\n  -- force delete by directly entering it into the to-be-deleted table\n  INSERT INTO place_to_be_deleted (osm_type, osm_id, class, type, deferred)\n         VALUES(osmtype, osmid, pclass, ptype, false);\n  PERFORM flush_deleted_places();\n\n  RETURN TRUE;\nEND;\n$$\nLANGUAGE plpgsql;\n\n\nCREATE OR REPLACE FUNCTION place_force_update(placeid BIGINT)\n  RETURNS BOOLEAN\n  AS $$\nDECLARE\n  placegeom GEOMETRY;\n  geom GEOMETRY;\n  diameter FLOAT;\n  rank SMALLINT;\nBEGIN\n  UPDATE placex SET indexed_status = 2 WHERE place_id = placeid;\n\n  SELECT geometry, rank_address INTO placegeom, rank\n    FROM placex WHERE place_id = placeid;\n\n  IF placegeom IS NOT NULL AND ST_IsValid(placegeom) THEN\n    IF ST_GeometryType(placegeom) in ('ST_Polygon','ST_MultiPolygon')\n       AND rank > 0\n    THEN\n      FOR geom IN SELECT split_geometry(placegeom) LOOP\n        UPDATE placex SET indexed_status = 2\n         WHERE ST_Intersects(geom, placex.geometry)\n               and indexed_status = 0\n               and ((rank_address = 0 and rank_search > rank) or rank_address > rank)\n               and (rank_search < 28 or name is not null or (rank >= 16 and address ? 'place'));\n      END LOOP;\n    ELSE\n        diameter := update_place_diameter(rank);\n        IF diameter > 0 THEN\n          IF rank >= 26 THEN\n            -- roads may cause reparenting for >27 rank places\n            update placex set indexed_status = 2 where indexed_status = 0 and rank_search > rank and ST_DWithin(placex.geometry, placegeom, diameter);\n          ELSEIF rank >= 16 THEN\n            -- up to rank 16, street-less addresses may need reparenting\n            update placex set indexed_status = 2 where indexed_status = 0 and rank_search > rank and ST_DWithin(placex.geometry, placegeom, diameter) and (rank_search < 28 or name is not null or address ? 'place');\n          ELSE\n            -- for all other places the search terms may change as well\n            update placex set indexed_status = 2 where indexed_status = 0 and rank_search > rank and ST_DWithin(placex.geometry, placegeom, diameter) and (rank_search < 28 or name is not null);\n          END IF;\n        END IF;\n    END IF;\n    RETURN TRUE;\n  END IF;\n\n  RETURN FALSE;\nEND;\n$$\nLANGUAGE plpgsql;\n\nCREATE OR REPLACE FUNCTION flush_deleted_places()\n  RETURNS INTEGER\n  AS $$\nBEGIN\n  -- deleting large polygons can have a massive effect on the system - require manual intervention to let them through\n  INSERT INTO import_polygon_delete (osm_type, osm_id, class, type)\n    SELECT osm_type, osm_id, class, type FROM place_to_be_deleted WHERE deferred;\n\n  -- delete from place table\n  ALTER TABLE place DISABLE TRIGGER place_before_delete;\n  DELETE FROM place USING place_to_be_deleted\n    WHERE place.osm_type = place_to_be_deleted.osm_type\n          and place.osm_id = place_to_be_deleted.osm_id\n          and place.class = place_to_be_deleted.class\n          and place.type = place_to_be_deleted.type\n          and not deferred;\n  ALTER TABLE place ENABLE TRIGGER place_before_delete;\n\n  -- Mark for delete in the placex table\n  UPDATE placex SET indexed_status = 100 FROM place_to_be_deleted\n    WHERE placex.osm_type = 'N' and place_to_be_deleted.osm_type = 'N'\n          and placex.osm_id = place_to_be_deleted.osm_id\n          and placex.class = place_to_be_deleted.class\n          and placex.type = place_to_be_deleted.type\n          and not deferred;\n  UPDATE placex SET indexed_status = 100 FROM place_to_be_deleted\n    WHERE placex.osm_type = 'W' and place_to_be_deleted.osm_type = 'W'\n          and placex.osm_id = place_to_be_deleted.osm_id\n          and placex.class = place_to_be_deleted.class\n          and placex.type = place_to_be_deleted.type\n          and not deferred;\n  UPDATE placex SET indexed_status = 100 FROM place_to_be_deleted\n    WHERE placex.osm_type = 'R' and place_to_be_deleted.osm_type = 'R'\n          and placex.osm_id = place_to_be_deleted.osm_id\n          and placex.class = place_to_be_deleted.class\n          and placex.type = place_to_be_deleted.type\n          and not deferred;\n\n  -- Clear todo list.\n  TRUNCATE TABLE place_to_be_deleted;\n\n   -- delete from place_interpolation table\n  ALTER TABLE place_interpolation DISABLE TRIGGER place_interpolation_before_delete;\n  DELETE FROM place_interpolation p USING place_interpolation_to_be_deleted d\n    WHERE p.osm_id = d.osm_id;\n  ALTER TABLE place_interpolation ENABLE TRIGGER place_interpolation_before_delete;\n\n  UPDATE location_property_osmline o SET indexed_status = 100\n    FROM place_interpolation_to_be_deleted d\n    WHERE o.osm_id = d.osm_id;\n\n  TRUNCATE TABLE place_interpolation_to_be_deleted;\n\n  RETURN NULL;\nEND;\n$$ LANGUAGE plpgsql;\n\n\nCREATE OR REPLACE FUNCTION place_update_entrances(placeid BIGINT, osmid BIGINT)\n  RETURNS INTEGER\n  AS $$\nDECLARE\n  entrance RECORD;\n  osm_ids BIGINT[];\nBEGIN\n  osm_ids := '{}';\n  FOR entrance in SELECT osm_id, type, geometry, extratags\n      FROM place_entrance\n      WHERE osm_id IN (SELECT unnest(nodes) FROM planet_osm_ways WHERE id=osmid)\n  LOOP\n    osm_ids := array_append(osm_ids, entrance.osm_id);\n    INSERT INTO placex_entrance (place_id, osm_id, type, location, extratags)\n      VALUES (placeid, entrance.osm_id, entrance.type, entrance.geometry, entrance.extratags)\n      ON CONFLICT (place_id, osm_id) DO UPDATE\n        SET type = excluded.type, location = excluded.location, extratags = excluded.extratags;\n  END LOOP;\n\n  IF array_length(osm_ids, 1) > 0 THEN\n    DELETE FROM placex_entrance WHERE place_id=placeid AND NOT osm_id=ANY(osm_ids);\n  ELSE\n    DELETE FROM placex_entrance WHERE place_id=placeid;\n  END IF;\n\n  RETURN NULL;\nEND;\n$$\nLANGUAGE plpgsql;\n"
  },
  {
    "path": "lib-sql/functions.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\n{% include('functions/utils.sql') %}\n{% include('functions/ranking.sql') %}\n{% include('functions/importance.sql') %}\n{% include('functions/interpolation.sql') %}\n{% include('functions/updates.sql') %}\n\n{% if 'place' in db.tables %}\n    {% include 'functions/place_triggers.sql' %}\n{% endif %}\n\n{% if 'placex' in db.tables %}\n    {% include 'functions/placex_triggers.sql' %}\n{% endif %}\n\n{% if 'location_postcodes' in db.tables %}\n    {% include 'functions/postcode_triggers.sql' %}\n{% endif %}\n\n{% include('functions/partition-functions.sql') %}\n{% include('functions/associated_street_triggers.sql') %}\n"
  },
  {
    "path": "lib-sql/grants.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n--\n-- Grant read-only access to the web user for all Nominatim tables.\n\n-- Core tables\nGRANT SELECT ON import_status TO \"{{config.DATABASE_WEBUSER}}\";\nGRANT SELECT ON country_name TO \"{{config.DATABASE_WEBUSER}}\";\nGRANT SELECT ON nominatim_properties TO \"{{config.DATABASE_WEBUSER}}\";\n\n-- Location tables\nGRANT SELECT ON location_property_tiger TO \"{{config.DATABASE_WEBUSER}}\";\nGRANT SELECT ON location_property_osmline TO \"{{config.DATABASE_WEBUSER}}\";\nGRANT SELECT ON location_postcodes TO \"{{config.DATABASE_WEBUSER}}\";\n\n-- Search tables\n{% if not db.reverse_only %}\nGRANT SELECT ON search_name TO \"{{config.DATABASE_WEBUSER}}\";\n{% endif %}\n\n-- Main place tables\nGRANT SELECT ON placex TO \"{{config.DATABASE_WEBUSER}}\";\nGRANT SELECT ON place_addressline TO \"{{config.DATABASE_WEBUSER}}\";\nGRANT SELECT ON placex_entrance TO \"{{config.DATABASE_WEBUSER}}\";\n\n-- Error/delete tracking tables\nGRANT SELECT ON import_polygon_error TO \"{{config.DATABASE_WEBUSER}}\";\nGRANT SELECT ON import_polygon_delete TO \"{{config.DATABASE_WEBUSER}}\";\n\n-- Country grid\nGRANT SELECT ON country_osm_grid TO \"{{config.DATABASE_WEBUSER}}\";\n\n-- Tokenizer tables (word table)\n{% if 'word' in db.tables %}\nGRANT SELECT ON word TO \"{{config.DATABASE_WEBUSER}}\";\n{% endif %}\n\n-- Special phrase tables\n{% for table in db.tables %}\n{% if table.startswith('place_classtype_') %}\nGRANT SELECT ON {{ table }} TO \"{{config.DATABASE_WEBUSER}}\";\n{% endif %}\n{% endfor %}"
  },
  {
    "path": "lib-sql/indices.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\n-- Indices used only during search and update.\n-- These indices are created only after the indexing process is done.\n\nCREATE INDEX IF NOT EXISTS idx_place_addressline_address_place_id\n  ON place_addressline USING BTREE (address_place_id) {{db.tablespace.search_index}};\n---\nCREATE INDEX IF NOT EXISTS idx_placex_rank_search\n  ON placex USING BTREE (rank_search) {{db.tablespace.search_index}};\n---\nCREATE INDEX IF NOT EXISTS idx_placex_rank_address\n  ON placex USING BTREE (rank_address) {{db.tablespace.search_index}};\n---\nCREATE INDEX IF NOT EXISTS idx_placex_parent_place_id\n  ON placex USING BTREE (parent_place_id) {{db.tablespace.search_index}}\n  WHERE parent_place_id IS NOT NULL;\n---\nCREATE INDEX IF NOT EXISTS idx_placex_geometry ON placex\n  USING GIST (geometry) {{db.tablespace.search_index}};\n---\n-- Index is needed during import but can be dropped as soon as a full\n-- geometry index is in place. The partial index is almost as big as the full\n-- index.\nDROP INDEX IF EXISTS idx_placex_geometry_lower_rank_ways;\n---\nCREATE INDEX IF NOT EXISTS idx_placex_geometry_reverse_lookupPolygon\n  ON placex USING gist (geometry) {{db.tablespace.search_index}}\n  WHERE St_GeometryType(geometry) in ('ST_Polygon', 'ST_MultiPolygon')\n    AND rank_address between 4 and 25\n    AND name is not null AND indexed_status = 0 AND linked_place_id is null;\n---\n-- used in reverse large area lookup\nCREATE INDEX IF NOT EXISTS idx_placex_geometry_reverse_lookupPlaceNode\n  ON placex USING gist (ST_Buffer(geometry, reverse_place_diameter(rank_search)))\n  {{db.tablespace.search_index}}\n  WHERE rank_address between 4 and 25\n    AND name is not null AND linked_place_id is null AND osm_type = 'N';\n---\nCREATE INDEX IF NOT EXISTS idx_osmline_parent_place_id\n  ON location_property_osmline USING BTREE (parent_place_id) {{db.tablespace.search_index}}\n  WHERE parent_place_id is not null;\n---\nCREATE INDEX IF NOT EXISTS idx_osmline_parent_osm_id\n  ON location_property_osmline USING BTREE (osm_id) {{db.tablespace.search_index}};\n\n{% if drop %}\n---\n  DROP INDEX IF EXISTS idx_placex_geometry_address_area_candidates;\n  DROP INDEX IF EXISTS idx_placex_geometry_buildings;\n  DROP INDEX IF EXISTS idx_placex_wikidata;\n  DROP INDEX IF EXISTS idx_placex_rank_address_sector;\n  DROP INDEX IF EXISTS idx_placex_rank_boundaries_sector;\n{% else %}\n-- Indices only needed for updating.\n---\n  CREATE INDEX IF NOT EXISTS idx_location_area_country_place_id\n    ON location_area_country USING BTREE (place_id) {{db.tablespace.address_index}};\n---\n  CREATE UNIQUE INDEX IF NOT EXISTS idx_place_osm_unique\n    ON place USING btree(osm_id, osm_type, class, type) {{db.tablespace.address_index}};\n---\n-- Table needed for running updates with osm2pgsql on place.\n  CREATE TABLE IF NOT EXISTS place_to_be_deleted (\n    osm_type CHAR(1) NOT NULL,\n    osm_id BIGINT NOT NULL,\n    class TEXT NOT NULL,\n    type TEXT NOT NULL,\n    deferred BOOLEAN NOT NULL\n   );\n\n  CREATE TABLE IF NOT EXISTS place_interpolation_to_be_deleted (\n    osm_id BIGINT NOT NULL\n   );\n---\n  CREATE INDEX IF NOT EXISTS idx_location_postcodes_parent_place_id\n    ON location_postcodes USING BTREE (parent_place_id) {{db.tablespace.address_index}};\n{% endif %}\n\n-- Indices only needed for search.\n{% if 'search_name' in db.tables %}\n---\n  CREATE INDEX IF NOT EXISTS idx_search_name_nameaddress_vector\n    ON search_name USING GIN (nameaddress_vector) WITH (fastupdate = off) {{db.tablespace.search_index}};\n---\n  CREATE INDEX IF NOT EXISTS idx_search_name_name_vector\n    ON search_name USING GIN (name_vector) WITH (fastupdate = off) {{db.tablespace.search_index}};\n---\n  CREATE INDEX IF NOT EXISTS idx_search_name_centroid\n    ON search_name USING GIST (centroid) {{db.tablespace.search_index}};\n---\n  CREATE INDEX IF NOT EXISTS idx_placex_housenumber\n    ON placex USING btree (parent_place_id)\n    INCLUDE (housenumber) {{db.tablespace.search_index}}\n    WHERE housenumber is not null;\n---\n  CREATE INDEX IF NOT EXISTS idx_osmline_parent_osm_id_with_hnr\n    ON location_property_osmline USING btree(parent_place_id)\n    INCLUDE (startnumber, endnumber) {{db.tablespace.search_index}}\n    WHERE startnumber is not null;\n{% endif %}\n"
  },
  {
    "path": "lib-sql/partition-tables.src.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\ndrop table IF EXISTS search_name_blank CASCADE;\nCREATE TABLE search_name_blank (\n  place_id BIGINT NOT NULL,\n  address_rank smallint NOT NULL,\n  name_vector integer[] NOT NULL,\n  centroid GEOMETRY(Geometry, 4326) NOT NULL\n  );\n\n{% for partition in db.partitions %}\n  CREATE TABLE location_area_large_{{ partition }} () INHERITS (location_area_large) {{db.tablespace.address_data}};\n  CREATE INDEX idx_location_area_large_{{ partition }}_place_id\n    ON location_area_large_{{ partition }}\n    USING BTREE (place_id) {{db.tablespace.address_index}};\n  CREATE INDEX idx_location_area_large_{{ partition }}_geometry\n    ON location_area_large_{{ partition }}\n    USING GIST (geometry) {{db.tablespace.address_index}};\n\n  CREATE TABLE search_name_{{ partition }} () INHERITS (search_name_blank) {{db.tablespace.address_data}};\n  CREATE UNIQUE INDEX idx_search_name_{{ partition }}_place_id\n    ON search_name_{{ partition }}\n    USING BTREE (place_id) {{db.tablespace.address_index}};\n  CREATE INDEX idx_search_name_{{ partition }}_centroid_street\n    ON search_name_{{ partition }} USING GIST (centroid) {{db.tablespace.address_index}}\n    WHERE address_rank between 26 and 27;\n  CREATE INDEX idx_search_name_{{ partition }}_centroid_place\n    ON search_name_{{ partition }} USING GIST (centroid) {{db.tablespace.address_index}}\n    WHERE address_rank between 2 and 25;\n\n  DROP TABLE IF EXISTS location_road_{{ partition }};\n  CREATE TABLE location_road_{{ partition }} (\n    place_id BIGINT NOT NULL,\n    partition SMALLINT NOT NULL,\n    country_code VARCHAR(2),\n    geometry GEOMETRY(Geometry, 4326) NOT NULL\n    ) {{db.tablespace.address_data}};\n  CREATE INDEX idx_location_road_{{ partition }}_geometry\n    ON location_road_{{ partition }}\n    USING GIST (geometry) {{db.tablespace.address_index}};\n  CREATE UNIQUE INDEX idx_location_road_{{ partition }}_place_id\n    ON location_road_{{ partition }}\n    USING BTREE (place_id) {{db.tablespace.address_index}};\n{% endfor %}\n"
  },
  {
    "path": "lib-sql/postcode_tables.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2022 by the Nominatim developer community.\n-- For a full list of authors see the git log.\nDROP TABLE IF EXISTS gb_postcode;\nCREATE TABLE gb_postcode (\n    id integer,\n    postcode character varying(9),\n    geometry geometry,\n    CONSTRAINT enforce_dims_geometry CHECK ((st_ndims(geometry) = 2)),\n    CONSTRAINT enforce_srid_geometry CHECK ((st_srid(geometry) = 4326))\n);\n\nDROP TABLE IF EXISTS us_postcode;\nCREATE TABLE us_postcode (\n    postcode text,\n    x double precision,\n    y double precision\n);\n"
  },
  {
    "path": "lib-sql/table-triggers.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\n-- insert creates the location tables, creates location indexes if indexed == true\nCREATE TRIGGER placex_before_insert BEFORE INSERT ON placex\n    FOR EACH ROW EXECUTE PROCEDURE placex_insert();\nCREATE TRIGGER osmline_before_insert BEFORE INSERT ON location_property_osmline\n    FOR EACH ROW EXECUTE PROCEDURE osmline_insert();\n\n-- update insert creates the location tables\nCREATE TRIGGER placex_before_update BEFORE UPDATE ON placex\n    FOR EACH ROW EXECUTE PROCEDURE placex_update();\nCREATE TRIGGER osmline_before_update BEFORE UPDATE ON location_property_osmline\n    FOR EACH ROW EXECUTE PROCEDURE osmline_update();\n\n-- diff update triggers\nCREATE TRIGGER placex_before_delete AFTER DELETE ON placex\n    FOR EACH ROW EXECUTE PROCEDURE placex_delete();\nCREATE TRIGGER place_before_delete BEFORE DELETE ON place\n    FOR EACH ROW EXECUTE PROCEDURE place_delete();\nCREATE TRIGGER place_before_insert BEFORE INSERT ON place\n    FOR EACH ROW EXECUTE PROCEDURE place_insert();\n\nCREATE TRIGGER location_postcode_before_update BEFORE UPDATE ON location_postcodes\n    FOR EACH ROW EXECUTE PROCEDURE postcodes_update();\nCREATE TRIGGER location_postcodes_before_delete BEFORE DELETE ON location_postcodes\n    FOR EACH ROW EXECUTE PROCEDURE postcodes_delete();\nCREATE TRIGGER location_postcodes_before_insert BEFORE INSERT ON location_postcodes\n    FOR EACH ROW EXECUTE PROCEDURE postcodes_insert();\n\nCREATE TRIGGER place_interpolation_before_insert BEFORE INSERT ON place_interpolation\n    FOR EACH ROW EXECUTE PROCEDURE place_interpolation_insert();\nCREATE TRIGGER place_interpolation_before_delete BEFORE DELETE ON place_interpolation\n    FOR EACH ROW EXECUTE PROCEDURE place_interpolation_delete();\n\n-- Propagate changes to associatedStreet relations to house members\n-- so that the indexer re-computes their parent_place_id.\nCREATE TRIGGER place_associated_street_update\n    AFTER INSERT OR DELETE ON place_associated_street\n    FOR EACH ROW EXECUTE FUNCTION invalidate_associated_street_members();\n"
  },
  {
    "path": "lib-sql/tables/addressline.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\nDROP TABLE IF EXISTS place_addressline;\n\nCREATE TABLE place_addressline (\n  place_id BIGINT NOT NULL,\n  address_place_id BIGINT NOT NULL,\n  distance FLOAT NOT NULL,\n  cached_rank_address SMALLINT NOT NULL,\n  fromarea boolean NOT NULL,\n  isaddress boolean NOT NULL\n  ) {{db.tablespace.search_data}};\n\nCREATE INDEX idx_place_addressline_place_id ON place_addressline\n  USING BTREE (place_id) {{db.tablespace.search_index}};\n"
  },
  {
    "path": "lib-sql/tables/entrance.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\n-- Table to store location of entrance nodes\nDROP TABLE IF EXISTS placex_entrance;\n\nCREATE TABLE placex_entrance (\n  place_id BIGINT NOT NULL,\n  osm_id BIGINT NOT NULL,\n  type TEXT NOT NULL,\n  location GEOMETRY(Point, 4326) NOT NULL,\n  extratags HSTORE\n  );\n\nCREATE UNIQUE INDEX idx_placex_entrance_place_id_osm_id ON placex_entrance\n  USING BTREE (place_id, osm_id) {{db.tablespace.search_index}};\n"
  },
  {
    "path": "lib-sql/tables/import_reports.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\nDROP TABLE IF EXISTS import_polygon_error;\nCREATE TABLE import_polygon_error (\n  osm_id BIGINT,\n  osm_type CHAR(1),\n  class TEXT NOT NULL,\n  type TEXT NOT NULL,\n  name HSTORE,\n  country_code varchar(2),\n  updated timestamp,\n  errormessage text,\n  prevgeometry GEOMETRY(Geometry, 4326),\n  newgeometry GEOMETRY(Geometry, 4326)\n  );\n\nCREATE INDEX idx_import_polygon_error_osmid ON import_polygon_error\n  USING BTREE (osm_type, osm_id);\n\n\nDROP TABLE IF EXISTS import_polygon_delete;\nCREATE TABLE import_polygon_delete (\n  osm_id BIGINT,\n  osm_type CHAR(1),\n  class TEXT NOT NULL,\n  type TEXT NOT NULL\n  );\n\nCREATE INDEX idx_import_polygon_delete_osmid ON import_polygon_delete\n  USING BTREE (osm_type, osm_id);\n"
  },
  {
    "path": "lib-sql/tables/importance_tables.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\n{% if 'wikimedia_importance' not in db.tables and 'wikipedia_article' not in db.tables %}\n-- create dummy tables here if nothing was imported\nCREATE TABLE wikimedia_importance (\n  language TEXT NOT NULL,\n  title TEXT NOT NULL,\n  importance double precision NOT NULL,\n  wikidata TEXT\n)  {{db.tablespace.address_data}};\n{% endif %}\n"
  },
  {
    "path": "lib-sql/tables/interpolation.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\nDROP TABLE IF EXISTS location_property_osmline;\nCREATE TABLE location_property_osmline (\n    place_id BIGINT NOT NULL,\n    osm_id BIGINT NOT NULL,\n    parent_place_id BIGINT,\n    geometry_sector INTEGER NOT NULL,\n    indexed_date TIMESTAMP,\n    type TEXT,\n    startnumber INTEGER,\n    endnumber INTEGER,\n    step SMALLINT,\n    partition SMALLINT NOT NULL,\n    indexed_status SMALLINT NOT NULL,\n    linegeo GEOMETRY(Geometry, 4326) NOT NULL,\n    address HSTORE,\n    token_info JSONB, -- custom column for tokenizer use only\n    postcode TEXT,\n    country_code VARCHAR(2)\n  ){{db.tablespace.search_data}};\n\nCREATE UNIQUE INDEX idx_osmline_place_id ON location_property_osmline\n  USING BTREE (place_id) {{db.tablespace.search_index}};\nCREATE INDEX idx_osmline_geometry_sector ON location_property_osmline\n  USING BTREE (geometry_sector) {{db.tablespace.address_index}};\nCREATE INDEX idx_osmline_linegeo ON location_property_osmline\n  USING GIST (linegeo) {{db.tablespace.search_index}}\n  WHERE startnumber is not null;\n\n"
  },
  {
    "path": "lib-sql/tables/location_area.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\nDROP TABLE IF EXISTS location_area CASCADE;\nCREATE TABLE location_area (\n  place_id BIGINT NOT NULL,\n  keywords INTEGER[] NOT NULL,\n  partition SMALLINT NOT NULL,\n  rank_search SMALLINT NOT NULL,\n  rank_address SMALLINT NOT NULL,\n  country_code VARCHAR(2),\n  isguess BOOL NOT NULL,\n  postcode TEXT,\n  centroid GEOMETRY(Point, 4326) NOT NULL,\n  geometry GEOMETRY(Geometry, 4326) NOT NULL\n  );\n\nCREATE TABLE location_area_large () INHERITS (location_area);\n\nDROP TABLE IF EXISTS location_area_country;\nCREATE TABLE location_area_country (\n  place_id BIGINT NOT NULL,\n  country_code varchar(2) NOT NULL,\n  geometry GEOMETRY(Geometry, 4326) NOT NULL\n  ) {{db.tablespace.address_data}};\n\nCREATE INDEX idx_location_area_country_geometry ON location_area_country\n  USING GIST (geometry) {{db.tablespace.address_index}};\n"
  },
  {
    "path": "lib-sql/tables/nominatim_properties.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\nDROP TABLE IF EXISTS nominatim_properties;\nCREATE TABLE nominatim_properties (\n    property TEXT NOT NULL,\n    value TEXT\n);\n"
  },
  {
    "path": "lib-sql/tables/placex.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\n-- placex - main table for searchable places\n\nDROP TABLE IF EXISTS placex;\nCREATE TABLE placex (\n  place_id BIGINT NOT NULL,\n  parent_place_id BIGINT,\n  linked_place_id BIGINT,\n  importance FLOAT NOT NULL,\n  indexed_date TIMESTAMP,\n  geometry_sector INTEGER NOT NULL,\n  rank_address SMALLINT NOT NULL,\n  rank_search SMALLINT NOT NULL,\n  partition SMALLINT NOT NULL,\n  indexed_status SMALLINT NOT NULL,\n  LIKE place INCLUDING CONSTRAINTS,\n  wikipedia TEXT, -- calculated wikipedia article name (language:title)\n  token_info JSONB, -- custom column for tokenizer use only\n  country_code varchar(2),\n  housenumber TEXT,\n  postcode TEXT,\n  centroid GEOMETRY(Geometry, 4326) NOT NULL\n  ) {{db.tablespace.search_data}};\n\nCREATE UNIQUE INDEX idx_place_id ON placex USING BTREE (place_id) {{db.tablespace.search_index}};\n{% for osm_type in ('N', 'W', 'R') %}\nCREATE INDEX idx_placex_osmid_{{osm_type | lower}} ON placex\n  USING BTREE (osm_id) {{db.tablespace.search_index}}\n  WHERE osm_type = '{{osm_type}}';\n{% endfor %}\n\n-- Usage: - removing linkage status on update\n--        - lookup linked places for /details\nCREATE INDEX idx_placex_linked_place_id ON placex\n  USING BTREE (linked_place_id) {{db.tablespace.address_index}}\n  WHERE linked_place_id IS NOT NULL;\n\n-- Usage: - check that admin boundaries do not overtake each other rank-wise\n--        - check that place node in a admin boundary with the same address level\n--        - boundary is not completely contained in a place area\n--        - parenting of large-area or unparentable features\nCREATE INDEX idx_placex_geometry_address_area_candidates ON placex\n  USING gist (geometry) {{db.tablespace.address_index}}\n  WHERE rank_address between 1 and 25\n        and ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon');\n\n-- Usage: - POI is within building with housenumber\nCREATE INDEX idx_placex_geometry_buildings ON placex\n  USING SPGIST (geometry) {{db.tablespace.address_index}}\n  WHERE address is not null and rank_search = 30\n        and ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon');\n\n-- Usage: - linking of similar named places to boundaries\n--        - linking of place nodes with same type to boundaries\nCREATE INDEX idx_placex_geometry_placenode ON placex\n  USING SPGIST (geometry) {{db.tablespace.address_index}}\n  WHERE osm_type = 'N' and rank_search < 26 and class = 'place';\n\n-- Usage: - is node part of a way?\n--        - find parent of interpolation spatially\nCREATE INDEX idx_placex_geometry_lower_rank_ways ON placex\n  USING SPGIST (geometry) {{db.tablespace.address_index}}\n  WHERE osm_type = 'W' and rank_search >= 26;\n\n-- Usage: - linking place nodes by wikidata tag to boundaries\nCREATE INDEX idx_placex_wikidata on placex\n  USING BTREE ((extratags -> 'wikidata')) {{db.tablespace.address_index}}\n  WHERE extratags ? 'wikidata' and class = 'place'\n        and osm_type = 'N' and rank_search < 26;\n\n-- The following two indexes function as a todo list for indexing.\n\nCREATE INDEX idx_placex_rank_address_sector ON placex\n  USING BTREE (rank_address, geometry_sector) {{db.tablespace.address_index}}\n  WHERE indexed_status > 0;\n\nCREATE INDEX idx_placex_rank_boundaries_sector ON placex\n  USING BTREE (rank_search, geometry_sector) {{db.tablespace.address_index}}\n  WHERE class = 'boundary' and type = 'administrative'\n        and indexed_status > 0;\n\n"
  },
  {
    "path": "lib-sql/tables/postcodes.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\nDROP TABLE IF EXISTS location_postcodes;\nCREATE TABLE location_postcodes (\n  place_id BIGINT NOT NULL,\n  parent_place_id BIGINT,\n  osm_id BIGINT,\n  rank_search SMALLINT NOT NULL,\n  indexed_status SMALLINT NOT NULL,\n  indexed_date TIMESTAMP,\n  country_code varchar(2) NOT NULL,\n  postcode TEXT NOT NULL,\n  centroid GEOMETRY(Geometry, 4326) NOT NULL,\n  geometry GEOMETRY(Geometry, 4326) NOT NULL\n  );\n\nCREATE UNIQUE INDEX idx_location_postcodes_id ON location_postcodes\n  USING BTREE (place_id) {{db.tablespace.search_index}};\nCREATE INDEX idx_location_postcodes_geometry ON location_postcodes\n  USING GIST (geometry) {{db.tablespace.search_index}};\nCREATE INDEX idx_location_postcodes_centroid ON location_postcodes\n  USING GIST (centroid) {{db.tablespace.search_index}};\nCREATE INDEX IF NOT EXISTS idx_location_postcodes_postcode ON location_postcodes\n  USING BTREE (postcode, country_code) {{db.tablespace.search_index}};\nCREATE INDEX IF NOT EXISTS idx_location_postcodes_osmid ON location_postcodes\n  USING BTREE (osm_id) {{db.tablespace.search_index}};\n\n"
  },
  {
    "path": "lib-sql/tables/search_name.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\nDROP TABLE IF EXISTS search_name;\n\n{% if not create_reverse_only %}\n\nCREATE TABLE search_name (\n  place_id BIGINT NOT NULL,\n  importance FLOAT NOT NULL,\n  address_rank SMALLINT NOT NULL,\n  name_vector integer[] NOT NULL,\n  nameaddress_vector integer[] NOT NULL,\n  country_code varchar(2),\n  centroid GEOMETRY(Geometry, 4326) NOT NULL\n  ) {{db.tablespace.search_data}};\n\nCREATE UNIQUE INDEX idx_search_name_place_id\n  ON search_name USING BTREE (place_id) {{db.tablespace.search_index}};\n\n{% endif %}\n"
  },
  {
    "path": "lib-sql/tables/status.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\nDROP TABLE IF EXISTS import_status;\nCREATE TABLE import_status (\n  lastimportdate TIMESTAMP WITH TIME ZONE NOT NULL,\n  sequence_id INTEGER,\n  indexed BOOLEAN\n  );\n\nDROP TABLE IF EXISTS import_osmosis_log;\nCREATE TABLE import_osmosis_log (\n  batchend TIMESTAMP,\n  batchseq INTEGER,\n  batchsize BIGINT,\n  starttime TIMESTAMP,\n  endtime TIMESTAMP,\n  event TEXT\n  );\n"
  },
  {
    "path": "lib-sql/tables/tiger.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\nDROP TABLE IF EXISTS location_property_tiger;\nCREATE TABLE location_property_tiger (\n  place_id BIGINT NOT NULL,\n  parent_place_id BIGINT,\n  startnumber INTEGER NOT NULL,\n  endnumber INTEGER NOT NULL,\n  step SMALLINT NOT NULL,\n  partition SMALLINT NOT NULL,\n  linegeo GEOMETRY NOT NULL,\n  postcode TEXT);\n"
  },
  {
    "path": "lib-sql/tables.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2026 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\nDROP SEQUENCE IF EXISTS seq_place;\nCREATE SEQUENCE seq_place start 1;\n\n{% include('tables/status.sql') %}\n{% include('tables/nominatim_properties.sql') %}\n{% include('tables/location_area.sql') %}\n{% include('tables/tiger.sql') %}\n{% include('tables/interpolation.sql') %}\n{% include('tables/search_name.sql') %}\n{% include('tables/addressline.sql') %}\n{% include('tables/placex.sql') %}\n{% include('tables/postcodes.sql') %}\n{% include('tables/entrance.sql') %}\n{% include('tables/import_reports.sql') %}\n{% include('tables/importance_tables.sql') %}\n\n\n"
  },
  {
    "path": "lib-sql/tiger_import_finish.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2022 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\n--index only on parent_place_id\nCREATE INDEX IF NOT EXISTS idx_location_property_tiger_parent_place_id_imp\n  ON location_property_tiger_import (parent_place_id)\n  INCLUDE (startnumber, endnumber, step)\n  {{db.tablespace.aux_index}};\nCREATE UNIQUE INDEX IF NOT EXISTS idx_location_property_tiger_place_id_imp\n  ON location_property_tiger_import (place_id) {{db.tablespace.aux_index}};\n\nGRANT SELECT ON location_property_tiger_import TO \"{{config.DATABASE_WEBUSER}}\";\n\nDROP TABLE IF EXISTS location_property_tiger;\nALTER TABLE location_property_tiger_import RENAME TO location_property_tiger;\n\nALTER INDEX IF EXISTS idx_location_property_tiger_parent_place_id_imp RENAME TO idx_location_property_tiger_housenumber_parent_place_id;\nALTER INDEX IF EXISTS idx_location_property_tiger_place_id_imp RENAME TO idx_location_property_tiger_place_id;\n\nDROP FUNCTION tiger_line_import (linegeo GEOMETRY, in_startnumber INTEGER,\n                                 in_endnumber INTEGER, interpolationtype TEXT,\n                                 token_info JSONB, in_postcode TEXT);\n"
  },
  {
    "path": "lib-sql/tiger_import_start.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2022 by the Nominatim developer community.\n-- For a full list of authors see the git log.\nDROP TABLE IF EXISTS location_property_tiger_import;\nCREATE TABLE location_property_tiger_import (\n  linegeo GEOMETRY,\n  place_id BIGINT,\n  partition INTEGER,\n  parent_place_id BIGINT,\n  startnumber INTEGER,\n  endnumber INTEGER,\n  step SMALLINT,\n  postcode TEXT);\n\n\n-- Lookup functions for tiger import when update \n-- tables are dropped (see gh-issue #2463)\nCREATE OR REPLACE FUNCTION getNearestNamedRoadPlaceIdSlow(in_centroid GEOMETRY,\n                                                      in_token_info JSONB)\n  RETURNS BIGINT\n  AS $$\nDECLARE\n  out_place_id BIGINT;\n\nBEGIN\n  SELECT place_id INTO out_place_id \n    FROM search_name\n    WHERE \n        -- finds rows where name_vector shares elements with search tokens.\n        token_matches_street(in_token_info, name_vector)\n        -- limits search area\n        AND centroid && ST_Expand(in_centroid, 0.015) \n        AND address_rank BETWEEN 26 AND 27\n    ORDER BY ST_Distance(centroid, in_centroid) ASC \n    LIMIT 1;\n\n  RETURN out_place_id;\nEND\n$$\nLANGUAGE plpgsql;\n\n\nCREATE OR REPLACE FUNCTION getNearestParallelRoadFeatureSlow(line GEOMETRY)\n  RETURNS BIGINT\n  AS $$\nDECLARE\n  r RECORD;\n  search_diameter FLOAT;\n  p1 GEOMETRY;\n  p2 GEOMETRY;\n  p3 GEOMETRY;\n\nBEGIN\n  IF ST_GeometryType(line) not in ('ST_LineString') THEN\n    RETURN NULL;\n  END IF;\n\n  p1 := ST_LineInterpolatePoint(line,0);\n  p2 := ST_LineInterpolatePoint(line,0.5);\n  p3 := ST_LineInterpolatePoint(line,1);\n\n    search_diameter := 0.0005;\n    WHILE search_diameter < 0.01 LOOP\n      FOR r IN\n        SELECT place_id FROM placex\n          WHERE ST_DWithin(line, geometry, search_diameter)\n          AND rank_address BETWEEN 26 AND 27\n          ORDER BY (ST_distance(geometry, p1)+\n                    ST_distance(geometry, p2)+\n                    ST_distance(geometry, p3)) ASC limit 1\n      LOOP\n        RETURN r.place_id;\n      END LOOP;\n      search_diameter := search_diameter * 2;\n    END LOOP;\n    RETURN NULL;\nEND\n$$\nLANGUAGE plpgsql;\n\n\nCREATE OR REPLACE FUNCTION getNearestRoadPlaceIdSlow(point GEOMETRY)\n  RETURNS BIGINT\n  AS $$\nDECLARE\n  r RECORD;\n  search_diameter FLOAT;\nBEGIN\n    search_diameter := 0.00005;\n    WHILE search_diameter < 0.1 LOOP\n      FOR r IN\n        SELECT place_id FROM placex\n          WHERE ST_DWithin(geometry, point, search_diameter)\n          AND rank_address BETWEEN 26 AND 27\n          ORDER BY ST_Distance(geometry, point) ASC limit 1\n      LOOP\n        RETURN r.place_id;\n      END LOOP;\n      search_diameter := search_diameter * 2;\n    END LOOP;\n    RETURN NULL;\nEND\n$$\nLANGUAGE plpgsql;\n\n\n-- Tiger import function\nCREATE OR REPLACE FUNCTION tiger_line_import(linegeo GEOMETRY, in_startnumber INTEGER,\n                                             in_endnumber INTEGER, interpolationtype TEXT,\n                                             token_info JSONB, in_postcode TEXT) RETURNS INTEGER\n  AS $$\nDECLARE\n  startnumber INTEGER;\n  endnumber INTEGER;\n  stepsize INTEGER;\n  numberrange INTEGER;\n  place_centroid GEOMETRY;\n  out_partition INTEGER;\n  out_parent_place_id BIGINT;\n  location RECORD;\n\nBEGIN\n\n  IF in_endnumber > in_startnumber THEN\n    startnumber := in_startnumber;\n    endnumber := in_endnumber;\n  ELSE\n    startnumber := in_endnumber;\n    endnumber := in_startnumber;\n    linegeo := ST_Reverse(linegeo);\n  END IF;\n\n  IF startnumber < 0 THEN\n    RAISE WARNING 'Negative house number range (% to %)', startnumber, endnumber;\n    RETURN 0;\n  END IF;\n\n  numberrange := endnumber - startnumber;\n\n  IF (interpolationtype = 'odd' AND startnumber % 2 = 0) OR (interpolationtype = 'even' AND startnumber % 2 = 1) THEN\n    startnumber := startnumber + 1;\n    stepsize := 2;\n  ELSE\n    IF (interpolationtype = 'odd' OR interpolationtype = 'even') THEN\n      stepsize := 2;\n    ELSE -- everything else assumed to be 'all'\n      stepsize := 1;\n    END IF;\n  END IF;\n\n  -- Filter out really broken tiger data\n  IF numberrange > 0\n     and numberrange::float/stepsize::float > 500\n     and ST_length(linegeo)/(numberrange::float/stepsize::float) < 0.000001\n  THEN\n    RAISE WARNING 'Road too short for number range % to % (%)',startnumber,endnumber,\n                  ST_length(linegeo)/(numberrange::float/stepsize::float);\n    RETURN 0;\n  END IF;\n\n  place_centroid := ST_Centroid(linegeo);\n  out_partition := get_partition('us');\n\n  -- HYBRID LOOKUP LOGIC (see gh-issue #2463)\n  -- if partition tables exist, use them for fast spatial lookups\n  {% if 'location_road_0' in db.tables %}\n    out_parent_place_id := getNearestNamedRoadPlaceId(out_partition, place_centroid,\n                                                    token_info);\n\n    IF out_parent_place_id IS NULL THEN\n      SELECT getNearestParallelRoadFeature(out_partition, linegeo)\n        INTO out_parent_place_id;\n    END IF;\n\n    IF out_parent_place_id IS NULL THEN\n      SELECT getNearestRoadPlaceId(out_partition, place_centroid)\n        INTO out_parent_place_id;\n    END IF;\n\n  -- When updatable information has been dropped:\n  -- Partition tables no longer exist, but search_name still persists.\n  {% elif 'search_name' in db.tables %}\n    -- Fallback: Look up in 'search_name' table \n    -- though spatial lookups here can be slower.\n    out_parent_place_id := getNearestNamedRoadPlaceIdSlow(place_centroid, token_info);\n\n    IF out_parent_place_id IS NULL THEN\n      out_parent_place_id := getNearestParallelRoadFeatureSlow(linegeo);\n    END IF;\n\n    IF out_parent_place_id IS NULL THEN\n      out_parent_place_id := getNearestRoadPlaceIdSlow(place_centroid);\n    END IF;\n  {% endif %}\n\n  -- If parent was found, insert street(line) into import table\n  IF out_parent_place_id IS NOT NULL THEN\n    INSERT INTO location_property_tiger_import (linegeo, place_id, partition,\n                                                parent_place_id, startnumber, endnumber,\n                                                step, postcode)\n    VALUES (linegeo, nextval('seq_place'), out_partition,\n            out_parent_place_id, startnumber, endnumber,\n            stepsize, in_postcode);\n\n    RETURN 1;\n  END IF;\n  RETURN 0;\n\nEND;\n$$\nLANGUAGE plpgsql;\n"
  },
  {
    "path": "lib-sql/tokenizer/icu_tokenizer.sql",
    "content": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright (C) 2022 by the Nominatim developer community.\n-- For a full list of authors see the git log.\n\n-- Get tokens used for searching the given place.\n--\n-- These are the tokens that will be saved in the search_name table.\nCREATE OR REPLACE FUNCTION token_get_name_search_tokens(info JSONB)\n  RETURNS INTEGER[]\nAS $$\n  SELECT (info->>'names')::INTEGER[]\n$$ LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE;\n\n\n-- Get tokens for matching the place name against others.\n--\n-- This should usually be restricted to full name tokens.\nCREATE OR REPLACE FUNCTION token_get_name_match_tokens(info JSONB)\n  RETURNS INTEGER[]\nAS $$\n  SELECT (info->>'names')::INTEGER[]\n$$ LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE;\n\n\n-- Return the housenumber tokens applicable for the place.\nCREATE OR REPLACE FUNCTION token_get_housenumber_search_tokens(info JSONB)\n  RETURNS INTEGER[]\nAS $$\n  SELECT (info->>'hnr_tokens')::INTEGER[]\n$$ LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE;\n\n\n-- Return the housenumber in the form that it can be matched during search.\nCREATE OR REPLACE FUNCTION token_normalized_housenumber(info JSONB)\n  RETURNS TEXT\nAS $$\n  SELECT info->>'hnr';\n$$ LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION token_is_street_address(info JSONB)\n  RETURNS BOOLEAN\nAS $$\n  SELECT info->>'street' is not null or info->>'place' is null;\n$$ LANGUAGE SQL IMMUTABLE PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION token_has_addr_street(info JSONB)\n  RETURNS BOOLEAN\nAS $$\n  SELECT info->>'street' is not null and info->>'street' != '{}';\n$$ LANGUAGE SQL IMMUTABLE PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION token_has_addr_place(info JSONB)\n  RETURNS BOOLEAN\nAS $$\n  SELECT info->>'place' is not null;\n$$ LANGUAGE SQL IMMUTABLE PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION token_matches_street(info JSONB, street_tokens INTEGER[])\n  RETURNS BOOLEAN\nAS $$\n  SELECT (info->>'street')::INTEGER[] && street_tokens\n$$ LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION token_matches_place(info JSONB, place_tokens INTEGER[])\n  RETURNS BOOLEAN\nAS $$\n  SELECT (info->>'place')::INTEGER[] <@ place_tokens\n$$ LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION token_addr_place_search_tokens(info JSONB)\n  RETURNS INTEGER[]\nAS $$\n  SELECT (info->>'place')::INTEGER[]\n$$ LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION token_get_address_keys(info JSONB)\n  RETURNS SETOF TEXT\nAS $$\n  SELECT * FROM jsonb_object_keys(info->'addr');\n$$ LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION token_get_address_search_tokens(info JSONB, key TEXT)\n  RETURNS INTEGER[]\nAS $$\n  SELECT (info->'addr'->>key)::INTEGER[];\n$$ LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION token_matches_address(info JSONB, key TEXT, tokens INTEGER[])\n  RETURNS BOOLEAN\nAS $$\n  SELECT (info->'addr'->>key)::INTEGER[] <@ tokens;\n$$ LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE;\n\n\nCREATE OR REPLACE FUNCTION token_get_postcode(info JSONB)\n  RETURNS TEXT\nAS $$\n  SELECT info->>'postcode';\n$$ LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE;\n\n\n-- Return token info that should be saved permanently in the database.\nCREATE OR REPLACE FUNCTION token_strip_info(info JSONB)\n  RETURNS JSONB\nAS $$\n  SELECT NULL::JSONB;\n$$ LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE;\n\n--------------- private functions ----------------------------------------------\n\nCREATE OR REPLACE FUNCTION getorcreate_full_word(norm_term TEXT, lookup_terms TEXT[],\n                                                 OUT full_token INT,\n                                                 OUT partial_tokens INT[])\n  AS $$\nDECLARE\n  partial_terms TEXT[] = '{}'::TEXT[];\n  term TEXT;\n  term_id INTEGER;\nBEGIN\n  SELECT min(word_id) INTO full_token\n    FROM word WHERE word = norm_term and type = 'W';\n\n  IF full_token IS NULL THEN\n    full_token := nextval('seq_word');\n    INSERT INTO word (word_id, word_token, type, word)\n      SELECT full_token, lookup_term, 'W', norm_term\n        FROM unnest(lookup_terms) as lookup_term;\n  END IF;\n\n  FOR term IN SELECT unnest(string_to_array(unnest(lookup_terms), ' ')) LOOP\n    term := trim(term);\n    IF NOT (ARRAY[term] <@ partial_terms) THEN\n      partial_terms := partial_terms || term;\n    END IF;\n  END LOOP;\n\n  partial_tokens := '{}'::INT[];\n  FOR term IN SELECT unnest(partial_terms) LOOP\n    SELECT min(word_id) INTO term_id\n      FROM word WHERE word_token = term and type = 'w';\n\n    IF term_id IS NULL THEN\n      term_id := nextval('seq_word');\n      INSERT INTO word (word_id, word_token, type)\n        VALUES (term_id, term, 'w');\n    END IF;\n\n    partial_tokens := array_merge(partial_tokens, ARRAY[term_id]);\n  END LOOP;\nEND;\n$$\nLANGUAGE plpgsql;\n\n\nCREATE OR REPLACE FUNCTION getorcreate_full_word(norm_term TEXT,\n                                                 lookup_terms TEXT[],\n                                                 lookup_norm_terms TEXT[],\n                                                 OUT full_token INT,\n                                                 OUT partial_tokens INT[])\n  AS $$\nDECLARE\n  partial_terms TEXT[] = '{}'::TEXT[];\n  term TEXT;\n  term_id INTEGER;\nBEGIN\n  SELECT min(word_id) INTO full_token\n    FROM word WHERE word = norm_term and type = 'W';\n\n  IF full_token IS NULL THEN\n    full_token := nextval('seq_word');\n    IF lookup_norm_terms IS NULL THEN\n      INSERT INTO word (word_id, word_token, type, word)\n        SELECT full_token, lookup_term, 'W', norm_term\n          FROM unnest(lookup_terms) as lookup_term;\n    ELSE\n      INSERT INTO word (word_id, word_token, type, word, info)\n        SELECT full_token, t.lookup, 'W', norm_term,\n               CASE WHEN norm_term = t.norm THEN null\n               ELSE json_build_object('lookup', t.norm) END\n          FROM unnest(lookup_terms, lookup_norm_terms) as t(lookup, norm);\n    END IF;\n  END IF;\n\n  FOR term IN SELECT unnest(string_to_array(unnest(lookup_terms), ' ')) LOOP\n    term := trim(term);\n    IF NOT (ARRAY[term] <@ partial_terms) THEN\n      partial_terms := partial_terms || term;\n    END IF;\n  END LOOP;\n\n  partial_tokens := '{}'::INT[];\n  FOR term IN SELECT unnest(partial_terms) LOOP\n    SELECT min(word_id) INTO term_id\n      FROM word WHERE word_token = term and type = 'w';\n\n    IF term_id IS NULL THEN\n      term_id := nextval('seq_word');\n      INSERT INTO word (word_id, word_token, type)\n        VALUES (term_id, term, 'w');\n    END IF;\n\n    partial_tokens := array_merge(partial_tokens, ARRAY[term_id]);\n  END LOOP;\nEND;\n$$\nLANGUAGE plpgsql;\n\n\nCREATE OR REPLACE FUNCTION getorcreate_partial_word(partial TEXT)\n  RETURNS INTEGER\n  AS $$\nDECLARE\n  token INTEGER;\nBEGIN\n  SELECT min(word_id) INTO token\n    FROM word WHERE word_token = partial and type = 'w';\n\n  IF token IS NULL THEN\n    token := nextval('seq_word');\n    INSERT INTO word (word_id, word_token, type, info)\n        VALUES (token, partial, 'w', json_build_object('count', 0));\n  END IF;\n\n  RETURN token;\nEND;\n$$\nLANGUAGE plpgsql;\n\n\nCREATE OR REPLACE FUNCTION getorcreate_hnr_id(lookup_term TEXT)\n  RETURNS INTEGER\n  AS $$\nDECLARE\n  return_id INTEGER;\nBEGIN\n  SELECT min(word_id) INTO return_id FROM word\n    WHERE word_token = lookup_term and type = 'H';\n\n  IF return_id IS NULL THEN\n    return_id := nextval('seq_word');\n    INSERT INTO word (word_id, word_token, type)\n      VALUES (return_id, lookup_term, 'H');\n  END IF;\n\n  RETURN return_id;\nEND;\n$$\nLANGUAGE plpgsql;\n\n\nCREATE OR REPLACE FUNCTION create_analyzed_hnr_id(norm_term TEXT, lookup_terms TEXT[])\n  RETURNS INTEGER\n  AS $$\nDECLARE\n  return_id INTEGER;\nBEGIN\n  SELECT min(word_id) INTO return_id\n    FROM word WHERE word = norm_term and type = 'H';\n\n  IF return_id IS NULL THEN\n    return_id := nextval('seq_word');\n    INSERT INTO word (word_id, word_token, type, word, info)\n      SELECT return_id, lookup_term, 'H', norm_term,\n             json_build_object('lookup', lookup_terms[1])\n        FROM unnest(lookup_terms) as lookup_term;\n  END IF;\n\n  RETURN return_id;\nEND;\n$$\nLANGUAGE plpgsql;\n\nCREATE OR REPLACE FUNCTION create_postcode_word(postcode TEXT, lookup_terms TEXT[])\n  RETURNS BOOLEAN\n  AS $$\nDECLARE\n  existing INTEGER;\nBEGIN\n  SELECT count(*) INTO existing\n    FROM word WHERE word = postcode and type = 'P';\n\n  IF existing > 0 THEN\n    RETURN TRUE;\n  END IF;\n\n  -- postcodes don't need word ids\n  INSERT INTO word (word_token, type, word)\n    SELECT lookup_term, 'P', postcode FROM unnest(lookup_terms) as lookup_term;\n\n  RETURN FALSE;\nEND;\n$$\nLANGUAGE plpgsql;\n\n"
  },
  {
    "path": "man/create-manpage.py",
    "content": "import sys\nimport os\nfrom pathlib import Path\n\nsys.path.append(str(Path(__file__, '..', '..', 'src').resolve()))\n\nfrom nominatim_db.cli import get_set_parser\n\ndef get_parser():\n    parser = get_set_parser()\n\n    return parser.parser\n"
  },
  {
    "path": "man/nominatim.1",
    "content": ".TH nominatim \"1\" Manual\n.SH NAME\nnominatim\n.SH SYNOPSIS\n.B nominatim\n[-h] [--version] {import,freeze,replication,special-phrases,add-data,index,refresh,admin,export,convert,serve,search,reverse,lookup,details,status} ...\n.SH DESCRIPTION\n    Command\\-line tools for importing, updating, administrating and\n.br\n    querying the Nominatim database.\n.br\n    \n.SH OPTIONS\n\n.TP\n\\fB\\-\\-version\\fR\nPrint Nominatim version and exit\n\n.SS\n\\fBSub-commands\\fR\n.TP\n\\fBnominatim\\fR \\fI\\,import\\/\\fR\n    Create a new Nominatim database from an OSM file.\n.TP\n\\fBnominatim\\fR \\fI\\,freeze\\/\\fR\n    Make database read-only.\n.TP\n\\fBnominatim\\fR \\fI\\,replication\\/\\fR\n    Update the database using an online replication service.\n.TP\n\\fBnominatim\\fR \\fI\\,special-phrases\\/\\fR\n    Import special phrases.\n.TP\n\\fBnominatim\\fR \\fI\\,add-data\\/\\fR\n    Add additional data from a file or an online source.\n.TP\n\\fBnominatim\\fR \\fI\\,index\\/\\fR\n    Reindex all new and modified data.\n.TP\n\\fBnominatim\\fR \\fI\\,refresh\\/\\fR\n    Recompute auxiliary data used by the indexing process.\n.TP\n\\fBnominatim\\fR \\fI\\,admin\\/\\fR\n    Analyse and maintain the database.\n.TP\n\\fBnominatim\\fR \\fI\\,export\\/\\fR\n    Export places as CSV file from the database.\n.TP\n\\fBnominatim\\fR \\fI\\,convert\\/\\fR\n Convert an existing database into a different format. (EXPERIMENTAL)\n.TP\n\\fBnominatim\\fR \\fI\\,serve\\/\\fR\n    Start a simple web server for serving the API.\n.TP\n\\fBnominatim\\fR \\fI\\,search\\/\\fR\n    Execute a search query.\n.TP\n\\fBnominatim\\fR \\fI\\,reverse\\/\\fR\n    Execute API reverse query.\n.TP\n\\fBnominatim\\fR \\fI\\,lookup\\/\\fR\n    Execute API lookup query.\n.TP\n\\fBnominatim\\fR \\fI\\,details\\/\\fR\n    Execute API details query.\n.TP\n\\fBnominatim\\fR \\fI\\,status\\/\\fR\n\n.SH OPTIONS 'nominatim import'\nusage: nominatim import [-h] [-q] [-v] [--project-dir DIR] [-j NUM]\n                        [--osm-file FILE]\n                        [--continue {import-from-file,load-data,indexing,db-postprocess}]\n                        [--osm2pgsql-cache SIZE] [--reverse-only]\n                        [--no-partitions] [--no-updates] [--offline]\n                        [--ignore-errors] [--index-noanalyse]\n                        [--prepare-database]\n\n    Create a new Nominatim database from an OSM file.\n.br\n\n.br\n    This sub\\-command sets up a new Nominatim database from scratch starting\n.br\n    with creating a new database in Postgresql. The user running this command\n.br\n    needs superuser rights on the database.\n.br\n    \n\n\n\n.TP\n\\fB\\-q\\fR, \\fB\\-\\-quiet\\fR\nPrint only error messages\n\n.TP\n\\fB\\-v\\fR, \\fB\\-\\-verbose\\fR\nIncrease verboseness of output\n\n.TP\n\\fB\\-\\-project\\-dir\\fR DIR\nBase directory of the Nominatim installation (default:.)\n\n.TP\n\\fB\\-j\\fR NUM, \\fB\\-\\-threads\\fR NUM\nNumber of parallel threads to use\n\n.TP\n\\fB\\-\\-osm\\-file\\fR FILE\nOSM file to be imported (repeat for importing multiple files)\n\n.TP\n\\fB\\-\\-continue\\fR {import\\-from\\-file,load\\-data,indexing,db\\-postprocess}\nContinue an import that was interrupted\n\n.TP\n\\fB\\-\\-osm2pgsql\\-cache\\fR SIZE\nSize of cache to be used by osm2pgsql (in MB)\n\n.TP\n\\fB\\-\\-reverse\\-only\\fR\nDo not create tables and indexes for searching\n\n.TP\n\\fB\\-\\-no\\-partitions\\fR\nDo not partition search indices (speeds up import of single country extracts)\n\n.TP\n\\fB\\-\\-no\\-updates\\fR\nDo not keep tables that are only needed for updating the database later\n\n.TP\n\\fB\\-\\-offline\\fR\nDo not attempt to load any additional data from the internet\n\n.TP\n\\fB\\-\\-ignore\\-errors\\fR\nContinue import even when errors in SQL are present\n\n.TP\n\\fB\\-\\-index\\-noanalyse\\fR\nDo not perform analyse operations during index (expert only)\n\n.TP\n\\fB\\-\\-prepare\\-database\\fR\nCreate the database but do not import any data\n\n.SH OPTIONS 'nominatim freeze'\nusage: nominatim freeze [-h] [-q] [-v] [--project-dir DIR] [-j NUM]\n\n    Make database read\\-only.\n.br\n\n.br\n    About half of data in the Nominatim database is kept only to be able to\n.br\n    keep the data up\\-to\\-date with new changes made in OpenStreetMap. This\n.br\n    command drops all this data and only keeps the part needed for geocoding\n.br\n    itself.\n.br\n\n.br\n    This command has the same effect as the `\\-\\-no\\-updates` option for imports.\n.br\n    \n\n\n\n.TP\n\\fB\\-q\\fR, \\fB\\-\\-quiet\\fR\nPrint only error messages\n\n.TP\n\\fB\\-v\\fR, \\fB\\-\\-verbose\\fR\nIncrease verboseness of output\n\n.TP\n\\fB\\-\\-project\\-dir\\fR DIR\nBase directory of the Nominatim installation (default:.)\n\n.TP\n\\fB\\-j\\fR NUM, \\fB\\-\\-threads\\fR NUM\nNumber of parallel threads to use\n\n.SH OPTIONS 'nominatim replication'\nusage: nominatim replication [-h] [-q] [-v] [--project-dir DIR] [-j NUM]\n                             [--init] [--no-update-functions]\n                             [--check-for-updates] [--once] [--catch-up]\n                             [--no-index] [--osm2pgsql-cache SIZE]\n                             [--socket-timeout SOCKET_TIMEOUT]\n\n    Update the database using an online replication service.\n.br\n\n.br\n    An OSM replication service is an online service that provides regular\n.br\n    updates (OSM diff files) for the planet or update they provide. The OSMF\n.br\n    provides the primary replication service for the full planet at\n.br\n    https://planet.osm.org/replication/ but there are other providers of\n.br\n    extracts of OSM data who provide such a service as well.\n.br\n\n.br\n    This sub\\-command allows to set up such a replication service and download\n.br\n    and import updates at regular intervals. You need to call '\\-\\-init' once to\n.br\n    set up the process or whenever you change the replication configuration\n.br\n    parameters. Without any arguments, the sub\\-command will go into a loop and\n.br\n    continuously apply updates as they become available. Giving `\\-\\-once` just\n.br\n    downloads and imports the next batch of updates.\n.br\n    \n\n\n\n.TP\n\\fB\\-q\\fR, \\fB\\-\\-quiet\\fR\nPrint only error messages\n\n.TP\n\\fB\\-v\\fR, \\fB\\-\\-verbose\\fR\nIncrease verboseness of output\n\n.TP\n\\fB\\-\\-project\\-dir\\fR DIR\nBase directory of the Nominatim installation (default:.)\n\n.TP\n\\fB\\-j\\fR NUM, \\fB\\-\\-threads\\fR NUM\nNumber of parallel threads to use\n\n.TP\n\\fB\\-\\-init\\fR\nInitialise the update process\n\n.TP\n\\fB\\-\\-no\\-update\\-functions\\fR\nDo not update the trigger function to support differential updates (EXPERT)\n\n.TP\n\\fB\\-\\-check\\-for\\-updates\\fR\nCheck if new updates are available and exit\n\n.TP\n\\fB\\-\\-once\\fR\nDownload and apply updates only once. When not set, updates are continuously applied\n\n.TP\n\\fB\\-\\-catch\\-up\\fR\nDownload and apply updates until no new data is available on the server\n\n.TP\n\\fB\\-\\-no\\-index\\fR\nDo not index the new data. Only usable together with \\-\\-once\n\n.TP\n\\fB\\-\\-osm2pgsql\\-cache\\fR SIZE\nSize of cache to be used by osm2pgsql (in MB)\n\n.TP\n\\fB\\-\\-socket\\-timeout\\fR \\fI\\,SOCKET_TIMEOUT\\/\\fR\nSet timeout for file downloads\n\n.SH OPTIONS 'nominatim special-phrases'\nusage: nominatim special-phrases [-h] [-q] [-v] [--project-dir DIR] [-j NUM]\n                                 [--import-from-wiki] [--import-from-csv FILE]\n                                 [--no-replace]\n\n    Import special phrases.\n.br\n\n.br\n    Special phrases are search terms that narrow down the type of object\n.br\n    that should be searched. For example, you might want to search for\n.br\n    'Hotels in Barcelona'. The OSM wiki has a selection of special phrases\n.br\n    in many languages, which can be imported with this command.\n.br\n\n.br\n    You can also provide your own phrases in a CSV file. The file needs to have\n.br\n    the following five columns:\n.br\n     * phrase \\- the term expected for searching\n.br\n     * class \\- the OSM tag key of the object type\n.br\n     * type \\- the OSM tag value of the object type\n.br\n     * operator \\- the kind of search to be done (one of: in, near, name, \\-)\n.br\n     * plural \\- whether the term is a plural or not (Y/N)\n.br\n\n.br\n    An example file can be found in the Nominatim sources at\n.br\n    'test/testdb/full_en_phrases_test.csv'.\n.br\n\n.br\n    The import can be further configured to ignore specific key/value pairs.\n.br\n    This is particularly useful when importing phrases from the wiki. The\n.br\n    default configuration excludes some very common tags like building=yes.\n.br\n    The configuration can be customized by putting a file `phrase\\-settings.json`\n.br\n    with custom rules into the project directory or by using the `\\-\\-config`\n.br\n    option to point to another configuration file.\n.br\n    \n\n\n\n.TP\n\\fB\\-q\\fR, \\fB\\-\\-quiet\\fR\nPrint only error messages\n\n.TP\n\\fB\\-v\\fR, \\fB\\-\\-verbose\\fR\nIncrease verboseness of output\n\n.TP\n\\fB\\-\\-project\\-dir\\fR DIR\nBase directory of the Nominatim installation (default:.)\n\n.TP\n\\fB\\-j\\fR NUM, \\fB\\-\\-threads\\fR NUM\nNumber of parallel threads to use\n\n.TP\n\\fB\\-\\-import\\-from\\-wiki\\fR\nImport special phrases from the OSM wiki to the database\n\n.TP\n\\fB\\-\\-import\\-from\\-csv\\fR FILE\nImport special phrases from a CSV file\n\n.TP\n\\fB\\-\\-no\\-replace\\fR\nKeep the old phrases and only add the new ones\n\n.SH OPTIONS 'nominatim add-data'\nusage: nominatim add-data [-h] [-q] [-v] [--project-dir DIR] [-j NUM]\n                          (--file FILE | --diff FILE | --node ID | --way ID | --relation ID | --tiger-data DIR)\n                          [--use-main-api] [--osm2pgsql-cache SIZE]\n                          [--socket-timeout SOCKET_TIMEOUT]\n\n    Add additional data from a file or an online source.\n.br\n\n.br\n    This command allows to add or update the search data in the database.\n.br\n    The data can come either from an OSM file or single OSM objects can\n.br\n    directly be downloaded from the OSM API. This function only loads the\n.br\n    data into the database. Afterwards it still needs to be integrated\n.br\n    in the search index. Use the `nominatim index` command for that.\n.br\n\n.br\n    The command can also be used to add external non\\-OSM data to the\n.br\n    database. At the moment the only supported format is TIGER housenumber\n.br\n    data. See the online documentation at\n.br\n    https://nominatim.org/release\\-docs/latest/customize/Tiger/\n.br\n    for more information.\n.br\n    \n\n\n\n.TP\n\\fB\\-q\\fR, \\fB\\-\\-quiet\\fR\nPrint only error messages\n\n.TP\n\\fB\\-v\\fR, \\fB\\-\\-verbose\\fR\nIncrease verboseness of output\n\n.TP\n\\fB\\-\\-project\\-dir\\fR DIR\nBase directory of the Nominatim installation (default:.)\n\n.TP\n\\fB\\-j\\fR NUM, \\fB\\-\\-threads\\fR NUM\nNumber of parallel threads to use\n\n.TP\n\\fB\\-\\-file\\fR FILE\nImport data from an OSM file or diff file\n\n.TP\n\\fB\\-\\-diff\\fR FILE\nImport data from an OSM diff file (deprecated: use \\-\\-file)\n\n.TP\n\\fB\\-\\-node\\fR ID\nImport a single node from the API\n\n.TP\n\\fB\\-\\-way\\fR ID\nImport a single way from the API\n\n.TP\n\\fB\\-\\-relation\\fR ID\nImport a single relation from the API\n\n.TP\n\\fB\\-\\-tiger\\-data\\fR DIR\nAdd housenumbers from the US TIGER census database\n\n.TP\n\\fB\\-\\-use\\-main\\-api\\fR\nUse OSM API instead of Overpass to download objects\n\n.TP\n\\fB\\-\\-osm2pgsql\\-cache\\fR SIZE\nSize of cache to be used by osm2pgsql (in MB)\n\n.TP\n\\fB\\-\\-socket\\-timeout\\fR \\fI\\,SOCKET_TIMEOUT\\/\\fR\nSet timeout for file downloads\n\n.SH OPTIONS 'nominatim index'\nusage: nominatim index [-h] [-q] [-v] [--project-dir DIR] [-j NUM]\n                       [--boundaries-only] [--no-boundaries] [--minrank RANK]\n                       [--maxrank RANK]\n\n    Reindex all new and modified data.\n.br\n\n.br\n    Indexing is the process of computing the address and search terms for\n.br\n    the places in the database. Every time data is added or changed, indexing\n.br\n    needs to be run. Imports and replication updates automatically take care\n.br\n    of indexing. For other cases, this function allows to run indexing manually.\n.br\n    \n\n\n\n.TP\n\\fB\\-q\\fR, \\fB\\-\\-quiet\\fR\nPrint only error messages\n\n.TP\n\\fB\\-v\\fR, \\fB\\-\\-verbose\\fR\nIncrease verboseness of output\n\n.TP\n\\fB\\-\\-project\\-dir\\fR DIR\nBase directory of the Nominatim installation (default:.)\n\n.TP\n\\fB\\-j\\fR NUM, \\fB\\-\\-threads\\fR NUM\nNumber of parallel threads to use\n\n.TP\n\\fB\\-\\-boundaries\\-only\\fR\nIndex only administrative boundaries.\n\n.TP\n\\fB\\-\\-no\\-boundaries\\fR\nIndex everything except administrative boundaries.\n\n.TP\n\\fB\\-\\-minrank\\fR RANK, \\fB\\-r\\fR RANK\nMinimum/starting rank\n\n.TP\n\\fB\\-\\-maxrank\\fR RANK, \\fB\\-R\\fR RANK\nMaximum/finishing rank\n\n.SH OPTIONS 'nominatim refresh'\nusage: nominatim refresh [-h] [-q] [-v] [--project-dir DIR] [-j NUM]\n                         [--postcodes] [--word-tokens] [--word-counts]\n                         [--address-levels] [--functions] [--wiki-data]\n                         [--secondary-importance] [--importance] [--website]\n                         [--data-object OBJECT] [--data-area OBJECT]\n                         [--no-diff-updates] [--enable-debug-statements]\n\n    Recompute auxiliary data used by the indexing process.\n.br\n\n.br\n    This sub\\-commands updates various static data and functions in the database.\n.br\n    It usually needs to be run after changing various aspects of the\n.br\n    configuration. The configuration documentation will mention the exact\n.br\n    command to use in such case.\n.br\n\n.br\n    Warning: the 'update' command must not be run in parallel with other update\n.br\n             commands like 'replication' or 'add\\-data'.\n.br\n    \n\n\n\n.TP\n\\fB\\-q\\fR, \\fB\\-\\-quiet\\fR\nPrint only error messages\n\n.TP\n\\fB\\-v\\fR, \\fB\\-\\-verbose\\fR\nIncrease verboseness of output\n\n.TP\n\\fB\\-\\-project\\-dir\\fR DIR\nBase directory of the Nominatim installation (default:.)\n\n.TP\n\\fB\\-j\\fR NUM, \\fB\\-\\-threads\\fR NUM\nNumber of parallel threads to use\n\n.TP\n\\fB\\-\\-postcodes\\fR\nUpdate postcode centroid table\n\n.TP\n\\fB\\-\\-word\\-tokens\\fR\nClean up search terms\n\n.TP\n\\fB\\-\\-word\\-counts\\fR\nCompute frequency of full\\-word search terms\n\n.TP\n\\fB\\-\\-address\\-levels\\fR\nReimport address level configuration\n\n.TP\n\\fB\\-\\-functions\\fR\nUpdate the PL/pgSQL functions in the database\n\n.TP\n\\fB\\-\\-wiki\\-data\\fR\nUpdate Wikipedia/data importance numbers\n\n.TP\n\\fB\\-\\-secondary\\-importance\\fR\nUpdate secondary importance raster data\n\n.TP\n\\fB\\-\\-importance\\fR\nRecompute place importances (expensive!)\n\n.TP\n\\fB\\-\\-website\\fR\nRefresh the directory that serves the scripts for the web API\n\n.TP\n\\fB\\-\\-data\\-object\\fR OBJECT\nMark the given OSM object as requiring an update (format: [NWR]<id>)\n\n.TP\n\\fB\\-\\-data\\-area\\fR OBJECT\nMark the area around the given OSM object as requiring an update (format: [NWR]<id>)\n\n.TP\n\\fB\\-\\-no\\-diff\\-updates\\fR\nDo not enable code for propagating updates\n\n.TP\n\\fB\\-\\-enable\\-debug\\-statements\\fR\nEnable debug warning statements in functions\n\n.SH OPTIONS 'nominatim admin'\nusage: nominatim admin [-h] [-q] [-v] [--project-dir DIR] [-j NUM]\n                       (--warm | --check-database | --migrate | --analyse-indexing | --collect-os-info | --clean-deleted AGE)\n                       [--search-only] [--reverse-only]\n                       [--osm-id OSM_ID | --place-id PLACE_ID]\n\n    Analyse and maintain the database.\n.br\n    \n\n\n\n.TP\n\\fB\\-q\\fR, \\fB\\-\\-quiet\\fR\nPrint only error messages\n\n.TP\n\\fB\\-v\\fR, \\fB\\-\\-verbose\\fR\nIncrease verboseness of output\n\n.TP\n\\fB\\-\\-project\\-dir\\fR DIR\nBase directory of the Nominatim installation (default:.)\n\n.TP\n\\fB\\-j\\fR NUM, \\fB\\-\\-threads\\fR NUM\nNumber of parallel threads to use\n\n.TP\n\\fB\\-\\-warm\\fR\nWarm database caches for search and reverse queries\n\n.TP\n\\fB\\-\\-check\\-database\\fR\nCheck that the database is complete and operational\n\n.TP\n\\fB\\-\\-migrate\\fR\nMigrate the database to a new software version\n\n.TP\n\\fB\\-\\-analyse\\-indexing\\fR\nPrint performance analysis of the indexing process\n\n.TP\n\\fB\\-\\-collect\\-os\\-info\\fR\nGenerate a report about the host system information\n\n.TP\n\\fB\\-\\-clean\\-deleted\\fR AGE\nClean up deleted relations\n\n.TP\n\\fB\\-\\-search\\-only\\fR\nOnly pre\\-warm tables for search queries\n\n.TP\n\\fB\\-\\-reverse\\-only\\fR\nOnly pre\\-warm tables for reverse queries\n\n.TP\n\\fB\\-\\-osm\\-id\\fR \\fI\\,OSM_ID\\/\\fR\nAnalyse indexing of the given OSM object\n\n.TP\n\\fB\\-\\-place\\-id\\fR \\fI\\,PLACE_ID\\/\\fR\nAnalyse indexing of the given Nominatim object\n\n.SH OPTIONS 'nominatim export'\nusage: nominatim export [-h] [-q] [-v] [--project-dir DIR] [-j NUM]\n                        [--output-type {country,state,county,city,suburb,street,path}]\n                        [--output-format OUTPUT_FORMAT] [--language LANGUAGE]\n                        [--restrict-to-country COUNTRY_CODE]\n                        [--restrict-to-osm-node ID] [--restrict-to-osm-way ID]\n                        [--restrict-to-osm-relation ID]\n\n    Export places as CSV file from the database.\n.br\n\n.br\n\n.br\n    \n\n\n\n.TP\n\\fB\\-q\\fR, \\fB\\-\\-quiet\\fR\nPrint only error messages\n\n.TP\n\\fB\\-v\\fR, \\fB\\-\\-verbose\\fR\nIncrease verboseness of output\n\n.TP\n\\fB\\-\\-project\\-dir\\fR DIR\nBase directory of the Nominatim installation (default:.)\n\n.TP\n\\fB\\-j\\fR NUM, \\fB\\-\\-threads\\fR NUM\nNumber of parallel threads to use\n\n.TP\n\\fB\\-\\-output\\-type\\fR {country,state,county,city,suburb,street,path}\nType of places to output (default: street)\n\n.TP\n\\fB\\-\\-output\\-format\\fR \\fI\\,OUTPUT_FORMAT\\/\\fR\nSemicolon\\-separated list of address types (see \\-\\-output\\-type). Additionally accepts:placeid,postcode\n\n.TP\n\\fB\\-\\-language\\fR \\fI\\,LANGUAGE\\/\\fR\nPreferred language for output (use local name, if omitted)\n\n.TP\n\\fB\\-\\-restrict\\-to\\-country\\fR COUNTRY_CODE\nExport only objects within country\n\n.TP\n\\fB\\-\\-restrict\\-to\\-osm\\-node\\fR ID\nExport only children of this OSM node\n\n.TP\n\\fB\\-\\-restrict\\-to\\-osm\\-way\\fR ID\nExport only children of this OSM way\n\n.TP\n\\fB\\-\\-restrict\\-to\\-osm\\-relation\\fR ID\nExport only children of this OSM relation\n\n.SH OPTIONS 'nominatim convert'\nusage: nominatim convert [-h] [-q] [-v] [--project-dir DIR] [-j NUM]\n                         [--format {sqlite}] --output OUTPUT [--with-reverse]\n                         [--with-search] [--with-details]\n\n Convert an existing database into a different format. (EXPERIMENTAL)\n.br\n\n.br\n        Dump a read\\-only version of the database in a different format.\n.br\n        At the moment only a SQLite database suitable for reverse lookup\n.br\n        can be created.\n.br\n    \n\n\n.TP\n\\fB\\-\\-format\\fR {sqlite}\nFormat of the output database (must be sqlite currently)\n\n.TP\n\\fB\\-\\-output\\fR \\fI\\,OUTPUT\\/\\fR, \\fB\\-o\\fR \\fI\\,OUTPUT\\/\\fR\nFile to write the database to.\n\n.TP\n\\fB\\-q\\fR, \\fB\\-\\-quiet\\fR\nPrint only error messages\n\n.TP\n\\fB\\-v\\fR, \\fB\\-\\-verbose\\fR\nIncrease verboseness of output\n\n.TP\n\\fB\\-\\-project\\-dir\\fR DIR\nBase directory of the Nominatim installation (default:.)\n\n.TP\n\\fB\\-j\\fR NUM, \\fB\\-\\-threads\\fR NUM\nNumber of parallel threads to use\n\n.TP\n\\fB\\-\\-with\\-reverse\\fR, \\fB\\-\\-without\\-reverse\\fR\nEnable/disable support for reverse and lookup API (default: enabled)\n\n.TP\n\\fB\\-\\-with\\-search\\fR, \\fB\\-\\-without\\-search\\fR\nEnable/disable support for search API (default: disabled)\n\n.TP\n\\fB\\-\\-with\\-details\\fR, \\fB\\-\\-without\\-details\\fR\nEnable/disable support for details API (default: enabled)\n\n.SH OPTIONS 'nominatim serve'\nusage: nominatim serve [-h] [-q] [-v] [--project-dir DIR] [-j NUM]\n                       [--server SERVER] [--engine {php,falcon,starlette}]\n\n    Start a simple web server for serving the API.\n.br\n\n.br\n    This command starts a built\\-in webserver to serve the website\n.br\n    from the current project directory. This webserver is only suitable\n.br\n    for testing and development. Do not use it in production setups!\n.br\n\n.br\n    There are different webservers available. The default 'php' engine\n.br\n    runs the classic PHP frontend. The other engines are Python servers\n.br\n    which run the new Python frontend code. This is highly experimental\n.br\n    at the moment and may not include the full API.\n.br\n\n.br\n    By the default, the webserver can be accessed at: http://127.0.0.1:8088\n.br\n    \n\n\n\n.TP\n\\fB\\-q\\fR, \\fB\\-\\-quiet\\fR\nPrint only error messages\n\n.TP\n\\fB\\-v\\fR, \\fB\\-\\-verbose\\fR\nIncrease verboseness of output\n\n.TP\n\\fB\\-\\-project\\-dir\\fR DIR\nBase directory of the Nominatim installation (default:.)\n\n.TP\n\\fB\\-j\\fR NUM, \\fB\\-\\-threads\\fR NUM\nNumber of parallel threads to use\n\n.TP\n\\fB\\-\\-server\\fR \\fI\\,SERVER\\/\\fR\nThe address the server will listen to.\n\n.TP\n\\fB\\-\\-engine\\fR {php,falcon,starlette}\nWebserver framework to run. (default: falcon)\n\n.SH OPTIONS 'nominatim search'\nusage: nominatim search [-h] [-q] [-v] [--project-dir DIR] [-j NUM]\n                        [--query QUERY] [--amenity AMENITY] [--street STREET]\n                        [--city CITY] [--county COUNTY] [--state STATE]\n                        [--country COUNTRY] [--postalcode POSTALCODE]\n                        [--format {xml,geojson,geocodejson,json,jsonv2,debug}]\n                        [--addressdetails] [--extratags] [--namedetails]\n                        [--lang LANGS]\n                        [--polygon-output {geojson,kml,svg,text}]\n                        [--polygon-threshold TOLERANCE] [--countrycodes CC,..]\n                        [--exclude_place_ids ID,..] [--limit LIMIT]\n                        [--viewbox X1,Y1,X2,Y2] [--bounded] [--no-dedupe]\n\n    Execute a search query.\n.br\n\n.br\n    This command works exactly the same as if calling the /search endpoint on\n.br\n    the web API. See the online documentation for more details on the\n.br\n    various parameters:\n.br\n    https://nominatim.org/release\\-docs/latest/api/Search/\n.br\n    \n\n\n\n.TP\n\\fB\\-q\\fR, \\fB\\-\\-quiet\\fR\nPrint only error messages\n\n.TP\n\\fB\\-v\\fR, \\fB\\-\\-verbose\\fR\nIncrease verboseness of output\n\n.TP\n\\fB\\-\\-project\\-dir\\fR DIR\nBase directory of the Nominatim installation (default:.)\n\n.TP\n\\fB\\-j\\fR NUM, \\fB\\-\\-threads\\fR NUM\nNumber of parallel threads to use\n\n.TP\n\\fB\\-\\-query\\fR \\fI\\,QUERY\\/\\fR\nFree\\-form query string\n\n.TP\n\\fB\\-\\-amenity\\fR \\fI\\,AMENITY\\/\\fR\nStructured query: name and/or type of POI\n\n.TP\n\\fB\\-\\-street\\fR \\fI\\,STREET\\/\\fR\nStructured query: housenumber and street\n\n.TP\n\\fB\\-\\-city\\fR \\fI\\,CITY\\/\\fR\nStructured query: city, town or village\n\n.TP\n\\fB\\-\\-county\\fR \\fI\\,COUNTY\\/\\fR\nStructured query: county\n\n.TP\n\\fB\\-\\-state\\fR \\fI\\,STATE\\/\\fR\nStructured query: state\n\n.TP\n\\fB\\-\\-country\\fR \\fI\\,COUNTRY\\/\\fR\nStructured query: country\n\n.TP\n\\fB\\-\\-postalcode\\fR \\fI\\,POSTALCODE\\/\\fR\nStructured query: postcode\n\n.TP\n\\fB\\-\\-format\\fR {xml,geojson,geocodejson,json,jsonv2,debug}\nFormat of result\n\n.TP\n\\fB\\-\\-addressdetails\\fR\nInclude a breakdown of the address into elements\n\n.TP\n\\fB\\-\\-extratags\\fR\nInclude additional information if available (e.g. wikipedia link, opening hours)\n\n.TP\n\\fB\\-\\-namedetails\\fR\nInclude a list of alternative names\n\n.TP\n\\fB\\-\\-lang\\fR LANGS, \\fB\\-\\-accept\\-language\\fR LANGS\nPreferred language order for presenting search results\n\n.TP\n\\fB\\-\\-polygon\\-output\\fR {geojson,kml,svg,text}\nOutput geometry of results as a GeoJSON, KML, SVG or WKT\n\n.TP\n\\fB\\-\\-polygon\\-threshold\\fR TOLERANCE\nSimplify output geometry.Parameter is difference tolerance in degrees.\n\n.TP\n\\fB\\-\\-countrycodes\\fR CC,..\nLimit search results to one or more countries\n\n.TP\n\\fB\\-\\-exclude_place_ids\\fR ID,..\nList of search object to be excluded. Each object can be a Nominatim \\fBplace_id\\fR or an OSM object in the form \\fB<osm_type><osm_id>\\fR\n\n.TP\n\\fB\\-\\-limit\\fR \\fI\\,LIMIT\\/\\fR\nLimit the number of returned results\n\n.TP\n\\fB\\-\\-viewbox\\fR X1,Y1,X2,Y2\nPreferred area to find search results\n\n.TP\n\\fB\\-\\-bounded\\fR\nStrictly restrict results to viewbox area\n\n.TP\n\\fB\\-\\-no\\-dedupe\\fR\nDo not remove duplicates from the result list\n\n.SH OPTIONS 'nominatim reverse'\nusage: nominatim reverse [-h] [-q] [-v] [--project-dir DIR] [-j NUM] --lat LAT\n                         --lon LON [--zoom ZOOM] [--layer LAYER]\n                         [--format {xml,geojson,geocodejson,json,jsonv2,debug}]\n                         [--addressdetails] [--extratags] [--namedetails]\n                         [--lang LANGS]\n                         [--polygon-output {geojson,kml,svg,text}]\n                         [--polygon-threshold TOLERANCE]\n\n    Execute API reverse query.\n.br\n\n.br\n    This command works exactly the same as if calling the /reverse endpoint on\n.br\n    the web API. See the online documentation for more details on the\n.br\n    various parameters:\n.br\n    https://nominatim.org/release\\-docs/latest/api/Reverse/\n.br\n    \n\n\n\n.TP\n\\fB\\-q\\fR, \\fB\\-\\-quiet\\fR\nPrint only error messages\n\n.TP\n\\fB\\-v\\fR, \\fB\\-\\-verbose\\fR\nIncrease verboseness of output\n\n.TP\n\\fB\\-\\-project\\-dir\\fR DIR\nBase directory of the Nominatim installation (default:.)\n\n.TP\n\\fB\\-j\\fR NUM, \\fB\\-\\-threads\\fR NUM\nNumber of parallel threads to use\n\n.TP\n\\fB\\-\\-lat\\fR \\fI\\,LAT\\/\\fR\nLatitude of coordinate to look up (in WGS84)\n\n.TP\n\\fB\\-\\-lon\\fR \\fI\\,LON\\/\\fR\nLongitude of coordinate to look up (in WGS84)\n\n.TP\n\\fB\\-\\-zoom\\fR \\fI\\,ZOOM\\/\\fR\nLevel of detail required for the address\n\n.TP\n\\fB\\-\\-layer\\fR LAYER\nOSM id to lookup in format <NRW><id> (may be repeated)\n\n.TP\n\\fB\\-\\-format\\fR {xml,geojson,geocodejson,json,jsonv2,debug}\nFormat of result\n\n.TP\n\\fB\\-\\-addressdetails\\fR\nInclude a breakdown of the address into elements\n\n.TP\n\\fB\\-\\-extratags\\fR\nInclude additional information if available (e.g. wikipedia link, opening hours)\n\n.TP\n\\fB\\-\\-namedetails\\fR\nInclude a list of alternative names\n\n.TP\n\\fB\\-\\-lang\\fR LANGS, \\fB\\-\\-accept\\-language\\fR LANGS\nPreferred language order for presenting search results\n\n.TP\n\\fB\\-\\-polygon\\-output\\fR {geojson,kml,svg,text}\nOutput geometry of results as a GeoJSON, KML, SVG or WKT\n\n.TP\n\\fB\\-\\-polygon\\-threshold\\fR TOLERANCE\nSimplify output geometry.Parameter is difference tolerance in degrees.\n\n.SH OPTIONS 'nominatim lookup'\nusage: nominatim lookup [-h] [-q] [-v] [--project-dir DIR] [-j NUM] --id OSMID\n                        [--format {xml,geojson,geocodejson,json,jsonv2,debug}]\n                        [--addressdetails] [--extratags] [--namedetails]\n                        [--lang LANGS]\n                        [--polygon-output {geojson,kml,svg,text}]\n                        [--polygon-threshold TOLERANCE]\n\n    Execute API lookup query.\n.br\n\n.br\n    This command works exactly the same as if calling the /lookup endpoint on\n.br\n    the web API. See the online documentation for more details on the\n.br\n    various parameters:\n.br\n    https://nominatim.org/release\\-docs/latest/api/Lookup/\n.br\n    \n\n\n\n.TP\n\\fB\\-q\\fR, \\fB\\-\\-quiet\\fR\nPrint only error messages\n\n.TP\n\\fB\\-v\\fR, \\fB\\-\\-verbose\\fR\nIncrease verboseness of output\n\n.TP\n\\fB\\-\\-project\\-dir\\fR DIR\nBase directory of the Nominatim installation (default:.)\n\n.TP\n\\fB\\-j\\fR NUM, \\fB\\-\\-threads\\fR NUM\nNumber of parallel threads to use\n\n.TP\n\\fB\\-\\-id\\fR OSMID\nOSM id to lookup in format <NRW><id> (may be repeated)\n\n.TP\n\\fB\\-\\-format\\fR {xml,geojson,geocodejson,json,jsonv2,debug}\nFormat of result\n\n.TP\n\\fB\\-\\-addressdetails\\fR\nInclude a breakdown of the address into elements\n\n.TP\n\\fB\\-\\-extratags\\fR\nInclude additional information if available (e.g. wikipedia link, opening hours)\n\n.TP\n\\fB\\-\\-namedetails\\fR\nInclude a list of alternative names\n\n.TP\n\\fB\\-\\-lang\\fR LANGS, \\fB\\-\\-accept\\-language\\fR LANGS\nPreferred language order for presenting search results\n\n.TP\n\\fB\\-\\-polygon\\-output\\fR {geojson,kml,svg,text}\nOutput geometry of results as a GeoJSON, KML, SVG or WKT\n\n.TP\n\\fB\\-\\-polygon\\-threshold\\fR TOLERANCE\nSimplify output geometry.Parameter is difference tolerance in degrees.\n\n.SH OPTIONS 'nominatim details'\nusage: nominatim details [-h] [-q] [-v] [--project-dir DIR] [-j NUM]\n                         (--node NODE | --way WAY | --relation RELATION | --place_id PLACE_ID)\n                         [--class OBJECT_CLASS] [--addressdetails]\n                         [--keywords] [--linkedplaces] [--hierarchy]\n                         [--group_hierarchy] [--polygon_geojson]\n                         [--lang LANGS]\n\n    Execute API details query.\n.br\n\n.br\n    This command works exactly the same as if calling the /details endpoint on\n.br\n    the web API. See the online documentation for more details on the\n.br\n    various parameters:\n.br\n    https://nominatim.org/release\\-docs/latest/api/Details/\n.br\n    \n\n\n\n.TP\n\\fB\\-q\\fR, \\fB\\-\\-quiet\\fR\nPrint only error messages\n\n.TP\n\\fB\\-v\\fR, \\fB\\-\\-verbose\\fR\nIncrease verboseness of output\n\n.TP\n\\fB\\-\\-project\\-dir\\fR DIR\nBase directory of the Nominatim installation (default:.)\n\n.TP\n\\fB\\-j\\fR NUM, \\fB\\-\\-threads\\fR NUM\nNumber of parallel threads to use\n\n.TP\n\\fB\\-\\-node\\fR \\fI\\,NODE\\/\\fR, \\fB\\-n\\fR \\fI\\,NODE\\/\\fR\nLook up the OSM node with the given ID.\n\n.TP\n\\fB\\-\\-way\\fR \\fI\\,WAY\\/\\fR, \\fB\\-w\\fR \\fI\\,WAY\\/\\fR\nLook up the OSM way with the given ID.\n\n.TP\n\\fB\\-\\-relation\\fR \\fI\\,RELATION\\/\\fR, \\fB\\-r\\fR \\fI\\,RELATION\\/\\fR\nLook up the OSM relation with the given ID.\n\n.TP\n\\fB\\-\\-place_id\\fR \\fI\\,PLACE_ID\\/\\fR, \\fB\\-p\\fR \\fI\\,PLACE_ID\\/\\fR\nDatabase internal identifier of the OSM object to look up\n\n.TP\n\\fB\\-\\-class\\fR \\fI\\,OBJECT_CLASS\\/\\fR\nClass type to disambiguated multiple entries of the same object.\n\n.TP\n\\fB\\-\\-addressdetails\\fR\nInclude a breakdown of the address into elements\n\n.TP\n\\fB\\-\\-keywords\\fR\nInclude a list of name keywords and address keywords\n\n.TP\n\\fB\\-\\-linkedplaces\\fR\nInclude a details of places that are linked with this one\n\n.TP\n\\fB\\-\\-hierarchy\\fR\nInclude details of places lower in the address hierarchy\n\n.TP\n\\fB\\-\\-group_hierarchy\\fR\nGroup the places by type\n\n.TP\n\\fB\\-\\-polygon_geojson\\fR\nInclude geometry of result\n\n.TP\n\\fB\\-\\-lang\\fR LANGS, \\fB\\-\\-accept\\-language\\fR LANGS\nPreferred language order for presenting search results\n\n.SH OPTIONS 'nominatim status'\nusage: nominatim status [-h] [-q] [-v] [--project-dir DIR] [-j NUM]\n                        [--format {text,json}]\n\n    Execute API status query.\n.br\n\n.br\n    This command works exactly the same as if calling the /status endpoint on\n.br\n    the web API. See the online documentation for more details on the\n.br\n    various parameters:\n.br\n    https://nominatim.org/release\\-docs/latest/api/Status/\n.br\n    \n\n\n\n.TP\n\\fB\\-q\\fR, \\fB\\-\\-quiet\\fR\nPrint only error messages\n\n.TP\n\\fB\\-v\\fR, \\fB\\-\\-verbose\\fR\nIncrease verboseness of output\n\n.TP\n\\fB\\-\\-project\\-dir\\fR DIR\nBase directory of the Nominatim installation (default:.)\n\n.TP\n\\fB\\-j\\fR NUM, \\fB\\-\\-threads\\fR NUM\nNumber of parallel threads to use\n\n.TP\n\\fB\\-\\-format\\fR {text,json}\nFormat of result\n\n.SH AUTHORS\n.B Nominatim\nwas written by the Nominatim developer community <info@nominatim.org>.\n.SH DISTRIBUTION\nThe latest version of Nominatim may be downloaded from\n.UR https://nominatim.org\n.UE\n"
  },
  {
    "path": "mkdocs.yml",
    "content": "site_name: Nominatim Manual\ntheme:\n  font: false\n  name: material\n  features:\n    - navigation.tabs\n    - toc.integrate\n  plugins:\n    - privacy\ncopyright: Copyright &copy; Nominatim developer community\ndocs_dir: docs\nsite_url: https://nominatim.org\nrepo_url: https://github.com/openstreetmap/Nominatim\nnav:\n    - 'Introduction' : 'index.md'\n    - 'API Reference':\n        - 'Overview': 'api/Overview.md'\n        - 'Search': 'api/Search.md'\n        - 'Reverse': 'api/Reverse.md'\n        - 'Address Lookup': 'api/Lookup.md'\n        - 'Details' : 'api/Details.md'\n        - 'Status' : 'api/Status.md'\n        - 'Place Output Formats': 'api/Output.md'\n        - 'FAQ': 'api/Faq.md'\n    - 'Administration Guide':\n        - 'Basic Installation': 'admin/Installation.md'\n        - 'Import' : 'admin/Import.md'\n        - 'Update' : 'admin/Update.md'\n        - 'Deploy' : 'admin/Deployment-Python.md'\n        - 'Nominatim UI'  : 'admin/Setup-Nominatim-UI.md'\n        - 'Advanced Installations' : 'admin/Advanced-Installations.md'\n        - 'Maintenance' : 'admin/Maintenance.md'\n        - 'Migration from older Versions' : 'admin/Migration.md'\n        - 'Troubleshooting' : 'admin/Faq.md'\n        - 'Installation on Ubuntu 22' : 'admin/Install-on-Ubuntu-22.md'\n        - 'Installation on Ubuntu 24' : 'admin/Install-on-Ubuntu-24.md'\n    - 'Customization Guide':\n        - 'Overview': 'customize/Overview.md'\n        - 'Import Styles': 'customize/Import-Styles.md'\n        - 'Configuration Settings': 'customize/Settings.md'\n        - 'API Result Formatting': 'customize/Result-Formatting.md'\n        - 'Per-Country Data': 'customize/Country-Settings.md'\n        - 'Place Ranking' : 'customize/Ranking.md'\n        - 'Importance' : 'customize/Importance.md'\n        - 'Tokenizers' : 'customize/Tokenizers.md'\n        - 'Special Phrases': 'customize/Special-Phrases.md'\n        - 'External data: US housenumbers from TIGER': 'customize/Tiger.md'\n        - 'External data: Postcodes': 'customize/Postcodes.md'\n        - 'Conversion to SQLite': 'customize/SQLite.md'\n    - 'Library Guide':\n        - 'Getting Started': 'library/Getting-Started.md'\n        - 'Nominatim API class': 'library/NominatimAPI.md'\n        - 'Configuration': 'library/Configuration.md'\n        - 'Input Parameter Types': 'library/Input-Parameter-Types.md'\n        - 'Result Handling': 'library/Result-Handling.md'\n        - 'Low-level DB Access': 'library/Low-Level-DB-Access.md'\n    - 'Developers Guide':\n        - 'Architecture Overview' : 'develop/overview.md'\n        - 'Database Layout' : 'develop/Database-Layout.md'\n        - 'Indexing' : 'develop/Indexing.md'\n        - 'Tokenizers' : 'develop/Tokenizers.md'\n        - 'Custom modules for ICU tokenizer': 'develop/ICU-Tokenizer-Modules.md'\n        - 'Setup for Development' : 'develop/Development-Environment.md'\n        - 'Testing' : 'develop/Testing.md'\n        - 'External Data Sources': 'develop/data-sources.md'\nmarkdown_extensions:\n    - codehilite\n    - admonition\n    - pymdownx.superfences\n    - pymdownx.blocks.html\n    - pymdownx.tabbed:\n        alternate_style: true\n    - def_list\n    - toc:\n        toc_depth: 4\n        permalink: 🔗\nextra_css: [extra.css, styles.css]\nexclude_docs: |\n    mk_install_instructions.py\nsite_dir: site-html\nplugins:\n    - search\n    - mkdocstrings:\n        handlers:\n          python:\n            paths: [\"src\"]\n            options:\n              show_source: False\n              show_bases: False\n    - gen-files:\n        scripts:\n          - docs/mk_install_instructions.py\n"
  },
  {
    "path": "munin/nominatim_importlag",
    "content": "#!/bin/sh\n#\n# Plugin to monitor the age of the imported data in the rendering db\n#\n# Can be configured through libpq environment variables, for example\n# PGUSER, PGDATABASE, etc. See man page of psql for more information\n#\n# To configure munin for a default installation, add these lines to\n# the file /etc/munin/plugin-conf.d/munin-node or in any file in the\n# directory /etc/munin/plugin-conf.d/\n#\n# [nominatim_*]\n# user www-data\n# env.PGUSER www-data\n# env.PGPORT 5432\n# env.PGDATABASE nominatim\n# env.age_warning 21600\n# env.age_critical 86400\n\n# Parameters:\n#\n#       config   (required)\n#       autoconf (optional - used by munin-config)\n#\n\n. $MUNIN_LIBDIR/plugins/plugin.sh\n\nif [ \"$1\" = \"config\" ]; then\n\n        echo 'graph_title Data import lag'\n        echo 'graph_args --base 1000 -l 0'\n        echo 'graph_vlabel minutes'\n        echo 'graph_category nominatim'\n        echo 'age.label DB import age'\n        echo 'age.type GAUGE'\n        echo 'age.cdef age,60,/'\n        print_warning age\n        print_critical age\n        exit 0\nfi\n\n\ndelay=`psql -c \"copy (select extract(epoch from timezone('utc', now())-lastimportdate)::int from import_status) to stdout\"`\n\n\necho \"age.value $delay\"\n"
  },
  {
    "path": "munin/nominatim_query_speed",
    "content": "#!/usr/bin/perl -w\n# Plugin to monitor response time of search queries.\n#\n# Based on a plugin by Dalibo <cedric.villemain@dalibo.com> 2007\n# Based on a plugin (postgres_block_read_) from Bjrn Ruberg <bjorn@linpro.no>\n#\n# Licenced under GPL v2.\n#\n# Usage:\n#\n#       If required, give username, password and/or Postgresql server\n#       host through environment variables. See man page of psql for\n#       more info.\n#\n# Parameters:\n#\n#       config   (required)\n#\n# Magic markers\n#%# family=auto\n#%# capabilities=autoconf\n\nuse strict;\nuse DBI;\nuse vars qw ( $debug $configure  );\nuse constant _PGMINI => 70400;\n\nmy $dbhost = $ENV{'PGHOST'} || '';\nmy $dbname = $ENV{'PGDATABASE'} || 'nominatim';\nmy $dbuser = $ENV{'PGUSER'} || 'postgres';\nmy $dbport = $ENV{'PGPORT'} || '5432';\n\nmy $dsn = \"DBI:Pg:dbname=$dbname\";\n$dsn   .=\";host=$dbhost;port=$dbport\" if $dbhost;\nmy $pg_server_version;\n\nif (exists $ARGV[0]) {\n  if ($ARGV[0] eq 'autoconf') {\n    # Check for DBD::Pg\n    if (! eval \"require DBD::Pg;\") {\n      print \"no (DBD::Pg not found)\";\n      exit 1;\n    }\n    my $dbh = DBI->connect ($dsn,\n                            $dbuser,\n                            '',\n                            {RaiseError =>1});\n    if ($dbh) {\n      $pg_server_version = $dbh->{'pg_server_version'};\n      if ($pg_server_version < (_PGMINI)) {\n        $pg_server_version =~ /(\\d)(\\d){2,2}(\\d){2,2}/;\n        print \"PostgreSQL Server version \" . (_PGMINI) . \" or above is needed. Current is $1.$2.$3 \\n\";\n\t\t\t\texit 1;\n      }\n      print \"yes\\n\";\n      exit 0;\n    } else {\n      print \"no Unable to access Database $dbname on host $dbhost as user $dbuser.\\nError returned was: \". $DBI::errstr;\n      exit 1;\n    }\n  } elsif ($ARGV[0] eq 'debug') {\n    # Set debug flag\n    $debug = 1;\n  } elsif ($ARGV[0] eq 'config') {\n    # Set config flag\n    $configure = 1;\n  }\n}\n\nprint \"# $dsn\\n\" if $debug;\nmy $dbh = DBI->connect ($dsn,\n                        $dbuser,\n                        '',\n                        {RaiseError =>1});\n\ndie (\"no Unable to access Database $dbname on host $dbhost as user $dbuser.\\nError returned was: \". $DBI::errstr.\"\\n\") unless($dbh);\n$pg_server_version = $dbh->{'pg_server_version'};\n\nif ($configure) {\n  print \"graph_title Total Nominatim response time\\n\";\n  print \"graph_vlabel Time to response\\n\";\n  print \"graph_category Nominatim \\n\";\n  print \"graph_period minute\\n\";\n  print \"graph_args --base 1000\\n\";\n\n  print \"avg.label Average time to response\\n\";\n  print \"avg.draw LINE\\n\";\n  print \"avg.type GAUGE\\n\";\n  print \"avg.min 0\\n\";\n  print \"avg.info Moving 5 minute average time to perform search\\n\";\n  print \"avg.label Average time to response\\n\";\n\n  print \"min.label Fastest time to response\\n\";\n  print \"min.draw LINE\\n\";\n  print \"min.type GAUGE\\n\";\n  print \"min.min 0\\n\";\n  print \"min.info Fastest query in last 5 minutes\\n\";\n\n  print \"max.label Slowest time to response\\n\";\n  print \"max.draw LINE\\n\";\n  print \"max.type GAUGE\\n\";\n  print \"max.min 0\\n\";\n  print \"max.info Slowest query in last 5 minutes\\n\";\n\n} else {\n\n  my $sql = \"select TO_CHAR(avg(endtime-starttime),'SS.MS'),TO_CHAR(min(endtime-starttime),'SS.MS'),TO_CHAR(max(endtime-starttime),'SS.MS') from new_query_log where starttime > 'now'::timestamp - '5 minutes'::interval\";\n  print \"# $sql\\n\" if $debug;\n  my $sth = $dbh->prepare($sql);\n  $sth->execute();\n  printf (\"# Rows: %d\\n\",  $sth->rows) if $debug;\n  if ($sth->rows > 0) {\n    my ($avg, $min, $max) = $sth->fetchrow_array();\n    print \"avg.value $avg\\n\";\n    print \"min.value $min\\n\";\n    print \"max.value $max\\n\";\n  }\n}\n\nexit 0;\n\n"
  },
  {
    "path": "munin/nominatim_requests",
    "content": "#!/bin/sh\n#\n# Plugin to monitor the types of requests made to the API\n#\n# Can be configured through libpq environment variables, for example\n# PGUSER, PGDATABASE, etc. See man page of psql for more information.\n#\n# Parameters: \n#\n#       config   (required)\n#       autoconf (optional - used by munin-config)\n#\n \nif [ \"$1\" = \"config\" ]; then\n \n        echo 'graph_title Requests by API call' \n        echo 'graph_args --base 1000 -l 0'\n        echo 'graph_vlabel requests per minute'\n        echo 'graph_category nominatim'\n        echo 'z1.label reverse'\n        echo 'z1.draw AREA'\n        echo 'z1.type GAUGE'\n        echo 'z2.label search (successful)'\n        echo 'z2.draw STACK'\n        echo 'z2.type GAUGE'\n        echo 'z3.label search (no result)'\n        echo 'z3.draw STACK'\n        echo 'z3.type GAUGE'\n        echo 'z4.label details'\n        echo 'z4.draw STACK'\n        echo 'z4.type GAUGE'\n        exit 0\nfi\n \n\nquery=\"select count(*)/5.0 from new_query_log where starttime > (now() - interval '5 min') and \"\n\nreverse=`psql -c \"copy ($query type='reverse') to stdout\"`\nsearchy=`psql -c \"copy ($query type='search' and results>0) to stdout\"`\nsearchn=`psql -c \"copy ($query type='search' and results=0) to stdout\"`\ndetails=`psql -c \"copy ($query type='details') to stdout\"`\n \necho \"z1.value $reverse\"\necho \"z2.value $searchy\"\necho \"z3.value $searchn\"\necho \"z4.value $details\"\n"
  },
  {
    "path": "nominatim-cli.py",
    "content": "#!/usr/bin/env python3\n# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nHelper script for development to run nominatim from the source directory.\n\"\"\"\nfrom pathlib import Path\nimport sys\n\nsys.path.insert(1, str((Path(__file__) / '..' / 'src').resolve()))\n\nfrom nominatim_db import cli\n\nexit(cli.nominatim())\n"
  },
  {
    "path": "packaging/nominatim-api/COPYING",
    "content": "GNU GENERAL PUBLIC LICENSE\nVersion 3, 29 June 2007\n\nCopyright © 2007 Free Software Foundation, Inc. <https://fsf.org/>\n\nEveryone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.\n\nPreamble\n\nThe GNU General Public License is a free, copyleft license for software and other kinds of works.\n\nThe licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.\n\nWhen we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.\n\nTo protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.\n\nFor example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.\n\nDevelopers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.\n\nFor the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.\n\nSome devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.\n\nFinally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.\n\nThe precise terms and conditions for copying, distribution and modification follow.\n\nTERMS AND CONDITIONS\n\n0. Definitions.\n\n“This License” refers to version 3 of the GNU General Public License.\n\n“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.\n\n“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.\n\nTo “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.\n\nA “covered work” means either the unmodified Program or a work based on the Program.\n\nTo “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.\n\nTo “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.\n\nAn interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.\n\n1. Source Code.\nThe “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.\n\nA “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.\n\nThe “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.\n\nThe “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.\n\nThe Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.\n\nThe Corresponding Source for a work in source code form is that same work.\n\n2. Basic Permissions.\nAll rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.\n\nYou may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.\n\nConveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.\n\n3. Protecting Users' Legal Rights From Anti-Circumvention Law.\nNo covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.\n\nWhen you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.\n\n4. Conveying Verbatim Copies.\nYou may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.\n\nYou may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.\n\n5. Conveying Modified Source Versions.\nYou may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:\n\n     a) The work must carry prominent notices stating that you modified it, and giving a relevant date.\n\n     b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.\n\n     c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.\n\n     d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.\n\nA compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.\n\n6. Conveying Non-Source Forms.\nYou may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:\n\n     a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.\n\n     b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.\n\n     c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.\n\n     d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.\n\n     e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.\n\nA separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.\n\nA “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.\n\n“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.\n\nIf you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).\n\nThe requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.\n\nCorresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.\n\n7. Additional Terms.\n“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.\n\nWhen you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.\n\nNotwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:\n\n     a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or\n\n     b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or\n\n     c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or\n\n     d) Limiting the use for publicity purposes of names of licensors or authors of the material; or\n\n     e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or\n\n     f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.\n\nAll other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.\n\nIf you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.\n\nAdditional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.\n\n8. Termination.\nYou may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).\n\nHowever, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.\n\nMoreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.\n\nTermination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.\n\n9. Acceptance Not Required for Having Copies.\nYou are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.\n\n10. Automatic Licensing of Downstream Recipients.\nEach time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.\n\nAn “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.\n\nYou may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.\n\n11. Patents.\nA “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.\n\nA contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.\n\nEach contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.\n\nIn the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.\n\nIf you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.\n\nIf, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.\n\nA patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.\n\nNothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.\n\n12. No Surrender of Others' Freedom.\nIf conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.\n\n13. Use with the GNU Affero General Public License.\nNotwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.\n\n14. Revised Versions of this License.\nThe Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.\n\nIf the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.\n\nLater license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.\n\n15. Disclaimer of Warranty.\nTHERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n16. Limitation of Liability.\nIN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n\n17. Interpretation of Sections 15 and 16.\nIf the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.\n\nEND OF TERMS AND CONDITIONS\n\nHow to Apply These Terms to Your New Programs\n\nIf you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.\n\nTo do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.\n\n     <one line to give the program's name and a brief idea of what it does.>\n     Copyright (C) <year>  <name of author>\n\n     This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n\n     This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.\n\n     You should have received a copy of the GNU General Public License along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:\n\n     <program>  Copyright (C) <year>  <name of author>\n     This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n     This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”.\n\nYou should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <https://www.gnu.org/licenses/>.\n\nThe GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <https://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "packaging/nominatim-api/README.md",
    "content": "# Nominatim - Frontend Library\n\nNominatim is a tool to search OpenStreetMap data\nby name and address (geocoding) and to generate synthetic addresses of\nOSM points (reverse geocoding).\n\nThis module implements the library for searching a Nominatim database\nimported with the [`nominatim-db`](https://pypi.org/project/nominatim-db/) package.\n\n## Installation\n\nTo install the Nominatim API from pypi, run:\n\n    pip install nominatim-api\n\n## Running a Nominatim server\n\nYou need Falcon or Starlette to run Nominatim as a service, as well as\nan ASGI-capable server like uvicorn. To install them from pypi run:\n\n    pip install falcon uvicorn\n\nYou need to have a Nominatim database imported with the 'nominatim-db'\npackage. Go to the project directory, then run uvicorn as:\n\n    uvicorn --factory nominatim_api.server.falcon.server:run_wsgi\n\n## Documentation\n\nThe full documentation for the Nominatim library can be found at:\nhttps://nominatim.org/release-docs/latest/library/Getting-Started/\n\nThe v1 API of the server is documented at:\nhttps://nominatim.org/release-docs/latest/api/Overview/\n\n## License\n\nThe source code is available under a GPLv3 license.\n"
  },
  {
    "path": "packaging/nominatim-api/extra_src/paths.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nPath settings for extra data used by Nominatim.\n\"\"\"\nfrom pathlib import Path\n\nDATA_DIR = None\nSQLLIB_DIR = None\nLUALIB_DIR = None\nCONFIG_DIR = (Path(__file__) / '..' / 'resources' / 'settings').resolve()\n"
  },
  {
    "path": "packaging/nominatim-api/pyproject.toml",
    "content": "[project]\nname = \"nominatim-api\"\ndescription = \"A tool for building a database of OpenStreetMap for geocoding and for searching the database. Search library.\"\nreadme = \"README.md\"\nrequires-python = \">=3.9\"\nlicense = 'GPL-3.0-or-later'\nmaintainers = [\n  { name = \"Sarah Hoffmann\", email = \"lonvia@denofr.de\" },\n  { name = \"Marc Tobias\", email = \"mtmail-cpan@gmx.net\" }\n]\nkeywords = [ \"geocoding\", \"OpenStreetMap\", \"search\" ]\nclassifiers = [\n    \"Programming Language :: Python :: 3\",\n    \"License :: OSI Approved :: GNU General Public License (GPL)\",\n    \"Operating System :: OS Independent\",\n]\ndependencies = [\n    \"async-timeout\",\n    \"python-dotenv\",\n    \"pyYAML>=5.1\",\n    \"SQLAlchemy[asyncio]>=1.4.31\",\n    \"psycopg\",\n    \"PyICU\"\n]\ndynamic = [\"version\"]\n\n[project.urls]\nHomepage = \"https://nominatim.org\"\nDocumentation = \"https://nominatim.org/release-docs/latest/\"\nIssues = \"https://github.com/osm-search/Nominatim/issues\"\nRepository = \"https://github.com/osm-search/Nominatim\"\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.hatch.version]\npath = \"src/nominatim_api/version.py\"\npattern = \"NOMINATIM_API_VERSION = '(?P<version>[^']+)'\"\n\n[tool.hatch.build.targets.sdist]\ninclude = [\n    \"src/nominatim_api\",\n    \"src/nominatim_db/config.py\",\n    \"settings\",\n    \"extra_src/paths.py\"\n]\n\nexclude = [\n  \"src/nominatim_api/config.py\"\n]\n\n[tool.hatch.build.targets.wheel]\npackages = [\"src/nominatim_api\"]\n\n[tool.hatch.build.targets.wheel.force-include]\n\"src/nominatim_db/config.py\" = \"nominatim_api/config.py\"\n\"extra_src/paths.py\" = \"nominatim_api/paths.py\"\n\"settings\" = \"nominatim_api/resources/settings\"\n"
  },
  {
    "path": "packaging/nominatim-db/COPYING",
    "content": "GNU GENERAL PUBLIC LICENSE\nVersion 3, 29 June 2007\n\nCopyright © 2007 Free Software Foundation, Inc. <https://fsf.org/>\n\nEveryone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.\n\nPreamble\n\nThe GNU General Public License is a free, copyleft license for software and other kinds of works.\n\nThe licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.\n\nWhen we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.\n\nTo protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.\n\nFor example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.\n\nDevelopers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.\n\nFor the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.\n\nSome devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.\n\nFinally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.\n\nThe precise terms and conditions for copying, distribution and modification follow.\n\nTERMS AND CONDITIONS\n\n0. Definitions.\n\n“This License” refers to version 3 of the GNU General Public License.\n\n“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.\n\n“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.\n\nTo “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.\n\nA “covered work” means either the unmodified Program or a work based on the Program.\n\nTo “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.\n\nTo “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.\n\nAn interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.\n\n1. Source Code.\nThe “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.\n\nA “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.\n\nThe “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.\n\nThe “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.\n\nThe Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.\n\nThe Corresponding Source for a work in source code form is that same work.\n\n2. Basic Permissions.\nAll rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.\n\nYou may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.\n\nConveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.\n\n3. Protecting Users' Legal Rights From Anti-Circumvention Law.\nNo covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.\n\nWhen you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.\n\n4. Conveying Verbatim Copies.\nYou may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.\n\nYou may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.\n\n5. Conveying Modified Source Versions.\nYou may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:\n\n     a) The work must carry prominent notices stating that you modified it, and giving a relevant date.\n\n     b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.\n\n     c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.\n\n     d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.\n\nA compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.\n\n6. Conveying Non-Source Forms.\nYou may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:\n\n     a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.\n\n     b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.\n\n     c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.\n\n     d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.\n\n     e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.\n\nA separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.\n\nA “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.\n\n“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.\n\nIf you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).\n\nThe requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.\n\nCorresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.\n\n7. Additional Terms.\n“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.\n\nWhen you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.\n\nNotwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:\n\n     a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or\n\n     b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or\n\n     c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or\n\n     d) Limiting the use for publicity purposes of names of licensors or authors of the material; or\n\n     e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or\n\n     f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.\n\nAll other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.\n\nIf you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.\n\nAdditional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.\n\n8. Termination.\nYou may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).\n\nHowever, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.\n\nMoreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.\n\nTermination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.\n\n9. Acceptance Not Required for Having Copies.\nYou are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.\n\n10. Automatic Licensing of Downstream Recipients.\nEach time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.\n\nAn “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.\n\nYou may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.\n\n11. Patents.\nA “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.\n\nA contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.\n\nEach contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.\n\nIn the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.\n\nIf you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.\n\nIf, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.\n\nA patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.\n\nNothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.\n\n12. No Surrender of Others' Freedom.\nIf conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.\n\n13. Use with the GNU Affero General Public License.\nNotwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.\n\n14. Revised Versions of this License.\nThe Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.\n\nIf the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.\n\nLater license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.\n\n15. Disclaimer of Warranty.\nTHERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n16. Limitation of Liability.\nIN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n\n17. Interpretation of Sections 15 and 16.\nIf the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.\n\nEND OF TERMS AND CONDITIONS\n\nHow to Apply These Terms to Your New Programs\n\nIf you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.\n\nTo do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.\n\n     <one line to give the program's name and a brief idea of what it does.>\n     Copyright (C) <year>  <name of author>\n\n     This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n\n     This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.\n\n     You should have received a copy of the GNU General Public License along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:\n\n     <program>  Copyright (C) <year>  <name of author>\n     This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n     This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”.\n\nYou should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <https://www.gnu.org/licenses/>.\n\nThe GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <https://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "packaging/nominatim-db/README.md",
    "content": "# Nominatim - DB Backend\n\nNominatim is a tool to search OpenStreetMap data\nby name and address (geocoding) and to generate synthetic addresses of\nOSM points (reverse geocoding).\n\nThis module implements the database backend for Nominatim and the\ncommand-line tool for importing and maintaining the database.\n\n## Installation\n\n### Prerequisites\n\nNominatim requires [osm2pgsql](https://osm2pgsql.org/) (>=1.8) for reading\nOSM data and [PostgreSQL](https://www.postgresql.org/) (>=9.6) to store the data.\n\nOn Ubuntu (>=23.04) and Debian (when using backports), you can install them with:\n\n    sudo apt-get install osm2pgsql postgresql-postgis\n\n### Installation from pypi\n\nTo install Nominatim from pypi, run:\n\n    pip install nominatim-db\n\n\n## Quick start\n\nFirst create a project directory for your new Nominatim database, which\nis the space for additional configuration and customization:\n\n    mkdir nominatim-project\n\nMake sure you run all nominatim commands from within the project directory:\n\n    cd nominatim-project\n\nDownload an appropriate data extract, for example from\n[Geofabrik](https://download.geofabrik.de/) and import the file:\n\n    nominatim import --osm-file <downlaoded-osm-data.pbf>\n\nYou will need to install the [`nominatim-api`](https://pypi.org/project/nominatim-api/)\npackage to query the database.\n\n## Documentation\n\nA HTML version of the documentation can be found at\nhttps://nominatim.org/release-docs/latest/ .\n\n## License\n\nThe source code is available under a GPLv3 license.\n"
  },
  {
    "path": "packaging/nominatim-db/extra_src/nominatim_db/paths.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nPath settings for extra data used by Nominatim.\n\"\"\"\nfrom pathlib import Path\n\nDATA_DIR = (Path(__file__) / '..' / 'resources').resolve()\nSQLLIB_DIR = (DATA_DIR / 'lib-sql')\nLUALIB_DIR = (DATA_DIR / 'lib-lua')\nCONFIG_DIR = (DATA_DIR / 'settings')\n"
  },
  {
    "path": "packaging/nominatim-db/pyproject.toml",
    "content": "[project]\nname = \"nominatim-db\"\ndescription = \"A tool for building a database of OpenStreetMap for geocoding and for searching the database. Database backend.\"\nreadme = \"README.md\"\nrequires-python = \">=3.9\"\nlicense = 'GPL-3.0-or-later'\nmaintainers = [\n  { name = \"Sarah Hoffmann\", email = \"lonvia@denofr.de\" },\n  { name = \"Marc Tobias\", email = \"mtmail-cpan@gmx.net\" }\n]\nkeywords = [ \"geocoding\", \"OpenStreetMap\", \"search\" ]\nclassifiers = [\n    \"Programming Language :: Python :: 3\",\n    \"License :: OSI Approved :: GNU General Public License (GPL)\",\n    \"Operating System :: OS Independent\",\n]\ndependencies = [\n    \"psycopg != 3.3.0\",\n    \"python-dotenv\",\n    \"jinja2\",\n    \"pyYAML>=5.1\",\n    \"psutil\",\n    \"PyICU\",\n    \"mwparserfromhell\"\n]\ndynamic = [\"version\"]\n\n[project.urls]\nHomepage = \"https://nominatim.org\"\nDocumentation = \"https://nominatim.org/release-docs/latest/\"\nIssues = \"https://github.com/osm-search/Nominatim/issues\"\nRepository = \"https://github.com/osm-search/Nominatim\"\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.hatch.version]\npath = \"src/nominatim_db/version.py\"\npattern = \"NOMINATIM_VERSION = parse_version.'(?P<version>[^-]+)\"\n\n[tool.hatch.build.targets.sdist]\ninclude = [\n    \"src/nominatim_db\",\n    \"scripts\",\n    \"lib-sql/**/*.sql\",\n    \"lib-lua/**/*.lua\",\n    \"settings\",\n    \"data/words.sql\",\n    \"extra_src/nominatim_db/paths.py\"\n]\n\nartifacts = [\n  \"data/country_osm_grid.sql.gz\"\n]\n\nexclude = [\n  \"src/nominatim_db/paths.py\"\n]\n\n[tool.hatch.build.targets.wheel]\npackages = [\"src/nominatim_db\"]\n\n[tool.hatch.build.targets.wheel.shared-scripts]\n\"scripts\" = \"/\"\n\n[tool.hatch.build.targets.wheel.force-include]\n\"lib-sql\" = \"nominatim_db/resources/lib-sql\"\n\"lib-lua\" = \"nominatim_db/resources/lib-lua\"\n\"settings\" = \"nominatim_db/resources/settings\"\n\"data/country_osm_grid.sql.gz\" = \"nominatim_db/resources/country_osm_grid.sql.gz\"\n\"data/words.sql\" = \"nominatim_db/resources/words.sql\"\n\"extra_src/nominatim_db/paths.py\" = \"nominatim_db/paths.py\"\n"
  },
  {
    "path": "packaging/nominatim-db/scripts/nominatim",
    "content": "#!python3\n\nfrom nominatim_db import cli\n\nexit(cli.nominatim())\n"
  },
  {
    "path": "settings/address-levels.json",
    "content": "[\n{ \"tags\" : {\n      \"place\" : {\n          \"sea\" : [2, 0],\n          \"island\" : [17, 0],\n          \"islet\" : [20, 0],\n          \"continent\" : [2, 0],\n          \"country\" : [4, 0],\n          \"state\" : [8, 0],\n          \"province\" : [8, 0],\n          \"region\" : [18, 0],\n          \"county\" : 12,\n          \"district\" : 12,\n          \"municipality\" : 14,\n          \"city\" : 16,\n          \"town\" : [18, 16],\n          \"borough\" : 18,\n          \"village\" : [19, 16],\n          \"suburb\" : [19, 20],\n          \"hamlet\" : 20,\n          \"croft\" : 20,\n          \"subdivision\" : 22,\n          \"allotments\" : 22,\n          \"neighbourhood\" : 24,\n          \"quarter\" : [20, 22],\n          \"isolated_dwelling\" : [22, 25],\n          \"farm\" : [22, 25],\n          \"city_block\" : 25,\n          \"mountain_pass\" : 25,\n          \"square\" : 25,\n          \"locality\" : 25,\n          \"houses\" : [28, 0],\n          \"house\" : 30,\n          \"\" : [22, 0]\n      },\n      \"boundary\" : {\n          \"administrative2\" : 4,\n          \"administrative3\" : 6,\n          \"administrative4\" : 8,\n          \"administrative5\" : 10,\n          \"administrative6\" : 12,\n          \"administrative7\" : 14,\n          \"administrative8\" : 16,\n          \"administrative9\" : 18,\n          \"administrative10\" : 20,\n          \"administrative11\" : 22,\n          \"administrative12\" : 24,\n          \"\" : [25, 0]\n      },\n      \"landuse\" : {\n          \"residential\" : 24,\n          \"farm\" : 24,\n          \"farmyard\" : 24,\n          \"industrial\" : 24,\n          \"commercial\" : 24,\n          \"allotments\" : 24,\n          \"retail\" : 24,\n          \"\" : [24, 0]\n      },\n      \"leisure\" : {\n          \"park\" : [24, 0],\n          \"nature_reserve\" : [24, 0],\n          \"garden\": [25, 0],\n          \"common\": [25, 0]\n      },\n      \"natural\" : {\n          \"peak\" : [18, 0],\n          \"volcano\" : [18, 0],\n          \"mountain_range\" : [18, 0],\n          \"sea\" : [4, 0],\n          \"tree\" : 30,\n          \"spring\"  : 30,\n          \"cave_entrance\" : 30,\n          \"geyser\" : 30,\n          \"hot_spring\" : 30,\n          \"rock\" : 30,\n          \"stone\" : 30,\n          \"\" : [22, 0]\n      },\n      \"water\" : {\n          \"lake\" : [20, 0],\n          \"reservoir\" : [20, 0],\n          \"wastewater\" : [24, 0],\n          \"pond\" : [24, 0],\n          \"fountain\" : [24, 0],\n          \"\" : [22, 0]\n      },\n      \"waterway\" : {\n          \"river\" : [19, 0],\n          \"stream\" : [22, 0],\n          \"ditch\" : [22, 0],\n          \"drain\" : [22, 0],\n          \"\" : [20, 0]\n      },\n      \"highway\" : {\n          \"\" : 30,\n          \"service\" : 27,\n          \"cycleway\" : 27,\n          \"path\" : 27,\n          \"footway\" : 27,\n          \"steps\" : 27,\n          \"bridleway\" : 27,\n          \"motorway_link\" : 27,\n          \"primary_link\" : 27,\n          \"trunk_link\" : 27,\n          \"secondary_link\" : 27,\n          \"tertiary_link\" : 27,\n          \"residential\" : 26,\n          \"track\" : 26,\n          \"unclassified\" : 26,\n          \"tertiary\" : 26,\n          \"secondary\" : 26,\n          \"primary\" : 26,\n          \"living_street\" : 26,\n          \"trunk\" : 26,\n          \"motorway\" : 26,\n          \"pedestrian\" : 26,\n          \"road\" : 26,\n          \"construction\" : 26\n      },\n      \"mountain_pass\" : {\n          \"\" : [20, 0]\n      },\n      \"historic\" : {\n          \"neighbourhood\" : [22, 0]\n      }\n  }\n},\n{ \"countries\" : [ \"au\" ],\n  \"tags\" : {\n      \"boundary\" : {\n          \"administrative6\": [12, 0]\n      }\n  }\n},\n{ \"countries\" : [ \"ca\" ],\n  \"tags\" : {\n      \"place\" : {\n          \"county\" : [12, 0]\n      }\n  }\n},\n{ \"countries\": [ \"cz\" ],\n  \"tags\" : {\n      \"boundary\" : {\n          \"administrative5\": 12,\n          \"administrative6\": [13, 0],\n          \"administrative7\": [14, 0],\n          \"administrative8\": 14,\n          \"administrative9\": 15,\n          \"administrative10\": 16\n      }\n  }\n},\n{ \"countries\" : [ \"de\" ],\n  \"tags\" : {\n      \"place\" : {\n          \"region\" : [10, 0],\n          \"county\" : [12, 0]\n      },\n      \"boundary\" : {\n          \"administrative5\" : [10, 0]\n      }\n  }\n},\n{ \"countries\" : [ \"be\" ],\n  \"tags\" : {\n      \"boundary\" : {\n          \"administrative3\" : [5, 0],\n          \"administrative4\" : 6,\n          \"administrative5\" : [7, 0],\n          \"administrative6\" : 8,\n          \"administrative7\" : 12,\n          \"administrative8\" : 14,\n          \"administrative9\" : 16,\n          \"administrative10\" : 18\n      }\n  }\n},\n{ \"countries\" : [ \"br\" ],\n  \"tags\" : {\n      \"boundary\" : {\n          \"administrative5\" : [10, 0],\n          \"administrative6\" : [12, 0],\n          \"administrative7\" : [14, 0]\n      }\n  }\n},\n{ \"countries\" : [\"se\", \"no\"],\n  \"tags\" : {\n      \"place\" : {\n      },\n      \"boundary\" : {\n          \"administrative3\" : 8,\n          \"administrative4\" : 12\n      }\n  }\n},\n{ \"countries\" : [\"id\"],\n  \"tags\" : {\n      \"place\" : {\n          \"municipality\" : 18\n      },\n      \"boundary\" : {\n          \"administrative5\" : 12,\n          \"administrative6\" : 14,\n          \"administrative7\" : 16,\n          \"administrative8\" : 20,\n          \"administrative9\" : 22,\n          \"administrative10\" : 24\n      }\n  }\n},\n{ \"countries\" : [\"ru\"],\n  \"tags\" : {\n      \"place\" : {\n          \"municipality\" : 18\n      },\n      \"boundary\" : {\n          \"administrative5\" : [10, 0],\n          \"administrative7\" : [13, 0],\n          \"administrative8\" : 14\n      }\n  }\n},\n{ \"countries\" : [ \"nl\" ],\n  \"tags\" : {\n      \"boundary\" : {\n          \"administrative7\" : [13, 0],\n          \"administrative8\" : 14,\n          \"administrative9\" : [15, 0],\n          \"administrative10\" : 16\n      }\n  }\n},\n{ \"countries\" : [\"es\"],\n  \"tags\" : {\n      \"place\" : {\n          \"province\" : 10,\n          \"civil_parish\" : 18\n      },\n      \"boundary\" : {\n          \"administrative5\" : [10, 0],\n          \"administrative6\" : 10,\n          \"administrative7\" : 12,\n          \"administrative10\" : 22\n      }\n  }\n},\n{ \"countries\" : [\"sa\"],\n  \"tags\" : {\n      \"place\" : {\n          \"province\" : 12,\n          \"municipality\" : 18\n      }\n  }\n},\n{ \"countries\" : [\"sk\"],\n  \"tags\" : {\n      \"boundary\" : {\n          \"administrative5\" : [10, 0],\n          \"administrative6\" : 11,\n          \"administrative7\" : [11, 0],\n          \"administrative8\" : 12,\n          \"administrative9\" : 16,\n          \"administrative10\" : 18,\n          \"administrative11\" : 20\n      }\n  }\n},\n{ \"countries\" : [\"jp\"],\n  \"tags\" : {\n      \"boundary\" : {\n          \"administrative7\" : 16,\n          \"administrative8\" : 18,\n          \"administrative9\" : 20,\n          \"administrative10\" : 22,\n          \"administrative11\" : 24\n      }\n  }\n}\n\n]\n\n"
  },
  {
    "path": "settings/country-names/ad.yaml",
    "content": "name: \n    default: Andorra\n    ab: Андора\n    af: Andorra\n    ak: Andora\n    am: አንዶራ\n    an: Andorra\n    ar: أندورا\n    av: Андо́рра\n    az: Andorra\n    ba: Андо́рра\n    be: Андо́ра\n    bg: Андора\n    bh: अंडोरा\n    bi: Andorra\n    bm: Andɔr\n    bn: অ্যান্ডোরা\n    bo: ཨན་ཌོར་ར།\n    br: Andorra\n    bs: Andora\n    ca: Andorra\n    ce: Андо́рра\n    co: Andorra\n    cs: Andorra\n    cu: Андо́ра\n    cv: Андорра\n    cy: Andorra\n    da: Andorra\n    de: Andorra\n    dv: އެންޑޯރާ\n    dz: ཨཱན་དོ་ར\n    ee: Andorra\n    el: Ανδόρρα\n    en: Andorra\n    eo: Andoro\n    es: Andorra\n    et: Andorra\n    eu: Andorra\n    fa: آندورا\n    ff: Anndoora\n    fi: Andorra\n    fo: Andorra\n    fr: Andorre\n    fy: Andorra\n    ga: Andóra\n    gd: Andorra\n    gl: Andorra\n    gn: Andorra\n    gu: એન્ડોરા\n    gv: Andorra\n    ha: Andorra\n    he: אַנְדּוֹרָה\n    hi: अण्डोरा\n    hr: Andora\n    ht: Andora\n    hu: Andorra\n    hy: Անդորրա\n    ia: Andorra\n    id: Andorra\n    ie: Andorra\n    ig: Andorra\n    io: Andora\n    is: Andorra\n    it: Andorra\n    ja: アンドラ\n    jv: Andorra\n    ka: ანდორა\n    kg: Andora\n    ki: Andora\n    kk: Андорра\n    kl: Andorra\n    km: អង់ដូរ៉ា\n    kn: ಅಂಡೋರ\n    ko: 안도라\n    ks: اٮ۪نڑورا\n    ku: Andorra\n    kv: Андорра\n    kw: Andorra\n    ky: Андорра\n    la: Andorra\n    lb: Andorra\n    lg: Andora\n    li: Andorra\n    ln: Andora\n    lo: ອັງດອກ\n    lt: Andora\n    lv: Andora\n    mg: Andora\n    mi: Andorra\n    mk: Андора\n    ml: അൻഡോറ\n    mn: Андорра\n    mr: आंदोरा\n    ms: Andorra\n    mt: Andorra\n    my: အင်ဒိုရာနိုင်ငံ\n    na: Andorra\n    ne: एण्डोरा\n    nl: Andorra\n    \"no\": Andorra\n    nv: Andówa\n    oc: Andòrra\n    om: Andooraa\n    or: ଆଣ୍ଡୋରା\n    os: Андоррæ\n    pa: ਅੰਡੋਰਾ\n    pi: अंडोरा\n    pl: Andora\n    ps: اندورا\n    pt: Andorra\n    qu: Andurra\n    rm: Andorra\n    rn: Andora\n    ro: Andorra\n    ru: Андорра\n    rw: Andora\n    sa: अण्डोरा\n    sc: Andorra\n    sd: انڊورا\n    se: Andorra\n    sg: Andôro\n    sh: Andora\n    si: ඇන්ඩෝරා\n    sk: Andorra\n    sl: Andora\n    sm: Andora\n    sn: Andorra\n    so: Andorra\n    sq: Andorra\n    sr: Андора\n    ss: iYandola\n    su: Andorra\n    sv: Andorra\n    sw: Andorra\n    ta: அண்டோரா\n    te: అండొర్రా\n    tg: Андорра\n    th: อันดอร์รา\n    ti: አንዶራ\n    tk: Andorra\n    tl: Andorra\n    to: ʻEnitola\n    tr: Andorra\n    ts: Andorra\n    tt: Андорра\n    tw: Andorra\n    ug: ئاندوررا\n    uk: Андо́рра\n    ur: انڈورا\n    uz: Andorra\n    vi: Andorra\n    vo: Landorän\n    wo: Andoor\n    yi: אַנדאָרע\n    yo: Àndórà\n    zh: 安道爾\n    zu: I-Andora\n"
  },
  {
    "path": "settings/country-names/ae.yaml",
    "content": "name: \n    default: الإمارات العربية المتحدة\n    af: Verenigde Arabiese Emirate\n    am: የተባበሩት የዓረብ ግዛቶች\n    an: Emiratos Arabes Unitos\n    ar: الإمارات العربية المتحدة\n    av: ГIарабазул Цолъарал Имаратал\n    az: Birləşmiş Ərəb Əmirlikləri\n    be: Аб'яднаныя Арабскія Эміраты\n    bg: Обединени арабски емирства\n    bn: সংযুক্ত আরব আমিরাত\n    bo: ཡི་ནེ་ཁྲེ་ཀྲི་ཨ་རབ་ཨེ་མེ་རེ་ཁྲི།\n    br: Emirelezhioù Arab Unanet\n    bs: Ujedinjeni Arapski Emirati\n    ca: Emirats Àrabs Units\n    ce: Ӏарбийн Цхьаьнакхетта Эмираташ\n    cs: Spojené arabské emiráty\n    cy: Yr Emiradau Arabaidd Unedig\n    da: Forenede Arabiske Emirater\n    de: Vereinigte Arabische Emirate\n    dv: އެކުވެރި ޢަރަބި އިމާރާތު\n    dz: ཡུ་ནའི་ཊེཊ་ཨ་རབ་ཨེ་མི་རེཊསི་\n    el: Ηνωμένα Αραβικά Εμιράτα\n    en: United Arab Emirates\n    eo: Unuiĝintaj Arabaj Emirlandoj\n    es: Emiratos Árabes Unidos\n    et: Araabia Ühendemiraadid\n    eu: Arabiar Emirerri Batuak\n    fa: امارات متحده عربی\n    fi: Yhdistyneet arabiemiirikunnat\n    fo: Sameindu Emirríkini\n    fr: Émirats arabes unis\n    fy: Feriene Arabyske Emiraten\n    ga: Aontas na nÉimíríochtaí Arabacha\n    gd: Na h-Iomaratan Arabach Aonaichte\n    gl: Emiratos Árabes Unidos\n    gn: Aravia Emiryvy Joaju\n    gv: Ny h-Emmiraidyn Arabagh Unnaneysit\n    he: איחוד האמירויות הערביות\n    hi: संयुक्त अरब अमीरात\n    hr: Ujedinjeni Arapski Emirati\n    ht: Emira Arab Ini\n    hu: Egyesült Arab Emírségek\n    hy: Արաբական Միացյալ Էմիրություններ\n    ia: Emiratos Arabe Unite\n    id: Uni Emirat Arab\n    ie: Unit Arabic Emiratus\n    io: Unionita Araba Emirati\n    is: Sameinuðu arabísku furstadæmin\n    it: Emirati Arabi Uniti\n    ja: アラブ首長国連邦\n    jv: Uni Emirat Arab\n    ka: არაბთა გაერთიანებული საამიროები\n    ki: United Arab Emirates\n    kk: Біріккен Араб Әмірліктері\n    kl: United Arab Emirates\n    kn: ಸಂಯುಕ್ತ ಅರಬ ಅಮೀರಾತ\n    ko: 아랍에미리트\n    ku: Mîrnişînên Erebî yên Yekbûyî\n    kv: Ӧтувтчӧм Араб Эмиратъяс\n    kw: Pennternasedh Unys Arabek\n    ky: Бириккен Араб Эмирликтери\n    la: Phylarchiarum Arabicarum Confoederatio\n    lb: Vereenegt Arabesch Emiraten\n    li: Vereinegde Arabische Emiraote\n    lt: Jungtiniai Arabų Emyratai\n    lv: Apvienotie Arābu Emirāti\n    mi: Te Kotahitanga o ngā Whenua Ārapi\n    mk: Обединети Арапски Емирати\n    ml: ഐക്യ അറബ് എമിറേറ്റുകൾ\n    mn: Арабын Нэгдсэн Эмирт Улс\n    mr: संयुक्त अरब अमिराती\n    ms: Emiriah Arab Bersatu\n    mt: Emirati Għarab Magħquda\n    my: အာရပ်စော်ဘွားများပြည်ထောင်စုနိုင်ငံ\n    na: Emireitit Arabiya\n    nb: De forente arabiske emirater\n    ne: संयुक्त अरब इमिरेट्स\n    nl: Verenigde Arabische Emiraten\n    nn: Dei sameinte arabiske emirata\n    \"no\": De forente arabiske emirater\n    nv: Ásáí Bikéyah Yázhí Ałhidadiidzooígíí\n    oc: Emirats Arabis Units\n    or: ୟୁନାଇଟେଡ଼ ଆରବ ଏମିରଟ\n    os: Араббы Иугонд Эмираттæ\n    pa: ਸੰਯੁਕਤ ਅਰਬ ਇਮਰਾਤ\n    pl: Emiraty Arabskie\n    ps: عربي متحده امارات\n    pt: Emirados Árabes Unidos\n    qu: Hukllachasqa Arab Imiratukuna\n    ro: Emiratele Arabe Unite\n    ru: Объединённые Арабские Эмираты\n    rw: Nyarabu Zunze Ubumwe\n    sd: گڏيل عرب امارات\n    se: Ovttastuvvan arábaemiráhtat\n    sh: Ujedinjeni Arapski Emirati\n    sk: Spojené arabské emiráty\n    sl: Združeni arabski emirati\n    so: Imaaraatka Carabta\n    sq: Emiratet e Bashkuara Arabe\n    sr: Уједињени Арапски Емирати\n    ss: Bunye bema-Arabhu\n    su: Uni Émirat Arab\n    sv: Förenade Arabemiraten\n    sw: Falme za Kiarabu\n    ta: ஐக்கிய அரபு அமீரகம்\n    te: యునైటెడ్ అరబ్ ఎమిరేట్స్\n    tg: Аморати Муттаҳидаи Араб\n    th: สหรัฐอาหรับเอมิเรตส์\n    tk: Birleşen Arap Emirlikleri\n    tl: United Arab Emirates\n    tr: Birleşik Arap Emirlikleri\n    tt: Берләшкән Гарәп Әмирлекләре\n    ug: ئەرەب بىرلەشمە خەلىپىلىكى\n    uk: Об'єднані Арабські Емірати\n    ur: متحدہ عرب امارات\n    uz: Birlashgan Arab Amirliklari\n    vi: Các Tiểu vương quốc Ả Rập Thống nhất\n    vo: Lemiräns Larabik Pebalöl\n    wo: Imaaraat yu Araab yu Bennoo yi\n    yi: פאראייניגטע אראבישע עמיראטן\n    yo: Àwọn Ẹ́mírétì Árábù Aṣọ̀kan\n    zh: 阿拉伯联合酋长国\n"
  },
  {
    "path": "settings/country-names/af.yaml",
    "content": "name: \n    default: افغانستان\n    af: Afghanistan\n    ak: Afganistan\n    am: አፍጋኒስታን\n    an: Afganistán\n    ar: أفغانستان\n    as: আফগানিস্তান\n    az: Əfqanıstan\n    ba: Афғанстан\n    be: Афганістан\n    bg: Афганистан\n    bh: अफ़ग़ानिस्तान\n    bm: Afiganistaŋ\n    bn: আফগানিস্তান\n    bo: ཨ་ཧྥུའུ་རྒན་སི་ཐན།\n    br: Afghanistan\n    bs: Afganistan\n    ca: Afganistan\n    ce: АфгIанистан\n    ch: Afghanistan\n    co: Afghanistan\n    cs: Afghánistán\n    cv: Афганистан\n    cy: Affganistan\n    da: Afghanistan\n    de: Afghanistan\n    dv: އަފްޣާނިސްތާން\n    dz: ཨཕ་ག་ནིསི་ཏཱན་\n    ee: Afghanistan nutome\n    el: Αφγανιστάν\n    en: Afghanistan\n    eo: Afganio\n    es: Afganistán\n    et: Afganistan\n    eu: Afganistan\n    fa: افغانستان\n    ff: Afganistaan\n    fi: Afganistan\n    fo: Afghanistan\n    fr: Afghanistan\n    fy: Afganistan\n    ga: An Afganastáin\n    gd: Afganastan\n    gl: Afganistán - افغانستان\n    gn: Ahyganitã\n    gu: અફઘાનિસ્તાન\n    gv: Yn Afghanistaan\n    ha: Afghanistan\n    he: אפגניסטן\n    hi: अफ़्गानिस्तान\n    hr: Afganistan\n    ht: Afganistan\n    hu: Afganisztán\n    hy: Աֆղանստան\n    ia: Afghanistan\n    id: Afganistan\n    ie: Afghanistan\n    io: Afganistan\n    is: Afganistan\n    it: Afghanistan\n    iu: ᐊᑉᒐᓂᔅᑕᓐ\n    ja: アフガニスタン\n    jv: Afganistan\n    ka: ავღანეთი\n    kg: Afghanistan\n    ki: Afghanistan\n    kk: Ауғанстан\n    kl: Afghanistan\n    km: សាធារណរដ្ឋឥស្លាមអាហ្វហ្កានីស្ថាន\n    kn: ಅಫ್ಘಾನಿಸ್ತಾನ\n    ko: 아프가니스탄\n    ks: اَفغانَستان\n    ku: Afxanistan\n    kv: Афганистан\n    kw: Afghanistan\n    ky: Ооганстан\n    la: Afgania\n    lb: Afghanistan\n    lg: Afaganisitani\n    li: Afghanistan\n    ln: Afganistáni\n    lo: ອັບການິສະຖານ\n    lt: Afganistanas\n    lv: Afganistāna\n    mg: Afganistana\n    mi: Āwhekenetāna\n    mk: Авганистан\n    ml: അഫ്ഗാനിസ്താൻ\n    mn: Афганистан\n    mo: Афганистан\n    mr: अफगाणिस्तान\n    ms: Afghanistan\n    mt: Afganistan\n    my: အာဖဂန်နစ္စတန်နိုင်ငံ\n    na: Apeganitan\n    ne: अफगानिस्तान\n    nl: Afghanistan\n    \"no\": Afghanistan\n    oc: Afganistan\n    om: Afgaanistaan\n    or: ଆଫଗାନିସ୍ତାନ\n    os: Афгъанистан\n    pa: ਅਫ਼ਗ਼ਾਨਿਸਤਾਨ\n    pi: अफगानस्थान\n    pl: Afganistan\n    ps: افغانستان\n    pt: Afeganistão\n    qu: Afgansuyu\n    rm: Afganistan\n    rn: Afuganisitani\n    ro: Afganistan\n    ru: Афганистан\n    rw: Afuganisitani\n    sa: अफगानस्थान\n    sc: Afganistàn\n    sd: افغانستان\n    se: Afganistána\n    sg: Faganïta, Afganïstäan\n    sh: Afganistan\n    si: ඇෆ්ගනිස්ථානය\n    sk: Afganistan\n    sl: Afganistan\n    sm: Afakanisitana\n    sn: Afghanistan\n    so: Afgaanistan\n    sq: Afganistani\n    sr: Авганистан\n    ss: I-Afugani\n    su: Apganistan\n    sv: Afghanistan\n    sw: Afghanistan\n    ta: ஆப்கானித்தான்\n    te: ఆఫ్ఘనిస్తాన్\n    tg: Афғонистон\n    th: ประเทศอัฟกานิสถาน\n    ti: አፍጋኒስታን\n    tk: Owganystan\n    tl: Apganistan\n    to: ʻAfukanisitani\n    tr: Afganistan\n    tt: Әфганстан\n    ug: ئافغانىستان\n    uk: Афганістан\n    ur: افغانستان\n    uz: Afgʻoniston\n    vi: Afghanistan\n    vo: Lafganistän\n    wo: Afganistaan\n    yi: אפגאניסטאן\n    yo: Afghanístàn\n    za: Afghanistan\n    zh: 阿富汗\n    zu: I-Afganistani\n"
  },
  {
    "path": "settings/country-names/ag.yaml",
    "content": "name: \n    default: Antigua and Barbuda\n    af: Antigua en Barbuda\n    ak: Antigua ne Baabuda\n    am: አንቲጋ እና ባርቡዳ\n    an: Antigua y Barbuda\n    ar: أنتيغوا وباربودا\n    as: এণ্টিগুৱা আৰু বাৰ্বুডা\n    ay: Antiwa wan Barbuda\n    az: Antiqua və Barbuda\n    ba: Антигуа һәм Барбуда\n    be: Антыгуа́ і Барбу́да\n    bg: Антигуа и Барбуда\n    bm: Antiga-ni-Barbuda\n    bn: অ্যান্টিগুয়া ও বার্বুডা\n    bo: ཨེན་ཊི་གུའ་དང་བར་བུ་ཌ།\n    br: Antigua ha Barbuda\n    bs: Antigva i Barbuda\n    ca: Antigua i Barbuda\n    ce: Анти́гуа а Барбу́да\n    cs: Antigua a Barbuda\n    cy: Antigwa a Barbiwda\n    da: Antigua og Barbuda\n    de: Antigua und Barbuda\n    dv: އެންޓިގުއާ އަދި ބާބިއުޑާ\n    dz: ཨན་ཊི་གུ་ཝ་ ཨེནཌ་ བྷར་བྷུ་ཌ\n    ee: Antigua and Barbuda\n    el: Αντίγκουα και Μπαρμπούντα\n    en: Antigua and Barbuda\n    eo: Antigvo-Barbudo\n    es: Antigua y Barbuda\n    et: Antigua ja Barbuda\n    eu: Antigua eta Barbuda\n    fa: آنتیگوا و باربودا\n    ff: Antiguwaa e Barbudaa\n    fi: Antigua ja Barbuda\n    fo: Antigua og Barbuda\n    fr: Antigua-et-Barbuda\n    fy: Antigûa en Barbûda\n    ga: Antigua agus Barbúda\n    gd: Antigua agus Barbuda\n    gl: Antiga e Barbuda\n    gn: Antigua ha Barbuda\n    gu: એન્ટીગુઆ અને બરબુડા\n    gv: Antigua as Barbuda\n    ha: Antigwa da Barbuba\n    he: אנטיגואה וברבודה\n    hi: अण्टीगुआ और बारबूडा\n    hr: Antigva i Barbuda\n    ht: Antigwa ak Babouda\n    hu: Antigua és Barbuda\n    hy: Անտիգուա և Բարբուդա\n    ia: Antigua e Barbuda\n    id: Antigua dan Barbuda\n    ie: Antigua e Barbuda\n    io: Antigua e Barbuda\n    is: Antígva og Barbúda\n    it: Antigua e Barbuda\n    ja: アンティグア・バーブーダ\n    jv: Antigua lan Barbuda\n    ka: ანტიგუა და ბარბუდა\n    ki: Antigua na Barbuda\n    kk: Антигуа және Барбуда\n    kl: Antigua aamma Barbuda\n    km: អង់ទីគ័រ និង​បាបុយដា\n    kn: ಆಂಟಿಗುವ ಮತ್ತು ಬಾರ್ಬುಡ\n    ko: 앤티가 바부다\n    ks: اٮ۪نٹِگُوا تہٕ باربوڑا\n    ku: Antîgua û Berbûda\n    kw: Antiga ha Barbuda\n    ky: Антигуа жана Барбуда\n    la: Antiqua et Barbuda\n    lb: Antigua a Barbuda\n    lg: Antigwa ne Barabuda\n    li: Antigua en Barbuda\n    ln: Antigua mpé Barbuda\n    lo: ແອນຕີກາວ ແລະ ບາບູດາ\n    lt: Antigva ir Barbuda\n    lv: Antigva un Barbuda\n    mg: Antigua sy Barbuda\n    mk: Антигва и Барбуда\n    ml: ആന്റിഗ്വയ ആന്റ് ബാർബൂഡ\n    mn: Антигуа ба Барбуда\n    mr: अँटिगा आणि बार्बुडा\n    ms: Antigua dan Barbuda\n    mt: Antigwa u Barbuda\n    my: အင်တီဂွါနှင့် ဘာဘူဒါ\n    na: Antigua me Barbuda\n    ne: एन्टिगुआ र बर्बुडा\n    nl: Antigua en Barbuda\n    \"no\": Antigua og Barbuda\n    nv: Antíígwa dóó Hashkʼaan Bikéyah Yázhí\n    oc: Antigua e Barbuda\n    om: Antiiguwaa fi Baarbuudaa\n    or: ଆଣ୍ଟିଗୁଆ ଓ ବରବୁଡା\n    os: Антигуæ æмæ Барбудæ\n    pa: ਐਂਟੀਗੁਆ ਅਤੇ ਬਰਬੂਡਾ\n    pl: Antigua i Barbuda\n    pt: Antígua e Barbuda\n    qu: Antiwa Barbudawan\n    rm: Antigua e Barbuda\n    ro: Antigua și Barbuda\n    ru: Антигуа и Барбуда\n    rw: Antigwa na Baribuda\n    sa: अण्टीग्वा\n    sc: Antigua e Barbuda\n    se: Antigua ja Barbuda\n    sh: Antigva i Barbuda\n    si: ඇන්ටිගුවා සහ බාබියුඩා\n    sk: Antigua a Barbuda\n    sl: Antigva in Barbuda\n    sn: Antigua and Barbuda\n    so: Antigua iyo Barbuda\n    sq: Antigua dhe Barbuda\n    sr: Антигва и Барбуда\n    ss: iBhabudi ne Anithikhu\n    su: Antigua jeung Barbuda\n    sv: Antigua och Barbuda\n    sw: Antigua na Barbuda\n    ta: அன்டிகுவா பர்புடா\n    te: ఆంటిగ్వా మరియు బార్బుడా\n    tg: Антигуаю Барбуда\n    th: แอนติกาและบาร์บูดา\n    ti: አንቲጓ እና ባሩዳ\n    tl: Antigua at Barbuda\n    to: Anitikua mo Palaputa\n    tr: Antigua ve Barbuda\n    tt: Анти́гуа һәм Барбу́да\n    ug: ئانتىگۇئا ۋە باربۇدا\n    uk: Анти́гуа і Барбу́да\n    ur: اینٹیگوا و باربوڈا\n    uz: Antigua va Barbuda\n    vi: Antigua và Barbuda\n    vo: Lantigeän e Barbudeän\n    wo: Antigua ak Barbuda\n    yo: Ántígúà àti Bàrbúdà\n    za: Antigua caeuq Barbuda\n    zh: 安提瓜和巴布达\n    zu: i-Antigua and Barbuda\n"
  },
  {
    "path": "settings/country-names/ai.yaml",
    "content": "name: \n    default: Anguilla\n    af: Anguilla\n    an: Anguila\n    ar: أنجويلا\n    az: Angilya\n    ba: Ангилья\n    be: Ангілья\n    bg: Ангуила\n    br: Anguilla\n    bs: Angvila\n    ca: Anguilla\n    cs: Anguilla\n    cy: Anguilla\n    da: Anguilla\n    de: Anguilla\n    dv: އަންގީލާ\n    el: Ανγκουίλα\n    en: Anguilla\n    eo: Angvilo\n    es: Anguila\n    et: Anguilla\n    eu: Aingira\n    fa: آنگویلا\n    fi: Anguilla\n    fr: Anguilla\n    ga: Angaíle\n    gl: Anguila\n    he: אנגווילה\n    hi: अंगुइला\n    hr: Angvila\n    hu: Anguilla\n    hy: Անգիլիա\n    id: Anguilla\n    io: Anguila\n    is: Angvilla\n    it: Anguilla\n    ja: アンギラ\n    jv: Anguilla\n    ka: ანგილია\n    ko: 앵귈라\n    kw: Angwilla\n    lb: Anguilla\n    li: Anguilla\n    lt: Angilija\n    lv: Angilja\n    mk: Ангвила\n    mn: Ангилья\n    mr: अँग्विला\n    ms: Anguilla\n    ne: एन्गुला\n    nl: Anguilla\n    \"no\": Anguilla\n    oc: Anguilla\n    pa: ਐਂਗੁਈਲਾ\n    pl: Anguilla\n    pt: Anguilla\n    ro: Anguilla\n    ru: Ангилья\n    rw: Angwiya\n    sh: Angvila\n    sk: Anguilla\n    sl: Angvila\n    sq: Anguilla\n    sr: Ангвила\n    su: Anguilla\n    sv: Anguilla\n    sw: Anguilla\n    ta: அங்கியுலா\n    th: แองกวิลลา\n    tl: Anggilya\n    tr: Anguilla\n    ug: ئانگۋىللا\n    uk: Ангілья\n    ur: اینگویلا\n    uz: Angilya\n    vi: Anguilla\n    wo: Angila\n    yo: Àngúíllà\n    zh: 安圭拉\n"
  },
  {
    "path": "settings/country-names/al.yaml",
    "content": "name: \n    default: Shqipëria\n    ab: Арнауыҭтәыла\n    af: Albanië\n    ak: Albania\n    am: አልባኒያ\n    an: Albania\n    ar: ألبانيا\n    as: আলবেনিয়া\n    av: Алба́ния\n    ay: Alwaña\n    az: Albaniya\n    ba: Алба́ния\n    be: Алба́нія\n    bg: Албания\n    bh: अल्बानिया\n    bi: Albania\n    bm: Alibani\n    bn: আলবেনিয়া\n    bo: ཨལ་པ་ཉི་ཡ།\n    br: Albania\n    bs: Albanija\n    ca: Albània\n    ce: Алба́ни\n    ch: Albania\n    co: Albania\n    cs: Albánie\n    cu: Алванїꙗ\n    cv: Албани\n    cy: Albania\n    da: Albanien\n    de: Albanien\n    dv: އަލްބޭނިއާ\n    dz: ཨཱལ་བེ་ནི་ཡ\n    ee: Albania\n    el: Αλβανία\n    en: Albania\n    eo: Albanio\n    es: Albania\n    et: Albaania\n    eu: Albania\n    fa: آلبانی\n    ff: Albaniya\n    fi: Albania\n    fo: Albania\n    fr: Albanie\n    fy: Albaanje\n    ga: An Albáin\n    gd: Albàinia\n    gl: Albania\n    gn: Avaña\n    gu: આલ્બેનિયા\n    gv: Yn Albaan\n    ha: Albaniya\n    he: אַלְבַּנְיָה\n    hi: अल्बानिया\n    hr: Albanija\n    ht: Albani\n    hu: Albánia\n    hy: Ալբանիա\n    ia: Albania\n    id: Albania\n    ie: Albania\n    ig: Albania\n    io: Albania\n    is: Albanía\n    it: Albania\n    iu: ᐊᓪᐹᓂᐊ\n    ja: アルバニア\n    jv: Albania\n    ka: ალბანეთი\n    kg: Albania\n    ki: Arũmbĩnia\n    kk: Албания\n    kl: Albania\n    km: អាល់បានី\n    kn: ಅಲ್ಬೇನಿಯ\n    ko: 알바니아\n    ks: اٮ۪لبانِیا\n    ku: Albanya\n    kv: Албания\n    kw: Albani\n    ky: Албания\n    la: Albania\n    lb: Albanien\n    lg: Alibaniya\n    li: Albanië\n    ln: Albania\n    lo: ແອລເບເນຍ\n    lt: Albanija\n    lv: Albānija\n    mg: Albania\n    mi: Arapeinia\n    mk: Албанија\n    ml: അൽബേനിയ\n    mn: Албани\n    mr: आल्बेनिया\n    ms: Albania\n    mt: Albanija\n    my: အယ်လ်ဘေးနီးယား၏\n    na: Arbainiya\n    ne: अल्बानिया\n    nl: Albanië\n    \"no\": Albania\n    nv: Dziłigaii Bikéyah\n    oc: Albania\n    om: Albeeniyaa\n    or: ଆଲବାନିଆ\n    os: Албани\n    pa: ਅਲਬਾਨੀਆ\n    pi: अल्बानिया\n    pl: Albania\n    ps: البانیا\n    pt: Albânia\n    qu: Albanya\n    rm: Albania\n    rn: Alubaniya\n    ro: Albania\n    ru: Албания\n    rw: Alubaniya\n    sa: अल्बेनिया\n    sc: Albania\n    sd: البانيا\n    se: Albánia\n    sg: Albanïi\n    sh: Albanija\n    si: ඇල්බේනියාව\n    sk: Albánsko\n    sl: Albanija\n    sm: Albania\n    sn: Albania\n    so: Albania\n    sq: Shqipëria\n    sr: Албанија\n    ss: I-Alibheniya\n    st: Albania\n    su: Albania\n    sv: Albanien\n    sw: Albania\n    ta: அல்பேனியா\n    te: అల్బేనియా\n    tg: Албания\n    th: ประเทศแอลเบเนีย\n    ti: አልባኒያ\n    tk: Albaniýa\n    tl: Albanya\n    to: ʻAlipania\n    tr: Arnavutluk\n    ts: Albania\n    tt: Албания\n    tw: Albania\n    ty: Arapania\n    ug: ئالبانىيە\n    uk: Алба́нія\n    ur: البانیا\n    uz: Albaniya\n    vi: Albania\n    vo: Lalbanän\n    wa: Albaneye\n    wo: Albaani\n    yi: אלבאניע\n    yo: Albáníà\n    za: Albania\n    zh: 阿爾巴尼亞\n    zu: I-Albaniya\n"
  },
  {
    "path": "settings/country-names/am.yaml",
    "content": "name: \n    default: Հայաստան\n    ab: Ермантәыла\n    af: Armenië\n    ak: Armenia\n    am: አርመኒያ\n    an: Armenia\n    ar: أرمينيا\n    as: আৰ্মেনিয়া\n    av: ЦIамухъ\n    az: Ermənistan\n    ba: Әрмәнстан\n    be: Арме́нія\n    bg: Армения\n    bh: आर्मीनिया\n    bi: Armenia\n    bm: Arimeni\n    bn: আর্মেনিয়া\n    bo: ཨར་མེ་ནི་ཡ།\n    br: Armenia\n    bs: Ermenija\n    ca: Armènia\n    ce: Эрмалойчоь\n    ch: Armenia\n    co: Armenia\n    cs: Arménie\n    cu: Армєні́ꙗ\n    cv: Эрмени\n    cy: Armenia\n    da: Armenien\n    de: Armenien\n    dv: އަރުމީނިއާ\n    dz: ཨར་མི་ནི་ཡ\n    ee: Armenia\n    el: Αρμενία\n    en: Armenia\n    eo: Armenio\n    es: Armenia\n    et: Armeenia\n    eu: Armenia\n    fa: ارمنستان\n    ff: Armaaniya\n    fi: Armenia\n    fo: Armenia\n    fr: Arménie\n    fy: Armeenje\n    ga: An Airméin\n    gd: Airmeinia\n    gl: Armenia\n    gn: Aymenia\n    gu: આર્મેનિયા\n    gv: Armeain\n    ha: Armeniya\n    he: אַרְמֶנְיָה\n    hi: आर्मीनिया\n    hr: Armenija\n    ht: Ameni\n    hu: Örményország\n    hy: Հայաստան\n    ia: Armenia\n    id: Armenia\n    ie: Armenia\n    io: Armenia\n    is: Armenía\n    it: Armenia\n    ja: アルメニア\n    jv: Armènia\n    ka: სომხეთი\n    kg: Armenia\n    ki: Armenia\n    kk: Армения\n    kl: Armenia\n    km: អាមេនី\n    kn: ಆರ್ಮೇನಿಯ\n    ko: 아르메니아\n    ks: اَرمانِیا\n    ku: Ermenistan\n    kv: Армения\n    kw: Armeni\n    ky: Армения\n    la: Armenia\n    lb: Armenien\n    lg: Arameniya\n    li: Armenië\n    ln: Armeni\n    lo: ປະເທດອາກເມນີ\n    lt: Armėnija\n    lv: Armēnija\n    mg: Armenia\n    mi: Āmenia\n    mk: Ерменија\n    ml: അർമേനിയ\n    mn: Армен\n    mo: Армения\n    mr: आर्मेनिया\n    ms: Armenia\n    mt: Armenja\n    my: အာမေးနီးယားနိုင်ငံ\n    na: Arminiya\n    ne: आर्मेनिया\n    nl: Armenië\n    \"no\": Armenia\n    nv: Aooméénii Bikéyah\n    oc: Armenia\n    om: Armeeniyaa\n    or: ଆର୍ମେନିଆ\n    os: Сомихыстон\n    pa: ਅਰਮੀਨੀਆ\n    pi: आर्मीनिया\n    pl: Armenia\n    ps: ارمنستان\n    pt: Arménia\n    qu: Arminya\n    rm: Armenia\n    rn: Arumeniya\n    ro: Armenia\n    ru: Армения\n    rw: Arumeniya\n    sa: आर्मीनिया\n    sc: Armènia\n    sd: آرمينيا\n    se: Armenia\n    sg: Armenïi\n    sh: Jermenija\n    si: ආර්මේනියාව\n    sk: Arménsko\n    sl: Armenija\n    sm: Amenia\n    sn: Armenia\n    so: Armania\n    sq: Armenia\n    sr: Јерменија\n    ss: iArimeniya\n    su: Arménia\n    sv: Armenien\n    sw: Armenia\n    ta: ஆர்மீனியா\n    te: ఆర్మేనియా\n    tg: Арманистон\n    th: อาร์มีเนีย\n    ti: አርሜኒያ\n    tk: Ermenistan\n    tl: Armenya\n    to: ʻĀminia\n    tr: Ermenistan\n    ts: Armenia\n    tt: Әрмәнстан\n    tw: Aminia\n    ty: Āmenia\n    ug: ئەرمېنىيە\n    uk: Вірме́нія\n    ur: آرمینیا\n    uz: Armaniston\n    vi: Armenia\n    vo: Larmeniyän\n    wo: Armeeni\n    yi: אַרמעניע\n    yo: Arméníà\n    za: Armenia\n    zh: 亞美尼亞\n    zu: i-Armenia\n"
  },
  {
    "path": "settings/country-names/ao.yaml",
    "content": "name: \n    default: Angola\n    af: Angola\n    am: አንጎላ\n    an: Angola\n    ar: أنغولا\n    az: Anqola\n    ba: Анго́ла\n    be: Анго́ла\n    bg: Ангола\n    bh: अंगोला\n    bm: Angola\n    bn: অ্যাঙ্গোলা\n    bo: ཨང་གོ་ལ།\n    br: Angola\n    bs: Angola\n    ca: Angola\n    ce: Анго́ла\n    co: Angola\n    cs: Angola\n    cv: Ангола\n    cy: Angola\n    da: Angola\n    de: Angola\n    dv: އެންގޯލާ\n    dz: ཨང་གྷོ་ལ\n    ee: Aŋgola\n    el: Ανγκόλα\n    en: Angola\n    eo: Angolo\n    es: Angola\n    et: Angola\n    eu: Angola\n    fa: آنگولا\n    ff: Anngolaa\n    fi: Angola\n    fo: Angola\n    fr: Angola\n    fy: Angoala\n    ga: Angóla\n    gd: Angola\n    gl: Angola\n    gn: Angola\n    gu: અંગોલા\n    gv: Angoley\n    ha: Angola\n    he: אנגולה\n    hi: अंगोला\n    hr: Angola\n    ht: Angola\n    hu: Angola\n    hy: Անգոլա\n    ia: Angola\n    id: Angola\n    ie: Angola\n    ig: Angola\n    io: Angola\n    is: Angóla\n    it: Angola\n    ja: アンゴラ\n    jv: Angola\n    ka: ანგოლა\n    kg: Ngola\n    ki: Angola\n    kk: Ангола\n    km: អង់ហ្គោឡា\n    kn: ಅಂಗೋಲ\n    ko: 앙골라\n    ks: اینٛگولا\n    ku: Angola\n    kw: Angola\n    ky: Ангола\n    la: Angolia\n    lb: Angola\n    lg: Angola\n    li: Angola\n    ln: Angola\n    lo: ອັງໂກລາ\n    lt: Angola\n    lv: Angola\n    mg: Angola\n    mi: Anakora\n    mk: Ангола\n    ml: അംഗോള\n    mn: Ангол\n    mr: अँगोला\n    ms: Angola\n    mt: Angola\n    my: အင်ဂိုလာနိုင်ငံ\n    na: Angora\n    ne: अंगोला\n    nl: Angola\n    \"no\": Angola\n    nv: Angóola\n    ny: Angola\n    oc: Angòla\n    om: Angoolaa\n    or: ଆଙ୍ଗୋଲା\n    os: Анголæ\n    pa: ਅੰਗੋਲਾ\n    pi: अंगोला\n    pl: Angola\n    ps: آنګولا\n    pt: Angola\n    qu: Angula\n    rm: Angola\n    ro: Angola\n    ru: Ангола\n    rw: Angola\n    sa: अङ्गोला\n    sc: Angola\n    se: Angola\n    sg: Angoläa\n    sh: Angola\n    si: ඇන්ගෝලාව\n    sk: Angola\n    sl: Angola\n    sn: Angola\n    so: Angola\n    sq: Angola\n    sr: Ангола\n    ss: I-Angola\n    st: Angola\n    su: Angola\n    sv: Angola\n    sw: Angola\n    ta: அங்கோலா\n    te: అంగోలా\n    tg: Ангола\n    th: ประเทศแองโกลา\n    ti: ኣንጎላ\n    tk: Angola\n    tl: Anggola\n    to: ʻEnikola\n    tr: Angola\n    ts: Angola\n    tt: Анго́ла\n    ug: ئانگولا\n    uk: Анґо́ла\n    ur: انگولہ\n    uz: Angola\n    vi: Angola\n    vo: Langolän\n    wo: Angolaa\n    yi: אַנגאלאַ\n    yo: Àngólà\n    za: Angola\n    zh: 安哥拉\n    zu: I-Angola\n"
  },
  {
    "path": "settings/country-names/ar.yaml",
    "content": "name: \n    default: Argentina\n    af: Argentinië\n    ak: Agyɛntina\n    am: አርጀንቲና\n    an: Archentina\n    ar: الأرجنتين\n    as: আৰ্জেণ্টিনা\n    av: Аргентина\n    ay: Arxintina\n    az: Argentina\n    ba: Аргенти́на\n    be: Аргенці́на\n    bg: Аржентѝна\n    bh: अर्जेन्टीना\n    bi: Argentina\n    bm: Argentina\n    bn: আর্জেন্টিনা\n    bo: ཨར་ཇེན་ཊི་ན།\n    br: Arc'hantina\n    bs: Argentina\n    ca: Argentina\n    ce: Аргенти́на\n    ch: Argentina\n    co: Argentina\n    cs: Argentina\n    cv: Аргентина\n    cy: Ariannin\n    da: Argentina\n    de: Argentinien\n    dv: އާޖެންޓީނާ\n    dz: ཨར་ཇེན་ཊི་ན\n    ee: Argentina\n    el: Αργεντινή\n    en: Argentina\n    eo: Argentino\n    es: Argentina\n    et: Argentina\n    eu: Argentina\n    fa: آرژانتین\n    ff: Arjantiin\n    fi: Argentiina\n    fj: Argentina\n    fo: Argentina\n    fr: Argentine\n    fy: Argentynje\n    ga: an Airgintín\n    gd: Argentina\n    gl: Arxentina\n    gn: Argentina\n    gu: આર્જેન્ટીના\n    gv: yn Argenteen\n    ha: Argentina\n    he: ארגנטינה\n    hi: अर्जेण्टीना\n    hr: Argentina\n    ht: Ajantin\n    hu: Argentína\n    hy: Արգենտինա\n    ia: Argentina\n    id: Argentina\n    ie: Argentina\n    ig: Argentina\n    io: Arjentinia\n    is: Argentína\n    it: Argentina\n    ja: アルゼンチン\n    jv: Argèntina\n    ka: არგენტინა\n    kg: Arhentina\n    ki: Argentina\n    kk: Аргентина\n    kl: Argentina\n    km: អាហ្សង់ទីន\n    kn: ಅರ್ಜೆಂಟೀನ\n    ko: 아르헨티나\n    ks: أرجَنٹینا\n    ku: Arjentîn\n    kv: Аргентина\n    kw: Arghantina\n    ky: Аргентина\n    la: Argentina\n    lb: Argentinien\n    lg: Arigentina\n    li: Argentinië\n    ln: Argentina\n    lo: ອາກຊັງຕີນ\n    lt: Argentina\n    lv: Argentīna\n    mg: Arjentina\n    mi: Āketina\n    mk: Аргентина\n    ml: അർജന്റീന\n    mn: Аргентин\n    mr: आर्जेन्टिना\n    ms: Argentina\n    mt: Arġentina\n    my: အာဂျင်တီးနားနိုင်ငံ\n    na: Ardjentina\n    ne: अर्जेन्टिना\n    nl: Argentinië\n    \"no\": Argentina\n    nv: Béésh Łigaii Bikéyah\n    oc: Argentina\n    om: Arjentiinaa\n    or: ଆର୍ଜେଣ୍ଟିନା\n    os: Аргентинæ\n    pa: ਅਰਜਨਟੀਨਾ\n    pi: अर्जन्टीना\n    pl: Argentyna\n    ps: ارجنټاین\n    pt: Argentina\n    qu: Arhintina\n    rm: Argentinia\n    rn: Argentine\n    ro: Argentina\n    ru: Аргентина\n    rw: Arijantine\n    sa: अर्जण्टिना\n    sc: Argentina\n    se: Argentiinná\n    sg: Arzantîna\n    sh: Argentina\n    si: ආජන්ටිනාව\n    sk: Argentína\n    sl: Argentina\n    sm: Atenitina\n    sn: Argentina\n    so: Arjantiina\n    sq: Argjentina\n    sr: Аргентина\n    su: Argéntina\n    sv: Argentina\n    sw: Argentina\n    ta: அர்கெந்தீனா\n    te: అర్జెంటీనా\n    tg: Аргенти́на\n    th: อาร์เจนตินา\n    ti: አርጀንቲና\n    tk: Argentina\n    tl: Arhentina\n    to: ʻAsenitina\n    tr: Arjantin\n    ts: Arjentina\n    tt: Аргенти́на\n    tw: Argentina\n    ty: ’Atetina\n    ug: ئارگېنتىنا\n    uk: Аргенти́на\n    ur: ارجنٹائن\n    uz: Argentina\n    vi: Argentina\n    vo: Largäntän\n    wa: Årdjintene\n    wo: Arsantin\n    yi: אַרגענטינע\n    yo: Argẹntínà\n    za: Argentina\n    zh: 阿根廷\n    zu: i-Argentina\n"
  },
  {
    "path": "settings/country-names/at.yaml",
    "content": "name: \n    default: Österreich\n    ab: Австриа\n    af: Oostenryk\n    ak: Austria\n    am: ኦስትሪያ\n    an: Austria\n    ar: النمسا\n    as: অষ্ট্ৰিয়া\n    av: Авустур\n    ay: Austriya\n    az: Avstriya\n    ba: Австрия\n    be: Аўстрыя\n    bg: Австрия\n    bh: ऑस्ट्रिया\n    bi: Austria\n    bn: অস্ট্রিয়া\n    bo: ཨོ་སི་ཐྲི་ཡ།\n    br: Aostria\n    bs: Austrija\n    ca: Àustria\n    ce: Австри\n    ch: Austria\n    co: Austria\n    cs: Rakousko\n    cu: Аѵстрїꙗ\n    cv: Австри\n    cy: Awstria\n    da: Østrig\n    de: Österreich\n    dv: އޮސްޓްރިއާ\n    dz: ཨས་ཊི་ཡ\n    ee: Austria\n    el: Αυστρία\n    en: Austria\n    eo: Aŭstrio\n    es: Austria\n    et: Austria\n    eu: Austria\n    fa: اتریش\n    ff: Otiris\n    fi: Itävalta\n    fo: Eysturríki\n    fr: Autriche\n    fy: Eastenryk\n    ga: An Ostair\n    gd: An Ostair\n    gl: Austria\n    gn: Auteria\n    gu: ઑસ્ટ્રિયા\n    gv: Yn Austeyr\n    ha: Austriya\n    he: אוסטריה\n    hi: ऑस्ट्रिया\n    hr: Austrija\n    ht: Otrich\n    hu: Ausztria\n    hy: Ավստրիա\n    ia: Austria\n    id: Austria\n    ie: Austria\n    ig: Austria\n    io: Austria\n    is: Austurríki\n    it: Austria\n    ja: オーストリア\n    jv: Austria\n    ka: ავსტრია\n    kg: Autriche\n    kk: Аустрия Республикасы\n    kl: Østrigi\n    kn: ಆಸ್ಟ್ರಿಯ\n    ko: 오스트리아\n    ku: Awistriya\n    kv: Австрия\n    kw: Estrych\n    ky: Австрия\n    la: Austria\n    lb: Éisträich\n    li: Oosteriek\n    ln: Otrish\n    lo: ປະເທດໂອຕະລິດ\n    lt: Austrija\n    lv: Austrija\n    mg: Aotrisy\n    mi: Ateria\n    mk: Австрија\n    ml: ഓസ്ട്രിയ\n    mn: Австри\n    mr: ऑस्ट्रिया\n    ms: Austria\n    mt: Awstrija\n    my: သြစတြီးယားနိုင်ငံ\n    na: Oteriya\n    nb: Østerrike\n    ne: अष्ट्रीया\n    nl: Oostenrijk\n    nn: Austerrike\n    \"no\": Østerrike\n    nv: Óóswiya\n    oc: Àustria\n    om: Oostiriyaa\n    or: ଅଷ୍ଟ୍ରିଆ\n    os: Австри\n    pa: ਆਸਟਰੀਆ\n    pi: आस्ट्रिया\n    pl: Austria\n    ps: اتريش\n    pt: Áustria\n    qu: Awstiriya\n    rm: Austria\n    ro: Austria\n    ru: Австрия\n    rw: Ositiriya\n    sa: आस्ट्रिया\n    sc: Àustria\n    sd: آسٽريا\n    se: Nuortariika\n    sh: Austrija\n    si: ඔස්ට්රියාව\n    sk: Rakúsko\n    sl: Avstrija\n    sm: Austilia\n    sn: Austria\n    so: Austriya\n    sq: Austria\n    sr: Аустрија\n    ss: IYosithiya\n    st: Austria\n    su: Austria\n    sv: Österrike\n    sw: Austria\n    ta: ஆஸ்திரியா\n    te: ఆస్ట్రియా\n    tg: Утриш\n    th: ประเทศออสเตรีย\n    tk: Awstriýa\n    tl: Austria\n    tr: Avusturya\n    ts: Austria\n    tt: Австрия\n    tw: Austria\n    ug: ئاۋستىرىيە\n    uk: Австрія\n    ur: آسٹریا\n    uz: Avstriya\n    vi: Áo\n    vo: Lösterän\n    wa: Otriche\n    wo: Otris\n    yi: עסטרייך\n    yo: Austríà\n    za: Audeihleih\n    zh: 奧地利\n    zu: I-Ostriya\n"
  },
  {
    "path": "settings/country-names/au.yaml",
    "content": "name: \n    default: Australia\n    ab: Австралиа\n    af: Australië\n    am: አውስትራልያ\n    an: Australia\n    ar: أستراليا\n    as: অষ্ট্ৰেলিয়া\n    ay: Australla\n    az: Avstraliya\n    ba: Австралия\n    be: Аўстра́лія\n    bg: Австралия\n    bh: ऑस्ट्रेलिया\n    bi: Ostrelia\n    bm: Ostralia\n    bn: অস্ট্রেলিয়া\n    bo: ཨོ་སེ་ཐེ་ལི་ཡ།\n    br: Aostralia\n    bs: Australija\n    ca: Austràlia\n    ce: Австра́ли\n    co: Australia\n    cs: Austrálie\n    cu: Аѵстралїꙗ\n    cv: Австрали\n    cy: Awstralia\n    da: Australien\n    de: Australien\n    dv: އޮސްޓަރުލިޔާ\n    dz: ཨས་ཊེཡེ་ལི་ཡ\n    ee: Australia\n    el: Αυστραλία\n    en: Australia\n    eo: Aŭstralio\n    es: Australia\n    et: Austraalia\n    eu: Australia\n    fa: استرالیا\n    fi: Australia\n    fo: Avstralia\n    fr: Australie\n    fy: Austraalje\n    ga: Astráil\n    gd: Astràilia\n    gl: Australia\n    gn: Autaralia\n    gu: ઑસ્ટ્રેલિયા\n    gv: Austrail\n    ha: Asturaliya\n    he: אוסטרליה\n    hi: ऑस्ट्रेलिया\n    hr: Australija\n    ht: Ostrali\n    hu: Ausztrália\n    hy: Ավստրալիա\n    ia: Australia\n    id: Australia\n    ie: Australia\n    ig: Ostraliya\n    io: Australia\n    is: Ástralía\n    it: Australia\n    iu: ᐊᔅᑦᕌᓕᐊ\n    ja: オーストラリア\n    jv: Ostrali\n    ka: ავსტრალია\n    kg: Australia\n    ki: Australia\n    kk: Аустралия\n    kl: Australia\n    km: អូស្ត្រាលី\n    kn: ಆಸ್ಟ್ರೇಲಿಯ\n    ko: 오스트레일리아\n    ku: Awistralya\n    kv: Австралия\n    kw: Ostrali\n    ky: Австралия\n    la: Australia\n    lb: Australien\n    li: Australië\n    lo: ປະເທດອົດສະຕາລີ\n    lt: Australija\n    lv: Austrālija\n    mg: Aostralia\n    mi: Ahitereiria\n    mk: Австралија\n    ml: ഓസ്ട്രേലിയ\n    mn: Австрали\n    mr: ऑस्ट्रेलिया\n    ms: Australia\n    mt: Awstralja\n    my: ဩစတြေးလျနိုင်ငံ\n    na: Otereiriya\n    ne: अष्ट्रेलिया\n    nl: Australië\n    \"no\": Australia\n    nv: Nahatʼeʼiitsoh Bikéyah\n    oc: Austràlia\n    om: Awustireliyaa\n    or: ଅଷ୍ଟ୍ରେଲିଆ\n    os: Австрали\n    pa: ਆਸਟ੍ਰੇਲੀਆ\n    pi: आस्ट्रेलिया\n    pl: Australia\n    ps: آسټراليا\n    pt: Austrália\n    qu: Awstralya\n    rm: Australia\n    rn: Australiya\n    ro: Australia\n    ru: Австралия\n    rw: Ositaraliya\n    sa: आस्ट्रेलिया\n    sc: Austràlia\n    sd: آسٽريليا\n    se: Australia\n    sg: Ostralïi\n    sh: Australija\n    si: ඕස්ට්‍රේලියාව\n    sk: Austrália\n    sl: Avstralija\n    sm: Ausetalia\n    sn: Australia\n    so: Australia\n    sq: Australia\n    sr: Аустралија\n    su: Australia\n    sv: Australien\n    sw: Australia\n    ta: ஆஸ்திரேலியா\n    te: ఆస్ట్రేలియా\n    tg: Австралия\n    th: ออสเตรเลีย\n    ti: ኣውስትራሊያ\n    tk: Awstraliýa\n    tl: Australya\n    tr: Avustralya\n    tt: Австралия\n    tw: Australia\n    ty: Autereraria\n    ug: ئاۋستىرالىيە\n    uk: Австра́лія\n    ur: آسٹریلیا\n    uz: Avstraliya\n    vi: Úc\n    vo: Laustralän\n    wa: Ostraleye\n    wo: Óstraali\n    yi: אויסטראַליע\n    yo: Austrálíà\n    za: Audaihleihya\n    zh: 澳大利亚\n    zu: I-Ostreliya\n"
  },
  {
    "path": "settings/country-names/az.yaml",
    "content": "name: \n    default: Azərbaycan\n    ab: Азербаиџьан\n    af: Azerbeidjan\n    ak: Azerbaijan\n    am: አዘርባይጃን\n    an: Azerbaichán\n    ar: أذربيجان\n    as: আজেৰবাইজান\n    av: Азарбижан\n    az: Azərbaycan\n    ba: Әзербайжан\n    be: Азербайджа́н\n    bg: Азербайджан\n    bh: अज़रबैजान\n    bi: Azerbaijan\n    bm: Azɛrbayjaŋ\n    bn: আজারবাইজান\n    bo: ཨ་ཛར་བཡི་ཇན།\n    br: Azerbaidjan\n    bs: Azerbejdžan\n    ca: Azerbaidjan\n    ce: Азербайджа́н\n    co: Azerbaighjan\n    cs: Ázerbájdžán\n    cu: Аꙁѣрбаича́нъ\n    cv: Азербайджан\n    cy: Aserbaijan\n    da: Aserbajdsjan\n    de: Aserbaidschan\n    dv: އަޒަރުބައިޖާން\n    dz: ཨཛར་བཡེ་ཇན།\n    ee: Azerbaijan\n    el: Αζερμπαϊτζάν\n    en: Azerbaijan\n    eo: Azerbajĝano\n    es: Azerbaiyán\n    et: Aserbaidžaan\n    eu: Azerbaijan\n    fa: آذربایجان\n    ff: Aserbayjan\n    fi: Azerbaidžan\n    fo: Aserbadsjan\n    fr: Azerbaïdjan\n    fy: Azerbeidzjan\n    ga: an Asarbaiseáin\n    gd: Asarbaideàn\n    gl: Acerbaixán\n    gn: Aservaijã\n    gu: અઝેરબીજાન\n    gv: yn Asserbajaan\n    ha: Azerbaijan\n    he: אָזַרְבַּיְיגָ'ן\n    hi: अज़रबैजान\n    hr: Azerbajdžan\n    ht: Azerbaydjan\n    hu: Azerbajdzsán\n    hy: Ադրբեջան\n    ia: Azerbaidzhan\n    id: Azerbaijan\n    ie: Azerbaidjan\n    io: Azerbaijan\n    is: Aserbaísjan\n    it: Azerbaigian\n    ja: アゼルバイジャン\n    jv: Azerbaijan\n    ka: აზერბაიჯანი\n    kg: Azerbaidjan\n    ki: Azerbaijan\n    kk: Әзірбайжан\n    kl: Aserbajdsjan\n    km: អាស៊ែបៃហ្សង់\n    kn: ಅಜೆರ್ಬೈಜಾನ್\n    ko: 아제르바이잔\n    ks: آزَرباجان\n    ku: Azerbaycan\n    kv: Азербайджа́н\n    kw: Azerbayjan\n    ky: Азербайжан\n    la: Atropatene\n    lb: Aserbaidschan\n    lg: Azerebayijaani\n    li: Azerbaidzjan\n    ln: Azɛrbayzáni\n    lo: ປະເທດອາແຊກບາຍຊັງ\n    lt: Azerbaidžanas\n    lv: Azerbaidžāna\n    mg: Azerbaijana\n    mi: Atepaihānia\n    mk: Азербејџан\n    ml: അസർബെയ്ജാൻ\n    mn: Азербайжан\n    mo: Азербаиӂан\n    mr: अझरबैजान\n    ms: Azerbaijan\n    mt: Ażerbajġan\n    my: အဇာဘိုင်ဂျန်နိုင်ငံ\n    na: Aderbaidjan\n    ne: अजरबैजान\n    nl: Azerbeidzjan\n    \"no\": Aserbajdsjan\n    nv: Azééwii Bikéyah\n    ny: Azerbaijan\n    oc: Azerbaitjan\n    om: Azarbaajan\n    or: ଆଜରବାଇଜାନ\n    os: Азербайджан\n    pa: ਅਜ਼ਰਬਾਈਜਾਨ\n    pi: अजर्बैजान\n    pl: Azerbejdżan\n    ps: آزربایجان\n    pt: Azerbaijão\n    qu: Asarsuyu\n    rm: Aserbeidschan\n    ro: Azerbaidjan\n    ru: Азербайджан\n    rw: Azeribayijani\n    sa: अजर्बैजान\n    sc: Azerbaigián\n    se: Azerbaižan\n    sg: Zerebaidyäan\n    sh: Azerbejdžan\n    si: අසර්බයිජානය\n    sk: Azerbajdžan\n    sl: Azerbajdžan\n    sm: Azerbaijin\n    sn: Azerbaijan\n    so: Aserbiijaan\n    sq: Azerbajxhani\n    sr: Азербејџан\n    ss: iZebajani\n    su: Azerbaijan\n    sv: Azerbajdzjan\n    sw: Azerbaijan\n    ta: அசர்பைஜான்\n    te: అజర్‌బైజాన్\n    tg: Озарбойҷон\n    th: อาเซอร์ไบจาน\n    ti: አዘርባጃን\n    tk: Azerbaýjan\n    tl: Aserbayan\n    to: ʻAsapaisani\n    tr: Azerbaycan\n    ts: Azerbaijan\n    tt: Азәрбайҗан\n    tw: Azerbaijan\n    ty: Atepaihānia\n    ug: ئەزەربەيجان\n    uk: Азербайджа́н\n    ur: آذربائیجان\n    uz: Ozarbayjon\n    vi: Azerbaijan\n    vo: Lasärbäcän\n    wo: Aserbayjaan\n    yi: אַזערבײַדזשאַן\n    yo: Azerbaijan\n    za: Ahsehbaiqgyangh\n    zh: 阿塞拜疆\n    zu: Azerbaijan\n"
  },
  {
    "path": "settings/country-names/ba.yaml",
    "content": "name: \n    default: Bosna i Hercegovina / Босна и Херцеговина\n    af: Bosnië en Herzegowina\n    ak: Bosnia and Herzegovina\n    am: ቦስኒያና ሄርጸጎቪና\n    an: Bosnia y Herzegovina\n    ar: البوسنة والهرسك\n    av: Бо́сния ва Герцегови́на\n    az: Bosniya və Herseqovina\n    ba: Босния һәм Герцеговина\n    be: Бо́снія і Герцагаві́на\n    bg: Босна и Херцеговина\n    bh: बोस्निया आ हर्जेगोविना\n    bi: Bosnia mo Herzegovina\n    bm: Bozni-Ɛrizigovini\n    bn: বসনিয়া ও হার্জেগোভিনা\n    bo: བྷོསུ་ནིཡ་དང་ཧར་ཛེ་གྷོ་ཝི་ན།\n    br: Bosnia-ha-Herzegovina\n    bs: Bosna i Hercegovina\n    ca: Bòsnia i Hercegovina\n    ce: Босни а Герцеговина а\n    co: Bosnia è Erzegovina\n    cs: Bosna a Hercegovina\n    cu: Босна́\n    cv: Босни тата Герцеговина\n    cy: Bosnia a Hercegovina\n    da: Bosnien og Hercegovina\n    de: Bosnien und Herzegowina\n    dv: ބޮސްނިޔާ އެންޑް ހެރްޒިގޮވީނާ\n    ee: Bosnia and Herzegovina\n    el: Βοσνία και Ερζεγοβίνη\n    en: Bosnia and Herzegovina\n    eo: Bosnio kaj Hercegovino\n    es: Bosnia y Herzegovina\n    et: Bosnia ja Hertsegoviina\n    eu: Bosnia eta Herzegovinako\n    fa: بوسنی و هرزگوین\n    ff: Bosniya e Herzegovina\n    fi: Bosnia ja Hertsegovina\n    fo: Bosnia og Hersegovina\n    fr: Bosnie-et-Herzégovine\n    fy: Bosnje-Hertsegovina\n    ga: an Bhoisnia-Heirseagaivéin\n    gd: Bosna agus Hearsagobhana\n    gl: Bosnia e Hercegovina\n    gn: Vonia ha Hesegovina\n    gu: બોસ્નિયા અને હર્ઝેગોવિના\n    gv: Bosnia as Herzegovina\n    ha: Bosnia da Herzegovina\n    he: בּוֹסְנִיָּה וְהֶרְצֶגוֹבִינָה\n    hi: बॉस्निया और हर्ज़ेगोविना\n    hr: Bosna i Hercegovina\n    ht: Bosni ak Erzegovin\n    hu: Bosznia-Hercegovina\n    hy: Բոսնիա և Հերցեգովինա\n    ia: Bosnia e Herzegovina\n    id: Bosnia dan Herzegovina\n    ie: Bosnia e Herzegovina\n    ig: Bosnia na Herzegovina\n    io: Bosnia e Herzegovina\n    is: Bosnía og Hersegóvína\n    it: Bosnia ed Erzegovina\n    ja: ボスニア・ヘルツェゴビナ\n    jv: Bosnia lan Hércegovina\n    ka: ბოსნია და ჰერცეგოვინა\n    kg: Bosna\n    ki: Mbocinia na Hecengobina\n    kk: Босния және Герцеговина\n    kl: Bosnia-Hercegovina\n    km: បូស្ន៉ី\n    kn: ಬೊಸ್ನಿಯ ಮತ್ತು ಹೆರ್ಜೆಗೊವಿನ\n    ko: 보스니아 헤르체고비나\n    ks: बास्निया\n    ku: Bosniya û Herzegovîna\n    kv: Босния да Герцеговина\n    kw: Bosni–Hercegovina\n    ky: Босния жана Герцеговина\n    la: Bosnia et Herzegovina\n    lb: Bosnien an Herzegowina\n    li: Bosnië en Herzegovina\n    ln: Bosnia na Erzegovina\n    lo: ປະເທດບົດສະນີແຮກເຊໂກວີນ\n    lt: Bosnija ir Hercegovina\n    lv: Bosnija un Hercegovina\n    mg: Bosnia sy Herzegovina\n    mi: Pōngia-Herekōmina\n    mk: Босна и Херцеговина\n    ml: ബോസ്നിയ ആന്റ് ഹെർസെഗോവിന\n    mn: Босни ба Херцеговина\n    mr: बॉस्निया आणि हर्झगोव्हिना\n    ms: Bosnia dan Herzegovina\n    mt: Bożnija u Ħerżegovina\n    my: ဘော့စနီးယားနှင့် ဟာဇီဂိုးဗီးနားနိုင်ငံ\n    na: Boteniya me Erdegobina\n    ne: बोस्निया र हर्जगोभिना\n    nl: Bosnië en Herzegovina\n    \"no\": Bosnia-Hercegovina\n    nv: Bosna dóó Hetsog Bikéyah\n    oc: Bòsnia e Ercegovina\n    om: Boosniyaa fi Herzegoviinaa\n    or: ବୋସନିଆ ଓ ହରଜଗୋଭିନା\n    os: Босни æмæ Герцеговинæ\n    pa: ਬੋਸਨੀਆ ਅਤੇ ਹਰਜ਼ੇਗੋਵੀਨਾ\n    pi: बास्निया\n    pl: Bośnia i Hercegowina\n    ps: بوسنيا او هېرزګوينا\n    pt: Bósnia e Herzegovina\n    qu: Busna-Hirsiquwina\n    rm: Bosnia-Erzegovina\n    rn: Bosiniya na Herigozevine\n    ro: Bosnia și Herțegovina\n    ru: Босния и Герцеговина\n    rw: Bosiniya na Herizegovina\n    sa: बास्निया\n    sc: Bòsnia e Erzegòvina\n    se: Bosnia ja Hercegovina\n    sg: Bosnïi na Herzegovînni\n    sh: Bosna i Hercegovina\n    si: බොස්නියා සහ හර්සගෝවිනා\n    sk: Bosna a Hercegovina\n    sl: Bosna in Hercegovina\n    sm: Bosnia ma Herzegovina\n    sn: Bosnia and Herzegovina\n    so: Bosniya iyo Herzegovina\n    sq: Bosnja dhe Hercegovina\n    sr: Босна и Херцеговина\n    ss: iBhosinya ne Hezegovi\n    su: Bosnia jeung Hérzégovina\n    sv: Bosnien och Hercegovina\n    sw: Bosnia na Herzegovina\n    ta: பொசுனியாவும் எர்செகோவினாவும்\n    te: బోస్నియా మరియు హెర్జెగొవీనా\n    tg: Босния ва Ҳерсеговина\n    th: บอสเนียและเฮอร์เซโกวีนา\n    ti: ቦስኒያ እና ሄርዞጎቪኒያ\n    tk: Bosniýa we Gersegowina\n    tl: Bosnia at Herzegovina\n    to: Posinia mo Hesikōvinia\n    tr: Bosna-Hersek\n    ts: Bosnia and Herzegovina\n    tt: Бо́сния һәм Герцегови́на\n    ty: Pōtinia-Heretōvina\n    ug: بوسنىيە ۋە ھېرسېگوۋىنا\n    uk: Бо́снія і Герцеґови́на\n    ur: بوسنیا و ہرزیگووینا\n    uz: Bosniya va Gersegovina\n    vi: Bosnia và Herzegovina\n    vo: Bosnän e Härzegovän\n    wa: Bosneye\n    wo: Bosni Hersegowin\n    yi: באסניע און הערצעגאווינע\n    yo: Bósníà àti Hẹrjẹgòfínà\n    zh: 波斯尼亞和黑塞哥維那\n    zu: IBhosniya neHerzegovina\n"
  },
  {
    "path": "settings/country-names/bb.yaml",
    "content": "name: \n    default: Barbados\n    af: Barbados\n    am: ባርቤዶስ\n    an: Barbados\n    ar: باربادوس\n    ay: Barbados\n    az: Barbados\n    ba: Барба́дос\n    be: Барба́дас\n    bg: Барбадос\n    bn: বার্বাডোস\n    bo: བར་བ་ཌོ་སི།\n    br: Barbados\n    bs: Barbados\n    ca: Barbados\n    ce: Барбадос\n    cs: Barbados\n    cy: Barbados\n    da: Barbados\n    de: Barbados\n    dv: ބާބަޑޮސް\n    ee: Barbados\n    el: Μπαρμπάντος\n    en: Barbados\n    eo: Barbado\n    es: Barbados\n    et: Barbados\n    eu: Barbados\n    fa: باربادوس\n    fi: Barbados\n    fo: Barbados\n    fr: Barbade\n    fy: Barbados\n    ga: Barbadós\n    gd: Barbados\n    gl: Barbados\n    gn: Varvado\n    gv: Barbados\n    he: ברבדוס\n    hi: बारबाडोस\n    hr: Barbados\n    ht: Lababad\n    hu: Barbados\n    hy: Բարբադոսը\n    ia: Barbados\n    id: Barbados\n    ie: Barbados\n    ig: Barbados\n    io: Barbados\n    is: Barbados\n    it: Barbados\n    ja: バルバドス\n    jv: Barbadhos\n    ka: ბარბადოსი\n    kk: Барба́дос\n    kn: ಬಾರ್ಬಡೋಸ್\n    ko: 바베이도스\n    ku: Barbados\n    kv: Барбадос\n    kw: Barbados\n    ky: Барбадос\n    la: Barbata\n    lb: Barbados\n    li: Barbados\n    ln: Barbados\n    lt: Barbadòsas\n    lv: Barbadosa\n    mg: Barbady\n    mk: Барбадос\n    ml: ബർബാഡോസ്\n    mn: Барбадос\n    mr: बार्बाडोस\n    ms: Barbados\n    mt: Barbados\n    my: ဘာဘေးဒိုးစ်နိုင်ငံ\n    na: Barbadot\n    ne: बार्बाडोस\n    nl: Barbados\n    \"no\": Barbados\n    oc: Barbados\n    om: Baarbeedoos\n    or: ବାରବାଡୋସ\n    os: Барбадос\n    pa: ਬਾਰਬਾਡੋਸ\n    pi: बार्बाडोस\n    pl: Barbados\n    ps: بارباډوس\n    pt: Barbados\n    rm: Barbados\n    ro: Barbados\n    ru: Барбадос\n    rw: Barubadosi\n    sa: बार्बाडोस\n    se: Barbados\n    sh: Barbados\n    sk: Barbados\n    sl: Barbados\n    sn: Barbados\n    so: Barbados\n    sq: Barbadosi\n    sr: Барбадос\n    ss: iBhadosi\n    su: Barbados\n    sv: Barbados\n    sw: Barbados\n    ta: பார்படோசு\n    te: బార్బడోస్\n    tg: Барбáдос\n    th: บาร์เบโดส\n    tl: Barbados\n    tr: Barbados\n    tt: Барба́дос\n    ug: باربادوس\n    uk: Барба́дос\n    ur: بارباڈوس\n    uz: Barbados\n    vi: Barbados\n    vo: Barbadeän\n    wa: Barbåde\n    wo: Barbados\n    yi: באַרבאַדאס\n    yo: Bárbádọ̀s\n    zh: 巴巴多斯\n"
  },
  {
    "path": "settings/country-names/bd.yaml",
    "content": "name: \n    default: Bangladesh\n    af: Bangladesj\n    ar: بنغلاديش\n    az: Banqladeş\n    be: Бангладэш\n    br: Bangladesh\n    ca: Bangla Desh\n    da: Bangladesh\n    de: Bangladesch\n    el: Μπανγκλαντές\n    en: Bangladesh\n    eo: Bangladeŝo\n    fa: بنگلادش\n    fi: Bangladesh\n    fr: Bangladesh\n    fy: Banglades\n    ga: An Bhangladéis\n    gd: Bangladais\n    he: בנגלדש\n    hr: Bangladeš\n    hu: Banglades\n    is: Bangladess\n    it: Bangladesh\n    ja: バングラデシュ\n    la: Bangladesha\n    lb: Bangladesch\n    li: Bangladesj\n    lt: Bangladešas\n    lv: Bangladeša\n    mn: Бангладеш\n    \"no\": Bangladesh\n    pl: Bangladesz\n    pt: Bangladesh\n    ru: Бангладеш\n    sl: Bangladeš\n    sv: Bangladesh\n    th: ประเทศบังกลาเทศ\n    tr: Bangladeş\n    uk: Бангладеш\n    zh: 孟加拉国\n"
  },
  {
    "path": "settings/country-names/be.yaml",
    "content": "name: \n    default: België / Belgique / Belgien\n    af: België\n    ak: Belgium\n    am: ቤልጅግ\n    an: Belchica\n    ar: بلجيكا\n    av: Бе́льгия\n    ay: Bilkiya\n    az: Belçika\n    ba: Бе́льгия\n    be: Бeльгія\n    bg: Белгия\n    bh: बेल्जियम\n    bi: Beljiom\n    bm: Bɛliziki\n    bn: বেলজিয়াম\n    bo: པེར་ཅིན།\n    br: Belgia\n    bs: Belgija\n    ca: Bèlgica\n    ce: Бельги\n    co: Belgica\n    cs: Belgie\n    cu: Бє́лгїѥ\n    cv: Бельги\n    cy: Gwlad Belg\n    da: Belgien\n    de: Belgien\n    dv: ބެލްޖިއަމް\n    dz: བེལ་ཇིཡམ\n    ee: Belgium\n    el: Βέλγιο\n    en: Belgium\n    eo: Belgio\n    es: Bélgica\n    et: Belgia\n    eu: Belgika\n    fa: بلژیک\n    ff: Beljik\n    fi: Belgia\n    fo: Belgia\n    fr: Belgique\n    fy: Belgje\n    ga: an Bheilg\n    gd: a' Bheilg\n    gl: Bélxica\n    gn: Véyhika\n    gu: બેલ્જિયમ\n    gv: Velg\n    ha: Beljik\n    he: בֶּלְגְיָה\n    hi: बेल्जियम\n    hr: Belgija\n    ht: Bèljik\n    hu: Belgium\n    hy: Բելգիա\n    ia: Belgica\n    id: Belgia\n    ie: Belgia\n    ig: Belgium\n    io: Belgia\n    is: Belgía\n    it: Belgio\n    ja: ベルギー\n    jv: Bèlgia\n    ka: ბელგია\n    kg: Belezi\n    ki: Ubelgiji\n    kk: Бельгия\n    kl: Belgia\n    km: បែលហ្ស៉ិក\n    kn: ಬೆಲ್ಜಿಯಂ\n    ko: 벨기에\n    ks: बेल्जियम\n    ku: Belçîka\n    kv: Бельгия\n    kw: Pow Belg\n    ky: Бельгия\n    la: Belgica\n    lb: Belsch\n    lg: Bubirigi\n    li: Belsj\n    ln: Bɛ́ljika\n    lo: ປະເທດແບນຊິກ\n    lt: Belgija\n    lv: Beļģija\n    mg: Belzika\n    mi: Pehiamu\n    mk: Белгија\n    ml: ബെൽജിയം\n    mn: Бельги\n    mr: बेल्जियम\n    ms: Belgium\n    mt: Belġju\n    my: ဘယ်လ်ဂျီယမ်နိုင်ငံ\n    na: Berdjiyum\n    ne: बेल्जियम\n    nl: België\n    \"no\": Belgia\n    oc: Belgica\n    om: Beeljiyeem\n    or: ବେଲଜିଅମ\n    os: Бельги\n    pa: ਬੈਲਜੀਅਮ\n    pi: बेल्जियम\n    pl: Belgia\n    ps: بلجیم\n    pt: Bélgica\n    qu: Bilhika\n    rm: Belgia\n    rn: Ububirigi\n    ro: Belgia\n    ru: Бельгия\n    rw: Ububiligi\n    sa: बेल्जियम\n    sc: Bèlgiu\n    sd: بيلجيم\n    se: Belgia\n    sg: Bêleze\n    sh: Belgija\n    si: බෙල්ජියම්\n    sk: Belgicko\n    sl: Bélgija\n    sm: Peleseuma\n    sn: Belgium\n    so: Beljim\n    sq: Belgjika\n    sr: Белгија\n    ss: iBhelijiyamu\n    su: Bélgia\n    sv: Belgien\n    sw: Ubelgiji\n    ta: பெல்ஜியம்\n    te: బెల్జియం\n    tg: Белгия\n    th: เบลเยียม\n    ti: ቤልጄም\n    tk: Belgiýa\n    tl: Belhika\n    to: Pelesiume\n    tr: Belçika\n    ts: Belgium\n    tt: Бе́льгия\n    tw: Belgium\n    ug: بېلگىيە\n    uk: Бе́льгія\n    ur: بلجئیم\n    uz: Belgiya\n    vi: Bỉ\n    vo: Belgän\n    wa: Beldjike\n    wo: Belsik\n    yi: בעלגיע\n    yo: Bẹ́ljíọ̀m\n    zh: 比利時\n    zu: i-Belgium\n"
  },
  {
    "path": "settings/country-names/bf.yaml",
    "content": "name: \n    default: Burkina Faso\n    af: Burkina Faso\n    ak: Burkina Faso\n    am: ቡርኪና ፋሶ\n    an: Burkina Faso\n    ar: بوركينا فاسو\n    az: Burkina-Faso\n    ba: Буркина́-Фасо́\n    be: Буркіна́-Фасо́\n    bg: Буркина Фасо\n    bh: बुर्किना फासो\n    bm: Burukina Faso\n    bn: বুর্কিনা ফাসো\n    bo: བུར་ཀི་ན་ཕ་སོ།\n    br: Burkina Faso\n    bs: Burkina Faso\n    ca: Burkina Faso\n    ce: Буркина-Фасо\n    cs: Burkina Faso\n    cv: Буркина Фасо\n    cy: Bwrcina Ffaso\n    da: Burkina Faso\n    de: Burkina Faso\n    dv: ބުރުކީނާ ފާސޯ\n    dz: བྷར་ཀི་ན་ ཕེ་སོ\n    ee: Burkina Faso\n    el: Μπουρκίνα Φάσο\n    en: Burkina Faso\n    eo: Burkina Faso\n    es: Burkina Faso\n    et: Burkina Faso\n    eu: Burkina Faso\n    fa: بورکینافاسو\n    ff: Burkina Faso\n    fi: Burkina Faso\n    fo: Burkina Faso\n    fr: Burkina Faso\n    fy: Boerkina Faso\n    ga: Buircíne Fasó\n    gd: Buirciona Faso\n    gl: Burquina Faso\n    gu: બુર્કિના ફાસો\n    gv: Burkina Faso\n    ha: Burkina faso\n    he: בורקינה פאסו\n    hi: बुर्किना फासो\n    hr: Burkina Faso\n    ht: Boukinafaso\n    hu: Burkina Faso\n    hy: Բուրկինա Ֆասո\n    ia: Burkina Faso\n    id: Burkina Faso\n    ie: Burkina Faso\n    ig: Burkina Faso\n    io: Burkina Faso\n    is: Búrkína Fasó\n    it: Burkina Faso\n    ja: ブルキナファソ\n    jv: Burkina Faso\n    ka: ბურკინა-ფასო\n    kg: Burkina Faso\n    ki: Burkina Faso\n    kk: Буркина Фасо\n    km: ប៊ូរគីណាហ្វាសូ\n    kn: ಬುರ್ಕೀನ ಫಾಸೊ\n    ko: 부르키나파소\n    ks: بُرکِنا فیسو\n    ku: Burkîna Faso\n    kw: Burkina Faso\n    ky: Буркина-Фасо\n    la: Burkina Faso\n    lb: Burkina Faso\n    lg: Burkina Faso\n    li: Burkina Faso\n    ln: Burkina Faso\n    lo: ເບີກິນາຟາໂຊ\n    lt: Burkina Fasas\n    lv: Burkinafaso\n    mg: Borkina Faso\n    mk: Буркина Фасо\n    ml: ബർക്കിനാ ഫാസോ\n    mn: Буркина Фасо\n    mr: बर्किना फासो\n    ms: Burkina Faso\n    mt: Burkina Faso\n    my: ဘာကီးနားဖားဆိုနိုင်ငံ\n    na: Burkinabato\n    ne: बुर्किना फासो\n    nl: Burkina Faso\n    \"no\": Burkina Faso\n    oc: Burkina Faso\n    om: Burkinaa Faasoo\n    or: ବୁରକିନା ଫାସୋ\n    os: Буркина́-Фасо́\n    pa: ਬੁਰਕੀਨਾ ਫ਼ਾਸੋ\n    pi: बुर्कीना-फासो\n    pl: Burkina Faso\n    ps: بورکینا فاسو\n    pt: Burquina Faso\n    qu: Burkina Phasu\n    rm: Burkina Faso\n    rn: Burukina Faso\n    ro: Burkina Faso\n    ru: Буркина-Фасо\n    rw: Burukina Faso\n    sa: बुर्कीना-फासो\n    sc: Burkina Faso\n    se: Burkina Faso\n    sg: Burkina Faso\n    sh: Burkina Faso\n    si: බර්කිනා ෆාසෝ\n    sk: Burkina Faso\n    sl: Burkina Faso\n    sm: Burkina Faso\n    sn: Burkina Faso\n    so: Burkina Faso\n    sq: Burkina Faso\n    sr: Буркина Фасо\n    ss: iBhukhina-Faso\n    st: Burkina Faso\n    su: Burkina Faso\n    sv: Burkina Faso\n    sw: Burkina Faso\n    ta: புர்க்கினா பாசோ\n    te: బర్కీనా ఫాసో\n    tg: Буркина Фасо\n    th: บูร์กินาฟาโซ\n    ti: ቡርኪና ፋሶ\n    tk: Burkina-Faso\n    tl: Burkina Faso\n    to: Pekano Faso\n    tr: Burkina Faso\n    ts: Burkina Faso\n    tt: Буркина́ Фасо́\n    ug: بۇركىنا فاسو\n    uk: Буркіна́-Фасо́\n    ur: برکینا فاسو\n    uz: Burkina Faso\n    vi: Buốc-ki-na Pha-xô\n    vo: Burkinän\n    wo: Burkinaa Faaso\n    yi: בורקינע פֿאַסא\n    yo: Bùrkínà Fasò\n    zh: 布基纳法索\n    zu: iBukhina Faso\n"
  },
  {
    "path": "settings/country-names/bg.yaml",
    "content": "name: \n    default: Бългaрия\n    ab: Болга́риа\n    af: Bulgarye\n    ak: Bulgaria\n    am: ቡልጋሪያ\n    an: Bulgaria\n    ar: بلغاريا\n    av: Болга́рия\n    ay: Bulkariya\n    az: Bolqarıstan\n    ba: Болга́рия\n    be: Балга́рыя\n    bg: България\n    bh: बुल्गारिया\n    bi: Bulgaria\n    bn: বুলগেরিয়া\n    bo: པུ་ར་ག་རི་ཡ།\n    br: Bulgaria\n    bs: Bugarska\n    ca: Bulgària\n    ce: Болга́ри\n    ch: Bulgaria\n    co: Bulgaria\n    cs: Bulharsko\n    cu: Блъгарїꙗ\n    cv: Пăлхарĕ\n    cy: Bwlgaria\n    da: Bulgarien\n    de: Bulgarien\n    dv: ބަލްގޭރިއާ\n    ee: Bulgaria\n    el: Βουλγαρία\n    en: Bulgaria\n    eo: Bulgario\n    es: Bulgaria\n    et: Bulgaaria\n    eu: Bulgaria\n    fa: بلغارستان\n    ff: Bulgariya\n    fi: Bulgaria\n    fo: Bulgaria\n    fr: Bulgarie\n    fy: Bulgarije\n    ga: an Bhulgáir\n    gd: Bulgàiria\n    gl: Bulgaria\n    gn: Vugaria\n    gu: બલ્ગેરિયા\n    gv: yn Vulgeyr\n    ha: Bulgairiya\n    he: בּוּלְגַרְיָה\n    hi: बुल्गारिया\n    hr: Bugarska\n    ht: Bilgari\n    hu: Bulgária\n    hy: Բուլղարիա\n    ia: Bulgaria\n    id: Bulgaria\n    ie: Bulgaria\n    ig: Bulgaria\n    io: Bulgaria\n    is: Búlgaría\n    it: Bulgaria\n    ja: ブルガリア\n    jv: Bulgaria\n    ka: ბულგარეთი\n    kg: Balgaria\n    kk: Болгария\n    kl: Bulgaria\n    kn: ಬಲ್ಗೇರಿಯ\n    ko: 불가리아\n    ku: Bulgaristan\n    kv: Болгария\n    kw: Bulgari\n    ky: Болгария\n    la: Bulgaria\n    lb: Bulgarien\n    li: Bölgarije\n    ln: Bulgaria\n    lo: ປະເທດບູນກາລີ\n    lt: Bulgarija\n    lv: Bulgārija\n    mg: Biolgaria\n    mi: Purukāria\n    mk: Бугарија\n    ml: ബൾഗേറിയ\n    mn: Болгар\n    mr: बल्गेरिया\n    ms: Bulgaria\n    mt: Bulgarija\n    my: ဘူလ်ဂေးရီးယားနိုင်ငံ\n    na: Borgeriya\n    ne: बुल्गेरिया\n    nl: Bulgarije\n    \"no\": Bulgaria\n    nv: Bálgaa Bikéyah\n    oc: Bulgaria\n    om: Bulgeeriyaa\n    or: ବୁଲଗାରିଆ\n    os: Болгари\n    pa: ਬੁਲਗਾਰੀਆ\n    pi: बुल्गारिया\n    pl: Bułgaria\n    ps: بلغاریا\n    pt: Bulgária\n    qu: Bulgarya\n    rm: Bulgaria\n    rn: Bulgaria\n    ro: Bulgaria\n    ru: Болгария\n    rw: Bulugariya\n    sa: बुल्गारिया\n    sc: Bulgaria\n    sd: بلغاريه\n    se: Bulgária\n    sg: Bulugarïi\n    sh: Bugarska\n    si: බල්ගේරියාව\n    sk: Bulharsko\n    sl: Bolgarija\n    sm: Bultalia\n    sn: Bulgaria\n    so: Bulgaria\n    sq: Bullgaria\n    sr: Бугарска\n    ss: iBhulgariya\n    su: Bulgaria\n    sv: Bulgarien\n    sw: Bulgaria\n    ta: பல்கேரியா\n    te: బల్గేరియా\n    tg: Булғористон\n    th: บัลแกเรีย\n    tk: Bolgariýa\n    tl: Bulgarya\n    tr: Bulgaristan\n    ts: Bulgaria\n    tt: Болгария\n    tw: Bulgaria\n    ug: بۇلغارىيە\n    uk: Болга́рія\n    ur: بلغاریہ\n    uz: Bolgariya\n    vi: Bulgaria\n    vo: Bulgarän\n    wa: Bulgåreye\n    wo: Bulgaari\n    yi: בולגאַריע\n    yo: Bùlgáríà\n    zh: 保加利亚\n    zu: IBulgariya\n"
  },
  {
    "path": "settings/country-names/bh.yaml",
    "content": "name: \n    default: البحرين\n    af: Bahrein\n    ak: Baren\n    am: ባሕሬን\n    an: Bahrein\n    ar: البحرين\n    as: বাহৰেইন\n    az: Bəhreyn\n    ba: Бахре́йн\n    be: Бахрэ́йн\n    bg: Бахрейн\n    bh: बहरीन\n    bm: Bareyini\n    bn: বাহরাইন\n    bo: བྷཧ་རཡིན།\n    br: Bahrein\n    bs: Bahrein\n    ca: Bahrain\n    ce: Бахьрайн\n    cs: Bahrajn\n    cv: Бахрейн\n    cy: Bahrein\n    da: Bahrain\n    de: Bahrain\n    dv: ބަޙްރައިން\n    dz: བཧ་རེན་\n    ee: Bahrain nutome\n    el: Μπαχρέιν\n    en: Bahrain\n    eo: Barejno\n    es: Baréin\n    et: Bahrein\n    eu: Bahrain\n    fa: بحرین\n    ff: Bahreyn\n    fi: Bahrain\n    fo: Barein\n    fr: Bahreïn\n    fy: Bachrein\n    ga: Bairéin\n    gd: Bachrain\n    gl: Bahrein\n    gn: Varéĩ\n    gu: બહેરીન\n    gv: Bahrain\n    ha: Baharain\n    he: בחריין\n    hi: बहरीन\n    hr: Bahrein\n    ht: Barayn\n    hu: Bahrein\n    hy: Բահրեյն\n    ia: Bahrain\n    id: Bahrain\n    ie: Bahrain\n    io: Bahrain\n    is: Barein\n    it: Bahrein\n    ja: バーレーン\n    jv: Bahrain\n    ka: ბაჰრეინი\n    kg: Bahrain\n    ki: Bahrain\n    kk: Бахрейн\n    kl: Bahrain\n    km: បារ៉ែន\n    kn: ಬಹರೇನ್\n    ko: 바레인\n    ks: بحریٖن\n    ku: Behreyn\n    kv: Бахрейн\n    kw: Bahreyn\n    ky: Бахре́йн\n    la: Baharina\n    lb: Bahrain\n    lg: Baareeni\n    li: Bahrein\n    ln: Bahrein\n    lo: ບາເລນ\n    lt: Bahreinas\n    lv: Bahreina\n    mg: Baharainy\n    mk: Бахреин\n    ml: ബഹ്‌റൈൻ\n    mn: Бахрейн\n    mr: बहरैन\n    ms: Bahrain\n    mt: Baħrejn\n    my: ဘာရိန်းနိုင်ငံ\n    na: Bahrain\n    ne: बहराइन\n    nl: Bahrein\n    \"no\": Bahrain\n    oc: Bahrayn\n    om: Baahireen\n    or: ବାହାରିନ୍\n    os: Бахрейн\n    pa: ਬਹਿਰੀਨ\n    pi: बहरैन\n    pl: Bahrajn\n    ps: بحرین\n    pt: Bahrein\n    qu: Bahrayn\n    rm: Bahrain\n    rn: Bahareyini\n    ro: Bahrain\n    ru: Бахрейн\n    rw: Bahirayini\n    sa: बहरैन\n    sd: بحرين\n    se: Bahrain\n    sg: Bahrâina\n    sh: Bahrein\n    si: බහරේන්\n    sk: Bahrajn\n    sl: Bahrájn\n    sm: Bahrain\n    sn: Bahrain\n    so: Baxrayn\n    sq: Bahraini\n    sr: Бахреин\n    ss: iBhaharayi\n    su: Bahrain\n    sv: Bahrain\n    sw: Bahrain\n    ta: பகுரைன்\n    te: బహ్రయిన్\n    tg: Баҳрайн\n    th: บาห์เรน\n    ti: ባህሬን\n    tk: Bahreýn\n    tl: Bahrain\n    to: Paleini\n    tr: Bahreyn\n    tt: Бәхрәйн\n    ug: بەھرېيىن\n    uk: Бахре́йн\n    ur: بحرین\n    uz: Baxreyn\n    vi: Bahrain\n    vo: Bahruäns\n    wo: Bahrayni\n    yi: באכריין\n    yo: Báháráìnì\n    zh: 巴林\n    zu: i-Bahrain\n"
  },
  {
    "path": "settings/country-names/bi.yaml",
    "content": "name: \n    default: Burundi\n    af: Burundi\n    am: ቡሩንዲ\n    an: Burundi\n    ar: بوروندي\n    az: Burundi\n    ba: Буру́нди\n    be: Буру́ндзі\n    bg: Бурунди\n    bh: बुरुंडी\n    bm: Burundi\n    bn: বুরুন্ডি\n    bo: བུ་རུན་ཌི།\n    br: Burundi\n    bs: Burundi\n    ca: Burundi\n    ce: Бурунди\n    cs: Burundi\n    cv: Бурунди\n    cy: Bwrwndi\n    da: Burundi\n    de: Burundi\n    dv: ބުރުންޑީ\n    dz: བྷུ་རུན་ཌི\n    ee: Burundi\n    el: Μπουρούντι\n    en: Burundi\n    eo: Burundo\n    es: Burundí\n    et: Burundi\n    eu: Burundi\n    fa: بوروندی\n    ff: Burunndi\n    fi: Burundi\n    fo: Burundi\n    fr: Burundi\n    fy: Boerûndy\n    ga: an Bhurúin\n    gd: Burundaidh\n    gl: Burundi\n    gn: Vurundi\n    gu: બુરુંડી\n    gv: Burundee\n    ha: Burundi\n    he: בורונדי\n    hi: बुरुण्डी\n    hr: Burundi\n    ht: Bouroundi\n    hu: Burundi\n    hy: Բուրունդի\n    ia: Burundi\n    id: Burundi\n    ie: Burundi\n    ig: Burundi\n    io: Burundi\n    is: Búrúndí\n    it: Burundi\n    ja: ブルンジ\n    jv: Burundi\n    ka: ბურუნდი\n    kg: Burundi\n    ki: Burundi\n    kk: Бурунди\n    km: ប៊ូរុនឌី\n    kn: ಬುರುಂಡಿ\n    ko: 부룬디\n    ks: بورَنڈِ\n    ku: Burundî\n    kw: Burundi\n    ky: Бурунди\n    la: Burundia\n    lb: Burundi\n    lg: Burundi\n    li: Boeroendi\n    ln: Burundi\n    lo: ບູລັນດີ\n    lt: Burundis\n    lv: Burundi\n    mg: Borondy\n    mk: Бурунди\n    ml: ബറുണ്ടി\n    mn: Бурунди\n    mr: बुरुंडी\n    ms: Burundi\n    mt: Burundi\n    my: ဘူရွန်ဒီနိုင်ငံ\n    na: Burundi\n    ne: बुरूण्डी\n    nl: Burundi\n    \"no\": Burundi\n    oc: Burundi\n    om: Buruundii\n    or: ବୁରୁଣ୍ଡି\n    os: Буру́нди\n    pa: ਬੁਰੂੰਡੀ\n    pi: बुरुंडी\n    pl: Burundi\n    ps: برونډي\n    pt: Burundi\n    qu: Burundi\n    rm: Burundi\n    rn: Uburundi\n    ro: Burundi\n    ru: Бурунди\n    rw: Uburundi\n    sa: बुरुंडी\n    sc: Burundi\n    se: Burundi\n    sg: Burundïi\n    sh: Burundi\n    si: බුරුන්ඩි\n    sk: Burundi\n    sl: Burundi\n    sn: Burundi\n    so: Burundi\n    sq: Burundi\n    sr: Бурунди\n    ss: iBurundi\n    st: Burundi\n    su: Burundi\n    sv: Burundi\n    sw: Burundi\n    ta: புருண்டி\n    te: బురుండి\n    tg: Бурунди\n    th: บุรุนดี\n    ti: ብሩንዲ\n    tk: Burundi\n    tl: Burundi\n    to: Pelaniti\n    tr: Burundi\n    ts: Burundi\n    tt: Буру́нди\n    ug: بۇرۇندى\n    uk: Буру́нді\n    ur: برونڈی\n    uz: Burundi\n    vi: Burundi\n    vo: Rundiyän\n    wa: Bouroundi\n    wo: Buruundi\n    yi: בורונדי\n    yo: Bùrúndì\n    zh: 布隆迪\n    zu: iBurundi\n"
  },
  {
    "path": "settings/country-names/bj.yaml",
    "content": "name: \n    default: Bénin\n    af: Benin\n    ak: Bɛnin\n    am: ቤኒን\n    an: Benín\n    ar: بنين\n    az: Benin\n    ba: Бенин\n    be: Бені́н\n    bg: Бенин\n    bh: बेनिन\n    bm: Benɛn\n    bn: বেনিন\n    bo: བེ་ནིན།\n    br: Benin\n    bs: Benin\n    ca: Benín\n    ce: Бени́н\n    cs: Benin\n    cv: Бенин\n    cy: Benin\n    da: Benin\n    de: Benin\n    dv: ބެނީން\n    dz: བཱེ་ནིན།\n    ee: Benɛ̃\n    el: Μπενίν\n    en: Benin\n    eo: Benino\n    es: Benín\n    et: Benin\n    eu: Benin\n    fa: بنین\n    ff: Benen\n    fi: Benin\n    fo: Benin\n    fr: Bénin\n    fy: Benyn\n    ga: Beinin\n    gd: Beinin\n    gl: Benin\n    gn: Mbenĩ\n    gu: બેનિન\n    gv: Benin\n    ha: Benin\n    he: בנין\n    hi: बेनिन\n    hr: Benin\n    ht: Benen\n    hu: Benin\n    hy: Բենին\n    ia: Benin\n    id: Benin\n    ie: Benin\n    ig: Benin\n    io: Benin\n    is: Benín\n    it: Benin\n    ja: ベナン\n    jv: Bénin\n    ka: ბენინი\n    kg: Benin\n    ki: Benin\n    kk: Бени́н\n    kl: Benin\n    km: បេណាំង\n    kn: ಬೆನಿನ್\n    ko: 베냉\n    ks: بِنِن\n    ku: Bênîn\n    kw: Benin\n    ky: Бени́н\n    la: Beninum\n    lb: Benin\n    lg: Benin\n    li: Benin\n    ln: Benin\n    lo: ເບນິນ\n    lt: Beninas\n    lv: Benina\n    mg: Benina\n    mi: Pēnina\n    mk: Бенин\n    ml: ബെനിൻ\n    mn: Бенин\n    mr: बेनिन\n    ms: Benin\n    mt: Benin\n    my: ဘီနင်နိုင်ငံ\n    na: Benin\n    ne: बेनिन\n    nl: Benin\n    \"no\": Benin\n    oc: Benin\n    om: Beeniin\n    or: ବେନିନ\n    os: Бенин\n    pa: ਬੇਨਿਨ\n    pi: बेनिन\n    pl: Benin\n    ps: بېنين\n    pt: Benim\n    qu: Binin\n    rm: Benin\n    rn: Bene\n    ro: Benin\n    ru: Бенин\n    rw: Bene\n    sa: बेनिन्\n    sc: Benin\n    sd: بينن\n    se: Benin\n    sg: Benëen\n    sh: Benin\n    si: බෙනින්\n    sk: Benin\n    sl: Benin\n    sn: Benin\n    so: Benin\n    sq: Benini\n    sr: Бенин\n    ss: iBhenini\n    st: Benin\n    su: Bénin\n    sv: Benin\n    sw: Benin\n    ta: பெனின்\n    te: బెనిన్\n    tg: Бенѝн\n    th: เบนิน\n    ti: ቤኒን\n    tk: Benin\n    tl: Benin\n    to: Penini\n    tr: Benin\n    ts: Benin\n    tt: Бени́н\n    ug: بېنىن\n    uk: Бені́н\n    ur: بینن\n    uz: Benin\n    vi: Bénin\n    vo: Beninän\n    wo: Bene\n    yi: בענין\n    yo: Benin\n    zh: 贝宁\n    zu: IBenini\n"
  },
  {
    "path": "settings/country-names/bm.yaml",
    "content": "name: \n    default: Bermuda\n    ar: برمودا\n    be: Бярмуды\n    br: Bermudez\n    ca: Bermudes\n    cs: Bermudy\n    da: Bermuda\n    de: Bermuda\n    el: Βερμούδες\n    en: Bermuda\n    eo: Bermudoj\n    fa: برمودا\n    fi: Bermuda\n    fr: Bermudes\n    ga: Beirmiúda\n    gl: Bermudas\n    he: ברמודה\n    hr: Bermudski Otoci\n    hu: Bermuda\n    id: Bermuda\n    is: Bermúda\n    it: Bermuda\n    lt: Bermuda\n    lv: Bermudu salas\n    mk: Бермуда\n    mn: Бермудын Арал\n    \"no\": Bermuda\n    oc: Bermudas\n    pl: Bermudy\n    pt: Bermudas\n    ru: Бермудские острова\n    sl: Bermudi\n    sr: Бермуди\n    sv: Bermuda\n    th: เบอร์มิวดา\n    tr: Bermuda\n    uk: Бермудські острови\n    uz: Bermud orollari\n    zh: 百慕大\n"
  },
  {
    "path": "settings/country-names/bn.yaml",
    "content": "name: \n    default: Brunei\n    af: Broenei\n    ak: Brunae\n    am: ብሩናይ\n    an: Brunei\n    ar: بروناي\n    as: ব্ৰুণেই\n    az: Bruney\n    ba: Бруней\n    be: Бруне́й\n    bg: Бруней\n    bh: ब्रूनेई\n    bm: Burinɛyi\n    bn: ব্রুনাই\n    bo: བྷི་རུ་ནི།\n    br: Brunei\n    bs: Brunej\n    ca: Brunei\n    ce: Бруней\n    cs: Brunej\n    cv: Бруней\n    cy: Brwnei\n    da: Brunei\n    de: Brunei\n    dv: ބުރުނައީ\n    dz: བྷྲུ་ནའི\n    el: Μπρουνέι\n    en: Brunei\n    eo: Brunejo\n    es: Brunéi\n    et: Brunei\n    eu: Brunei\n    fa: برونئی\n    ff: Burnaay\n    fi: Brunei\n    fo: Brunei\n    fr: Brunei\n    fy: Brûnei\n    ga: Brúiné\n    gd: Brùnaigh\n    gl: Brunei\n    gn: Mburunéi\n    gu: બ્રુનેઈ\n    gv: Brunei\n    ha: Brunei\n    he: ברוניי\n    hi: ब्रुनेई\n    hr: Brunej\n    ht: Brouney\n    hu: Brunei\n    hy: Բրունեյ\n    ia: Brunei\n    id: Brunei\n    ie: Brunei\n    ik: Brunei\n    io: Brunei\n    is: Brúnei\n    it: Brunei\n    ja: ブルネイ\n    jv: Brunéi\n    ka: ბრუნეი\n    kg: Brunei\n    ki: Brunei\n    kk: Бруней\n    kl: Brunei\n    km: ប្រទេសប៊្រុយណេ\n    kn: ಬ್ರುನೈ\n    ko: 브루나이\n    ks: بُرنٔے\n    ku: Brûney\n    kv: Бруней\n    kw: Bruney\n    ky: Бруней\n    la: Bruneium\n    lb: Brunei\n    li: Brunei\n    ln: Brunei\n    lo: ບູໄນ\n    lt: Brunėjus\n    lv: Bruneja\n    mg: Boroney\n    mi: Poronai\n    mk: Брунеј\n    ml: ബ്രൂണൈ\n    mn: Бруней\n    mr: ब्रुनेई\n    ms: Brunei\n    mt: Brunej\n    my: ဘရူနိုင်းနိုင်ငံ\n    na: Brunei\n    ne: ब्रुनेई\n    nl: Brunei\n    \"no\": Brunei\n    ny: Brunei\n    oc: Brunei\n    om: Birunaay\n    or: ବ୍ରୁନେଇ\n    os: Бруней\n    pa: ਬਰੂਨਾਈ\n    pi: ब्रूनै\n    pl: Brunei\n    ps: برونای\n    pt: Brunei\n    qu: Bruniy\n    rm: Brunei\n    ro: Brunei\n    ru: Бруней\n    rw: Buruneyi\n    sa: ब्रूनै\n    sd: برونئي\n    se: Brunei\n    sg: Brunêi\n    sh: Brunej\n    si: බෲනායි\n    sk: Brunej\n    sl: Brunej\n    sn: Brunei\n    so: Barunay\n    sq: Brunei\n    sr: Брунеј\n    ss: iBhruneyi\n    su: Brunéi\n    sv: Brunei\n    sw: Brunei\n    ta: புரூணை\n    te: బ్రూనై\n    tg: Бруней\n    th: บรูไน\n    ti: ብሩኒ\n    tk: Bruneý\n    tl: Brunei\n    to: Pulunei\n    tr: Brunei\n    tt: Бруне́й\n    ug: برۇنېي\n    uk: Бруне́й\n    ur: برونائی\n    uz: Bruney\n    vi: Brunei\n    vo: Brunän\n    yi: ברוניי\n    yo: Brunei\n    za: Vwnzlaiz\n    zh: 文莱\n    zu: i-Brunei\n"
  },
  {
    "path": "settings/country-names/bo.yaml",
    "content": "name: \n    default: Bolivia\n    ab: Боли́виа\n    af: Bolivië\n    am: ቦሊቪያ\n    an: Bolivia\n    ar: بوليفيا\n    ay: Wuliwya\n    az: Boliviya\n    ba: Боливия\n    be: Балі́вія\n    bg: Боливия\n    bh: बोलीविया\n    bi: Bolivia\n    bm: Bolivia\n    bn: বলিভিয়া\n    bo: བྷོ་ལི་ཝི་ཡ།\n    br: Bolivia\n    bs: Bolivija\n    ca: Bolívia\n    ce: Боливи\n    co: Bolivia\n    cs: Bolívie\n    cv: Боливи\n    cy: Bolifia\n    da: Bolivia\n    de: Bolivien\n    dv: ބޮލީވިއާ\n    dz: བོ་ལི་ཝིཡ\n    ee: Bolivia\n    el: Βολιβία\n    en: Bolivia\n    eo: Bolivio\n    es: Bolivia\n    et: Boliivia\n    eu: Bolivia\n    fa: بولیوی\n    ff: Boliwii\n    fi: Bolivia\n    fo: Bolivia\n    fr: Bolivie\n    fy: Bolivia\n    ga: an Bholaiv\n    gd: Boilibhia\n    gl: Bolivia\n    gn: Volívia\n    gu: બોલીવિયા\n    gv: yn Volivia\n    ha: Bolibiya\n    he: בוליביה\n    hi: बोलिविया\n    hr: Bolivija\n    ht: Bolivi\n    hu: Bolívia\n    hy: Բոլիվիան\n    ia: Bolivia\n    id: Bolivia\n    ie: Bolivia\n    ig: Bolivia\n    io: Bolivia\n    is: Bólivía\n    it: Bolivia\n    ja: ボリビア\n    jv: Bolivia\n    ka: ბოლივია\n    kg: Bolivia\n    ki: Bolivia\n    kk: Боли́вия\n    kl: Bolivia\n    km: បូលីវី\n    kn: ಬೊಲಿವಿಯ\n    ko: 볼리비아\n    ks: بولِوِیا\n    ku: Bolîvya\n    kw: Bolivi\n    ky: Боливия\n    la: Bolivia\n    lb: Bolivien\n    lg: Boliviya\n    li: Bolivia\n    ln: Bolivia\n    lo: ໂບລີວີ\n    lt: Bolivija\n    lv: Bolīvija\n    mg: Bolivia\n    mi: Poriwia\n    mk: Боливија\n    ml: ബൊളീവിയ\n    mn: Боливи\n    mr: बोलिव्हिया\n    ms: Bolivia\n    mt: Bolivja\n    my: ဘိုလီးဗီးယားနိုင်ငံ\n    na: Boribiya\n    ne: बोलिभिया\n    nl: Bolivia\n    \"no\": Bolivia\n    nv: Bolíbiya\n    oc: Bolívia\n    om: Boliiviyaa\n    or: ବୋଲିଭିଆ\n    os: Боливи\n    pa: ਬੋਲੀਵੀਆ\n    pi: बोलिविया\n    pl: Boliwia\n    ps: بولېویا\n    pt: Bolívia\n    qu: Wuliwiya\n    rm: Bolivia\n    rn: Boliviya\n    ro: Bolivia\n    ru: Боливия\n    rw: Boliviya\n    sa: बोलिविया\n    sc: Bolìvia\n    se: Bolivia\n    sg: Bolivïi\n    sh: Bolivija\n    si: බොලීවියාව\n    sk: Bolívia\n    sl: Bolivija\n    sm: Polevia\n    sn: Bolivia\n    so: Boliifia\n    sq: Bolivia\n    sr: Боливија\n    ss: IBholiviya\n    su: Bolivia\n    sv: Bolivia\n    sw: Bolivia\n    ta: பொலிவியா\n    te: బొలీవియా\n    tg: Боливия\n    th: โบลิเวีย\n    ti: ቦሊቪያ\n    tk: Boliwiýa\n    tl: Bolivia\n    to: Polīvia\n    tr: Bolivya\n    tt: Боли́вия\n    ug: بولىۋىيە\n    uk: Болі́вія\n    ur: بولیویا\n    uz: Boliviya\n    vi: Bolivia\n    vo: Bolivän\n    wa: Boliveye\n    wo: Boliibi\n    yi: באליוויע\n    yo: Bòlífíà\n    za: Bolivia\n    zh: 玻利维亚\n    zu: i-Bolivia\n"
  },
  {
    "path": "settings/country-names/br.yaml",
    "content": "name: \n    default: Brasil\n    af: Brasilië\n    ak: Brazil\n    am: ብራዚል\n    an: Brasil\n    ar: البَرَازِيل\n    as: ব্ৰাজিল\n    ay: Wrasil\n    az: Braziliya\n    ba: Брази́лия\n    be: Бразі́лія\n    bg: Бразилия\n    bh: ब्राज़ील\n    bi: Brazil\n    bm: Brazil\n    bn: ব্রাজিল\n    bo: པུ་རུ་ཟིལ།\n    br: Brazil\n    bs: Brazil\n    ca: Brasil\n    ce: Брази́ли\n    ch: Brazil\n    co: Brasile\n    cs: Brazílie\n    cu: Браꙁїлі́ꙗ\n    cv: Бразили\n    cy: Brasil\n    da: Brasilien\n    de: Brasilien\n    dv: ބުރެޒިލް\n    dz: བཱརཱ་ཛིལ་\n    ee: Brazil\n    el: Βραζιλία\n    en: Brazil\n    eo: Brazilo\n    es: Brasil\n    et: Brasiilia\n    eu: Brasil\n    fa: برزیل\n    ff: Barazil\n    fi: Brasilia\n    fj: Brazil\n    fo: Brasilia\n    fr: Brésil\n    fy: Brazylje\n    ga: an Bhrasaíl\n    gd: Braisil\n    gl: Brasil\n    gn: Pindoráma\n    gu: બ્રાઝિલ\n    gv: yn Vrasseel\n    ha: Brazil\n    he: ברזיל\n    hi: ब्रास़ील\n    hr: Brazil\n    ht: Brezil\n    hu: Brazília\n    hy: Բրազիլիա\n    ia: Brasil\n    id: Brasil\n    ie: Brasil\n    ig: Brazil\n    io: Brazilia\n    is: Brasilía\n    it: Brasile\n    ja: ブラジル\n    jv: Brasil\n    ka: ბრაზილია\n    kg: Brazilia\n    ki: Brazil\n    kk: Бразилия\n    kl: Brazil\n    km: ប្រេស៊ីល\n    kn: ಬ್ರೆಜಿಲ್\n    ko: 브라질\n    ks: برٛازِل\n    ku: Brazîl\n    kv: Бразилия\n    kw: Brasil\n    ky: Бразилия\n    la: Brasilia\n    lb: Brasilien\n    lg: Buraziiri\n    li: Braziel\n    ln: Brazil\n    lo: ບະເຣຊິນ\n    lt: Brazilija\n    lv: Brazīlija\n    mg: Brazila\n    mi: Parīhi\n    mk: Бразил\n    ml: ബ്രസീൽ\n    mn: Бразил\n    mr: ब्राझील\n    ms: Brazil\n    mt: Brażil\n    my: ဘရာဇီးနိုင်ငံ\n    na: Bradir\n    ne: ब्राजिल\n    nl: Brazilië\n    \"no\": Brasil\n    nv: Bwazííl\n    oc: Brasil\n    om: Biraazil\n    or: ବ୍ରାଜିଲ\n    os: Бразили\n    pa: ਬ੍ਰਾਜ਼ੀਲ\n    pi: ब्रासील\n    pl: Brazylia\n    ps: برازیل\n    pt: Brasil\n    qu: Prasil\n    rm: Brasilia\n    rn: Brazil\n    ro: Brazilia\n    ru: Бразилия\n    rw: Burezile\n    sa: ब्रासील\n    sc: Brasile\n    sd: برازيل\n    se: Brasilia\n    sh: Brazil\n    si: බ්රසීලය\n    sk: Brazília\n    sl: Brazilija\n    sm: Pasila\n    sn: Brazil\n    so: Barasiil\n    sq: Brazili\n    sr: Бразил\n    st: Brazil\n    su: Brasil\n    sv: Brasilien\n    sw: Brazil\n    ta: பிரேசில்\n    te: బ్రెజిల్\n    tg: Бразилия\n    th: บราซิล\n    ti: ብራዚል\n    tk: Braziliýa\n    tl: Brasil\n    to: Palāsili\n    tr: Brezilya\n    tt: Брази́лия\n    tw: Brazil\n    ty: Parīihi\n    ug: برازىلىيە\n    uk: Брази́лія\n    ur: برازیل\n    uz: Braziliya\n    ve: Brazil\n    vi: Brasil\n    vo: Brasilän\n    wa: Braezi\n    wo: Breesil\n    xh: Brasil\n    yi: בראַזיל\n    yo: Brasil\n    za: Bahsih\n    zh: 巴西\n    zu: IBrazili\n"
  },
  {
    "path": "settings/country-names/bs.yaml",
    "content": "name: \n    default: The Bahamas\n    af: Bahamas\n    ak: Bahama\n    am: ባሃማስ\n    an: Bahamas\n    ar: جزر باهاماس\n    ay: Bahamas\n    az: Bahamalar\n    ba: Багама утрауҙары\n    be: Бага́мскія Астравы́\n    bg: Бахамските острови\n    bm: Bahamasi\n    bn: বাহামা দ্বীপপুঞ্জ\n    bo: བ་ཧ་མཱ་སི།\n    br: Bahamas\n    bs: Bahami\n    ca: Bahames\n    ce: Багама\n    cs: Bahamy\n    cv: Пахамсем\n    cy: Y Bahamas\n    da: Bahamas\n    de: Die Bahamas\n    dv: ބަހާމަސް\n    dz: བཱ་ཧ་མས྄།\n    ee: Bahamas\n    el: Μπαχάμες\n    en: The Bahamas\n    eo: La Bahamoj\n    es: Las Bahamas\n    et: Bahama\n    eu: Bahamak\n    fa: باهاما\n    ff: Bahamaas\n    fi: Bahama\n    fo: Bahamaoyggjar\n    fr: Les Bahamas\n    fy: De Bahama's\n    ga: na Bahámaí\n    gd: na Bahàmas\n    gl: Bahamas\n    gn: Vaamakuéra\n    gu: બહામાસ\n    gv: ny Bahamaghyn\n    he: איי בהאמה\n    hi: बहामस\n    hr: Bahami\n    ht: Il Bahamas\n    hu: Bahama-szigetek\n    hy: Բահամները\n    ia: Bahamas\n    id: Bahama\n    io: Bahama\n    is: Bahamaeyjar\n    it: Le Bahamas\n    ja: バハマ\n    jv: Bahama\n    ka: ბაჰამის კუნძულები\n    ki: Bahama\n    kk: Багам аралдары\n    km: បាហាម៉ា\n    kn: ಬಹಾಮಾಸ್\n    ko: 바하마\n    ks: بَہامَس\n    ku: Bahama\n    kw: Ynysow Bahama\n    ky: Багама аралдары\n    la: Bahamanae\n    lb: D'Bahamas\n    lg: Bahamasi\n    li: De Bahama's\n    ln: Bahamasɛ\n    lo: ບາຮາມມາສ\n    lt: Bahamos\n    lv: Bahamas\n    mg: Bahamasy\n    mk: Бахами\n    ml: ബഹാമാസ്\n    mn: Багамын Арлууд\n    mr: बहामास\n    ms: Bahamas\n    mt: Il-Baħamas\n    my: ဘဟားမားနိုင်ငံ\n    na: Bahamat\n    ne: बहामस\n    nl: Bahama's\n    \"no\": Bahamas\n    oc: Las Bahamas\n    om: Bahamaas\n    or: ବାହାମା\n    os: Багамтæ\n    pa: ਬਹਾਮਾਸ\n    pi: बहामास\n    pl: Bahamy\n    pt: Bahamas\n    qu: Bahamakuna\n    rm: Bahamas\n    rn: Bahamasi\n    ro: Bahamas\n    ru: Багамские Острова\n    rw: Bahamasi\n    sa: बहामास\n    se: Bahamasullot\n    sg: Bahâmasa\n    sh: Bahami\n    si: බහාමාස්\n    sk: Bahamy\n    sl: Bahami\n    sn: The Bahamas\n    so: Bahamas\n    sq: Bahamet\n    sr: Бахаме\n    ss: iBhahamasi\n    su: Bahama\n    sv: Bahamas\n    sw: Bahamas\n    ta: பாகாமாசு\n    te: బహామాస్\n    tg: Баҳамас\n    th: ประเทศบาฮามาส\n    ti: ባሃማስ\n    tk: Bagama Adalary\n    tl: Bahamas\n    to: Pahama\n    tr: Bahamalar\n    tt: Багамалар\n    ug: باھاما\n    uk: Багамські Острови\n    ur: بہاماس\n    uz: Bagam orollari\n    vi: Bahamas\n    vo: Bahamuäns\n    wo: Bahamas\n    yi: די באַהאַמאַס\n    yo: Àwọn Bàhámà\n    za: Bahamas\n    zh: 巴哈马\n    zu: i-Bahamas\n"
  },
  {
    "path": "settings/country-names/bt.yaml",
    "content": "name: \n    default: འབྲུག་ཡུལ་\n    ab: Бутан\n    af: Bhoetan\n    ak: Butan\n    am: ቡታን\n    an: Bután\n    ar: بوتان\n    as: ভূটান\n    az: Butan\n    ba: Бута́н\n    be: Бута́н\n    bg: Бутан\n    bh: भूटान\n    bi: Bhutan\n    bn: ভুটান\n    bo: འབྲུག་ཡུལ།\n    br: Bhoutan\n    bs: Butan\n    ca: Bhutan\n    ce: Бутан\n    cs: Bhútán\n    cv: Бутан\n    cy: Bhwtan\n    da: Bhutan\n    de: Bhutan\n    dv: ބޫޓާން\n    dz: འབྲུགཡུལ་\n    el: Μπουτάν\n    en: Bhutan\n    eo: Butano\n    es: Bután\n    et: Bhutan\n    eu: Bhutan\n    fa: بوتان\n    ff: Butaan\n    fi: Bhutan\n    fo: Butan\n    fr: Bhoutan\n    fy: Bûtan\n    ga: an Bhútáin\n    gd: Butàn\n    gl: Bután\n    gn: Vutã\n    gu: ભૂતાન\n    gv: yn Vutaan\n    ha: Bhutan\n    he: בהוטן\n    hi: भूटान\n    hr: Butan\n    ht: Boutan\n    hu: Bhután\n    hy: Բութան\n    ia: Bhutan\n    id: Bhutan\n    ie: Bhutan\n    io: Bhutan\n    is: Bútan\n    it: Bhutan\n    ja: ブータン\n    jv: Bhutan\n    ka: ბჰუტანი\n    kg: Bhutan\n    ki: Bhutan\n    kk: Бутан\n    kl: Bhutan\n    km: ប៊ូតាន\n    kn: ಭೂತಾನ್\n    ko: 부탄\n    ks: بوٗٹان\n    ku: Bûtan\n    kv: Бутан\n    kw: Bhoutan\n    ky: Бутан\n    la: Butania\n    lb: Bhutan\n    lg: Butaani\n    li: Bhutan\n    ln: Butáni\n    lo: ບູຕານ\n    lt: Butanas\n    lv: Butāna\n    mg: Botàna\n    mi: Putāna\n    mk: Бутан\n    ml: ഭൂട്ടാൻ\n    mn: Бутан\n    mr: भूतान\n    ms: Bhutan\n    mt: Butan\n    my: ဘူတန်နိုင်ငံ\n    na: Butan\n    ne: भूटान\n    nl: Bhutan\n    \"no\": Bhutan\n    nv: Bikéyah\n    oc: Botan\n    om: Buutan\n    or: ଭୁଟାନ\n    os: Бутан\n    pa: ਭੂਟਾਨ\n    pi: भूटान\n    pl: Bhutan\n    ps: بوتان\n    pt: Butão\n    qu: Butan\n    rm: Bhutan\n    rn: Butani\n    ro: Bhutan\n    ru: Бутан\n    rw: Butani\n    sa: भूटान\n    se: Bhutan\n    sg: Butäan\n    sh: Butan\n    si: භූතානය\n    sk: Bhután\n    sl: Butan\n    sn: Bhutan\n    so: Butaan\n    sq: Butani\n    sr: Бутан\n    ss: iBhuthani\n    su: Butan\n    sv: Bhutan\n    sw: Bhutan\n    ta: பூட்டான்\n    te: భూటాన్\n    tg: Бутан\n    th: ประเทศภูฏาน\n    ti: ቡህታን\n    tk: Butan\n    tl: Butan\n    to: Pūtani\n    tr: Bhutan\n    tt: Бутан\n    tw: Butan\n    ug: بۇتان\n    uk: Бута́н\n    ur: بھوٹان\n    uz: Butan\n    vi: Bhutan\n    vo: Butän\n    wo: Butaan\n    yi: בהוטאן\n    yo: Bhùtán\n    za: Budanh\n    zh: 不丹\n    zu: i-Bhutan\n"
  },
  {
    "path": "settings/country-names/bw.yaml",
    "content": "name: \n    default: Botswana\n    af: Botswana\n    ak: Bɔtswana\n    am: ቦትስዋና\n    an: Botswana\n    ar: بوتسوانا\n    az: Botsvana\n    ba: Ботсвана\n    be: Батсва́на\n    bg: Ботсвана\n    bh: बोत्सवाना\n    bm: Botswana\n    bn: বতসোয়ানা\n    bo: བྷོ་ཙི་ཝ་ན།\n    br: Botswana\n    bs: Bocvana\n    ca: Botswana\n    ce: Ботсвана\n    cs: Botswana\n    cv: Ботсвана\n    cy: Botswana\n    da: Botswana\n    de: Botsuana\n    dv: ބޮޓުސްވާނާ\n    dz: བྷོཙ་ཝ་ན\n    ee: Botswana\n    el: Μποτσουάνα\n    en: Botswana\n    eo: Bocvano\n    es: Botsuana\n    et: Botswana\n    eu: Botswana\n    fa: بوتسوانا\n    ff: Botswana\n    fi: Botswana\n    fo: Botsvana\n    fr: Botswana\n    fy: Botswana\n    ga: an Bhotsuáin\n    gd: Botsuana\n    gl: Botswana\n    gn: Votusuana\n    gu: બોત્સ્વાના\n    gv: yn Votswaan\n    ha: Botswana\n    he: בּוֹטְסְוָאנָה\n    hi: बोत्सवाना\n    hr: Bocvana\n    ht: Botswana\n    hu: Botswana\n    hy: Բոտսվանա\n    ia: Botswana\n    id: Botswana\n    ie: Botswana\n    ig: Botswana\n    io: Botswana\n    is: Botsvana\n    it: Botswana\n    ja: ボツワナ\n    jv: Botswana\n    ka: ბოტსვანა\n    kg: Botswana\n    ki: Botswana\n    kk: Ботсвана\n    km: បុតស្វាណា\n    kn: ಬೋಟ್ಸ್ವಾನ\n    ko: 보츠와나\n    ks: بوتَسوانا\n    ku: Botswana\n    kw: Botswana\n    ky: Ботсвана\n    la: Botsuana\n    lb: Botswana\n    lg: Botswana\n    li: Botswana\n    ln: Botswana\n    lo: ບອດສະວານາ\n    lt: Botsvana\n    lv: Botsvana\n    mg: Bôtsoàna\n    mi: Poriwana\n    mk: Боцвана\n    ml: ബോട്സ്വാന\n    mn: Ботсвана\n    mr: बोत्स्वाना\n    ms: Botswana\n    mt: Botswana\n    my: ဘော့ဆွာနာ သမ္မတနိုင်ငံ\n    na: Botwana\n    ne: बोत्स्वाना\n    nl: Botswana\n    \"no\": Botswana\n    nv: Tswana Dineʼé Bikéyah\n    oc: Botswana\n    om: Bootiswaanaa\n    or: ବୋସଚୱାନା\n    os: Ботсванæ\n    pa: ਬੋਤਸਵਾਨਾ\n    pi: बोत्सवाना\n    pl: Botswana\n    ps: بوتسوانا\n    pt: Botsuana\n    qu: Butswana\n    rm: Botswana\n    ro: Botswana\n    ru: Ботсвана\n    rw: Botswana\n    sa: बोत्सवाना\n    sc: Botzuana\n    se: Botswana\n    sg: Botswana\n    sh: Bocvana\n    si: බොට්ස්වානා\n    sk: Botswana\n    sl: Bocvána\n    sn: Botswana\n    so: Botswana\n    sq: Bocvana\n    sr: Боцвана\n    ss: ÉButjwána\n    st: Botswana\n    su: Botswana\n    sv: Botswana\n    sw: Botswana\n    ta: போட்சுவானா\n    te: బోత్సువానా\n    tg: Ботсвана\n    th: บอตสวานา\n    ti: ቦትስዋና\n    tk: Botswana\n    tl: Botswana\n    tn: Botswana\n    to: Potisiuana\n    tr: Botsvana\n    ts: Botswana\n    tt: Ботсва́на\n    ug: بوتسۋانا\n    uk: Ботсва́на\n    ur: بوٹسوانا\n    uz: Botsvana\n    ve: Vhu-Tswana\n    vi: Bốt-xoa-na\n    vo: Zvanän\n    wa: Boswana\n    wo: Botswana\n    yi: באצוואַנע\n    yo: Bòtswánà\n    zh: 波札那\n    zu: i-Botswana\n"
  },
  {
    "path": "settings/country-names/by.yaml",
    "content": "name: \n    default: Беларусь\n    af: Wit-Rusland\n    am: ቤላሩስ\n    an: Belarrusia\n    ar: روسيا البيضاء\n    az: Belarus\n    be: Беларусь\n    bg: Беларус\n    bi: Belarus\n    bn: বেলারুশ\n    bo: བྷེ་ལ་རསུ།\n    br: Belarus\n    bs: Bjelorusija\n    ca: Bielorússia\n    ce: Белорусси\n    co: Bielorussia\n    cs: Bělorusko\n    cu: Бѣла Роусь\n    cv: Беларуç\n    cy: Belarws\n    da: Hviderusland\n    de: Belarus\n    dv: ބެލަރޫސް\n    dz: བེ་ལ་རུ་སུ།\n    ee: Belarus\n    el: Λευκορωσία\n    en: Belarus\n    eo: Belorusio\n    es: Bielorrusia\n    et: Valgevene\n    eu: Bielorrusia\n    fa: بلاروس\n    ff: Belaruusiya\n    fi: Valko-Venäjä\n    fo: Hvítarussland\n    fr: Biélorussie\n    fy: Wyt-Ruslân\n    ga: An Bhealarúis\n    gd: A' Bhealaruis\n    gl: Bielorrusia\n    gn: Vielorrusia\n    gu: બેલારુસ\n    gv: Yn Velaroosh\n    he: בלארוס\n    hi: बेलारूस\n    hr: Bjelorusija\n    ht: Byelorisi\n    hu: Fehéroroszország\n    hy: Բելառուս\n    ia: Bielorussia\n    id: Belarus\n    ie: Bielorussia\n    io: Bielorusia\n    is: Hvíta-Rússland\n    it: Bielorussia\n    ja: ベラルーシ\n    jv: Bélarus\n    ka: ბელარუსი\n    kg: Belarusia\n    kk: Беларусь\n    kl: Hvideruslandi\n    kn: ಬೆಲಾರುಸ್\n    ko: 벨라루스\n    ku: Belarûs\n    kv: Беларусь\n    kw: Belarussi\n    ky: Беларусия\n    la: Ruthenia Alba\n    lb: Wäissrussland\n    li: Wit-Rusland\n    ln: Bielorusia\n    lt: Baltarusija\n    lv: Baltkrievija\n    mi: Pērara\n    mk: Белорусија\n    ml: ബെലാറുസ്\n    mn: Беларусь\n    mr: बेलारूस\n    ms: Belarus\n    mt: Belarus\n    my: ဘီလာရုဇ်နိုင်ငံ\n    na: Berarut\n    ne: बेलारुस\n    nl: Wit-Rusland\n    \"no\": Belarus\n    oc: Bielorussia\n    or: ବେଲାଋଷ\n    os: Белорусси\n    pl: Białoruś\n    ps: بېلاروس\n    pt: Bielorrússia\n    qu: Bilarus\n    rm: Bielorussia\n    ro: Belarus\n    ru: Беларусь\n    rw: Belarusi\n    sa: बेलारूस\n    se: Vilges-Ruošša\n    sh: Belorusija\n    si: බෙලාරස්\n    sk: Bielorusko\n    sl: Belorusija\n    so: Belarus\n    sq: Bjellorusia\n    sr: Белорусија\n    ss: IBhelalasi\n    su: Bélarus\n    sv: Belarus\n    sw: Belarus\n    ta: பெலருஸ்\n    te: బెలారస్\n    tg: Беларус\n    th: ประเทศเบลารุส\n    tk: Belorussiýa\n    tl: Biyelorusya\n    tr: Beyaz Rusya\n    ts: Belarus\n    tt: Беларусия\n    ty: Belarus\n    ug: بېلورۇسسىيە\n    uk: Білорусь\n    ur: بیلاروس\n    uz: Belarus\n    vi: Belarus\n    vo: Belarusän\n    wo: Belaarus\n    yi: בעלארוס\n    yo: Bẹ̀lárùs\n    zh: 白罗斯/白羅斯\n    zu: IBelarusi\n"
  },
  {
    "path": "settings/country-names/bz.yaml",
    "content": "name: \n    default: Belize\n    af: Belize\n    ak: Beliz\n    am: ቤሊዝ\n    an: Belize\n    ar: بليز\n    ay: Wilisi\n    az: Beliz\n    ba: Белиз\n    be: Белі́з\n    bg: Белиз\n    bm: Belizi\n    bn: বেলিজ\n    bo: བེ་ལི་ཛི།\n    br: Belize\n    bs: Beliz\n    ca: Belize\n    ce: Бели́з\n    cs: Belize\n    cv: Белиз\n    cy: Belîs\n    da: Belize\n    de: Belize\n    dv: ބެލީޒު\n    dz: བེ་ལིཛ།\n    ee: Belize\n    el: Μπελίζ\n    en: Belize\n    eo: Belizo\n    es: Belice\n    et: Belize\n    eu: Belize\n    fa: بلیز\n    ff: Beliise\n    fi: Belize\n    fo: Belis\n    fr: Belize\n    fy: Belize\n    ga: an Bheilís\n    gd: Beilise\n    gl: Belice\n    gn: Mbelise\n    gu: બેલીઝ\n    gv: yn Veleesh\n    ha: Beliz\n    he: בליז\n    hi: बेलीज़\n    hr: Belize\n    ht: Beliz\n    hu: Belize\n    hy: Բելիզ\n    ia: Belize\n    id: Belize\n    ie: Belize\n    io: Belize\n    is: Belís\n    it: Belize\n    ja: ベリーズ\n    jv: Belize\n    ka: ბელიზი\n    kk: Бели́з\n    km: បេលីហ្ស\n    kn: ಬೆಲೀಜ್\n    ko: 벨리즈\n    ks: بیلِج\n    ku: Belîze\n    kw: Belisa\n    ky: Белиз\n    la: Beliza\n    lb: Belize\n    li: Belize\n    ln: Belize\n    lo: ເບຊີວ\n    lt: Belizas\n    lv: Beliza\n    mg: Belizy\n    mk: Белизе\n    ml: ബെലീസ്\n    mn: Белиз\n    mr: बेलिझ\n    ms: Belize\n    mt: Beliże\n    my: ဘလိဇ်\n    na: Berij\n    ne: बेलिज\n    nl: Belize\n    \"no\": Belize\n    oc: Belize\n    om: Beliiz\n    or: ବେଲିଜ\n    os: Белиз\n    pa: ਬੇਲੀਜ਼\n    pi: बेलीज\n    pl: Belize\n    ps: بېلیز\n    pt: Belize\n    qu: Bilisi\n    rm: Belize\n    ro: Belize\n    ru: Белиз\n    rw: Belize\n    sa: बेलीज\n    sc: Belize\n    se: Belize\n    sg: Belîzi\n    sh: Belize\n    si: බෙලීස්\n    sk: Belize\n    sl: Belize\n    sm: Pelisi\n    sn: Belize\n    so: Belise\n    sq: Beliza\n    sr: Белизе\n    ss: iBhelizi\n    su: Bélis\n    sv: Belize\n    sw: Belize\n    ta: பெலீசு\n    te: బెలిజ్\n    tg: Белѝз\n    th: เบลีซ\n    ti: ቤሊዘ\n    tl: Belise\n    to: Pelise\n    tr: Belize\n    tt: Бели́з\n    ug: بېلىز\n    uk: Белі́з\n    ur: بیلیز\n    uz: Beliz\n    vi: Belize\n    vo: Belisän\n    wo: Beliis\n    yi: בעליז\n    yo: Bẹ̀lísè\n    za: Belize\n    zh: 伯利兹\n    zu: Belize\n"
  },
  {
    "path": "settings/country-names/ca.yaml",
    "content": "name: \n    default: Canada\n    ab: Канада\n    af: Kanada\n    am: ካናዳ\n    an: Canadá\n    ar: كندا\n    as: কানাডা\n    av: Канада\n    ay: Kanada\n    az: Kanada\n    ba: Канада\n    be: Канада\n    bg: Канада\n    bi: Kanada\n    bm: Kanada\n    bn: কানাডা\n    bo: ཁ་ན་ཌ།\n    br: Kanada\n    bs: Kanada\n    ca: Canadà\n    ce: Канада\n    co: Canadà\n    cs: Kanada\n    cu: Канада\n    cv: Канада\n    cy: Canada\n    da: Canada\n    de: Kanada\n    dv: ކެނެޑާ\n    dz: ཀེ་ན་ཌ་\n    ee: Canada\n    el: Καναδάς\n    en: Canada\n    eo: Kanado\n    es: Canadá\n    et: Kanada\n    eu: Kanada\n    fa: کانادا\n    fi: Kanada\n    fo: Kanada\n    fr: Canada\n    fy: Kanada\n    ga: Ceanada\n    gd: Canada\n    gl: Canadá\n    gn: Kanatã\n    gu: કેનેડા\n    gv: Yn Chanadey\n    ha: Kanada\n    he: קנדה\n    hi: कनाडा\n    hr: Kanada\n    ht: Kanada\n    hu: Kanada\n    hy: Կանադա\n    ia: Canada\n    id: Kanada\n    ie: Canada\n    ig: Kánada\n    ik: Kanada\n    io: Kanada\n    is: Kanada\n    it: Canada\n    iu: ᑲᓇᑕ\n    ja: カナダ\n    jv: Kanada\n    ka: კანადა\n    ki: Canada\n    kk: Канада\n    kl: Canada\n    km: កាណាដា\n    kn: ಕೆನಡಾ\n    ko: 캐나다\n    ku: Kanada\n    kv: Канада\n    kw: Kanada\n    ky: Канада\n    la: Canada\n    lb: Kanada\n    li: Canada\n    ln: Kanadá\n    lt: Kanada\n    lv: Kanāda\n    mg: Kanada\n    mi: Kānata\n    mk: Канада\n    ml: കാനഡ\n    mn: Канад\n    mr: कॅनडा\n    ms: Kanada\n    mt: Kanada\n    my: ကနေဒါနိုင်ငံ\n    na: Kanada\n    ne: क्यानाडा\n    nl: Canada\n    \"no\": Canada\n    nv: Deeteel Bikéyah\n    oc: Canadà\n    om: Canada\n    or: କାନାଡ଼ା\n    os: Канадæ\n    pa: ਕੈਨੇਡਾ\n    pl: Kanada\n    ps: کاناډا\n    pt: Canadá\n    qu: Kanada\n    rm: Canada\n    rn: Kanada\n    ro: Canada\n    ru: Канада\n    rw: Kanada\n    sa: केनडा\n    sc: Canada\n    se: Kanáda\n    sg: Kanadäa\n    sh: Kanada\n    sk: Kanada\n    sl: Kanada\n    sn: Canada\n    so: Kanada\n    sq: Kanadaja\n    sr: Канада\n    ss: IKhanada\n    su: Kanada\n    sv: Kanada\n    sw: Kanada\n    ta: கனடா\n    te: కెనడా\n    tg: Канада\n    th: ประเทศแคนาดา\n    tk: Kanada\n    tl: Kanada\n    tr: Kanada\n    ts: Canada\n    tt: Канада\n    tw: Kanada\n    ty: Tanata\n    ug: كانادا\n    uk: Канада\n    ur: کینیڈا\n    uz: Kanada\n    vi: Canada\n    vo: Kanadän\n    wa: Canada\n    wo: Kanadaa\n    yi: קאנאדע\n    yo: Kánádà\n    zh: 加拿大\n    zu: IKhanada\n"
  },
  {
    "path": "settings/country-names/cd.yaml",
    "content": "name: \n    default: République démocratique du Congo\n    af: Demokratiese Republiek van die Kongo\n    am: ኮንጎ ዲሞክራሲያዊ ሪፐብሊክ\n    an: Republica Democratica d'o Congo\n    ar: جمهورية الكونغو الديمقراطية\n    az: Konqo Demokratik Respublikası\n    be: Дэмакратычная Рэспубліка Конга\n    bg: Демократична република Конго\n    bm: Kongo ka Bɛjɛfanga Fasojamana\n    bn: গণতান্ত্রিক কঙ্গো প্রজাতন্ত্র\n    bo: ཀོང་གོ་མི་དམངས་དམངས་གཙོ།\n    br: Republik Demokratel Kongo\n    bs: Demokratska Republika Kongo\n    ca: República Democràtica del Congo\n    ce: Халкъа куьйгаллийца йолу Пачхьалкх Конго\n    cs: Demokratická republika Kongo\n    cv: Конго Демократиллĕ Республики\n    cy: Gweriniaeth Ddemocrataidd Congo\n    da: Demokratiske Republik Congo\n    de: Demokratische Republik Kongo\n    dv: ކޮންގޯ (ދިމިޤްރާޠީ ޖުމްހޫރިއްޔާ)\n    el: Λαϊκή Δημοκρατία του Κονγκό\n    en: Democratic Republic of the Congo\n    eo: Demokratia Respubliko Kongo\n    es: República Democrática del Congo\n    et: Kongo Demokraatlik Vabariik\n    eu: Kongoko Errepublika Demokratikoa\n    fa: جمهوری دموکراتیک کنگو\n    fi: Kongon demokraattinen tasavalta\n    fo: Fólkaræðiliga Lýðveldið Kongo\n    fr: République démocratique du Congo\n    fy: Demokratyske Republyk Kongo\n    ga: Poblacht Dhaonlathach an Chongó\n    gd: Poblachd Dheamocrach na Congo\n    gl: República Democrática do Congo\n    gn: Tetã Jekopytyjoja Kongo\n    gv: Pobblaght Gheynlagh ny Congo\n    ha: Jamhuriyar dimokuradiyya Kwango\n    he: הרפובליקה הדמוקרטית של קונגו\n    hi: कांगो लोकतान्त्रिक गणराज्य\n    hr: Demokratska Republika Kongo\n    hu: Kongói Demokratikus Köztársaság\n    hy: Կոնգոյի Դեմոկրատական Հանրապետություն\n    ia: Republica Democratic del Congo\n    id: Republik Demokratik Kongo\n    ie: Democratic Republic de Congo\n    io: Demokratial Republiko Kongo\n    is: Lýðræðislega Lýðveldið Kongó\n    it: Repubblica Democratica del Congo\n    ja: コンゴ民主共和国\n    jv: Republik Dhémokratis Kongo\n    ka: კონგოს დემოკრატიული რესპუბლიკა\n    kg: Repubilika ya Kongo ya Dimokalasi\n    kk: Конго Демократиялық Республикасы\n    kn: ಕಾಂಗೋ ಪ್ರಜಾಸತ್ತಾತ್ಮಕ ಗಣರಾಜ್ಯ\n    ko: 콩고 민주 공화국\n    ku: Kongoya Demokratîk\n    kw: Repoblek Werinel Kongo\n    la: Respublica Democratica Congensis\n    lb: Demokratesch Republik Kongo\n    li: Democratische Rippebliek vaan de Kongo\n    ln: Republiki ya Kongó Demokratiki\n    lt: Kongo Demokratinė Respublika\n    lv: Kongo Demokrātiskā Republika\n    mg: Repoblika Demokratikan'i Kongo\n    mi: Te Whenua o Kōngo\n    mk: Демократска Република Конго\n    ml: ഡെമോക്രാറ്റിക് റിപബ്ലിക്ക് ഓഫ് കോംഗോ\n    mn: Бүгд Найрамдах Ардчилсан Конго Улс\n    mr: काँगोचे लोकशाही प्रजासत्ताक\n    ms: Republik Demokratik Congo\n    my: ကွန်ဂိုဒီမိုကရက်တစ်သမ္မတနိုင်ငံ\n    na: Ripubrikit Engame Kongo\n    ne: प्रजातान्त्रिक गणतन्त्र कंगो\n    nl: Democratische Republiek Congo\n    \"no\": Den demokratiske republikken Kongo\n    nv: Kéyah Káango Shádiʼááhjí Siʼánígíí\n    oc: Republica Democratica de Còngo\n    or: କଙ୍ଗୋ\n    os: Конгойы Демократон Республикæ\n    pa: ਕਾਂਗੋ ਲੋਕਤੰਤਰੀ ਗਣਰਾਜ\n    pl: Demokratyczna Republika Konga\n    pt: República Democrática do Congo\n    qu: Kungu Runakamaq Republika\n    ro: Republica Democrată Congo\n    ru: Демократическая Республика Конго\n    rw: Repubulika Iharanira Demokarasi ya Kongo\n    sc: Repùbrica Democràtiga de su Congo\n    se: Kongo demokráhtalaš dásseváldi\n    sg: Kùodùorùosêse tî Ngunuhalëzo tî Kongö\n    sh: Demokratska Republika Kongo\n    si: කොංගෝ ප්රජාතන්ත්රවාදී ජනරජය\n    sk: Kongo (býv. Zair)\n    sl: Demokratična republika Kongo\n    sn: Democratic Republic of the Congo\n    so: Jamhuuriyada Dimuqaraadiga Kongo\n    sq: Republika Demokratike e Kongos\n    sr: Демократска Република Конго\n    ss: IKhongo\n    su: Républik Démokratik Kongo\n    sv: Demokratiska Republiken Kongo\n    sw: Jamhuri ya Kidemokrasia ya Kongo\n    ta: காங்கோ மக்களாட்சிக் குடியரசு\n    th: สาธารณรัฐประชาธิปไตยคองโก\n    tk: Kongo Demokratik Respublikasy\n    tl: Demokratikong Republika ng Konggo\n    tr: Demokratik Kongo Cumhuriyeti\n    ts: Democratic Republic of the Congo\n    tt: Конго Демократик Җөмһүрияте\n    ug: كونگو دېموكراتىك جۇمھۇرىيىتى\n    uk: Демократична Республіка Конго\n    ur: جمہوری جمہوریہ کانگو\n    uz: Kongo DR\n    vi: Cộng hòa Dân chủ Congo\n    vo: Kongoän (Repüblikän Demokratik)\n    wa: Republike democratike do Congo\n    wo: Republik Demokaraatik bu Kongóo\n    yi: דעמאקראטישע רעפובליק פון קאנגא\n    yo: Orílẹ̀-èdè Olómìnira Olóṣèlú ilẹ̀ Kóngò\n    za: Ganggoj Minzcuj Gunghozgoz\n    zh: 刚果民主共和国\n    zu: IRiphabliki Labantu weKongo\n"
  },
  {
    "path": "settings/country-names/cf.yaml",
    "content": "name: \n    default: Ködörösêse tî Bêafrîka - République Centrafricaine\n    af: Sentraal-Afrikaanse Republiek\n    am: የመካከለኛው አፍሪካ ሪፐብሊክ\n    an: Republica Centroafricana\n    ar: جمهورية أفريقيا الوسطى\n    az: Mərkəzi Afrika Respublikası\n    be: Цэнтральна-Афрыканская Рэспубліка\n    bg: Централноафриканска република\n    bm: Cema Afrika Fasojamana\n    bn: মধ্য আফ্রিকান প্রজাতন্ত্র\n    bo: དབུས་ཨ་ཧྥེ་རི་ཁན་རི་པཔ་ལིཀ།\n    br: Republik Kreizafrikan\n    bs: Centralnoafrička Republika\n    ca: República Centreafricana\n    ce: Юккъерчу Африкин Республика\n    cs: Středoafrická republika\n    cy: Gweriniaeth Canolbarth Affrica\n    da: Centralafrikanske Republik\n    de: Zentralafrikanische Republik\n    dv: މެދުތެރޭ އެފްރިކާގެ ޖުމްހޫރިއްޔާ\n    ee: Central African Republic\n    el: Κεντροαφρικανική Δημοκρατία\n    en: Central African Republic\n    eo: Centr-Afriko\n    es: República Centroafricana\n    et: Kesk-Aafrika Vabariik\n    eu: Afrika Erdiko Errepublika\n    fa: جمهوری آفریقای مرکزی\n    fi: Keski-Afrikan tasavalta\n    fo: Miðafrikalýðveldið\n    fr: République Centrafricaine\n    fy: Sintraal-Afrikaanske Republyk\n    ga: Poblacht na hAfraice Láir\n    gd: Poblachd Meadhan Afraga\n    gl: República Centroafricana\n    gv: Pobblaght yn Affrick Veanagh\n    he: הרפובליקה המרכז-אפריקאית\n    hi: मध्य अफ़्रीकी गणराज्य\n    hr: Srednjoafrička Republika\n    ht: Repiblik santafrik\n    hu: Közép-afrikai Köztársaság\n    hy: Կենտրոնաաֆրիկյան Հանրապետություն\n    ia: Republica Centroafrican\n    id: Republik Afrika Tengah\n    ie: Central African Republic\n    io: Centrafrika\n    is: Mið-Afríkulýðveldið\n    it: Repubblica Centrafricana\n    ja: 中央アフリカ共和国\n    jv: Republik Afrika Tengah\n    ka: ცენტრალური აფრიკის რესპუბლიკა\n    kg: Repubilika ya Afelika ya Kati\n    kk: Орталық Африка Республикасы\n    kn: ಮಧ್ಯ ಆಫ್ರಿಕಾದ ಗಣರಾಜ್ಯ\n    ko: 중앙아프리카 공화국\n    ks: مرکٔزی اَفریٖکی جموٗریَت\n    ku: Komara Afrîkaya Navend\n    kw: Centrafrika\n    la: Respublica Africae Mediae\n    lb: Zentralafrikanesch Republik\n    li: Centraal Afrika\n    ln: Santrafríka\n    lt: Centrinės Afrikos Respublika\n    lv: Centrālāfrikas Republika\n    mi: Te Puku o Āwherika\n    mk: Централноафриканска Република\n    ml: മദ്ധ്യ ആഫ്രിക്കൻ റിപ്പബ്ലിക്ക്\n    mn: Төв Африкийн Бүгд Найрамдах Улс\n    mr: मध्य आफ्रिकेचे प्रजासत्ताक\n    ms: Republik Afrika Tengah\n    mt: Repubblika Ċentru-Afrikana\n    my: ဗဟိုအာဖရိကသမ္မတနိုင်ငံ\n    na: Ripubrikin Aprika Yugaga\n    nb: Den sentralafrikanske republikk\n    ne: मध्य अफ्रिकी गणतन्त्र\n    nl: Centraal-Afrikaanse Republiek\n    nn: Den sentralafrikanske republikken\n    \"no\": Den sentralafrikanske republikk\n    nv: Naakaii Łizhinii Bikéyah Beʼałnííʼ\n    oc: Centreafrica\n    or: ସେଣ୍ଟରାଲ ଆଫ୍ରିକାନ ରିପବ୍ଲିକ\n    os: Централон Африкæйы Республикæ\n    pa: ਮੱਧ ਅਫ਼ਰੀਕੀ ਗਣਰਾਜ\n    pl: Republika Środkowoafrykańska\n    ps: د منځنی افريقا ولسمشريزه\n    pt: República da África Central\n    qu: Chawpi Aphrika Republika\n    ro: Republica Centrafricană\n    ru: Центральноафриканская Республика\n    rw: Repubulika ya Santara Afurika\n    sa: केन्द्रीय अफ्रीका गणराज्यम्\n    sc: Tzentràfrica\n    se: Gaska-Afrihká dásseváldi\n    sg: Ködörösêse tî Bêafrîka\n    sh: Srednjoafrička Republika\n    sk: Stredoafrická republika\n    sl: Srednjeafriška republika\n    sn: Central African Republic\n    so: Jamhuuriyadda Bartamaha Afrika\n    sq: Republika e Afrikës Qendrore\n    sr: Централноафричка Република\n    ss: Umkhatsi we-Afrikha\n    su: Républik Afrika Tengah\n    sv: Centralafrikanska republiken\n    sw: Jamhuri ya Afrika ya Kati\n    ta: மத்திய ஆப்பிரிக்கக் குடியரசு\n    te: సెంట్రల్ ఆఫ్రికన్ రిపబ్లిక్\n    tg: Ҷумҳурии Африқои Марказӣ\n    th: สาธารณรัฐแอฟริกากลาง\n    tk: Merkezi Afrika Respublikasy\n    tl: Republika ng Gitnang Aprika\n    tr: Orta Afrika Cumhuriyeti\n    ts: Afrika Wale Xikarhi\n    tt: Үзәк Африка Җөмһүрияте\n    ug: ئوتتۇرا ئافرىقا جۇمھۇرىيىتى\n    uk: Центральноафриканська Республіка\n    ur: وسطی افریقی جمہوریہ\n    uz: Markaziy Afrika Respublikasi\n    vi: Cộng hòa Trung Phi\n    vo: Zänoda-Frikop\n    wo: Réewum Diggu Afrig\n    yo: Orílẹ̀-èdè Olómìnira Àrin Áfríkà\n    zh: 中非共和國\n    zu: Central African Republic\n"
  },
  {
    "path": "settings/country-names/cg.yaml",
    "content": "name: \n    default: Congo\n    af: Republiek van die Kongo\n    am: ኮንጎ ሪፐብሊክ\n    an: Republica d'o Congo\n    ar: جمهورية الكونغو\n    az: Konqo Respublikası\n    ba: Республика Конго\n    be: Рэспубліка Конга\n    bg: Република Конго\n    bm: Kongo-Brazaville\n    bn: কঙ্গো প্রজাতন্ত্র\n    bo: ཀོང་གོ་སྤྱི་མཐུན་རྒྱལ་ཁབ།\n    br: Republik Kongo\n    bs: Republika Kongo\n    ca: República del Congo\n    ce: Республика Конго\n    cs: Republika Kongo\n    cv: Конго Республики\n    cy: Gweriniaeth y Congo\n    da: Republikken Congo\n    de: Republik Kongo\n    dv: ކޮންގޯ (ޖުމްހޫރިއްޔާ)\n    el: Δημοκρατία του Κονγκό\n    en: Congo-Brazzaville\n    eo: Respubliko Kongo\n    es: República del Congo\n    et: Kongo Vabariik\n    eu: Kongoko Errepublika\n    fa: جمهوری کنگو\n    fi: Kongon tasavalta\n    fr: Congo-Brazzaville\n    fy: Republyk Kongo\n    ga: Poblacht an Chongó\n    gd: A' Chongo\n    gl: Congo\n    gv: Pobblaght ny Congo\n    he: הרפובליקה של קונגו\n    hi: कांगो गणराज्य\n    hr: Republika Kongo\n    ht: Kongo (Brazavil)\n    hu: Kongói Köztársaság\n    hy: Կոնգոյի Հանրապետություն\n    ia: Republica del Congo\n    id: Republik Kongo\n    ie: Republic de Congo\n    io: Republiko Kongo\n    is: Vestur-Kongó\n    it: Repubblica del Congo\n    ja: コンゴ共和国\n    jv: Republik Kongo\n    ka: კონგოს რესპუბლიკა\n    kg: Repubilika ya Kôngo\n    kk: Конго Республикасы\n    ko: 콩고 공화국\n    ku: Komara Kongoyê\n    kw: Repoblek Kongo\n    la: Respublica Congensis\n    lb: Republik Kongo\n    li: Kongo-Brazzaville\n    ln: Kongó-Brazzaville\n    lt: Kongo Respublika\n    lv: Kongo Republika\n    mk: Република Конго\n    ml: റിപ്പബ്ലിക്ക് ഓഫ് കോംഗോ\n    mn: Бүгд Найрамдах Конго Улс\n    mr: काँगोचे प्रजासत्ताक\n    ms: Republik Congo\n    my: ကွန်ဂိုသမ္မတနိုင်ငံ\n    na: Ripubrikin Kongo\n    ne: कङ्गो\n    nl: Congo-Brazzaville\n    \"no\": Republikken Kongo\n    nv: Kéyah Káango Náhookǫsjí Siʼánígíí\n    oc: Republica de Còngo\n    os: Конгойы Республикæ\n    pa: ਕਾਂਗੋ ਗਣਰਾਜ\n    pl: Kongo\n    ps: د کانګو جمهوريت\n    pt: República do Congo\n    qu: Kungu Republika\n    ro: Republica Congo\n    ru: Республика Конго\n    rw: Kongo\n    sc: Repùbrica de su Congo\n    se: Kongo dásseváldi\n    sg: Ködörösêse tî Kongöo\n    sh: Republika Kongo\n    si: කොංගෝ ජනරජය\n    sk: Kongo (Brazzaville)\n    sl: Republika Kongo\n    sn: Republic of the Congo\n    so: Jamhuuriyadda Kongo\n    sq: Republika e Kongos\n    sr: Република Конго\n    ss: Tibuse weKhongo\n    su: Républik Kongo\n    sv: Republiken Kongo\n    sw: Jamhuri ya Kongo\n    ta: கொங்கோ குடியரசு\n    te: కాంగో రిపబ్లిక్\n    tg: Ҷумҳӯрии Конго\n    th: สาธารณรัฐคองโก\n    tk: Kongo Respublikasy\n    tl: Republika ng Konggo\n    tr: Kongo Cumhuriyeti\n    ts: Riphabliki ya Congo\n    tt: Конго Җөмһүрияте\n    ug: كونگو جۇمھۇرىيىتى\n    uk: Республіка Конго\n    ur: جمہوریہ کانگو\n    uz: Kongo Respublikasi\n    vi: Cộng hòa Congo\n    vo: Kongoän (Repüblikän)\n    wo: Kongóo-Brasaawiil\n    yi: רעפובליק פון קאנגא\n    yo: Orílẹ̀-èdè Olómìnira ilẹ̀ Kóngò\n    zh: 刚果共和国\n    zu: IKongo\n"
  },
  {
    "path": "settings/country-names/ch.yaml",
    "content": "name: \n    default: Schweiz/Suisse/Svizzera/Svizra\n    af: Switserland\n    am: ስዊዘርላንድ\n    an: Suiza\n    ar: سويسرا\n    az: İsveçrə\n    ba: Швейцария\n    be: Швейцарыя\n    bg: Швейцария\n    bi: Switzerland\n    bn: Switzerland\n    bo: སུད་སི།\n    br: Suis\n    bs: Švicarska\n    ca: Suïssa\n    ce: Швейцари\n    co: Svizzera\n    cs: Švýcarsko\n    cu: Свицєра\n    cv: Швейцари\n    cy: Y Swistir\n    da: Schweiz\n    de: Schweiz\n    dv: ސުވިޒަލޭންޑު\n    dz: སུའིཊ་ཛར་ལེན་\n    ee: Switzerland\n    el: Ελβετία\n    en: Switzerland\n    eo: Svislando\n    es: Suiza\n    et: Šveits\n    eu: Suitza\n    fa: سوئیس\n    fi: Sveitsi\n    fo: Sveis\n    fr: Suisse\n    fy: Switserlân\n    ga: An Eilbhéis\n    gd: An Eilbheis\n    gl: Suíza\n    gn: Suisa\n    gu: સ્વિત્ઝરલેન્ડ\n    gv: Yn Elveeish\n    he: שוויץ\n    hi: स्विट्ज़रलैंड\n    hr: Švicarska\n    ht: Swis\n    hu: Svájc\n    hy: Շվեյցարիա\n    ia: Suissa\n    id: Swiss\n    ie: Svissia\n    io: Suisia\n    is: Sviss\n    it: Svizzera\n    ja: スイス\n    jv: Swiss\n    ka: შვეიცარია\n    kg: Suisi\n    kk: Швейцария\n    kl: Schweizi\n    kn: ಸ್ವಿಟ್ಜರ್ಲ್ಯಾಂಡ್\n    ko: 스위스\n    ku: Swîsre\n    kv: Швейцария\n    kw: Swistir\n    ky: Швейцария\n    la: Helvetia\n    lb: Schwäiz\n    li: Zweitserland\n    ln: Swisi\n    lt: Šveicarija\n    lv: Šveice\n    mg: Soisa\n    mi: Huiterangi\n    mk: Швајцарија\n    ml: സ്വിറ്റ്സര്ലാന്റ്\n    mn: Швейцари\n    mr: स्वित्झर्लंड\n    ms: Switzerland\n    mt: Żvizzera\n    my: ဆွစ်ဇာလန်နိုင်ငံ\n    na: Switzerland\n    ne: स्विजरल्याण्ड\n    nl: Zwitserland\n    \"no\": Sveits\n    nv: Swis Bikéyah\n    oc: Soïssa\n    or: ସୁଇଜରଲ୍ୟାଣ୍ଡ\n    os: Швейцари\n    pa: ਸਵਿਟਜ਼ਰਲੈਂਡ\n    pl: Szwajcaria\n    ps: سويس\n    pt: Suíça\n    qu: Suwisa\n    rm: Svizra\n    ro: Elveţia\n    ru: Швейцария\n    rw: Ubusuwisi\n    sa: स्विटजरलैंड\n    sc: Isvìtzera\n    se: Šveica\n    sh: Švajcarska\n    si: ස්විට්සර්ලන්තය\n    sk: Švajčiarsko\n    sl: Švica\n    so: Iswiizerlaan\n    sq: Zvicra\n    sr: Швајцарска\n    ss: ISwizalandi\n    su: Suis\n    sv: Schweiz\n    sw: Uswisi\n    ta: சுவிட்சர்லாந்து\n    te: స్విట్జర్లాండ్\n    tg: Швейтсария\n    th: ประเทศสวิตเซอร์แลนด์\n    tk: Şweýsariýa\n    tl: Suwisa\n    tr: İsviçre\n    tt: Швейцария\n    ug: Shwétsariye\n    uk: Швейцарія\n    ur: سویٹزر لینڈ\n    uz: Shveysariya\n    vi: Thụy Sĩ\n    vo: Jveizän\n    wo: Suwis\n    yi: שווייץ\n    yo: Swítsàlandì\n    za: Nyeiqswq\n    zh: 瑞士\n"
  },
  {
    "path": "settings/country-names/ci.yaml",
    "content": "name: \n    default: Côte d’Ivoire\n    af: Ivoorkus\n    am: ኮት ዲቯር\n    an: Costa de Vori\n    ar: ساحل العاج\n    az: Fil Dişi Sahili\n    be: Кот-д'Івуар\n    bg: Кот д'Ивоар\n    bm: Côte d'Ivoire\n    bn: কোত দিভোয়ার\n    bo: ཀོ་ཊི་ཌི་ཨའི་བོ་རི།\n    br: Aod an Olifant\n    bs: Obala Slonovače\n    ca: Costa d'Ivori\n    ce: Кот-д’Ивуар\n    cs: Pobřeží slonoviny\n    cv: Кот-д'Ивуар\n    cy: Côte d'Ivoire\n    da: Elfenbenskysten\n    de: Elfenbeinküste\n    dv: އައިވަރީ ކޯސްޓު\n    ee: Côte d'Ivoire\n    el: Ακτή Ελεφαντοστού\n    en: Côte d'Ivoire\n    eo: Ebur-Bordo\n    es: Costa de Marfil\n    et: Elevandiluurannik\n    eu: Boli Kosta\n    fa: ساحل عاج\n    ff: Kodduwaar\n    fi: Norsunluurannikko\n    fo: Fílabeinsstrondin\n    fr: Côte d’Ivoire\n    fy: Ivoarkust\n    ga: An Cósta Eabhair\n    gd: Costa Ìbhri\n    gl: Costa do Marfil\n    gv: Yn Clyst Iuaagagh\n    he: חוף השנהב\n    hi: कोत द'ईवोआर\n    hr: Obala Bjelokosti\n    ht: Kòt divwa\n    hu: Elefántcsontpart\n    hy: Կոտ դ'Իվուար\n    ia: Costa de Ebore\n    id: Pantai Gading\n    ie: Costa de Ivor\n    io: Ivora Rivo\n    is: Fílabeinsströndin\n    it: Costa d'Avorio\n    ja: コートジボワール\n    jv: Panté Gadhing\n    ka: კოტ-დ’ივუარი\n    kg: Côte d'Ivoire\n    ki: Côte d'Ivoire\n    kk: Кот-д-Ивуар\n    kn: ಕೋತ್ ದ್'ಇವಾರ್\n    ko: 코트디부아르\n    ku: Peravê Diranfîl\n    kw: Côte d'Ivoire\n    la: Litus Eburneum\n    lb: Elfebeeküst\n    li: Ivoorkös\n    ln: Kotdivuar\n    lt: Dramblio Kaulo Krantas\n    lv: Kotdivuāra\n    mg: Côte d'Ivoire\n    mi: Te Tai Rei\n    mk: Брег на Слоновата Коска\n    ml: ഐവറി കോസ്റ്റ്\n    mn: Кот д'Ивуар\n    mr: कोत द'ईवोआर\n    ms: Ivory Coast\n    mt: Kosta tal-Avorju\n    my: အိုင်ဗရီကို့စ်နိုင်ငံ\n    na: Aibori Kot\n    nb: Elfenbenskysten\n    ne: आइभरी कोस्ट\n    nl: Ivoorkust\n    nn: Elfenbeinskysten\n    \"no\": Elfenbenskysten\n    nv: Chį́į́h Yee Adilohii Bideeʼ Tónteel Bibąąh\n    oc: Còsta d'Evòri\n    or: ଆଇଭେରି କୋଷ୍ଟ\n    os: Кот-д’Ивуар\n    pa: ਦੰਦ ਖੰਡ ਤਟ\n    pl: Wybrzeże Kości Słoniowej\n    ps: عاج ساحل\n    pt: Costa do Marfim\n    qu: Marphil Chala\n    rm: Costa d'Ivur\n    ro: Coasta de Fildeș\n    ru: Кот-д’Ивуар\n    rw: Kote Divuwari\n    sa: कोट ऐवरी\n    sc: Costa de Avòriu\n    se: Elefántačalánriddu\n    sg: Kôdivüära\n    sh: Obala Slonovače\n    si: අයිවරි කෝස්ට්\n    sk: Pobrežie Slonoviny\n    sl: Slonokoščena obala\n    sn: Côte d'Ivoire\n    so: Xeebta Foolmaroodi\n    sq: Bregu i Fildishtë\n    sr: Обала Слоноваче\n    ss: Lugu Lwempondvondlovu\n    su: Basisir Gading\n    sv: Elfenbenskusten\n    sw: Cote d'Ivoire\n    ta: கோட் டிவார்\n    te: కోటె డి ఐవొరి\n    tg: Кот-д'Ивуар\n    th: ประเทศโกตดิวัวร์\n    tk: Kot-d’Iwuar\n    tl: Baybaying Garing\n    tr: Fildişi Sahili\n    ts: Côte d'Ivoire\n    tt: Кот-д’Ивуар\n    ug: پىل چىشى قىرغىغى\n    uk: Кот-д'Івуар\n    ur: کوت داوواغ\n    uz: Kot-d‘ivuar\n    vi: Bờ Biển Ngà\n    vo: Viorajolän\n    wo: Kodiwaar\n    yi: בארטן פון העלפאנדביין\n    yo: Côte d'Ivoire\n    zh: 科特迪瓦\n    zu: Ugu Emhlophe\n"
  },
  {
    "path": "settings/country-names/ck.yaml",
    "content": "name: \n    default: Kūki 'Āirani\n    af: Cookeilande\n    ak: Kook Nsupɔw\n    am: ኩክ ደሴቶች\n    an: islas Cook\n    ar: جزر كوك\n    az: Kuk adaları\n    ba: Кук Утрауҙары\n    be: Астравы Кука\n    bg: Острови Кук\n    bm: Kuki Gun\n    bn: কুক দ্বীপপুঞ্জ\n    bo: ཀཱུག གླིང་ཕྲེན་རྒྱལ་ཁབ།\n    br: Inizi Cook\n    bs: Cookova Ostrva\n    ca: Illes Cook\n    cs: Cookovy ostrovy\n    cy: Ynysoedd Cook\n    da: Cook-øerne\n    de: Cookinseln\n    dv: ކުކް ޖަޒީރާ\n    dz: ཀུག་གླིང་ཚོམ\n    ee: Kook ƒudomekpo nutome\n    el: Νήσοι Κουκ\n    en: Cook Islands\n    eo: Kukinsuloj\n    es: Islas Cook\n    et: Cooki saared\n    eu: Cook uharteak\n    fa: جزایر کوک\n    ff: Duuɗe Kuuk\n    fi: Cookinsaaret\n    fo: Cooksoyggjarnar\n    fr: Îles Cook\n    fy: de Cookeilannen\n    ga: Oileáin Cook\n    gd: Eileanan Cook\n    gl: Illas Cook\n    gu: કુક આઇલેન્ડ્સ\n    ha: Tsibiran Kuku\n    he: איי קוּק\n    hi: कुक द्वीपसमूह\n    hr: Cookovo Otočje\n    hu: Cook-szigetek\n    hy: Կուկի կղզիներ\n    ia: Insulas Cook\n    id: Kepulauan Cook\n    io: Insuli Cook\n    is: Cooks-eyjar\n    it: Isole Cook\n    ja: クック諸島\n    jv: Kapuloan Cook\n    ka: კუკის კუნძულები\n    ki: Visiwa vya Cook\n    kk: Кук аралдары\n    kl: Cook qeqertaq\n    km: កោះ​ខូក\n    kn: ಕುಕ್ ದ್ವೀಪಗಳು\n    ko: 쿡 제도\n    ks: کُک جٔزیٖرٕ\n    ku: Giravên Cook\n    kw: Ynysow Cook\n    ky: Кук аралдары\n    la: Insulae de Cook\n    lb: Cookinseln\n    lg: Bizinga bya Kkuki\n    li: Cookeilenj\n    ln: Bisanga bya Kookɛ\n    lo: ຫມູ່ເກາະຄຸກ\n    lt: Kuko Salos\n    lv: Kuka Salas\n    mg: Nosy Kook\n    mi: Kuki Airani\n    mk: Кукови Острови\n    ml: കൂക്ക് ദ്വീപുകൾ\n    mn: Күүкийн Арлууд\n    mr: कूक द्वीपसमूह\n    ms: Kepulauan Cook\n    mt: Gżejjer Cook\n    my: ကွတ် ကျွန်းစု\n    nb: Cookøyene\n    ne: कुक टापु\n    nl: Cookeilanden\n    nn: Cookøyane\n    \"no\": Cookøyene\n    oc: Illas Cook\n    or: କୁକ୍ ଆଇସଲ୍ୟାଣ୍ଡ\n    os: Кучы сакъадæхтæ\n    pa: ਕੁੱਕ ਟਾਪੂ\n    pl: Wyspy Cooka\n    pt: Ilhas Cook\n    rm: Inslas Cook\n    rn: Izinga rya Kuku\n    ro: Insulele Cook\n    ru: Острова Кука\n    rw: Ibirwa bya Kuke\n    se: Cook-sullot\n    sg: âzûâ Kûku\n    sh: Kukova Ostrva\n    si: කුක් දිවයින්\n    sk: Cookove ostrovy\n    sl: Cookovi otoki\n    sn: Zvitsuwa zveCook\n    so: Jaziiradda Cook\n    sq: Ishulli Kuk\n    sr: Кукова Острва\n    su: Kapuloan Cook\n    sv: Cooköarna\n    sw: Visiwa vya Cook\n    ta: குக் தீவுகள்\n    te: కుక్ దీవులు\n    th: หมู่เกาะคุก\n    ti: ኩክ ደሴቶች\n    tl: Kapuluang Cook\n    to: ʻOtumotu Kuki\n    tr: Cook Adaları\n    tt: Кук утраулары\n    ug: Kuk Taqim Aralliri\n    uk: Острови́ Ку́ка\n    ur: جزائر کک\n    uz: Kuk orollari\n    vi: Quần đảo Cook\n    wo: Dunu Kook\n    yo: Orílẹ́ède Etíokun Kùúkù\n    zh: 庫克群島\n    zu: i-Cook Islands\n"
  },
  {
    "path": "settings/country-names/cl.yaml",
    "content": "name: \n    default: Chile\n    ab: Чили\n    af: Chili\n    ak: Chile\n    am: ቺሌ\n    an: Chile\n    ar: تشيلي\n    as: চিলি\n    av: Чили\n    ay: Chili\n    az: Çili\n    ba: Чи́ли\n    be: Чылі\n    bg: Чили\n    bh: चिली\n    bi: Chile\n    bm: Chile\n    bn: চিলি\n    bo: ཅི་ལི།\n    br: Chile\n    bs: Čile\n    ca: Xile\n    ce: Чили\n    ch: Chile\n    co: Cile\n    cs: Chile\n    cu: Чилє\n    cv: Чили\n    cy: Chile\n    da: Chile\n    de: Chile\n    dv: ޗިލީ\n    dz: ཅི་ལེ\n    ee: Chile\n    el: Χιλή\n    en: Chile\n    eo: Ĉilio\n    es: Chile\n    et: Tšiili\n    eu: Txile\n    fa: شیلی\n    ff: Ciile\n    fi: Chile\n    fj: Chile\n    fo: Kili\n    fr: Chili\n    fy: Sily\n    ga: an tSile\n    gd: an t-Sile\n    gl: Chile\n    gn: Chile\n    gu: ચીલી\n    gv: yn Çhillee\n    ha: Chile\n    he: צ'ילה\n    hi: चिली\n    hr: Čile\n    ht: Chili\n    hu: Chile\n    hy: Չիլի\n    ia: Chile\n    id: Chili\n    ie: Chile\n    ig: Chile\n    ik: Cili\n    io: Chili\n    is: Síle\n    it: Cile\n    iu: ᓯᓕ\n    ja: チリ\n    jv: Chili\n    ka: ჩილე\n    kg: Chile\n    ki: Chile\n    kk: Чили\n    kl: Chile\n    km: ឈីលី\n    kn: ಚಿಲಿ\n    ko: 칠레\n    ks: چِلی\n    ku: Şîle\n    kv: Чили\n    kw: Chile\n    ky: Чили\n    la: Chilia\n    lb: Chile\n    lg: Chile\n    li: Chili\n    ln: Shili\n    lo: ປະເທດຈີເລ\n    lt: Čilė\n    lv: Čīle\n    mg: Silia\n    mi: Hiri\n    mk: Чиле\n    ml: ചിലി\n    mn: Чили\n    mr: चिली\n    ms: Chile\n    mt: Ċili\n    my: ချီလီနိုင်ငံ\n    na: Tsire\n    ne: चिली\n    nl: Chili\n    \"no\": Chile\n    nv: Chíilii\n    ny: Chile\n    oc: Chile\n    om: Chiilii\n    or: ଚିଲି\n    os: Чили\n    pa: ਚਿਲੀ\n    pi: चिले\n    pl: Chile\n    ps: چېلي\n    pt: Chile\n    qu: Chili\n    rm: Chile\n    rn: Chile\n    ro: Chile\n    ru: Чили\n    rw: Shili\n    sa: चिले\n    sc: Cile\n    sd: چلي\n    se: Chile\n    sg: Shilïi\n    sh: Čile\n    si: චිලි\n    sk: Čile\n    sl: Čile\n    sm: Shili\n    sn: Chile\n    so: Jili\n    sq: Kilia\n    sr: Чиле\n    ss: iShile\n    st: Chile\n    su: Cilé\n    sv: Chile\n    sw: Chile\n    ta: சிலி\n    te: చిలీ\n    tg: Чиле\n    th: ชิลี\n    ti: ቺሌ\n    tk: Çili\n    tl: Chile\n    tn: Chile\n    to: Sile\n    tr: Şili\n    ts: Chile\n    tt: Чи́ли\n    tw: Kyili\n    ty: Tīri\n    ug: چىلى\n    uk: Чи́лі\n    ur: چلی\n    uz: Chili\n    ve: Shile\n    vi: Chi-lê\n    vo: Cilän\n    wa: Tchili\n    wo: Ciili\n    xh: iChile\n    yi: טשילע\n    yo: Tsílè\n    za: Chile\n    zh: 智利\n    zu: ITshile\n"
  },
  {
    "path": "settings/country-names/cm.yaml",
    "content": "name: \n    default: Cameroun\n    af: Kameroen\n    am: ካሜሩን\n    an: Camerún\n    ar: الكاميرون\n    az: Kamerun\n    ba: Камерун\n    be: Камерун\n    bg: Камерун\n    bm: Kamerun\n    bn: ক্যামেরুন\n    bo: ཁམ་མུ་རོན།\n    br: Kameroun\n    bs: Kamerun\n    ca: Camerun\n    cs: Kamerun\n    cv: Камерун\n    cy: Camerŵn\n    da: Cameroun\n    de: Kamerun\n    dv: ކެމަރޫން\n    ee: Cameroon\n    el: Καμερούν\n    en: Cameroon\n    eo: Kameruno\n    es: Camerún\n    et: Kamerun\n    eu: Kamerun\n    fa: کامرون\n    ff: Kamerun\n    fi: Kamerun\n    fo: Kamerun\n    fr: Cameroun\n    fy: Kameroen\n    ga: Camarún\n    gd: Camarun\n    gl: Camerún\n    gv: Cameroon\n    ha: Kameru\n    he: קמרון\n    hi: कैमरुन\n    hr: Kamerun\n    ht: Kamewoun\n    hu: Kamerun\n    hy: Կամերուն\n    ia: Camerun\n    id: Kamerun\n    ie: Cameroon\n    ig: Kameroon\n    io: Kamerun\n    is: Kamerún\n    it: Camerun\n    ja: カメルーン\n    jv: Kamerun\n    ka: კამერუნი\n    kg: Kamerun\n    ki: Cameroon\n    kk: Камерун\n    kn: ಕ್ಯಾಮರೂನ್\n    ko: 카메룬\n    ks: کیٚمِروٗن\n    ku: Kamerûn\n    kw: Kameroun\n    la: Cameronia\n    lb: Kamerun\n    li: Kameroen\n    ln: Kamerun\n    lt: Kamerūnas\n    lv: Kamerūna\n    mi: Kamarūna\n    mk: Камерун\n    ml: കാമറൂൺ\n    mn: Камерун\n    mr: कामेरून\n    ms: Cameroon\n    mt: Kamerun\n    my: ကင်မရွန်းနိုင်ငံ\n    na: Kamerun\n    ne: क्यामेरून\n    nl: Kameroen\n    \"no\": Kamerun\n    nv: Táłtłʼááh Chʼosh Daadánígíí Bitooh\n    oc: Cameron\n    or: କାମେରୁନ\n    os: Камерун\n    pa: ਕੈਮਰੂਨ\n    pl: Kamerun\n    ps: کامرون\n    pt: Camarões\n    qu: Kamirun\n    rm: Camerun\n    ro: Camerun\n    ru: Камерун\n    rw: Kameruni\n    sa: केमेरून\n    sc: Camerùn\n    se: Kamerun\n    sg: Kamerün\n    sh: Kamerun\n    sk: Kamerun\n    sl: Kamerun\n    sn: Cameroon\n    so: Kamiruun\n    sq: Kameruni\n    sr: Камерун\n    ss: IKhameruni\n    su: Kamerun\n    sv: Kamerun\n    sw: Kamerun\n    ta: கமரூன்\n    te: కామెరూన్\n    tg: Камерун\n    th: ประเทศแคเมอรูน\n    tk: Kamerun\n    tl: Kamerun\n    tr: Kamerun\n    ts: Cameroon\n    tt: Камерун\n    ug: كامېرۇن\n    uk: Камерун\n    ur: کیمرون\n    uz: Kamerun\n    vi: Cameroon\n    vo: Kamerunän\n    wo: Kamerun\n    yi: קאמערון\n    yo: Kamẹrúùn\n    zh: 喀麦隆\n    zu: IKamerooni\n"
  },
  {
    "path": "settings/country-names/cn.yaml",
    "content": "name: \n    default: 中国\n    ab: Чынҭ\n    af: China\n    ak: China\n    am: የቻይና\n    an: China\n    ar: الصين\n    as: চীন\n    av: Чин\n    ay: China\n    az: Çin\n    ba: Ҡытай\n    be: Кітай\n    bg: Китай\n    bh: चीन\n    bi: Jaena\n    bm: China\n    bn: গণচীন\n    bo: ཀྲུང་གོ།\n    br: Sina\n    bs: Kina\n    ca: Xina\n    ce: Цийн-мохк\n    ch: China\n    co: China\n    cs: Čína\n    cu: Срѣдинꙗнє\n    cv: Китай\n    cy: Tsieina\n    da: Kina\n    de: China\n    dv: ސީނުކަރަ\n    dz: རྒྱ་ནག\n    ee: China\n    el: Κίνα\n    en: China\n    eo: Ĉinio\n    es: China\n    et: Hiina\n    eu: Txina\n    fa: چین\n    ff: Ciina\n    fi: Kiina\n    fj: Jaina\n    fo: Kina\n    fr: Chine\n    fy: Sina\n    ga: Síne\n    gd: Sìona\n    gl: China\n    gn: Chína\n    gu: ચીન\n    gv: Sheen\n    ha: Sin\n    he: סין\n    hi: चीनी\n    hr: Kina\n    ht: Chin\n    hu: Kína\n    hy: Չինաստան\n    ia: China\n    id: Tiongkok\n    ie: China\n    ig: Chaina\n    ik: China\n    io: Chinia\n    is: Kína\n    it: Cina\n    iu: ᓴᐃᓇ\n    ja: 中国\n    jv: Cina\n    ka: ჩინეთი\n    kg: Sina\n    ki: China\n    kk: Қытай\n    kl: Kina\n    km: ចិន\n    kn: ಚೀನಿ\n    ko: 중국\n    ks: چیٖن\n    ku: Çîn\n    kv: Китай\n    kw: China\n    ky: Кытай\n    la: Sinae\n    lb: China\n    lg: Cayina\n    li: China\n    ln: Sína\n    lo: ປະເທດຈີນ\n    lt: Kinija\n    lv: Ķīna\n    mg: Sina\n    mi: Haina\n    mk: Кина\n    ml: ചീന\n    mn: Хятад\n    mr: चीन\n    ms: China\n    mt: Ċina\n    my: တရုတ်\n    na: Tsiene\n    ne: चीन\n    nl: China\n    \"no\": Kina\n    nv: Tsiiʼyishbizhí Dineʼé Bikéyah\n    ny: China\n    oc: China\n    om: Chaayinaan\n    or: ଚୀନ\n    os: Китай\n    pa: ਚੀਨ\n    pl: Chiny\n    ps: چين\n    pt: China\n    qu: Chunkuk\n    rm: China\n    rn: Ubushinwa\n    ro: China\n    ru: Китай\n    rw: Ubushinwa\n    sc: Cina\n    sd: چين\n    se: Kiinná\n    sg: Sînä\n    sh: Kina\n    si: චීනය\n    sk: Čína\n    sl: Kitájska\n    sm: Saina\n    sn: China\n    so: Shiinaha\n    sq: Kina\n    sr: Кина\n    ss: iShayina\n    st: Tjhaena\n    su: Tiongkok\n    sv: Kina\n    sw: China\n    ta: சீனா\n    te: చైనా\n    tg: Хито́й\n    th: ประเทศจีน\n    ti: የቻይና\n    tk: Hytaý\n    tl: Tsina\n    tn: China\n    to: Siaina\n    tr: Çin\n    ts: Chayina\n    tt: Кытай\n    tw: China\n    ty: Tinitō\n    ug: جۇڭخۇا خەلق جۇمھۇرىيىتى\n    uk: Кита́йська\n    ur: چین\n    uz: Xitoy\n    ve: China\n    vi: Trung Quốc\n    vo: Tsyinän\n    wo: Siin\n    xh: IShayina\n    yi: כינע\n    yo: Ṣáínà\n    za: Cunghgoz\n    zh: 中国\n    zu: IShayina\n"
  },
  {
    "path": "settings/country-names/co.yaml",
    "content": "name: \n    default: Colombia\n    af: Colombia\n    am: ኮሎምቢያ\n    an: Colombia\n    ar: كولومبيا\n    ay: Kuluwya\n    az: Kolumbiya\n    ba: Колумбия\n    be: Калумбія\n    bg: Колумбия\n    bi: Colombia\n    bn: কলম্বিয়া\n    bo: ཁོ་ལོམ་བི་ཡ།\n    br: Kolombia\n    bs: Kolumbija\n    ca: Colòmbia\n    ce: Колумби\n    co: Colombia\n    cs: Kolumbie\n    cv: Колумби\n    cy: Colombia\n    da: Colombia\n    de: Kolumbien\n    dv: ކޮލަންބިއާ\n    dz: ཀོ་ལོམ་བི་ཡ\n    ee: Colombia\n    el: Κολομβία\n    en: Colombia\n    eo: Kolombio\n    es: Colombia\n    et: Colombia\n    eu: Kolonbia\n    fa: کلمبیا\n    fi: Kolumbia\n    fo: Kolumbia\n    fr: Colombie\n    fy: Kolombia\n    ga: An Cholóim\n    gd: Coloimbia\n    gl: Colombia\n    gn: Kolómbia\n    gu: કોલમ્બિયા\n    gv: Yn Cholombey\n    he: קולומביה\n    hi: कोलम्बिया\n    hr: Kolumbija\n    ht: Kolonbi\n    hu: Kolumbia\n    hy: Կոլումբիա\n    ia: Colombia\n    id: Kolombia\n    ie: Columbia\n    io: Kolumbia\n    is: Kólumbía\n    it: Colombia\n    ja: コロンビア\n    jv: Kolombia\n    ka: კოლუმბია\n    kk: Колумбия Республикасы\n    kl: Colombia\n    km: កូឡុំប៊ី\n    kn: ಕೊಲೊಂಬಿಯ\n    ko: 콜롬비아\n    ku: Kolombiya\n    kw: Kolombi\n    la: Columbia\n    lb: Kolumbien\n    li: Colombia\n    ln: Kolombi\n    lt: Kolumbija\n    lv: Kolumbija\n    mg: Kolombia\n    mi: Koromōpia\n    mk: Колумбија\n    ml: കൊളംബിയ\n    mn: Колумб\n    mr: कोलंबिया\n    ms: Colombia\n    mt: Kolombja\n    my: ကိုလံဘီယာနိုင်ငံ\n    na: Korombiya\n    ne: कोलम्बिया\n    nl: Colombia\n    \"no\": Colombia\n    nv: Kolámbiya\n    oc: Colómbia\n    om: Colombia\n    or: କଲୋମ୍ବିଆ\n    os: Колумби\n    pa: ਕੋਲੰਬੀਆ\n    pl: Kolumbia\n    pt: Colômbia\n    qu: Kulumbya\n    rm: Columbia\n    ro: Columbia\n    ru: Колумбия\n    rw: Kolombiya\n    sa: कोलोम्बिया\n    se: Colombia\n    sh: Kolumbija\n    sk: Kolumbia\n    sl: Kolumbija\n    so: Kolombiya\n    sq: Kolumbia\n    sr: Колумбија\n    su: Kolombia\n    sv: Colombia\n    sw: Kolombia\n    ta: கொலொம்பியா\n    te: కొలంబియా\n    tg: Кулумбия\n    th: ประเทศโคลอมเบีย\n    tl: Colombia\n    tr: Kolombiya\n    ts: Colombia\n    tt: Колумбия\n    ug: كولومبىيە\n    uk: Колумбія\n    ur: کولمبیا\n    uz: Kolumbiya\n    vi: Colombia\n    vo: Kolumbän\n    wo: Koloombi\n    xh: IsiColombia\n    yi: קאלאמביע\n    yo: Kòlómbìà\n    zh: 哥伦比亚\n    zu: IKolombiya\n"
  },
  {
    "path": "settings/country-names/cr.yaml",
    "content": "name: \n    default: Costa Rica\n    ab: Коста-Рика\n    af: Costa Rica\n    am: ኮስታ ሪካ\n    an: Costa Rica\n    ar: كوستاريكا\n    ay: Kustarika\n    az: Kosta-Rika\n    ba: Коста-Рика\n    be: Коста-Рыка\n    bg: Коста Рика\n    bh: कोस्टा रिका\n    bm: Kosta Rika\n    bn: কোস্টা রিকা\n    bo: ཁོ་ས་ཏ་རི་ཁ\n    br: Costa Rica\n    bs: Kostarika\n    ca: Costa Rica\n    ce: Коста-Рика\n    cs: Kostarika\n    cy: Costa Rica\n    da: Costa Rica\n    de: Costa Rica\n    dv: ކޮސްޓަރީކާ\n    ee: Costa Rica\n    el: Κόστα Ρίκα\n    en: Costa Rica\n    eo: Kostariko\n    es: Costa Rica\n    et: Costa Rica\n    eu: Costa Rica\n    fa: کاستاریکا\n    fi: Costa Rica\n    fo: Kosta Rika\n    fr: Costa Rica\n    fy: Kosta Rika\n    ga: Cósta Ríce\n    gd: Costa Rica\n    gl: Costa Rica\n    gn: Kosta Rrika\n    gv: Yn Coose Berçhagh\n    he: קוסטה ריקה\n    hi: कोस्टा रीका\n    hr: Kostarika\n    ht: Kostarika\n    hu: Costa Rica\n    hy: Կոստա Ռիկա\n    ia: Costa Rica\n    id: Kosta Rika\n    ie: Costa Rica\n    io: Kosta Rika\n    is: Kosta Ríka\n    it: Costa Rica\n    ja: コスタリカ\n    jv: Kosta Rika\n    ka: კოსტა-რიკა\n    kk: Коста-Рика\n    kn: ಕೋಸ್ಟಾ ರಿಕ\n    ko: 코스타리카\n    ku: Kosta Rîka\n    kv: Коста-Рика\n    kw: Kosta Rika\n    ky: Коста-Рика\n    la: Ora Opulenta\n    lb: Costa Rica\n    li: Costa Rica\n    ln: Kosta Rika\n    lo: ປະເທດກົດສະຕາລິກາ\n    lt: Kosta Rika\n    lv: Kostarika\n    mg: Costa Rica\n    mi: Koto Rika\n    mk: Костарика\n    ml: കോസ്റ്റ റീക്ക\n    mn: Коста-Рика\n    mr: कोस्टा रिका\n    ms: Costa Rica\n    mt: Kosta Rika\n    my: ကော့စတာရီကာနိုင်ငံ\n    na: Kosta Rika\n    ne: कोस्टारिका\n    nl: Costa Rica\n    \"no\": Costa Rica\n    oc: Còsta Rica\n    om: Kostaa Rikaa\n    or: କୋଷ୍ଟାରିକା\n    os: Коста-Рикæ\n    pa: ਕੋਸਤਾ ਰੀਕਾ\n    pi: कोस्टा रीका\n    pl: Kostaryka\n    ps: کوسټاریکا\n    pt: Costa Rica\n    qu: Kustarika\n    ro: Costa Rica\n    ru: Коста-Рика\n    rw: Kosita Rika\n    sa: कोस्टा रीका\n    se: Costa Rica\n    sh: Kostarika\n    si: කෝස්ට රිකා\n    sk: Kostarika\n    sl: Kostarika\n    sm: Kosta Rika\n    so: Kosta Rika\n    sq: Kosta Rika\n    sr: Костарика\n    ss: IKhosta-Likha\n    su: Kosta Rika\n    sv: Costa Rica\n    sw: Kosta Rika\n    ta: கோஸ்ட்டா ரிக்கா\n    te: కోస్టారీకా\n    tg: Коста Рика\n    th: ประเทศคอสตาริกา\n    tk: Kosta-Rika\n    tl: Costa Rica\n    tr: Kosta Rika\n    tt: Коста-Рика\n    ug: كوستارىكا\n    uk: Коста-Рика\n    ur: کوسٹاریکا\n    uz: Kosta Rika\n    vi: Costa Rica\n    vo: Kostarikän\n    wa: Costa Rica\n    wo: Kosta Riika\n    yi: קאסטא ריקא\n    yo: Kóstá Rikà\n    zh: 哥斯达黎加\n    zu: Costa Rica\n"
  },
  {
    "path": "settings/country-names/cu.yaml",
    "content": "name: \n    default: Cuba\n    af: Kuba\n    am: ኩባ\n    an: Cuba\n    ar: كوبا\n    ay: Kuba\n    az: Kuba\n    ba: Куба\n    be: Куба\n    bg: Куба\n    bm: Kuba\n    bn: কিউবা\n    bo: ཀུ་བ།\n    br: Kuba\n    bs: Kuba\n    ca: Cuba\n    ce: Куба\n    cs: Kuba\n    cv: Куба\n    cy: Cuba\n    da: Cuba\n    de: Kuba\n    dv: ކިއުބާ\n    ee: Cuba\n    el: Κούβα\n    en: Cuba\n    eo: Kubo\n    es: Cuba\n    et: Kuuba\n    eu: Kuba\n    fa: کوبا\n    fi: Kuuba\n    fo: Kuba\n    fr: Cuba\n    fy: Kuba\n    ga: Cúba\n    gd: Cùba\n    gl: Cuba\n    gn: Kuva\n    gv: Yn Choobey\n    he: קובה\n    hi: क्यूबा\n    hr: Kuba\n    ht: Kiba\n    hu: Kuba\n    hy: Կուբա\n    ia: Cuba\n    id: Kuba\n    io: Kuba\n    is: Kúba\n    it: Cuba\n    iu: ᖂᐹ\n    ja: キューバ\n    jv: Kuba\n    ka: კუბა\n    kk: Куба\n    km: គុយបា\n    kn: ಕ್ಯೂಬಾ\n    ko: 쿠바\n    ku: Kûba\n    kv: Куба\n    kw: Kuba\n    la: Cuba\n    lb: Kuba\n    li: Cuba\n    ln: Kuba\n    lt: Kuba\n    lv: Kuba\n    mi: Kiupa\n    mk: Куба\n    ml: ക്യൂബ\n    mn: Куба\n    mr: क्युबा\n    ms: Cuba\n    mt: Kuba\n    my: ကျူးဘားနိုင်ငံ\n    na: Kiuba\n    ne: क्युबा\n    nl: Cuba\n    \"no\": Cuba\n    nv: Kyóoba\n    oc: Cuba\n    or: କ୍ୟୁବା\n    os: Кубæ\n    pa: ਕਿਊਬਾ\n    pl: Kuba\n    pt: Cuba\n    qu: Kuba\n    ro: Cuba\n    ru: Куба\n    rw: Kiba\n    sa: क्यूबा\n    sc: Cuba\n    se: Cuba\n    sh: Kuba\n    si: කියුබාව\n    sk: Kuba\n    sl: Kuba\n    so: Kuuba\n    sq: Kuba\n    sr: Куба\n    ss: IKhuyubha\n    su: Kuba\n    sv: Kuba\n    sw: Kuba\n    ta: கூபா\n    te: క్యూబా\n    tg: Кубо\n    th: ประเทศคิวบา\n    tk: Kuba\n    tl: Kuba\n    tr: Küba\n    tt: Куба\n    ug: كۇبا\n    uk: Куба\n    ur: کیوبا\n    uz: Kuba\n    vi: Cuba\n    vo: Kubeän\n    wa: Couba\n    wo: Kubaa\n    yi: קובא\n    yo: Kúbà\n    za: Gujbah\n    zh: 古巴\n"
  },
  {
    "path": "settings/country-names/cv.yaml",
    "content": "name: \n    default: Cabo Verde\n    af: Kaap Verde\n    ar: الرأس الأخضر\n    be: Каба-Вердэ\n    br: Kab Glas\n    ca: Cap Verd\n    cs: Kapverdy\n    cy: Cabo Verde\n    da: Kap Verde\n    de: Kap Verde\n    el: Πράσινο Ακρωτήριο\n    en: Cape Verde\n    eo: Kaboverdo\n    es: Cabo Verde\n    et: Roheneemesaared\n    fa: کیپ ورد\n    fi: Kap Verde\n    fr: Cap-Vert\n    fy: Kaapverdje\n    ga: Rinn Verde\n    gd: Cape Verde\n    he: כף ורדה\n    hr: Zelenortski Otoci\n    hu: Zöld-foki Köztársaság\n    id: Tanjung Verde\n    io: Kabo Verda\n    is: Grænhöfðaeyjar\n    it: Capo Verde\n    la: Promontorium Viride\n    lb: Kap Verde\n    li: Kaapverdië\n    lt: Žaliasis Kyšulys\n    lv: Kaboverde\n    mi: Te Kūrae Matomato\n    mk: Зелен ’Рт\n    mn: Кабо-Верде\n    nl: Kaapverdië\n    \"no\": Kapp Verde\n    pl: Republika Zielonego Przylądka\n    pt: Cabo Verde\n    ru: Кабо-Верде\n    se: Kap Verde\n    sl: Zelenortski otoki\n    sr: Зеленортска Острва\n    sv: Kap Verde\n    ta: கேப் வர்டி\n    th: ประเทศเคปเวิร์ด\n    tr: Yeşil Burun Adaları\n    uk: Кабо-Верде\n    uz: Kabo-Verde\n    vo: Kabovärduäns\n    zh: 佛得角\n"
  },
  {
    "path": "settings/country-names/cy.yaml",
    "content": "name: \n    default: Κύπρος - Kıbrıs\n    af: Siprus\n    am: ቆጵሮስ\n    an: Chipre\n    ar: قبرص\n    az: Kipr\n    be: Кіпр\n    bg: Кипър\n    bi: Cyprus\n    bn: সাইপ্রাস\n    bo: སེ་པི་རི་སི།\n    br: Kiprenez\n    bs: Kipar\n    ca: Xipre\n    ce: Кипр\n    co: Cipru\n    cs: Kypr\n    cu: Кѷпръ\n    cv: Кипр\n    cy: Cyprus\n    da: Cypern\n    de: Zypern\n    ee: Cyprus\n    el: Κύπρος\n    en: Cyprus\n    eo: Kipro\n    es: Chipre\n    et: Küpros\n    eu: Zipre\n    fa: قبرس\n    fi: Kypros\n    fo: Kýpros\n    fr: Chypre\n    fy: Syprus\n    ga: An Chipir\n    gd: Cìopras\n    gl: Chipre\n    gn: Chipre\n    gu: સાયપ્રસ\n    gv: Yn Cheeprey\n    he: קפריסין\n    hi: साइप्रस\n    hr: Cipar\n    ht: Chip\n    hu: Ciprus\n    hy: Կիպրոս\n    ia: Cypro\n    id: Siprus\n    ie: Cypria\n    io: Chipro\n    is: Kýpur\n    it: Cipro\n    ja: キプロス\n    jv: Siprus\n    ka: კვიპროსი\n    kg: Kipros\n    kk: Кипр\n    kl: Cyperni\n    kn: ಕಿಪ್ರೊಸ್\n    ko: 키프로스\n    ku: Kîpros\n    kv: Кипр\n    kw: Kobros\n    la: Cyprus\n    lb: Zypern\n    li: Cyprus\n    lt: Kipras\n    lv: Kipra\n    mg: Kipra\n    mi: Haipara\n    mk: Кипар\n    ml: സൈപ്രസ്\n    mn: Кипр\n    mr: सायप्रस\n    ms: Cyprus\n    mt: Ċipru\n    my: ဆိုက်ပရပ်စ်နိုင်ငံ\n    na: Taiprus\n    ne: साइप्रस\n    nl: Cyprus\n    \"no\": Kypros\n    nv: Béésh Łichíiʼii Bikéyah\n    oc: Chipre\n    or: ସାଇପ୍ରସ\n    os: Кипр\n    pa: ਸਾਇਪ੍ਰਸ\n    pl: Cypr\n    pt: Chipre\n    qu: Kipru\n    rm: Cipra\n    ro: Cipru\n    ru: Кипр\n    rw: Shipure\n    sc: Tzipru\n    se: Kypros\n    sh: Cipar\n    si: සයිප්‍රස්\n    sk: Cyprus\n    sl: Ciper\n    sm: Cyprus\n    so: Qabrus\n    sq: Qiproja\n    sr: Кипар\n    ss: ISayiphro\n    su: Siprus\n    sv: Cypern\n    sw: Kupro\n    ta: சைப்பிரஸ்\n    te: సైప్రస్\n    tg: Кипр\n    th: ประเทศไซปรัส\n    tk: Kipr\n    tl: Tsipre\n    tr: Kıbrıs\n    tt: Кипр\n    ug: سىپرۇس\n    uk: Кіпр\n    ur: قبرص\n    uz: Qibris\n    vi: Síp\n    vo: Sipreän\n    wo: Ciipër\n    yi: קיפראס\n    yo: Kíprù\n    zh: 赛普勒斯/塞浦路斯/塞浦路斯\n"
  },
  {
    "path": "settings/country-names/cz.yaml",
    "content": "name: \n    default: Česko\n    ab: Чехиа\n    af: Tsjeggië\n    am: ቼክ ሪፐብሊክ\n    an: Republica Checa\n    ar: التشيك\n    av: Чехия\n    ay: Chexya Ripublika\n    az: Çexiya\n    ba: Чехия\n    be: Чэхія\n    bg: Чешка република\n    bh: चेक रिपब्लिक\n    bi: Czech Republic\n    bn: চেক প্রজাতন্ত্র\n    bo: ཅེ་ཁེ།\n    br: Tchekia\n    bs: Češka\n    ca: Txèquia\n    ce: Чехи\n    ch: Chekia\n    co: Cechia\n    cs: Česko\n    cu: Чєшьско\n    cv: Чех Республики\n    cy: Gweriniaeth Tsiec\n    da: Tjekkiet\n    de: Tschechien\n    dv: ޗެކް ޖުމްހޫރިއްޔާ\n    dz: ཅེཀ་རི་པབ་ལིཀ་\n    ee: Czech Republic\n    el: Τσεχία\n    en: Czechia\n    eo: Ĉeĥio\n    es: Chequia\n    et: Tšehhi\n    eu: Txekia\n    fa: جمهوری چک\n    ff: Cekiya\n    fi: Tšekki\n    fo: Kekkia\n    fr: Tchéquie\n    fy: Tsjechje\n    ga: An tSeic\n    gd: An t-Seic\n    gl: República Checa\n    gn: Cheko\n    gv: Yn Phobblaght Çheck\n    ha: Kazech\n    he: צכיה\n    hi: चेक गणराज्य\n    hr: Češka\n    ht: Repiblik tchèk\n    hu: Csehország\n    hy: Չեխիա\n    ia: Republica Chec\n    id: Republik Ceko\n    ie: Tchechia\n    ig: Chekia\n    ik: Czech Republic\n    io: Chekia\n    is: Tékkland\n    it: Repubblica Ceca\n    ja: チェコ\n    jv: Céko\n    ka: ჩეხეთი\n    kg: République tchèque\n    kk: Чехия\n    kl: Tjekkia\n    kn: ಜೆಕ್ ಗಣರಾಜ್ಯ\n    ko: 체코\n    ku: Komara Çekî\n    kv: Чехия\n    kw: Pow Chek\n    ky: Чехия\n    la: Cechia\n    lb: Tschechien\n    li: Tsjechië\n    ln: Republíki Sheki\n    lo: ສາທາລະນະລັດແຊັກ\n    lt: Čekija\n    lv: Čehija\n    mg: Tsekia\n    mi: Tīekia\n    mk: Чешка\n    ml: ചെക്ക് റിപ്പബ്ലിക്ക്\n    mn: Бүгд Найрамдах Чех Улс\n    mr: चेक प्रजासत्ताक\n    ms: Republik Czech\n    mt: Repubblika Ċeka\n    my: ချက်သမ္မတနိုင်ငံ\n    na: Ripubrikin Tsiek\n    ne: चेक गणतन्त्र\n    nl: Tsjechië\n    \"no\": Tsjekkia\n    nv: Chek Bikéyah\n    oc: Republica Chèca\n    om: Cheekiyaa\n    or: ଚେକ ରିପବ୍ଲିକ\n    os: Чехи\n    pa: ਚੈੱਕ ਗਣਰਾਜ\n    pi: चेक रिपब्लिक\n    pl: Czechy\n    ps: چېک جمهوريت\n    pt: Tcheca\n    qu: Chiksuyu\n    rm: Tschechia\n    ro: Cehia\n    ru: Чехия\n    rw: Cekiya\n    sa: ज़ेक् रिपब्लिक\n    sc: Repùblica Ceca\n    sd: جمهوريه چيڪ\n    se: Čeahkka\n    sh: Češka Republika\n    si: චෙක් ජනරජය\n    sk: Česko\n    sl: Češka\n    sm: Czechs Republic\n    sn: Czechia\n    so: Jamhuuriyadda Tashik\n    sq: Republika Çeke\n    sr: Чешка\n    ss: Shekhi\n    su: Céko\n    sv: Tjeckien\n    sw: Ucheki\n    ta: செக் குடியரசு\n    te: చెక్ రిపబ్లిక్\n    tg: Чехия\n    th: สาธารณรัฐเช็ก\n    tk: Çehiýa\n    tl: Republikang Tseko\n    tr: Çek Cumhuriyeti\n    ts: Czech Republic\n    tt: Чехия\n    ty: Czech Republic\n    ug: چېخ جۇمھۇرىيەتى\n    uk: Чехія\n    ur: چیک جمہوریہ\n    uz: Chexiya\n    vi: Cộng hòa Séc\n    vo: Tsyegän\n    wa: Tchekeye\n    wo: Réewum Cek\n    yi: טשעכיי\n    yo: Tsẹ́kì Olómìnira\n    za: Ciethaek\n    zh: 捷克\n    zu: ITsheki\n"
  },
  {
    "path": "settings/country-names/de.yaml",
    "content": "name: \n    default: Deutschland\n    ab: Алмантәыла\n    af: Duitsland\n    ak: Germany\n    am: ጀርመን\n    an: Alemanya\n    ar: ألمانيا\n    av: Алмания\n    ay: Alimaña\n    az: Almaniya\n    ba: Германия\n    be: Германія\n    bg: Германия\n    bi: Germany\n    bm: Jermani\n    bn: জার্মানি\n    bo: འཇར་མན།\n    br: Alamagn\n    bs: Njemačka\n    ca: Alemanya\n    ce: Германи\n    co: Germania\n    cs: Německo\n    cu: Нѣмьци\n    cv: Германи\n    cy: Yr Almaen\n    da: Tyskland\n    de: Deutschland\n    dv: ޖަރުމަނުވިލާތް\n    dz: ཇཱར་མ་ནི\n    ee: Germany\n    el: Γερμανία\n    en: Germany\n    eo: Germanio\n    es: Alemania\n    et: Saksamaa\n    eu: Alemania\n    fa: آلمان\n    ff: Almaanya\n    fi: Saksa\n    fo: Týskland\n    fr: Allemagne\n    fy: Dútslân\n    ga: An Ghearmáin\n    gd: A' Ghearmailt\n    gl: Alemaña\n    gn: Alemaña\n    gu: જર્મની\n    gv: Yn Ghermaan\n    ha: Jamus\n    he: גרמניה\n    hi: जर्मनी\n    hr: Njemačka\n    ht: Almay\n    hu: Németország\n    hy: Գերմանիա\n    ia: Germania\n    id: Jerman\n    ie: Germania\n    ig: Jémanị\n    io: Germania\n    is: Þýskaland\n    it: Germania\n    iu: ᔮᒪᓂ\n    ja: ドイツ\n    jv: Jerman\n    ka: გერმანია\n    kg: Alemanyi\n    ki: Germany\n    kk: Германия Федеративтік Республикасы\n    kl: Tyskit Nunaat\n    km: អាល្លឺម៉ង់\n    kn: ಜರ್ಮನಿ\n    ko: 독일\n    ks: جرمٔنی\n    ku: Almanya\n    kv: Германия\n    kw: Almayn\n    ky: Германия\n    la: Germania\n    lb: Däitschland\n    lg: Girimane\n    li: Duutsjlandj\n    ln: Alémani\n    lo: ປະເທດເຢັຽລະມັນ\n    lt: Vokietija\n    lv: Vācija\n    mg: Alemaina\n    mi: Tiamani\n    mk: Германија\n    ml: ജർമ്മനി\n    mn: Герман\n    mo: Ӂермания\n    mr: जर्मनी\n    ms: Jerman\n    mt: Ġermanja\n    my: ဂျာမနီနိုင်ငံ\n    na: Djermani\n    ne: जर्मनी\n    nl: Duitsland\n    \"no\": Tyskland\n    nv: Béésh Bichʼahii Bikéyah\n    oc: Alemanha\n    or: ଜର୍ମାନୀ\n    os: Герман\n    pa: ਜਰਮਨੀ\n    pl: Niemcy\n    ps: آلمان\n    pt: Alemanha\n    qu: Alimanya\n    rm: Germania\n    rn: Ubudagi\n    ro: Germania\n    ru: Германия\n    rw: Ubudage\n    sa: जर्मनी\n    sc: Germània\n    se: Duiska\n    sh: Nemačka\n    si: ජර්මනිය\n    sk: Nemecko\n    sl: Nemčija\n    sm: Siamani\n    so: Jarmalka\n    sq: Gjermania\n    sr: Немачка\n    ss: IJalimane\n    su: Jérman\n    sv: Tyskland\n    sw: Ujerumani\n    ta: செருமனி\n    te: జర్మనీ\n    tg: Олмон\n    th: ประเทศเยอรมนี\n    ti: ጀርመን\n    tk: Germaniýa\n    tl: Alemanya\n    tr: Almanya\n    ts: Jarimani\n    tt: Алмания\n    tw: Gyaaman\n    ty: Heremani\n    ug: گېرمانىيە\n    uk: Німеччина\n    ur: جرمنی\n    uz: Olmoniya\n    vi: Đức\n    vo: Deutän\n    wa: Almagne\n    wo: Almaañ\n    xh: IJamani\n    yi: דייטשלאנד\n    yo: Jẹ́mánì\n    za: Dwzgoz\n    zh: 德国\n    zu: IJalimani\n"
  },
  {
    "path": "settings/country-names/dj.yaml",
    "content": "name: \n    default: Djibouti جيبوتي\n    af: Djiboeti\n    am: ጅቡቲ\n    an: Chibuti\n    ar: جيبوتي\n    az: Cibuti\n    ba: Джибути\n    be: Джыбуці\n    bg: Джибути\n    bn: জিবুতি\n    bo: ཇི་བའོ་ཊི།\n    br: Djibouti\n    bs: Džibuti\n    ca: Djibouti\n    ce: Джибути\n    cs: Džibutsko\n    cv: Джибути\n    cy: Djibouti\n    da: Djibouti\n    de: Dschibuti\n    dv: ޖިބުތީ\n    ee: Djibouti\n    el: Τζιμπουτί\n    en: Djibouti\n    eo: Ĝibutio\n    es: Yibuti\n    et: Djibouti\n    eu: Djibuti\n    fa: جیبوتی\n    fi: Djibouti\n    fr: Djibouti\n    fy: Dzjibûty\n    ga: Diobúití\n    gd: Diobùtaidh\n    gl: Xibutí\n    gv: Djibouti\n    he: ג'יבוטי\n    hi: जिबूती\n    hr: Džibuti\n    ht: Djibouti\n    hu: Dzsibuti\n    hy: Ջիբութի\n    ia: Djibouti\n    id: Djibouti\n    ie: Djibouti\n    io: Djibuti\n    is: Djíbútí\n    it: Gibuti\n    ja: ジブチ\n    jv: Djibouti\n    ka: ჯიბუტი\n    kg: Djibuti\n    ki: Djibouti\n    kk: Джибути\n    ko: 지부티\n    ku: Cîbûtî\n    kw: Jibouti\n    la: Gibutum\n    lb: Dschibuti\n    li: Djibouti\n    ln: Djibuti\n    lt: Džibutis\n    lv: Džibutija\n    mg: Jibotia\n    mi: Tipūti\n    mk: Џибути\n    ml: ജിബൂട്ടി\n    mn: Джибути\n    mr: जिबूती\n    ms: Djibouti\n    mt: Ġibuti\n    my: ဂျီဘူတီနိုင်ငံ\n    na: Djibuti\n    ne: जिबुटी\n    nl: Djibouti\n    \"no\": Djibouti\n    nv: Jibótii\n    oc: Jiboti\n    om: Jibuutii\n    or: ଡିଜିବୋଇଟି\n    os: Джибути\n    pa: ਜਿਬੂਤੀ\n    pl: Dżibuti\n    ps: جېبوتي\n    pt: Djibouti\n    qu: Yiwuti\n    ro: Djibouti\n    ru: Джибути\n    rw: Jibuti\n    sa: जिबूटी\n    sc: Gibuti\n    se: Djibouti\n    sg: Dibutùii\n    sh: Džibuti\n    sk: Džibutsko\n    sl: Džibuti\n    sn: Djibouti\n    so: Jabuuti\n    sq: Xhibuti\n    sr: Џибути\n    ss: IJibhuthi\n    su: Djibouti\n    sv: Djibouti\n    sw: Jibuti\n    ta: சீபூத்தீ\n    te: జిబౌటి\n    tg: Ҷибути\n    th: ประเทศจิบูตี\n    ti: ጂቡቲ\n    tk: Jibuti\n    tl: Hiboti\n    tr: Cibuti\n    ts: Djibouti\n    tt: Җибути\n    ug: جىبۇتى\n    uk: Джибуті\n    ur: جبوتی\n    uz: Jibuti\n    vi: Djibouti\n    vo: Cibutän\n    wo: Jibuti\n    yi: דזשיבוטי\n    yo: Djìbútì\n    zh: 吉布提\n    zu: IJibuthi\n"
  },
  {
    "path": "settings/country-names/dk.yaml",
    "content": "name: \n    default: Danmark\n    af: Denemarke\n    am: ዴንማርክ\n    an: Dinamarca\n    ar: الدنمارك\n    az: Danimarka\n    ba: Дания\n    be: Данія\n    bg: Дания\n    bi: Denmark\n    bn: ডেনমার্ক\n    bo: དན་མྲག\n    br: Danmark\n    bs: Danska\n    ca: Dinamarca\n    ce: Дани\n    co: Danimarca\n    cs: Dánsko\n    cu: Данїꙗ\n    cv: Дани\n    cy: Denmarc\n    da: Danmark\n    de: Dänemark\n    dv: ޑެންމާކު\n    dz: ཌེན་མཱཀ་\n    ee: Denmark\n    el: Δανία\n    en: Denmark\n    eo: Danio\n    es: Dinamarca\n    et: Taani\n    eu: Danimarka\n    fa: دانمارک\n    fi: Tanska\n    fo: Danmark\n    fr: Danemark\n    fy: Denemark\n    ga: An Danmhairg\n    gd: An Danmhairg\n    gl: Dinamarca\n    gn: Ndinamayka\n    gv: Yn Danvarg\n    he: דנמרק\n    hi: डेनमार्क\n    hr: Danska\n    ht: Danmak\n    hu: Dánia\n    hy: Դանիա\n    ia: Danmark\n    id: Denmark\n    ie: Dania\n    io: Dania\n    is: Danmörk\n    it: Danimarca\n    ja: デンマーク\n    jv: Denmark\n    ka: დანია\n    kg: Danemark\n    ki: Denmark\n    kk: Дания\n    kl: Danmarki\n    kn: ಡೆನ್ಮಾರ್ಕ್\n    ko: 덴마크\n    ku: Danîmarka\n    kv: Дания\n    kw: Danmark\n    ky: Дания\n    la: Dania\n    lb: Dänemark\n    lg: Denimaaka\n    li: Denemarke\n    ln: Danemark\n    lt: Danija\n    lv: Dānija\n    mg: Danmarka\n    mi: Tenemāka\n    mk: Данска\n    ml: ഡെന്മാർക്ക്\n    mn: Дани\n    mr: डेन्मार्क\n    ms: Denmark\n    mt: Danimarka\n    my: ဒိန်းမတ်နိုင်ငံ\n    na: Denemark\n    ne: डेनमार्क\n    nl: Denemarken\n    \"no\": Danmark\n    nv: Déinish Dineʼé Bikéyah\n    oc: Danemarc\n    or: ଡେନମାର୍କ\n    os: Дани\n    pl: Dania\n    ps: ډېنمارک\n    pt: Dinamarca\n    qu: Dansuyu\n    rm: Danemarc\n    rn: Danemarke\n    ro: Danemarca\n    ru: Дания\n    rw: Danimarike\n    sa: डेनमार्क\n    sc: Danimarca\n    se: Dánmárku\n    sh: Danska\n    si: ඩෙන්මාර්කය\n    sk: Dánsko\n    sl: Danska\n    so: Denmark\n    sq: Danimarka\n    sr: Данска\n    ss: IDenimakhi\n    st: Denmark\n    su: Dénmark\n    sv: Danmark\n    sw: Denmark\n    ta: டென்மார்க்\n    te: డెన్మార్క్\n    tg: Дания\n    th: ประเทศเดนมาร์ก\n    tk: Daniýa\n    tl: Dinamarka\n    tr: Danimarka\n    tt: Дания\n    ug: دانىيە\n    uk: Данія\n    ur: ڈنمارک\n    uz: Daniya\n    vi: Đan Mạch\n    vo: Danän\n    wo: Danmaark\n    yi: דענמארק\n    yo: Dẹ́nmárkì\n    zh: 丹麦\n    zu: IDenimaki\n"
  },
  {
    "path": "settings/country-names/dm.yaml",
    "content": "name: \n    default: Dominica\n    af: Dominika\n    ar: دومينيكا\n    be: Дамініка\n    br: Republik Dominikan\n    cs: Dominika\n    de: Dominica\n    el: Δομινίκα\n    en: Dominica\n    eo: Dominiko\n    es: Dominica\n    eu: Dominika\n    fa: دومینیکا\n    fi: Dominica\n    fr: Dominique\n    fy: Dominika\n    ga: Doiminice\n    gd: Doiminicia\n    he: דומיניקה\n    hr: Dominika\n    hu: Dominikai Közösség\n    id: Dominika\n    is: Dóminíka\n    it: Dominìca\n    ja: ドミニカ\n    lt: Dominika\n    lv: Dominika\n    mn: Доминика\n    nl: Dominica\n    \"no\": Dominica\n    pl: Dominika\n    pt: Dominica\n    ru: Доминика\n    se: Dominica\n    sk: Dominika\n    sl: Dominika\n    sv: Dominica\n    th: ประเทศโดมินิกา\n    tr: Dominika\n    uk: Домініка\n    vo: Dominikeän\n    zh: 多米尼克\n"
  },
  {
    "path": "settings/country-names/do.yaml",
    "content": "name: \n    default: República Dominicana\n    af: Dominikaanse Republiek\n    am: ዶሚኒካን ሪፐብሊክ\n    an: Republica Dominicana\n    ar: جمهورية الدومينيكان\n    ay: Republika Duminikana\n    az: Dominikan Respublikası\n    be: Дамініканская Рэспубліка\n    bg: Доминиканска република\n    bn: ডোমিনিকান প্রজাতন্ত্র\n    bo: ཌོ་མི་ནི་ཀན་སྤྱི་མཐུན་རྒྱལ་ཁབ།\n    br: Republik Dominikan\n    bs: Dominikanska Republika\n    ca: República Dominicana\n    ce: Доминикан Пачхьалкх\n    cs: Dominikánská republika\n    cy: Gweriniaeth Dominica\n    da: Dominikanske Republik\n    de: Dominikanische Republik\n    dv: ޑޮމިނިކަން ޖުމްހޫރިއްޔާ\n    ee: Dominican Republic\n    el: Δομινικανή Δημοκρατία\n    en: Dominican Republic\n    eo: Domingo\n    es: República Dominicana\n    et: Dominikaani Vabariik\n    eu: Dominikar Errepublika\n    fa: جمهوری دومینیکن\n    fi: Dominikaaninen tasavalta\n    fo: Dominikanalýðveldið\n    fr: République dominicaine\n    fy: Dominikaanske Republyk\n    ga: An Phoblacht Dhoiminiceach\n    gd: Poblachd Dhoiminicia\n    gl: República Dominicana\n    gv: Yn Phobblaght Ghominicagh\n    he: הרפובליקה הדומיניקנית\n    hi: डोमिनिकन गणराज्य\n    hr: Dominikanska Republika\n    ht: Dominikani\n    hu: Dominikai Köztársaság\n    hy: Դոմինիկյան Հանրապետություն\n    ia: Republica Dominican\n    id: Republik Dominika\n    io: Dominikana Republiko\n    is: Dóminíska lýðveldið\n    it: Repubblica Dominicana\n    ja: ドミニカ共和国\n    jv: Republik Dominika\n    ka: დომინიკელთა რესპუბლიკა\n    kk: Доминикан Республикасы\n    kn: ಡೊಮಿನಿಕ ಗಣರಾಜ್ಯ\n    ko: 도미니카 공화국\n    ku: Komara Domînîk\n    kw: Repoblek Dhominikanek\n    la: Respublica Dominicana\n    lb: Dominikanesch Republik\n    li: Dominicaanse Rippubliek\n    ln: Republiki Dominikani\n    lt: Dominikos Respublika\n    lv: Dominikāna\n    mi: Te Whenua Tominika\n    mk: Доминиканска Република\n    ml: ഡൊമനിക്കൻ റിപ്പബ്ലിക്\n    mn: Доминиканы Бүгд Найрамдах Улс\n    mr: डॉमिनिकन प्रजासत्ताक\n    ms: Republik Dominika\n    mt: Repubblika Dominikana\n    my: ဒိုမီနီကန်သမ္မတနိုင်ငံ\n    na: Ripubrikin Dominika\n    nb: Den dominikanske republikk\n    ne: डोमिनिकन गणतन्त्र\n    nl: Dominicaanse Republiek\n    nn: Den dominikanske republikken\n    \"no\": Den dominikanske republikk\n    nv: Domingo Bikéyah\n    oc: Republica Dominicana\n    or: ଡୋମେନିକାନ ରିପବ୍ଲିକ\n    os: Доминиканæйы Республикæ\n    pa: ਡੋਮਿਨਿਕਾਈ ਗਣਰਾਜ\n    pl: Dominikana\n    ps: ډومنيکان جمهوريت\n    pt: República Dominicana\n    qu: Duminikana\n    ro: Republica Dominicană\n    ru: Доминиканская Республика\n    rw: Repubulika ya Dominikani\n    sa: डोमोनिकन रिपब्लिक\n    se: Dominikána dásseváldi\n    sh: Dominikanska Republika\n    sk: Dominikánska republika\n    sl: Dominikanska republika\n    sq: Republika Dominikane\n    sr: Доминиканска Република\n    ss: Tibuse weDomonokha\n    su: Républik Dominika\n    sv: Dominikanska Republiken\n    sw: Jamhuri ya Dominika\n    ta: டொமினிக்கன் குடியரசு\n    te: డొమెనికన్ రిపబ్లిక్\n    tg: Ҷумҳурии Доминикана\n    th: สาธารณรัฐโดมินิกัน\n    tl: Republikang Dominikano\n    tr: Dominik Cumhuriyeti\n    tt: Доминикан Җөмһүрияте\n    ug: دومىنىكان جۇمھۇرىيەتى\n    uk: Домініканська Республіка\n    ur: جمہوریہ ڈومینیکن\n    uz: Dominika Respublikasi\n    vi: Cộng hòa Dominica\n    vo: Sandominän\n    wo: Réewum Dominik\n    yi: דאמיניקאנישע רעפובליק\n    yo: Orílẹ̀òmìnira Dómíníkì\n    zh: 多明尼加共和國\n"
  },
  {
    "path": "settings/country-names/dz.yaml",
    "content": "name: \n    default: Algérie / ⵍⵣⵣⴰⵢⴻⵔ / الجزائر\n    af: Algerië\n    ak: Algeria\n    am: አልጄሪያ\n    an: Alcheria\n    ar: الجزائر\n    as: আলজেৰিয়া\n    ay: Alhirya\n    az: Əlcəzair\n    ba: Алжи́р\n    be: Алжы́р\n    bg: Алжѝр\n    bh: अल्जीरिया\n    bm: Algeri\n    bn: আলজেরিয়া\n    bo: ཨཱལ་ཇི་རི་ཡ།\n    br: Aljeria\n    bs: Alžir\n    ca: Algèria\n    ce: Алжи́р\n    cs: Alžírsko\n    cv: Алжир\n    cy: Algeria\n    da: Algeriet\n    de: Algerien\n    dv: ޖަޒާއިރު\n    dz: ཨཱལ་ཇི་རི་ཡ\n    ee: Ɔldzeria\n    el: Αλγερία\n    en: Algeria\n    eo: Alĝerio\n    es: Argelia\n    et: Alžeeria\n    eu: Aljeria\n    fa: الجزایر\n    ff: Aljeri\n    fi: Algeria\n    fo: Algeria\n    fr: Algérie\n    fy: Algerije\n    ga: An Ailgéir\n    gd: Aildiria\n    gl: Alxeria\n    gn: Ayhelia\n    gu: અલ્જીરિયા\n    gv: Yn Algear\n    ha: Aljeriya\n    he: אלג'יריה\n    hi: अल्जीरिया\n    hr: Alžir\n    ht: Aljeri\n    hu: Algéria\n    hy: Ալժիր\n    ia: Algeria\n    id: Aljazair\n    ie: Algeria\n    ig: Algeria\n    io: Aljeria\n    is: Alsír\n    it: Algeria\n    ja: アルジェリア\n    jv: Aljazair\n    ka: ალჟირი\n    kg: Algeria\n    ki: Algeria\n    kk: Алжир\n    kl: Algeriet\n    km: ប្រទេសអាល់ហ្សេរី\n    kn: ಅಲ್ಜೀರಿಯ\n    ko: 알제리\n    ks: اٮ۪لجیرِیا\n    ku: Cezayir\n    kw: Aljeri\n    ky: Алжир\n    la: Algerium\n    lb: Algerien\n    lg: Algeria\n    li: Algerieë\n    ln: Aljeria\n    lo: ແອລຈິເລຍ\n    lt: Alžyras\n    lv: Alžīrija\n    mg: Aljeria\n    mi: Aratiria\n    mk: Алжир\n    ml: അൾജീറിയ\n    mn: Алжир\n    mr: अल्जीरिया\n    ms: Algeria\n    mt: Alġerija\n    my: အယ်လ်ဂျီးရီးယားနိုင်ငံ\n    na: Ardjiriya\n    ne: अल्जेरिया\n    nl: Algerije\n    \"no\": Algerie\n    nv: Aljííya\n    ny: Algeria\n    oc: Argeria\n    om: Aljeeriyaa\n    or: ଆଲଜେରିଆ\n    os: Алжир\n    pa: ਅਲਜੀਰੀਆ\n    pi: अल्जीरिया\n    pl: Algieria\n    ps: الجزاير\n    pt: Argélia\n    qu: Alhirya\n    rm: Algeria\n    rn: Alijeriya\n    ro: Algeria\n    ru: Алжир\n    rw: Aligeriya\n    sa: अल्जीरिया\n    sc: Algerìa\n    sd: الجزائر\n    se: Algeria\n    sg: Alazëri\n    sh: Alžir\n    si: ඇල්ජීරියාව\n    sk: Alžírsko\n    sl: Alžirija\n    sm: Algeria\n    sn: Algeria\n    so: Aljeeriya\n    sq: Algjeria\n    sr: Алжир\n    ss: i-Alijeriya\n    st: Algeria\n    su: Aljazair\n    sv: Algeriet\n    sw: Algeria\n    ta: அல்சீரியா\n    te: అల్జీరియా\n    tg: Алҷазоир\n    th: ประเทศแอลจีเรีย\n    ti: አልጀሪያ\n    tk: Alžir\n    tl: Arhelya\n    to: ʻAisilia\n    tr: Cezayir\n    ts: Algeriya\n    tt: Әлҗәзаи́р\n    tw: Algeria\n    ug: ئالجىرىيە\n    uk: Алжир\n    ur: الجزائر\n    uz: Jazoir\n    vi: Algérie\n    vo: Laljerän\n    wa: Aldjereye\n    wo: Alseeri\n    xh: I-Algeria\n    yi: אַלזשיר\n    yo: Àlgéríà\n    za: Algeria\n    zh: 阿尔及利亚\n    zu: iAljiriya\n"
  },
  {
    "path": "settings/country-names/ec.yaml",
    "content": "name: \n    default: Ecuador\n    am: ኤኳዶር\n    an: Ecuador\n    ar: الإكوادور\n    ay: Ikwadur\n    az: Ekvador\n    ba: Эквадор\n    be: Эквадор\n    bg: Еквадор\n    bn: ইকুয়েডর\n    bo: ཨེ་ཁོའོ་ཌོར།\n    br: Ecuador\n    bs: Ekvador\n    ca: Equador\n    ce: Эквадор\n    cs: Ekvádor\n    cv: Эквадор\n    cy: Ecuador\n    da: Ecuador\n    de: Ecuador\n    dv: އިކުއެޑޯރު\n    ee: Ecuador\n    el: Ισημερινός (χώρα)\n    en: Ecuador\n    eo: Ekvadoro\n    es: Ecuador\n    et: Ecuador\n    eu: Ekuador\n    fa: اکوادور\n    fi: Ecuador\n    fo: Ekvador\n    fr: Équateur\n    fy: Ekwador\n    ga: Eacuadór\n    gd: Eacuador\n    gl: Ecuador\n    gn: Ekuator\n    gu: ઈક્વેડોર\n    gv: Ecuador\n    he: אקוודור\n    hi: ईक्वाडोर\n    hr: Ekvador\n    ht: Ekwatè\n    hu: Ecuador\n    hy: Էկվադոր\n    ia: Ecuador\n    id: Ekuador\n    ie: Ecuador\n    io: Equador\n    is: Ekvador\n    it: Ecuador\n    ja: エクアドル\n    jv: Ekuador\n    ka: ეკვადორი\n    ki: Ecuador\n    kk: Эквадор\n    kl: Ecuador\n    kn: ಎಕ್ವಡಾರ್\n    ko: 에콰도르\n    ku: Ekuador\n    kw: Pow Ekwadorel\n    la: Aequatoria\n    lb: Ecuador\n    li: Ecuador\n    ln: Republíki ya Ekwatéli\n    lt: Ekvadoras\n    lv: Ekvadora\n    mi: Ekuatoa\n    mk: Еквадор\n    ml: ഇക്വഡോർ\n    mn: Эквадор\n    mr: इक्वेडोर\n    ms: Ecuador\n    mt: Ekwador\n    my: အီကွေဒေါနိုင်ငံ\n    na: Ekwador\n    ne: इक्वेडर\n    nl: Ecuador\n    \"no\": Ecuador\n    nv: Kéyah Nahasdzáán Ałníiʼgi Siʼánígíí\n    oc: Eqüator\n    or: ଏକ୍ଵାଡୋର\n    os: Эквадор\n    pa: ਏਕੁਆਦੋਰ\n    pl: Ekwador\n    ps: اېکوادور\n    pt: Equador\n    qu: Ikwadur\n    rm: Ecuador\n    ro: Ecuador\n    ru: Эквадор\n    rw: Ekwadoro\n    sa: एक्वाडोर\n    se: Ecuador\n    sh: Ekvador\n    sk: Ekvádor\n    sl: Ekvador\n    so: Ikwadoor\n    sq: Ekuadori\n    sr: Еквадор\n    su: Ékuador\n    sv: Ecuador\n    sw: Ekuador\n    ta: எக்குவடோர்\n    te: ఈక్వడార్\n    tg: Экуадор\n    th: ประเทศเอกวาดอร์\n    tl: Ecuador\n    tr: Ekvador\n    tt: Эквадор\n    ug: ئېكۋادور\n    uk: Еквадор\n    ur: ایکواڈور\n    uz: Ekvador\n    vi: Ecuador\n    vo: Lekvadorän\n    wo: Ekwadoor\n    yi: עקוואדאר\n    yo: Ẹ̀kùàdọ̀r\n    zh: 厄瓜多尔\n"
  },
  {
    "path": "settings/country-names/ee.yaml",
    "content": "name: \n    default: Eesti\n    af: Estland\n    am: ኤስቶኒያ\n    an: Estonia\n    ar: إستونيا\n    az: Estoniya\n    ba: Эстония\n    be: Эстонія\n    bg: Естония\n    bi: Estonia\n    bm: Estonia\n    bn: ইস্তোনিয়া\n    bo: ཨིསུ་ཊོ་ནིཡ།\n    br: Estonia\n    bs: Estonija\n    ca: Estònia\n    ce: Эстони\n    co: Estonia\n    cs: Estonsko\n    cu: Єсть\n    cv: Эстони\n    cy: Estonia\n    da: Estland\n    de: Estland\n    dz: ཨིསི་ཊོ་ནི་ཡ།\n    ee: Estonia\n    el: Εσθονία\n    en: Estonia\n    eo: Estonio\n    es: Estonia\n    et: Eesti\n    eu: Estonia\n    fa: استونی\n    ff: Estoniya\n    fi: Viro\n    fo: Estland\n    fr: Estonie\n    fy: Estlân\n    ga: An Eastóin\n    gd: Eastòinia\n    gl: Estonia\n    gn: Etoña\n    gu: ઈસ્ટોનિયા\n    gv: Yn Estaan\n    he: אסטוניה\n    hi: एस्टोनिया\n    hr: Estonija\n    ht: Estoni\n    hu: Észtország\n    hy: Էստոնիա\n    ia: Estonia\n    id: Estonia\n    ie: Estonia\n    io: Estonia\n    is: Eistland\n    it: Estonia\n    ja: エストニア\n    jv: Estonia\n    ka: ესტონეთი\n    kg: Estonia\n    kk: Эстония\n    kl: Estlandi\n    kn: ಎಸ್ಟೊನಿಯ\n    ko: 에스토니아\n    ku: Estonya\n    kv: Эстония\n    kw: Estoni\n    ky: Эстония\n    la: Estonia\n    lb: Estland\n    li: Esland\n    ln: Estonia\n    lt: Estija\n    lv: Igaunija\n    mg: Estonia\n    mi: Etonia\n    mk: Естонија\n    ml: എസ്റ്റോണിയ\n    mn: Эстон\n    mr: एस्टोनिया\n    ms: Estonia\n    mt: Estonja\n    my: အက်စ်တိုးနီးယားနိုင်ငံ\n    na: Etoniya\n    ne: इस्टोनिया\n    nl: Estland\n    \"no\": Estland\n    nv: Ééstii Bikéyah\n    oc: Estònia\n    or: ଏଷ୍ଟୋନିଆ\n    os: Эстони\n    pa: ਇਸਤੋਨੀਆ\n    pl: Estonia\n    ps: اېسټونيا\n    pt: Estónia\n    qu: Istunya\n    ro: Estonia\n    ru: Эстония\n    rw: Esitoniya\n    sa: एस्टोनिया\n    sc: Estònia\n    se: Estteeana\n    sh: Estonija\n    si: එස්ටෝනියා\n    sk: Estónsko\n    sl: Estonija\n    so: Estoniya\n    sq: Estonia\n    sr: Естонија\n    ss: IWestoniya\n    st: Estonia\n    su: Éstonia\n    sv: Estland\n    sw: Estonia\n    ta: எசுத்தோனியா\n    te: ఎస్టోనియా\n    tg: Эстония\n    th: ประเทศเอสโตเนีย\n    tk: Estoniýa\n    tl: Estonia\n    tr: Estonya\n    tt: Эстония\n    ug: ئېستونىيە\n    uk: Естонія\n    ur: استونیا\n    uz: Estoniya\n    ve: Estonia\n    vi: Estonia\n    vo: Lestiyän\n    wo: Estooni\n    yi: עסטלאנד\n    yo: Estóníà\n    zh: 爱沙尼亚\n    zu: I-Estoniya\n"
  },
  {
    "path": "settings/country-names/eg.yaml",
    "content": "name: \n    default: مصر\n    ab: Мы́сры\n    af: Egipte\n    ak: Igyipt\n    am: ግብፅ\n    an: Echipto\n    ar: مصر\n    as: ইজিপ্ত\n    av: Еги́пет\n    ay: Iqiqtu\n    az: Misir\n    ba: Мысыр\n    be: Егі́пет\n    bg: Египет\n    bh: मिस्र\n    bm: Misra\n    bn: মিশর\n    bo: ཨའི་ཅི།\n    br: Egipt\n    bs: Egipat\n    ca: Egipte\n    ce: Мисар\n    ch: Ehiptu\n    cs: Egypt\n    cu: Єгѷптъ\n    cy: Yr Aifft\n    da: Egypten\n    de: Ägypten\n    dv: މިޞްރު\n    ee: Edzipti\n    el: Αίγυπτος\n    en: Egypt\n    eo: Egiptio\n    es: Egipto\n    et: Egiptus\n    eu: Egipto\n    fa: مصر\n    ff: Ejipt\n    fi: Egypti\n    fj: Ijipta\n    fo: Egyptaland\n    fr: Égypte\n    fy: Egypte\n    ga: An Éigipt\n    gd: An Èipheit\n    gl: Exipto\n    gn: Ehipto\n    gu: ઇજિપ્ત\n    gv: Yn Egypt\n    ha: Misra\n    he: מצרים\n    hi: मिस्र\n    hr: Egipat\n    ht: Ejip\n    hu: Egyiptom\n    hy: Եգիպտոս\n    ia: Egypto\n    id: Mesir\n    ie: Egiptia\n    ig: Egypt\n    io: Egiptia\n    is: Egyptaland\n    it: Egitto\n    ja: エジプト\n    jv: Mesir\n    ka: ეგვიპტე\n    kg: Misiri\n    ki: Egypt\n    kk: Мысыр\n    kl: Egypt\n    km: អេហ៊្សីប\n    kn: ಈಜಿಪ್ಟ್\n    ko: 이집트\n    ks: مِسر\n    ku: Misir\n    kv: Египет\n    kw: Ejyp\n    ky: Египет\n    la: Aegyptus\n    lb: Egypten\n    lg: Egypt\n    li: Egypte\n    ln: Ejipte\n    lo: ອີຢິບ\n    lt: Egiptas\n    lv: Ēģipte\n    mg: Ejipta\n    mi: Īhipa\n    mk: Египет\n    ml: ഈജിപ്ത്\n    mn: Египет\n    mr: इजिप्त\n    ms: Mesir\n    mt: Eġittu\n    my: အီဂျစ်နိုင်ငံ\n    na: Idjipt\n    ne: मिश्र\n    nl: Egypte\n    \"no\": Egypt\n    nv: Ííjip\n    oc: Egipte\n    om: Ijiipti\n    or: ଇଜିପ୍ଟ\n    os: Мысыр\n    pa: ਮਿਸਰ\n    pi: ईजिप्ट\n    pl: Egipt\n    ps: مصر\n    pt: Egito\n    qu: Ihiptu\n    rm: Egipta\n    rn: Egipto\n    ro: Egipt\n    ru: Египет\n    sa: ईजिप्तदेशः\n    sc: Egittu\n    sd: مصر\n    se: Egypta\n    sg: Kâmitâ\n    sh: Egipat\n    si: ඊජීප්තුව\n    sk: Egypt\n    sl: Egipt\n    sm: Aikupito\n    sn: Egypt\n    so: Masar\n    sq: Egjipti\n    sr: Египат\n    ss: iGibhithe\n    st: Egepeta\n    su: Mesir\n    sv: Egypten\n    sw: Misri\n    ta: எகிப்து\n    te: ఈజిప్టు\n    tg: Миср\n    th: ประเทศอียิปต์\n    ti: ግብጽ\n    tk: Müsür\n    tl: Ehipto\n    to: ʻIsipite\n    tr: Mısır\n    ts: Gibita\n    tt: Мисы́р\n    tw: Egypt\n    ty: ’Aifiti\n    ug: مىسىر\n    uk: Єги́пет\n    ur: مصر\n    uz: Misr\n    vi: Ai Cập\n    vo: Lägüptän\n    wa: Edjipe\n    wo: Isipt\n    yi: עגיפטן\n    yo: Ẹ́gíptì\n    za: Aehciz\n    zh: 埃及\n    zu: iGibhithe\n"
  },
  {
    "path": "settings/country-names/eh.yaml",
    "content": "name: \n    default: الجمهورية العربية الصحراوية الديمقراطية\n    ar: الجمهورية العربية الصحراوية الديمقراطية\n    cs: Saharská arabská demokratická republika\n    de: Demokratische Arabische Republik Sahara\n    el: Δημοκρατία της Σαχάρας\n    en: Sahrawi Arab Democratic Republic\n    es: República Árabe Saharaui Democrática\n    fa: جمهوری دموکراتیک عربی صحرا\n    fr: République arabe sahraouie démocratique\n    it: Repubblica Araba Democratica dei Sahrawi\n    lt: Sacharos Arabų Demokratinė Respublika\n    nb: Den saharawiske arabiske demokratiske republikk\n    nl: Arabische Democratische Republiek Sahara\n    nn: Den saharawiske arabiske demokratiske republikken\n    \"no\": Den saharawiske arabiske demokratiske republikk\n    pt: República Árabe Saaraui Democrática\n    ru: Сахарская Арабская Демократическая Республика\n    ur: صحراوی عرب عوامی جمہوریہ\n    zh: 撒拉威阿拉伯民主共和國\n"
  },
  {
    "path": "settings/country-names/er.yaml",
    "content": "name: \n    default: ኤርትራ Eritrea إرتريا\n    af: Eritrea\n    am: ኤርትራ\n    an: Eritrea\n    ar: إرتريا\n    az: Eritreya\n    ba: Эритрея\n    be: Эрытрэя\n    bg: Еритрея\n    bm: Eritrea\n    bn: ইরিত্রিয়া\n    bo: ཨི་རི་ཏྲའ།\n    br: Eritrea\n    bs: Eritreja\n    ca: Eritrea\n    ce: Эритре\n    cs: Eritrea\n    cu: Єрѷѳрїꙗ\n    cy: Eritrea\n    da: Eritrea\n    de: Eritrea\n    dv: އެރިތުރިއާ\n    ee: Eritrea\n    el: Ερυθραία\n    en: Eritrea\n    eo: Eritreo\n    es: Eritrea\n    et: Eritrea\n    eu: Eritrea\n    fa: اریتره\n    fi: Eritrea\n    fo: Eritrea\n    fr: Érythrée\n    fy: Eritreä\n    ga: An Eiritré\n    gd: Eartra\n    gl: Eritrea\n    gn: Erityrea\n    gv: Eritrea\n    he: אריתריאה\n    hi: इरित्रिया\n    hr: Eritreja\n    ht: Eritre\n    hu: Eritrea\n    hy: Էրիթրեա\n    ia: Eritrea\n    id: Eritrea\n    ie: Eritréa\n    io: Eritrea\n    is: Erítrea\n    it: Eritrea\n    ja: エリトリア\n    jv: Eritrea\n    ka: ერიტრეა\n    kg: Eritrea\n    kk: Эритрея\n    kn: ಎರಿಟ್ರಿಯ\n    ko: 에리트레아\n    ku: Erîtrea\n    kw: Eritrea\n    ky: Эритрея\n    la: Erythraea\n    lb: Eritrea\n    li: Eritrea\n    ln: Elitré\n    lt: Eritrėja\n    lv: Eritreja\n    mi: Eritēria\n    mk: Еритреја\n    ml: എരിട്രിയ\n    mn: Эритрей\n    mr: इरिट्रिया\n    ms: Eritrea\n    mt: Eritrea\n    my: အီရီထရီးယားနိုင်ငံ\n    na: Eritrea\n    ne: एरिट्रिया\n    nl: Eritrea\n    \"no\": Eritrea\n    oc: Eritrèa\n    om: Eritrea\n    or: ଇରିଟ୍ରିଆ\n    os: Эритрей\n    pa: ਇਰੀਤਰੀਆ\n    pl: Erytrea\n    ps: اریتره\n    pt: Eritreia\n    qu: Iritriya\n    ro: Eritreea\n    ru: Эритрея\n    rw: Eritereya\n    sa: इरीट्रिया\n    sc: Eritrea\n    se: Eritrea\n    sg: Eritrëe\n    sh: Eritreja\n    sk: Eritrea\n    sl: Eritreja\n    sn: Eritrea\n    so: Eratareya\n    sq: Eritrea\n    sr: Еритреја\n    ss: IRitheya\n    st: Eritrea\n    su: Éritréa\n    sv: Eritrea\n    sw: Eritrea\n    ta: எரித்திரியா\n    te: ఎరిత్రియా\n    tg: Эритрея\n    th: ประเทศเอริเทรีย\n    ti: ኤርትራ\n    tk: Eritreýa\n    tl: Eritrea\n    tr: Eritre\n    ts: Eritreya\n    tt: Эритрея\n    ug: ئېرىترېيە\n    uk: Еритрея\n    ur: اریتریا\n    uz: Eritriya\n    vi: Eritrea\n    vo: Lerüträn\n    wo: Eritere\n    yi: עריטרעא\n    yo: Ẹritrẹ́à\n    zh: 厄立特里亚\n    zu: I-Eritrea\n"
  },
  {
    "path": "settings/country-names/es.yaml",
    "content": "name: \n    default: España\n    af: Spanje\n    am: እስፓንያ\n    an: Espanya\n    ar: إسبانيا\n    ay: Ispaña\n    az: İspaniya\n    ba: Испания\n    be: Іспанія\n    bg: Испания\n    bi: Spain\n    bn: স্পেন\n    bo: ཞི་པན་ཡ།\n    br: Spagn\n    bs: Španija\n    ca: Espanya\n    ce: Испани\n    ch: España\n    co: Spagna\n    cs: Španělsko\n    cu: Їспанїꙗ\n    cv: Испани\n    cy: Sbaen\n    da: Spanien\n    de: Spanien\n    dv: އިސްޕެއިން\n    dz: སིཔཱེན་\n    ee: Spain\n    el: Ισπανία\n    en: Spain\n    eo: Hispanio\n    es: España\n    et: Hispaania\n    eu: Espainia\n    fa: اسپانیا\n    fi: Espanja\n    fo: Spania\n    fr: Espagne\n    fy: Spanje\n    ga: An Spáinn\n    gd: An Spàinn\n    gl: España\n    gn: España\n    gu: સ્પેન\n    gv: Yn Spaainey\n    he: ספרד\n    hi: स्पेन\n    hr: Španjolska\n    ht: Espay\n    hu: Spanyolország\n    hy: Իսպանիա\n    ia: Espania\n    id: Spanyol\n    ie: Hispania\n    ig: Spain\n    ik: Spaña\n    io: Hispania\n    is: Spánn\n    it: Spagna\n    iu: ᓯᐸᐃᓐ\n    ja: スペイン\n    jv: Spanyol\n    ka: ესპანეთი\n    kg: Espania\n    kk: Испания\n    kl: Spania\n    km: អេស្ប៉ាញ\n    kn: ಸ್ಪೇನ್\n    ko: 스페인\n    ku: Spanya\n    kv: Испания\n    kw: Spayn\n    ky: Испания\n    la: Hispania\n    lb: Spuenien\n    li: Spanje\n    ln: Espania\n    lt: Ispanija\n    lv: Spānija\n    mg: Espaina\n    mi: Peina\n    mk: Шпанија\n    ml: സ്പെയിൻ\n    mn: Испани\n    mr: स्पेन\n    ms: Sepanyol\n    mt: Spanja\n    my: စပိန်နိုင်ငံ\n    na: Pain\n    ne: स्पेन\n    nl: Spanje\n    \"no\": Spania\n    nv: Dibé Diníí Bikéyah\n    oc: Espanha\n    or: ସ୍ପେନ\n    os: Испани\n    pa: ਸਪੇਨ\n    pl: Hiszpania\n    ps: اسپانیا\n    pt: Espanha\n    qu: Ispaña\n    rm: Spagna\n    rn: Esipanye\n    ro: Spania\n    ru: Испания\n    rw: Esipanye\n    sa: स्पेन्\n    sc: Ispagna\n    se: Espánnja\n    sh: Španija\n    sk: Španielsko\n    sl: Španija\n    sm: Spania\n    so: Isbania\n    sq: Spanja\n    sr: Шпанија\n    ss: Sipeyini\n    st: Spain\n    su: Spanyol\n    sv: Spanien\n    sw: Hispania\n    ta: எசுப்பானியா\n    te: స్పెయిన్\n    tg: Испониё\n    th: ประเทศสเปน\n    tk: Ispaniýa\n    tl: Espanya\n    to: Sepeni\n    tr: İspanya\n    ts: Spaniya\n    tt: Испания\n    ty: Paniora\n    ug: ئىسپانىيە\n    uk: Іспанія\n    ur: ہسپانیہ\n    uz: Ispaniya\n    vi: Tây Ban Nha\n    vo: Spanyän\n    wa: Espagne\n    wo: Ispaañ\n    yi: שפאניע\n    yo: Spéìn\n    za: Sihbanhyaz\n    zh: 西班牙\n    zu: ISpeyini\n"
  },
  {
    "path": "settings/country-names/et.yaml",
    "content": "name: \n    default: ኢትዮጵያ\n    af: Ethiopië\n    ak: Ithiopia\n    am: ኢትዮጵያ\n    an: Etiopia\n    ar: إثيوبيا\n    av: Хабашистан\n    az: Efiopiya\n    ba: Эфио́пия\n    be: Эфіопія\n    bg: Етиопия\n    bh: इथियोपिया\n    bm: Etiopia\n    bn: ইথিওপিয়া\n    bo: ཨི་ཐི་ཨོ་པི་ཡ།\n    br: Etiopia\n    bs: Etiopija\n    ca: Etiòpia\n    ce: Эфио́пи\n    cs: Etiopie\n    cu: Єѳїопі́ꙗ\n    cv: Эфиопи\n    cy: Ethiopia\n    da: Etiopien\n    de: Äthiopien\n    dv: ޙަބުޝްކަރަ\n    dz: ཨི་ཐི་ཡོ་པི་ཡ\n    ee: Etiopia\n    el: Αιθιοπία\n    en: Ethiopia\n    eo: Etiopio\n    es: Etiopía\n    et: Etioopia\n    eu: Etiopia\n    fa: اتیوپی\n    fi: Etiopia\n    fo: Etiopia\n    fr: Éthiopie\n    fy: Etioopje\n    ga: an Aetóip\n    gd: An Aetiòp\n    gl: Etiopía - Ityop'iya\n    gn: Etiopia\n    gu: ઇથિયોપિયા\n    gv: yn Eetoip\n    ha: Ethiopia\n    he: אתיופיה\n    hi: इथियोपिया\n    hr: Etiopija\n    ht: Etyopi\n    hu: Etiópia\n    hy: Եթովպիա\n    ia: Ethiopia\n    id: Ethiopia\n    ie: Etiopia\n    ig: Ethiopia\n    io: Etiopia\n    is: Eþíópía\n    it: Etiopia\n    ja: エチオピア\n    jv: Étiopia\n    ka: ეთიოპია\n    kg: Itiopia\n    ki: Ethiopia\n    kk: Ефиопия\n    km: អេត្យូពី\n    kn: ಇತಿಯೋಪಿಯ\n    ko: 에티오피아\n    ks: اِتھوپِیا\n    ku: Etiyopya\n    kv: Эфиопия\n    kw: Ethiopi\n    ky: Эфиопия\n    la: Aethiopia\n    lb: Ethiopien\n    lg: Ethiopia\n    li: Ethiopië\n    ln: Etiopi\n    lo: ເອທີໂອເປຍ\n    lt: Etiopija\n    lv: Etiopija\n    mg: Etiopia\n    mi: Etiopia\n    mk: Етиопија\n    ml: എത്യോപ്യ\n    mn: Этиоп\n    mr: इथियोपिया\n    ms: Habsyah\n    mt: Etjopja\n    my: အီသီယိုးပီးယားနိုင်ငံ\n    na: Itiyopiya\n    ne: इथियोपिया\n    nl: Ethiopië\n    \"no\": Etiopia\n    nv: Iithiyópya\n    oc: Etiopia\n    om: Itoophiyaa\n    or: ଇଥିଓପିଆ\n    os: Эфио́пи\n    pa: ਇਥੋਪੀਆ\n    pi: ईथ्योपिया\n    pl: Etiopia\n    ps: اېتوپیا\n    pt: Etiópia\n    qu: Ithiyupya\n    rm: Etiopia\n    ro: Etiopia\n    ru: Эфиопия\n    rw: Etiyopiya\n    sa: ईथ्योपिया\n    sc: Etiòpia\n    se: Etiopia\n    sg: Etiopïi\n    sh: Etiopija\n    si: ඉතියෝපියාව\n    sk: Etiópia\n    sl: Etiópija\n    sm: Ethiopia\n    sn: Ethiopia\n    so: Itoobiya\n    sq: Etiopia\n    sr: Етиопија\n    ss: iTopiya\n    st: Ethiopia\n    su: Étiopia\n    sv: Etiopien\n    sw: Ethiopia\n    ta: எத்தியோப்பியா\n    te: ఇథియోపియా\n    tg: Эфиопия\n    th: เอธิโอเปีย\n    ti: ኢትዮጵያ\n    tk: Efiopiýa\n    tl: Etiyopiya\n    to: ʻItiōpea\n    tr: Etiyopya\n    ts: Topiya\n    tt: Хәбәшстан\n    ug: ئېفىئوپىيە\n    uk: Ефіо́пія\n    ur: ایتھوپیا\n    uz: Efiopiya\n    vi: Ethiopia\n    vo: Lätiopän\n    wa: Etiopeye\n    wo: Ecoopi\n    xh: iTopiya\n    yi: עטיאָפּיע\n    yo: Ethiópíà\n    za: Ethiopia\n    zh: 埃塞俄比亚\n    zu: i-Ithiopia\n"
  },
  {
    "path": "settings/country-names/fi.yaml",
    "content": "name: \n    default: Suomi\n    ab: Суоми\n    af: Finland\n    am: ፊንላንድ\n    an: Finlandia\n    ar: فنلندا\n    ay: Phini suyu\n    az: Finlandiya\n    ba: Финляндия\n    be: Фінляндыя\n    bg: Финландия\n    bi: Finland\n    bm: Finland\n    bn: ফিনল্যান্ড\n    bo: ཧྥིན་ལན\n    br: Finland\n    bs: Finska\n    ca: Finlàndia\n    ce: Финлянди\n    co: Finlandia\n    cs: Finsko\n    cu: Соумь\n    cv: Финлянди\n    cy: Y Ffindir\n    da: Finland\n    de: Finnland\n    dv: ފިންލޭންޑު\n    dz: ཕིན་ལེནཌ་\n    ee: Finland\n    el: Φινλανδία\n    en: Finland\n    eo: Finnlando\n    es: Finlandia\n    et: Soome\n    eu: Finlandia\n    fa: فنلاند\n    fi: Suomi\n    fo: Finnland\n    fr: Finlande\n    fy: Finlân\n    ga: An Fhionlainn\n    gd: Suòmaidh\n    gl: Finlandia\n    gn: Hĩlandia\n    gu: ફીનલેંડ\n    gv: Finnlynn\n    he: פינלנד\n    hi: फ़िनलैंड\n    hr: Finska\n    ht: Fenlann\n    hu: Finnország\n    hy: Ֆինլանդիա\n    ia: Finlandia\n    id: Finlandia\n    ie: Finland\n    ig: Finland\n    io: Finlando\n    is: Finnland\n    it: Finlandia\n    iu: ᐃᓐᓚᓐᑦ\n    ja: フィンランド\n    jv: Finlandia\n    ka: ფინეთი\n    kg: Finlandi\n    ki: Finland\n    kk: Финландия\n    kl: Finlandi\n    kn: ಫಿನ್‍ಲ್ಯಾಂಡ್\n    ko: 핀란드\n    ks: فننش\n    ku: Fînland\n    kv: Финляндия\n    kw: Pow Finn\n    ky: Финляндия\n    la: Finnia\n    lb: Finnland\n    lg: Finilandi\n    li: Finland\n    ln: Finilanda\n    lt: Suomija\n    lv: Somija\n    mg: Finlandy\n    mi: Whinarana\n    mk: Финска\n    ml: ഫിൻലാന്റ്\n    mn: Финлянд\n    mr: फिनलंड\n    ms: Finland\n    mt: Finlandja\n    my: ဖင်လန်နိုင်ငံ\n    na: Finland\n    ne: फिनल्याण्ड\n    nl: Finland\n    \"no\": Finland\n    nv: Nahoditsʼǫʼłání\n    oc: Finlàndia\n    or: ଫିନଲ୍ୟାଣ୍ଡ\n    os: Финлянди\n    pa: ਫ਼ਿਨਲੈਂਡ\n    pl: Finlandia\n    ps: فېنلانډ\n    pt: Finlândia\n    qu: Phinsuyu\n    rm: Finlanda\n    ro: Finlanda\n    ru: Финляндия\n    rw: Finilande\n    sa: फिन्लैंड\n    sc: Finlandia\n    se: Suopma\n    sh: Finska\n    si: ෆින්ලන්තය\n    sk: Fínsko\n    sl: Finska\n    sm: Finalagi\n    so: Finland\n    sq: Finlanda\n    sr: Финска\n    ss: IFini\n    st: Finland\n    su: Finlandia\n    sv: Finland\n    sw: Ufini\n    ta: பின்லாந்து\n    te: ఫిన్లెండ్\n    tg: Финланд\n    th: ประเทศฟินแลนด์\n    tk: Finlýandiýa\n    tl: Pinlandiya\n    tr: Finlandiya\n    tt: Finlândiä\n    ug: فىنلاندىيە\n    uk: Фінляндія\n    ur: فن لینڈ\n    uz: Finlandiya\n    vi: Phần Lan\n    vo: Suomiyän\n    wa: Finlande\n    wo: Finlaand\n    yi: פינלאנד\n    yo: Finlandi\n    za: Finlan\n    zh: 芬兰\n    zu: IFinlandi\n"
  },
  {
    "path": "settings/country-names/fj.yaml",
    "content": "name: \n    default: Viti\n    af: Fidji\n    am: ፊጂ\n    an: Fichi\n    ar: فيجي\n    az: Fici\n    ba: Фиджи\n    be: Фіджы\n    bg: Фиджи\n    bh: फिजी\n    bn: ফিজি\n    bo: ཧྥི་ཇི།\n    br: Fidji\n    bs: Fidži\n    ca: Fiji\n    ce: Фиджи\n    cs: Fidži\n    cv: Фиджи\n    cy: Fiji\n    da: Fiji\n    de: Fidschi\n    dv: ފިޖީ\n    el: Φίτζι\n    en: Fiji\n    eo: Fiĝioj\n    es: Fiyi\n    et: Fidži\n    eu: Fiji\n    fa: فیجی\n    ff: Fiiji\n    fi: Fidži\n    fj: Viti\n    fo: Fiji\n    fr: Fidji\n    fy: Fidzjy\n    ga: Fidsí\n    gd: Fìdi\n    gl: Fidxi - Viti\n    gv: Fiji\n    he: פיג'י\n    hi: फ़िजी\n    hr: Fidži\n    ht: Fidji\n    hu: Fidzsi-szigetek\n    hy: Ֆիջի\n    ia: Fiji\n    id: Fiji\n    io: Fidji\n    is: Fídjieyjar\n    it: Figi\n    ja: フィジー\n    jv: Fiji\n    ka: ფიჯი\n    kk: Фиджи\n    kn: ಫಿಜಿ\n    ko: 피지\n    ku: Fîjî\n    kw: Fiji\n    la: Viti\n    lb: Fidschi\n    li: Fiji\n    lt: Fidžis\n    lv: Fidži\n    mi: Whītī\n    mk: Фиџи\n    ml: ഫിജി\n    mn: Фижи\n    mr: फिजी\n    ms: Fiji\n    mt: Fiġi\n    my: ဖီဂျီနိုင်ငံ\n    na: Bidji\n    ne: फिजी\n    nl: Fiji\n    \"no\": Fiji\n    nv: Fííjii\n    oc: Fiji\n    or: ଫିଜି\n    os: Фиджи\n    pa: ਫ਼ਿਜੀ\n    pl: Fidżi\n    pt: Fiji\n    qu: Phiyi\n    ro: Fiji\n    ru: Фиджи\n    rw: Fiji\n    sa: फिजी\n    se: Fiži\n    sg: Fidyïi\n    sh: Fidži\n    si: ෆීජි\n    sk: Fidži\n    sl: Fidži\n    sm: Fiti\n    so: Fiji\n    sq: Fixhi\n    sr: Фиџи\n    su: Fiji\n    sv: Fiji\n    sw: Fiji\n    ta: பிஜி\n    te: ఫిజీ\n    tg: Фиҷи\n    th: ประเทศฟิจิ\n    tl: Piyi\n    to: Fisi\n    tr: Fiji\n    tt: Fiji\n    ug: فىجى\n    uk: Фіджі\n    ur: فجی\n    uz: Fiji\n    vi: Fiji\n    vo: Ficiyuäns\n    wo: Fiiji\n    yi: פידזשי\n    yo: Fíjì\n    zh: 斐濟\n    zu: IFiji\n"
  },
  {
    "path": "settings/country-names/fk.yaml",
    "content": "name: \n    default: Falkland Islands\n    af: Falklandeilande\n    ak: Fɔlkman Aeland\n    am: ፎክላንድ ደሴቶች (ኢስላስ ማልቪናስ)\n    ar: جزر الفولكلاند\n    az: Folkland Adaları\n    be: Фалклендскія астравы\n    bg: Фолкландски острови (Малвини)\n    bm: Maluwini Gun\n    bn: ফকল্যান্ড আইল্যান্ড (ইসল্যাস মাসভেনিস)\n    bo: ཕལྐ་ལནྜ་གླིང་ཕྲན།\n    br: Inizi Falkland (Inizi Maloù)\n    bs: Folklandska ostrva (Malvinska ostrva)\n    ca: Illes Malvines\n    cs: Falklandy\n    cy: Ynysoedd y Falklands\n    da: Falklandsøerne\n    de: Falklandinseln\n    dz: ཕལྐ་ལནྜ་གླིང་ཚོམ (ཨིས་ལཱས་མལ་བི་ཎཱས)\n    ee: Falkland ƒudomekpowo (Islas Malvinas) nutome\n    el: Νήσοι Φώκλαντ\n    en: Falkland Islands\n    eo: Falklandoj\n    es: Islas Malvinas\n    et: Falklandi saared\n    eu: Falkland uharteak (Malvina uharteak)\n    fa: جزایر فالکلند\n    ff: Duuɗe Falkland\n    fi: Falklandinsaaret\n    fo: Falklandsoyggjarnar\n    fr: Îles Malouines (Îles Falkland)\n    fy: Falklâneilannen\n    ga: Oileáin Fháclainne\n    gd: Na h-Eileanan Fàclainn\n    gl: Illas Malvinas\n    gu: ફૉકલેન્ડ આઇલેન્ડ્સ\n    gv: Ny Malveenaghyn\n    ha: Tsibiran Falkilan\n    he: איי פוקלנד (מלווינס)\n    hi: फ़ॉकलैंड आइलैंड (इज्लास माल्विनास)\n    hr: Falklandski Otoci\n    hu: Falkland-szigetek\n    id: Kepulauan Falkland\n    is: Falklandseyjar\n    it: Isole Falkland\n    ja: フォークランド諸島 (マルビナス諸島)\n    ka: ფალკლენდის კუნძულები\n    ki: Visiwa vya Falkland\n    kl: Falklandi qeqertaq\n    km: កោះ​ហ្វក់ឡែន (Islas Malvinas)\n    kn: ಫಾಲ್ಕ್‌ಲ್ಯಾಂಡ್ ದ್ವೀಪಗಳು (ಇಸ್ಲಾಸ್ ಮಾಲ್ವಿನಸ್)\n    ko: 포클랜드 제도 (말비나스 군도)\n    ks: فٕلاکلینٛڑ جٔزیٖرٕ\n    ku: Giravên Malvîn\n    la: Insulae Malvinae\n    lb: Falkland Inselen\n    lg: Bizinga by'eFalikalandi\n    ln: Bisanga bya Falkland\n    lo: ຫມູ່ເກາະຟອກແລນ (ອິສລາສ ມາວິລນາສ)\n    lt: Folklando (Malvinų) Salos\n    lv: Folklenda salas\n    mg: Nosy Falkand\n    mk: Фолкландски Острови\n    ml: ഫോക്ൿലൻഡ് ദ്വീപുകൾ (മൽവിനാസ്)\n    mn: Фолклендийн Арлууд\n    mr: फॉकलंड बेटे (इस्लास मालविनास)\n    ms: Kepulauan Falkland (Islas Malvinas)\n    mt: Falkland Islands\n    my: ဖောက်ကလန် ကျွန်းစု\n    nb: Falklandsøyene\n    ne: फक्ल्याण्ड टापुहरू (इज्लास माल्भिनास)\n    nl: Falklandeilanden\n    nn: Falklandsøyane\n    \"no\": Falklandsøyene\n    or: ଫଲ୍କଲ୍ୟାଣ୍ଡ ଦ୍ବୀପପୁଞ୍ଜ\n    pl: Falklandy\n    pt: Ilhas Malvinas\n    rm: Inslas dal Falkland\n    rn: Izinga rya Filikilandi\n    ro: Insulele Falkland\n    ru: Фолклендские острова\n    se: Falklandsullot\n    sg: Âzûâ tî Mälüîni\n    si: ෆෝක්ලන්ත දූපත් (අයිලස් මල්වියනාස්)\n    sk: Falklandy\n    sl: Falklandi\n    sn: Zvitsuwa zveFalklands\n    so: Jaziiradaha Fooklaan\n    sr: Фокландска (Малвинска) Острва\n    sv: Falklandsöarna\n    sw: Visiwa vya Falklandi (Islas Malvinas)\n    ta: ஃபாக்லாந்து தீவுகள் (இஸ்லாஸ் மால்வினஸ்)\n    te: ఫాక్ లేండ్ దీవులు (ఇస్లాస్ మాల్వినాస్)\n    th: หมู่เกาะฟอล์กแลนด์\n    ti: የፎልክላንድ ደሴቶች\n    tl: Kapuluang Falkland (Kapuluang Malvinas)\n    to: ʻOtumotu Fokuleni\n    tr: Falkland Adaları\n    tt: Фолкленд утраулары\n    uk: Фолклендські острови\n    ur: فاکلینڈ آئلینڈز (ازلاس مالوینس)\n    vi: Quần đảo Falkland\n    yo: Orílẹ́ède Etikun Fakalandi\n    zh: 福克兰群岛\n    zu: i-Falkland Islands (i-Islas Malvinas)\n"
  },
  {
    "path": "settings/country-names/fm.yaml",
    "content": "name: \n    default: Micronesia\n    af: Mikronesië\n    ar: ميكرونيسيا\n    be: Мікранэзія\n    br: Mikronezia\n    ca: Micronèsia\n    cs: Mikronésie\n    da: Mikronesien\n    de: Föderierte Staaten von Mikronesien\n    en: Federated States of Micronesia\n    eo: Mikronezio\n    es: Estados Federados de Micronesia\n    et: Mikroneesia\n    fa: میکرونزی\n    fi: Mikronesia\n    fr: États fédérés de Micronésie\n    fy: Mikroneezje\n    ga: An Mhicrinéis\n    gd: Na Meanbh Eileanan\n    he: מיקרונזיה\n    hr: Mikronezija\n    hu: Mikronézia\n    ia: Micronesia\n    id: Mikronesia\n    io: Mikronezia\n    is: Míkrónesía\n    lb: Mikronesien\n    li: Micronesië\n    lt: Mikronezija\n    lv: Mikronēzija\n    mn: Микронези\n    nl: Micronesia\n    \"no\": Mikronesiaføderasjonen\n    oc: Estats Federats de Micronesia\n    pl: Mikronezja\n    ru: Федеративные Штаты Микронезии\n    se: Mikronesia\n    sk: Mikronézia\n    sl: Mikronezija\n    sr: Микронезија\n    sv: Mikronesiens federerade stater\n    ta: மைக்குரோனீசியக் கூட்டு நாடுகள்\n    th: ประเทศไมโครนีเซีย\n    tr: Mikronezya\n    uk: Федеративні Штати Мікронезії\n    vi: Liên bang Micronesia\n    vo: Smala-Seanuäns\n    zh: 密克罗尼西亚 / 密克羅尼西亞\n"
  },
  {
    "path": "settings/country-names/fo.yaml",
    "content": "name: \n    default: Føroyar\n    af: Faroëreilande\n    am: ፋሮ ደሴቶች\n    an: Islas Feroe\n    ar: جزر فارو\n    az: Farer adaları\n    be: Фарэрскія астравы\n    bg: Ферьорски острови\n    bi: Faroe aelan\n    br: Faero\n    bs: Farska ostrva\n    ca: Illes Fèroe\n    ce: Фарерийн гІайренаш\n    cs: Faerské ostrovy\n    cy: Føroyar\n    da: Færøerne\n    de: Färöer\n    dv: ފަރޮއޭ ޖަޒީރާ\n    ee: Faroe Islands\n    el: Νήσοι Φερόες\n    en: Faroe Islands\n    eo: Ferooj\n    es: Islas Feroe\n    et: Fääri saared\n    eu: Faroeak\n    fa: جزایر فارو\n    fi: Färsaaret\n    fo: Føroyar\n    fr: Îles Féroé\n    fy: Faeröer\n    ga: Oileáin Fharó\n    gd: Na h-Eileanan Fàro\n    gl: Illas Feroe\n    gu: ફરો દ્વિપસમૂહ\n    gv: Ellanyn ny Geyrragh\n    he: איי פארו\n    hi: फ़रो द्वीपसमूह\n    hr: Ferojski Otoci\n    hu: Feröer\n    hy: Ֆարերյան կղզիներ\n    ia: Insulas Feroe\n    id: Kepulauan Faroe\n    io: Faero\n    is: Færeyjar\n    it: Fær Øer\n    ja: フェロー諸島\n    jv: Kapuloan Faroe\n    ka: ფარერის კუნძულები\n    kk: Фарер аралдары\n    kl: Savalimmiut\n    ko: 페로 제도\n    ku: Giravên Feroe\n    kv: Фарер діяс\n    kw: Ynysow Faroe\n    la: Faeroae insulae\n    li: Faeröer\n    lt: Farerai\n    lv: Fēru Salas\n    mi: Moutere Faroe\n    mk: Фарски Острови\n    mn: Фарерын арлууд\n    mr: फेरो द्वीपसमूह\n    ms: Kepulauan Faroe\n    mt: Gżejjer Faroe\n    nb: Færøyene\n    ne: फरोइ टापु\n    nl: Faeröer\n    nn: Færøyane\n    \"no\": Færøyene\n    oc: Illas Feròe\n    os: Фареры сакъадæхтæ\n    pl: Wyspy Owcze\n    pt: Ilhas Feroe\n    qu: Pharuy\n    rm: Inslas Feroe\n    ro: Insulele Feroe\n    ru: Фарерские острова\n    rw: Ibirwa bya Farowe\n    se: Fearsullot\n    sh: Farski Otoci\n    si: ෆාරෝ දිවයින්\n    sk: Faerské ostrovy\n    sl: Ferski otoki\n    so: Jasiiradaha Feroe\n    sq: Ishujt Faroe\n    sr: Фарска Острва\n    su: Kapuloan Faroe\n    sv: Färöarna\n    sw: Visiwa vya Faroe\n    ta: பரோயே தீவுகள்\n    tg: Ҷазираҳои Фаро\n    th: หมู่เกาะแฟโร\n    tl: Kapuluang Peroe\n    tr: Faroe Adaları\n    tt: Фарер утраулары\n    uk: Фарерські острови\n    ur: جزائرفارو\n    vi: Quần đảo Faroe\n    wo: Duni Faarow\n    yo: Àwọn Erékùṣù Fàróè\n    zh: 法罗群岛\n"
  },
  {
    "path": "settings/country-names/fr.yaml",
    "content": "name: \n    default: France\n    af: Frankryk\n    ak: Frɛnkyeman\n    am: ፈረንሣይ\n    an: Francia\n    ar: فرنسا\n    as: ফ্ৰান্স\n    ay: Phransiya\n    az: Fransa\n    ba: Франция\n    be: Францыя\n    bg: Франция\n    bi: Franis\n    bm: France\n    bn: ফ্রান্স\n    bo: ཧྥ་རན་སི།\n    br: Bro-C'hall\n    bs: Francuska\n    ca: França\n    ce: Франци\n    co: Francia\n    cs: Francie\n    cu: Франкїꙗ\n    cv: Франци\n    cy: Ffrainc\n    da: Frankrig\n    de: Frankreich\n    dv: ފަރަންސޭސިވިލާތް\n    dz: ཕརཱནསི་\n    ee: France\n    el: Γαλλία\n    en: France\n    eo: Francio\n    es: Francia\n    et: Prantsusmaa\n    eu: Frantzia\n    fa: فرانسه\n    ff: Faransi\n    fi: Ranska\n    fo: Frakland\n    fr: France\n    fy: Frankryk\n    ga: An Fhrainc\n    gd: An Fhraing\n    gl: Francia\n    gn: Hyãsia\n    gu: ફ્રાન્સ\n    gv: Yn Rank\n    ha: Faransa\n    he: צרפת\n    hi: फ़्रान्स\n    hr: Francuska\n    ht: Frans\n    hu: Franciaország\n    hy: Ֆրանսիա\n    ia: Francia\n    id: Perancis\n    ie: Francia\n    io: Francia\n    is: Frakkland\n    it: Francia\n    ja: フランス\n    jv: Prancis\n    ka: საფრანგეთი\n    kg: Fwalansa\n    ki: Ubaranja\n    kk: Франция\n    kl: Frankrigi\n    km: បារាំង\n    kn: ಫ್ರಾನ್ಸ್\n    ko: 프랑스\n    ks: فرٛانس\n    ku: Fransa\n    kv: Франция\n    kw: Pow Frynk\n    ky: Франция\n    la: Francia\n    lb: Frankräich\n    lg: Bufalansa\n    li: Frankriek\n    ln: Falansia\n    lo: ປະເທດຝະລັ່ງ\n    lt: Prancūzija\n    lv: Francija\n    mg: Frantsa\n    mi: Wīwī\n    mk: Франција\n    ml: ഫ്രാൻസ്\n    mn: Франц\n    mo: Франца\n    mr: फ्रान्स\n    ms: Perancis\n    mt: Franza\n    my: ပြင်သစ်နိုင်ငံ\n    na: Prant\n    ne: फ्रान्स\n    nl: Frankrijk\n    \"no\": Frankrike\n    nv: Dáághahii Dineʼé Bikéyah\n    oc: França\n    or: ଫ୍ରାନ୍ସ\n    os: Франц\n    pa: ਫ੍ਰਾਂਸ\n    pl: Francja\n    ps: فرانسه\n    pt: França\n    qu: Ransiya\n    rm: Frantscha\n    rn: Francia\n    ro: Franța\n    ru: Франция\n    rw: Ubufaransa\n    sa: फ्रान्सदेशः\n    sc: Frantza\n    se: Frankriika\n    sg: Farânzi\n    sh: Francuska\n    si: ප්රංශය\n    sk: Francúzsko\n    sl: Francija\n    sm: Farani\n    so: Faransiiska\n    sq: Franca\n    sr: Француска\n    ss: IFulansi\n    st: Fora\n    su: Perancis\n    sv: Frankrike\n    sw: Ufaransa\n    ta: பிரான்சு\n    te: ఫ్రాన్స్\n    tg: Фаронса\n    th: ประเทศฝรั่งเศส\n    ti: ፈረንሳይ\n    tk: Fransiýa\n    tl: Pransiya\n    to: Falanisē\n    tr: Fransa\n    tt: Франция\n    ty: Farāni\n    ug: فرانسىيە\n    uk: Франція\n    ur: فرانس\n    uz: Fransiya\n    vi: Pháp\n    vo: Fransän\n    wa: France\n    wo: Faraas\n    yi: פראנקרייך\n    yo: Fránsì\n    za: Fazgoz\n    zh: 法國/法国\n    zu: IFulansi\n"
  },
  {
    "path": "settings/country-names/ga.yaml",
    "content": "name: \n    default: Gabon\n    af: Gaboen\n    am: ጋቦን\n    an: Gabón\n    ar: الغابون\n    az: Qabon\n    ba: Габон\n    be: Габон\n    bg: Габон\n    bm: Gabon\n    bn: গাবন\n    bo: གེ་བོན།\n    br: Gabon\n    bs: Gabon\n    ca: Gabon\n    ce: Габон\n    cs: Gabon\n    cv: Габон\n    cy: Gabon\n    da: Gabon\n    de: Gabun\n    dv: ގެބޯން\n    dz: གྷེ་བྷོན\n    el: Γκαμπόν\n    en: Gabon\n    eo: Gabono\n    es: Gabón\n    et: Gabon\n    eu: Gabon\n    fa: گابن\n    ff: Gabon\n    fi: Gabon\n    fr: Gabon\n    fy: Gabon\n    ga: An Ghabúin\n    gd: Gabon\n    gl: Gabón\n    gv: Gabon\n    he: גבון\n    hi: गबॉन\n    hr: Gabon\n    ht: Gabon\n    hu: Gabon\n    hy: Գաբոն\n    ia: Gabon\n    id: Gabon\n    ie: Gabon\n    io: Gabon\n    is: Gabon\n    it: Gabon\n    ja: ガボン\n    jv: Gabon\n    ka: გაბონი\n    kg: Ngabu\n    ki: Gabon\n    kk: Габон\n    kn: ಗಬೊನ್\n    ko: 가봉\n    ks: گیبان\n    ku: Gabon\n    kw: Gabon\n    la: Gabonia\n    lb: Gabun\n    li: Gabon\n    ln: Gabɔ́\n    lt: Gabonas\n    lv: Gabona\n    mi: Kāpona\n    mk: Габон\n    ml: ഗാബോൺ\n    mn: Габон\n    mr: गॅबन\n    ms: Gabon\n    mt: Gabon\n    my: ဂါဘွန်နိုင်ငံ\n    na: Gabun\n    ne: गाबोन\n    nl: Gabon\n    \"no\": Gabon\n    nv: Gabǫ́ǫ́\n    oc: Gabon\n    or: ଗାବୋନ\n    os: Габон\n    pa: ਗਬਾਨ\n    pl: Gabon\n    ps: ګابن\n    pt: Gabão\n    qu: Gabun\n    rm: Gabun\n    ro: Gabon\n    ru: Габон\n    rw: Gabon\n    sa: गाबोन\n    sc: Gabòn\n    se: Gabon\n    sg: Gaböon\n    sh: Gabon\n    si: ගැබොන්\n    sk: Gabon\n    sl: Gabon\n    sn: Gabon\n    so: Gabon\n    sq: Gaboni\n    sr: Габон\n    ss: IGabhoni\n    st: Gabon\n    su: Gabon\n    sv: Gabon\n    sw: Gabon\n    ta: காபோன்\n    te: గబాన్\n    tg: Габон\n    th: ประเทศกาบอง\n    tk: Gabon\n    tl: Gabon\n    tr: Gabon\n    ts: Gaboni\n    tt: Габон\n    ug: گابون\n    uk: Габон\n    ur: گیبون\n    uz: Gabon\n    vi: Gabon\n    vo: Gabunän\n    wo: Gaboŋ\n    yi: גאבאן\n    yo: Gàbọ̀n\n    zh: 加蓬\n    zu: IGaboni\n"
  },
  {
    "path": "settings/country-names/gb.yaml",
    "content": "short_name:\n    default: UK\nname:\n    default: United Kingdom\n    ab: Британиа Ду\n    af: Verenigde Koninkryk\n    ak: United Kingdom\n    am: ዩናይትድ ኪንግደም\n    an: Reino Unito\n    ar: المملكة المتحدة\n    as: যুক্তৰাজ্য\n    av: Кӏудабиритан\n    az: Böyük Britaniya\n    ba: Бөйөк Британия\n    be: Вялікабрытанія\n    bg: Обединено кралство Великобритания и Северна Ирландия\n    bh: यूनाइटेड किंगडम\n    bi: Unaeted Kingdom\n    bn: যুক্তরাজ্য\n    bo: དབྱིན་ཇི་མཉམ་འབྲེལ།\n    br: Rouantelezh-Unanet\n    bs: Ujedinjeno Kraljevstvo Velike Britanije i Sjeverne Irske\n    ca: Regne Unit\n    ce: Йоккха Британи\n    ch: Reinu Unidu\n    co: Regnu Unitu\n    cs: Spojené království\n    cu: Вєлика Британїꙗ\n    cv: Аслă Британи\n    cy: Deyrnas Unedig\n    da: Storbritannien\n    de: Vereinigtes Königreich\n    dv: ޔުނައިޓެޑް ކިންގްޑަމް\n    dz: ཡུ་ནའི་ཊེཊ་ཀིང་ཌམ\n    ee: United Kingdom\n    el: Ηνωμένο Βασίλειο\n    en: United Kingdom\n    eo: Unuiĝinta Reĝlando\n    es: Reino Unido\n    et: Suurbritannia\n    eu: Erresuma Batua\n    fa: بریتانیا\n    ff: Biritaani-Mawndi\n    fi: Yhdistynyt kuningaskunta\n    fo: Stóra Bretland\n    fr: Royaume-Uni\n    fy: Feriene Keninkryk\n    ga: An Ríocht Aontaithe\n    gd: An Rìoghachd Aonaichte\n    gl: Reino Unido\n    gn: Tavetã Joaju\n    gu: યુનાઇટેડ કિંગડમ\n    gv: Reeriaght Unnaneysit\n    ha: Birtaniya\n    he: הממלכה המאוחדת\n    hi: यूनाइटेड किंगडम\n    hr: Ujedinjeno Kraljevstvo\n    ht: Wayòm Ini\n    hu: Egyesült Királyság\n    hy: Միացյալ Թագավորություն\n    ia: Regno Unite\n    id: Britania Raya\n    ie: Reyatu Unit\n    ig: Obodoézè Nà Ofú\n    io: Unionita Rejio\n    is: Bretland\n    it: Regno Unito\n    iu: ᑐᓗᐃᑦ ᓄᓈᑦ\n    ja: イギリス\n    jv: Britania Raya\n    ka: გაერთიანებული სამეფო\n    kg: Royaume-Uni\n    kk: Ұлыбритания\n    kl: Tuluit Nunaat\n    km: រាជាណាចក្ររួម\n    kn: ಯುನೈಟೆಡ್ ಕಿಂಗ್‌ಡಂ\n    ko: 영국\n    ku: Keyaniya Yekbûyî\n    kv: Ыджыд Британия\n    kw: Ruwvaneth Unys\n    ky: Улуу Британия жана Түндүк Ирландия\n    la: Britanniarum Regnum\n    lb: Groussbritannien an Nordirland\n    li: Vereineg Keuninkriek\n    ln: Ingɛlɛ́tɛlɛ\n    lo: ສະຫະຣາຊອານາຈັກ\n    lt: Jungtinė Karalystė\n    lv: Apvienotā Karaliste\n    mg: Fanjakana Mitambatra\n    mi: Kīngitanga Kotahi\n    mk: Обединето Кралство\n    ml: യുണൈറ്റഡ് കിങ്ഡം\n    mn: Их Британи\n    mr: युनायटेड किंग्डम\n    ms: United Kingdom\n    mt: Renju Unit\n    my: ယူနိုက်တက်ကင်းဒမ်းနိုင်ငံ\n    na: Ingerand\n    ne: संयुक्त अधिराज्य\n    nl: Verenigd Koninkrijk\n    \"no\": Storbritannia\n    nv: Tótaʼ Dineʼé Bikéyah\n    oc: Reialme Unit\n    om: Yunaayitid Kingidem\n    or: ଯୁକ୍ତରାଜ୍ୟ\n    os: Стыр Британи\n    pa: ਸੰਯੁਕਤ ਬਾਦਸ਼ਾਹੀ\n    pl: Wielka Brytania\n    ps: بريتانيا\n    pt: Reino Unido\n    qu: Hukllachasqa Qhapaq Suyu\n    rm: Reginavel Unì\n    ro: Regatul Unit al Marii Britanii și al Irlandei de Nord\n    ru: Великобритания\n    rw: Ubwongereza\n    sa: संयुक्त अधिराज्य\n    sc: Rennu Auniadu\n    sd: گڏيل بادشاھت\n    se: Ovttastuvvan gonagasriika\n    sh: Ujedinjeno Kraljevstvo\n    si: එක්සත් රාජධානිය\n    sk: Spojené kráľovstvo\n    sl: Združeno kraljestvo Velike Britanije in Severne Irske\n    sm: Peretānia\n    sn: United Kingdom\n    so: Midowga boqortooyada Britan\n    sq: Mbretëria e Bashkuar e Britanisë dhe Irlandës së Veriut\n    sr: Уједињено Краљевство\n    ss: United Kingdom\n    su: Britania\n    sv: Storbritannien\n    sw: Ufalme wa Muungano\n    ta: ஐக்கிய இராச்சியம்\n    te: యునైటెడ్ కింగ్‌డమ్\n    tg: Подшоҳии Муттаҳида\n    th: สหราชอาณาจักร\n    tk: Birleşen Patyşalyk\n    tl: Nagkakaisang Kaharian\n    to: Pilitānia\n    tr: Birleşik Krallık\n    tt: Бөекбритания\n    tw: United Kingdom\n    ty: Paratāne\n    ug: بۈيۈك بېرىتانىيە\n    uk: Велика Британія\n    ur: برطانیہ\n    uz: Birlashgan Qirollik\n    vi: Vương quốc Anh\n    vo: Regän Pebalöl\n    wa: Rweyåme-Uni\n    wo: Nguur-Yu-Bennoo\n    yi: פאראייניגטע קעניגרייך\n    yo: Ilẹ̀ọba Aṣọ̀kan\n    za: Yinghgoz\n    zh: 英国/英國\n    zu: Umbuso Ohlangeneyo\n"
  },
  {
    "path": "settings/country-names/gd.yaml",
    "content": "name: \n    default: Grenada\n    ar: غرينادا\n    be: Грэнада\n    br: Grenada\n    cs: Grenada\n    da: Grenada\n    de: Grenada\n    el: Γρενάδα\n    en: Grenada\n    eo: Grenado\n    es: Granada\n    fa: گرنادا\n    fi: Grenada\n    fr: Grenade\n    fy: Grenada\n    ga: Greanáda\n    gd: Greanada\n    he: גרנדה\n    hr: Grenada\n    hu: Grenada\n    is: Grenada\n    it: Grenada\n    ja: グレナダ\n    la: Granata\n    lb: Granada\n    lv: Grenāda\n    mn: Гренада\n    nl: Grenada\n    \"no\": Grenada\n    pl: Granada\n    pt: Granada\n    ru: Гренада\n    se: Grenada\n    sl: Grenada\n    sv: Grenada\n    ta: கிரெனடா\n    th: ประเทศเกรเนดา\n    uk: Гренада\n    vo: Grenadeän\n    zh: 格林纳达\n"
  },
  {
    "path": "settings/country-names/ge.yaml",
    "content": "name: \n    default: საქართველო\n    ab: Қырҭтәыла\n    af: Georgië\n    am: ጂዮርጂያ\n    an: Cheorchia\n    ar: جورجيا\n    av: Гуржи\n    az: Gürcüstan\n    be: Грузія\n    bg: Грузия\n    bn: জর্জিয়া (রাষ্ট্র)\n    bo: འཇོར་ཇི་ཡ། (རྒྱལ་ཁབ།)\n    br: Jorjia (bro)\n    bs: Gruzija\n    ca: Geòrgia\n    ce: Гуьржийчоь\n    cs: Gruzie\n    cu: Гєѡргїꙗ\n    cv: Грузи\n    cy: Georgia\n    da: Georgien\n    de: Georgien\n    dv: ޖޯޖިޔާ (ޤައުމު)\n    dz: ཇཽ་ཇཱ\n    ee: Georgia\n    el: Γεωργία\n    en: Georgia\n    eo: Kartvelio\n    es: Georgia\n    et: Gruusia\n    eu: Georgia\n    fa: گرجستان\n    fi: Georgia\n    fo: Georgia (land)\n    fr: Géorgie\n    fy: Geörgje\n    ga: An tSeoirsia\n    gd: A' Chairtbheil\n    gl: Xeorxia - საქართველო\n    gu: જ્યોર્જીયા (દેશ)\n    gv: Yn Çhorshey\n    he: גאורגיה\n    hi: जॉर्जिया\n    hr: Gruzija\n    ht: Jeoji\n    hu: Grúzia\n    hy: Վրաստան\n    ia: Georgia\n    id: Georgia\n    ie: Georgia\n    io: Gruzia\n    is: Georgía\n    it: Georgia\n    ja: グルジア\n    jv: Georgia\n    ka: საქართველო\n    kk: Грузия\n    kn: ಜಾರ್ಜಿಯ\n    ko: 조지아 (국가)\n    ku: Gurcistan\n    kv: Грузия\n    kw: Pow Grouzi\n    ky: Грузия\n    la: Georgia\n    lb: Georgien\n    li: Georgië\n    lt: Gruzija\n    lv: Gruzija\n    mi: Hōria\n    mk: Грузија\n    ml: ജോർജ്ജിയ\n    mn: Гүрж\n    mr: जॉर्जिया\n    ms: Georgia\n    mt: Ġeorġja\n    my: ဂျော်ဂျီယာနိုင်ငံ\n    na: Djiordjiya\n    ne: जर्जिया (देश)\n    nl: Georgië\n    \"no\": Georgia\n    nv: Jóojah (Kéyah)\n    oc: Georgia (Caucàs)\n    or: ଜର୍ଜିଆ\n    os: Гуырдзыстон\n    pl: Gruzja\n    ps: ګرجستان\n    pt: Geórgia\n    qu: Kartulsuyu\n    ro: Georgia\n    ru: Грузия\n    rw: Geworugiya\n    sc: Georgia\n    se: Georgia\n    sh: Gruzija\n    si: ජෝර්ජියා (රට)\n    sk: Gruzínsko\n    sl: Gruzija\n    so: Joorjiya\n    sq: Gjeorgjia\n    sr: Грузија\n    ss: IJojiya\n    su: Géorgia\n    sv: Georgien\n    sw: Georgia (nchi)\n    ta: சியார்சியா (நாடு)\n    te: జార్జియా (దేశం)\n    tg: Гурҷистон\n    th: ประเทศจอร์เจีย\n    tk: Gruziýa\n    tl: Heorhiya\n    tr: Gürcistan\n    tt: Гөрҗистан\n    ug: گرۇزىيە\n    uk: Грузія\n    ur: جارجیا\n    uz: Gurjiston\n    vi: Gruzia\n    vo: Grusiyän\n    wo: Jeoorji\n    yi: גרוזיע\n    yo: Georgia\n    zh: 格鲁吉亚\n"
  },
  {
    "path": "settings/country-names/gg.yaml",
    "content": "name: \n    default: Guernsey\n    af: Guernsey\n    an: Guernési\n    ar: غيرنزي\n    az: Gernsi\n    be: Гернсi\n    bg: Гърнси\n    br: Gwernenez\n    bs: Guernsey\n    ca: Guernsey\n    cs: Guernsey\n    cy: Ynys y Garn\n    da: Guernsey\n    de: Guernsey\n    dv: ގުއާންސޭ\n    el: Γουερνισία\n    en: Guernsey\n    eo: Gernezejo\n    es: Guernsey\n    et: Guernsey\n    eu: Guernesey\n    fa: گرنزی\n    fi: Guernsey\n    fr: Guernesey\n    fy: Guernsey\n    ga: Geansaí\n    gd: Guernsey\n    gl: Guernsey\n    gv: Guernsey\n    he: גרנזי\n    hi: ग्वेर्नसे\n    hr: Guernsey\n    hu: Guernsey\n    hy: Գերնսի\n    id: Guernsey\n    io: Guernsey\n    is: Guernsey\n    it: Guernsey\n    ja: ガーンジー\n    jv: Guernsey\n    ka: გერნზი\n    kn: ಗುರ್ನ್‌ಸಿ\n    ko: 건지 섬\n    kw: Gwernenys\n    la: Lisia\n    lb: Guernsey\n    li: Guernsey\n    lt: Gernsis\n    lv: Gērnsija\n    mi: Kōnihi\n    mk: Гернзи\n    mn: Гернси\n    mr: गर्न्सी\n    ms: Guernsey\n    ne: गुर्न्जी\n    nl: Guernsey\n    \"no\": Guernsey\n    oc: Guernesey\n    os: Гернси\n    pa: ਗਰਨਜ਼ੇ\n    pl: Guernsey\n    pt: Guernsey\n    ro: Guernsey\n    ru: Гернси\n    rw: Gwasi\n    sh: Guernsey\n    sk: Guernsey\n    sl: Guernsey\n    sq: Guernsey\n    sr: Гернзи\n    su: Guernsey\n    sv: Guernsey\n    sw: Guernsey\n    ta: குயெர்ன்சி\n    tg: Гернси\n    th: เกิร์นซีย์\n    tl: Gernesey\n    tr: Guernsey\n    tt: Гернси\n    uk: Гернсі\n    ur: گرنزی\n    vi: Guernsey\n    yo: Guernsey\n    zh: 根西島\n"
  },
  {
    "path": "settings/country-names/gh.yaml",
    "content": "name: \n    default: Ghana\n    af: Ghana\n    ak: Ghana\n    am: ጋና\n    an: Ghana\n    ar: غانا\n    az: Qana\n    ba: Гана\n    be: Гана\n    bg: Гана\n    bm: Gana\n    bn: ঘানা\n    bo: ཀ་ན།\n    br: Ghana\n    bs: Gana\n    ca: Ghana\n    ce: Гана\n    co: Ghana\n    cs: Ghana\n    cv: Гана\n    cy: Ghana\n    da: Ghana\n    de: Ghana\n    dv: ގާނާ\n    ee: Ghana\n    el: Γκάνα\n    en: Ghana\n    eo: Ganao\n    es: Ghana\n    et: Ghana\n    eu: Ghana\n    fa: غنا\n    ff: Gana\n    fi: Ghana\n    fo: Gana\n    fr: Ghana\n    fy: Gana\n    ga: Gána\n    gd: Gàna\n    gl: Gana\n    gu: ઘાના\n    gv: Yn Ghaney\n    he: גאנה\n    hi: घाना\n    hr: Gana\n    ht: Gana\n    hu: Ghána\n    hy: Գանա\n    ia: Ghana\n    id: Ghana\n    ie: Ghana\n    ig: Ghana\n    io: Ghana\n    is: Gana\n    it: Ghana\n    ja: ガーナ\n    jv: Ghana\n    ka: განა\n    kg: Gana\n    ki: Ghana\n    kk: Гана\n    kn: ಘಾನಾ\n    ko: 가나\n    ku: Gana\n    kw: Ghana\n    ky: Гана\n    la: Gana\n    lb: Ghana\n    li: Ghana\n    ln: Ghana\n    lt: Gana\n    lv: Gana\n    mg: Ghana\n    mi: Kāna\n    mk: Гана\n    ml: ഘാന\n    mn: Гана\n    mr: घाना\n    ms: Ghana\n    mt: Gana\n    my: ဂါနာနိုင်ငံ\n    na: Gana\n    ne: घाना\n    nl: Ghana\n    \"no\": Ghana\n    nv: Gáana\n    oc: Ghana\n    or: ଘାନା\n    os: Ганæ\n    pa: ਘਾਨਾ\n    pl: Ghana\n    ps: ګانا\n    pt: Gana\n    qu: Gana\n    rm: Ghana\n    ro: Ghana\n    ru: Гана\n    rw: Gana\n    sa: घाना\n    sc: Ghana\n    se: Ghana\n    sg: Ganäa\n    sh: Gana\n    sk: Ghana\n    sl: Gana\n    sn: Ghana\n    so: Gaana\n    sq: Gana\n    sr: Гана\n    ss: IGana\n    su: Ghana\n    sv: Ghana\n    sw: Ghana\n    ta: கானா\n    te: ఘనా\n    tg: Гана\n    th: ประเทศกานา\n    tk: Gana\n    tl: Ghana\n    tr: Gana\n    ts: Ghana\n    tt: Гана\n    tw: Ghana\n    ug: گانا جۇمھۇرىيىتى\n    uk: Гана\n    ur: گھانا\n    uz: Gana\n    vi: Ghana\n    vo: Ganän\n    wa: Gana\n    wo: Gana\n    yi: גהאנע\n    yo: Ghánà\n    zh: 加纳\n    zu: IGana\n"
  },
  {
    "path": "settings/country-names/gi.yaml",
    "content": "name: \n    default: Gibraltar\n    af: Gibraltar\n    an: Chibraltar\n    ar: جبل طارق\n    az: Cəbəli-Tariq\n    ba: Гибралтар\n    be: Гібралтар\n    bg: Гибралтар\n    bn: জিব্রাল্টার\n    br: Jibraltar\n    bs: Gibraltar\n    ca: Gibraltar\n    cs: Gibraltar\n    cv: Гибралтар\n    cy: Gibraltar\n    da: Gibraltar\n    de: Gibraltar\n    dv: ޖަބަލްޠާރިޤު\n    el: Γιβραλτάρ\n    en: Gibraltar\n    eo: Ĝibraltaro\n    es: Gibraltar\n    et: Gibraltar\n    eu: Gibraltar\n    fa: جبل طارق\n    fi: Gibraltar\n    fo: Gibraltar\n    fr: Gibraltar\n    fy: Gibraltar\n    ga: Giobráltar\n    gd: Giobraltair\n    gl: Xibraltar\n    gv: Gibraaltar\n    he: גיברלטר\n    hi: जिब्राल्टर\n    hr: Gibraltar\n    hu: Gibraltár\n    hy: Ջիբրալթար\n    ia: Gibraltar\n    id: Gibraltar\n    ie: Gibraltar\n    io: Gibraltar\n    is: Gíbraltar\n    it: Gibilterra\n    ja: ジブラルタル\n    jv: Gibraltar\n    ka: გიბრალტარი\n    kk: Гибралтар\n    ko: 지브롤터\n    ku: Cîbraltar\n    kw: Jibraltar\n    la: Gibraltar\n    lb: Gibraltar\n    li: Gibraltar\n    lt: Gibraltaras\n    lv: Gibraltārs\n    mi: Kāmaka\n    mk: Гибралтар\n    mn: Гибралтар\n    mr: जिब्राल्टर\n    ms: Gibraltar\n    my: ဂျီဘရော်လ်တာ\n    ne: गिब्राल्टार\n    nl: Gibraltar\n    \"no\": Gibraltar\n    oc: Gibartar\n    or: ଜିବ୍ରାଲେଟର\n    os: Гибралтар\n    pa: ਜਿਬਰਾਲਟਰ\n    pl: Gibraltar\n    pt: Gibraltar\n    ro: Gibraltar\n    ru: Гибралтар\n    rw: Giburalitari\n    sh: Gibraltar\n    sk: Gibraltár\n    sl: Gibraltar\n    so: Jibraltaar\n    sq: Gjibraltari\n    sr: Гибралтар\n    su: Gibraltar\n    sv: Gibraltar\n    sw: Gibraltar\n    ta: ஜிப்ரால்ட்டர்\n    tg: Гибралтар\n    th: ยิบรอลตาร์\n    tl: Hibraltar\n    tr: Cebelitarık\n    tt: Гибралтар\n    uk: Гібралтар\n    ur: جبل الطارق\n    vi: Gibraltar\n    wa: Djibraltar\n    wo: Jibraltaar\n    yi: גיבראלטאר\n    yo: Gibraltar\n    zh: 直布罗陀\n"
  },
  {
    "path": "settings/country-names/gl.yaml",
    "content": "name: \n    default: Kalaallit Nunaat\n    af: Groenland\n    am: ግሪንላንድ\n    an: Gronlandia\n    ar: غرينلاند\n    az: Qrenlandiya\n    be: Грэнландыя\n    bg: Гренландия\n    bn: গ্রিনল্যান্ড\n    bo: གེ་རེན་ལ\n    br: Greunland\n    bs: Grenland\n    ca: Grenlàndia\n    cs: Grónsko\n    cv: Гренланди\n    cy: Yr Ynys Las\n    da: Grønland\n    de: Grönland\n    dv: ގުރީންލޭންޑު\n    el: Γροιλανδία\n    en: Greenland\n    eo: Gronlando\n    es: Groenlandia\n    et: Gröönimaa\n    eu: Groenlandia\n    fa: گرینلند\n    fi: Grönlanti\n    fo: Grønland\n    fr: Groenland\n    fy: Grienlân\n    ga: An Ghraonlainn\n    gd: A' Ghraonlainn\n    gl: Groenlandia\n    gn: Kyoẽlándia\n    gv: Greenlynn\n    he: גרינלנד\n    hi: ग्रीनलैण्ड\n    hr: Grenland\n    hu: Grönland\n    hy: Գրենլանդիա\n    ia: Groenlandia\n    id: Greenland\n    ie: Grenland\n    io: Grenlando\n    is: Grænland\n    it: Groenlandia\n    iu: ᐊᑯᑭᑦᑐᑦ\n    ja: グリーンランド\n    jv: Greenland\n    ka: გრენლანდია\n    kk: Гренландия\n    kl: Kalaallit Nunaat\n    kn: ಗ್ರೀನ್‍ಲ್ಯಾಂಡ್\n    ko: 그린란드\n    ku: Grînlenda\n    kv: Гренландия\n    kw: Greunland\n    la: Groenlandia\n    lb: Grönland\n    li: Greunland\n    ln: Groenlandi\n    lt: Grenlandija\n    lv: Grenlande\n    mg: Groenlanda\n    mi: Greenland\n    mk: Гренланд\n    ml: ഗ്രീൻലാൻഡ്\n    mn: Гренланд\n    mr: ग्रीनलँड\n    ms: Greenland\n    my: ဂရင်းလန်ကျွန်း\n    ne: ग्रीनल्याण्ड\n    nl: Groenland\n    \"no\": Grønland\n    nv: Haʼaʼaahjí Hakʼaz Dineʼé Bikéyah\n    oc: Groenlàndia\n    or: ଗ୍ରୀନଲାଣ୍ଡ\n    os: Гренланди\n    pa: ਗਰੀਨਲੈਂਡ\n    pl: Grenlandia\n    pt: Gronelândia\n    qu: Kalalit Nunat\n    ro: Groenlanda\n    ru: Гренландия\n    rw: Goronulande\n    se: Kalaallit Nunaat\n    sh: Grenland\n    sk: Grónsko\n    sl: Grenlandija\n    so: Griinland\n    sq: Groenlanda\n    sr: Гренланд\n    su: Lemah Héjo\n    sv: Grönland\n    sw: Greenland\n    ta: கிறீன்லாந்து\n    te: గ్రీన్‌లాండ్\n    tg: Гренландия\n    th: กรีนแลนด์\n    tl: Lupanlunti\n    tr: Grönland\n    tt: Гренландия\n    ug: گرېنلاندىيە\n    uk: Ґренландія\n    ur: گرین لینڈ\n    vi: Greenland\n    vo: Gröneän\n    wo: Groenlaand\n    yi: גרינלאנד\n    yo: Grínlándì\n    zh: 格陵兰\n"
  },
  {
    "path": "settings/country-names/gm.yaml",
    "content": "name: \n    default: Gambia\n    af: Gambië\n    am: ጋምቢያ\n    an: Gambia\n    ar: غامبيا\n    az: Qambiya\n    ba: Гамбия\n    be: Гамбія\n    bg: Гамбия\n    bm: Gambia\n    bn: গাম্বিয়া\n    bo: གེམ་བྷི་ཡ།\n    br: Gambia\n    bs: Gambija\n    ca: Gàmbia\n    ce: Гамби\n    cs: Gambie\n    cv: Гамби\n    cy: Y Gambia\n    da: Gambia\n    de: Gambia\n    dv: ގެމްބިއާ\n    dz: གྷེམ་བི་ཡ\n    ee: Gambia\n    el: Γκάμπια\n    en: The Gambia\n    eo: Gambio\n    es: Gambia\n    et: Gambia\n    eu: Gambia\n    fa: گامبیا\n    ff: Gammbi\n    fi: Gambia\n    fo: Gambia\n    fr: Gambie\n    fy: Gambia\n    ga: An Ghaimbia\n    gd: A' Ghaimbia\n    gl: Gambia\n    gv: Yn Ghambia\n    he: גמביה\n    hi: गाम्बिया\n    hr: Gambija\n    ht: Ganbi\n    hu: Gambia\n    hy: Գամբիա\n    ia: Gambia\n    id: Gambia\n    ie: The Gambia\n    io: Gambia\n    is: Gambía\n    it: Gambia\n    ja: ガンビア\n    jv: Gambia\n    ka: გამბია\n    kg: Gambia\n    ki: Gambia\n    kk: Гамбия\n    ko: 감비아\n    ku: Gambiya\n    kw: Gambi\n    ky: Гамбия\n    la: Gambia\n    lb: Gambia\n    li: Gambia\n    ln: Gambi\n    lt: Gambija\n    lv: Gambija\n    mk: Гамбија\n    ml: ഗാംബിയ\n    mn: Гамби\n    mr: गांबिया\n    ms: Gambia\n    mt: Gambja\n    my: ဂမ်ဘီယာနိုင်ငံ\n    na: Gambiya\n    ne: गाम्बिया\n    nl: Gambia\n    \"no\": Gambia\n    nv: Géémbiya\n    oc: Gàmbia\n    or: ଗାମ୍ବିଆ\n    os: Гамби\n    pa: ਗਾਂਬੀਆ\n    pl: Gambia\n    ps: ګامبيا\n    pt: Gâmbia\n    qu: Gambya\n    rm: Gambia\n    ro: Gambia\n    ru: Гамбия\n    rw: Gambiya\n    sa: गाम्बिया\n    sc: Gàmbia\n    sd: گيمبيا\n    se: Gambia\n    sg: Gambïi\n    sh: Gambija\n    sk: Gambia\n    sl: Gambija\n    sn: Gambia\n    so: Gambia\n    sq: Gambia\n    sr: Гамбија\n    ss: IGambiya\n    st: Gambia\n    su: Gambia\n    sv: Gambia\n    sw: Gambia\n    ta: காம்பியா\n    te: గాంబియా\n    tg: Гамбия\n    th: ประเทศแกมเบีย\n    tk: Gambiýa\n    tl: Ang Gambiya\n    tr: Gambiya\n    ts: Gambiya\n    tt: Гамбия\n    ug: گامبىيە\n    uk: Гамбія\n    ur: گیمبیا\n    uz: Gambia\n    vi: Gambia\n    vo: Gambiyän\n    wo: Gàmbi\n    yi: די גאמביע\n    yo: Gámbíà\n    zh: 冈比亚\n    zu: IGambia\n"
  },
  {
    "path": "settings/country-names/gn.yaml",
    "content": "name: \n    default: Guinée\n    af: Guinee\n    am: ጊኔ\n    an: Guinea\n    ar: غينيا\n    az: Qvineya\n    ba: Гвинея\n    be: Гвінея\n    bg: Гвинея\n    bm: Gine\n    bn: গিনি\n    bo: གི་ནེ།\n    br: Ginea\n    bs: Gvineja\n    ca: República de Guinea\n    ce: Гвине\n    cs: Guinea\n    cv: Гвиней\n    cy: Guinée\n    da: Guinea\n    de: Guinea\n    dv: ގީނިއާ\n    ee: Guinea\n    el: Γουινέα\n    en: Guinea\n    eo: Gvineo\n    es: Guinea\n    et: Guinea\n    eu: Ginea\n    fa: گینه\n    ff: Gine\n    fi: Guinea\n    fo: Guinea\n    fr: Guinée\n    fy: Guinee\n    ga: An Ghuine\n    gd: Gini\n    gl: Guinea\n    gv: Yn Ghuinea\n    ha: Gine\n    he: גינאה\n    hi: गिनी\n    hr: Gvineja\n    ht: Gine\n    hu: Guinea\n    hy: Գվինեա\n    ia: Guinea\n    id: Guinea\n    ie: Guinea\n    io: Guinea\n    is: Gínea\n    it: Guinea\n    ja: ギニア\n    jv: Guinea\n    ka: გვინეა\n    kg: Ginea\n    kk: Гвинея\n    ko: 기니\n    ku: Gîne\n    kw: Gyni\n    ky: Гвинея\n    la: Guinea\n    lb: Guinea\n    li: Guinee\n    ln: Gine-Konakry\n    lt: Gvinėja\n    lv: Gvineja\n    mi: Kini\n    mk: Гвинеја\n    ml: ഗിനി\n    mn: Гвиней\n    mr: गिनी\n    ms: Guinea\n    my: ဂီနီနိုင်ငံ\n    na: Gini\n    ne: गिनी\n    nl: Guinee\n    \"no\": Guinea\n    nv: Gíní\n    oc: Guinèa\n    or: ଗିନି\n    os: Гвиней\n    pa: ਗਿਨੀ\n    pl: Gwinea\n    pt: Guiné\n    qu: Khiniya\n    ro: Guineea\n    ru: Гвинея\n    rw: Gineya\n    sa: गिनी\n    sc: Guinea\n    se: Guinea\n    sg: Ginëe\n    sh: Gvineja\n    sk: Guinea\n    sl: Gvineja\n    sm: Guinea\n    sn: Guinea\n    so: Guinea\n    sq: Guinea\n    sr: Гвинеја\n    ss: IGiniya\n    st: Guinea\n    su: Guinéa\n    sv: Guinea\n    sw: Guinea\n    ta: கினி\n    tg: Гвинея\n    th: ประเทศกินี\n    tk: Gwineýa\n    tl: Ginea\n    tr: Gine\n    ts: Gineya\n    tt: Гвинея\n    ug: ۋىنېيە\n    uk: Ґвінея\n    ur: جمہوریہ گنی\n    uz: Gvineya\n    vi: Guinée\n    vo: Gineyän\n    wo: Gine\n    yi: גינע\n    yo: Guinea\n    zh: 几内亚\n    zu: IGini\n"
  },
  {
    "path": "settings/country-names/gq.yaml",
    "content": "name: \n    default: Guinea Ecuatorial\n    af: Ekwatoriaal-Guinee\n    ak: Gini Ikuweta\n    am: ኢኳቶሪያል ጊኔ\n    an: Guinea Equatorial\n    ar: غينيا الاستوائية\n    az: Ekvatorial Qvineya\n    ba: Экватор Гвинеяһы\n    be: Экватарыяльная Гвінея\n    bg: Екваториална Гвинея\n    bh: भूमध्यरेखीय गिनी\n    bm: Cɛmajan Gine\n    bn: বিষুবীয় গিনি\n    bo: ཨི་ཁུའ་ཊོ་རལ་གི་ནེ།\n    br: Ginea ar C'heheder\n    bs: Ekvatorijalna Gvineja\n    ca: Guinea Equatorial\n    ce: Дуьнена асанан Гвине\n    co: Guinea Equatoriale\n    cs: Rovníková Guinea\n    cv: Экваториаллă Гвиней\n    cy: Gini Gyhydeddol\n    da: Ækvatorialguinea\n    de: Äquatorialguinea\n    dv: އިކުއެޓޯރިއަލް ގިނީ\n    dz: ཨེ་ཀུ་ཊོ་རེལ་ གི་ནི\n    ee: Gini Ekwatoria\n    el: Ισημερινή Γουινέα\n    en: Equatorial Guinea\n    eo: Ekvatora Gvineo\n    es: Guinea Ecuatorial\n    et: Ekvatoriaal-Guinea\n    eu: Ekuatore Ginea\n    fa: گینه استوایی\n    ff: Gine Ekwatoriyal\n    fi: Päiväntasaajan Guinea\n    fo: Ekvatorguinea\n    fr: Guinée équatoriale\n    fy: Ekwatoriaal-Guinee\n    ga: an Ghuine Mheánchriosach\n    gd: Gini Mheadhan-Chriosach\n    gl: Guinea Ecuatorial\n    gu: ઇક્વેટોરિયલ ગિની\n    gv: Guinea Chryss ny Cruinney\n    ha: Gini Ikwatoriya\n    he: גינאה המשוונית\n    hi: भूमध्यरेखीय गिनी\n    hr: Ekvatorska Gvineja\n    ht: Gine ekwateryal\n    hu: Egyenlítői-Guinea\n    hy: Հասարակածային Գվինեա\n    ia: Guinea Equatorial\n    id: Guinea Khatulistiwa\n    ie: Equatorial Guinéa\n    ig: Equatorial Guinea\n    io: Equatorala Guinea\n    is: Miðbaugs-Gínea\n    it: Guinea Equatoriale\n    ja: 赤道ギニア\n    jv: Guinea Khatulistiwa\n    ka: ეკვატორული გვინეა\n    kg: Ginea ya Ekwatelo\n    ki: Ginekweta\n    kk: Экваторлық Гвинея\n    km: ហ្គីណេអេក្វាទ័រ\n    kn: ವಿಷುವದ್ರೇಖೆಯ ಗಿನಿ\n    ko: 적도 기니\n    ks: اِکوِٹورِیَل گِنی\n    ku: Gîneya Rojbendî\n    kw: Gyni Ekwadoriel\n    la: Guinea Aequatorensis\n    lb: Equatorialguinea\n    lg: Equatorial Guinea\n    li: Equatoriaal Guinee\n    ln: Gine-Ekwatorial\n    lo: ອີຄົວໂທເລຍກີເນຍ\n    lt: Pusiaujo Gvinėja\n    lv: Ekvatoriālā Gvineja\n    mg: Ginea Ekoatorialy\n    mi: Kini Ekuatoria\n    mk: Екваторска Гвинеја\n    ml: ഇക്വറ്റോറിയൽ ഗിനി\n    mn: Экваторын Гвиней\n    mr: इक्वेटोरीयल गिनी\n    ms: Guinea Khatulistiwa\n    mt: Gwinea Ekwatorjali\n    my: အီကွေတာဂီနီနိုင်ငံ\n    na: Gini t Ekwador\n    ne: इक्वेटोरियल गिनी\n    nl: Equatoriaal Guinee\n    \"no\": Ekvatorial-Guinea\n    nv: Gíní Nahasdzáán Ałníiʼgi Siʼánígíí\n    oc: Guinèa Eqüatoriala\n    om: Iqu’aatoriyaal Giinii\n    or: ବିଷୁବରେଖୀୟ ଗିନି\n    os: Экваториалон Гвиней\n    pa: ਭੂ-ਮੱਧ ਰੇਖਾਈ ਗਿਨੀ\n    pl: Gwinea Równikowa\n    ps: اېکواټوريال ګوينا\n    pt: Guiné Equatorial\n    qu: Chawpipacha Khiniya\n    rm: Guinea Equatoriala\n    ro: Guineea Ecuatorială\n    ru: Экваториальная Гвинея\n    rw: Gineya Ekwatoriyale\n    sc: Guinea Ecuadoriale\n    se: Ekvatoriála Guinea\n    sg: Ginëe tî Ekuatëre\n    sh: Ekvatorijalna Gvineja\n    si: සමක ගිනියාව\n    sk: Rovníková Guinea\n    sl: Ekvatorialna Gvineja\n    sm: Kini Ekuatoria\n    sn: Equatorial Guinea\n    so: Ikweetiga Guinea\n    sq: Guinea Ekuatoriale\n    sr: Екваторијална Гвинеја\n    st: Equatorial Guinea\n    su: Guinéa Khatulistiwa\n    sv: Ekvatorialguinea\n    sw: Guinea ya Ikweta\n    ta: எக்குவடோரியல் கினி\n    te: ఎక్వేటోరియాల్ గినియా\n    tg: Гвинеяи Истивоӣ\n    th: อิเควทอเรียลกินี\n    ti: ኢኳቶሪያል ጊኒ\n    tk: Ekwatorial Gwineýa\n    tl: Gineang Ekwatoriyal\n    to: ʻEkueta Kini\n    tr: Ekvator Ginesi\n    ts: Gineya ya le Nkaveni\n    tt: Экваториа́ль Гвине́я\n    ug: ئېكۋاتور گۋىنېيىسى\n    uk: Екваторіа́льна Ґвіне́я\n    ur: استوائی گنی\n    uz: Ekvatorli Gvineya\n    vi: Guinea Xích Đạo\n    vo: Kveatora-Gineyän\n    wo: Gineg yamoo\n    yi: עקוואטארישע גינע\n    yo: Guinea Alágedeméjì\n    zh: 赤道几内亚\n    zu: iGini Enkabazwe\n"
  },
  {
    "path": "settings/country-names/gr.yaml",
    "content": "name: \n    default: Ελλάς\n    ab: Барзентәыла\n    af: Griekeland\n    am: ግሪክ\n    an: Grecia\n    ar: اليونان\n    ay: Grisya\n    az: Yunanıstan\n    ba: Греция\n    be: Грэцыя\n    bg: Гърция\n    bi: Greece\n    bn: গ্রিস\n    bo: ཀེ་རི་སི།\n    br: Gres\n    bs: Grčka\n    ca: Grècia\n    ce: Греци\n    co: Grecia\n    cs: Řecko\n    cu: Грьци\n    cv: Греци\n    cy: Gwlad Groeg\n    da: Grækenland\n    de: Griechenland\n    dv: ޔޫނާން\n    dz: གྲྀས\n    ee: Greece\n    el: Ελλάς\n    en: Greece\n    eo: Grekio\n    es: Grecia\n    et: Kreeka\n    eu: Grezia\n    fa: یونان\n    fi: Kreikka\n    fo: Grikkaland\n    fr: Grèce\n    fy: Grikelân\n    ga: An Ghréig\n    gd: A' Ghrèig\n    gl: Grecia\n    gn: Gyresia\n    gu: ગ્રીસ\n    gv: Yn Ghreag\n    he: יוון\n    hi: यूनान\n    hr: Grčka\n    ht: Grès\n    hu: Görögország\n    hy: Հունաստան\n    ia: Grecia\n    id: Yunani\n    ie: Grecia\n    io: Grekia\n    is: Grikkland\n    it: Grecia\n    ja: ギリシャ\n    jv: Yunani\n    ka: საბერძნეთი\n    kg: Gelesi\n    ki: Ngiriki\n    kk: Грекия\n    kl: Grækerit Nunaat\n    kn: ಗ್ರೀಸ್\n    ko: 그리스\n    ku: Yewnanistan\n    kv: Эллада\n    kw: Pow Grek\n    ky: Греция\n    la: Graecia\n    lb: Griicheland\n    lg: Buyonaani\n    li: Griekeland\n    ln: Gresi\n    lt: Graikija\n    lv: Grieķija\n    mg: Grisy\n    mi: Kirihi\n    mk: Грција\n    ml: ഗ്രീസ്\n    mn: Грек\n    mr: ग्रीस\n    ms: Greece\n    mt: Greċja\n    my: ဂရိနိုင်ငံ\n    na: Grit\n    ne: ग्रीस\n    nl: Griekenland\n    \"no\": Hellas\n    nv: Gwíík Dineʼé Bikéyah\n    oc: Grècia\n    or: ଗ୍ରୀସ\n    os: Грекъ\n    pa: ਯੂਨਾਨ\n    pl: Grecja\n    ps: يونان\n    pt: Grécia\n    qu: Grisya\n    rm: Grezia\n    rn: Grecia\n    ro: Grecia\n    ru: Греция\n    rw: Ubugereki\n    sa: यवनदेशः\n    sc: Grèghia\n    se: Greika\n    sh: Grčka\n    si: ග්‍රීසිය\n    sk: Grécko\n    sl: Grčija\n    sm: Kuliti\n    so: Giriig\n    sq: Greqia\n    sr: Грчка\n    ss: IGrikhi\n    su: Yunani\n    sv: Grekland\n    sw: Ugiriki\n    ta: கிரேக்க நாடு\n    te: గ్రీస్\n    tg: Юнон\n    th: ประเทศกรีซ\n    tk: Gresiýa\n    tl: Gresya\n    tr: Yunanistan\n    tt: Греция\n    ug: Grétsiye\n    uk: Греція\n    ur: یونان\n    uz: Yunoniston\n    vi: Hy Lạp\n    vo: Grikän\n    wo: Girees\n    yi: גריכנלאנד\n    yo: Gríìsì\n    zh: 希腊\n    zu: IGreki\n"
  },
  {
    "path": "settings/country-names/gs.yaml",
    "content": "name: \n    default: South Georgia and the South Sandwich Islands\n    af: Suid-Georgië en die Suidelike Sandwich-eilande\n    ar: جزر جورجيا الجنوبية وساندويتش الجنوبية\n    az: Cənubi Georgiya və Cənubi Sandviç adaları\n    be: Паўднёвая Джорджыя і Паўднёвыя Сандвічавы астравы\n    bg: Южна Джорджия и Южни Сандвичеви острови\n    br: Inizi Georgia ar Su hag Inizi Sandwich ar Su\n    bs: Južna Džordžija i Južna Sendvička Ostrva\n    ca: Illes Geòrgia del Sud i Sandwich del Sud\n    cs: Jižní Georgie a Jižní Sandwichovy ostrovy\n    da: South Georgia og South Sandwich Islands\n    de: Südgeorgien und die Südlichen Sandwichinseln\n    el: Νήσοι Νότια Γεωργία και Νότιες Σάντουιτς\n    en: South Georgia and the South Sandwich Islands\n    eo: Sud-Georgio kaj Sud-Sandviĉinsuloj\n    es: Islas Georgias del Sur y Sandwich del Sur\n    et: Lõuna-Georgia ja Lõuna-Sandwichi saared\n    eu: Hegoaldeko Georgiak eta Hegoaldeko Sandwich uharteak\n    fa: جزایر جورجیای جنوبی و ساندویچ جنوبی\n    fi: Etelä-Georgia ja Eteläiset Sandwichsaaret\n    fo: Suðursandwichoyggjar og Suðurgeorgia\n    fr: Géorgie du Sud-et-les Îles Sandwich du Sud\n    fy: Súd-Georgje en de Súdlike Sandwicheilannen\n    gd: Seòirsia-a-Deas is na h-Eileanan Shandwich-a-Deas\n    gl: Illas Xeorxia do Sur e Sandwich do Sur\n    he: איי ג'ורג'יה הדרומית ואיי סנדוויץ' הדרומיים\n    hi: दक्षिण जॉर्जिया एवं दक्षिण सैंडविच द्वीप समूह\n    hr: Južna Georgija i Otočje Južni Sandwich\n    hu: Déli-Georgia és Déli-Sandwich-szigetek\n    id: Georgia Selatan dan Kepulauan Sandwich Selatan\n    is: Suður-Georgía og Suður-Sandvíkureyjar\n    it: Georgia del Sud e Isole Sandwich Australi\n    ja: サウスジョージア・サウスサンドウィッチ諸島\n    ko: 사우스조지아 사우스샌드위치 제도\n    kw: Jeorji Dheghow hag Ynysow Sandwich Deghow\n    lt: Pietų Džordžija ir Pietų Sandvičo salos\n    lv: Dienviddžordžija un Dienvidsendviču salas\n    mk: Јужна Џорџија и Јужни Сендвички Острови\n    mr: साउथ जॉर्जिया व साउथ सँडविच द्वीपसमूह\n    ms: Georgia Selatan dan Kepulauan Sandwich Selatan\n    nb: Sør-Georgia og Sør-Sandwichøyene\n    nl: Zuid-Georgia en de Zuidelijke Sandwicheilanden\n    nn: Sør-Georgia og Sør-Sandwichøyane\n    \"no\": Sør-Georgia og Sør-Sandwichøyene\n    os: Хуссар Джорджи æмæ Хуссар Сандвичы сакъадæхтæ\n    pl: Georgia Południowa i Sandwich Południowy\n    pt: Ilhas Geórgia do Sul e Sanduíche do Sul\n    ro: Georgia de Sud şi Insulele Sandwich de Sud\n    ru: Южная Георгия и Южные Сандвичевы Острова\n    se: Lulli Georgia ja Lulli Sandwich-sullot\n    sk: Južná Georgia a Južné Sandwichove ostrovy\n    sl: Južna Georgija in Južni Sandwichevi otoki\n    sq: Gjeorgjia Jugore dhe Ishujt Jugorë Sanduiç\n    sr: Јужна Џорџија и Јужна Сендвичка Острва\n    sv: Sydgeorgien och Sydsandwichöarna\n    ta: தெற்கு யோர்சியா மற்றும் தெற்கு சண்ட்விச் தீவுகள்\n    th: เกาะเซาท์จอร์เจียและหมู่เกาะเซาท์แซนด์วิช\n    tr: Güney Georgia ve Güney Sandwich Adaları\n    uk: Південна Джорджія та Південні Сандвічеві острови\n    vi: Quần đảo Nam Georgia và Nam Sandwich\n    wo: Jeoorji gu Bëj-saalum ak Duni Islaand yi Bëj-saalum\n    zh: 南喬治亞和南桑威奇群島\n"
  },
  {
    "path": "settings/country-names/gt.yaml",
    "content": "name: \n    default: Guatemala\n    af: Guatemala\n    am: ጓቴማላ\n    an: Guatemala\n    ar: غواتيمالا\n    ay: Watimala\n    az: Qvatemala\n    ba: Гватемала\n    be: Гватэмала\n    bg: Гватемала\n    bm: Gatemala\n    bn: গুয়াতেমালা\n    bo: གུ་ཝེ་ཐི་མ་ལ།\n    br: Guatemala\n    bs: Gvatemala\n    ca: Guatemala\n    ce: Гватемала\n    cs: Guatemala\n    cy: Guatemala\n    da: Guatemala\n    de: Guatemala\n    dv: ގުއަޓެމާލާ\n    ee: Guatemala\n    el: Γουατεμάλα\n    en: Guatemala\n    eo: Gvatemalo\n    es: Guatemala\n    et: Guatemala\n    eu: Guatemala\n    fa: گواتمالا\n    fi: Guatemala\n    fo: Guatemala\n    fr: Guatemala\n    fy: Gûatemala\n    ga: Guatamala\n    gd: Guatamala\n    gl: Guatemala\n    gn: Guatemala\n    gv: Yn Ghuatemaley\n    he: גואטמלה\n    hi: ग्वाटेमाला\n    hr: Gvatemala\n    ht: Gwatemala\n    hu: Guatemala\n    hy: Գվատեմալա\n    ia: Guatemala\n    id: Guatemala\n    ie: Guatemala\n    io: Guatemala\n    is: Gvatemala\n    it: Guatemala\n    ja: グアテマラ\n    jv: Guatemala\n    ka: გვატემალა\n    kk: Гватемала\n    km: ហ្គាតេម៉ាឡា\n    kn: ಗ್ವಾಟೆಮಾಲ\n    ko: 과테말라\n    ku: Guatemala\n    kw: Gwatemala\n    la: Guatimalia\n    lb: Guatemala\n    li: Guatemala\n    ln: Gwatemala\n    lt: Gvatemala\n    lv: Gvatemala\n    mg: Goatemala\n    mi: Kuatamāra\n    mk: Гватемала\n    ml: ഗ്വാട്ടിമാല\n    mn: Гватемал\n    mr: ग्वातेमाला\n    ms: Guatemala\n    mt: Gwatemala\n    my: ဂွါတီမာလာနိုင်ငံ\n    na: Guatemara\n    ne: ग्वाटेमाला\n    nl: Guatemala\n    \"no\": Guatemala\n    oc: Guatemala\n    os: Гватемалæ\n    pa: ਗੁਆਤੇਮਾਲਾ\n    pl: Gwatemala\n    ps: ګواتمالا\n    pt: Guatemala\n    qu: Watimala\n    ro: Guatemala\n    ru: Гватемала\n    rw: Gwatemala\n    sa: ग्वाटेमाला\n    se: Guatemala\n    sh: Gvatemala\n    sk: Guatemala\n    sl: Gvatemala\n    sm: Tuatemala\n    so: Guatemala\n    sq: Guatemala\n    sr: Гватемала\n    ss: IGwathamala\n    su: Guatémala\n    sv: Guatemala\n    sw: Guatemala\n    ta: குவாத்தமாலா\n    tg: Гуатемала\n    th: ประเทศกัวเตมาลา\n    tl: Guwatemala\n    tr: Guatemala\n    tt: Гватемала\n    ug: گۋاتېمالا\n    uk: Гватемала\n    ur: گوئٹے مالا\n    uz: Gvatemala\n    vi: Guatemala\n    vo: Gvatemän\n    wo: Guwaatemala\n    yi: גוואטעמאלע\n    yo: Guatẹmálà\n    zh: 危地马拉\n    zu: Guatemala\n"
  },
  {
    "path": "settings/country-names/gw.yaml",
    "content": "name: \n    default: Guiné-Bissau\n    af: Guinee-Bissau\n    am: ጊኔ-ቢሳው\n    an: Guinea-Bissau\n    ar: غينيا بيساو\n    az: Qvineya-Bisau\n    ba: Гвинея-Бисау\n    be: Гвінея-Бісау\n    bg: Гвинея-Бисау\n    bm: Gine Bisau\n    bn: গিনি-বিসাউ\n    bo: གི་ནེ་-བི་སའོ།\n    br: Ginea-Bissau\n    bs: Gvineja-Bisau\n    ca: Guinea Bissau\n    ce: Гвине-Бисау\n    co: Guinea-Bissau\n    cs: Guinea-Bissau\n    cv: Гвиней-Бисау\n    cy: Guiné-Bissau\n    da: Guinea-Bissau\n    de: Guinea-Bissau\n    dv: ގީނީ-ބިސާއޫ\n    ee: Guinea-Bissau\n    el: Γουινέα-Μπισσάου\n    en: Guinea-Bissau\n    eo: Gvineo Bisaŭa\n    es: Guinea-Bisáu\n    et: Guinea-Bissau\n    eu: Ginea-Bissau\n    fa: گینه بیسائو\n    ff: Gine-Bisaawo\n    fi: Guinea-Bissau\n    fo: Guinea-Bissau\n    fr: Guinée-Bissau\n    fy: Guinee-Bissau\n    ga: Guine-Bissau\n    gd: Gini-Bissau\n    gl: Guinea-Bisau\n    gv: Yn Ghuinea-Bissau\n    he: גינאה ביסאו\n    hi: गिनी-बिसाऊ\n    hr: Gvineja Bisau\n    ht: Gine-Bisao\n    hu: Bissau-Guinea\n    hy: Գվինեա Բիսաու\n    ia: Guinea-Bissau\n    id: Guinea-Bissau\n    ie: Guinea-Bissau\n    io: Guinea Bisau\n    is: Gínea-Bissá\n    it: Guinea-Bissau\n    ja: ギニアビサウ\n    jv: Guinea-Bissau\n    ka: გვინეა-ბისაუ\n    kg: Ginea-Bisau\n    kk: Гвинея-Бисау\n    ko: 기니비사우\n    ku: Gîne-Bissau\n    kw: Gyni-Bissaw\n    ky: Гвинея-Бисау\n    la: Guinea Bissaviensis\n    lb: Guinea-Bissau\n    li: Guinee-Bissau\n    ln: Gine-Bisau\n    lt: Bisau Gvinėja\n    lv: Gvineja-Bisava\n    mi: Kini Pihō\n    mk: Гвинеја-Бисау\n    ml: ഗിനി-ബിസൗ\n    mn: Гвиней-Бисау\n    mr: गिनी-बिसाउ\n    ms: Guinea-Bissau\n    my: ဂင်းနီဗစ်ဆောနိုင်ငံ\n    na: Gini-Bitau\n    ne: गिनी-बिसाउ\n    nl: Guinee-Bissau\n    \"no\": Guinea-Bissau\n    nv: Gíní Bisó\n    oc: Guinèa Bissau\n    os: Гвиней-Бисау\n    pa: ਗਿਨੀ-ਬਿਸਾਊ\n    pl: Gwinea Bissau\n    pt: Guiné-Bissau\n    qu: Khiniya-Wisaw\n    ro: Guineea-Bissau\n    ru: Гвинея-Бисау\n    rw: Gineya-Biso\n    sc: Guinea-Bissau\n    se: Guinea-Bissau\n    sg: Ginëe-Bisau\n    sh: Gvineja Bisau\n    sk: Guinea-Bissau\n    sl: Gvineja Bissau\n    sn: Guinea-Bissau\n    so: Guinea-Bissau\n    sq: Guinea Bisau\n    sr: Гвинеја Бисао\n    ss: IGiniya-Bhasawu\n    st: Guinea-Bissau\n    su: Guinéa-Bissau\n    sv: Guinea-Bissau\n    sw: Guinea Bisau\n    ta: கினி-பிசாவு\n    tg: Гвинея Бисау\n    th: ประเทศกินี-บิสเซา\n    tk: Gwineýa-Bisau\n    tl: Ginea-Bissau\n    tr: Gine-Bissau\n    ts: Guinea-Bissau\n    tt: Гвинея-Бисау\n    ug: گۋىنېيە بىسسائۇ\n    uk: Гвінея-Бісау\n    ur: گنی بساؤ\n    uz: Gvineya-Bissau\n    vi: Guiné-Bissau\n    vo: Gineyän-Bisauän\n    wo: Gine Bisaawóo\n    yi: גינע-ביסאו\n    yo: Guinea-Bissau\n    zh: 幾內亞比索\n    zu: IGini Bisawu\n"
  },
  {
    "path": "settings/country-names/gy.yaml",
    "content": "name: \n    default: Guyana\n    af: Guyana\n    am: ጋያና\n    an: Guyana\n    ar: غويانا\n    ay: Wayana\n    az: Qayana\n    ba: Гайана\n    be: Гаяна\n    bg: Гвиана\n    bn: গায়ানা\n    bo: གུ་ཡ་ན།\n    br: Guyana\n    bs: Gvajana\n    ca: Guyana\n    ce: Гайана\n    cs: Guyana\n    cv: Гайана\n    cy: Guyana\n    da: Guyana\n    de: Guyana\n    dv: ގުޔާނާ\n    ee: Guyana\n    el: Γουιάνα\n    en: Guyana\n    eo: Gujano\n    es: Guyana\n    et: Guyana\n    eu: Guyana\n    fa: گویان\n    fi: Guyana\n    fo: Gujana\n    fr: Guyana\n    fy: Guyana\n    ga: An Ghuáin\n    gd: Guiana\n    gl: Güiana\n    gn: Gujána\n    gu: ગુયાના\n    gv: Geeaaney\n    he: גיאנה\n    hi: गयाना\n    hr: Gvajana\n    ht: Giyàn\n    hu: Guyana\n    hy: Գայանա\n    ia: Guyana\n    id: Guyana\n    ie: Guyana\n    io: Guyana\n    is: Gvæjana\n    it: Guyana\n    ja: ガイアナ\n    jv: Guyana\n    ka: გაიანა\n    kk: Гайана\n    kl: Guyana\n    kn: ಗಯಾನ\n    ko: 가이아나\n    ku: Guyana\n    kw: Gwayana\n    la: Guiana\n    lb: Guyana\n    li: Guyana\n    ln: Gwiana\n    lt: Gajana\n    lv: Gajāna\n    mi: Kaiana\n    mk: Гвајана\n    ml: ഗയാന\n    mn: Гайана\n    mr: गयाना\n    ms: Guyana\n    mt: Gujana\n    my: ဂိုင်ယာနာနိုင်ငံ\n    na: Guyana\n    ne: गुयना\n    nl: Guyana\n    \"no\": Guyana\n    oc: Guyana\n    or: ଗାଇଓନା\n    os: Гайанæ\n    pa: ਗੁਇਆਨਾ\n    pl: Gujana\n    ps: ګويانا\n    pt: Guiana\n    qu: Wayana\n    ro: Guyana\n    ru: Гайана\n    rw: Giyana\n    sa: गयाना\n    sc: Guyana\n    se: Guyana\n    sh: Gvajana\n    sk: Guyana\n    sl: Gvajana\n    so: Guyana\n    sq: Guajana\n    sr: Гвајана\n    su: Guyana\n    sv: Guyana\n    sw: Guyana\n    ta: கயானா\n    te: గయానా\n    th: ประเทศกายอานา\n    tl: Guyana\n    tr: Guyana\n    tt: Гайана\n    ug: گايانا\n    uk: Гаяна\n    ur: گیانا\n    uz: Gayana\n    vi: Guyana\n    vo: Gvayän\n    wo: Guyaana\n    yi: גויאנע\n    yo: Gùyánà\n    zh: 圭亚那\n"
  },
  {
    "path": "settings/country-names/hn.yaml",
    "content": "name: \n    default: Honduras\n    af: Honduras\n    am: ሆንዱራስ\n    an: Honduras\n    ar: هندوراس\n    ay: Honduras\n    az: Honduras\n    ba: Гондурас\n    be: Гандурас\n    bg: Хондурас\n    bm: Honduras\n    bn: হন্ডুরাস\n    bo: ཧོང་དུ་ར་སི།\n    br: Honduras\n    bs: Honduras\n    ca: Hondures\n    ce: Гондурас\n    cs: Honduras\n    cu: Ондоурасъ\n    cy: Honduras\n    da: Honduras\n    de: Honduras\n    dv: ހޮންޑިއުރަސް\n    el: Ονδούρα\n    en: Honduras\n    eo: Honduro\n    es: Honduras\n    et: Honduras\n    eu: Honduras\n    fa: هندوراس\n    fi: Honduras\n    fo: Honduras\n    fr: Honduras\n    fy: Hondueras\n    ga: Hondúras\n    gd: Hondùras\n    gl: Honduras\n    gn: Honduras\n    gu: હોન્ડુરાસ\n    gv: Ny Hondooraghyn\n    he: הונדורס\n    hi: हौण्डुरस\n    hr: Honduras\n    ht: Ondiras\n    hu: Honduras\n    hy: Հոնդուրաս\n    ia: Honduras\n    id: Honduras\n    ie: Honduras\n    io: Honduras\n    is: Hondúras\n    it: Honduras\n    ja: ホンジュラス\n    jv: Honduras\n    ka: ჰონდურასი\n    kk: Гондурас\n    ko: 온두라스\n    ku: Hondûras\n    kw: Hondouras\n    ky: Гондурас\n    la: Honduria\n    lb: Honduras\n    li: Honduras\n    ln: Honduras\n    lt: Hondūras\n    lv: Hondurasa\n    mk: Хондурас\n    ml: ഹോണ്ടുറാസ്\n    mn: Гондурас\n    mr: होन्डुरास\n    ms: Honduras\n    mt: Ħonduras\n    my: ဟွန်ဒူးရပ်စ်နိုင်ငံ\n    na: Ondurat\n    ne: होण्डुरस\n    nl: Honduras\n    \"no\": Honduras\n    oc: Honduras\n    or: ହୋଣ୍ଡାରୁସ\n    os: Гондурас\n    pa: ਹਾਂਡੂਰਾਸ\n    pl: Honduras\n    ps: هندوراس\n    pt: Honduras\n    qu: Unduras\n    rn: Honduras\n    ro: Honduras\n    ru: Гондурас\n    rw: Hondurasi\n    sa: हांडूरस\n    se: Honduras\n    sh: Honduras\n    sk: Honduras\n    sl: Honduras\n    sm: Honilagi\n    sq: Hondurasi\n    sr: Хондурас\n    ss: IHondulasi\n    su: Honduras\n    sv: Honduras\n    sw: Honduras\n    ta: ஹொண்டுராஸ்\n    te: హోండురాస్\n    tg: Ҳондурас\n    th: ประเทศฮอนดูรัส\n    tl: Honduras\n    tr: Honduras\n    tt: Гондурас\n    ug: ھوندۇراس\n    uk: Гондурас\n    ur: ہونڈوراس\n    uz: Gonduras\n    vi: Honduras\n    vo: Hondurän\n    wa: Hondourasse\n    wo: Onduras\n    yi: האנדוראס\n    yo: Họ̀ndúràs\n    zh: 洪都拉斯\n    zu: Honduras\n"
  },
  {
    "path": "settings/country-names/hr.yaml",
    "content": "name: \n    default: Hrvatska\n    ab: Хорватиа\n    af: Kroasië\n    am: ክሮኤሽያ\n    an: Croacia\n    ar: كرواتيا\n    az: Xorvatiya\n    ba: Хорватия\n    be: Харватыя\n    bg: Хърватия\n    bi: Croatia\n    bn: ক্রোয়েশিয়া\n    bo: ཁུརོ་ཤི་ཡ།\n    br: Kroatia\n    bs: Hrvatska\n    ca: Cròacia\n    ce: Хорвати\n    cs: Chorvatsko\n    cu: Хръватьска\n    cy: Croatia\n    da: Kroatien\n    de: Kroatien\n    dv: ކުރޮއޭޝިއާ\n    ee: Croatia\n    el: Κροατία\n    en: Croatia\n    eo: Kroatio\n    es: Croacia\n    et: Horvaatia\n    eu: Kroazia\n    fa: کرواسی\n    fi: Kroatia\n    fo: Kroatia\n    fr: Croatie\n    fy: Kroaasje\n    ga: An Chróit\n    gd: Croàisia\n    gl: Croacia\n    gn: Kyoasia\n    gu: ક્રોએશિયા\n    gv: Yn Chroit\n    he: קרואטיה\n    hi: क्रोएशिया\n    hr: Hrvatska\n    ht: Kroasi\n    hu: Horvátország\n    hy: Խորվաթիա\n    ia: Croatia\n    id: Kroasia\n    ie: Croatia\n    io: Kroatia\n    is: Króatía\n    it: Croazia\n    ja: クロアチア\n    jv: Kroasia\n    ka: ხორვატია\n    kg: Kroatia\n    kk: Хорватия\n    kl: Kroatia\n    kn: ಕ್ರೊಯೆಶಿಯ\n    ko: 크로아티아\n    ku: Kroatya\n    kv: Хорватия\n    kw: Kroati\n    ky: Хорватия\n    la: Croatia\n    lb: Kroatien\n    li: Kroatië\n    ln: Kroasia\n    lt: Kroatija\n    lv: Horvātija\n    mi: Koroātia\n    mk: Хрватска\n    ml: ക്രൊയേഷ്യ\n    mn: Хорват\n    mr: क्रोएशिया\n    ms: Croatia\n    mt: Kroazja\n    my: ခရိုအေးရှားနိုင်ငံ\n    na: Kroaitsiya\n    ne: क्रोएशिया\n    nl: Kroatië\n    \"no\": Kroatia\n    nv: Kwóóʼad Bikéyah\n    oc: Croàcia\n    or: କ୍ରୋଏସିଆ\n    os: Хорвати\n    pa: ਕ੍ਰੋਏਸ਼ੀਆ\n    pl: Chorwacja\n    ps: کروواسيا\n    pt: Croácia\n    qu: Hurwatsuyu\n    rn: Croacia\n    ro: Croația\n    ru: Хорватия\n    rw: Korowatiya\n    sa: क्रोएशिया\n    sc: Croatzia\n    se: Kroatia\n    sg: Kroasïi\n    sh: Hrvatska\n    sk: Chorvátsko\n    sl: Hrvaška\n    sm: Croatia\n    so: Kroatia\n    sq: Kroacia\n    sr: Хрватска\n    ss: IKhuroshiya\n    st: Kroatia\n    su: Kroasia\n    sv: Kroatien\n    sw: Kroatia\n    ta: குரோவாசியா\n    te: క్రొయేషియా\n    tg: Хорватия\n    th: ประเทศโครเอเชีย\n    tk: Horwatiýa\n    tl: Kroasya\n    tr: Hırvatistan\n    tt: Хорватия\n    ug: كرودىيە\n    uk: Хорватія\n    ur: کروشیا\n    uz: Xorvatiya\n    vi: Croatia\n    vo: Kroasän\n    wa: Crowaceye\n    wo: Korwaasi\n    yi: קראאטיע\n    yo: Kroatíà\n    za: Gwzlozdiya\n    zh: 克羅地亞\n"
  },
  {
    "path": "settings/country-names/ht.yaml",
    "content": "name: \n    default: Ayiti\n    af: Haïti\n    am: ሃይቲ\n    an: Haití\n    ar: هايتي\n    ay: Ayti\n    az: Haiti Respublikası\n    be: Гаіці\n    bg: Хаити\n    bm: Ayiti\n    bn: হাইতি\n    bo: ཧའི་ཏི།\n    br: Republik Haiti\n    bs: Haiti\n    ca: Haití\n    ce: Гаити Пачхьалкх\n    co: Haiti\n    cs: Haiti\n    cv: Гаити\n    cy: Haiti\n    da: Haiti\n    de: Haiti\n    dv: ހެއިޓީ\n    ee: Haiti\n    el: Αϊτή\n    en: Haiti\n    eo: Haitio\n    es: Haití\n    et: Haiti\n    eu: Haiti\n    fa: هائیتی\n    fi: Haiti\n    fo: Haiti\n    fr: Haïti\n    fy: Haïty\n    ga: Háítí\n    gd: Haiti\n    gl: Haití - Haïti\n    gu: હૈતી\n    gv: Haiti\n    he: האיטי\n    hi: हैती\n    hr: Haiti\n    ht: Ayiti\n    hu: Haiti\n    hy: Հաիթի\n    ia: Haiti\n    id: Haiti\n    io: Haiti\n    is: Haítí\n    it: Haiti\n    ja: ハイチ\n    jv: Haiti\n    ka: ჰაიტი\n    kg: Ayiti\n    ki: Haiti\n    kk: Гаити\n    ko: 아이티\n    ku: Haîtî\n    kw: Hayti\n    la: Haitia\n    lb: Haiti\n    li: Haïti\n    ln: Ayiti\n    lt: Haitis\n    lv: Haiti\n    mg: Haiti\n    mk: Хаити\n    ml: ഹെയ്റ്റി\n    mn: Гайти\n    mr: हैती\n    ms: Haiti\n    mt: Ħaiti\n    my: ဟေတီနိုင်ငံ\n    na: Aiti\n    ne: हाइटी\n    nl: Haïti\n    \"no\": Haiti\n    nv: Héítii\n    oc: Haití (estat)\n    or: ହିଟି\n    os: Гаити\n    pa: ਹੈਤੀ\n    pl: Haiti\n    ps: هایتي\n    pt: Haiti\n    qu: Ayti (mama llaqta)\n    ro: Haiti\n    ru: Гаити\n    rw: Hayiti\n    se: Haiti\n    sh: Haiti\n    si: හෙයිටි\n    sk: Haiti\n    sl: Haiti\n    so: Haiti\n    sq: Haitia\n    sr: Хаити\n    ss: IHayithi\n    su: Haiti\n    sv: Haiti\n    sw: Haiti\n    ta: எயிட்டி\n    th: ประเทศเฮติ\n    tl: Hayti\n    tr: Haiti\n    tt: Гаити\n    ug: ھايتى\n    uk: Гаїті\n    ur: ہیٹی\n    uz: Gaiti\n    vi: Haiti\n    vo: Haitiyän\n    wa: Ayiti\n    wo: Ayiti\n    yi: האיטי\n    yo: Hàítì\n    zh: 海地\n"
  },
  {
    "path": "settings/country-names/hu.yaml",
    "content": "name: \n    default: Magyarország\n    ab: Мадиартәыла\n    af: Hongarye\n    am: ሀንጋሪ\n    an: Hongría\n    ar: المجر\n    ay: Hunkariya\n    az: Macarıstan\n    ba: Венгрия\n    be: Венгрыя\n    bg: Унгария\n    bi: Hungary\n    bn: হাঙ্গেরি\n    bo: ཧུང་གྷ་རི།\n    br: Hungaria\n    bs: Mađarska\n    ca: Hongria\n    ce: Венгри\n    co: Ungheria\n    cs: Maďarsko\n    cu: Ѫгри\n    cv: Венгри\n    cy: Hwngari\n    da: Ungarn\n    de: Ungarn\n    dv: ހަންގޭރީ\n    ee: Hungary\n    el: Ουγγαρία\n    en: Hungary\n    eo: Hungario\n    es: Hungría\n    et: Ungari\n    eu: Hungaria\n    fa: مجارستان\n    ff: Hunngariya\n    fi: Unkari\n    fo: Ungarn\n    fr: Hongrie\n    fy: Hongarije\n    ga: An Ungáir\n    gd: An Ungair\n    gl: Hungría\n    gn: Hungyria\n    gu: હંગેરી\n    gv: Yn Ungaar\n    he: הונגריה\n    hi: हंगरी\n    hr: Mađarska\n    ht: Ongri\n    hu: Magyarország\n    hy: Հունգարիա\n    ia: Hungaria\n    id: Hongaria\n    ie: Hungaria\n    io: Hungaria\n    is: Ungverjaland\n    it: Ungheria\n    ja: ハンガリー\n    jv: Hongaria\n    ka: უნგრეთი\n    kg: Hongrie\n    ki: Macartsa\n    kk: Мажарстан\n    kl: Ungarni\n    km: ប្រទេសហុងគ្រី\n    ko: 헝가리\n    ku: Macaristan\n    kv: Мадьяр Му\n    kw: Hungari\n    ky: Мажарстан\n    la: Hungaria\n    lb: Ungarn\n    li: Hongarieë\n    ln: Ungri\n    lt: Vengrija\n    lv: Ungārija\n    mi: Hanekari\n    mk: Унгарија\n    ml: ഹംഗറി\n    mn: Унгар\n    mr: हंगेरी\n    ms: Hungary\n    mt: Ungerija\n    my: ဟန်ဂေရီနိုင်ငံ\n    na: Ungari\n    ne: हंगेरी\n    nl: Hongarije\n    \"no\": Ungarn\n    nv: Hángewii\n    oc: Ongria\n    or: ହଙ୍ଗେରୀ\n    os: Венгри\n    pa: ਹੰਗਰੀ\n    pl: Węgry\n    ps: هنګري\n    pt: Hungria\n    qu: Unriya\n    rm: Ungaria\n    ro: Ungaria\n    ru: Венгрия\n    rw: Hongiriya\n    sa: हंगरी\n    se: Ungára\n    sh: Mađarska\n    si: හන්ගේරියානු සමුහාණ්ඩුව\n    sk: Maďarsko\n    sl: Madžarska\n    sm: Hungary\n    sn: Hungary\n    so: Hungaria\n    sq: Hungaria\n    sr: Мађарска\n    ss: IHangareyi\n    st: Hungary\n    su: Hungaria\n    sv: Ungern\n    sw: Hungaria\n    ta: அங்கேரி\n    te: హంగేరి\n    tg: Маҷористон\n    th: ประเทศฮังการี\n    tk: Wengriýa\n    tl: Unggarya\n    tr: Macaristan\n    ts: Hungary\n    tt: Маҗарстан\n    ug: ۋېنگرىيە\n    uk: Угорщина\n    ur: مجارستان\n    uz: Mojariston\n    vi: Hungary\n    vo: Macarän\n    wo: Ongiri\n    yi: אונגארן\n    yo: Húngárì\n    zh: 匈牙利\n"
  },
  {
    "path": "settings/country-names/id.yaml",
    "content": "name: \n    default: Indonesia\n    af: Indonesië\n    ak: Indonesia\n    am: ኢንዶኔዥያ\n    an: Indonesia\n    ar: إندونيسيا\n    ay: Indunisya\n    az: İndoneziya\n    ba: Индонезия\n    be: Інданезія\n    bg: Индонезия\n    bi: Indonesia\n    bn: ইন্দোনেশিয়া\n    bo: ཨིན་རྡུ་ནི་ཤིས་ཡ།\n    br: Indonezia\n    bs: Indonezija\n    ca: Indonèsia\n    ce: Индонези\n    ch: Indonesia\n    co: Indunesia\n    cs: Indonésie\n    cu: Їндонисїꙗ\n    cv: Индонези\n    cy: Indonesia\n    da: Indonesien\n    de: Indonesien\n    dv: އިންޑޮނޭޝިޔާ\n    el: Ινδονησία\n    en: Indonesia\n    eo: Indonezio\n    es: Indonesia\n    et: Indoneesia\n    eu: Indonesia\n    fa: اندونزی\n    fi: Indonesia\n    fo: Indonesia\n    fr: Indonésie\n    fy: Yndoneezje\n    ga: An Indinéis\n    gd: An Innd-Innse\n    gl: Indonesia\n    gn: Indonesia\n    gu: ઈંડોનેશિયા\n    gv: Yn Indoneesh\n    he: אינדונזיה\n    hi: इंडोनेशिया\n    hr: Indonezija\n    ht: Endonezi\n    hu: Indonézia\n    hy: Ինդոնեզիա\n    ia: Indonesia\n    id: Indonesia\n    ie: Indonesia\n    io: Indonezia\n    is: Indónesía\n    it: Indonesia\n    iu: ᐄᓅᓯᐊ\n    ja: インドネシア\n    jv: Indonésia\n    ka: ინდონეზია\n    ki: Indonesia\n    kk: Индонезия\n    kl: Indonesia\n    km: ឥណ្ឌូនេស៊ី\n    kn: ಇಂಡೋನೇಷ್ಯಾ\n    ko: 인도네시아\n    ku: Îndonezya\n    kv: Индонезия\n    kw: Indonesi\n    ky: Индонезия\n    la: Indonesia\n    lb: Indonesien\n    li: Indonesië\n    ln: Indonezí\n    lt: Indonezija\n    lv: Indonēzija\n    mg: Indonezia\n    mi: Initonīhia\n    mk: Индонезија\n    ml: ഇന്തോനേഷ്യ\n    mn: Индонез\n    mr: इंडोनेशिया\n    ms: Indonesia\n    mt: Indoneżja\n    my: အင်ဒိုနီးရှားနိုင်ငံ\n    na: Indonitsiya\n    ne: इण्डोनेशिया\n    nl: Indonesië\n    \"no\": Indonesia\n    nv: Indoníízha\n    oc: Indonesia\n    om: Indoneeshiyaa\n    or: ଇଣ୍ଡୋନେସିଆ\n    os: Индонези\n    pa: ਇੰਡੋਨੇਸ਼ੀਆ\n    pl: Indonezja\n    ps: اندونيزيا\n    pt: Indonésia\n    qu: Indunisya\n    rm: Indonesia\n    ro: Indonezia\n    ru: Индонезия\n    rw: Indonesiya\n    sa: इण्डोनेशिया\n    se: Indonesia\n    sg: Ênndonezïi\n    sh: Indonezija\n    si: ඉන්දුනීසියාව\n    sk: Indonézia\n    sl: Indonezija\n    sm: Indyunisia\n    so: Indunisiya\n    sq: Indonezia\n    sr: Индонезија\n    ss: INdonesiya\n    su: Indonésia\n    sv: Indonesien\n    sw: Indonesia\n    ta: இந்தோனேசியா\n    te: ఇండోనేషియా\n    tg: Индонезия\n    th: ประเทศอินโดนีเซีย\n    tk: Indoneziýa\n    tl: Indonesya\n    tr: Endonezya\n    tt: Индонезия\n    ug: ھىندونېزىيە\n    uk: Індонезія\n    ur: انڈونیشیا\n    uz: Indoneziya\n    vi: Indonesia\n    vo: Lindäna-Seänuäns\n    wa: Indonezeye\n    wo: Endoneesi\n    yi: אינדאנעזיע\n    yo: Indonésíà\n    za: Yindunizsihya\n    zh: 印度尼西亚 / 印度尼西亞\n"
  },
  {
    "path": "settings/country-names/ie.yaml",
    "content": "name: \n    default: Éire / Ireland\n    af: Ierland\n    ak: Aereland\n    am: አየርላንድ\n    an: Irlanda\n    ar: أيرلندا\n    ay: Irlandiya\n    az: İrlandiya\n    ba: Ирландия\n    be: Ірландыя\n    bg: Ирландия\n    bi: Ireland\n    bm: Irilandi\n    bn: আয়ারল্যান্ড\n    bo: ཨ་ཡར་ལནཌ།\n    br: Iwerzhon\n    bs: Irska\n    ca: Irlanda\n    ce: Ирланди\n    co: Irlanda\n    cs: Irsko\n    cu: Єирь\n    cv: Ирланди Республики\n    cy: Iwerddon\n    da: Irland\n    de: Irland\n    dv: އަޔަލޭންޑުގެ ޖުމްހޫރިއްޔާ\n    dz: ཨཱ་ཡ་ལེནཌ\n    ee: Ireland nutome\n    el: Ιρλανδία\n    en: Ireland\n    eo: Irlando\n    es: Irlanda\n    et: Iirimaa\n    eu: Irlanda\n    fa: ایرلند\n    ff: Irlannda\n    fi: Irlanti\n    fo: Írland\n    fr: Irlande\n    fy: Ierlân\n    ga: Éire\n    gd: Èirinn\n    gl: Irlanda\n    gn: Ilandia\n    gu: આયર્લેંડ\n    gv: Nerin\n    ha: Ayalan\n    he: אירלנד\n    hi: आयरलैंड\n    hr: Irska\n    ht: Ilann\n    hu: Írország\n    hy: Իռլանդիա\n    ia: Irlanda\n    id: Irlandia\n    ie: Irland\n    io: Irlando\n    is: Írland\n    it: Irlanda\n    ja: アイルランド\n    jv: Republik Irlandia\n    ka: ირლანდია\n    ki: Ayalandi\n    kk: Ирландия\n    kl: Irlandi\n    km: អៀរឡង់\n    kn: ಐರ್ಲೆಂಡ್\n    ko: 아일랜드\n    ks: اَیَرلینٛڑ\n    ku: Îrland\n    kv: Ирландия\n    kw: Repoblek Wordhen\n    ky: Ирландия\n    la: Hibernia\n    lb: Irland\n    lg: Ayalandi\n    li: Ierland\n    ln: Irelandɛ\n    lo: ໄອແລນ\n    lt: Airija\n    lv: Īrija\n    mg: Irlandy\n    mi: Airangi\n    mk: Ирска\n    ml: അയർലാൻഡ്\n    mn: Ирланд\n    mr: आयर्लंड\n    ms: Ireland\n    mt: Irlanda\n    my: အိုင်ယာလန်\n    na: Ripubrikit Airerand\n    ne: आइरल्याण्ड\n    nl: Ierland\n    \"no\": Irland\n    nv: Bitsiighaʼ Łichííʼí Bikéyah\n    oc: Republica d'Irlanda\n    or: ଆୟରଲ୍ୟାଣ୍ଡ\n    os: Ирланди\n    pl: Irlandia\n    ps: د آيرلېنډ جمهوريت\n    pt: Irlanda\n    qu: Ilanda\n    rm: Irlanda\n    rn: Irilandi\n    ro: Irlanda\n    ru: Ирландия\n    rw: Irilande\n    sc: Irlanda\n    se: Irlánda\n    sg: Irlânde\n    sh: Irska\n    si: අයර්ලන්තය\n    sk: Írsko\n    sl: Irska\n    sn: Ireland\n    so: Ayrlaand\n    sq: Irlandë\n    sr: Ирска\n    ss: IYalendi\n    sv: Irland\n    sw: Ayalandi\n    ta: அயர்லாந்து\n    te: ఐర్ లాండ్\n    tg: Ҷумҳурии Ирландия\n    th: สาธารณรัฐไอร์แลนด์\n    ti: አየርላንድ\n    tk: Irlandiýa\n    tl: Irlanda\n    to: ʻAealani\n    tr: İrlanda\n    ts: Ireland\n    tt: Ирландия\n    uk: Ірландія\n    ur: آئرلینڈ\n    uz: Irlandiya\n    vi: Ireland\n    vo: Lireyän\n    wa: Irlande\n    yi: אירלאנד\n    yo: Orílẹ́ède Ailandi\n    za: Aiwjlanz Gunghozgoz\n    zh: 愛爾蘭\n    zu: i-Ireland\n"
  },
  {
    "path": "settings/country-names/il.yaml",
    "content": "name: \n    default: ישראל\n    af: Israel\n    am: እስራኤል\n    an: Israel\n    ar: إسرائيل\n    av: Гlизраил\n    az: İsrail\n    ba: Израиль\n    be: Ізраіль\n    bg: Израел\n    bm: Israil\n    bn: ইসরায়েল\n    bo: ཨི་སི་ར་ཨེལ།\n    br: Israel\n    bs: Izrael\n    ca: Israel\n    ce: Израиль\n    co: Israele\n    cs: Izrael\n    cu: Їꙁдраил҄ь\n    cv: Израиль\n    cy: Israel\n    da: Israel\n    de: Israel\n    dv: އިސްރާއީލު\n    dz: ཨིཛ་རཱེལ་\n    el: Ισραήλ\n    en: Israel\n    eo: Israelo\n    es: Israel\n    et: Iisrael\n    eu: Israel\n    fa: اسرائیل\n    fi: Israel\n    fj: Isireli\n    fo: Ísrael\n    fr: Israël\n    fy: Israel\n    ga: Iosrael\n    gd: Iosrael\n    gl: Israel\n    gn: Israel\n    gu: ઈઝરાયલ\n    gv: Israel\n    ha: Isra'ila\n    he: ישראל\n    hi: इज़राइल\n    hr: Izrael\n    ht: Izrayèl\n    hu: Izrael\n    hy: Իսրայել\n    ia: Israel\n    id: Israel\n    ie: Israel\n    ig: Israel\n    io: Israel\n    is: Ísrael\n    it: Israele\n    ja: イスラエル\n    jv: Israèl\n    ka: ისრაელი\n    kg: Israel\n    kk: Израиль\n    kl: Israel\n    kn: ಇಸ್ರೇಲ್\n    ko: 이스라엘\n    ku: Îsraêl\n    kv: Израиль\n    kw: Ysrael\n    ky: Израиль\n    la: Israel\n    lb: Israel\n    li: Israël\n    ln: Israel\n    lt: Izraelis\n    lv: Izraēla\n    mi: Iharaira\n    mk: Израел\n    ml: ഇസ്രയേൽ\n    mn: Израйль\n    mr: इस्रायल\n    ms: Israel\n    mt: Iżrael\n    my: အစ္စရေးနိုင်ငံ\n    na: Iteraer\n    ne: इजरायल\n    nl: Israël\n    \"no\": Israel\n    nv: Ízrel Bikéyah\n    oc: Israèl\n    or: ଇସ୍ରାଏଲ\n    os: Израиль\n    pa: ਇਜ਼ਰਾਇਲ\n    pl: Izrael\n    ps: اسرائيل\n    pt: Israel\n    qu: Israyil\n    ro: Israel\n    ru: Израиль\n    rw: Isirayeli\n    sa: इस्रेल\n    sc: Israele\n    se: Israel\n    sh: Izrael\n    si: ඊශ්‍රායලය\n    sk: Izrael\n    sl: Izrael\n    sm: Israel\n    so: Israaiil\n    sq: Izraeli\n    sr: Израел\n    ss: Ka-Israyeli\n    sv: Israel\n    sw: Israel\n    ta: இசுரேல்\n    te: ఇజ్రాయిల్\n    tg: Исроил\n    th: ประเทศอิสราเอล\n    tk: Ysraýyl\n    tl: Israel\n    tr: İsrail\n    tt: Исраил\n    ug: ئىسرائىلىيە\n    uk: Ізраїль\n    ur: اسرائیل\n    uz: Isroil\n    vi: Israel\n    vo: Yisraelän\n    wa: Israyel\n    wo: Israayil\n    yi: ישראל\n    yo: Ísráẹ́lì\n    zh: 以色列\n    zu: Isreyili\n"
  },
  {
    "path": "settings/country-names/im.yaml",
    "content": "name: \n    default: Isle of Man\n    af: Eiland Man\n    an: Isla de Man\n    ar: جزيرة مان\n    az: Men adası\n    be: Востраў Мэн\n    bg: Ман\n    bn: আইল অফ ম্যান\n    br: Manav\n    bs: Ostrvo Man\n    ca: Illa de Man\n    cs: Man\n    cv: Мэн утравĕ\n    cy: Ynys Manaw\n    da: Isle of Man\n    de: Insel Man\n    dv: އައިޒަލް އޮފް މޭން\n    el: Νήσος του Μαν\n    en: Isle of Man\n    eo: Manksinsulo\n    es: Isla de Man\n    et: Man\n    eu: Man\n    fa: جزیره من\n    fi: Mansaari\n    fo: Mann\n    fr: Île de Man\n    fy: Man\n    ga: Oileán Mhanann\n    gd: Eilean Mhanainn\n    gl: Illa de Man\n    gv: Ellan Vannin\n    he: האי מאן\n    hi: आइल ऑफ़ मैन\n    hr: Otok Man\n    hu: Man\n    hy: Մեն կղզի\n    ia: Insula de Man\n    id: Pulau Man\n    io: Man-Insulo\n    is: Mön\n    it: Isola di Man\n    ja: マン島\n    jv: Pulo Man\n    ka: მენი\n    ko: 맨 섬\n    kw: Ynys Manow\n    la: Monapia\n    li: Man\n    lt: Meno Sala\n    lv: Menas Sala\n    mi: Motu o Man\n    mk: Ман\n    ml: ഐൽ ഒഫ് മാൻ\n    mr: आईल ऑफ मान\n    ms: Isle of Man\n    nl: Eiland Man\n    \"no\": Man\n    oc: Illa de Man\n    os: Мэн\n    pa: ਮੈਨ ਟਾਪੂ\n    pl: Wyspa Man\n    pt: Ilha de Man\n    qu: Man wat'a\n    ro: Insula Man\n    ru: Остров Мэн\n    rw: Ikirwa cya Man\n    sh: Otok Man\n    sk: Ostrov Man\n    sl: Otok Man\n    sq: Ishulli i Njeriut\n    sr: Острво Ман\n    su: Pulo Man\n    sv: Isle of Man\n    sw: Isle of Man\n    ta: மாண் தீவு\n    th: เกาะแมน\n    tl: Pulo ng Man\n    tr: Man Adası\n    tt: Мэн утравы\n    uk: Острів Мен\n    ur: آئل آف مین\n    vi: Đảo Man\n    vo: Mäneän\n    yo: Erékùṣù ilẹ̀ Man\n    zh: 马恩岛\n"
  },
  {
    "path": "settings/country-names/in.yaml",
    "content": "name: \n    default: India\n    af: Indië\n    ar: الهند\n    be: Індыя\n    br: India\n    da: Indien\n    de: Indien\n    el: Ινδία\n    en: India\n    eo: Barato\n    fa: هند\n    fi: Intia\n    fr: Inde\n    fy: Yndia\n    ga: An India\n    gd: Na h-Innseachan\n    he: הודו\n    hi: भारत\n    hu: India\n    is: Indland\n    it: India\n    iu: ᐃᓐᑎᐊ/intia\n    ja: インド\n    lb: Indien\n    lt: Indija\n    lv: Indija\n    mn: Энэтхэг\n    \"no\": India\n    pl: Indie\n    ru: Индия\n    sl: Indija\n    sv: Indien\n    th: ประเทศอินเดีย\n    tr: Hindistan\n    uk: Індія\n    vi: Ấn Độ\n    zh: 印度\n"
  },
  {
    "path": "settings/country-names/io.yaml",
    "content": "name: \n    default: British Indian Ocean Territory\n    af: Britse Indiese Oseaan Gebied\n    ak: Britenfo Hɔn Man Wɔ India Po No Mu\n    am: የብሪታኒያ ህንድ ውቂያኖስ ግዛት\n    an: Territorio Britanico de l'Ozián Indico\n    ar: إقليم المحيط الهندي البريطاني\n    az: Britaniya-Hindistan Okeanik territoriyası\n    be: Брытанскія Індыйска-акіянскія тэрыторыі\n    bg: Британска индоокеанска територия\n    bm: Angilɛ ka ɛndu dugukolo\n    bn: ব্রিটিশ ভারত মহাসাগরীয় অঞ্চল\n    br: Tiriad Meurvor Indez Breizh-Veur\n    bs: Britanski teritorij Indijskog okeana\n    ca: Territori Britànic de l'Oceà Índic\n    cs: Britské indickooceánské území\n    cy: Tiriogaeth Prydain yng Nghefnfor India\n    da: Britiske Indiske Ocean\n    de: Britisches Territorium im Indischen Ozean\n    dz: བྲི་ཊིཤ་རྒྱ་གར་གྱི་རྒྱ་མཚོ་ས་ཁོངས\n    ee: Britaintɔwo ƒe india ƒudome nutome\n    el: Βρετανικό Έδαφος Ινδικού Ωκεανού\n    en: British Indian Ocean Territory\n    eo: Brita Hindoceana Teritorio\n    es: Territorio Británico del Océano Índico\n    et: Briti India ookeani ala\n    eu: Indiako Ozeanoko Britainiar Lurraldea\n    fa: مستعمره‌های بریتانیا در اقیانوس هند\n    ff: Keeriindi britaani to maayo enndo\n    fi: Brittiläinen Intian valtameren alue\n    fo: Bretsku Indiahavsoyggjarnar\n    fr: Territoire britannique de l'Océan Indien\n    fy: Britske Yndyske-Oseaanterritoarium\n    ga: Críoch Aigéan Indiach na Breataine\n    gd: Ranntair Breatannach Cuan nan Innseachan\n    gl: Territorio Británico do Océano Índico\n    gu: બ્રિટિશ ઇન્ડિયન ઓશન ટેરિટરી\n    ha: Yankin Birtaniya Na Tekun Indiya\n    he: טריטוריה בריטית באוקיאנוס ההודי\n    hi: ब्रिटिश हिंद महासागर क्षेत्र\n    hr: Britanski Indijskooceanski Teritoriji\n    hu: Brit Indiai-óceáni Terület\n    ia: Territorio oceanic britanno-indian\n    id: Teritorial Britania di Samudra Hindia\n    io: Britaniana teritorio en Indiana Oceano\n    is: Breska Indlandshafseyjar\n    it: Territorio britannico dell'oceano Indiano\n    ja: イギリス領インド洋地域\n    ka: ბრიტანეთის ინდოეთის ოკეანის ტერიტორია\n    ki: Eneo la Uingereza katika Bahari Hindi\n    km: ដែន​មហា​សមុទ្រ​ឥណ្ឌា ចក្រភព​អង់គ្លេស\n    kn: ಬ್ರಿಟೀಶ್ ಇಂಡಿಯನ್ ಮಹಾಸಾಗರ ಪ್ರದೇಶ\n    ko: 영국령 인도양 지역\n    ks: برطانوی بحرِ ہِنٛدۍ علاقہٕ\n    ku: Xakên Brîtanyayê yên Okyanûsa Hindî\n    lg: Bizinga by'eCago\n    ln: Mabelé ya Angɛlɛtɛ́lɛ na mbú ya Indiya\n    lo: ບຣິດທິສອິນດ່ຽນໂອຊ່ຽນເທີຣິທໍຣີ\n    lt: Indijos vandenyno Britų sritis\n    lv: Indijas okeāna Britu teritorija\n    mg: Faridranomasina indiana britanika\n    mk: Британска Индоокеанска Територија\n    ml: ബ്രിട്ടീഷ് ഇന്ത്യൻ മഹാസമുദ്ര പ്രദേശം\n    mn: Британийн Энэтхэгийн Далайн Нутаг дэвсгэр\n    mr: ब्रिटीश हिंदी महासागर क्षेत्र\n    ms: Wilayah Lautan Hindi British\n    my: ဗြိတိသျှ အိန္ဒြိယ သမုဒ္ဒရာ ပိုင်နက်\n    ne: बेलायती हिन्द महासागर क्षेत्र\n    nl: Brits Territorium in de Indische Oceaan\n    \"no\": Det britiske territoriet i Indiahavet\n    or: ବ୍ରିଟିଶ୍ ଭାରତୀୟ ସାମୁଦ୍ରିକ କ୍ଷେତ୍ର\n    pl: Brytyjskie Terytorium Oceanu Indyjskiego\n    pt: Território Britânico do Oceano Índico\n    rm: Territori Britannic en l'Ocean Indic\n    rn: Intara y'Ubwongereza yo mu birwa by'Abahindi\n    ro: Teritoriul Britanic din Oceanul Indian\n    ru: Британская Территория в Индийском Океане\n    sg: Sêse tî Anglëe na Ngûyämä tî Ênnde\n    sh: Britanski teritorij Indijskog oceana\n    si: බ්‍රිතාන්‍ය ඉන්දීය සාගර ප්‍රාන්තය\n    sk: Britské indickooceánske územie\n    sl: Britanski teritorij v Indijskem oceanu\n    sr: Британска територија Индијског океана\n    sv: Brittiska territoriet i Indiska oceanen\n    sw: Eneo la Uingereza katika Bahari Hindi\n    ta: பிரித்தானிய இந்தியப் பெருங்கடல் மண்டலம்\n    te: బ్రిటిష్ భారతీయ ఓషన్ ప్రాంతం\n    th: บริติชอินเดียนโอเชียนเทร์ริทอรี\n    ti: የብሪታኒያ ህንድ ውቂያኖስ ግዛት\n    to: Potu fonua moana ʻInitia fakapilitānia\n    tr: Britanya Hint Okyanusu Toprakları\n    uk: Британська територія в Індійському океані\n    ur: برطانوی ہندوستانی سمندری خطہ\n    vi: Lãnh thổ Ấn Độ Dương thuộc Anh\n    yo: Orílẹ́ède Etíkun Índíánì ti Ìlú Bírítísì\n    zh: 英属印度洋领地\n    zu: i-British Indian Ocean Territory\n"
  },
  {
    "path": "settings/country-names/iq.yaml",
    "content": "name: \n    default: العراق\n    af: Irak\n    am: ኢራቅ\n    an: Iraq\n    ar: العراق\n    av: ГӀиракъ\n    az: İraq\n    be: Ірак\n    bg: Ирак\n    bn: ইরাক\n    bo: ཡི་ལའ་ཁོ།\n    br: Irak\n    bs: Irak\n    ca: Iraq\n    ce: Ӏиракъ\n    cs: Irák\n    cv: Ирак\n    cy: Irac\n    da: Irak\n    de: Irak\n    dv: ޢިރާޤު\n    el: Ιράκ\n    en: Iraq\n    eo: Irako\n    es: Irak\n    et: Iraak\n    eu: Irak\n    fa: عراق\n    fi: Irak\n    fo: Irak\n    fr: Irak\n    fy: Irak\n    ga: An Iaráic\n    gd: Ioràc\n    gl: Iraq - العراق\n    gu: ઈરાક\n    gv: Yn Earack\n    he: עיראק\n    hi: इराक़\n    hr: Irak\n    ht: Irak\n    hu: Irak\n    hy: Իրաք\n    ia: Irak\n    id: Irak\n    ie: Irak\n    io: Irak\n    is: Írak\n    it: Iraq\n    iu: ᐃᕉᒃ\n    ja: イラク\n    jv: Irak\n    ka: ერაყი\n    ki: Iraq\n    kk: Ирак\n    kl: Iraq\n    kn: ಇರಾಕ್\n    ko: 이라크\n    ku: Iraq\n    kv: Ирак\n    kw: Irak\n    ky: Ирак\n    la: Iracum\n    lb: Irak\n    li: Irak\n    ln: Irak\n    lt: Irakas\n    lv: Irāka\n    mi: Irāki\n    mk: Ирак\n    ml: ഇറാഖ്\n    mn: Ирак\n    mr: इराक\n    ms: Iraq\n    mt: Iraq\n    my: အီရတ်နိုင်ငံ\n    na: Irak\n    ne: ईराक\n    nl: Irak\n    \"no\": Irak\n    nv: Iiwááʼ\n    oc: Iraq\n    or: ଇରାକ\n    os: Ирак\n    pa: ਇਰਾਕ\n    pl: Irak\n    ps: عراق\n    pt: Iraque\n    qu: Iraq\n    ro: Irak\n    ru: Ирак\n    rw: Irake\n    sa: ईराक\n    se: Irak\n    sh: Irak\n    si: ඉරාක ජනරජය\n    sk: Irak\n    sl: Irak\n    so: Ciraaq\n    sq: Iraku\n    sr: Ирак\n    ss: I-Irakhi\n    su: Irak\n    sv: Irak\n    sw: Iraq\n    ta: ஈராக்\n    te: ఇరాక్\n    tg: Ироқ\n    th: ประเทศอิรัก\n    tk: Yrak\n    tl: Irak\n    tr: Irak\n    tt: Гыйрак\n    tw: Irak\n    ug: ئىراق\n    uk: Ірак\n    ur: عراق\n    uz: Iroq\n    vi: Iraq\n    vo: Lirakän\n    wa: Irak\n    wo: Iraak\n    yi: איראק\n    yo: Irak\n    zh: 伊拉克\n    zu: I-Iraki\n"
  },
  {
    "path": "settings/country-names/ir.yaml",
    "content": "name: \n    default: ایران\n    af: Iran\n    am: ፋርስ\n    an: Irán\n    ar: إیران\n    az: İran\n    ba: Иран\n    be: Іран\n    bg: Иран\n    bn: ইরান\n    bo: ཡི་ལང་།\n    br: Iran\n    bs: Iran\n    ca: Iran\n    ce: Иран\n    co: Iranu\n    cs: Írán\n    cy: Iran\n    da: Iran\n    de: Iran\n    dv: އީރާން\n    dz: ཨི་རཱན་\n    el: Ιράν\n    en: Iran\n    eo: Irano\n    es: Irán\n    et: Iraan\n    eu: Iran\n    fa: ایران\n    fi: Iran\n    fo: Iran\n    fr: Iran\n    fy: Iran\n    ga: An Iaráin\n    gd: Ioràn\n    gl: Irán - ایران\n    gn: Irán\n    gu: ઈરાન\n    gv: Yn Eeraan\n    ha: Iran\n    he: איראן\n    hi: ईरान\n    hr: Iran\n    ht: Iran\n    hu: Irán\n    hy: Իրան\n    ia: Iran\n    id: Iran\n    ie: Iran\n    io: Iran\n    is: Íran\n    it: Iran\n    ja: イラン\n    jv: Iran\n    ka: ირანი\n    kk: Иран\n    kl: Iran\n    km: អ៊ីរ៉ង់\n    kn: ಇರಾನ್\n    ko: 이란\n    ks: ایٖران\n    ku: Îran\n    kv: Иран\n    kw: Iran\n    ky: Иран\n    la: Irania\n    lb: Iran\n    li: Iran\n    ln: Iran\n    lt: Iranas\n    lv: Irāna\n    mg: Iran\n    mi: Irāna\n    mk: Иран\n    ml: ഇറാൻ\n    mn: Иран\n    mr: इराण\n    ms: Iran\n    mt: Iran\n    my: အီရန်နိုင်ငံ\n    na: Iran\n    ne: इरान\n    nl: Iran\n    \"no\": Iran\n    nv: Iiwą́ą́\n    oc: Iran\n    or: ଇରାନ\n    os: Иран\n    pa: ਇਰਾਨ\n    pl: Iran\n    ps: ایران\n    pt: Irão\n    qu: Iran\n    rm: Iran\n    ro: Iran\n    ru: Иран\n    rw: Irani\n    sa: ईरान\n    sc: Iran\n    se: Iran\n    sh: Iran\n    si: ඉරානය\n    sk: Irán\n    sl: Iran\n    so: Iiraan\n    sq: Irani\n    sr: Иран\n    ss: I-Irani\n    su: Iran\n    sv: Iran\n    sw: Uajemi\n    ta: ஈரான்\n    te: ఇరాన్\n    tg: Эрон\n    th: ประเทศอิหร่าน\n    tk: Eýran\n    tl: Iran\n    tr: İran\n    tt: Иран\n    tw: Iran\n    ug: ئىران\n    uk: Іран\n    ur: ایران\n    uz: Eron\n    vi: Iran\n    vo: Lirän\n    wa: Iran\n    wo: Iraan\n    yi: איראן\n    yo: Ìránì\n    za: Iran\n    zh: 伊朗\n    zu: I-Irani\n"
  },
  {
    "path": "settings/country-names/is.yaml",
    "content": "name: \n    default: Ísland\n    af: Ysland\n    am: አይስላንድ\n    an: Islandia\n    ar: آيسلندا\n    az: İslandiya\n    ba: Исландия\n    be: Ісландыя\n    bg: Исландия\n    bi: Iceland\n    bm: Aisland\n    bn: আইসল্যান্ড\n    bo: ཨཡིསུ་ལེན་ཌ།\n    br: Island\n    bs: Island\n    ca: Islàndia\n    ce: Исланди\n    co: Islanda\n    cs: Island\n    cu: Исландъ\n    cv: Исланди\n    cy: Gwlad yr Iâ\n    da: Island\n    de: Island\n    dv: އައިސްލަންޑަން\n    dz: ཨའིསི་ལེནཌ་\n    ee: Iceland\n    el: Ισλανδία\n    en: Iceland\n    eo: Islando\n    es: Islandia\n    et: Island\n    eu: Islandia\n    fa: ایسلند\n    ff: Islannda\n    fi: Islanti\n    fo: Ísland\n    fr: Islande\n    fy: Yslân\n    ga: An Íoslainn\n    gd: Innis Tìle\n    gl: Islandia\n    gn: Iylanda\n    gu: આઈસલેંડ\n    gv: Yn Eeslynn\n    he: איסלנד\n    hi: आइसलैण्ड\n    hr: Island\n    ht: Islann\n    hu: Izland\n    hy: Իսլանդիա\n    ia: Islanda\n    id: Islandia\n    ie: Island\n    io: Islando\n    is: Ísland\n    it: Islanda\n    ja: アイスランド\n    jv: Islandia\n    ka: ისლანდია\n    kg: Islande\n    kk: Исландия\n    kl: Islandi\n    km: ប្រទេសអាយឡែន\n    kn: ಐಸ್‍ಲ್ಯಾಂಡ್\n    ko: 아이슬란드\n    ku: Îslenda\n    kv: Исландия\n    kw: Island\n    ky: Исландия\n    la: Islandia\n    lb: Island\n    lg: Isilandi\n    li: Iesland\n    ln: Islandi\n    lo: ອິດສະລັງ\n    lt: Islandija\n    lv: Islande\n    mi: Tiorangi\n    mk: Исланд\n    ml: ഐസ്‌ലാന്റ്\n    mn: Исланд\n    mr: आइसलँड\n    ms: Iceland\n    mt: Iżlanda\n    my: အိုက်စလန်နိုင်ငံ\n    na: Aiterand\n    ne: आइसल्याण्ड\n    nl: IJsland\n    \"no\": Island\n    nv: Tin Bikéyah\n    oc: Islàndia\n    or: ଆଇସଲ୍ୟାଣ୍ଡ\n    os: Исланди\n    pa: ਆਈਸਲੈਂਡ\n    pl: Islandia\n    ps: آيسلېنډ\n    pt: Islândia\n    qu: Islandya\n    rm: Islanda\n    ro: Islanda\n    ru: Исландия\n    rw: Isilande\n    sa: आइसलैंड\n    sc: Islanda\n    se: Islánda\n    sg: Islânde\n    sh: Island\n    si: අයිස්ලන්තය\n    sk: Island\n    sl: Islandija\n    sm: Aiselani\n    so: Island\n    sq: Islanda\n    sr: Исланд\n    ss: Echweni\n    st: Iceland\n    su: Islandia\n    sv: Island\n    sw: Iceland\n    ta: ஐசுலாந்து\n    te: ఐస్‌లాండ్\n    tg: Исландия\n    th: ประเทศไอซ์แลนด์\n    tk: Islandiýa\n    tl: Lupangyelo\n    tr: İzlanda\n    tt: Исландия\n    ug: ئىسلاندىيە\n    uk: Ісландія\n    ur: آئس لینڈ\n    uz: Islandiya\n    vi: Iceland\n    vo: Lisladeän\n    wa: Izlande\n    wo: Islaand\n    yi: איסלאנד\n    yo: Íslándì\n    zh: 冰岛\n    zu: I-Ayisilandi\n"
  },
  {
    "path": "settings/country-names/it.yaml",
    "content": "name: \n    default: Italia\n    ab: Италиа\n    af: Italië\n    ak: Italy\n    am: ጣልያን\n    an: Italia\n    ar: إيطاليا\n    as: ইটালী\n    ay: Italiya\n    az: İtaliya\n    ba: Италия\n    be: Італія\n    bg: Италия\n    bi: Itali\n    bn: ইতালি\n    bo: ཨི་ཏ་ལི།\n    br: Italia\n    bs: Italija\n    ca: Itàlia\n    ce: Итали\n    co: Italia\n    cs: Itálie\n    cu: Италїꙗ\n    cv: Итали\n    cy: Yr Eidal\n    da: Italien\n    de: Italien\n    dv: އިޓަލީވިލާތް\n    dz: ཨྀཊ་ལི་\n    ee: Italy\n    el: Ιταλία\n    en: Italy\n    eo: Italio\n    es: Italia\n    et: Itaalia\n    eu: Italia\n    fa: ایتالیا\n    ff: Italiya\n    fi: Italia\n    fo: Italia\n    fr: Italie\n    fy: Itaalje\n    ga: An Iodáil\n    gd: An Eadailt\n    gl: Italia\n    gn: Itália\n    gu: ઈટલી\n    gv: Yn Iddaal\n    he: איטליה\n    hi: इटली\n    hr: Italija\n    ht: Itali\n    hu: Olaszország\n    hy: Իտալիա\n    ia: Italia\n    id: Italia\n    ie: Italia\n    io: Italia\n    is: Ítalía\n    it: Italia\n    ja: イタリア\n    jv: Italia\n    ka: იტალია\n    kg: Italia\n    ki: Italia\n    kk: Италия\n    kl: Italia\n    km: អ៊ីតាលី\n    kn: ಇಟಲಿ\n    ko: 이탈리아\n    ku: Îtalya\n    kv: Италия\n    kw: Itali\n    ky: Италия\n    la: Italia\n    lb: Italien\n    lg: Yitale\n    li: Italië\n    ln: Italya\n    lo: ອິຕາລີ\n    lt: Italija\n    lv: Itālija\n    mg: Italia\n    mi: Itari\n    mk: Италија\n    ml: ഇറ്റലി\n    mn: Итали\n    mr: इटली\n    ms: Itali\n    mt: Italja\n    my: အီတလီနိုင်ငံ\n    na: Itari\n    ne: इटाली\n    nl: Italië\n    \"no\": Italia\n    nv: Ídelii\n    oc: Itàlia\n    or: ଇଟାଲୀ\n    os: Итали\n    pa: ਇਟਲੀ\n    pl: Włochy\n    ps: اېټاليا\n    pt: Itália\n    qu: Italya\n    rm: Italia\n    ro: Italia\n    ru: Италия\n    rw: Ubutaliyani\n    sa: इटली\n    sc: Itàlia\n    se: Itália\n    sg: Italùii\n    sh: Italija\n    sk: Taliansko\n    sl: Italija\n    sm: Italia\n    so: Talyaaniga\n    sq: Italia\n    sr: Италија\n    ss: INtaliyane\n    su: Italia\n    sv: Italien\n    sw: Italia\n    ta: இத்தாலி\n    te: ఇటలీ\n    tg: Итолиё\n    th: ประเทศอิตาลี\n    tk: Italiýa\n    tl: Italya\n    tr: İtalya\n    tt: Италия\n    tw: Italy\n    ty: ’Itāria\n    ug: ئىتالىيە\n    uk: Італія\n    ur: اطالیہ\n    uz: Italiya\n    ve: Italy\n    vi: Ý\n    vo: Litaliyän\n    wa: Itåleye\n    wo: Itaali\n    yi: איטאליע\n    yo: Itálíà\n    zh: 意大利\n    zu: ITaliya\n"
  },
  {
    "path": "settings/country-names/je.yaml",
    "content": "name: \n    default: Jersey\n    af: Jersey\n    an: Jèrri\n    ar: جيرزي\n    az: Cersi\n    be: Джэрсi\n    bg: Джърси\n    br: Jerzenez\n    bs: Jersey\n    ca: Jersey\n    cs: Jersey\n    cy: Jersey\n    da: Jersey\n    de: Jersey\n    dv: ޖާސޭ\n    el: Υερσέη\n    en: Jersey\n    eo: Ĵerzejo\n    es: Jersey\n    et: Jersey\n    eu: Jersey\n    fa: جرزی\n    fi: Jersey\n    fr: Jersey\n    ga: Geirsí\n    gd: Jersey\n    gl: Illa de Jersey\n    gv: Jersee\n    he: ג'רזי\n    hr: Jersey\n    hu: Jersey\n    hy: Ջերսի\n    id: Jersey\n    io: Jersey\n    is: Jersey\n    it: Isola di Jersey\n    ja: ジャージー\n    jv: Jersey\n    ka: ჯერზი\n    kn: ಜರ್ಸಿ\n    ko: 저지 섬\n    kw: Jersi\n    la: Caesarea Insula\n    li: Jersey\n    lt: Džersis\n    lv: Džērsija\n    mi: Tōrehe\n    mn: Жерси\n    mr: जर्सी\n    ms: Jersey\n    ne: जर्सी\n    nl: Jersey\n    \"no\": Jersey\n    oc: Jersei\n    os: Джерси\n    pa: ਜਰਸੀ\n    pl: Jersey\n    pt: Jersey\n    ro: Insula Jersey\n    ru: Джерси\n    rw: Jersey\n    sh: Jersey\n    sk: Jersey\n    sl: Jersey\n    sq: Jersey\n    sr: Џерзи\n    su: Jersey\n    sv: Jersey\n    sw: Jersey\n    ta: யேர்சி\n    te: జెర్సీ\n    th: เจอร์ซีย์\n    tl: Hersey\n    tr: Jersey\n    tt: Җерси\n    uk: Джерсі\n    ur: جرزی\n    vi: Jersey\n    yo: Jersey\n    zh: 澤西島\n"
  },
  {
    "path": "settings/country-names/jm.yaml",
    "content": "name: \n    default: Jamaica\n    af: Jamaika\n    ar: جامايكا\n    be: Ямайка\n    br: Jamaika\n    cs: Jamajka\n    de: Jamaika\n    el: Ιαμαϊκή\n    en: Jamaica\n    eo: Jamajko\n    fa: جامائیکا\n    fi: Jamaika\n    fr: Jamaïque\n    fy: Jamaika\n    ga: Iamáice\n    gd: Iaimeuca\n    he: ג'מייקה\n    hr: Jamajka\n    hu: Jamaica\n    id: Jamaika\n    io: Jamaika\n    is: Jamaíka\n    it: Giamaica\n    ja: ジャマイカ\n    ku: Camayka\n    la: Iamaica\n    lb: Jamaika\n    lt: Jamaika\n    lv: Jamaika\n    mn: Ямайка\n    nl: Jamaica\n    \"no\": Jamaica\n    oc: Jamaica\n    pl: Jamajka\n    pt: Jamaica\n    ru: Ямайка\n    se: Jamaica\n    sk: Jamajka\n    sl: Jamajka\n    sv: Jamaica\n    ta: ஜமேக்கா\n    th: ประเทศจาเมกา\n    tr: Jamaika\n    uk: Ямайка\n    vo: Camekeän\n    zh: 牙买加\n"
  },
  {
    "path": "settings/country-names/jo.yaml",
    "content": "name: \n    default: الأردن\n    af: Jordanië\n    am: ጆርዳን\n    an: Chordania\n    ar: الأردن\n    az: İordaniya\n    ba: Иордания\n    be: Іарданія\n    bg: Йордания\n    bm: Ordon\n    bn: জর্দান\n    bo: རྗོར་ཌན།\n    br: Jordania\n    bs: Jordan\n    ca: Jordània\n    cs: Jordánsko\n    cv: Иордани\n    cy: Gwlad Iorddonen\n    da: Jordan\n    de: Jordanien\n    dv: އުރުދުން\n    el: Ιορδανία\n    en: Jordan\n    eo: Jordanio\n    es: Jordania\n    et: Jordaania\n    eu: Jordania\n    fa: اردن\n    fi: Jordania\n    fo: Jordan\n    fr: Jordanie\n    fy: Jordaanje\n    ga: An Iordáin\n    gd: Iòrdan\n    gl: Xordania\n    gu: જૉર્ડન\n    gv: Yn Jordaan\n    he: ירדן\n    hi: जॉर्डन\n    hr: Jordan\n    ht: Jòdani\n    hu: Jordánia\n    hy: Հորդանան\n    ia: Jordania\n    id: Yordania\n    ie: Jordania\n    io: Jordania\n    is: Jórdanía\n    it: Giordania\n    ja: ヨルダン\n    jv: Yordania\n    ka: იორდანია\n    kk: Иордания\n    kl: Jordan\n    km: ហ្សកដង់\n    ko: 요르단\n    ks: اردن\n    ku: Urdun\n    kv: Иордания\n    kw: Jordan\n    la: Iordania\n    lb: Jordanien\n    li: Jordanië\n    ln: Zordaní\n    lt: Jordanija\n    lv: Jordānija\n    mi: Hōrano\n    mk: Јордан\n    ml: ജോർദാൻ\n    mn: Йордан\n    mr: जॉर्डन\n    ms: Jordan\n    mt: Ġordan\n    my: ဂျော်ဒန်နိုင်ငံ\n    na: Djordan\n    nl: Jordanië\n    \"no\": Jordan\n    nv: Jóoʼdan\n    oc: Jordania\n    or: ଜୋର୍ଡାନ\n    os: Иордани\n    pa: ਜਾਰਡਨ\n    pl: Jordania\n    ps: اردن\n    pt: Jordânia\n    qu: Hurdanya\n    ro: Iordania\n    ru: Иордания\n    rw: Yorudani\n    sa: जार्डन\n    se: Jordania\n    sh: Jordan\n    sk: Jordánsko\n    sl: Jordanija\n    so: Urdun\n    sq: Jordania\n    sr: Јордан\n    ss: IJoridane\n    su: Yordania\n    sv: Jordanien\n    sw: Yordani\n    ta: ஜோர்தான்\n    te: జోర్డాన్\n    th: ประเทศจอร์แดน\n    tk: Iordaniýa\n    tl: Hordan\n    tr: Ürdün\n    tt: Үрдүн\n    ug: ئىئوردانىيە\n    uk: Йорданія\n    ur: اردن\n    uz: Iordaniya\n    vi: Jordan\n    vo: Yordän\n    wo: Jordaani\n    yi: יארדאניע\n    yo: Jọ́rdánì\n    zh: 约旦/約旦\n"
  },
  {
    "path": "settings/country-names/jp.yaml",
    "content": "name: \n    default: 日本\n    ab: Иапониа\n    af: Japan\n    am: ጃፓን\n    an: Chapón\n    ar: اليابان\n    as: জাপান\n    ay: Nihun\n    az: Yaponiya\n    ba: Япония\n    be: Японія\n    bg: Япония\n    bn: জাপান\n    bo: རི་པིན།\n    br: Japan\n    bs: Japan\n    ca: Japó\n    ce: Япони\n    ch: Chapan\n    cs: Japonsko\n    cu: Ꙗпѡнїꙗ\n    cv: Япони\n    cy: Japan\n    da: Japan\n    de: Japan\n    dv: ޖަޕާނު\n    dz: ཇཱ་པཱན།\n    ee: Japan\n    el: Ιαπωνία\n    en: Japan\n    eo: Japanio\n    es: Japón\n    et: Jaapan\n    eu: Japonia\n    fa: ژاپن\n    fi: Japani\n    fo: Japan\n    fr: Japon\n    fy: Japan\n    ga: An tSeapáin\n    gd: An t-Seapan\n    gl: Xapón\n    gn: Hapõ\n    gu: જાપાન\n    gv: Yn Çhapaan\n    ha: Japan\n    he: יפן\n    hi: जापान\n    hr: Japan\n    ht: Japon\n    hu: Japán\n    hy: Ճապոնիա\n    ia: Japon\n    id: Jepang\n    ie: Japan\n    io: Japonia\n    is: Japan\n    it: Giappone\n    iu: ᓃᑉᐊᓐ\n    ja: 日本\n    jv: Jepang\n    ka: იაპონია\n    ki: Japan\n    kk: Жапония\n    kl: Japani\n    km: ជប៉ុន\n    kn: ಜಪಾನ್\n    ko: 일본\n    ks: जापान\n    ku: Japon\n    kv: Япония\n    kw: Nihon\n    ky: Жапония\n    la: Iaponia\n    lb: Japan\n    li: Japan\n    ln: Zapɔ́\n    lo: ປະເທດຍີ່ປຸ່ນ\n    lt: Japonija\n    lv: Japāna\n    mg: Japana\n    mi: Hapani\n    mk: Јапонија\n    ml: ജപ്പാൻ\n    mn: Япон\n    mo: Жапония\n    mr: जपान\n    ms: Jepun\n    mt: Ġappun\n    my: ဂျပန်နိုင်ငံ\n    na: Djapan\n    ne: जापान\n    nl: Japan\n    \"no\": Japan\n    nv: Binaʼadaałtzózí Dinéʼiʼ Bikéyah\n    oc: Japon\n    om: Jaappaan\n    or: ଜାପାନ\n    os: Япон\n    pa: ਜਪਾਨ\n    pl: Japonia\n    ps: جاپان\n    pt: Japão\n    qu: Nihun\n    rm: Giapun\n    ro: Japonia\n    ru: Япония\n    rw: Ubuyapani\n    sa: सूर्यमूल\n    sc: Giapone\n    sd: جاپان\n    se: Japána\n    sh: Japan\n    si: ජපානය\n    sk: Japonsko\n    sl: Japonska\n    sm: Iapani\n    so: Jabaan\n    sq: Japonia\n    sr: Јапан\n    ss: IJaphani\n    su: Jepang\n    sv: Japan\n    sw: Japani\n    ta: ஜப்பான்\n    te: జపాన్\n    tg: Жопун\n    th: ประเทศญี่ปุ่น\n    ti: ጃፓን\n    tk: Ýaponiýa\n    tl: Hapon\n    tr: Japonya\n    tt: Япония\n    tw: Yapan\n    ty: Tāpōnē\n    ug: ياپونىيە\n    uk: Японія\n    ur: جاپان\n    uz: Yaponiya\n    vi: Nhật Bản\n    vo: Yapän\n    wo: Sapoŋ\n    yi: יאפאן\n    yo: Japan\n    za: Nditbonj\n    zh: 日本\n    zu: IJapani\n"
  },
  {
    "path": "settings/country-names/ke.yaml",
    "content": "name: \n    default: Kenya\n    af: Kenia\n    am: ኬንያ\n    an: Kenia\n    ar: كينيا\n    az: Keniya\n    ba: Кения\n    be: Кенія\n    bg: Кения\n    bm: Kenya\n    bn: কেনিয়া\n    bo: ཁེ་ནི་ཡ།\n    br: Kenya\n    bs: Kenija\n    ca: Kenya\n    ce: Кени\n    cs: Keňa\n    cv: Кени\n    cy: Kenya\n    da: Kenya\n    de: Kenia\n    dv: ކެންޔާ\n    dz: ཀེ་ནི་ཡ་\n    el: Κένυα\n    en: Kenya\n    eo: Kenjo\n    es: Kenia\n    et: Keenia\n    eu: Kenya\n    fa: کنیا\n    ff: Kenya\n    fi: Kenia\n    fo: Kenja\n    fr: Kenya\n    fy: Kenya\n    ga: An Chéinia\n    gd: A' Cheinia\n    gl: Quenia - Kenya\n    gu: કેન્યા\n    gv: Yn Cheinney\n    ha: Kenya\n    he: קניה\n    hi: कीनिया\n    hr: Kenija\n    ht: Kenya\n    hu: Kenya\n    hy: Քենիա\n    ia: Kenya\n    id: Kenya\n    ie: Kenia\n    io: Kenia\n    is: Kenía\n    it: Kenya\n    ja: ケニア\n    jv: Kénya\n    ka: კენია\n    kg: Kenya\n    ki: Kenya\n    kk: Кения\n    kl: Kenya\n    kn: ಕೀನ್ಯಾ\n    ko: 케냐\n    ku: Kenya\n    kw: Kenya\n    la: Kenia\n    lb: Kenia\n    lg: Kenya\n    li: Kenia\n    ln: Kénya\n    lt: Kenija\n    lv: Kenija\n    mg: Kenia\n    mi: Kēnia\n    mk: Кенија\n    ml: കെനിയ\n    mn: Кени\n    mr: केनिया\n    ms: Kenya\n    mt: Kenja\n    my: ကင်ညာနိုင်ငံ\n    na: Keniya\n    nl: Kenia\n    \"no\": Kenya\n    nv: Kénya\n    oc: Kenya\n    om: Keeniyaa\n    or: କେନିଆ\n    os: Кени\n    pa: ਕੀਨੀਆ\n    pl: Kenia\n    ps: کېنيا\n    pt: Quénia\n    qu: Kinya\n    ro: Kenya\n    ru: Кения\n    rw: Kenya\n    sa: केन्या\n    sc: Kènya\n    se: Kenia\n    sg: Kenyäa\n    sh: Kenija\n    sk: Keňa\n    sl: Kenija\n    sn: Kenya\n    so: Kiinya\n    sq: Kenia\n    sr: Кенија\n    ss: IKheniya\n    su: Kénya\n    sv: Kenya\n    sw: Kenya\n    ta: கென்யா\n    te: కెన్యా\n    tg: Кения\n    th: ประเทศเคนยา\n    ti: ኬንያ\n    tk: Keniýa\n    tl: Kenya\n    tr: Kenya\n    ts: Kenya\n    tt: Кения\n    ug: كېنىيە\n    uk: Кенія\n    ur: کینیا\n    uz: Keniya\n    vi: Kenya\n    vo: Kenyän\n    wo: Keeñaa\n    yi: קעניע\n    yo: Kẹ́nyà\n    zh: 肯尼亚\n    zu: IKenya\n"
  },
  {
    "path": "settings/country-names/kg.yaml",
    "content": "name: \n    default: Кыргызстан\n    ab: Ҟырҕызсҭан\n    af: Kirgisië\n    am: ኪርጊዝስታን\n    an: Kirguizistán\n    ar: قرغيزستان\n    az: Qırğızıstan\n    ba: Ҡырғыҙстан\n    be: Кыргызстан\n    bg: Киргизстан\n    bn: কিরগিজিস্তান\n    bo: ཀེ་རེ་གེཛུ་སུཏེན།\n    br: Kirgizstan\n    bs: Kirgistan\n    ca: Kirguizistan\n    ce: Киргизи\n    cs: Kyrgyzstán\n    cv: Киргизи\n    cy: Kyrgyzstan\n    da: Kirgisistan\n    de: Kirgisistan\n    dv: ކިރިގިސްތާން\n    ee: Kyrgyzstan\n    el: Κιργιζία\n    en: Kyrgyzstan\n    eo: Kirgizio\n    es: Kirguistán\n    et: Kõrgõzstan\n    eu: Kirgizistan\n    fa: قرقیزستان\n    fi: Kirgisia\n    fr: Kirghizistan\n    fy: Kirgyzje\n    ga: An Chirgeastáin\n    gd: Cìorgastan\n    gl: Kirguizistán\n    gu: કિર્ગિસ્તાન\n    gv: Yn Chyrgistaan\n    he: קירגיזסטן\n    hi: किर्गिज़स्तान\n    hr: Kirgistan\n    ht: Kirgistan\n    hu: Kirgizisztán\n    hy: Ղրղզստան\n    ia: Kyrgyzistan\n    id: Kirgizstan\n    ie: Kirgizistan\n    io: Kirgizistan\n    is: Kirgisistan\n    it: Kirghizistan\n    ja: キルギス\n    jv: Kirgizstan\n    ka: ყირგიზეთი\n    kk: Қырғызстан\n    km: កៀហ៊្សីស៊ីស្ថាន\n    kn: ಕಿರ್ಗಿಸ್ಥಾನ್\n    ko: 키르기스스탄\n    ks: کرغیزستان\n    ku: Qirgizistan\n    kv: Кыргызстан\n    kw: Pow Kyrgys\n    ky: Кыргызстан\n    la: Chirgisia\n    lb: Kirgisistan\n    li: Kirgizië\n    ln: Kirghizistáni\n    lt: Kirgizija\n    lv: Kirgizstāna\n    mk: Киргистан\n    ml: കിർഗ്ഗിസ്ഥാൻ\n    mn: Кыргызстан\n    mr: किर्गिझस्तान\n    ms: Kyrgyzstan\n    my: ကာဂျစ္စတန်နိုင်ငံ\n    na: Kirgitan\n    nl: Kirgizië\n    \"no\": Kirgisistan\n    nv: Kíígiz Bikéyah\n    oc: Quirguizstan\n    or: କିରଗିଜସ୍ତାନ\n    os: Хъиргъиз\n    pa: ਕਿਰਗਿਜ਼ਸਤਾਨ\n    pl: Kirgistan\n    ps: قرغزستان\n    pt: Quirguistão\n    qu: Kirkisuyu\n    ro: Kârgâzstan\n    ru: Киргизия\n    rw: Kirigizisitani\n    sa: किरगिस्थान\n    sd: ڪِرگزِستانُ\n    se: Kirgisistan\n    sh: Kirgistan\n    sk: Kirgizsko\n    sl: Kirgizistan\n    so: Qargistan\n    sq: Kirgistani\n    sr: Киргистан\n    ss: IKhirigi\n    su: Kirgistan\n    sv: Kirgizistan\n    sw: Kirgizia\n    ta: கிர்கிசுத்தான்\n    te: కిర్గిజిస్తాన్\n    tg: Қирғизистон\n    th: ประเทศคีร์กีซสถาน\n    tk: Gyrgyzystan\n    tl: Kirgistan\n    tr: Kırgızistan\n    tt: Кыргызстан\n    ug: قىرغىزىستان\n    uk: Киргизстан\n    ur: کرغیزستان\n    uz: Qirgʻiziston\n    vi: Kyrgyzstan\n    vo: Kirgistän\n    wo: Kirgistaan\n    yi: קירגיזסטאן\n    yo: Kirgistani\n    zh: 吉尔吉斯斯坦\n"
  },
  {
    "path": "settings/country-names/kh.yaml",
    "content": "name: \n    default: ព្រះរាជាណាចក្រ​កម្ពុជា\n    af: Kambodja\n    am: ካምቦዲያ\n    an: Cambocha\n    ar: كمبوديا\n    az: Kamboca\n    ba: Камбоджа\n    be: Камбоджа\n    bg: Камбоджа\n    bn: কম্বোডিয়া\n    bo: ཁམ་པོ་ཛ།\n    br: Kambodja\n    bs: Kambodža\n    ca: Cambodja\n    ce: Камбоджа\n    cs: Kambodža\n    cv: Камбоджа\n    cy: Cambodia\n    da: Cambodja\n    de: Kambodscha\n    dv: ކެންބޯޑިއާ\n    dz: ཀམ་བོ་ཌི་ཡ་\n    el: Καμπότζη\n    en: Cambodia\n    eo: Kamboĝo\n    es: Camboya\n    et: Kambodža\n    eu: Kanbodia\n    fa: کامبوج\n    fi: Kambodža\n    fo: Kambodja\n    fr: Cambodge\n    fy: Kambodja\n    ga: An Chambóid\n    gd: Cambuidea\n    gl: Camboxa\n    gn: Kamboja\n    gu: કમ્બોડીયા\n    gv: Yn Chamboyd\n    ha: Kambodiya\n    he: קמבודיה\n    hi: कम्बोडिया\n    hr: Kambodža\n    ht: Kanbòdj\n    hu: Kambodzsa\n    hy: Կամբոջա\n    ia: Cambodgia\n    id: Kamboja\n    ie: Cambodja\n    io: Kambodja\n    is: Kambódía\n    it: Cambogia\n    ja: カンボジア\n    jv: Kamboja\n    ka: კამბოჯა\n    kk: Камбоджа\n    km: ព្រះរាជាណាចក្រកម្ពុជា\n    kn: ಕಾಂಬೋಡಿಯ\n    ko: 캄보디아\n    ku: Kamboca\n    kv: Камбоджа\n    kw: Kamboji\n    la: Cambosia\n    lb: Kambodscha\n    li: Cambodja\n    ln: Kamboji\n    lo: ປະເທດກຳປູເຈຍ\n    lt: Kambodža\n    lv: Kambodža\n    mg: Kambodia\n    mi: Kamapōtia\n    mk: Камбоџа\n    ml: കംബോഡിയ\n    mn: Камбож\n    mr: कंबोडिया\n    ms: Kemboja\n    mt: Kambodja\n    my: ကမ္ဘောဒီးယားနိုင်ငံ\n    na: Kambodja\n    nl: Cambodja\n    \"no\": Kambodsja\n    oc: Cambòtja\n    or: କମ୍ବୋଡ଼ିଆ\n    os: Камбоджæ\n    pa: ਕੰਬੋਡੀਆ\n    pl: Kambodża\n    ps: کمبودیا\n    pt: Camboja\n    qu: Kambuya\n    rm: Cambodscha\n    ro: Cambodgia\n    ru: Камбоджа\n    rw: Kambodiya\n    se: Kambodja\n    sh: Kambodža\n    si: කාම්බෝජය\n    sk: Kambodža\n    sl: Kambodža\n    so: Kambodiya\n    sq: Kamboxhia\n    sr: Камбоџа\n    ss: IKhambodiya\n    su: Kamboja\n    sv: Kambodja\n    sw: Kamboja\n    ta: கம்போடியா\n    te: కంబోడియా\n    tg: Камбоҷа\n    th: ประเทศกัมพูชา\n    tk: Kamboçiýa\n    tl: Kamboya\n    tr: Kamboçya\n    tt: Камбоҗа\n    ug: كامبوجا\n    uk: Камбоджа\n    ur: کمبوڈیا\n    uz: Kambodja\n    vi: Campuchia\n    vo: Kambocän\n    wo: Kamboodi\n    yi: קאמבאדיע\n    yo: Kàmbódíà\n    zh: 柬埔寨\n"
  },
  {
    "path": "settings/country-names/ki.yaml",
    "content": "name: \n    default: Kiribati\n    ar: كيريباس\n    be: Кірыбаці\n    br: Kiribati\n    da: Kiribati\n    el: Κιριμπάτι\n    en: Kiribati\n    eo: Kiribato\n    fa: کیریباتی\n    fi: Kiribati\n    fr: Kiribati\n    fy: Kiribaty\n    ga: Cireabaití\n    he: קיריבטי\n    hu: Kiribati\n    is: Kíribatí\n    li: Kiribati-eilen\n    lt: Kiribatis\n    lv: Kiribati\n    mn: Кирибати\n    \"no\": Kiribati\n    pl: Kiribati\n    ru: Кирибати\n    sv: Kiribati\n    th: ประเทศคิริบาส\n    uk: Кірибаті\n    zh: 基里巴斯\n"
  },
  {
    "path": "settings/country-names/km.yaml",
    "content": "name: \n    default: Comores Komori جزر القمر\n    af: Komore\n    ar: جزر القمر\n    br: Komorez\n    ca: Comores\n    cs: Komory\n    cy: Comoros\n    da: Comorerne\n    de: Komoren\n    el: Κομόρες\n    en: Comoros\n    eo: Komoroj\n    es: Comoras\n    et: Komoorid\n    eu: Komoreak\n    fa: اتحاد قمر\n    fi: Komorit\n    fr: Comores\n    fy: de Komoaren\n    ga: Oileáin Chomóra\n    gd: Comòras\n    he: קומורו\n    hr: Komori\n    hu: Comore-szigetek\n    ia: Comoros\n    id: Komoro\n    io: Komori\n    is: Kómoreyjar\n    it: Comore\n    ja: コモロ\n    la: Insulae Comorianae\n    lb: Komoren\n    lt: Komorai\n    lv: Komoru salas\n    mk: Комори\n    mn: Коморын арлууд\n    nb: Komorene\n    nl: Comoren\n    nn: Komorane\n    \"no\": Komorene\n    pl: Komory\n    ps: قمرټاپوګان\n    pt: Comores\n    ru: Коморские острова\n    se: Komorosullot\n    sk: Komory\n    sl: Komori\n    sr: Комори\n    sv: Komorerna\n    ta: கொமொரோசு\n    th: ประเทศคอโมโรส\n    tr: Komorlar\n    ug: كومور ئاراللىرى\n    uk: Коморські Острови\n    ur: اتحاد القمری\n    vi: Comoros\n    vo: Komoruäns\n    zh: 科摩洛\n"
  },
  {
    "path": "settings/country-names/kn.yaml",
    "content": "name: \n    default: Saint Kitts and Nevis\n    af: Sint Kitts en Nevis\n    ar: سانت كيتس ونيفس\n    be: Святы Кітс і Невіс\n    br: Saint Kitts-ha-Nevis\n    ca: Saint Kitts i Nevis\n    cs: Svatý Kryštof a Nevis\n    cy: Saint Kitts a Nevis\n    da: Saint Kitts og Nevis\n    de: St. Kitts und Nevis\n    el: Άγιος Χριστόφορος και Νέβις\n    en: Saint Kitts and Nevis\n    eo: Sankta Kristoforo kaj Neviso\n    es: San Cristóbal y Nieves\n    et: Saint Kitts ja Nevis\n    fa: سنت کیتس و نویس\n    fi: Saint Kitts ja Nevis\n    fr: Saint-Christophe-et-Niévès\n    fy: Sint Kitts en Nevis\n    ga: San Críostóir-Nimheas\n    gd: Naomh Crìstean agus Nibheis\n    he: סנט קיטס ונוויס\n    hr: Sveti Kristofor i Nevis\n    hu: Saint Kitts és Nevis\n    ia: Sancte Christophoro e Nevis\n    id: Saint Kitts dan Nevis\n    io: Santa Kitts e Nevis\n    is: Sankti Kristófer og Nevis\n    it: Saint Kitts e Nevis\n    lb: Saint Kitts a Nevis\n    li: Saint-Kitts\n    lt: Sent Kitsas ir Nevis\n    mk: Свети Кристифер и Невис\n    mn: Сент-Киттс ба Невис\n    nl: Saint Kitts en Nevis\n    \"no\": Saint Kitts og Nevis\n    pl: Saint Kitts i Nevis\n    pt: São Cristóvão e Nevis\n    ru: Сент-Китс и Невис\n    se: Saint Kitts ja Nevis\n    sl: Sveti Krištof in Nevis\n    sv: Saint Kitts och Nevis\n    ta: செயிண்ட் கிட்சும் நெவிசும்\n    th: ประเทศเซนต์คิตส์และเนวิส\n    tr: Saint Kitts ve Nevis\n    uk: Сент-Кіттс і Невіс\n    vi: Saint Kitts và Nevis\n    vo: Sankiteän e Neviseän\n    zh: 圣基茨和尼维斯\n"
  },
  {
    "path": "settings/country-names/kp.yaml",
    "content": "name: \n    default: 조선민주주의인민공화국\n    af: Noord-Korea\n    am: ስሜን ኮርያ\n    an: Coreya d'o Norte\n    ar: كوريا الشمالية\n    as: উত্তৰ কোৰিয়া\n    az: Koreya Xalq Demokratik Respublikası\n    ba: Корея Халыҡ-Демократик Республикаһы\n    be: Карэйская Народна-Дэмакратычная Рэспубліка\n    bg: Северна Корея\n    bh: उत्तर कोरिया\n    bn: উত্তর কোরিয়া\n    bo: བྱང་ཀོ་རི་ཡ།\n    br: Republik Poblel ha Demokratel Korea\n    bs: Sjeverna Koreja\n    ca: Corea del Nord\n    ce: Корейн Халкъан-Демократин Республика\n    cs: Severní Korea\n    cy: Gogledd Corea\n    da: Nordkorea\n    de: Nordkorea\n    dv: އުތުރު ކޮރެއާ\n    dz: བྱང་ཀོ་རི་ཡ་\n    ee: North Korea\n    el: Βόρεια Κορέα\n    en: North Korea\n    eo: Nord-Koreio\n    es: Corea del Norte\n    et: Põhja-Korea\n    eu: Ipar Korea\n    fa: کره شمالی\n    fi: Pohjois-Korea\n    fo: Norðurkorea\n    fr: Corée du Nord\n    fy: Noard-Koreä\n    ga: An Chóiré Thuaidh\n    gd: Coirèa a Tuath\n    gl: Corea do Norte\n    gn: Yvate Koréa\n    gu: ઉત્તર કોરિયા\n    gv: Yn Chorea Twoaie\n    ha: Koriya ta Arewa\n    he: קוריאה הצפונית\n    hi: उत्तर कोरिया\n    hr: Sjeverna Koreja\n    ht: Kore dinò\n    hu: Koreai Népi Demokratikus Köztársaság (Észak-Korea)\n    hy: Կորեայի Ժողովրդա-Դեմոկրատական Հանրապետություն\n    ia: Corea del Nord\n    id: Korea Utara\n    ie: Nord-Korea\n    ik: Nigiq Korea\n    io: Nord-Korea\n    is: Norður-Kórea\n    it: Corea del Nord\n    ja: 朝鮮民主主義人民共和国\n    jv: Koréa Lor\n    ka: კორეის სახალხო დემოკრატიული რესპუბლიკა\n    kg: Hangu ya Node\n    ki: North Korea\n    kk: Корей Халық Демократиялық Республикасы\n    kl: Korea Avannarleq\n    km: កូរ៉េខាងជើង\n    kn: ಉತ್ತರ ಕೊರಿಯಾ\n    ko: 조선민주주의인민공화국\n    ku: Korêya Bakur\n    kv: Корея Войтыр Демократия Республика\n    kw: Korea Gledh\n    ky: Корей Эл-Демократиялык Республикасы\n    la: Res publica popularis democratica Coreana\n    lb: Demokratesch Volleksrepublik Korea\n    li: Noord-Korea\n    ln: Koré ya Nola\n    lo: ປະເທດເກົາຫຼີເໜືອ\n    lt: Šiaurės Korėja\n    lv: Ziemeļkoreja\n    mg: Korea Avaratra\n    mi: Kōrea-ki-te-raki\n    mk: Демократска Народна Република Кореја\n    ml: ഉത്തര കൊറിയ\n    mn: Умард Солонгос\n    mr: उत्तर कोरिया\n    ms: Korea Utara\n    mt: Korea ta' Fuq\n    my: ကိုရီးယား ဒီမိုကရက်တစ် ပြည်သူ့သမ္မတနိုင်ငံ\n    na: Ripubrikit Engame Korea\n    ne: उत्तर कोरिया\n    nl: Noord-Korea\n    \"no\": Nord-Korea\n    nv: Kolíya Bikéyah Náhookǫsjí Siʼánígíí\n    oc: Corèa del Nòrd\n    om: Kooriyaa Kaabaa\n    or: ପୂର୍ବ କୋରିଆ\n    os: Корейы Адæмон Демократон Республикæ\n    pa: ਉੱਤਰੀ ਕੋਰੀਆ\n    pl: Korea Północna\n    ps: شمالي کوريا\n    pt: Coreia do Norte\n    qu: Chusun Runakapaq Runallaqta Republika\n    ro: Coreea de Nord\n    ru: Северная Корея\n    rw: Koreya y’Amajyaruguru\n    sa: उत्तर कोरिया\n    sc: Corea de su Norte\n    sd: اتر ڪوريا\n    se: Davvi-Korea\n    sh: Demokratska Narodna Republika Koreja\n    si: උතුරු කොරියාව\n    sk: Kórejská ľudovodemokratická republika\n    sl: Severna Koreja\n    sn: North Korea\n    so: Waqooyiga Kuuriya\n    sq: Koreja e Veriut\n    sr: Северна Кореја\n    ss: IKhoriya leseNyakatfo\n    su: Koréa Kalér\n    sv: Nordkorea\n    sw: Korea Kaskazini\n    ta: வட கொரியா\n    te: ఉత్తర కొరియా\n    tg: Кореяи Шимолӣ\n    th: ประเทศเกาหลีเหนือ\n    tk: Demirgazyk Koreýa\n    tl: Hilagang Korea\n    tr: Kuzey Kore\n    ts: North Korea\n    tt: Корея Халык Демократик Җөмһүрияте\n    ug: شىمالىي چاۋشيەن\n    uk: Корейська Народно-Демократична Республіка\n    ur: شمالی کوریا\n    uz: Koreya Xalq Demokratik Respublikasi\n    vi: Bắc Triều Tiên\n    vo: Nolüda-Koreyän\n    wo: Kore gu Bëj-gànnaar\n    xh: Coreia do Twoaie\n    yi: צפון קארעע\n    yo: Kòréà Àríwá\n    za: Cauzsenh Minzcujcujyi Yinzminz Gunghozgoz\n    zh: 朝鲜民主主义人民共和国\n"
  },
  {
    "path": "settings/country-names/kr.yaml",
    "content": "name: \n    default: 대한민국\n    af: Suid-Korea\n    ak: Anaafo Koria\n    am: ደቡብ ኮርያ\n    an: Corea d'o Sur\n    ar: كوريا الجنوبية\n    as: দক্ষিণ কোৰিয়া\n    az: Cənubi Koreya\n    ba: Көньяҡ Корея\n    be: Паўднёвая Карэя\n    bg: Южна Корея\n    bi: Saot Koria\n    bn: দক্ষিণ কোরিয়া\n    bo: ལྷོ་ཀོ་རི་ཡ།\n    br: Korea ar Su\n    bs: Južna Koreja\n    ca: Corea del Sud\n    ce: Къилба Корей\n    cs: Jižní Korea\n    cy: De Corea\n    da: Sydkorea\n    de: Südkorea\n    dv: ދެކުނު ކޮރެއާ\n    dz: ལྷོ་ཀོ་རི་ཡ་\n    ee: South Korea\n    el: Νότια Κορέα\n    en: South Korea\n    eo: Sud-Koreio\n    es: Corea del Sur\n    et: Lõuna-Korea\n    eu: Hego Korea\n    fa: کره جنوبی\n    fi: Etelä-Korea\n    fo: Suðurkorea\n    fr: Corée du Sud\n    fy: Súd-Korea\n    ga: An Chóiré Theas\n    gd: Coirea a Deas\n    gl: Corea do Sur\n    gn: Yvykorea\n    gu: દક્ષિણ કોરિયા\n    gv: Yn Chorea Yiass\n    he: קוריאה הדרומית\n    hi: दक्षिण कोरिया\n    hr: Južna Koreja\n    ht: Kore disid\n    hu: Dél-Korea\n    hy: Հարավային Կորեա\n    ia: Corea del Sud\n    id: Korea Selatan\n    ie: Sud-Korea\n    io: Sud-Korea\n    is: Suður-Kórea\n    it: Corea del Sud\n    ja: 大韓民国\n    jv: Koréa Kidul\n    ka: სამხრეთი კორეა\n    ki: South Korea\n    kk: Оңтүстік Корея\n    kl: Korea Kujalleq\n    km: កូរ៉េខាងត្បូង\n    kn: ದಕ್ಷಿಣ ಕೊರಿಯಾ\n    ko: 대한민국\n    ks: दक्षिण कोरिया\n    ku: Korêya Başûr\n    kv: Корея Республика\n    kw: Korea Dhyhow\n    ky: Корея Республикасы\n    la: Corea Meridionalis\n    lb: Südkorea\n    li: Zuud-Korea\n    ln: Kore ya Sidi\n    lo: ປະເທດເກົາຫຼີໃຕ້\n    lt: Pietų Korėja\n    lv: Dienvidkoreja\n    mg: Korea Atsimo\n    mi: Kōrea-ki-te-tonga\n    mk: Република Кореја\n    ml: ദക്ഷിണ കൊറിയ\n    mn: Өмнөд Солонгос\n    mr: दक्षिण कोरिया\n    ms: Korea Selatan\n    mt: Korea t'Isfel\n    my: တောင်ကိုရီးယားနိုင်ငံ\n    na: Ripubrikin Korea\n    ne: दक्षिण कोरिया\n    nl: Zuid-Korea\n    \"no\": Sør-Korea\n    nv: Kolíya Bikéyah Shádiʼááhjí Siʼánígíí\n    oc: Corèa del Sud\n    or: ଦକ୍ଷିଣ କୋରିଆ\n    os: Хуссар Корей\n    pl: Korea Południowa\n    ps: سوېلي کوريا\n    pt: Coreia do Sul\n    qu: Urin Kuriya\n    rm: Corea dal sid\n    ro: Coreea de Sud\n    ru: Республика Корея\n    rw: Koreya y’Amajyepfo\n    sa: दक्षिण कोरिया\n    sc: Corea de su Sud\n    se: Lulli-Korea\n    sg: Korëe tî Mbongo\n    sh: Južna Koreja\n    si: දකුණු කොරියාව\n    sk: Južná Kórea\n    sl: Južna Koreja\n    sm: Kolea i Saute\n    sn: Korea, South\n    so: Koonfur Kuuriya\n    sq: Koreja e Jugut\n    sr: Јужна Кореја\n    ss: IKhoriya leseNingizimu\n    su: Koréa Kidul\n    sv: Sydkorea\n    sw: Korea Kusini\n    ta: தென்கொரியா\n    te: దక్షిణ కొరియా\n    th: ประเทศเกาหลีใต้\n    tk: Günorta Koreýa\n    tl: Timog Korea\n    tr: Güney Kore\n    tt: Көньяк Корея\n    ug: جەنۇبىي چاۋشيەن\n    uk: Південна Корея\n    ur: جنوبی کوریا\n    uz: Janubiy Koreya\n    vi: Hàn Quốc\n    vo: Sulüda-Koreyän\n    wo: Kore gu Bëj-saalum\n    yi: דרום קארעע\n    yo: Kòréà Gúúsù\n    za: Hanzgoz\n    zh: 韩国/南韓\n"
  },
  {
    "path": "settings/country-names/kw.yaml",
    "content": "name: \n    default: الكويت\n    af: Koeweit\n    am: ኩዌት\n    an: Kuwait\n    ar: الكويت\n    az: Küveyt\n    ba: Күвейт\n    be: Кувейт\n    bg: Кувейт\n    bn: কুয়েত\n    bo: ཁུ་ཝི་ཐི།\n    br: Koweit\n    bs: Kuvajt\n    ca: Kuwait\n    ce: Кувейт\n    cs: Kuvajt\n    cv: Кувейт\n    cy: Kuwait\n    da: Kuwait\n    de: Kuwait\n    dv: ކުވެއިތު\n    dz: ཀུ་ཝེཊ་\n    el: Κουβέιτ\n    en: Kuwait\n    eo: Kuvajto\n    es: Kuwait\n    et: Kuveit\n    eu: Kuwait\n    fa: کویت\n    fi: Kuwait\n    fo: Kuveit\n    fr: Koweït\n    fy: Koeweit\n    ga: Cuáit\n    gd: Cubhait\n    gl: Kuwait\n    gu: કુવૈત\n    gv: Yn Choowait\n    he: כווית\n    hi: कुवैत\n    hr: Kuvajt\n    ht: Kowet\n    hu: Kuvait\n    hy: Քուվեյթ\n    ia: Kuwait\n    id: Kuwait\n    ie: Kuwait\n    io: Kuwait\n    is: Kúveit\n    it: Kuwait\n    ja: クウェート\n    jv: Kuwait\n    ka: ქუვეითი\n    kk: Кувейт\n    kl: Kuwait\n    km: គុយវ៉ែត\n    kn: ಕುವೈತ್\n    ko: 쿠웨이트\n    ku: Kuweyt\n    kv: Кувейт\n    kw: Koweyt\n    la: Cuvaitum\n    lb: Kuwait\n    li: Koeweit\n    ln: Koweit\n    lt: Kuveitas\n    lv: Kuveita\n    mk: Кувајт\n    ml: കുവൈറ്റ്\n    mn: Кувейт\n    mr: कुवेत\n    ms: Kuwait\n    my: ကူဝိတ်နိုင်ငံ\n    na: Kuwait\n    ne: कुवेत\n    nl: Koeweit\n    \"no\": Kuwait\n    nv: Kóóweiʼ\n    oc: Kowait\n    or: କୁଏତ\n    os: Кувейт\n    pl: Kuwejt\n    ps: کوېټ\n    pt: Kuwait\n    qu: Kuwait\n    ro: Kuweit\n    ru: Кувейт\n    rw: Koweti\n    sa: कुवैत\n    se: Kuwait\n    sh: Kuvajt\n    sk: Kuvajt\n    sl: Kuvajt\n    so: Kuwayt\n    sq: Kuvajti\n    sr: Кувајт\n    ss: IKhuwathi\n    su: Kuwait\n    sv: Kuwait\n    sw: Kuwait\n    ta: குவைத்\n    te: కువైట్\n    tg: Кувайт\n    th: ประเทศคูเวต\n    tk: Kuweýt\n    tl: Kuwait\n    tr: Kuveyt\n    tt: Күвәйт\n    ug: كۇۋەيت\n    uk: Кувейт\n    ur: کویت\n    uz: Quvayt\n    vi: Kuwait\n    vo: Kovätän\n    wo: Kowet\n    yi: קואווייט\n    yo: Kuwaiti\n    zh: 科威特\n"
  },
  {
    "path": "settings/country-names/ky.yaml",
    "content": "name: \n    default: Cayman Islands\n    af: Kaaimanseilande\n    ak: Kemanfo Islands\n    am: ካይማን ደሴቶች\n    ar: جزر الكايمان\n    az: Kayman Adaları\n    be: Кайманавы астравы\n    bg: Кайманови острови\n    bm: Bama Gun\n    bn: কেম্যান দ্বীপপুঞ্জ\n    bo: ཁེ་མེན་གླིང་ཕྲན།\n    br: Inizi Cayman\n    bs: Kajmanska Ostrva\n    ca: Illes Caiman\n    cs: Kajmanské ostrovy\n    cy: Ynysoedd Cayman\n    da: Caymanøerne\n    de: Kaimaninseln\n    dz: ཁེ་མེན་གླིང་ཚོམ\n    ee: Kayman ƒudomekpowo nutome\n    el: Νήσοι Κέιμαν\n    en: Cayman Islands\n    eo: Kajmana Insularo\n    es: Islas Caimán\n    et: Kaimanisaared\n    eu: Kaiman Uharteak\n    fa: جزایر کایمان\n    ff: Duuɗe Kaymaa\n    fi: Caymansaaret\n    fo: Caymanoyggjarnar\n    fr: Îles Caïmans\n    fy: de Kaaimaneilannen\n    ga: Oileáin Cayman\n    gd: Na h-Eileanan Caimean\n    gl: Illas Caimán\n    gu: કેયમેન આઇલૅંડ્સ\n    gv: Ellanyn Cayman\n    ha: Tsibiran Kaiman\n    he: איי קיימן\n    hi: केमैन द्वीपसमूह\n    hr: Kajmanski Otoci\n    hu: Kajmán-szigetek\n    ia: Insulas de Caiman\n    id: Kepulauan Cayman\n    io: Insuli Kaiman\n    is: Caymaneyjar\n    it: Isole Cayman\n    ja: ケイマン諸島\n    ka: კაიმანის კუნძულები\n    ki: Visiwa vya Kayman\n    km: កោះ​កៃម៉ង់\n    kn: ಕೇಮನ್ ದ್ವೀಪಗಳು\n    ko: 케이맨제도\n    ks: کیمَن جٔزیٖرٕ\n    ku: Giravên Caymanê\n    lb: Kaimaninselen\n    lg: Bizinga ebya Kayimaani\n    ln: Bisanga bya Kayíma\n    lo: ຄາຍແມນ ອິດແລນ\n    lt: Kaimanų salos\n    lv: Kaimanu salas\n    mg: Nosy Kayman\n    mk: Кајмански Острови\n    ml: കേയ്മാൻ ദ്വീപുകൾ\n    mn: Кайманы Арлууд\n    mr: केमन बेटे\n    mt: Gżejjer Kajmani\n    my: ကေမန် ကျွန်းစု\n    nb: Caymanøyene\n    ne: केयमान टापु\n    nl: Kaaimaneilanden\n    nn: Caymanøyane\n    \"no\": Caymanøyene\n    or: କେମ୍ୟାନ୍ ଦ୍ବୀପପୁଞ୍ଜ\n    pl: Kajmany\n    pt: Ilhas Cayman\n    rm: Inslas Cayman\n    rn: Ibirwa bya Keyimani\n    ro: Insulele Cayman\n    ru: Острова Кайман\n    se: Cayman-sullot\n    sg: Âzûâ Ngundë, Kaimäni\n    si: කේමන් දූපත්\n    sk: Kajmanie ostrovy\n    sl: Kajmanski otoki\n    sn: Zvitsuwa zveCayman\n    sr: Кајманска Острва\n    sv: Caymanöarna\n    sw: Visiwa vya Kayman\n    ta: கேமென் தீவுகள்\n    te: కేమాన్ దీవులు\n    th: หมู่เกาะเคย์แมน\n    ti: ካይማን ደሴቶች\n    to: ʻOtumotu Keimeni\n    tr: Kayman Adaları\n    uk: Кайманові острови\n    ur: کیمین آئلینڈز\n    vi: Quần đảo Cayman\n    yo: Orílẹ́ède Etíokun Kámánì\n    zh: 开曼群岛\n    zu: i-Cayman Islands\n"
  },
  {
    "path": "settings/country-names/kz.yaml",
    "content": "name: \n    default: Қазақстан\n    ab: Ҟазаҟсҭан\n    af: Kasakstan\n    am: ካዛክስታን\n    an: Cazaquistán\n    ar: كازاخستان\n    av: Хъазахъистан\n    az: Qazaxıstan\n    ba: Ҡаҙағстан\n    be: Казахстан\n    bg: Казахстан\n    bi: Kazakhstan\n    bn: কাজাখস্তান\n    bo: ཀཛ་ཀིསུ་གཏན།\n    br: Kazakstan\n    bs: Kazahstan\n    ca: Kazakhstan\n    ce: Кхазакхстан\n    cs: Kazachstán\n    cu: Каꙁахстанъ\n    cv: Казахстан\n    cy: Kazakstan\n    da: Kasakhstan\n    de: Kasachstan\n    dv: ކަޒަކިސްތާން\n    ee: Kazakhstan\n    el: Καζακστάν\n    en: Kazakhstan\n    eo: Kazaĥio\n    es: Kazajistán\n    et: Kasahstan\n    eu: Kazakhstan\n    fa: قزاقستان\n    fi: Kazakstan\n    fo: Kasakstan\n    fr: Kazakhstan\n    fy: Kazakstan\n    ga: An Chasacstáin\n    gd: Casachstàn\n    gl: Casaquistán\n    gn: Kazajistán\n    gu: કઝાકિસ્તાન\n    gv: Yn Chassaghstaan\n    he: קזחסטן\n    hi: कज़ाख़िस्तान\n    hr: Kazahstan\n    ht: Kazakstan\n    hu: Kazahsztán\n    hy: Ղազախստան\n    ia: Kazakhstan\n    id: Kazakhstan\n    ie: Kazakstan\n    io: Kazakstan\n    is: Kasakstan\n    it: Kazakistan\n    ja: カザフスタン\n    jv: Kazakhstan\n    ka: ყაზახეთი\n    kg: Kazakhstan\n    kk: Қазақстан\n    kl: Kasakhstani\n    km: កាសាក់ស្ថាន\n    kn: ಕಜಾಕಸ್ಥಾನ್\n    ko: 카자흐스탄\n    ku: Qazaxistan\n    kv: Казахстан\n    kw: Pow Kazagh\n    ky: Казакстан Республикасы\n    la: Kazachstania\n    lb: Kasachstan\n    li: Kazachstan\n    ln: Kazakstáni\n    lt: Kazachstanas\n    lv: Kazahstāna\n    mg: Kazakstàna\n    mi: Katatānga\n    mk: Казахстан\n    ml: ഖസാഖ്സ്ഥാൻ\n    mn: Казахстан\n    mr: कझाकस्तान\n    ms: Kazakhstan\n    mt: Każakistan\n    my: ကာဇက်စတန်နိုင်ငံ\n    na: Kadaketan\n    nl: Kazachstan\n    \"no\": Kasakhstan\n    nv: Kʼazah Bikéyah\n    oc: Cazacstan\n    or: କାଜାଖସ୍ତାନ\n    os: Хъазахстан\n    pa: ਕਜਾਖਸਤਾਨ\n    pl: Kazachstan\n    ps: قزاقستان\n    pt: Cazaquistão\n    qu: Qasaqsuyu\n    rm: Kasachstan\n    ro: Kazahstan\n    ru: Казахстан\n    rw: Kazakisitani\n    sa: कजाकस्थान\n    se: Kazakstan\n    sh: Kazahstan\n    si: කසක්ස්තානය\n    sk: Kazachstan\n    sl: Kazahstan\n    so: Kasakhstan\n    sq: Kazakistani\n    sr: Казахстан\n    ss: IKhazakhi\n    su: Kazastan\n    sv: Kazakhstan\n    sw: Kazakhstan\n    ta: கசக்ஸ்தான்\n    te: కజకస్తాన్\n    tg: Қазоқистон\n    th: ประเทศคาซัคสถาน\n    tk: Gazagystan\n    tl: Kazakhstan\n    tr: Kazakistan\n    tt: Казакъстан\n    ug: قازاقىستان\n    uk: Казахстан\n    ur: قازقستان\n    uz: Qozogʻiston\n    vi: Kazakhstan\n    vo: Kazakistän\n    wo: Kasakistaan\n    yi: קאזאכסטאן\n    yo: Kàsàkstán\n    za: Hahsazgwswhdanj\n    zh: 哈萨克斯坦/哈薩克\n"
  },
  {
    "path": "settings/country-names/la.yaml",
    "content": "name: \n    default: ປະເທດລາວ\n    af: Laos\n    am: ላዎስ\n    an: Laos\n    ar: لاوس\n    az: Laos\n    ba: Лаос\n    be: Лаос\n    bg: Лаос\n    bi: Laos\n    bn: লাওস\n    bo: ལའོ་སུ།\n    br: Laos\n    bs: Laos\n    ca: Laos\n    ce: Лаос\n    cs: Laos\n    cv: Лаос\n    cy: Laos\n    da: Laos\n    de: Laos\n    dv: ލާއޯސް\n    el: Λάος\n    en: Laos\n    eo: Laoso\n    es: Laos\n    et: Laos\n    eu: Laos\n    fa: لائوس\n    fi: Laos\n    fo: Laos\n    fr: Laos\n    fy: Laos\n    ga: Laos\n    gd: Làthos\n    gl: Laos\n    gu: લાઓસ\n    gv: Yn Laos\n    he: לאוס\n    hi: लाओस\n    hr: Laos\n    ht: Laos\n    hu: Laosz\n    hy: Լաոս\n    ia: Laos\n    id: Laos\n    ie: Laos\n    io: Laos\n    is: Laos\n    it: Laos\n    ja: ラオス\n    jv: Laos\n    ka: ლაოსი\n    ki: Laos\n    kk: Лаос\n    km: ឡាវ\n    kn: ಲಾವೋಸ್\n    ko: 라오스\n    ku: Laos\n    kv: Лаос\n    kw: Pow Lao\n    la: Laotia\n    lb: Laos\n    li: Laos\n    ln: Laos\n    lo: ປະເທດລາວ\n    lt: Laosas\n    lv: Laosa\n    mi: Rāoho\n    mk: Лаос\n    ml: ലാവോസ്\n    mn: Лаос\n    mr: लाओस\n    ms: Laos\n    my: လာအိုနိုင်ငံ\n    na: Raot\n    nl: Laos\n    \"no\": Laos\n    nv: Lááʼos\n    oc: Laos\n    or: ଲାଓସ\n    os: Лаос\n    pa: ਲਾਓਸ\n    pl: Laos\n    ps: لاووس\n    pt: Laos\n    qu: Law suyu\n    ro: Laos\n    ru: Лаос\n    rw: Lawosi\n    sa: लाओस\n    se: Laos\n    sh: Laos\n    si: ලාඕසය\n    sk: Laos\n    sl: Laos\n    so: Laos\n    sq: Laosi\n    sr: Лаос\n    ss: ILawoso\n    su: Laos\n    sv: Laos\n    sw: Laos\n    ta: லாவோஸ்\n    te: లావోస్\n    tg: Лаос\n    th: ประเทศลาว\n    tk: Laos\n    tl: Laos\n    tr: Laos\n    tt: Лаос\n    ug: لائوس\n    uk: Лаос\n    ur: لاؤس\n    uz: Laos\n    vi: Lào\n    vo: Laosän\n    wo: Réewum Lawos\n    yo: Láọ̀s\n    za: Lao\n    zh: 老挝/寮國\n"
  },
  {
    "path": "settings/country-names/lb.yaml",
    "content": "name: \n    default: لبنان\n    af: Libanon\n    am: ሊባኖስ\n    an: Liban\n    ar: لبنان\n    az: Livan\n    ba: Ливан\n    be: Ліван\n    bg: Ливан\n    bm: Lubenan\n    bn: লেবানন\n    bo: ལེ་པ་ནོན།\n    br: Liban\n    bs: Liban\n    ca: Líban\n    ce: Ливан\n    cs: Libanon\n    cv: Ливан\n    cy: Libanus\n    da: Libanon\n    de: Libanon\n    dv: ލުބުނާން\n    dz: ལེ་བཱ་ནཱོན་\n    el: Λίβανος\n    en: Lebanon\n    eo: Libano\n    es: Líbano\n    et: Liibanon\n    eu: Libano\n    fa: لبنان\n    fi: Libanon\n    fo: Libanon\n    fr: Liban\n    fy: Libanon\n    ga: An Liobáin\n    gd: Leabanon\n    gl: Líbano\n    gn: Lívano\n    gu: લેબેનાન\n    gv: Yn Livaan\n    he: לבנון\n    hi: लेबनान\n    hr: Libanon\n    ht: Liban\n    hu: Libanon\n    hy: Լիբանան\n    ia: Libano\n    id: Lebanon\n    ie: Libano\n    io: Libano\n    is: Líbanon\n    it: Libano\n    ja: レバノン\n    jv: Libanon\n    ka: ლიბანი\n    kk: Ливан\n    kl: Lebanon\n    km: លីបង់\n    ko: 레바논\n    ku: Libnan\n    kv: Ливан\n    kw: Lebnon\n    ky: Ливан\n    la: Libanus\n    lb: Libanon\n    li: Libanon\n    lt: Libanas\n    lv: Libāna\n    mi: Repanona\n    mk: Либан\n    ml: ലെബനാൻ\n    mn: Ливан\n    mr: लेबेनॉन\n    ms: Lubnan\n    mt: Libanu\n    my: လက်ဘနွန်နိုင်ငံ\n    na: Ribanon\n    nl: Libanon\n    \"no\": Libanon\n    nv: Łíbanoo\n    oc: Liban\n    or: ଲେବନାନ\n    os: Ливан\n    pa: ਲਿਬਨਾਨ\n    pl: Liban\n    ps: لېبنان\n    pt: Líbano\n    qu: Libanu\n    ro: Liban\n    ru: Ливан\n    rw: Libani\n    sa: लेबनान\n    se: Libanon\n    sh: Libanon\n    sk: Libanon\n    sl: Libanon\n    so: Lubnaan\n    sq: Libani\n    sr: Либан\n    ss: ILibhanoni\n    su: Libanon\n    sv: Libanon\n    sw: Lebanoni\n    ta: லெபனான்\n    te: లెబనాన్\n    tg: Лубнон\n    th: ประเทศเลบานอน\n    tk: Liwan\n    tl: Libano\n    tr: Lübnan\n    tt: Ливан\n    ug: لىۋان\n    uk: Ліван\n    ur: لبنان\n    uz: Livan\n    vi: Liban\n    vo: Libanän\n    wo: Libaa\n    yi: לבנון\n    yo: Lẹ́bánọ́nì\n    zh: 黎巴嫩\n"
  },
  {
    "path": "settings/country-names/lc.yaml",
    "content": "name: \n    default: Saint Lucia\n    af: Sint Lucia\n    ar: سانت لوسيا\n    be: Святая Лусія\n    br: Saint Lucia\n    cs: Svatá Lucie\n    da: Saint Lucia\n    de: St. Lucia\n    el: Αγία Λουκία\n    en: Saint Lucia\n    eo: Sankta Lucio\n    es: Santa Lucía\n    fa: سنت لوسیا\n    fi: Saint Lucia\n    fr: Sainte-Lucie\n    fy: Sint Lusia\n    ga: San Lucia\n    gd: Naomh Lùisia\n    he: סנט לוסיה\n    hr: Sveta Lucija\n    hu: Saint Lucia\n    is: Sankti Lúsía\n    it: Santa Lucia\n    ja: セントルシア\n    la: Sancta Lucia\n    li: Santa Lucia\n    lt: Sent Lusija\n    lv: Sentlūsija\n    mn: Сент Люсиа\n    nl: Saint Lucia\n    \"no\": Saint Lucia\n    pl: Saint Lucia\n    pt: Santa Lúcia\n    ru: Сент-Люсия\n    se: Saint Lucia\n    sk: Svätá Lucia\n    sl: Sveta Lucija\n    sv: Saint Lucia\n    ta: செயிண்ட் லூசியா\n    th: ประเทศเซนต์ลูเซีย\n    uk: Сент-Люсія\n    vo: Sanlusiyän\n    zh: 圣卢西亚岛\n"
  },
  {
    "path": "settings/country-names/li.yaml",
    "content": "name: \n    default: Liechtenstein\n    ar: ليختنشتاين\n    be: Лiхтэнштэйн\n    br: Liechtenstein\n    bs: Lihtenštajn\n    cs: Lichtenštejnsko\n    de: Liechtenstein\n    el: Λίχτενσταϊν\n    en: Liechtenstein\n    eo: Liĥtenŝtejno\n    fa: لیختن‌اشتاین\n    fi: Liechtenstein\n    fo: Liktinstein\n    fr: Liechtenstein\n    fy: Lychtenstein\n    ga: Lichtinstéin\n    he: ליכטנשטיין\n    hr: Lihtenštajn\n    hu: Liechtenstein\n    ia: Liechtenstein\n    io: Liechtenstein\n    is: Liechtenstein\n    it: Liechtenstein\n    ja: リヒテンシュタイン\n    ku: Lînxiniştayn\n    la: Lichtenstenum\n    lt: Lichtenšteinas\n    lv: Lihtenšteina\n    mi: Rīkeneteina\n    mk: Лихтенштајн\n    mn: Лихтенштейн\n    nl: Liechtenstein\n    \"no\": Liechtenstein\n    pl: Liechtenstein\n    ru: Лихтенштейн\n    se: Liechtenstein\n    sk: Lichtenštajnsko\n    sl: Lihtenštajn\n    sr: Лихтенштајн\n    sv: Liechtenstein\n    ta: லீக்கின்ஸ்டைன்\n    th: ประเทศลิกเตนสไตน์\n    tr: Lihtenştayn\n    uk: Ліхтенштейн\n    vo: Ligtänstän\n    zh: 列支敦士登\n"
  },
  {
    "path": "settings/country-names/lk.yaml",
    "content": "name: \n    default: ශ්‍රී ලංකාව இலங்கை\n    af: Sri Lanka\n    am: ሽሪ ላንካ\n    an: Sri Lanka\n    ar: سريلانكا\n    az: Şri-Lanka\n    ba: Шри-Ланка\n    be: Шры-Ланка\n    bg: Шри Ланка\n    bn: শ্রীলঙ্কা\n    bo: སེང་ག་གླིང་།\n    br: Sri Lanka\n    bs: Šri Lanka\n    ca: Sri Lanka\n    cs: Šrí Lanka\n    cv: Шри-Ланка\n    cy: Sri Lanka\n    da: Sri Lanka\n    de: Sri Lanka\n    dv: އޮޅުދޫކަރަ\n    dz: ཤྲཱྀ་ལངཀ་\n    el: Σρι Λάνκα\n    en: Sri Lanka\n    eo: Sri-Lanko\n    es: Sri Lanka\n    et: Sri Lanka\n    eu: Sri Lanka\n    fa: سری‌لانکا\n    fi: Sri Lanka\n    fo: Sri Lanka\n    fr: Sri Lanka\n    fy: Sry Lanka\n    ga: Srí Lanca\n    gd: Sri Lanca\n    gl: Sri Lanka - Sri Lankā\n    gu: શ્રીલંકા\n    gv: Sri Lanka\n    he: סרי לנקה\n    hi: श्रीलंका\n    hr: Šri Lanka\n    ht: Srilanka\n    hu: Srí Lanka\n    hy: Շրի Լանկա\n    ia: Sri Lanka\n    id: Sri Lanka\n    ie: Sri Lanka\n    io: Sri Lanka\n    is: Srí Lanka\n    it: Sri Lanka\n    ja: スリランカ\n    jv: Sri Lanka\n    ka: შრი-ლანკა\n    ki: Sri Lanka\n    kk: Шри-Ланка\n    km: ស្រីលង្កា\n    kn: ಶ್ರೀಲಂಕಾ\n    ko: 스리랑카\n    ku: Srî Lanka\n    kv: Шри-Ланка\n    kw: Shri Lanka\n    la: Taprobane\n    lb: Sri Lanka\n    li: Sri Lanka\n    ln: Sri Lanka\n    lt: Šri Lanka\n    lv: Šrilanka\n    mg: Sri Lanka\n    mi: Hīraka\n    mk: Шри Ланка\n    ml: ശ്രീലങ്ക\n    mn: Шри Ланка\n    mr: श्रीलंका\n    ms: Sri Lanka\n    mt: Sri Lanka\n    my: သီရိလင်္ကာနိုင်ငံ\n    na: Sri Lanka\n    ne: श्रीलंका\n    nl: Sri Lanka\n    \"no\": Sri Lanka\n    nv: Swii Lankʼa\n    oc: Sri Lanka\n    om: Sirilaankaa\n    or: ଶ୍ରୀଲଙ୍କା\n    os: Шри-Ланка\n    pa: ਸ੍ਰੀਲੰਕਾ\n    pl: Sri Lanka\n    ps: سریلانکا\n    pt: Seri-Lanca\n    qu: Sri Lanka\n    ro: Sri Lanka\n    ru: Шри-Ланка\n    rw: Siri Lanka\n    sa: श्रीलङ्का\n    se: Sri Lanka\n    sh: Šri Lanka\n    si: ශ්‍රී ලංකාව\n    sk: Srí Lanka\n    sl: Šrilanka\n    sm: Sri Lanka\n    so: Siri Lanka\n    sq: Sri Lanka\n    sr: Шри Ланка\n    ss: Siri Lanka\n    su: Sri Langka\n    sv: Sri Lanka\n    sw: Sri Lanka\n    ta: இலங்கை\n    te: శ్రీలంక\n    tg: Шри-Ланка\n    th: ประเทศศรีลังกา\n    tk: Şri-Lanka\n    tl: Sri Lanka\n    tr: Sri Lanka\n    tt: Шри-Ланка\n    ug: سرىلانكا\n    uk: Шрі-Ланка\n    ur: سری لنکا\n    uz: Shri-Lanka\n    vi: Sri Lanka\n    vo: Sri-Lankän\n    wo: Siri Laanka\n    yi: סרי לאנקא\n    yo: Sri Lanka\n    zh: 斯里蘭卡\n"
  },
  {
    "path": "settings/country-names/lr.yaml",
    "content": "name: \n    default: Liberia\n    af: Liberië\n    am: ላይቤሪያ\n    an: Liberia\n    ar: ليبيريا\n    az: Liberiya\n    ba: Либерия\n    be: Ліберыя\n    bg: Либерия\n    bm: Liberia\n    bn: লাইবেরিয়া\n    bo: ལི་བེ་རི་ཡ།\n    br: Liberia\n    bs: Liberija\n    ca: Libèria\n    ce: Либери\n    cs: Libérie\n    cv: Либери\n    cy: Liberia\n    da: Liberia\n    de: Liberia\n    dv: ލައިބީރިއާ\n    ee: Liberia\n    el: Λιβερία\n    en: Liberia\n    eo: Liberio\n    es: Liberia\n    et: Libeeria\n    eu: Liberia\n    fa: لیبریا\n    ff: Labiriyaa\n    fi: Liberia\n    fo: Liberia\n    fr: Liberia\n    fy: Libearia\n    ga: An Libéir\n    gd: Libèiria\n    gl: Liberia\n    gv: Yn Laibeer\n    he: ליבריה\n    hi: लाइबेरिया\n    hr: Liberija\n    ht: Liberya\n    hu: Libéria\n    hy: Լիբերիա\n    ia: Liberia\n    id: Liberia\n    ie: Liberia\n    io: Liberia\n    is: Líbería\n    it: Liberia\n    ja: リベリア\n    jv: Liberia\n    ka: ლიბერია\n    kg: Liberia\n    kk: Либерия\n    kn: ಲೈಬೀರಿಯ\n    ko: 라이베리아\n    ku: Lîberya\n    kw: Liberi\n    la: Liberia\n    lb: Liberia\n    li: Liberia\n    ln: Liberia\n    lt: Liberija\n    lv: Libērija\n    mi: Raipiri\n    mk: Либерија\n    ml: ലൈബീരിയ\n    mn: Либери\n    mr: लायबेरिया\n    ms: Liberia\n    mt: Liberja\n    my: လိုက်ဘေးရီးယားနိုင်ငံ\n    nl: Liberia\n    \"no\": Liberia\n    oc: Libèria\n    or: ଲାଇବେରିଆ\n    os: Либери\n    pl: Liberia\n    ps: لايبېريا\n    pt: Libéria\n    qu: Libirya\n    rm: Liberia\n    ro: Liberia\n    ru: Либерия\n    rw: Liberiya\n    sa: लायबीरिया\n    sc: Libèria\n    se: Liberia\n    sg: Liberïa\n    sh: Liberija\n    sk: Libéria\n    sl: Liberija\n    sn: Liberia\n    so: Liberia\n    sq: Liberia\n    sr: Либерија\n    ss: ILibheriya\n    st: Liberia\n    su: Liberia\n    sv: Liberia\n    sw: Liberia\n    ta: லைபீரியா\n    tg: Либерия\n    th: ประเทศไลบีเรีย\n    tk: Liberiýa\n    tl: Liberia\n    tr: Liberya\n    ts: Layiberiya\n    tt: Либерия\n    ug: لىبېرىيە\n    uk: Ліберія\n    ur: لائبیریا\n    uz: Liberiya\n    vi: Liberia\n    vo: Liberän\n    wo: Libeeria\n    yi: ליבעריע\n    yo: Làìbéríà\n    zh: 利比里亚\n    zu: ILiberia\n"
  },
  {
    "path": "settings/country-names/ls.yaml",
    "content": "name: \n    default: Lesotho\n    af: Lesotho\n    am: ሌሶቶ\n    an: Lesoto\n    ar: ليسوتو\n    az: Lesoto\n    ba: Лесото\n    be: Лесота\n    bg: Лесото\n    bm: Lesoto\n    bn: লেসোথো\n    bo: ལི་སོ་ཐོ།\n    br: Lesotho\n    bs: Lesoto\n    ca: Lesotho\n    ce: Лесото\n    cs: Lesotho\n    cv: Лесото\n    cy: Lesotho\n    da: Lesotho\n    de: Lesotho\n    dv: ލެސޯތޯ\n    ee: Lesotho\n    el: Λεσότο\n    en: Lesotho\n    eo: Lesoto\n    es: Lesoto\n    et: Lesotho\n    eu: Lesotho\n    fa: لسوتو\n    fi: Lesotho\n    fo: Lesoto\n    fr: Lesotho\n    fy: Lesoto\n    ga: Leosóta\n    gd: Leasoto\n    gl: Lesoto\n    gv: Lesoto\n    he: לסוטו\n    hi: लेसोथो\n    hr: Lesoto\n    ht: Lezoto\n    hu: Lesotho\n    hy: Լեսոթո\n    ia: Lesotho\n    id: Lesotho\n    ie: Lesotho\n    io: Lesotho\n    is: Lesótó\n    it: Lesotho\n    ja: レソト\n    jv: Lesotho\n    ka: ლესოთო\n    kg: Lesotho\n    kk: Лесото\n    kn: ಲೆಸೊಥೊ\n    ko: 레소토\n    ku: Lesoto\n    kw: Lesotho\n    la: Lesothum\n    lb: Lesotho\n    li: Lesotho\n    ln: Lesoto\n    lt: Lesotas\n    lv: Lesoto\n    mi: Teroto\n    mk: Лесото\n    ml: ലെസോത്തോ\n    mn: Лесото\n    mr: लेसोथो\n    ms: Lesotho\n    mt: Lesoto\n    my: လီဆိုသိုနိုင်ငံ\n    na: Resoto\n    nl: Lesotho\n    \"no\": Lesotho\n    nv: Sotho Dineʼé Bikéyah\n    oc: Lesotho\n    or: ଲିସୁଟୁ\n    os: Лесото\n    pa: ਲਿਸੋਥੋ\n    pl: Lesotho\n    pt: Lesoto\n    qu: Suthusuyu\n    ro: Lesotho\n    ru: Лесото\n    rw: Lesoto\n    sa: लेसोथो\n    se: Lesotho\n    sg: Lesôtho\n    sh: Lesoto\n    sk: Lesotho\n    sl: Lesoto\n    sn: Lesotho\n    so: Lesotho\n    sq: Lesoto\n    sr: Лесото\n    ss: ÉLusûtfu\n    st: Lesotho\n    su: Lésotho\n    sv: Lesotho\n    sw: Lesotho\n    ta: லெசோத்தோ\n    tg: Лесото\n    th: ประเทศเลโซโท\n    tk: Lesoto\n    tl: Lesoto\n    tn: Lesotho\n    tr: Lesotho\n    ts: Lesotho\n    tt: Лесото\n    ug: لېسوتو\n    uk: Лесото\n    ur: لیسوتھو\n    uz: Lesoto\n    ve: Li-Sotho\n    vi: Lesotho\n    vo: Lesotän\n    wo: Lesoto\n    yi: לעסאטא\n    yo: Lèsóthò\n    zh: 莱索托/賴索托\n    zu: OSotho\n"
  },
  {
    "path": "settings/country-names/lt.yaml",
    "content": "name: \n    default: Lietuva\n    ab: Литва\n    af: Litaue\n    ak: Lituania\n    am: ሊትዌኒያ\n    an: Lituania\n    ar: ليتوانيا\n    ay: Lituaña\n    az: Litva\n    ba: Литва\n    be: Літва\n    bg: Литва\n    bi: Litwania\n    bn: লিথুয়ানিয়া\n    bo: ལི་ཐུ་ཨེ་ནི་ཡ།\n    br: Lituania\n    bs: Litvanija\n    ca: Lituània\n    ce: Литва\n    ch: Lituania\n    co: Lituania\n    cs: Litva\n    cu: Литъва\n    cv: Литва\n    cy: Lithwania\n    da: Litauen\n    de: Litauen\n    dv: ލިތުއޭނިއާ\n    dz: ལི་ཐུ་ནི་ཡ།\n    ee: Lithuania\n    el: Λιθουανία\n    en: Lithuania\n    eo: Litovio\n    es: Lituania\n    et: Leedu\n    eu: Lituania\n    fa: لیتوانی\n    ff: Lituwaniya\n    fi: Liettua\n    fj: Lituani\n    fo: Litava\n    fr: Lituanie\n    fy: Litouwen\n    ga: An Liotuáin\n    gd: Liotuàinia\n    gl: Lituania - Lietuva\n    gn: Lituaña\n    gu: લિથુઆનિયા\n    gv: Yn Litaan\n    he: ליטא\n    hi: लिथुआनिया\n    hr: Litva\n    ht: Lityani\n    hu: Litvánia\n    hy: Լիտվա\n    ia: Lituania\n    id: Lituania\n    ie: Lituania\n    io: Lituania\n    is: Litháen\n    it: Lituania\n    iu: ᓕᐋᑐᕙ\n    ja: リトアニア\n    jv: Lituania\n    ka: ლიტვა\n    kg: Lietuva\n    ki: Lithuania\n    kk: Литва\n    kl: Litaueni\n    ko: 리투아니아\n    ku: Lîtvanya\n    kv: Литва\n    kw: Lithouani\n    ky: Литва\n    la: Lituania\n    lb: Litauen\n    lg: Lithueenia\n    li: Litauwe\n    ln: Litwani\n    lt: Lietuva\n    lv: Lietuva\n    mg: Litoania\n    mi: Rituānia\n    mk: Литванија\n    ml: ലിത്വാനിയ\n    mn: Литва\n    mr: लिथुएनिया\n    ms: Lithuania\n    mt: Litwanja\n    my: လစ်သူယေးနီးယားနိုင်ငံ\n    na: Rituainiya\n    ne: लिथुआनिया\n    nl: Litouwen\n    \"no\": Litauen\n    nv: Łitʼoowę́ęya\n    ny: Lithuania\n    oc: Lituània\n    or: ଲିଥୁଆନିଆ\n    os: Литва\n    pl: Litwa\n    ps: لېتوانيا\n    pt: Lituânia\n    qu: Lituwa\n    rm: Lituania\n    rn: Lituania\n    ro: Lituania\n    ru: Литва\n    rw: Lituwaniya\n    sa: लेतुवा\n    sc: Lituània\n    se: Lietuva\n    sg: Lituanïi\n    sh: Litvanija\n    sk: Litva\n    sl: Litva\n    so: Lithuaniya\n    sq: Lituania\n    sr: Литванија\n    ss: Lithuwani\n    st: Lituania\n    su: Lituania\n    sv: Litauen\n    sw: Lituanya\n    ta: லித்துவேனியா\n    te: లిథువేనియా\n    tg: Литва\n    th: ประเทศลิทัวเนีย\n    tk: Litwa\n    tl: Litwaniya\n    tr: Litvanya\n    ts: Lithuania\n    tt: Литва\n    ug: لىتۋا\n    uk: Литва\n    ur: لتھووینیا\n    uz: Litva\n    ve: Lituania\n    vi: Litva\n    vo: Lietuvän\n    wa: Litwaneye\n    wo: Lituwaani\n    yi: ליטע\n    yo: Lituéníà\n    zh: 立陶宛\n    zu: ILithuwaniya\n"
  },
  {
    "path": "settings/country-names/lu.yaml",
    "content": "name: \n    default: Lëtzebuerg\n    af: Luxemburg\n    am: ሉክሰምበርግ\n    an: Luxemburgo\n    ar: لوكسمبورغ\n    az: Lüksemburq\n    ba: Люксембург\n    be: Люксембург\n    bg: Люксембург\n    bi: Luxembourg\n    bn: লুক্সেমবুর্গ\n    bo: ལུ་སེམ་བའུརག\n    br: Luksembourg\n    bs: Luksemburg\n    ca: Luxemburg\n    ce: Люксембург\n    co: Lussemburgu\n    cs: Lucembursko\n    cu: Люѯємбоургъ\n    cv: Люксембург\n    cy: Lwcsembwrg\n    da: Luxembourg\n    de: Luxemburg\n    ee: Luxembourg\n    el: Λουξεμβούργο\n    en: Luxembourg\n    eo: Luksemburgio\n    es: Luxemburgo\n    et: Luksemburg\n    eu: Luxenburgo\n    fa: لوکزامبورگ\n    fi: Luxemburg\n    fo: Luksemburg\n    fr: Luxembourg\n    fy: Lúksemboarch\n    ga: Lucsamburg\n    gd: Lucsamburg\n    gl: Luxemburgo\n    gn: Luxemburgo\n    gu: લક્ઝેમ્બર્ગ\n    gv: Lucsemburg\n    he: לוקסמבורג\n    hi: लक्ज़मबर्ग\n    hr: Luksemburg\n    ht: Liksanbou\n    hu: Luxemburg\n    hy: Լյուքսեմբուրգ\n    ia: Luxemburg\n    id: Luksemburg\n    ie: Luxemburgia\n    io: Luxemburgia\n    is: Lúxemborg\n    it: Lussemburgo\n    ja: ルクセンブルク\n    jv: Luksemburg\n    ka: ლუქსემბურგი\n    kg: Luxembourg\n    kk: Люксембург\n    kl: Luxembourg\n    ko: 룩셈부르크\n    ku: Lûksembûrg\n    kv: Люксембург\n    kw: Lushaborg\n    ky: Люксембург\n    la: Luxemburgum\n    lb: Lëtzebuerg\n    li: Luxembörg\n    ln: Luksamburg\n    lt: Liuksemburgas\n    lv: Luksemburga\n    mg: Loksemborga\n    mi: Rakapuō\n    mk: Луксембург\n    ml: ലക്സംബർഗ്\n    mn: Люксембург\n    mr: लक्झेंबर्ग\n    ms: Luxembourg\n    mt: Lussemburgu\n    my: လူဇင်ဘတ်နိုင်ငံ\n    na: Ruketemburg\n    ne: लक्जेम्बर्ग\n    nl: Luxemburg\n    \"no\": Luxembourg\n    nv: Látsębooʼ\n    oc: Luxemborg\n    or: ଲକ୍ସମବର୍ଗ\n    os: Люксембург\n    pa: ਲਕਸਮਬਰਗ\n    pl: Luksemburg\n    ps: لوګزامبورګ\n    pt: Luxemburgo\n    qu: Luksimbur\n    rm: Luxemburg\n    ro: Luxemburg\n    ru: Люксембург\n    rw: Lugizamburu\n    sa: लक्सम्बर्ग\n    sc: Lussemburgu\n    se: Luxemburg\n    sh: Luksemburg\n    sk: Luxembursko\n    sl: Luksemburg\n    so: Luksemburg\n    sq: Luksemburgu\n    sr: Луксембург\n    ss: Lusembogu\n    su: Luksemburg\n    sv: Luxemburg\n    sw: Luxemburg\n    ta: லக்சம்பர்க்\n    tg: Люксембург\n    th: ประเทศลักเซมเบิร์ก\n    tk: Lýuksemburg\n    tl: Luxembourg\n    tr: Lüksemburg\n    tt: Люксембург\n    ug: ليۇكسېمبۇرگ\n    uk: Люксембург\n    ur: لکسمبرگ\n    uz: Luksemburg\n    vi: Luxembourg\n    vo: Luxämburgän\n    wa: Grande-Dutcheye do Lussimbork\n    wo: Luksambuur\n    yi: לוקסעמבורג\n    yo: Lúksẹ́mbọ̀rg\n    zh: 盧森堡\n"
  },
  {
    "path": "settings/country-names/lv.yaml",
    "content": "name: \n    default: Latvija\n    ab: Латвиа\n    af: Letland\n    ak: Latvia\n    am: ላትቪያ\n    an: Letonia\n    ar: لاتفيا\n    av: Латвия\n    az: Latviya\n    ba: Латвия\n    be: Латвія\n    bg: Латвия\n    bh: लैटविया\n    bi: Latvia\n    bn: লাতভিয়া\n    bo: ལ་ཊ་ཝིཡ།\n    br: Latvia\n    bs: Latvija\n    ca: Letònia\n    ce: Латви\n    ch: Letonia\n    co: Lettonia\n    cs: Lotyšsko\n    cu: Латвїꙗ\n    cv: Латви\n    cy: Latfia\n    da: Letland\n    de: Lettland\n    dv: ލެޓުވިއާ\n    dz: ལེཊི་བི་ཡ།\n    ee: Latvia\n    el: Λετονία\n    en: Latvia\n    eo: Latvio\n    es: Letonia\n    et: Läti\n    eu: Letonia\n    fa: لتونی\n    ff: Latvia\n    fi: Latvia\n    fo: Lettland\n    fr: Lettonie\n    fy: Letlân\n    ga: An Laitvia\n    gd: An Laitbhe\n    gl: Letonia\n    gn: Letoña\n    gu: લાટવિયા\n    gv: Yn Latvey\n    ha: Laitfiya\n    he: לטביה\n    hi: लातविया\n    hr: Latvija\n    ht: Letoni\n    hu: Lettország\n    hy: Լատվիա\n    ia: Latvia\n    id: Latvia\n    ie: Latvia\n    ig: Latvia\n    io: Latvia\n    is: Lettland\n    it: Lettonia\n    ja: ラトビア\n    jv: Latvia\n    ka: ლატვია\n    kg: Latvia\n    kk: Латвия\n    kl: Letlandi\n    kn: ಲಾಟ್ವಿಯ\n    ko: 라트비아\n    ku: Letonya\n    kv: Латвия\n    kw: Latvi\n    ky: Латвия\n    la: Lettonia\n    lb: Lettland\n    lg: Latvia\n    li: Letland\n    ln: Letoni\n    lo: ປະເທດລັດເວຍ\n    lt: Latvija\n    lv: Latvija\n    mg: Latvia\n    mi: Rāwhia\n    mk: Летонија\n    ml: ലാത്‌വിയ\n    mn: Латви\n    mr: लात्व्हिया\n    ms: Latvia\n    mt: Latvja\n    my: လတ်ဗီယာနိုင်ငံ\n    na: Ratebiya\n    ne: लात्भिया\n    nl: Letland\n    \"no\": Latvia\n    nv: Létbiiya\n    oc: Letònia\n    om: Laativiyaa\n    or: ଲାଟଭିଆ\n    os: Латви\n    pa: ਲਾਤਵੀਆ\n    pi: लाट्विया\n    pl: Łotwa\n    pt: Letónia\n    qu: Litunya\n    rm: Lettonia\n    ro: Letonia\n    ru: Латвия\n    rw: Lativiya\n    sa: लाट्विया\n    sc: Lettonia\n    se: Latvia\n    sh: Letonija\n    si: ලැට්වියාව\n    sk: Lotyšsko\n    sl: Latvija\n    sm: Lativia\n    sn: Latvia\n    so: Latfiya\n    sq: Letonia\n    sr: Летонија\n    ss: ILathiviya\n    st: Latvia\n    su: Latvia\n    sv: Lettland\n    sw: Latvia\n    ta: லாத்வியா\n    te: లాట్వియా\n    tg: Латвия\n    th: ประเทศลัตเวีย\n    tk: Latwiýa\n    tl: Latbiya\n    tr: Letonya\n    ts: Latvia\n    tt: Латвия\n    tw: Latvia\n    ug: لاتۋىيە\n    uk: Латвія\n    ur: لٹویا\n    uz: Latviya\n    vi: Latvia\n    vo: Latviyän\n    wa: Letoneye\n    wo: Letóoni\n    yi: לעטלאנד\n    yo: Látfíà\n    za: Latvia\n    zh: 拉脫維亞\n    zu: ILatviya\n"
  },
  {
    "path": "settings/country-names/ly.yaml",
    "content": "name: \n    default: ليبيا\n    af: Libië\n    am: ሊቢያ\n    an: Libia\n    ar: ليبيا\n    az: Liviya\n    ba: Ливия\n    be: Лівія\n    bg: Либия\n    bm: Libya\n    bn: লিবিয়া\n    bo: ལི་པི་ཡ།\n    br: Libia\n    bs: Libija\n    ca: Líbia\n    ce: Ливи\n    cs: Libye\n    cv: Ливи\n    cy: Libya\n    da: Libyen\n    de: Libyen\n    dv: ލީބިޔާ\n    ee: Libya\n    el: Λιβύη\n    en: Libya\n    eo: Libio\n    es: Libia\n    et: Liibüa\n    eu: Libia\n    fa: لیبی\n    fi: Libya\n    fo: Libya\n    fr: Libye\n    fy: Lybje\n    ga: An Libia\n    gd: Libia\n    gl: Libia\n    gn: Livia\n    gv: Yn Leeb\n    ha: Libya\n    he: לוב\n    hi: लीबिया\n    hr: Libija\n    ht: Libi\n    hu: Líbia\n    hy: Լիբիա\n    ia: Libya\n    id: Libya\n    ie: Libya\n    io: Libia\n    is: Líbýa\n    it: Libia\n    ja: リビア\n    jv: Libya\n    ka: ლიბია\n    kg: Libia\n    kk: Ливия\n    kl: Libya\n    kn: ಲಿಬಿಯಾ\n    ko: 리비아\n    ks: لِبیا\n    ku: Lîbya\n    kw: Libi\n    ky: Ливия\n    la: Libya\n    lb: Libyen\n    li: Libië\n    ln: Libîya\n    lt: Libija\n    lv: Lībija\n    mg: Libia\n    mi: Rīpia\n    mk: Либија\n    ml: ലിബിയ\n    mn: Ливи\n    mr: लीबिया\n    ms: Libya\n    mt: Libja\n    my: လစ်ဗျားနိုင်ငံ\n    ne: लिबिया\n    nl: Libië\n    \"no\": Libya\n    nv: Łíbya\n    oc: Libia\n    or: ଲିବିଆ\n    os: Ливи\n    pa: ਲੀਬੀਆ\n    pl: Libia\n    ps: لېبيا\n    pt: Líbia\n    qu: Libya\n    ro: Libia\n    ru: Ливия\n    rw: Libiya\n    sa: लिबिया\n    sc: Lìbia\n    se: Libya\n    sg: Libïi\n    sh: Libija\n    si: ලිබියාව\n    sk: Líbya\n    sl: Libija\n    sm: Libya\n    sn: Libya\n    so: Libiya\n    sq: Libia\n    sr: Либија\n    ss: ILibhiya\n    su: Libya\n    sv: Libyen\n    sw: Libya\n    ta: லிபியா\n    te: లిబియా\n    tg: Либия\n    th: ประเทศลิเบีย\n    ti: ሊቢያ\n    tk: Liwiýa\n    tl: Libya\n    tr: Libya\n    ts: Libiya\n    tt: Ливия\n    ug: لىۋىيە\n    uk: Лівія\n    ur: لیبیا\n    uz: Liviya\n    vi: Libya\n    vo: Lübän\n    wa: Libeye\n    wo: Libi\n    yi: ליביע\n    yo: Líbyà\n    zh: 利比亚\n    zu: ILibiya\n"
  },
  {
    "path": "settings/country-names/ma.yaml",
    "content": "name: \n    default: Maroc ⵍⵎⵖⵔⵉⴱ المغرب\n    af: Marokko\n    am: ሞሮኮ\n    an: Marruecos\n    ar: المغرب\n    az: Mərakeş\n    ba: Марокко\n    be: Марока\n    bg: Мароко\n    bm: Maroko\n    bn: মরোক্কো\n    bo: མོ་རོ་ཁོ།\n    br: Maroko\n    bs: Maroko\n    ca: Marroc\n    ce: Марокко\n    cs: Maroko\n    cv: Марокко\n    cy: Moroco\n    da: Marokko\n    de: Marokko\n    dv: މައުރިބު\n    el: Μαρόκο\n    en: Morocco\n    eo: Maroko\n    es: Marruecos\n    et: Maroko\n    eu: Maroko\n    fa: مراکش\n    fi: Marokko\n    fo: Marokko\n    fr: Maroc\n    fy: Marokko\n    ga: Maracó\n    gd: Maroco\n    gl: Marrocos\n    gv: Yn Varoc\n    he: מרוקו\n    hi: मोरक्को\n    hr: Maroko\n    ht: Mawòk\n    hu: Marokkó\n    hy: Մարոկկո\n    ia: Marocco\n    id: Maroko\n    ie: Morocco\n    io: Maroko\n    is: Marokkó\n    it: Marocco\n    ja: モロッコ\n    jv: Maroko\n    ka: მაროკო\n    kg: Maroko\n    kk: Мағрибия\n    kn: ಮೊರಾಕೊ\n    ko: 모로코\n    ks: मोराको\n    ku: Maroko\n    kw: Marokk\n    ky: Марокко\n    la: Marocum\n    lb: Marokko\n    li: Marokko\n    ln: Marɔkɛ\n    lt: Marokas\n    lv: Maroka\n    mg: Marôka\n    mi: Marako\n    mk: Мароко\n    ml: മൊറോക്കൊ\n    mn: Марокко\n    mr: मोरोक्को\n    ms: Maghribi\n    mt: Marokk\n    my: မော်ရိုကိုနိုင်ငံ\n    nl: Marokko\n    \"no\": Marokko\n    nv: Moroko\n    oc: Marròc\n    or: ମୋରୋକୋ\n    os: Марокко\n    pa: ਮੋਰਾਕੋ\n    pl: Maroko\n    ps: مراکش\n    pt: Marrocos\n    qu: Maruku\n    ro: Maroc\n    ru: Марокко\n    rw: Maroke\n    sa: मोराको\n    sc: Marocco\n    se: Marokko\n    sg: Marôko\n    sh: Maroko\n    sk: Maroko\n    sl: Maroko\n    sn: Morocco\n    so: Marooko\n    sq: Maroku\n    sr: Мароко\n    ss: IMorokho\n    su: Maroko\n    sv: Marocko\n    sw: Moroko\n    ta: மொரோக்கோ\n    te: మొరాకో\n    tg: Марокаш\n    th: ประเทศโมร็อกโก\n    ti: ሞሮኮ\n    tk: Marokko\n    tl: Maruekos\n    tr: Fas\n    ts: Morocco\n    tt: Марокко\n    ug: ماراكەش\n    uk: Марокко\n    ur: مراکش\n    uz: Marokash\n    vi: Maroc\n    vo: Marokän\n    wa: Marok\n    wo: Marok\n    yi: מאראקא\n    yo: Mòrókò\n    zh: 摩洛哥\n    zu: IMorokho\n"
  },
  {
    "path": "settings/country-names/mc.yaml",
    "content": "name: \n    default: Monaco\n    af: Monaco\n    ak: Mɔnako\n    am: ሞናኮ\n    an: Múnegu\n    ar: موناكو\n    az: Monako\n    ba: Монако\n    be: Манака\n    bg: Монако\n    bi: Monaco\n    bm: Monako\n    bn: মোনাকো\n    bo: མོ་ན་ཁོ།\n    br: Monako\n    bs: Monako\n    ca: Mònaco\n    ce: Монако\n    cs: Monako\n    cu: Монако\n    cv: Монако\n    cy: Monaco\n    da: Monaco\n    de: Monaco\n    dv: މޮނާކޯ\n    dz: མོ་ན་ཀོ\n    ee: Monaco\n    el: Μονακό\n    en: Monaco\n    eo: Monako\n    es: Mónaco\n    et: Monaco\n    eu: Monako\n    fa: موناکو\n    ff: Monaakoo\n    fi: Monaco\n    fo: Monako\n    fr: Monaco\n    fy: Monako\n    ga: Monacó\n    gd: Monaco\n    gl: Mónaco\n    gu: મોનૅકો\n    gv: Monaco\n    ha: Monako\n    he: מונקו\n    hi: मोनैको\n    hr: Monako\n    ht: Monako\n    hu: Monaco\n    hy: Մոնակո\n    ia: Monaco\n    id: Monako\n    ie: Mónaco\n    io: Monako\n    is: Mónakó\n    it: Monaco\n    ja: モナコ\n    jv: Monako\n    ka: მონაკო\n    kg: Monako\n    ki: Monako\n    kk: Монако\n    kl: Monaco\n    km: ម៉ូណាកូ\n    kn: ಮೊನಾಕೊ\n    ko: 모나코\n    ks: موناکو\n    ku: Monako\n    kv: Монако\n    kw: Monako\n    la: Monoecus\n    lb: Monaco\n    lg: Monako\n    li: Monaco\n    ln: Monaco\n    lo: ໂມນາໂກ\n    lt: Monakas\n    lv: Monako\n    mg: Mônakô\n    mi: Manako\n    mk: Монако\n    ml: മൊണാക്കോ\n    mn: Монако\n    mr: मोनॅको\n    ms: Monaco\n    mt: Monako\n    my: နိုင်ငံ\n    na: Monako\n    ne: मोनाको\n    nl: Monaco\n    \"no\": Monaco\n    oc: Mónegue\n    or: ମୋନାକୋ\n    os: Монако\n    pa: ਮੋਨਾਕੋ\n    pl: Monako\n    pt: Mónaco\n    qu: Munaku\n    rm: Monaco\n    rn: Monako\n    ro: Monaco\n    ru: Монако\n    rw: Monako\n    sa: मोनाको\n    se: Monaco\n    sg: Monaköo\n    sh: Monako\n    si: මොනාකෝව\n    sk: Monako\n    sl: Monako\n    so: Monako\n    sq: Monako\n    sr: Монако\n    ss: IMonakho\n    su: Monako\n    sv: Monaco\n    sw: Monako\n    ta: மொனாக்கோ\n    te: మొనాకో\n    tg: Монако\n    th: ประเทศโมนาโก\n    ti: ሞናኮ\n    tk: Monako\n    tl: Monako\n    to: Manako\n    tr: Monako\n    tt: Монако\n    tw: Monako\n    ug: موناكو\n    uk: Монако\n    ur: موناکو\n    uz: Monako\n    vi: Monaco\n    vo: Monakän\n    wo: Monaako\n    yi: מאנאקא\n    yo: Mónakò\n    zh: 摩纳哥\n    zu: i-Monaco\n"
  },
  {
    "path": "settings/country-names/md.yaml",
    "content": "name: \n    default: Moldova\n    ab: Молдова\n    af: Moldowa\n    am: ሞልዶቫ\n    an: Moldavia\n    ar: مولدوفا\n    az: Moldova\n    ba: Молдова\n    be: Малдова\n    bg: Молдова\n    bi: Moldova\n    bn: মলদোভা\n    bo: མོལ་དོ་ཝ།\n    br: Moldova\n    bs: Moldavija\n    ca: Moldàvia\n    ce: Молдави\n    co: Moldavia\n    cs: Moldavsko\n    cu: Молдова\n    cv: Молдави\n    cy: Moldofa\n    da: Moldova\n    de: Moldawien\n    dv: މޮލްޑޯވާ\n    ee: Moldova\n    el: Μολδαβία\n    en: Moldova\n    eo: Moldavio\n    es: Moldavia\n    et: Moldova\n    eu: Moldavia\n    fa: مولداوی\n    fi: Moldova\n    fo: Moldova\n    fr: Moldavie\n    fy: Moldaavje\n    ga: An Mholdóiv\n    gd: Moldàibhia\n    gl: Moldavia\n    gu: મોલ્દોવા\n    gv: Moldova\n    he: מולדובה\n    hi: मॉल्डोवा\n    hr: Moldova\n    ht: Moldavi\n    hu: Moldova\n    hy: Մոլդովա\n    ia: Moldova\n    id: Moldova\n    ie: Moldavia\n    io: Moldova\n    is: Moldóva\n    it: Moldavia\n    ja: モルドバ\n    jv: Moldova\n    ka: მოლდოვა\n    kg: Moldova\n    kk: Молдова\n    kl: Moldova\n    kn: ಮಾಲ್ಡೋವ\n    ko: 몰도바\n    ku: Moldova\n    kv: Молдова\n    kw: Moldova\n    ky: Молдова\n    la: Moldavia\n    lb: Moldawien\n    li: Moldavië\n    lt: Moldavija\n    lv: Moldova\n    mi: Te Whenua o Morotawa\n    mk: Молдавија\n    ml: മൊൾഡോവ\n    mn: Молдав\n    mo: Мoldova\n    mr: मोल्दोव्हा\n    ms: Moldova\n    mt: Moldova\n    my: မော်လ်ဒိုဗာနိုင်ငံ\n    na: Mordowa\n    ne: मोल्दोवा\n    nl: Moldavië\n    \"no\": Moldova\n    oc: Moldàvia\n    or: ମାଲଡୋଭା\n    os: Молдави\n    pa: ਮੋਲਦੋਵਾ\n    pl: Mołdawia\n    pt: Moldávia\n    qu: Mulduwa\n    ro: Moldova\n    ru: Молдавия\n    rw: Molidova\n    sa: मोल्दोवा\n    se: Moldova\n    sh: Moldavija\n    sk: Moldavsko\n    sl: Moldavija\n    so: Moldofa\n    sq: Moldavia\n    sr: Молдавија\n    ss: IMolidiva\n    st: Moldova\n    su: Moldova\n    sv: Moldavien\n    sw: Moldova\n    ta: மல்தோவா\n    te: మోల్డోవా\n    tg: Молдова\n    th: ประเทศมอลโดวา\n    tk: Moldawiýa\n    tl: Moldavia\n    tr: Moldova\n    tt: Молдавия\n    ug: مولدوۋا\n    uk: Молдова\n    ur: مالدووا\n    uz: Moldova\n    vi: Moldova\n    vo: Moldovän\n    wo: Moldaawi\n    yi: מאלדאווע\n    yo: Móldófà\n    zh: 摩尔多瓦\n"
  },
  {
    "path": "settings/country-names/me.yaml",
    "content": "name: \n    default: Crna Gora / Црна Гора\n    af: Montenegro\n    am: ሞንቴኔግሮ\n    an: Montenegro\n    ar: الجبل الأسود\n    av: Чеэраб Меэр\n    az: Monteneqro\n    ba: Черногория\n    be: Чарнагорыя\n    bg: Черна гора\n    bi: Montenegro\n    bn: মন্টিনিগ্রো\n    bo: མོན་ཊེནིག་རོ།\n    br: Montenegro\n    bs: Crna Gora\n    ca: Montenegro\n    ce: Iаьржалаьмни\n    cs: Černá Hora\n    cu: Чрьна Гора\n    cv: Черногори\n    cy: Montenegro\n    da: Montenegro\n    de: Montenegro\n    dv: މޮންޓެނީގުރޯ\n    ee: Montenegro\n    el: Μαυροβούνιο\n    en: Montenegro\n    eo: Montenegro\n    es: Montenegro\n    et: Montenegro\n    eu: Montenegro\n    fa: مونته‌نگرو\n    fi: Montenegro\n    fo: Montenegro\n    fr: Monténégro\n    fy: Montenegro\n    ga: Montainéagró\n    gd: Am Monadh Neagrach\n    gl: Montenegro\n    gu: મોન્ટેનીગ્રો\n    gv: Montenegro\n    he: מונטנגרו\n    hr: Crna Gora\n    ht: Montenegwo\n    hu: Montenegró\n    hy: Չեռնոգորիա\n    ia: Montenegro\n    id: Montenegro\n    ie: Montenegro\n    io: Montenegro\n    is: Svartfjallaland\n    it: Montenegro\n    ja: モンテネグロ\n    jv: Montenégro\n    ka: ჩერნოგორია\n    kg: Monte Negro\n    kk: Черногория\n    kl: Montenegro\n    kn: ಮಾಂಟೆನೆಗ್ರೊ\n    ko: 몬테네그로\n    ku: Montenegro\n    kv: Черногория\n    kw: Montenegro\n    ky: Монтенегро\n    la: Mons Niger\n    lb: Montenegro\n    li: Montenegro\n    ln: Montenegro\n    lt: Juodkalnija\n    lv: Melnkalne\n    mi: Monotenīkoro\n    mk: Црна Гора\n    ml: മോണ്ടെനെഗ്രൊ\n    mn: Монтенегро\n    mr: माँटेनिग्रो\n    ms: Montenegro\n    mt: Montenegro\n    my: မွန်တီနီဂရိုးနိုင်ငံ\n    na: Montenegro\n    ne: मोन्टेनेग्रो\n    nl: Montenegro\n    \"no\": Montenegro\n    nv: Dziłizhin Bikéyah\n    oc: Montenegro\n    or: ମୋଣ୍ଟେନେଗ୍ରୋ\n    os: Черногори\n    pa: ਮੋਂਟੇਨੇਗਰੋ\n    pl: Czarnogóra\n    ps: مانتېنېګرو\n    pt: Montenegro\n    qu: Yanaurqu\n    ro: Muntenegru\n    ru: Черногория\n    rw: Montenegoro\n    sc: Montenegro\n    se: Montenegro\n    sh: Crna Gora\n    sk: Čierna Hora\n    sl: Črna gora\n    sm: Montenegro\n    so: Montenegro\n    sq: Mali i Zi\n    sr: Црна Гора\n    ss: IMonthenekho\n    su: Monténégro\n    sv: Montenegro\n    sw: Montenegro\n    ta: மொண்டெனேகுரோ\n    tg: Монтенегро\n    th: ประเทศมอนเตเนโกร\n    tk: Çernogoriýa\n    tl: Montenegro\n    tr: Karadağ\n    tt: Монтенегро\n    ug: چېرنوگورىيە\n    uk: Чорногорія\n    ur: مونٹینیگرو\n    uz: Chernogoriya\n    vi: Montenegro\n    vo: Montenegrän\n    wo: Montenegro\n    yi: מאנטענעגרא\n    yo: Montenẹ́grò\n    zh: 蒙特內哥羅\n"
  },
  {
    "path": "settings/country-names/mg.yaml",
    "content": "name: \n    default: Madagasikara\n    af: Madagaskar\n    am: ማዳጋስካር\n    an: Madagascar\n    ar: مدغشقر\n    az: Madaqaskar\n    ba: Мадагаскар\n    be: Мадагаскар\n    bg: Мадагаскар\n    bm: Madagaskar\n    bn: মাদাগাস্কার\n    bo: མ་ད་གཱ་སི་ཀར།\n    br: Madagaskar\n    bs: Madagaskar\n    ca: Madagascar\n    ce: Мадагаскар\n    cs: Madagaskar\n    cv: Мадагаскар\n    cy: Madagascar\n    da: Madagaskar\n    de: Madagaskar\n    dv: މަޑަގަސްކަރަ\n    ee: Madagascar\n    el: Μαδαγασκάρη\n    en: Madagascar\n    eo: Madagaskaro\n    es: Madagascar\n    et: Madagaskar\n    eu: Madagaskar\n    fa: ماداگاسکار\n    fi: Madagaskar\n    fj: Madagasikar\n    fo: Madagaskar\n    fr: Madagascar\n    fy: Madagaskar\n    ga: Madagascar\n    gd: Madagascar\n    gl: Madagascar\n    gn: Madagaka\n    gu: મડાગાસ્કર\n    gv: Madagascar\n    he: מדגסקר\n    hi: मेडागास्कर\n    hr: Madagaskar\n    ht: Madagaskar\n    hu: Madagaszkár\n    hy: Մադագասկար\n    ia: Madagascar\n    id: Madagaskar\n    ie: Madagascar\n    io: Madagaskar\n    is: Madagaskar\n    it: Madagascar\n    ja: マダガスカル\n    jv: Madagaskar\n    ka: მადაგასკარი\n    kg: Malagasi\n    ki: Madagascar\n    kk: Мадагаскар\n    kl: Madagascar\n    kn: ಮಡಾಗಾಸಿಕರ\n    ko: 마다가스카르\n    ku: Madagaskar\n    kw: Madagaskar\n    ky: Мадагаскар\n    la: Madagascaria\n    lb: Madagaskar\n    li: Madagaskar\n    ln: Madagasikari\n    lt: Madagaskaras\n    lv: Madagaskara\n    mg: Madagasikara\n    mi: Marakāhia\n    mk: Мадагаскар\n    ml: മഡഗാസ്കർ\n    mn: Мадагаскар\n    mr: मादागास्कर\n    ms: Madagaskar\n    mt: Madagaskar\n    my: မဒါဂတ်စကားနိုင်ငံ\n    nl: Madagaskar\n    \"no\": Madagaskar\n    nv: Madaʼgéésgáá\n    oc: Madagascar\n    om: Madagascar\n    or: ମେଡାଗାସ୍କର\n    os: Мадагаскар\n    pa: ਮਾਦਾਗਾਸਕਰ\n    pl: Madagaskar\n    ps: مادغاسکر\n    pt: Madagáscar\n    qu: Madagaskar\n    ro: Madagascar\n    ru: Мадагаскар\n    rw: Madagasikari\n    sa: मडगास्कर\n    sc: Madagascàr\n    se: Madagaskar\n    sg: Madagaskära\n    sh: Madagaskar\n    si: මැඩගස්කරය\n    sk: Madagaskar\n    sl: Madagaskar\n    sm: Madagascar\n    sn: Madagascar\n    so: Madagaskar\n    sq: Madagaskari\n    sr: Мадагаскар\n    ss: IMadagasikha\n    su: Madagaskar\n    sv: Madagaskar\n    sw: Madagaska\n    ta: மடகாசுகர்\n    te: మడగాస్కర్\n    tg: Мадагаскар\n    th: ประเทศมาดากัสการ์\n    ti: ማዳጋስካር\n    tk: Madagaskar\n    tl: Madagaskar\n    tr: Madagaskar\n    ts: Madagascar\n    tt: Мадагаскар\n    ty: Madagascar\n    ug: ماداگاسكار\n    uk: Мадагаскар\n    ur: مڈغاسکر\n    uz: Madagaskar\n    vi: Madagascar\n    vo: Malagaseän\n    wo: Madagaskaar\n    yi: מאדאגאסקאר\n    yo: Madagáskàr\n    zh: 马达加斯加\n    zu: IMadagasika\n"
  },
  {
    "path": "settings/country-names/mh.yaml",
    "content": "name: \n    default: Ṃajeḷ\n    af: Marshalleilande\n    ar: جزر مارشال\n    be: Маршалавы астравы\n    br: Inizi Marshall\n    ca: Illes Marshall\n    cy: Ynysoedd Marshall\n    da: Marshalløerne\n    de: Marshallinseln\n    en: Marshall Islands\n    eo: Marŝaloj\n    es: Islas Marshall\n    et: Marshalli Saared\n    fa: جزایر مارشال\n    fi: Marshallinsaaret\n    fr: Îles Marshall\n    fy: de Marshalleilannen\n    ga: Oileáin Marshall\n    gd: Na h-Eileanan Mharshall\n    he: איי מרשל\n    hr: Maršalovi Otoci\n    hu: Marshall-szigetek\n    ia: Insulas Marshall\n    id: Kepulauan Marshall\n    io: Insuli Marshall\n    is: Marshalleyjar\n    it: Isole Marshall\n    la: Insulae Marsalienses\n    lb: Marshallinselen\n    li: Marshall-eilen\n    lt: Maršalo salos\n    lv: Māršala salas\n    mk: Маршалски Острови\n    mn: Маршаллын арлууд\n    nb: Marshalløyene\n    nl: Marshalleilanden\n    nn: Marshalløyane\n    \"no\": Marshalløyene\n    oc: Illas Marshall\n    pl: Wyspy Marshalla\n    pt: Ilhas Marshall\n    ru: Маршалловы Острова\n    se: Marshallsullot\n    sk: Mashallove ostrovy\n    sl: Marshallovi otoki\n    sv: Marshallöarna\n    ta: மார்சல் தீவுகள்\n    th: สาธารณรัฐหมู่เกาะมาร์แชลล์\n    tr: Marshall Adaları\n    uk: Маршаллові Острови\n    vi: Quần đảo Marshall\n    vo: Marjaluäns\n    zh: 马绍尔群岛\n"
  },
  {
    "path": "settings/country-names/mk.yaml",
    "content": "name: \n    default: Северна Македонија\n    af: Masedonië\n    ak: Masedonia\n    am: ማሴዶንያ\n    an: Republica de Macedonia\n    ar: شمال مقدونيا\n    az: Masedoniya\n    ba: Македония Республикаһы\n    be: Македонія\n    bg: Северна Македония\n    bi: Macedonia\n    bm: Macedɔni\n    bn: মেসিডোনিয়া[FYROM]\n    bo: མ་སེ་ཌོ་ནིཡ། (རྒྱལ་ཁབ།)\n    br: Makedonia\n    bs: Sjeverna Makedonija\n    ca: Macedònia del Nord\n    ce: Македони\n    cs: Severní Makedonie\n    cu: Макєдонїꙗ\n    cv: Македони Республики\n    cy: Gogledd Macedonia\n    da: Nordmakedonien\n    de: Nordmazedonien\n    dv: މެސެޑޯނިއާ\n    dz: མ་སེ་ཌོ་ནི་ཡ་ [ཡུ་གོ་སླཱ་བི་ཡ]\n    ee: Makedonia\n    el: Βόρεια Μακεδονία\n    en: North Macedonia\n    eo: Nord-Makedonio\n    es: Macedonia del Norte\n    et: Põhja-Makedoonia\n    eu: Ipar Mazedonia\n    fa: مقدونیه شمالی\n    ff: Meceduwaan\n    fi: Makedonia\n    fo: Makedónia\n    fr: Macédoine du Nord\n    fy: Noard-Masedoanje\n    ga: An Mhacadóin\n    gd: Masadoinia a Tuath\n    gl: Macedonia do Norte\n    gn: Masendoña\n    gu: મેસેડોનિયા\n    gv: Massadoan Hwoaie\n    ha: Masedoniya\n    he: מקדוניה הצפונית\n    hi: उत्तर मेसीडोनिया\n    hr: Sjeverna Makedonija\n    ht: Repiblik d Masedoni\n    hu: Észak-Macedónia\n    hy: Մակեդոնիայի Հանրապետություն\n    ia: Macedonia\n    id: Republik Makedonia\n    ie: Macedonia\n    io: Republiko Macedonia\n    is: Makedónía\n    it: Macedonia del Nord\n    ja: 北マケドニア\n    jv: Républik Makedonia\n    ka: მაკედონია\n    kg: Makedonia\n    ki: Masedonia\n    kk: Македония Республикасы\n    kl: Makedonia\n    km: ម៉ាសេដ្វាន\n    kn: ಮ್ಯಾಸಿಡೋನಿಯ\n    ko: 북마케도니아\n    ks: مٮ۪سوڑونِیا\n    ku: Komara Makedonyayê\n    kv: Македония Республика\n    kw: Repoblek Makedoni\n    la: Macedonia Septentrionalis\n    lb: Nordmazedonien\n    lg: Masedoniya\n    li: Noord-Macedonië\n    ln: Masedoni\n    lo: ມາຊີໂດເນຍ\n    lt: Šiaurės Makedonija\n    lv: Ziemeļmaķedonija\n    mg: Makedonia\n    mi: Makerōnia\n    mk: Северна Македонија\n    ml: റിപ്പബ്ലിക് ഓഫ് മാസിഡോണിയ\n    mn: Бүгд Найрамдах Македон Улс\n    mr: मॅसिडोनिया\n    ms: Republik Macedonia\n    mt: Repubblika tal-Maċedonja\n    my: မက်စီဒိုးနီးယားနိုင်ငံ\n    na: Matedoniya\n    ne: म्यासेडोनिया\n    nl: Noord-Macedonië\n    \"no\": Nord-Makedonia\n    oc: Republica de Macedònia\n    or: ମାସିଡୋନିଆ\n    os: Республикæ Македони\n    pa: ਮਕਦੂਨੀਆ ਗਣਰਾਜ\n    pl: Macedonia Północna\n    ps: د مقدونيې ولسمشريزه\n    pt: Macedónia do Norte\n    qu: Makidunya\n    rm: Macedonia\n    rn: Masedoniya\n    ro: Macedonia de Nord\n    ru: Северная Македония\n    rw: Masedoniya\n    sa: मेसेडोनिया\n    sc: Matzedònia\n    se: Davvi-Makedonia\n    sg: Maseduäni\n    sh: Severna Makedonija\n    si: මැසිඩෝනියාන [FYROM]\n    sk: Severné Macedónsko\n    sl: Makedonija\n    sn: Macedonia\n    so: Makedonia\n    sq: Maqedonia e Veriut\n    sr: Северна Македонија\n    ss: IMakhedoniya\n    su: Makédonia\n    sv: Nordmakedonien\n    sw: Jamhuri ya Masedonia\n    ta: மாக்கடோனியக் குடியரசு\n    te: మేసిడోనియా\n    tg: Ҷумҳурии Мақдуния\n    th: ประเทศมาซิโดเนีย\n    ti: ማከዶኒያ\n    tk: Makedoniýa Respublikasy\n    tl: Republika ng Masedonya\n    to: Masitōnia [FYROM]\n    tr: Kuzey Makedonya\n    tt: Македония Җөмһүрияте\n    ug: ماكېدونىيە\n    uk: Північна Македонія\n    ur: شمالی مقدونیہ\n    uz: Makedoniya Respublikasi\n    vi: Bắc Macedonia\n    vo: Nolüda-Makedoniyän\n    wo: Réewum Maseduwaan\n    yi: רעפובליק פון מאקעדאניע\n    yo: Orílẹ̀-èdè Olómìnira ilẹ̀ Makẹdóníà\n    zh: 北马其顿共和国\n    zu: isi-Macedonia [FYROM]\n"
  },
  {
    "path": "settings/country-names/ml.yaml",
    "content": "name: \n    default: Mali\n    af: Mali\n    am: ማሊ\n    an: Mali\n    ar: مالي\n    az: Mali\n    ba: Мали\n    be: Малі\n    bg: Мали\n    bm: Mali\n    bn: মালি\n    bo: མ་ལི།\n    br: Mali\n    bs: Mali\n    ca: Mali\n    ce: Мали\n    cs: Mali\n    cv: Мали\n    cy: Mali\n    da: Mali\n    de: Mali\n    dv: މާލީ\n    ee: Mali\n    el: Μάλι\n    en: Mali\n    eo: Malio\n    es: Malí\n    et: Mali\n    eu: Mali\n    fa: مالی\n    ff: Maali\n    fi: Mali\n    fo: Mali\n    fr: Mali\n    fy: Maly\n    ga: Mailí\n    gd: Màili\n    gl: Malí\n    gv: Malee\n    ha: Mali\n    he: מאלי\n    hi: माली\n    hr: Mali\n    ht: Mali\n    hu: Mali\n    hy: Մալի\n    ia: Mali\n    id: Mali\n    ie: Mali\n    io: Mali\n    is: Malí\n    it: Mali\n    ja: マリ共和国\n    jv: Mali\n    ka: მალი\n    kg: Mali\n    kk: Мали\n    kn: ಮಾಲಿ\n    ko: 말리\n    ku: Malî\n    kw: Mali\n    la: Malium\n    lb: Mali\n    li: Mali\n    ln: Mali\n    lt: Malis\n    lv: Mali\n    mi: Māri\n    mk: Мали\n    ml: മാലി\n    mn: Мали\n    mr: माली\n    ms: Mali\n    mt: Mali\n    my: မာလီနိုင်ငံ\n    nl: Mali\n    \"no\": Mali\n    oc: Mali\n    or: ମାଲି\n    os: Мали\n    pa: ਮਾਲੀ\n    pl: Mali\n    ps: مالي\n    pt: Mali\n    qu: Mali\n    ro: Mali\n    ru: Мали\n    rw: Mali\n    sa: माली\n    sc: Mali\n    se: Mali\n    sg: Malïi\n    sh: Mali\n    si: මාලි\n    sk: Mali\n    sl: Mali\n    sn: Mali\n    so: Maali\n    sq: Mali\n    sr: Мали\n    ss: IMali\n    st: Mali\n    su: Mali\n    sv: Mali\n    sw: Mali\n    ta: மாலி\n    tg: Малӣ\n    th: ประเทศมาลี\n    ti: ማሊ\n    tk: Mali\n    tl: Mali\n    tr: Mali\n    ts: Mali\n    tt: Мали\n    ug: مالى\n    uk: Малі\n    ur: مالی\n    uz: Mali\n    vi: Mali\n    vo: Maliyän\n    wa: Mali\n    wo: Mali\n    yi: מאלי\n    yo: Málì\n    zh: 马里共和国\n    zu: IMali\n"
  },
  {
    "path": "settings/country-names/mm.yaml",
    "content": "name: \n    default: မြန်မာ\n    af: Mianmar\n    am: ምየንማ\n    an: Myanmar\n    ar: بورما\n    az: Myanma\n    ba: Мьянма\n    be: М'янма\n    bg: Мианмар\n    bi: Burma\n    bn: মায়ানমার\n    bo: བྷར་མ།\n    br: Myanmar\n    bs: Mijanmar\n    ca: Myanmar\n    ce: Мьянма\n    cs: Myanmar\n    cv: Мьянма\n    cy: Myanmar\n    da: Myanmar\n    de: Myanmar\n    dv: ބަރުމާ\n    dz: མེ་མར་\n    el: Μιανμάρ\n    en: Myanmar\n    eo: Birmo / Mjanmao\n    es: Myanmar\n    et: Birma\n    eu: Myanmar\n    fa: میانمار\n    fi: Myanmar\n    fo: Burma\n    fr: Birmanie\n    fy: Birma\n    ga: Maenmar\n    gd: Mianmar\n    gl: Myanmar\n    gu: બર્મા\n    gv: Myanmar\n    he: מיאנמר\n    hi: म्यान्मार\n    hr: Mijanmar\n    ht: Bimani\n    hu: Mianmar\n    hy: Մյանմա\n    ia: Birmania\n    id: Myanmar\n    ie: Myanmar\n    io: Myanmar\n    is: Búrma\n    it: Birmania\n    ja: ミャンマー\n    jv: Myanmar\n    ka: მიანმარი\n    ki: Myanmar\n    kk: Мианма\n    km: មីយ៉ាន់ម៉ា\n    kn: ಮಯನ್ಮಾರ್\n    ko: 미얀마\n    ku: Myanmar\n    kv: Мьянма\n    kw: Byrmani\n    ky: Мьянма\n    la: Birmania\n    lb: Myanmar\n    li: Myanmar\n    lo: ປະເທດມຽນມາ\n    lt: Mianmaras\n    lv: Mjanma\n    mg: Myanmara\n    mi: Pēma\n    mk: Мјанмар\n    ml: മ്യാന്മാർ\n    mn: Мьянмар\n    mr: म्यानमार\n    ms: Myanmar\n    mt: Myanmar\n    my: မြန်မာ\n    na: Miyanmar\n    ne: म्यानमार\n    nl: Myanmar\n    \"no\": Myanmar\n    oc: Birmania\n    or: ବର୍ମା\n    os: Мьянмæ\n    pa: ਮਿਆਂਮਾਰ\n    pl: Mjanma\n    ps: ميانمار\n    pt: Birmânia\n    qu: Myanmar\n    ro: Birmania\n    ru: Мьянма\n    rw: Mayanimari\n    sa: म्यान्मार\n    sc: Birmania\n    se: Myanmar\n    sh: Mianmar\n    si: බුරුමය\n    sk: Mjanmarsko\n    sl: Mjanmar\n    so: Myanmar\n    sq: Birmania\n    sr: Мјанмар\n    ss: IMayanima\n    su: Myanmar\n    sv: Myanmar\n    sw: Myanmar\n    ta: மியான்மர்\n    te: మయన్మార్\n    tg: Мянма\n    th: ประเทศพม่า\n    tk: Mýanma\n    tl: Myanmar\n    tr: Myanmar\n    tt: Мьянма\n    ug: بىرما\n    uk: М'янма\n    ur: میانمار\n    uz: Birma\n    vi: Myanma\n    vo: Mianmarän\n    wo: Miyanmaar\n    yi: מיאנמאר\n    yo: Myanmar\n    za: Mienjdien\n    zh: 缅甸\n"
  },
  {
    "path": "settings/country-names/mn.yaml",
    "content": "name: \n    default: Монгол улс ᠮᠤᠩᠭᠤᠯ ᠤᠯᠤᠰ\n    af: Mongolië\n    am: ሞንጎልያ\n    an: Mongolia\n    ar: منغوليا\n    as: মঙ্গোলিয়া\n    az: Monqolustan\n    ba: Монголия\n    be: Манголія\n    bg: Монголия\n    bn: মঙ্গোলিয়া\n    bo: མོང་གོལ།\n    br: Mongolia\n    bs: Mongolija\n    ca: Mongòlia\n    ce: Монголи\n    cs: Mongolsko\n    cu: Мѫголи\n    cv: Монголи\n    cy: Mongolia\n    da: Mongoliet\n    de: Mongolei\n    dv: މޮންގޯލިއާ\n    dz: སོག་པོ་\n    ee: Mongolia\n    el: Μογγολία\n    en: Mongolia\n    eo: Mongolio\n    es: Mongolia\n    et: Mongoolia\n    eu: Mongolia\n    fa: مغولستان\n    fi: Mongolia\n    fo: Mongolia\n    fr: Mongolie\n    fy: Mongoalje\n    ga: An Mhongóil\n    gd: Mongòilia\n    gl: Mongolia\n    gn: Mongolia\n    gu: મંગોલિયા\n    gv: Yn Vongoil\n    he: מונגוליה\n    hi: मंगोलिया\n    hr: Mongolija\n    ht: Mongoli\n    hu: Mongólia\n    hy: Մոնղոլիա\n    ia: Mongolia\n    id: Mongolia\n    ie: Mongolia\n    io: Mongolia\n    is: Mongólía\n    it: Mongolia\n    ja: モンゴル国\n    jv: Mongolia\n    ka: მონღოლეთი\n    kk: Моңғолия\n    kl: Mongolia\n    km: ម៉ុងហ្គោលី\n    kn: ಮಂಗೋಲಿಯ\n    ko: 몽골\n    ku: Mongolya\n    kv: Монголия\n    kw: Mongoli\n    ky: Моңголстан\n    la: Mongolia\n    lb: Mongolei\n    li: Mongolië\n    ln: Mongolí\n    lt: Mongolija\n    lv: Mongolija\n    mi: Mongōria\n    mk: Монголија\n    ml: മംഗോളിയ\n    mn: Монгол улс ᠮᠤᠩᠭᠤᠯ ᠤᠯᠤᠰ\n    mo: Монголия\n    mr: मंगोलिया\n    ms: Mongolia\n    my: မွန်ဂိုးလီးယားနိုင်ငံ\n    na: Mongoriya\n    ne: मङ्गोलिया\n    nl: Mongolië\n    \"no\": Mongolia\n    nv: Chʼah Diʼilii Bikéyah\n    oc: Mongolia\n    or: ମଙ୍ଗୋଲିଆ\n    os: Мангол\n    pa: ਮੰਗੋਲੀਆ\n    pl: Mongolia\n    ps: مغولستان\n    pt: Mongólia\n    qu: Mungul suyu\n    ro: Mongolia\n    ru: Монголия\n    rw: Mongoliya\n    sa: मंगोलिया\n    se: Mongolia\n    sh: Mongolija\n    si: මොංගෝලියාව\n    sk: Mongolsko\n    sl: Mongolija\n    sm: Mogitolia\n    so: Mongolia\n    sq: Mongolia\n    sr: Монголија\n    ss: IMongoliya\n    su: Mongolia\n    sv: Mongoliet\n    sw: Mongolia\n    ta: மங்கோலியா\n    te: మంగోలియా\n    tg: Муғулистон\n    th: ประเทศมองโกเลีย\n    tk: Mongoliýa\n    tl: Monggolya\n    tr: Moğolistan\n    tt: Монголия\n    ug: موڭغۇلىيە\n    uk: Монголія\n    ur: منگولیا\n    uz: Moʻgʻuliston\n    vi: Mông Cổ\n    vo: Mongolän\n    wo: Mongoli\n    yi: מאנגאליי\n    yo: Mòngólíà\n    za: Mungzguj\n    zh: 蒙古国\n"
  },
  {
    "path": "settings/country-names/mr.yaml",
    "content": "name: \n    default: موريتانيا\n    af: Mauritanië\n    am: ሞሪታኒያ\n    an: Mauritania\n    ar: موريتانيا\n    az: Mavritaniya\n    be: Маўрытанія\n    bg: Мавритания\n    bm: Moritani\n    bn: মৌরিতানিয়া\n    bo: མའུ་རི་ཏ་ནི་ཡ།\n    br: Maouritania\n    bs: Mauritanija\n    ca: Mauritània\n    ce: Мавритани\n    cs: Mauritánie\n    cv: Мавритани\n    cy: Mauritania\n    da: Mauretanien\n    de: Mauretanien\n    dv: މޮރިޓާނިއާ\n    ee: Mauritania\n    el: Μαυριτανία\n    en: Mauritania\n    eo: Maŭritanio\n    es: Mauritania\n    et: Mauritaania\n    eu: Mauritania\n    fa: موریتانی\n    ff: Muritani\n    fi: Mauritania\n    fo: Móritania\n    fr: Mauritanie\n    fy: Mauritaanje\n    ga: An Mháratáin\n    gd: Moratainia\n    gl: Mauritania\n    gv: Yn Varitaan\n    ha: Muritaniya\n    he: מאוריטניה\n    hi: मॉरीतानिया\n    hr: Mauretanija\n    ht: Moritani\n    hu: Mauritánia\n    hy: Մավրիտանիա\n    ia: Mauritania\n    id: Mauritania\n    ie: Mauritania\n    io: Mauritania\n    is: Máritanía\n    it: Mauritania\n    ja: モーリタニア\n    jv: Mauritania\n    ka: მავრიტანია\n    kg: Muritania\n    kk: Мавритания\n    kn: ಮಾರಿಟಾನಿಯ\n    ko: 모리타니\n    ku: Morîtanya\n    kw: Moritani\n    la: Mauritania\n    lb: Mauretanien\n    li: Mauritanië\n    ln: Moritani\n    lt: Mauritanija\n    lv: Mauritānija\n    mg: Maoritania\n    mi: Mauritānia\n    mk: Мавританија\n    ml: മൗറിത്താനിയ\n    mn: Мавритан\n    mr: मॉरिटानिया\n    ms: Mauritania\n    mt: Mawritanja\n    my: မော်ရီတေးနီးယားနိုင်ငံ\n    nl: Mauritanië\n    \"no\": Mauritania\n    nv: Moowitéínya\n    oc: Mauritània\n    or: ମୋରିତାନିଆ\n    os: Мавритани\n    pa: ਮੌਰੀਤਾਨੀਆ\n    pl: Mauretania\n    ps: موریتاني\n    pt: Mauritânia\n    qu: Muritanya\n    ro: Mauritania\n    ru: Мавритания\n    rw: Moritaniya\n    sa: मारिटेनिया\n    sc: Mauritània\n    se: Mauritánia\n    sg: Moritanïi\n    sk: Mauritánia\n    sl: Mavretanija\n    sn: Mauritania\n    so: Mauritania\n    sq: Mauritania\n    sr: Мауританија\n    ss: IMolithaniya\n    st: Mauritania\n    su: Mauritania\n    sv: Mauretanien\n    sw: Mauritania\n    ta: மூரித்தானியா\n    te: మౌరిటానియ\n    tg: Мавритания\n    th: ประเทศมอริเตเนีย\n    ti: ሞሪታኒያ\n    tk: Mawritaniýa\n    tl: Mauritania\n    tr: Moritanya\n    ts: Maritana\n    tt: Мавритания\n    ug: ماۋرىتانىيە\n    uk: Мавританія\n    ur: موریتانیہ\n    uz: Mavritaniya\n    vi: Mauritanie\n    vo: Moritän\n    wa: Moritanreye\n    wo: Gànnaar\n    xh: Mauritania\n    yi: מאריטאניע\n    yo: Mauritáníà\n    zh: 毛里塔尼亚\n    zu: IMoritaniya\n"
  },
  {
    "path": "settings/country-names/ms.yaml",
    "content": "name: \n    default: Montserrat\n    af: Montserrat\n    an: Isla de Montserrat\n    ar: مونتسرات\n    az: Montserrat\n    ba: Монтсеррат\n    be: Мантсерат\n    bg: Монсерат\n    br: Enez Montserrat\n    bs: Monserat\n    ca: Illa de Montserrat\n    cs: Montserrat\n    cy: Montserrat\n    da: Montserrat\n    de: Montserrat\n    dv: މޮންސެރާޓު\n    el: Μοντσερράτ\n    en: Montserrat\n    eo: Moncerato\n    es: Montserrat\n    et: Montserrat\n    eu: Montserrat\n    fa: مونتسرات\n    fi: Montserrat\n    fr: Montserrat\n    ga: Montsarat\n    gl: Illa Montserrat\n    he: מונטסראט\n    hi: मॉण्टसेराट\n    hr: Montserrat\n    ht: Montserrat\n    hu: Montserrat\n    hy: Մոնտսերատ\n    id: Montserrat\n    io: Montserrat\n    is: Montserrat\n    it: Montserrat\n    ja: モントセラト\n    jv: Montserrat\n    ka: მონსერატი\n    ko: 몬트세랫\n    kw: Montserrat\n    la: Montserrat\n    lb: Montserrat\n    li: Montserrat\n    lt: Montseratas\n    lv: Montserrata\n    mk: Монтсерат\n    mn: Монтсеррат\n    mr: माँटसेराट\n    ms: Montserrat\n    nl: Montserrat\n    \"no\": Montserrat\n    oc: Montserrat\n    pa: ਮਾਂਟਸਰਾਤ\n    pl: Montserrat\n    pt: Montserrat\n    ro: Montserrat\n    ru: Монтсеррат\n    rw: Monserati\n    sh: Montserrat\n    sk: Montserrat\n    sl: Montserrat\n    sq: Montserrati\n    sr: Монтсерат\n    su: Montserrat\n    sv: Montserrat\n    ta: மொன்செராட்\n    th: มอนต์เซอร์รัต\n    tl: Montserrat\n    tr: Montserrat\n    ug: مونتسەررات\n    uk: Монтсеррат\n    ur: مانٹسریٹ\n    vi: Montserrat\n    wo: Montserrat\n    yo: Montserrat\n    zh: 蒙塞拉特島\n"
  },
  {
    "path": "settings/country-names/mt.yaml",
    "content": "name: \n    default: Malta\n    ak: Mɔlta\n    am: ማልታ\n    ar: مالطا\n    be: Мальта\n    bg: Малта\n    bm: Malti\n    bn: মাল্টা\n    bo: མལ་ཊ།\n    br: Malta\n    ca: Malta\n    cs: Malta\n    de: Malta\n    dz: མཱལ་ཊ\n    ee: Malta nutome\n    el: Μάλτα\n    en: Malta\n    eo: Malto\n    es: Malta\n    fa: مالت\n    ff: Malte\n    fi: Malta\n    fr: Malte\n    ga: Málta\n    gu: માલ્ટા\n    gv: Yn Valta\n    he: מלטה\n    hi: माल्टा\n    hr: Malta\n    hu: Málta\n    hy: Մալթա\n    ia: Malta\n    io: Malta\n    is: Malta\n    it: Malta\n    ja: マルタ\n    ka: მალტა\n    km: ម៉ាល់តា\n    kn: ಮಾಲ್ಟಾ\n    ko: 몰타\n    ks: مالٹا\n    ku: Malta\n    la: Melita\n    lg: Malita\n    ln: Malitɛ\n    lo: ມັນຕາ\n    lv: Malta\n    mk: Малта\n    ml: മാൾട്ട\n    mn: Мальта\n    mr: माल्टा\n    ne: माल्टा\n    \"no\": Malta\n    or: ମାଲ୍ଟା\n    pl: Malta\n    rn: Malita\n    ru: Мальта\n    se: Malta\n    sg: Mâlta\n    si: මෝල්ටාව\n    sk: Malta\n    so: Maalda\n    sq: Maltë\n    sr: Малта\n    sv: Malta\n    ta: மால்டா\n    te: మాల్టా\n    tg: Малта\n    th: ประเทศมอลตา\n    ti: ማልታ\n    to: Malita\n    uk: Мальта\n    ur: مالٹا\n    vi: Malta\n    vo: Malteän\n    yo: Orílẹ́ède Malata\n    zh: 马尔他\n    zu: i-Malta\n"
  },
  {
    "path": "settings/country-names/mu.yaml",
    "content": "name: \n    default: Mauritius\n    af: Mauritius\n    am: ሞሪሸስ\n    an: Mauricio\n    ar: موريشيوس\n    az: Mavriki\n    be: Маўрыкій\n    bg: Мавриций\n    bn: মরিশাস\n    bo: མའུ་རི་ཊིའུ་སུ།\n    br: Maoris\n    bs: Mauricijus\n    ca: Maurici\n    cs: Mauricius\n    cv: Маврики\n    da: Mauritius\n    de: Mauritius\n    dv: މޮރިޝަސް\n    el: Μαυρίκιος\n    en: Mauritius\n    eo: Maŭricio\n    es: Mauricio\n    eu: Maurizio\n    fa: موریس\n    fi: Mauritius\n    fo: Móritius\n    fr: Maurice\n    fy: Mauritsius\n    ga: Oileán Mhuirís\n    gd: Na h-Eileanan Mhoiriseas\n    gl: Mauricio - Maurice\n    gv: Ellan Wirrish\n    he: מאוריציוס\n    hi: मॉरिशस\n    hr: Mauricijus\n    ht: Moris\n    hu: Mauritius\n    hy: Մավրիկիոս\n    ia: Mauritio\n    io: Maurico\n    is: Máritíus\n    ja: モーリシャス\n    ka: მავრიკი\n    kk: Маврикий\n    kn: ಮಾರಿಷಸ್\n    ko: 모리셔스\n    ku: Maurîtius\n    kw: Ynys Morrys\n    la: Mauritia\n    ln: Morisi\n    lt: Mauricijus\n    lv: Maurīcija\n    mg: Maorisy\n    mk: Маврициус\n    ml: മൗറീഷ്യസ്\n    mn: Маврикий\n    mr: मॉरिशस\n    mt: Mawrizji\n    my: မောရစ်ရှနိုင်ငံ\n    ne: मौरिसस\n    nl: Mauritius\n    \"no\": Mauritius\n    oc: Maurici\n    or: ମରିସସ\n    os: Маврикий\n    pa: ਮਾਰੀਸ਼ਸ\n    pl: Mauritius\n    ps: ماوریتوس\n    pt: Maurícia\n    qu: Mawrisyu\n    ru: Маврикий\n    rw: Morise\n    sa: मारिषस्\n    sc: Mauritzius\n    se: Mauritius\n    sg: Mörîsi\n    si: මුරුසි සමුහාණ්ඩුව\n    sk: Maurícius\n    sl: Mavricij\n    sq: Mauritiusi\n    sr: Маурицијус\n    ss: IMorishiyasi\n    sv: Mauritius\n    sw: Morisi\n    ta: மொரிசியசு\n    te: మారిషస్\n    tg: Маврикия\n    th: ประเทศมอริเชียส\n    tk: Mawrikiý\n    tl: Maurisyo\n    tt: Маврикий\n    ug: ماۋرىتىئۇس\n    uk: Маврикій\n    ur: موریشس\n    uz: Mavritsiya\n    vo: Moriseän\n    wo: Móoris\n    yo: Mọ́rísì\n    zh: 毛里求斯\n    zu: IMorishisi\n"
  },
  {
    "path": "settings/country-names/mv.yaml",
    "content": "name: \n    default: ދިވެހިރާއްޖެ\n    af: Maldive\n    am: ማልዲቭስ\n    ar: ملديف\n    az: Maldiv\n    be: Мальдывы\n    bg: Малдиви\n    bm: Maldivi\n    bn: মালদ্বীপ\n    bo: མལ་དྭིབ།\n    br: Maldivez\n    bs: Maldivi\n    ca: Maldives\n    cs: Maledivy\n    da: Maldiverne\n    de: Malediven\n    dv: ދިވެހިރާއްޖެ\n    dz: མཱལ་དིབས\n    ee: maldivesdukɔ\n    el: Μαλδίβες\n    en: Maldives\n    eo: Maldivoj\n    es: Maldivas\n    et: Maldiivid\n    eu: Maldivak\n    fa: مالدیو\n    ff: Maldiiwe\n    fi: Malediivit\n    fo: Maldivuoyggjarnar\n    fr: Maldives\n    fy: de Maldiven\n    ga: Oileáin Mhaildíve\n    gd: Na h-Eileanan Mhaladaibh\n    gl: Maldivas\n    gu: માલદિવ્સ\n    gv: Ny Maldeevaghyn\n    ha: Maldibi\n    he: מלדיבים\n    hi: मालदीव\n    hr: Maldivi\n    hu: Maldív-szigetek\n    hy: Մալդիվներ\n    id: Maladewa\n    ig: Maldivesa\n    io: Maldivi\n    is: Maldíveyjar\n    it: Maldive\n    ka: მალდივის კუნძულები\n    ki: Modivu\n    km: ម៉ាល់ឌីវ\n    kn: ಮಾಲ್ಡಿವ್ಸ್\n    ks: مالدیٖو\n    ku: Maldîv\n    la: Insulae Maldivae\n    lb: Malediven\n    lg: Bizinga by'eMalidive\n    ln: Madívɛ\n    lo: ມັນດິຟ\n    lt: Maldyvai\n    lv: Maldīvija\n    mg: Maldiva\n    mk: Малдиви\n    ml: മാലിദ്വീപ്\n    mn: Мальдив\n    mr: मालदीव्ज\n    ms: Maldiv\n    my: မော်လဒိုက်\n    nb: Maldivene\n    ne: माल्दिभ्स\n    nl: Malediven\n    nn: Maldivane\n    \"no\": Maldivene\n    or: ମାଳଦ୍ବୀପ\n    pl: Malediwy\n    pt: Maldivas\n    rm: Maldivas\n    rn: Moludave\n    ro: Maldive\n    ru: Мальдивы\n    se: Malediivvat\n    sg: Maldîva\n    si: මාල දිවයින\n    sk: Maledivy\n    sl: Maldivi\n    so: Maaldiqeen\n    sq: Maldivit\n    sr: Малдиви\n    sv: Maldiverna\n    sw: Modivu\n    ta: மாலத்தீவு\n    te: మాల్దీవులు\n    th: ประเทศมัลดีฟส์\n    ti: ማልዲቭስ\n    to: Malativisi\n    tr: Maldivler\n    tt: Мальдивлар\n    uk: Мальдіви\n    ur: مالدیو\n    vo: Maldivuäns\n    yo: Orílẹ́ède Maladifi\n    zh: 马尔代夫/馬爾地夫\n    zu: i-Maldives\n"
  },
  {
    "path": "settings/country-names/mw.yaml",
    "content": "name: \n    default: Malawi\n    af: Malawi\n    am: ማላዊ\n    an: Malawi\n    ar: مالاوي\n    az: Malavi\n    ba: Малави\n    be: Малаві\n    bg: Малави\n    bm: Malawi\n    bn: মালাউই\n    bo: མ་ལ་ཝི།\n    br: Malawi\n    bs: Malavi\n    ca: Malawi\n    ce: Малави\n    cs: Malawi\n    cv: Малави\n    cy: Malawi\n    da: Malawi\n    de: Malawi\n    dv: މަލާވީ\n    ee: Malawi\n    el: Μαλάουι\n    en: Malawi\n    eo: Malavio\n    es: Malaui\n    et: Malawi\n    eu: Malawi\n    fa: مالاوی\n    fi: Malawi\n    fo: Malavi\n    fr: Malawi\n    fy: Malawy\n    ga: An Mhaláiv\n    gd: Malabhaidh\n    gl: Malaui - Malawi\n    gv: Malawi\n    he: מלאווי\n    hi: मलावी\n    hr: Malavi\n    ht: Malawi\n    hu: Malawi\n    hy: Մալավի\n    ia: Malawi\n    id: Malawi\n    ie: Malawi\n    io: Malawi\n    is: Malaví\n    it: Malawi\n    ja: マラウイ\n    jv: Malawi\n    ka: მალავი\n    kg: Malawi\n    ki: Malawi\n    kk: Малави\n    kn: ಮಲಾವಿ\n    ko: 말라위\n    ku: Malavî\n    kw: Malawi\n    la: Malavium\n    lb: Malawi\n    li: Malawi\n    ln: Malawi\n    lt: Malavis\n    lv: Malāvija\n    mg: Malawi\n    mi: Marāwi\n    mk: Малави\n    ml: മലാവി\n    mn: Малави\n    mr: मलावी\n    ms: Malawi\n    mt: Malawi\n    my: မာလဝီနိုင်ငံ\n    nl: Malawi\n    \"no\": Malawi\n    nv: Malááwii\n    ny: Malaŵi\n    oc: Malawi\n    os: Малави\n    pa: ਮਲਾਵੀ\n    pl: Malawi\n    ps: مالاوي\n    pt: Malawi\n    qu: Malawi\n    ro: Malawi\n    ru: Малави\n    rw: Malawi\n    sa: मलावी\n    sc: Malawi\n    se: Malawi\n    sg: Malawïi\n    sh: Malavi\n    sk: Malawi\n    sl: Malavi\n    sn: Malawi\n    so: Malaawi\n    sq: Malavi\n    sr: Малави\n    ss: IMalawi\n    su: Malawi\n    sv: Malawi\n    sw: Malawi\n    ta: மலாவி\n    tg: Малави\n    th: ประเทศมาลาวี\n    ti: ማላዊ\n    tk: Malawi\n    tl: Malawi\n    tr: Malavi\n    ts: Malawi\n    ug: مالاۋى\n    uk: Малаві\n    ur: ملاوی\n    uz: Malavi\n    vi: Malawi\n    vo: Malaviyän\n    wo: Malawi\n    yi: מאלאווי\n    yo: Màláwì\n    zh: 马拉维\n    zu: IMalawi\n"
  },
  {
    "path": "settings/country-names/mx.yaml",
    "content": "name: \n    default: México\n    af: Meksiko\n    am: ሜክሲኮ\n    an: Mexico\n    ar: المكسيك\n    ay: Mïxiku\n    az: Meksika\n    ba: Мексика\n    be: Мексіка\n    bg: Мексико\n    bi: Mexico\n    bm: Mɛkisiki\n    bn: মেক্সিকো\n    bo: མེག་སི་ཀོ།\n    br: Mec'hiko\n    bs: Meksiko\n    ca: Mèxic\n    ce: Мексика\n    co: Messicu\n    cs: Mexiko\n    cv: Мексика\n    cy: Mexico\n    da: Mexico\n    de: Mexiko\n    dv: މެކްސިކޯ\n    dz: མེཀ་སི་ཀོ\n    ee: Mexico\n    el: Μεξικό\n    en: Mexico\n    eo: Meksiko\n    es: México\n    et: Mehhiko\n    eu: Mexiko\n    fa: مکزیک\n    fi: Meksiko\n    fo: Meksiko\n    fr: Mexique\n    fy: Meksiko\n    ga: Meicsiceo\n    gd: Meagsago\n    gl: México\n    gn: Méjiko\n    gu: મેક્સિકો\n    gv: Meksico\n    he: מקסיקו\n    hi: मेक्सिको\n    hr: Meksiko\n    ht: Meksik\n    hu: Mexikó\n    hy: Մեքսիկա\n    ia: Mexico\n    id: Meksiko\n    ik: Mexiqo\n    io: Mexikia\n    is: Mexíkó\n    it: Messico\n    iu: ᒦᒃᓰᖂ\n    ja: メキシコ\n    jv: Mèksiko\n    ka: მექსიკა\n    kk: Мексика\n    kl: Mexico\n    km: ម៉ិកស៊ិក\n    kn: ಮೆಕ್ಸಿಕೋ\n    ko: 멕시코\n    ku: Meksîk\n    kv: Мексика\n    kw: Meksiko\n    ky: Мексика\n    la: Mexicum\n    lb: Mexiko\n    li: Mexico\n    ln: Mexiko\n    lt: Meksika\n    lv: Meksika\n    mg: Meksika\n    mi: Mēhiko\n    mk: Мексико\n    ml: മെക്സിക്കോ\n    mn: Мексик\n    mr: मेक्सिको\n    ms: Mexico\n    mt: Messiku\n    my: မက္ကဆီကိုနိုင်ငံ\n    na: Meketiko\n    ne: मेक्सिको\n    nl: Mexico\n    \"no\": Mexico\n    nv: Méhigo\n    oc: Mexic\n    or: ମେକ୍ସିକୋ\n    os: Мексикæ\n    pa: ਮੈਕਸੀਕੋ\n    pl: Meksyk\n    pt: México\n    qu: Mishiku\n    rm: Mexico\n    ro: Mexic\n    ru: Мексика\n    rw: Megizike\n    sc: Mèssico\n    se: Meksiko\n    sh: Meksiko\n    sk: Mexiko\n    sl: Mehika\n    sm: Mexico\n    sn: Mexico\n    so: Meksiko\n    sq: Meksika\n    sr: Мексико\n    ss: IMekisikho\n    su: Méksiko\n    sv: Mexico\n    sw: Mexiko\n    ta: மெக்சிக்கோ\n    te: మెక్సికో\n    tg: Мексика\n    th: ประเทศเม็กซิโก\n    tk: Meksika\n    tl: Mehiko\n    tr: Meksika\n    tt: Мексика\n    tw: Mexico\n    ug: مېكسىكا\n    uk: Мексика\n    ur: میکسیکو\n    uz: Meksika\n    vi: México\n    vo: Mäxikän\n    wo: Meksik\n    yi: מעקסיקא\n    yo: Mẹ́ksíkò\n    zh: 墨西哥\n    zu: IMekisiko\n"
  },
  {
    "path": "settings/country-names/my.yaml",
    "content": "name: \n    default: Malaysia\n    af: Maleisië\n    am: ማሌዢያ\n    an: Malaisia\n    ar: ماليزيا\n    az: Malayziya\n    ba: Малайзия\n    be: Малайзія\n    bg: Малайзия\n    bn: মালয়েশিয়া\n    bo: མ་ལ་ཤི་ཡ།\n    br: Malaysia\n    bs: Malezija\n    ca: Malàisia\n    ce: Малайзи\n    cs: Malajsie\n    cv: Малайзи\n    cy: Malaysia\n    da: Malaysia\n    de: Malaysia\n    dv: މެލޭޝިޔާ\n    dz: མ་ལེ་ཤི་ཡ་\n    el: Μαλαισία\n    en: Malaysia\n    eo: Malajzio\n    es: Malasia\n    et: Malaisia\n    eu: Malaysia\n    fa: مالزی\n    fi: Malesia\n    fo: Maleisia\n    fr: Malaisie\n    fy: Maleizje\n    ga: An Mhalaeisia\n    gd: Malaidhsia\n    gl: Malaisia\n    gu: મલેશિયા\n    gv: Yn Valaysia\n    he: מלזיה\n    hi: मलेशिया\n    hr: Malezija\n    ht: Malezi\n    hu: Malajzia\n    hy: Մալազիա\n    ia: Malaysia\n    id: Malaysia\n    ie: Malaysia\n    io: Malaizia\n    is: Malasía\n    it: Malesia\n    ja: マレーシア\n    jv: Malaysia\n    ka: მალაიზია\n    ki: Malaysia\n    kk: Малайзия\n    km: ម៉ាឡេស៊ី\n    kn: ಮಲೇಶಿಯ\n    ko: 말레이시아\n    ku: Malezya\n    kv: Малайзия\n    kw: Malaysi\n    ky: Малайзия\n    la: Malaesia\n    lb: Malaysia\n    li: Maleisië\n    lo: ປະເທດມາເລເຊຍ\n    lt: Malaizija\n    lv: Malaizija\n    mi: Marēhia\n    mk: Малезија\n    ml: മലേഷ്യ\n    mn: Малайз\n    mr: मलेशिया\n    ms: Maleisië\n    mt: Malażja\n    my: မလေးရှားနိုင်ငံ\n    na: Maraidja\n    ne: मलेशिया\n    nl: Maleisië\n    \"no\": Malaysia\n    nv: Maléízha\n    oc: Malàisia\n    or: ମାଲେସିଆ\n    os: Малайзи\n    pa: ਮਲੇਸ਼ੀਆ\n    pl: Malezja\n    pt: Malásia\n    qu: Malasya\n    ro: Malaezia\n    ru: Малайзия\n    rw: Malesiya\n    sa: मलयेशिया\n    se: Malesia\n    sg: Malezïi\n    sh: Malezija\n    sk: Malajzia\n    sl: Malezija\n    so: Malaysiya\n    sq: Malajzia\n    sr: Малезија\n    ss: IMaleshiya\n    su: Malaysia\n    sv: Malaysia\n    sw: Malaysia\n    ta: மலேசியா\n    te: మలేషియా\n    tg: Малайзия\n    th: ประเทศมาเลเซีย\n    tk: Malaýziýa\n    tl: Malasya\n    tr: Malezya\n    tt: Малайзия\n    tw: Malaysia\n    ug: مالايسىيا\n    uk: Малайзія\n    ur: ملائیشیا\n    uz: Malayziya\n    vi: Malaysia\n    vo: Malaysiyän\n    wo: Maleesi\n    yi: מאלייזיע\n    yo: Malaysia\n    za: Majlaizsihya\n    zh: 马来西亚\n"
  },
  {
    "path": "settings/country-names/mz.yaml",
    "content": "name: \n    default: Moçambique\n    af: Mosambiek\n    am: ሞዛምቢክ\n    an: Mozambique\n    ar: موزمبيق\n    az: Mozambik\n    ba: Мозамбик\n    be: Мазамбік\n    bg: Мозамбик\n    bm: Mozanbik\n    bn: মোজাম্বিক\n    bo: མོ་ཛམ་བིཀ།\n    br: Mozambik\n    bs: Mozambik\n    ca: Moçambic\n    ce: Мозамбик\n    co: Mozambicu\n    cs: Mosambik\n    cv: Мозамбик\n    cy: Mosambic\n    da: Mozambique\n    de: Mosambik\n    dv: މުސިންބީ\n    el: Μοζαμβίκη\n    en: Mozambique\n    eo: Mozambiko\n    es: Mozambique\n    et: Mosambiik\n    eu: Mozambike\n    fa: موزامبیک\n    fi: Mosambik\n    fo: Mosambik\n    fr: Mozambique\n    fy: Mozambyk\n    ga: Poblacht Mhósaimbíc\n    gd: Mòsaimbic\n    gl: Mozambique\n    gn: Mosambike\n    gv: Yn Vosambeeck\n    he: מוזמביק\n    hi: मोज़ाम्बीक\n    hr: Mozambik\n    ht: Mozanbik\n    hu: Mozambik\n    hy: Մոզամբիկ\n    ia: Mozambique\n    id: Mozambik\n    ie: Mozambique\n    io: Mozambik\n    is: Mósambík\n    it: Mozambico\n    ja: モザンビーク\n    jv: Mozambik\n    ka: მოზამბიკი\n    kg: Musambiki\n    kk: Мозамбик\n    kn: ಮೊಜಾಂಬಿಕ್\n    ko: 모잠비크\n    ku: Mozambîk\n    kw: Mosambik\n    la: Mozambicum\n    lb: Mosambik\n    li: Mozambique\n    ln: Mozambíki\n    lt: Mozambikas\n    lv: Mozambika\n    mg: Mozambika\n    mi: Mohapiki\n    mk: Мозамбик\n    ml: മൊസാംബിക്ക്\n    mn: Мозамбик\n    mr: मोझांबिक\n    ms: Mozambique\n    mt: Możambik\n    my: မိုဇမ်ဘစ်နိုင်ငံ\n    nl: Mozambique\n    \"no\": Mosambik\n    ny: Mozambique\n    oc: Moçambic\n    or: ମୋଜାମ୍ବିକ\n    os: Мозамбик\n    pa: ਮੋਜ਼ੈਂਬੀਕ\n    pl: Mozambik\n    ps: موزمبيق\n    pt: Moçambique\n    qu: Musambik\n    ro: Mozambic\n    ru: Мозамбик\n    rw: Mozambike\n    sa: मोजम्बीक\n    sc: Mozambico\n    se: Mosambik\n    sg: Mözämbîka\n    sh: Mozambik\n    sk: Mozambik\n    sl: Mozambik\n    sn: Mozambique\n    so: Musanbiig\n    sq: Mozambiku\n    sr: Мозамбик\n    ss: IMozambikhi\n    su: Mosambik\n    sv: Moçambique\n    sw: Msumbiji\n    ta: மொசாம்பிக்\n    tg: Мозамбик\n    th: ประเทศโมซัมบิก\n    ti: ሞዛምቢክ\n    tk: Mozambik\n    tl: Musambik\n    tr: Mozambik\n    ts: Mozambique\n    ug: موزامبىك\n    uk: Мозамбік\n    ur: موزمبیق\n    uz: Mozambik\n    ve: Mozambikwi\n    vi: Mozambique\n    vo: Mozambikän\n    wo: Mosambik\n    yi: מאזאמביק\n    yo: Mòsámbìk\n    zh: 莫桑比克\n    zu: IMozambiki\n"
  },
  {
    "path": "settings/country-names/na.yaml",
    "content": "name: \n    default: Namibia\n    af: Namibië\n    am: ናሚቢያ\n    an: Namibia\n    ar: ناميبيا\n    az: Namibiya\n    ba: Намибия\n    be: Намібія\n    bg: Намибия\n    bm: Namibia\n    bn: নামিবিয়া\n    bo: ན་མི་བྷི་ཡ།\n    br: Namibia\n    bs: Namibija\n    ca: Namíbia\n    ce: Намиби\n    cs: Namibie\n    cv: Намиби\n    cy: Namibia\n    da: Namibia\n    de: Namibia\n    el: Ναμίμπια\n    en: Namibia\n    eo: Namibio\n    es: Namibia\n    et: Namiibia\n    eu: Namibia\n    fa: نامیبیا\n    fi: Namibia\n    fo: Namibia\n    fr: Namibie\n    fy: Namybje\n    ga: An Namaib\n    gd: Naimibia\n    gl: Namibia\n    gv: Yn Nameeb\n    he: נמיביה\n    hi: नामीबिया\n    hr: Namibija\n    ht: Namibi\n    hu: Namíbia\n    hy: Նամիբիա\n    ia: Namibia\n    id: Namibia\n    ie: Namibia\n    io: Namibia\n    is: Namibía\n    it: Namibia\n    ja: ナミビア\n    jv: Namibia\n    ka: ნამიბია\n    kg: Namibia\n    ki: Namibia\n    kk: Намибия\n    kn: ನಮೀಬಿಯ\n    ko: 나미비아\n    ku: Namîbya\n    kw: Namibi\n    la: Namibia\n    lb: Namibien\n    li: Namibië\n    ln: Namibia\n    lt: Namibija\n    lv: Namībija\n    mg: Namibia\n    mi: Namīpia\n    mk: Намибија\n    ml: നമീബിയ\n    mn: Намиби\n    mr: नामिबिया\n    ms: Namibia\n    mt: Namibja\n    my: နမီးဘီးယားနိုင်ငံ\n    nl: Namibië\n    \"no\": Namibia\n    nv: Namííbya\n    oc: Namibia\n    or: ନାମିବିଆ\n    os: Намиби\n    pa: ਨਮੀਬੀਆ\n    pl: Namibia\n    ps: نېمبیا\n    pt: Namíbia\n    qu: Namiwya\n    rm: Namibia\n    ro: Namibia\n    ru: Намибия\n    rw: Namibiya\n    sa: नमीबिया\n    sc: Namìbia\n    se: Namibia\n    sg: Namibùii\n    sh: Namibija\n    sk: Namíbia\n    sl: Namibija\n    sn: Namibia\n    so: Nambiya\n    sq: Namibia\n    sr: Намибија\n    ss: INamibiya\n    st: Namibia\n    su: Namibia\n    sv: Namibia\n    sw: Namibia\n    ta: நமீபியா\n    te: నమీబియా\n    tg: Намибия\n    th: ประเทศนามิเบีย\n    ti: ናሚቢያ\n    tk: Namibiýa\n    tl: Namibya\n    tn: Namibia\n    tr: Namibya\n    ts: Namibia\n    tt: Намибия\n    ug: نامىبىيە\n    uk: Намібія\n    ur: نمیبیا\n    uz: Namibiya\n    ve: Namibia\n    vi: Namibia\n    vo: Namibiyän\n    wo: Namibi\n    yi: נאמיביע\n    yo: Nàmíbíà\n    zh: 纳米比亚\n    zu: INamibhiya\n"
  },
  {
    "path": "settings/country-names/ne.yaml",
    "content": "name: \n    default: Niger\n    af: Niger\n    am: ኒጄር\n    an: Nícher\n    ar: النيجر\n    az: Niger\n    ba: Нигер\n    be: Нігер\n    bg: Нигер\n    bm: Nijer\n    bn: নাইজার\n    bo: ནི་ཇར།\n    br: Niger\n    bs: Niger\n    ca: Níger\n    ce: Нигер\n    cs: Niger\n    cy: Niger\n    da: Niger\n    de: Niger\n    dv: ނީޖަރު\n    ee: Niger\n    el: Νίγηρας\n    en: Niger\n    eo: Niĝero\n    es: Níger\n    et: Niger\n    eu: Niger\n    fa: نیجر\n    fi: Niger\n    fo: Niger\n    fr: Niger\n    fy: Niger\n    ga: An Nígir\n    gd: Nìgeir\n    gl: Níxer\n    gu: નાઈજર\n    gv: Yn Neegeyr\n    ha: Nijar\n    he: ניז'ר\n    hi: नाइजर\n    hr: Niger\n    ht: Nijè\n    hu: Niger\n    hy: Նիգեր\n    ia: Niger\n    id: Niger\n    ie: Niger\n    ig: Niger\n    io: Nijer\n    is: Níger\n    it: Niger\n    ja: ニジェール\n    jv: Niger\n    ka: ნიგერი\n    kg: Nijer\n    kk: Нигер\n    ko: 니제르\n    ku: Nîjer\n    kw: Pow Nijer\n    la: Niger\n    lb: Niger\n    li: Niger\n    ln: Nizer\n    lt: Nigeris\n    lv: Nigēra\n    mi: Ngāika\n    mk: Нигер\n    ml: നീഷർ\n    mn: Нигер\n    mr: नायजर\n    ms: Niger\n    mt: Niġer\n    my: နိုင်ဂျာနိုင်ငံ\n    nl: Niger\n    \"no\": Niger\n    oc: Nigèr\n    or: ନାଇଜର\n    os: Нигер\n    pa: ਨਾਈਜਰ\n    pl: Niger\n    ps: نایجېر\n    pt: Níger\n    qu: Niqir\n    ro: Niger\n    ru: Нигер\n    rw: Nigeri\n    sa: नीजे\n    sc: Nixèr\n    se: Niger\n    sg: Nizëre\n    sh: Niger\n    si: නයිජර්\n    sk: Niger\n    sl: Niger\n    sn: Niger\n    so: Nayjar\n    sq: Nigeri\n    sr: Нигер\n    ss: INayijari\n    su: Niger\n    sv: Niger\n    sw: Niger\n    ta: நைஜர்\n    te: నైజర్\n    tg: Ниҷер\n    th: ประเทศไนเจอร์\n    ti: ናይጀር\n    tk: Niger\n    tl: Niyer\n    tr: Nijer\n    ts: Niger\n    ug: نىگېر\n    uk: Нігер\n    ur: نائجر\n    uz: Niger\n    vi: Niger\n    vo: Nigerän\n    wo: Niseer\n    yi: ניזשער\n    yo: Nìjẹ̀r\n    zh: 尼日尔\n    zu: INayighe\n"
  },
  {
    "path": "settings/country-names/ng.yaml",
    "content": "name: \n    default: Nigeria\n    af: Nigerië\n    ak: Nigeria\n    am: ናይጄሪያ\n    an: Nicheria\n    ar: نيجيريا\n    az: Nigeriya\n    ba: Нигерия\n    be: Нігерыя\n    bg: Нигерия\n    bm: Nijeria\n    bn: নাইজেরিয়া\n    bo: ནི་ཇི་རི་ཡ།\n    br: Nigeria\n    bs: Nigerija\n    ca: Nigèria\n    ce: Нигери\n    cs: Nigérie\n    cv: Нигери\n    cy: Nigeria\n    da: Nigeria\n    de: Nigeria\n    dv: ނައިޖީރިއާ\n    ee: Nigeria\n    el: Νιγηρία\n    en: Nigeria\n    eo: Niĝerio\n    es: Nigeria\n    et: Nigeeria\n    eu: Nigeria\n    fa: نیجریه\n    ff: Niiseriya\n    fi: Nigeria\n    fo: Nigeria\n    fr: Nigéria\n    fy: Nigearia\n    ga: An Nigéir\n    gd: Nìgeiria\n    gl: Nixeria\n    gn: Niheria\n    gu: નાઈજેરિયા\n    gv: Yn Naigeer\n    ha: Nijeriya\n    he: ניגריה\n    hi: नाईजीरिया\n    hr: Nigerija\n    ht: Nijerya\n    hu: Nigéria\n    hy: Նիգերիա\n    ia: Nigeria\n    id: Nigeria\n    ie: Nigeria\n    ig: Naigeria\n    io: Nigeria\n    is: Nígería\n    it: Nigeria\n    ja: ナイジェリア\n    jv: Nigeria\n    ka: ნიგერია\n    kg: Nizeria\n    kk: Нигерия\n    kn: ನೈಜೀರಿಯ\n    ko: 나이지리아\n    ks: نایجیرِیا\n    ku: Nîjerya\n    kw: Nijeri\n    la: Nigeria\n    lb: Nigeria\n    li: Nigeria\n    ln: Nizeria\n    lt: Nigerija\n    lv: Nigērija\n    mg: Nizeria\n    mi: Ngāitiria\n    mk: Нигерија\n    ml: നൈജീരിയ\n    mn: Нигери\n    mr: नायजेरिया\n    ms: Nigeria\n    mt: Niġerja\n    my: နိုင်ဂျီးရီးယားနိုင်ငံ\n    ne: नाइजेरिया\n    nl: Nigeria\n    \"no\": Nigeria\n    oc: Nigèria\n    or: ନାଇଜେରିଆ\n    os: Нигери\n    pa: ਨਾਈਜੀਰੀਆ\n    pl: Nigeria\n    ps: نايجېريا\n    pt: Nigéria\n    qu: Niqirya\n    ro: Nigeria\n    ru: Нигерия\n    rw: Nijeriya\n    sa: नैजीरिया\n    sc: Nigéria\n    se: Nigeria\n    sg: Nizerïa\n    sh: Nigerija\n    sk: Nigéria\n    sl: Nigerija\n    sn: Nigeria\n    so: Nayjeeriya\n    sq: Nigeria\n    sr: Нигерија\n    ss: INayijeriya\n    su: Nigeria\n    sv: Nigeria\n    sw: Nigeria\n    ta: நைஜீரியா\n    te: నైజీరియా\n    tg: Ниҷерия\n    th: ประเทศไนจีเรีย\n    ti: ናይጂሪያ\n    tk: Nigeriýa\n    tl: Nigerya\n    tr: Nijerya\n    ts: Nigeria\n    tt: Нигерия\n    ug: نىگېرىيە\n    uk: Нігерія\n    ur: نائجیریا\n    uz: Nigeriya\n    vi: Nigeria\n    vo: Nigeriyän\n    wa: Nidjeria\n    xh: INigeria\n    yi: ניגעריע\n    yo: Nàìjíríà\n    za: Nizywlihya\n    zh: 奈及利亞\n    zu: INigeria\n"
  },
  {
    "path": "settings/country-names/ni.yaml",
    "content": "name: \n    default: Nicaragua\n    af: Nicaragua\n    am: ኒካራጓ\n    an: Nicaragua\n    ar: نيكاراجوا\n    ay: Nikarwa\n    az: Nikaraqua\n    ba: Никарагуа\n    be: Нікарагуа\n    bg: Никарагуа\n    bm: Nikaragwa\n    bn: নিকারাগুয়া\n    bo: ནི་ཀ་ར་གུ་ཝ།\n    br: Nicaragua\n    bs: Nikaragva\n    ca: Nicaragua\n    ce: Никарагуа\n    cs: Nikaragua\n    cy: Nicaragua\n    da: Nicaragua\n    de: Nicaragua\n    dv: ނިކަރާގުއާ\n    ee: Nicaragua\n    el: Νικαράγουα\n    en: Nicaragua\n    eo: Nikaragvo\n    es: Nicaragua\n    et: Nicaragua\n    eu: Nikaragua\n    fa: نیکاراگوئه\n    fi: Nicaragua\n    fo: Nikaragua\n    fr: Nicaragua\n    fy: Nikaragûa\n    ga: Nicearagua\n    gd: Niocaragua\n    gl: Nicaragua\n    gn: Nikaragua\n    gv: Yn Nickeraag\n    he: ניקרגואה\n    hi: निकारागुआ\n    hr: Nikaragva\n    ht: Nikaragwa\n    hu: Nicaragua\n    hy: Նիկարագուա\n    ia: Nicaragua\n    id: Nikaragua\n    ie: Nicaragua\n    io: Nikaragua\n    is: Níkaragva\n    it: Nicaragua\n    ja: ニカラグア\n    jv: Nikaragua\n    ka: ნიკარაგუა\n    kk: Никарагуа\n    ko: 니카라과\n    ku: Nîkaragua\n    kv: Никарагуа\n    kw: Nikaragwa\n    la: Nicaragua\n    lb: Nicaragua\n    li: Nicaragua\n    ln: Nikalagwa\n    lt: Nikaragva\n    lv: Nikaragva\n    mg: Nicaragua\n    mi: Nikarāhua\n    mk: Никарагва\n    ml: നിക്കരാഗ്വ\n    mn: Никарагуа\n    mr: निकाराग्वा\n    ms: Nicaragua\n    mt: Nikaragwa\n    my: နီကာရာဂွါနိုင်ငံ\n    ne: निकाराग्वा\n    nl: Nicaragua\n    \"no\": Nicaragua\n    oc: Nicaragua\n    or: ନିକାରାଗୁଆ\n    os: Никарагуæ\n    pa: ਨਿਕਾਰਾਗੁਆ\n    pl: Nikaragua\n    ps: نیکاراګوا\n    pt: Nicarágua\n    qu: Nikarawa\n    ro: Nicaragua\n    ru: Никарагуа\n    rw: Nikaragwa\n    sa: निकारगुवा\n    se: Nicaragua\n    sh: Nikaragva\n    sk: Nikaragua\n    sl: Nikaragva\n    so: Nikaragua\n    sq: Nikaraguaja\n    sr: Никарагва\n    ss: INikhalaga\n    su: Nikaragua\n    sv: Nicaragua\n    sw: Nikaragua\n    ta: நிக்கராகுவா\n    tg: Никарагуа\n    th: ประเทศนิการากัว\n    tl: Nicaragua\n    tr: Nikaragua\n    tt: Никарагуа\n    ug: نىكاراگۇئا\n    uk: Нікарагуа\n    ur: نکاراگوا\n    uz: Nikaragua\n    vi: Nicaragua\n    vo: Nikaraguvän\n    wo: Nikaraaguwa\n    yi: ניקאראגוא\n    yo: Nikarágúà\n    zh: 尼加拉瓜\n    zu: Nicaragua\n"
  },
  {
    "path": "settings/country-names/nl.yaml",
    "content": "name: \n    default: Nederland\n    af: Nederland\n    am: ሆላንድ\n    an: Países Baixos\n    ar: هولندا\n    ay: Aynacha Jach'a Markanaka\n    az: Niderland\n    ba: Нидерландтар\n    be: Нідэрланды\n    bg: Нидерландия\n    bh: एम्सटर्डम\n    bi: Netherlands\n    bn: নেদারল্যান্ডস\n    bo: ཧོ་ལན།\n    br: Izelvroioù\n    bs: Holandija\n    ca: Països Baixos\n    ce: Нидерландаш\n    co: Paesi Bassi\n    cs: Nizozemsko\n    cu: Нидєрландꙑ\n    cv: Нидерландсем\n    cy: Yr Iseldiroedd\n    da: Holland\n    de: Niederlande\n    dv: ނެދަލޭންޑު\n    dz: ནེ་དར་ལེནཌསི་\n    ee: Netherlands\n    el: Κάτω Χώρες\n    en: Netherlands\n    eo: Nederlando\n    es: Países Bajos\n    et: Holland\n    eu: Herbehereak\n    fa: هلند\n    ff: Holannda\n    fi: Alankomaat\n    fo: Niðurlond\n    fr: Pays-Bas\n    fy: Nederlân\n    ga: An Ísiltír\n    gd: Na Tìrean Ìsle\n    gl: Países Baixos\n    gn: Tetãnguéra Yvýi\n    gu: નેધરલેંડ\n    gv: Yn Çheer Injil\n    he: הולנד\n    hi: नीदरलैण्ड\n    hr: Nizozemska\n    ht: Peyiba\n    hu: Hollandia\n    hy: Նիդերլանդներ\n    ia: Pais Basse\n    id: Belanda\n    ie: Nederland\n    io: Nederlando\n    is: Holland\n    it: Paesi Bassi\n    ja: オランダ\n    jv: Walanda\n    ka: ნიდერლანდი\n    kg: Pays-Bas\n    kk: Нидерланд\n    kl: Hollandi\n    kn: ನೆದರ್‍ಲ್ಯಾಂಡ್ಸ್\n    ko: 네덜란드\n    ks: नेदरलैंड्स\n    ku: Holenda\n    kv: Нидерландъяс\n    kw: Iseldiryow\n    ky: Нидерландтар\n    la: Nederlandia\n    lb: Holland\n    li: Nederland\n    ln: Holanda\n    lt: Nyderlandai\n    lv: Nīderlande\n    mi: Hōrana\n    mk: Холандија\n    ml: നെതർലന്റ്സ്\n    mn: Нидерланд\n    mr: नेदरलँड्स\n    ms: Belanda\n    mt: Pajjiżi l-Baxxi\n    my: နယ်သာလန်နိုင်ငံ\n    na: Eben Eyong\n    ne: नेदरल्याण्ड्स\n    nl: Nederland\n    \"no\": Nederland\n    nv: Tsin Bikeeʼ Dineʼé Bikéyah\n    oc: Païses Basses\n    os: Нидерландтæ\n    pa: ਨੀਦਰਲੈਂਡ\n    pl: Królestwo Niderlandów\n    ps: هالنډ\n    pt: Países Baixos\n    qu: Urasuyu\n    rm: Pajais Bass\n    ro: Țările de Jos\n    ru: Нидерланды\n    rw: Ubuholandi\n    sa: नेदरलैंड्स\n    sc: Logos Bascios\n    se: Vuolleeatnamat\n    sh: Holandija\n    si: නෙදර්ලන්තය\n    sk: Holandsko\n    sl: Nizozemska\n    so: Holland\n    sq: Holanda\n    sr: Холандија\n    ss: IDashi\n    st: Hôlanê\n    su: Walanda\n    sv: Nederländerna\n    sw: Uholanzi\n    ta: நெதர்லாந்து\n    te: నెదర్లాండ్\n    tg: Нидерланд\n    th: ประเทศเนเธอร์แลนด์\n    tk: Niderlandlar\n    tl: Olanda\n    to: Holani\n    tr: Hollanda\n    tt: Нидерландлар\n    ug: گوللاندىيە\n    uk: Нідерланди\n    ur: ہالینڈ\n    uz: Niderlandlar\n    vi: Hà Lan\n    vo: Nedän\n    wa: Bas Payis\n    wo: Olaand\n    xh: ENetherlands\n    yi: האלאנד\n    yo: Nẹ́dálándì\n    zh: 荷蘭\n    zu: Netherlands\n"
  },
  {
    "path": "settings/country-names/no.yaml",
    "content": "name:\n    default: Norge\n    af: Noorweë\n    am: ኖርዌይ\n    an: Noruega\n    ar: النرويج\n    ay: Nurweka\n    az: Norveç\n    ba: Норвегия\n    be: Нарвегія\n    bg: Норвегия\n    bi: Norway\n    bm: Norwij\n    bn: নরওয়ে\n    bo: ནོར་ཝེ།\n    br: Norvegia\n    bs: Norveška\n    ca: Noruega\n    ce: Норвеги\n    co: Nurvegia\n    cs: Norsko\n    cu: Норєгъ\n    cv: Норвеги\n    cy: Norwy\n    da: Norge\n    de: Norwegen\n    dv: ނޯވޭ\n    dz: ནོ་ཝེ་\n    ee: Norway\n    el: Νορβηγία\n    en: Norway\n    eo: Norvegio\n    es: Noruega\n    et: Norra\n    eu: Norvegia\n    fa: نروژ\n    fi: Norja\n    fo: Noregur\n    fr: Norvège\n    fy: Noarwegen\n    ga: An Iorua\n    gd: Nirribhidh\n    gl: Noruega\n    gn: Noruega\n    gu: નોર્વે\n    gv: Norlynn\n    he: נורבגיה\n    hi: नॉर्वे\n    hr: Norveška\n    ht: Nòvèj\n    hu: Norvégia\n    hy: Նորվեգիա\n    ia: Norvegia\n    id: Norwegia\n    ie: Norvegia\n    io: Norvegia\n    is: Noregur\n    it: Norvegia\n    iu: ᓄᕐᒋ\n    ja: ノルウェー\n    jv: Norwégia\n    ka: ნორვეგია\n    kg: Norge\n    kk: Норвегия\n    kl: Norge\n    kn: ನಾರ್ವೇ\n    ko: 노르웨이\n    ku: Norwêc\n    kv: Норвегия\n    kw: Norgagh\n    ky: Норвегия\n    la: Norvegia\n    lb: Norwegen\n    li: Noorwege\n    ln: Norvej\n    lt: Norvegija\n    lv: Norvēģija\n    mg: Norvezy\n    mi: Nōwei\n    mk: Норвешка\n    ml: നോർവെ\n    mn: Норвеги\n    mr: नॉर्वे\n    ms: Norway\n    mt: Norveġja\n    my: နော်ဝေနိုင်ငံ\n    na: Norwei\n    nb: Norge\n    ne: नर्वे\n    nl: Noorwegen\n    nn: Noreg\n    \"no\": Norge\n    oc: Norvègia\n    om: Norway\n    or: ନରୱେ\n    os: Норвеги\n    pa: ਨਾਰਵੇ\n    pl: Norwegia\n    ps: ناروې\n    pt: Noruega\n    qu: Nurwiga\n    rm: Norvegia\n    rn: Noruega\n    ro: Norvegia\n    ru: Норвегия\n    rw: Noruveje\n    sa: नार्वे\n    sc: Norvegia\n    se: Norga\n    sh: Norveška\n    sk: Nórsko\n    sl: Norveška\n    so: Norway\n    sq: Norvegjia\n    sr: Норвешка\n    ss: INoweyi\n    su: Norwégia\n    sv: Norge\n    sw: Norwei\n    ta: நோர்வே\n    te: నార్వే\n    tg: Норвегия\n    th: ประเทศนอร์เวย์\n    tk: Norwegiýa\n    tl: Noruwega\n    tr: Norveç\n    ts: Norge\n    tt: Норвегия\n    ug: نورۋېگىيە\n    uk: Норвегія\n    ur: ناروے\n    uz: Norvegiya\n    vi: Na Uy\n    vo: Norgän\n    wa: Norvedje\n    wo: Noorwees\n    yi: נארוועגיע\n    yo: Nọ́rwèy\n    za: Nozveih\n    zh: 挪威\n    zu: INoki\n\n"
  },
  {
    "path": "settings/country-names/np.yaml",
    "content": "name: \n    default: Nepal\n    ar: نيبال\n    be: Непал\n    br: Nepal\n    el: Νεπάλ\n    en: Nepal\n    eo: Nepalo\n    fa: نپال\n    fi: Nepal\n    fr: Népal\n    ga: Neipeal\n    gd: Neapàl\n    he: נפאל\n    hu: Nepál\n    is: Nepal\n    it: Nepal\n    ja: ネパール\n    la: Nepalia\n    lt: Nepalas\n    lv: Nepāla\n    mn: Балба\n    ne: नेपाल\n    \"no\": Nepal\n    pl: Nepal\n    ru: Непал\n    sv: Nepal\n    th: ประเทศเนปาล\n    uk: Непал\n    zh: 尼泊尔\n"
  },
  {
    "path": "settings/country-names/nr.yaml",
    "content": "name: \n    default: Naoero\n    am: ናውሩ\n    ar: ناورو\n    be: Наўру\n    bg: Науру\n    bn: নাউরু\n    br: Nauru\n    cs: Nauru\n    da: Nauru\n    de: Nauru\n    dv: ނައުރޫ\n    el: Ναουρού\n    en: Nauru\n    eo: Nauro\n    fa: نائورو\n    fi: Nauru\n    fr: Nauru\n    fy: Naurû\n    ga: Nárú\n    he: נאורו\n    hi: नाउरु\n    hr: Nauru\n    hu: Nauru\n    is: Nárú\n    ja: ナウル\n    li: Naoeroe\n    lv: Nauru\n    ml: നൗറു\n    mn: Науру\n    mt: Nawru\n    \"no\": Nauru\n    pl: Nauru\n    ru: Науру\n    se: Nauru\n    sk: Nauru\n    sq: Naurua\n    sv: Nauru\n    ta: நவூரு\n    th: ประเทศนาอูรู\n    uk: Науру\n    ur: ناورو\n    vo: Naureän\n    zh: 諾魯\n"
  },
  {
    "path": "settings/country-names/nu.yaml",
    "content": "name: \n    default: Niuē\n    ar: نييوي\n    be: Ніуэ\n    bg: Ниуе\n    br: Niue\n    cs: Niue\n    da: Niue\n    de: Niue\n    dv: ނީއު\n    el: Νιούε\n    en: Niue\n    eo: Niuo\n    es: Niue\n    fa: نیووی\n    fi: Niue\n    fr: Niue\n    fy: Niûé\n    ga: Niue\n    he: ניואה\n    hr: Niue\n    hu: Niue\n    is: Niue\n    ja: ニウエ\n    ka: ნიუე\n    kk: Ниуе\n    ko: 니우에\n    ku: Niûe\n    lt: Niujė\n    lv: Niue\n    mk: Ниуе\n    ml: നിയുവെ\n    mn: Ниуэ\n    mr: न्युए\n    \"no\": Niue\n    os: Ниуэ\n    pl: Niue\n    ru: Ниуэ\n    rw: Niyuwe\n    sk: Niue\n    sr: Нијуе\n    sv: Niue\n    ta: நியுவே\n    th: นีอูเอ\n    ug: Niué Arili\n    uk: Ніуе\n    ur: نیووے\n    wo: Niwe\n    zh: 紐埃\n"
  },
  {
    "path": "settings/country-names/nz.yaml",
    "content": "name: \n    default: New Zealand / Aotearoa\n    af: Nieu-Seeland\n    am: ኒው ዚላንድ\n    an: Nueva Zelanda\n    ar: نيوزيلندا\n    az: Yeni Zelandiya\n    ba: Яңы Зеландия\n    be: Новая Зеландыя\n    bg: Нова Зеландия\n    bi: Niu Zilan\n    bm: New Zealand\n    bn: নিউজিল্যান্ড\n    bo: ནིའུ་ཛི་ལེན་ཌི།\n    br: Zeland-Nevez\n    bs: Novi Zeland\n    ca: Nova Zelanda\n    cs: Nový Zéland\n    cv: Çĕнĕ Зеланди\n    cy: Seland Newydd\n    da: New Zealand\n    de: Neuseeland\n    dv: ނިއުޒިލޭންޑު\n    dz: ནིའུ་ཛི་ལེནཌ་\n    el: Νέα Ζηλανδία\n    en: New Zealand\n    eo: Nov-Zelando\n    es: Nueva Zelanda\n    et: Uus-Meremaa\n    eu: Zeelanda Berria\n    fa: نیوزیلند\n    fi: Uusi-Seelanti\n    fo: Nýsæland\n    fr: Nouvelle-Zélande\n    fy: Nij-Seelân\n    ga: An Nua-Shéalainn\n    gd: Sealainn Nuadh\n    gl: Nova Zelandia\n    gv: Yn Teelynn Noa\n    he: ניו זילנד\n    hi: न्यूज़ीलैण्ड\n    hr: Novi Zeland\n    ht: Nouvèl Zelann\n    hu: Új-Zéland\n    hy: Նոր Զելանդիա\n    ia: Nove Zelanda\n    id: Selandia Baru\n    ie: Nov-Zeland\n    io: Nova-Zelando\n    is: Nýja-Sjáland\n    it: Nuova Zelanda\n    ja: ニュージーランド\n    jv: Sélandia Anyar\n    ka: ახალი ზელანდია\n    kk: Жаңа Зеландия\n    kl: New Zealand\n    km: នូវែលសេឡង់\n    kn: ನ್ಯೂ ಜೀಲ್ಯಾಂಡ್\n    ko: 뉴질랜드\n    ku: Nû Zelenda\n    kv: Выль Зеландия\n    kw: Mordir Nowydh\n    la: Nova Zelandia\n    lb: Neiséiland\n    li: Nui-Zieland\n    lo: ປະເທດນູແວນ ເຊລັງ\n    lt: Naujoji Zelandija\n    lv: Jaunzēlande\n    mi: Aotearoa\n    mk: Нов Зеланд\n    ml: ന്യൂസീലൻഡ്\n    mn: Шинэ Зеланд\n    mr: न्यू झीलँड\n    ms: New Zealand\n    mt: New Zealand\n    my: နယူးဇီလန်နိုင်ငံ\n    na: Niu Djiran\n    ne: न्यू जील्याण्ड\n    nl: Nieuw-Zeeland\n    \"no\": New Zealand\n    oc: Nòva Zelanda\n    or: ନିଉଜିଲ୍ୟାଣ୍ଡ\n    os: Ног Зеланди\n    pa: ਨਿਊਜ਼ੀਲੈਂਡ\n    pl: Nowa Zelandia\n    pt: Nova Zelândia\n    qu: Musuq Silanda\n    rm: Nova Zelanda\n    ro: Noua Zeelandă\n    ru: Новая Зеландия\n    rw: Nuveli Zelande\n    sa: न्यू-जीलैंड\n    se: Aotearoa\n    sh: Novi Zeland\n    sk: Nový Zéland\n    sl: Nova Zelandija\n    sm: Niu Sila\n    so: New Zealand\n    sq: Zelanda e Re\n    sr: Нови Зеланд\n    su: Selandia Anyar\n    sv: Nya Zeeland\n    sw: New Zealand\n    ta: நியூசிலாந்து\n    te: న్యూజీలాండ్\n    tg: Зеландияи Нав\n    th: ประเทศนิวซีแลนด์\n    tk: Täze Zelandiýa\n    tl: New Zealand\n    tr: Yeni Zelanda\n    tt: Яңа Зеландия\n    ty: Aotearoa\n    ug: يېڭى زېلاندىيە\n    uk: Нова Зеландія\n    ur: نیوزی لینڈ\n    uz: Yangi Zelandiya\n    vi: New Zealand\n    vo: Nula-Seleäns\n    wa: Nouve Zelande\n    wo: Seland-Gu-Bees\n    yi: ניו זילאנד\n    yo: New Zealand\n    za: Saen Saelanz\n    zh: 新西兰\n    zu: INyuzilandi\n"
  },
  {
    "path": "settings/country-names/om.yaml",
    "content": "name: \n    default: عمان\n    af: Oman\n    am: ኦማን\n    an: Omán\n    ar: عمان\n    az: Oman\n    ba: Оман\n    be: Аман\n    bg: Оман\n    bn: ওমান\n    bo: ཨོ་མན།\n    br: Oman\n    bs: Oman\n    ca: Oman\n    ce: Оман\n    cs: Omán\n    cv: Оман\n    cy: Oman\n    da: Oman\n    de: Oman\n    dv: ޢުމާން\n    el: Ομάν\n    en: Oman\n    eo: Omano\n    es: Omán\n    et: Omaan\n    eu: Oman\n    fa: عمان\n    fi: Oman\n    fr: Oman\n    fy: Oman\n    ga: Óman\n    gd: Omàn\n    gl: Omán\n    gn: Omã\n    gu: ઓમાન\n    gv: Yn Omaan\n    he: עומאן\n    hi: ओमान\n    hr: Oman\n    ht: Omàn\n    hu: Omán\n    hy: Օման\n    ia: Oman\n    id: Oman\n    ie: Oman\n    io: Oman\n    is: Óman\n    it: Oman\n    ja: オマーン\n    jv: Oman\n    ka: ომანი\n    kk: Оман\n    kl: Oman\n    kn: ಒಮಾನ್\n    ko: 오만\n    ku: Oman\n    kv: Оман\n    kw: Oman\n    la: Omania\n    lb: Oman\n    li: Omaan\n    ln: Oman\n    lt: Omanas\n    lv: Omāna\n    mi: Omāna\n    mk: Оман\n    ml: ഒമാൻ\n    mn: Оман\n    mr: ओमान\n    ms: Oman\n    my: အိုမန်နိုင်ငံ\n    na: Oman\n    nl: Oman\n    \"no\": Oman\n    nv: Omą́ą́\n    oc: Oman\n    or: ଓମାନ\n    os: Оман\n    pa: ਓਮਾਨ\n    pl: Oman\n    ps: عمان\n    pt: Omã\n    qu: Uman\n    ro: Oman\n    ru: Оман\n    rw: Omani\n    sa: ओमान\n    se: Oman\n    sh: Oman\n    si: ඕමානය\n    sk: Omán\n    sl: Oman\n    so: Cumaan\n    sq: Omani\n    sr: Оман\n    ss: IMani\n    su: Oman\n    sv: Oman\n    sw: Omani\n    ta: ஓமான்\n    te: ఒమన్\n    tg: Оман\n    th: ประเทศโอมาน\n    tk: Oman\n    tl: Oman\n    tr: Umman\n    tt: Оман\n    ug: ئومان\n    uk: Оман\n    ur: سلطنت عمان\n    uz: Oman\n    vi: Oman\n    vo: Lomän\n    wo: Omaan\n    yi: אמאן\n    yo: Oman\n    zh: 阿曼\n"
  },
  {
    "path": "settings/country-names/pa.yaml",
    "content": "name: \n    default: Panamá\n    af: Panama\n    am: ፓናማ\n    an: Panamá\n    ar: بنما\n    ay: Panama\n    az: Panama\n    ba: Панама\n    be: Панама\n    bg: Панама\n    bm: Panama\n    bn: পানামা\n    bo: པ་ན་མ།\n    br: Panamá\n    bs: Panama\n    ca: Panamà\n    ce: Панама\n    cs: Panama\n    cv: Панама\n    cy: Panama\n    da: Panama\n    de: Panama\n    dv: ޕެނަމާ\n    ee: Panama\n    el: Παναμάς\n    en: Panama\n    eo: Panamo\n    es: Panamá\n    et: Panama\n    eu: Panama\n    fa: پاناما\n    fi: Panama\n    fo: Panama\n    fr: Panamá\n    fy: Panama\n    ga: Panama\n    gd: Panama\n    gl: Panamá\n    gn: Panama\n    gu: પનામા\n    gv: Yn Phanamaa\n    he: פנמה\n    hi: पनामा\n    hr: Panama\n    ht: Panama\n    hu: Panama\n    hy: Պանամա\n    ia: Panama\n    id: Panama\n    ie: Panamá\n    io: Panama\n    is: Panama\n    it: Panamá\n    ja: パナマ\n    jv: Panama\n    ka: პანამა\n    ki: Panama\n    kk: Панама\n    kn: ಪನಾಮಾ\n    ko: 파나마\n    ku: Panama\n    kw: Panama\n    la: Panama\n    lb: Panama\n    li: Panama\n    ln: Panama\n    lt: Panama\n    lv: Panama\n    mg: Panama\n    mi: Panama\n    mk: Панама\n    ml: പനാമ\n    mn: Панам\n    mr: पनामा\n    ms: Panama\n    mt: Panama\n    my: ပနားမားနိုင်ငံ\n    ne: पानामा\n    nl: Panama\n    \"no\": Panama\n    oc: Panamà\n    or: ପାନାମା\n    os: Панамæ\n    pa: ਪਨਾਮਾ\n    pl: Panama\n    ps: پاناما\n    pt: Panamá\n    qu: Panama\n    ro: Panama\n    ru: Панама\n    rw: Panama\n    sa: पानामा\n    se: Panama\n    sh: Panama\n    sk: Panama\n    sl: Panama\n    so: Banama\n    sq: Panamaja\n    sr: Панама\n    ss: IPhanama\n    su: Panama\n    sv: Panama\n    sw: Panama\n    ta: பனாமா\n    te: పనామా\n    tg: Панама\n    th: ประเทศปานามา\n    tl: Panama\n    tr: Panama\n    tt: Панама\n    ug: پاناما\n    uk: Панама\n    ur: پاناما\n    uz: Panama\n    vi: Panama\n    vo: Panamän\n    wo: Panamaa\n    yi: פאנאמא\n    yo: Panamá\n    zh: 巴拿马\n    zu: Panama\n"
  },
  {
    "path": "settings/country-names/pe.yaml",
    "content": "name: \n    default: Perú\n    ab: Перу\n    af: Peru\n    ak: Peru\n    am: ፔሩ\n    an: Perú\n    ar: بيرو\n    ay: Piruw\n    az: Peru\n    ba: Перу\n    be: Перу\n    bg: Перу\n    bi: Peru\n    bm: Peru\n    bn: পেরু\n    bo: པེ་རུ།\n    br: Perou\n    bs: Peru\n    ca: Perú\n    ce: Перу\n    ch: Perú\n    co: Perù\n    cs: Peru\n    cv: Перу\n    cy: Periw\n    da: Peru\n    de: Peru\n    dv: ޕެރޫ\n    ee: Peru\n    el: Περού\n    en: Peru\n    eo: Peruo\n    es: Perú\n    et: Peruu\n    eu: Peru\n    fa: پرو\n    ff: Peru\n    fi: Peru\n    fo: Peru\n    fr: Pérou\n    fy: Perû\n    ga: Peiriú\n    gd: Pearù\n    gl: Perú\n    gn: Perũ\n    gu: પેરુ\n    gv: Yn Pheroo\n    he: פרו\n    hi: पेरू\n    hr: Peru\n    ht: Pewou\n    hu: Peru\n    hy: Պերու\n    ia: Peru\n    id: Peru\n    ie: Perú\n    io: Peru\n    is: Perú\n    it: Perù\n    iu: ᐱᕉ\n    ja: ペルー\n    jv: Peru\n    ka: პერუ\n    ki: Peru\n    kk: Перу\n    kl: Peru\n    kn: ಪೆರು\n    ko: 페루\n    ku: Perû\n    kv: Перу\n    kw: Perou\n    ky: Перу\n    la: Peruvia\n    lb: Peru\n    li: Peru\n    ln: Peru\n    lt: Peru\n    lv: Peru\n    mi: Perū\n    mk: Перу\n    ml: പെറു\n    mn: Перу\n    mr: पेरू\n    ms: Peru\n    mt: Perù\n    my: ပီရူးနိုင်ငံ\n    na: Peru\n    ne: पेरू\n    nl: Peru\n    \"no\": Peru\n    oc: Peró\n    or: ପେରୁ\n    os: Перу\n    pa: ਪੇਰੂ\n    pl: Peru\n    ps: پيرو\n    pt: Peru\n    qu: Piruw\n    rm: Peru\n    ro: Peru\n    ru: Перу\n    rw: Peru\n    sa: पेरु\n    se: Peru\n    sh: Peru\n    si: පේරූ\n    sk: Peru\n    sl: Peru\n    sn: Peru\n    so: Peru\n    sq: Peruja\n    sr: Перу\n    ss: IPheru\n    su: Péru\n    sv: Peru\n    sw: Peru\n    ta: பெரு\n    te: పెరూ\n    tg: Перу\n    th: ประเทศเปรู\n    tk: Peru\n    tl: Peru\n    tr: Peru\n    tt: Перу\n    ug: پېرۇ\n    uk: Перу\n    ur: پیرو\n    uz: Peru\n    vi: Peru\n    vo: Peruvän\n    wo: Peru\n    yi: פערו\n    yo: Perú\n    zh: 秘鲁\n    zu: Peru\n"
  },
  {
    "path": "settings/country-names/pg.yaml",
    "content": "name: \n    default: Papua Niugini\n    af: Papoea-Nieu-Guinee\n    am: ፓፑዋ ኒው ጊኒ\n    an: Papua y Nueva Guinea\n    ar: بابوا غينيا الجديدة\n    az: Papua-Yeni Qvineya\n    ba: Папуа — Яңы Гвинея\n    be: Папуа — Новая Гвінея\n    bg: Папуа Нова Гвинея\n    bi: Papua New Guinea\n    bn: পাপুয়া নিউ গিনি\n    bo: པ་པུ་འ་ནིའུ་གི་ནེ།\n    br: Papoua Ginea-Nevez\n    bs: Papua Nova Gvineja\n    ca: Papua Nova Guinea\n    ce: Папуа — Керла Гвине\n    cs: Papua Nová Guinea\n    cu: Папоуа · Нова Гвинєꙗ\n    cy: Papua Guinea Newydd\n    da: Papua Ny Guinea\n    de: Papua-Neuguinea\n    dv: ޕަޕުއާ ނިއު ގިނީ\n    el: Παπούα Νέα Γουινέα\n    en: Papua New Guinea\n    eo: Papuo-Nov-Gvineo\n    es: Papua-Nueva Guinea\n    et: Paapua Uus-Guinea\n    eu: Papua Ginea Berria\n    fa: پاپوآ گینه نو\n    fi: Papua-Uusi-Guinea\n    fo: Papua Nýguinea\n    fr: Papouasie-Nouvelle-Guinée\n    fy: Papoea Nij-Guineä\n    ga: Nua-Ghuine Phapua\n    gd: Gini Nuadh Phaputhach\n    gl: Papúa Nova Guinea\n    gv: Papooey Guinea Noa\n    he: פפואה גינאה החדשה\n    hi: पापुआ न्यू गिनी\n    hr: Papua Nova Gvineja\n    ht: Papwazi-Nouvèl-Gine\n    hu: Pápua Új-Guinea\n    hy: Պապուա Նոր Գվինեա\n    ia: Papua Nove Guinea\n    id: Papua Nugini\n    io: Papua-Nova-Guinea\n    is: Papúa Nýja-Gínea\n    it: Papua Nuova Guinea\n    ja: パプアニューギニア\n    jv: Papua Nugini\n    ka: პაპუა-ახალი გვინეა\n    kk: Папуа Жаңа Гвинея\n    kn: ಪಾಪುಅ ನ್ಯೂ ಗಿನಿ\n    ko: 파푸아 뉴기니\n    ku: Papua Gîneya Nû\n    ky: Папуа-Жаӊы-Гвинея.\n    la: Papua Nova Guinea\n    lb: Papua-Neiguinea\n    li: Papoea-Nui-Guinea\n    lt: Papua Naujoji Gvinėja\n    lv: Papua-Jaungvineja\n    mi: Papua Nūkini\n    mk: Папуа Нова Гвинеја\n    ml: പാപുവ ന്യൂ ഗിനിയ\n    mn: Папуа-Шинэ Гвиней\n    mr: पापुआ न्यू गिनी\n    ms: Papua New Guinea\n    mt: Papwa Gwinea l-Ġdida\n    my: ပါပူအာနယူးဂီနီနိုင်ငံ\n    na: Papua New Guinea\n    nl: Papoea-Nieuw-Guinea\n    \"no\": Papua Ny-Guinea\n    nv: Páápowa Bigíní Ániidí\n    oc: Papoa-Nòva Guinèa\n    os: Папуæ — Ног Гвиней\n    pa: ਪਾਪੂਆ ਨਿਊ ਗਿਨੀ\n    pl: Papua-Nowa Gwinea\n    pt: Papua-Nova Guiné\n    qu: Papwa Ñukini\n    ro: Papua Noua Guinee\n    ru: Папуа - Новая Гвинея\n    rw: Papuwa Nuveli Gineya\n    sa: पपुवा न्यू गिनी\n    se: Papua-Ođđa-Guinea\n    sg: Papû Finî Ginëe\n    sh: Papua Nova Gvineja\n    sk: Papua-Nová Guinea\n    sl: Papua Nova Gvineja\n    sm: Papua\n    sq: Papua Guinea e Re\n    sr: Папуа Нова Гвинеја\n    su: Papua Nugini\n    sv: Papua Nya Guinea\n    sw: Papua Guinea Mpya\n    ta: பப்புவா நியூ கினி\n    th: ประเทศปาปัวนิวกินี\n    tl: Papua Bagong Ginea\n    tr: Papua Yeni Gine\n    tt: Папуа — Яңа Гвинея\n    ug: پاپۇئا يېڭى گۋىنېيە\n    uk: Папуа Нова Ґвінея\n    ur: پاپوا نیو گنی\n    uz: Papua Yangi Gvineya\n    vi: Papua New Guinea\n    vo: Papuveän Nula-Gineyän\n    wo: Papuwaasi-Gine-Gu-Bees\n    yo: Papua Guinea Titun\n    zh: 巴布亚新几内亚 / 巴布亞紐幾內亞 / 巴布亞新畿內亞\n"
  },
  {
    "path": "settings/country-names/ph.yaml",
    "content": "name: \n    default: Philippines\n    af: Filippyne\n    am: ፊሊፒንስ\n    an: Filipinas\n    ar: الفلبين\n    az: Filippin\n    be: Філіпіны\n    bg: Филипини\n    bn: ফিলিপাইন\n    bo: ཧྥི་ལི་པིན།\n    br: Filipinez\n    bs: Filipini\n    ca: Filipines\n    ce: Филиппин\n    cs: Filipíny\n    cv: Филиппин\n    cy: Pilipinas\n    da: Filippinerne\n    de: Philippinen\n    dv: ފިލިޕީންސް\n    el: Φιλιππίνες\n    en: Philippines\n    eo: Filipinoj\n    es: Filipinas\n    et: Filipiinid\n    eu: Filipinak\n    fa: فیلیپین\n    fi: Filippiinit\n    fo: Filipsoyggjar\n    fr: Philippines\n    fy: Filipinen\n    ga: Na hOileáin Fhilipíneacha\n    gd: Na h-Eileanan Filipineach\n    gl: Filipinas\n    gn: Filipina\n    gu: ફીલીપાઈન્સ\n    gv: Ny h-Ellanyn Philippeenagh\n    he: הפיליפינים\n    hi: फ़िलीपीन्स\n    hr: Filipini\n    ht: Filipin\n    hu: Fülöp-szigetek\n    hy: Ֆիլիպիններ\n    ia: Philippinas\n    id: Filipina\n    ie: Filipines\n    io: Filipini\n    is: Filippseyjar\n    it: Filippine\n    ja: フィリピン\n    jv: Filipina\n    ka: ფილიპინები\n    kk: Филиппиндер\n    kl: Philippines\n    km: ហ្វីលីពីន\n    kn: ಫಿಲಿಪ್ಪೀನ್ಸ್\n    ko: 필리핀\n    ku: Filîpîn\n    kv: Филиппинъяс\n    kw: Filipinys\n    la: Philippinae\n    lb: Philippinen\n    li: Filipiene\n    lt: Filipinai\n    lv: Filipīnas\n    mg: Filipina\n    mi: Piripīni\n    mk: Филипини\n    ml: ഫിലിപ്പീൻസ്\n    mn: Филиппин\n    mr: फिलिपाईन्स\n    ms: Filipina\n    my: ဖိလစ်ပိုင်နိုင်ငံ\n    na: Eben Piripin\n    nb: Filippinene\n    ne: फिलिपिन्स\n    nl: Filipijnen\n    nn: Filippinane\n    \"no\": Filippinene\n    nv: Kéyah Dańlíinii\n    oc: Filipinas\n    or: ଫିଲିପାଇନ୍ସ\n    os: Филиппинтæ\n    pa: ਫ਼ਿਲਪੀਨਜ਼\n    pl: Filipiny\n    ps: فلېپين\n    pt: Filipinas\n    qu: Philipinakuna\n    ro: Filipine\n    ru: Филиппины\n    rw: Filipine\n    sa: कलिंगद्वीप\n    se: Filippiinnat\n    sg: Filipîni\n    sh: Filipini\n    si: පිලිපීනය\n    sk: Filipíny\n    sl: Filipini\n    sm: Filipaina\n    so: Filibiin\n    sq: Filipinet\n    sr: Филипини\n    ss: IFiliphayi\n    su: Pilipina\n    sv: Filippinerna\n    sw: Ufilipino\n    ta: பிலிப்பீன்சு\n    te: ఫిలిప్పీన్స్\n    tg: Филиппин\n    th: ประเทศฟิลิปปินส์\n    tk: Filippinler\n    tl: Pilipinas\n    tr: Filipinler\n    tt: Филиппиннар\n    ug: فىلىپپىن\n    uk: Філіппіни\n    ur: فلپائن\n    uz: Filippin\n    vi: Philippines\n    vo: Filipuäns\n    wa: Filipenes\n    wo: Filipiin\n    yi: פיליפינען\n    yo: Filipínì\n    za: Feihlizbinh\n    zh: 菲律宾 / 菲律賓\n"
  },
  {
    "path": "settings/country-names/pk.yaml",
    "content": "name: \n    default: پاکستان\n    af: Pakistan\n    am: ፓኪስታን\n    an: Pakistán\n    ar: باكستان\n    as: পাকিস্তান\n    az: Pakistan\n    ba: Пакистан\n    be: Пакістан\n    bg: Пакистан\n    bh: पाकिस्तान\n    bn: পাকিস্তান\n    bo: པ་ཀི་སི་ཐན\n    br: Pakistan\n    bs: Pakistan\n    ca: Pakistan\n    ce: Пакистан\n    cs: Pákistán\n    cv: Пакистан\n    cy: Pakistan\n    da: Pakistan\n    de: Pakistan\n    dv: ޕާކިސްތާން\n    el: Πακιστάν\n    en: Pakistan\n    eo: Pakistano\n    es: Pakistán\n    et: Pakistan\n    eu: Pakistan\n    fa: پاکستان\n    fi: Pakistan\n    fo: Pakistan\n    fr: Pakistan\n    fy: Pakistan\n    ga: An Phacastáin\n    gd: Pagastàn\n    gl: Paquistán\n    gn: Pakistán\n    gu: પાકિસ્તાન\n    gv: Yn Phakistaan\n    ha: Pakistan\n    he: פקיסטן\n    hi: पाकिस्तान\n    hr: Pakistan\n    ht: Pakistan\n    hu: Pakisztán\n    hy: Պակիստան\n    ia: Pakistan\n    id: Pakistan\n    ie: Pakistan\n    io: Pakistan\n    is: Pakistan\n    it: Pakistan\n    iu: ᐸᑭᔅᑕᓐ\n    ja: パキスタン\n    jv: Pakistan\n    ka: პაკისტანი\n    ki: Pakistan\n    kk: Пәкістан\n    kl: Pakistan\n    km: ប៉ាគីស្ថាន\n    kn: ಪಾಕಿಸ್ತಾನ\n    ko: 파키스탄\n    ks: پاکِستان\n    ku: Pakistan\n    kv: Пакистан\n    kw: Pakistan\n    ky: Пакистан\n    la: Pakistania\n    lb: Pakistan\n    li: Pakistan\n    ln: Pakistáni\n    lt: Pakistanas\n    lv: Pakistāna\n    mi: Pakitāne\n    mk: Пакистан\n    ml: പാകിസ്താൻ\n    mn: Пакистан\n    mr: पाकिस्तान\n    ms: Pakistan\n    mt: Pakistan\n    my: ပါကစ္စတန်နိုင်ငံ\n    na: Pakistan\n    ne: पाकिस्तान\n    nl: Pakistan\n    \"no\": Pakistan\n    nv: Eʼeʼaahjí Naakaii Dootłʼizhí Bikéyah\n    oc: Paquistan\n    or: ପାକିସ୍ଥାନ\n    os: Пакистан\n    pa: ਪਾਕਿਸਤਾਨ\n    pl: Pakistan\n    ps: پاکستان\n    pt: Paquistão\n    qu: Pakistan\n    ro: Pakistan\n    ru: Пакистан\n    rw: Pakisitani\n    sa: पाकिस्तानम्\n    sd: پاڪستان\n    se: Pakistan\n    sh: Pakistan\n    si: පාකිස්ථානය\n    sk: Pakistan\n    sl: Pakistan\n    so: Bakistaan\n    sq: Pakistani\n    sr: Пакистан\n    ss: IPhakhistani\n    su: Pakistan\n    sv: Pakistan\n    sw: Pakistan\n    ta: பாக்கித்தான்\n    te: పాకిస్తాన్\n    tg: Покистон\n    th: ประเทศปากีสถาน\n    tk: Päkistan\n    tl: Pakistan\n    tr: Pakistan\n    tt: Пакъстан\n    ug: پاكىستان\n    uk: Пакистан\n    ur: ‏پاکستان‎\n    uz: Pokiston\n    vi: Pakistan\n    vo: Pakistän\n    wa: Pakistan\n    wo: Pakistaan\n    yi: פאקיסטאן\n    yo: Pakístàn\n    zh: 巴基斯坦\n    zu: IPakistani\n"
  },
  {
    "path": "settings/country-names/pl.yaml",
    "content": "name: \n    default: Polska\n    ab: Полша\n    af: Pole\n    ak: Poland\n    am: ፖላንድ\n    an: Polonia\n    ar: بولندا\n    ay: Puluña\n    az: Polşa\n    ba: Польша\n    be: Польшча\n    bg: Полша\n    bi: Poland\n    bn: পোল্যান্ড\n    bo: ཕོ་ལན།\n    br: Polonia\n    bs: Poljska\n    ca: Polònia\n    ce: Польша\n    co: Polonia\n    cs: Polsko\n    cu: Пол҄ьска\n    cv: Польша\n    cy: Gwlad Pwyl\n    da: Polen\n    de: Polen\n    dv: ޕޮލެންޑު\n    ee: Poland\n    el: Πολωνία\n    en: Poland\n    eo: Pollando\n    es: Polonia\n    et: Poola\n    eu: Polonia\n    fa: لهستان\n    ff: Poloonya\n    fi: Puola\n    fo: Pólland\n    fr: Pologne\n    fy: Poalen\n    ga: An Pholainn\n    gd: A' Phòlainn\n    gl: Polonia\n    gn: Poloña\n    gu: પોલેંડ\n    gv: Yn Pholynn\n    ha: Poland\n    he: פולין\n    hi: पोलैंड\n    hr: Poljska\n    ht: Polòy\n    hu: Lengyelország\n    hy: Լեհաստան\n    ia: Polonia\n    id: Polandia\n    ie: Polonia\n    ig: Poland\n    io: Polonia\n    is: Pólland\n    it: Polonia\n    iu: ᐳᓚᓐᑦ\n    ja: ポーランド\n    jv: Polandia\n    ka: პოლონეთი\n    kg: Pologne\n    kk: Польша\n    kl: Poleni\n    km: ប្រទេសប៉ូឡូញ\n    kn: ಪೋಲೆಂಡ್\n    ko: 폴란드\n    ku: Polonya\n    kv: Польша\n    kw: Poloni\n    ky: Польша\n    la: Polonia\n    lb: Polen\n    lg: Bupoolo\n    li: Pole\n    ln: Poloni\n    lt: Lenkija\n    lv: Polija\n    mg: Polonia\n    mi: Pōrana\n    mk: Полска\n    ml: പോളണ്ട്\n    mn: Польш\n    mr: पोलंड\n    ms: Poland\n    mt: Polonja\n    my: ပိုလန်နိုင်ငံ\n    na: Poran\n    ne: पोल्याण्ड\n    nl: Polen\n    \"no\": Polen\n    nv: Póolish Dineʼé Bikéyah\n    oc: Polonha\n    or: ପୋଲାଣ୍ଡ\n    os: Польшæ\n    pa: ਪੋਲੈਂਡ\n    pl: Polska\n    ps: پولنډ\n    pt: Polónia\n    qu: Pulunya\n    rm: Pologna\n    rn: Polonia\n    ro: Polonia\n    ru: Польша\n    rw: Polonye\n    sa: पोलैंड\n    sc: Polonia\n    se: Polska\n    sg: Pölôni\n    sh: Poljska\n    si: පෝලන්තය\n    sk: Poľsko\n    sl: Poljska\n    sm: Polagi\n    so: Boland\n    sq: Polonia\n    sr: Пољска\n    ss: IPholandi\n    st: Poland\n    su: Polandia\n    sv: Polen\n    sw: Poland\n    ta: போலந்து\n    te: పోలాండ్\n    tg: Лаҳистон\n    th: ประเทศโปแลนด์\n    tk: Polşa\n    tl: Polonya\n    tr: Polonya\n    tt: Польша\n    ug: پولشا\n    uk: Польща\n    ur: پولینڈ\n    uz: Polsha\n    vi: Ba Lan\n    vo: Polän\n    wa: Pologne\n    wo: Poloñ\n    yi: פוילן\n    yo: Polandi\n    zh: 波兰\n    zu: IPolandi\n"
  },
  {
    "path": "settings/country-names/pn.yaml",
    "content": "name: \n    default: Pitcairn Islands\n    ar: بتكايرن\n    be: Піткерн\n    br: Inizi Pitcairn\n    ca: Illes Pitcairn\n    cs: Pitcairnovy ostrovy\n    cy: Ynysoedd Pitcairn\n    da: Pitcairn\n    de: Pitcairninseln\n    el: Νήσοι Πίτκαιρν\n    en: Pitcairn Islands\n    eo: Pitkarna Insularo\n    es: Islas Pitcairn\n    fa: پیت‌کرن\n    fi: Pitcairn\n    fr: Îles Pitcairn\n    fy: de Pitcairneilannen\n    ga: Oileán Pitcairn\n    gd: Eilean Pitcairn\n    he: פיטקרן\n    hr: Pitcairnovo Otočje\n    hu: Pitcairn-szigetek\n    id: Kepulauan Pitcairn\n    is: Pitcairn\n    it: Isole Pitcairn\n    la: Pitcairn Insulae\n    lt: Pitkerno salos\n    lv: Pitkērna\n    mi: Pitikeina\n    mk: Питкерн\n    mn: Питкэрн Арлууд\n    nb: Pitcairnøyene\n    nl: Pitcairneilanden\n    nn: Pitcairn\n    \"no\": Pitcairnøyene\n    pl: Wyspy Pitcairn\n    ru: Острова Питкэрн\n    sl: Pitcairnovi otoki\n    sv: Pitcairnöarna\n    th: หมู่เกาะพิตแคร์น\n    tr: Pitcairn Adaları\n    uk: Острови Піткерн\n    vi: Quần đảo Pitcairn\n    zh: 皮特凯恩群岛\n"
  },
  {
    "path": "settings/country-names/ps.yaml",
    "content": "name:\n    default: الأراضي الفلسطينية\n    en: Palestinian Territories\n    \"no\": Det palestinske området\n"
  },
  {
    "path": "settings/country-names/pt.yaml",
    "content": "name: \n    default: Portugal\n    af: Portugal\n    am: ፖርቱጋል\n    an: Portugal\n    ar: البرتغال\n    ay: Purtuwal\n    az: Portuqaliya\n    ba: Португалия\n    be: Партугалія\n    bg: Португалия\n    bi: Portugal\n    bn: পর্তুগাল\n    bo: པོ་ཅུ་གྷལ།\n    br: Portugal\n    bs: Portugal\n    ca: Portugal\n    ce: Португали\n    co: Portugallu\n    cs: Portugalsko\n    cu: Портогалїꙗ\n    cv: Португали\n    cy: Portiwgal\n    da: Portugal\n    de: Portugal\n    dv: ޕޯޗުގަލް\n    dz: པོར་ཅུ་གལ་\n    ee: Portugal\n    el: Πορτογαλία\n    en: Portugal\n    eo: Portugalio\n    es: Portugal\n    et: Portugal\n    eu: Portugal\n    fa: پرتغال\n    fi: Portugali\n    fo: Portugal\n    fr: Portugal\n    fy: Portegal\n    ga: An Phortaingéil\n    gd: A' Phortagail\n    gl: Portugal\n    gn: Poytuga\n    gu: પોર્ટુગલ\n    gv: Yn Phortiugal\n    he: פורטוגל\n    hi: पुर्तगाल\n    hr: Portugal\n    ht: Pòtigal\n    hu: Portugália\n    hy: Պորտուգալիա\n    ia: Portugal\n    id: Portugal\n    ie: Portugal\n    io: Portugal\n    is: Portúgal\n    it: Portogallo\n    ja: ポルトガル\n    jv: Portugal\n    ka: პორტუგალია\n    kg: Mputulukesi\n    kk: Португалия\n    kl: Portugal\n    km: ប្រទេស ព័រទុយហ្គាល់\n    kn: ಪೋರ್ಚುಗಲ್\n    ko: 포르투갈\n    ku: Portûgal\n    kv: Португалия\n    kw: Portyngal\n    ky: Португалия\n    la: Portugallia\n    lb: Portugal\n    li: Portugal\n    ln: Pulutugal\n    lt: Portugalija\n    lv: Portugāle\n    mg: Pôrtogaly\n    mi: Potukara\n    mk: Португалија\n    ml: പോർച്ചുഗൽ\n    mn: Португал\n    mr: पोर्तुगाल\n    ms: Portugal\n    mt: Portugall\n    my: ပေါ်တူဂီနိုင်ငံ\n    na: Portsiugar\n    ne: पोर्चुगल\n    nl: Portugal\n    \"no\": Portugal\n    oc: Portugal\n    or: ପର୍ତ୍ତୁଗାଲ\n    os: Португали\n    pl: Portugalia\n    ps: پرتګال\n    pt: Portugal\n    qu: Purtugal\n    rm: Portugal\n    rn: Portugal\n    ro: Portugalia\n    ru: Португалия\n    rw: Porutigali\n    sa: पुर्तगाल\n    sc: Portogallo\n    se: Portugal\n    sh: Portugal\n    si: පෘතුගාලය\n    sk: Portugalsko\n    sl: Portugalska\n    sm: Portugal\n    so: Bortuqaal\n    sq: Portugalia\n    sr: Португалија\n    ss: IPhuthukezi\n    st: Portugal\n    su: Portugal\n    sv: Portugal\n    sw: Ureno\n    ta: போர்த்துகல்\n    te: పోర్చుగల్\n    tg: Португалия\n    th: ประเทศโปรตุเกส\n    tk: Portugaliýa\n    tl: Portugal\n    tr: Portekiz\n    tt: Португалия\n    ty: Pōtītī\n    ug: Portugaliye\n    uk: Португалія\n    ur: پرتگال\n    uz: Portugaliya\n    vi: Bồ Đào Nha\n    vo: Portugän\n    wa: Portugal\n    wo: Portugaal\n    yi: פארטוגאל\n    yo: Pọ́rtúgàl\n    zh: 葡萄牙\n    zu: IPhothugali\n"
  },
  {
    "path": "settings/country-names/pw.yaml",
    "content": "name: \n    default: Belau\n    ar: بالاو\n    cs: Palau\n    de: Palau\n    en: Palau\n    eo: Palaŭo\n    fr: Palaos\n    hr: Palau\n    ia: Palau\n    io: Palau\n    lt: Palau\n    mi: Pārau\n    \"no\": Palau\n    oc: Belau\n    pl: Palau\n    ru: Палау\n    se: Palau\n    sk: Palau\n    sl: Palau\n    sr: Палау\n    ta: பலாவு\n    uk: Палау\n    vi: Palau\n    vo: Palauäns\n    zh: 帕劳 / 帛琉\n"
  },
  {
    "path": "settings/country-names/py.yaml",
    "content": "name: \n    default: Paraguay\n    af: Paraguay\n    am: ፓራጓይ\n    an: Paraguai\n    ar: باراغواي\n    ay: Parawayi\n    az: Paraqvay\n    ba: Парагвай\n    be: Парагвай\n    bg: Парагвай\n    bi: Paraguay\n    bn: প্যারাগুয়ে\n    bo: པ་ར་གུ་ཡེ།\n    br: Paraguay\n    bs: Paragvaj\n    ca: Paraguai\n    ce: Парагвай\n    co: Paraguay\n    cs: Paraguay\n    cv: Парагвай\n    cy: Paraguay\n    da: Paraguay\n    de: Paraguay\n    dv: ޕެރަގުއޭ\n    ee: Paraguay\n    el: Παραγουάη\n    en: Paraguay\n    eo: Paragvajo\n    es: Paraguay\n    et: Paraguay\n    eu: Paraguai\n    fa: پاراگوئه\n    fi: Paraguay\n    fo: Paraguei\n    fr: Paraguay\n    fy: Paraguay\n    ga: Paragua\n    gd: Paraguaidh\n    gl: Paraguai\n    gn: Paraguái\n    gv: Yn Pharaguay\n    he: פרגוואי\n    hi: पैराग्वे\n    hr: Paragvaj\n    ht: Paragwe\n    hu: Paraguay\n    hy: Պարագվայ\n    ia: Paraguay\n    id: Paraguay\n    ie: Paraguay\n    io: Paraguay\n    is: Paragvæ\n    it: Paraguay\n    ja: パラグアイ\n    jv: Paraguay\n    ka: პარაგვაი\n    kk: Парагвай\n    kl: Paraguay\n    kn: ಪೆರಗ್ವೆ\n    ko: 파라과이\n    ku: Paraguay\n    kw: Paragway\n    la: Paraquaria\n    lb: Paraguay\n    li: Paraguay\n    ln: Palagway\n    lt: Paragvajus\n    lv: Paragvaja\n    mk: Парагвај\n    ml: പരഗ്വെ\n    mn: Парагвай\n    mr: पेराग्वे\n    ms: Paraguay\n    mt: Paragwaj\n    my: ပါရာဂွေးနိုင်ငံ\n    ne: पाराग्वे\n    nl: Paraguay\n    \"no\": Paraguay\n    oc: Paraguai\n    or: ପାରାଗୁଏ\n    os: Парагвай\n    pa: ਪੈਰਾਗੁਏ\n    pl: Paragwaj\n    pt: Paraguai\n    qu: Parawayi\n    rm: Paraguay\n    ro: Paraguay\n    ru: Парагвай\n    rw: Paragwe\n    sa: पेरेग्वाय\n    se: Paraguay\n    sh: Paragvaj\n    sk: Paraguaj\n    sl: Paragvaj\n    so: Paraguay\n    sq: Paraguaji\n    sr: Парагвај\n    su: Paraguay\n    sv: Paraguay\n    sw: Paraguay\n    ta: பரகுவை\n    tg: Парагвай\n    th: ประเทศปารากวัย\n    tl: Paraguay\n    tr: Paraguay\n    tt: Парагвай\n    ug: پاراگۋاي\n    uk: Парагвай\n    ur: پیراگوئے\n    uz: Paragvay\n    vi: Paraguay\n    vo: Paragvän\n    wo: Paraguwaay\n    yi: פאראגוויי\n    yo: Paragúáì\n    zh: 巴拉圭\n"
  },
  {
    "path": "settings/country-names/qa.yaml",
    "content": "name: \n    default: قطر\n    af: Katar\n    am: ቃጣር\n    an: Qatar\n    ar: قطر\n    as: কাটাৰ\n    az: Qətər\n    be: Катар\n    bg: Катар\n    bn: কাতার\n    bo: ཁ་ཏར།\n    br: Katar\n    bs: Katar\n    ca: Qatar\n    ce: Катар\n    cs: Katar\n    cv: Катар\n    cy: Qatar\n    da: Qatar\n    de: Katar\n    dv: ޤަޠަރު\n    dz: ཀ་ཏར་\n    ee: Qatar\n    el: Κατάρ\n    en: Qatar\n    eo: Kataro\n    es: Catar\n    et: Katar\n    eu: Qatar\n    fa: قطر\n    fi: Qatar\n    fo: Katar\n    fr: Qatar\n    fy: Katar\n    ga: Catar\n    gd: Catar\n    gl: Qatar - قطر\n    gu: કતાર (અરબસ્તાન)\n    gv: Yn Chatar\n    he: קטאר\n    hi: क़तर\n    hr: Katar\n    ht: Katar\n    hu: Katar\n    hy: Քաթար\n    id: Qatar\n    ie: Katar\n    io: Katar\n    is: Katar\n    it: Qatar\n    ja: カタール\n    jv: Qatar\n    ka: კატარი\n    kk: Катар\n    kl: Qatar\n    kn: ಕಟಾರ್\n    ko: 카타르\n    ku: Qeter\n    kv: Катар\n    kw: Katar\n    la: Quataria\n    lb: Katar\n    li: Katar\n    ln: Katar\n    lt: Kataras\n    lv: Katara\n    mi: Katā\n    mk: Катар\n    ml: ഖത്തർ\n    mn: Катар\n    mr: कतार\n    ms: Qatar\n    mt: Qatar\n    my: ကာတာနိုင်ငံ\n    na: Qatar\n    nl: Qatar\n    \"no\": Qatar\n    nv: Kʼatár\n    oc: Qatar\n    or: କତର\n    os: Катар\n    pa: ਕਤਰ\n    pl: Katar\n    ps: قطر\n    pt: Catar\n    qu: Qatar\n    ro: Qatar\n    ru: Катар\n    rw: Katari\n    sa: कतार\n    se: Qatar\n    sk: Katar (štát)\n    sl: Katar\n    so: Qatar\n    sq: Katari\n    sr: Катар\n    ss: IKhathari\n    su: Qatar\n    sv: Qatar\n    sw: Qatar\n    ta: கத்தார்\n    te: కతర్\n    tg: Қатар\n    th: ประเทศกาตาร์\n    tk: Katar\n    tl: Katar\n    tr: Katar\n    tt: Катар\n    ug: قاتار\n    uk: Катар\n    ur: قطر\n    uz: Qatar\n    vi: Qatar\n    vo: Katarän\n    wo: Kataar\n    yi: קאטאר\n    yo: Katar\n    zh: 卡塔尔\n"
  },
  {
    "path": "settings/country-names/ro.yaml",
    "content": "name: \n    default: România\n    af: Roemenië\n    am: ሮማንያ\n    an: Rumanía\n    ar: رومانيا\n    ay: Rumanya\n    az: Rumıniya\n    ba: Румыния\n    be: Румынія\n    bg: Румъния\n    bi: Romania\n    bn: রোমানিয়া\n    bo: རོ་མ་ནི་ཡ།\n    br: Roumania\n    bs: Rumunija\n    ca: Romania\n    ce: Румыни\n    co: Romania\n    cs: Rumunsko\n    cu: Роумꙑнїꙗ\n    cv: Румыни\n    cy: Rwmania\n    da: Rumænien\n    de: Rumänien\n    dv: ރުމޭނިއާ\n    ee: Romania\n    el: Ρουμανία\n    en: Romania\n    eo: Rumanio\n    es: Rumanía\n    et: Rumeenia\n    eu: Errumania\n    fa: رومانی\n    fi: Romania\n    fo: Rumenia\n    fr: Roumanie\n    fy: Roemeenje\n    ga: An Rómáin\n    gd: Romàinia\n    gl: Romanía\n    gn: Rrumaña\n    gu: રોમાનિયા\n    gv: Yn Romaan\n    he: רומניה\n    hi: रोमानिया\n    hr: Rumunjska\n    ht: Woumani\n    hu: Románia\n    hy: Ռումինիա\n    ia: Romania\n    id: Rumania\n    ie: Rumania\n    io: Rumania\n    is: Rúmenía\n    it: Romania\n    ja: ルーマニア\n    jv: Rumania\n    ka: რუმინეთი\n    kg: Romania\n    kk: Румыния\n    kl: Rumænia\n    kn: ರೊಮಾನಿಯ\n    ko: 루마니아\n    ku: Romanya\n    kv: Румыния\n    kw: Roumani\n    ky: Румыния\n    la: Romania\n    lb: Rumänien\n    li: Roemenië\n    ln: Rumania\n    lt: Rumunija\n    lv: Rumānija\n    mi: Romeinia\n    mk: Романија\n    ml: റൊമാനിയ\n    mn: Румын\n    mr: रोमेनिया\n    ms: Romania\n    mt: Rumanija\n    my: ရိုမေးနီးယားနိုင်ငံ\n    na: Romania\n    ne: रोमानिया\n    nl: Roemenië\n    \"no\": Romania\n    nv: Wooméiniya\n    oc: Romania\n    or: ରୋମାନିଆ\n    os: Румыни\n    pa: ਰੋਮਾਨੀਆ\n    pl: Rumunia\n    ps: رومانیا\n    pt: Roménia\n    qu: Rumanya\n    rm: Rumenia\n    ro: România\n    ru: Румыния\n    rw: Romaniya\n    sc: Romania\n    se: Romania\n    sh: Rumunija\n    si: රුමේනියාව\n    sk: Rumunsko\n    sl: Romunija\n    sm: Romania\n    so: Romania\n    sq: Rumania\n    sr: Румунија\n    ss: IRomaniya\n    su: Romania\n    sv: Rumänien\n    sw: Romania\n    ta: உருமேனியா\n    te: రొమేనియా\n    tg: Руминия\n    th: ประเทศโรมาเนีย\n    tk: Rumyniýa\n    tl: Rumanya\n    tr: Romanya\n    tt: Румыния\n    ug: Ruminiye\n    uk: Румунія\n    ur: رومانیہ\n    uz: Ruminiya\n    vi: Romania\n    vo: Rumän\n    wa: Roumaneye\n    wo: Romaani\n    yi: רומעניע\n    yo: Románíà\n    zh: 羅馬尼亞\n"
  },
  {
    "path": "settings/country-names/rs.yaml",
    "content": "name: \n    default: Србија\n    af: Serwië\n    am: ሰርቢያ\n    an: Serbia\n    ar: صربيا\n    ay: Sirwiya\n    az: Serbiya\n    ba: Сербия\n    be: Сербія\n    bg: Сърбия\n    bi: Serbia\n    bn: সার্বিয়া\n    bo: སེར་བྷི་ཡ།\n    br: Serbia\n    bs: Srbija\n    ca: Sèrbia\n    ce: Серби\n    co: Serbia\n    cs: Srbsko\n    cu: Срьбїꙗ\n    cv: Серби\n    cy: Serbia\n    da: Serbien\n    de: Serbien\n    dv: ސާބިއާ\n    ee: Serbia\n    el: Σερβία\n    en: Serbia\n    eo: Serbio\n    es: Serbia\n    et: Serbia\n    eu: Serbia\n    fa: صربستان\n    fi: Serbia\n    fo: Serbia\n    fr: Serbie\n    fy: Servje\n    ga: An tSeirbia\n    gd: An t-Sèirb\n    gl: Serbia\n    gn: Sevia\n    gv: Yn Serb\n    he: סרביה\n    hi: सर्बिया\n    hr: Srbija\n    ht: Sèbi\n    hu: Szerbia\n    hy: Սերբիա\n    ia: Serbia\n    id: Serbia\n    ie: Serbia\n    io: Serbia\n    is: Serbía\n    it: Serbia\n    ja: セルビア\n    jv: Serbia\n    ka: სერბეთი\n    kg: Serbie\n    kk: Сербия\n    kl: Serbia\n    ko: 세르비아\n    ku: Serbistan\n    kv: Сербия\n    kw: Serbi\n    ky: Сербия\n    la: Serbia\n    lb: Serbien\n    li: Servië\n    ln: Serbia\n    lt: Serbija\n    lv: Serbija\n    mg: Serbia\n    mi: Serbia\n    mk: Србија\n    ml: സെർബിയ\n    mn: Серби\n    mr: सर्बिया\n    ms: Serbia\n    mt: Serbja\n    my: ဆားဘီးယားနိုင်ငံ\n    na: Terbiya\n    ne: सर्बिया\n    nl: Servië\n    \"no\": Serbia\n    oc: Serbia\n    or: ସର୍ବିଆ\n    os: Серби\n    pa: ਸਰਬੀਆ\n    pl: Serbia\n    ps: سربيا\n    pt: Sérvia\n    qu: Sirbya\n    rm: Serbia\n    ro: Serbia\n    ru: Сербия\n    rw: Seribiya\n    sa: सर्बिया\n    sc: Sèrbia\n    se: Serbia\n    sh: Srbija\n    sk: Srbsko\n    sl: Srbija\n    sm: Serbia\n    so: Serbia\n    sq: Serbia\n    sr: Србија\n    ss: ISebhiya\n    st: Serbia\n    su: Sérbia\n    sv: Serbien\n    sw: Serbia\n    ta: செர்பியா\n    te: సెర్బియా\n    tg: Сербия\n    th: ประเทศเซอร์เบีย\n    tk: Serbiýa\n    tl: Serbiya\n    tr: Sırbistan\n    tt: Сербия\n    tw: Serbia\n    ty: Terepia\n    ug: Sérbiye\n    uk: Сербія\n    ur: سربیا\n    uz: Serbiya\n    vi: Serbia\n    vo: Särbän\n    wo: Seerbi\n    yi: סערביע\n    yo: Sérbíà\n    zh: 塞爾維亞\n    zu: ISerbiya\n"
  },
  {
    "path": "settings/country-names/ru.yaml",
    "content": "name: \n    default: Россия\n    ab: Урыстәыла\n    af: Rusland\n    ak: Russia\n    am: ሩሲያ\n    an: Rusia\n    ar: روسيا\n    as: ৰুশিযা\n    av: Россиялъул Федерация\n    ay: Rusiya\n    az: Rusiya\n    ba: Рәсәй\n    be: Расія\n    bg: Русия\n    bi: Rusia\n    bm: Risila\n    bn: রাশিয়া\n    bo: ཨུ་རུ་སུ།\n    br: Rusia\n    bs: Rusija\n    ca: Rússia\n    ce: Росси\n    ch: Russia\n    co: Russia\n    cs: Rusko\n    cu: Рѡсїꙗ\n    cv: Раççей Патшалăхĕ\n    cy: Rwsia\n    da: Rusland\n    de: Russland\n    dv: ރޫސީވިލާތް\n    dz: ར་ཤི་ཡཱན་ཕེ་ཌི་རེ་ཤཱན\n    ee: Russia\n    el: Ρωσία\n    en: Russia\n    eo: Rusio\n    es: Rusia\n    et: Venemaa\n    eu: Errusia\n    fa: روسیه\n    ff: Roosiya\n    fi: Venäjä\n    fo: Russland\n    fr: Russie\n    fy: Ruslân\n    ga: An Rúis\n    gd: An Ruis\n    gl: Rusia\n    gn: Rrúsia\n    gu: રશિયા\n    gv: Yn Roosh\n    ha: Rasha\n    he: רוסיה\n    hi: रूस\n    hr: Ruska Federacija\n    ht: Risi\n    hu: Oroszország\n    hy: Ռուսաստան\n    ia: Russia\n    id: Rusia\n    ie: Russia\n    ig: Mpaghara Russia\n    ik: Russia\n    io: Rusia\n    is: Rússland\n    it: Russia\n    iu: ᐅᓛᓴ\n    ja: ロシア\n    jv: Rusia\n    ka: რუსეთი\n    kg: Rusia\n    ki: Russia\n    kk: Ресей\n    kl: Ruslandi\n    km: រុស្ស៊ី\n    kn: ರಷ್ಯಾ\n    ko: 러시아\n    ks: روٗس\n    ku: Rûsya\n    kv: Рочму\n    kw: Russi\n    ky: Орусия\n    la: Russia\n    lb: Russland\n    lg: Rwasha\n    li: Rusland\n    ln: Rusí\n    lo: ລັດເຊັຽ\n    lt: Rusija\n    lv: Krievija\n    mg: Rosia\n    mi: Ruhia\n    mk: Русија\n    ml: റഷ്യ\n    mn: Оросын Холбооны Улс\n    mo: Русия\n    mr: रशिया\n    ms: Rusia\n    mt: Russja\n    my: ရုရှားနိုင်ငံ\n    na: Ratsiya\n    ne: रुस\n    nl: Rusland\n    \"no\": Russland\n    nv: Biʼééʼ Łichííʼí Bikéyah\n    ny: Russia\n    oc: Russia\n    om: Raashiyaa\n    or: ଋଷିଆ\n    os: Уæрæсе\n    pa: ਰੂਸ\n    pl: Rosja\n    ps: روسیه\n    pt: Rússia\n    qu: Rusiya\n    rm: Russia\n    rn: Uburusiya\n    ro: Rusia\n    ru: Россия\n    rw: Uburusiya\n    sc: Rùssia\n    sd: روس\n    se: Ruošša\n    sg: Rusïi\n    sh: Rusija\n    si: රුසියාව\n    sk: Rusko\n    sl: Rusija\n    sm: Lusia\n    sn: Russia\n    so: Ruushka\n    sq: Rusia\n    sr: Русија\n    ss: IRashiya\n    st: Russia\n    su: Rusia\n    sv: Ryssland\n    sw: Shirikisho la Urusi\n    ta: உருசியா\n    te: రష్యా\n    tg: Русия\n    th: ประเทศรัสเซีย\n    ti: ራሻ\n    tk: Russiýa\n    tl: Pederasyong Ruso\n    to: Lūsia\n    tr: Rusya Federasyonu\n    ts: Russia\n    tt: Русия\n    tw: Russia\n    ty: Rūtia\n    ug: روسىيە\n    uk: Росія\n    ur: روس\n    uz: Rossiya Federatsiyasi\n    ve: Rashia\n    vi: Liên bang Nga\n    vo: Rusän\n    wa: Federåcion d' Rûsseye\n    wo: Federaasioŋ bu Riisi\n    xh: IRashiya\n    yi: רוסלאנד\n    yo: Rọ́síà\n    za: Ezlozswh Lienzbangh\n    zh: 俄罗斯/俄羅斯\n    zu: IRashiya\n"
  },
  {
    "path": "settings/country-names/rw.yaml",
    "content": "name: \n    default: Rwanda\n    af: Rwanda\n    am: ሩዋንዳ\n    an: Ruanda\n    ar: رواندا\n    az: Ruanda\n    ba: Руанда\n    be: Руанда\n    bg: Руанда\n    bm: Rwanda\n    bn: রুয়ান্ডা\n    bo: རུ་ཝན་ཌ།\n    br: Rwanda\n    bs: Ruanda\n    ca: Rwanda\n    ce: Руанда\n    cs: Rwanda\n    cv: Руанда\n    cy: Rwanda\n    da: Rwanda\n    de: Ruanda\n    dv: ރުވާންޑާ\n    ee: Rwanda\n    el: Ρουάντα\n    en: Rwanda\n    eo: Ruando\n    es: Ruanda\n    et: Rwanda\n    eu: Ruanda\n    fa: رواندا\n    fi: Ruanda\n    fo: Ruanda\n    fr: Rwanda\n    fy: Rûanda\n    ga: Ruanda\n    gd: Rubhanda\n    gl: Ruanda\n    gv: Rooandey\n    he: רואנדה\n    hi: रवाण्डा\n    hr: Ruanda\n    ht: Rwanda\n    hu: Ruanda\n    hy: Ռուանդա\n    ia: Ruanda\n    id: Rwanda\n    ie: Rwanda\n    io: Ruanda\n    is: Rúanda\n    it: Ruanda\n    ja: ルワンダ\n    jv: Rwanda\n    ka: რუანდა\n    kg: Rwanda\n    ki: Rwanda\n    kk: Руанда\n    kn: ರ್ವಾಂಡ\n    ko: 르완다\n    ku: Rwanda\n    kw: Rwanda\n    la: Ruanda\n    lb: Ruanda\n    li: Rwanda\n    ln: Rwanda\n    lt: Ruanda\n    lv: Ruanda\n    mk: Руанда\n    ml: റുവാണ്ട\n    mn: Руанда\n    mr: ऱ्वान्डा\n    ms: Rwanda\n    mt: Rwanda\n    my: ရဝမ်ဒါနိုင်ငံ\n    ne: रुवाण्डा\n    nl: Rwanda\n    \"no\": Rwanda\n    nv: Wánda Dineʼé Bikéyah\n    oc: Rwanda\n    or: ରଵାଣ୍ଡା\n    os: Руандæ\n    pa: ਰਵਾਂਡਾ\n    pl: Rwanda\n    ps: راونډا\n    pt: Ruanda\n    qu: Rwanda\n    rn: Rwanda\n    ro: Rwanda\n    ru: Руанда\n    rw: Rwanda\n    sa: रवाण्डा\n    sc: Ruanda\n    se: Rwanda\n    sg: Ruandäa\n    sh: Ruanda\n    si: රුවන්ඩා ජනරජය\n    sk: Rwanda\n    sl: Ruanda\n    sn: Rwanda\n    so: Ruwanda\n    sq: Ruanda\n    sr: Руанда\n    ss: IRuwanda\n    su: Rwanda\n    sv: Rwanda\n    sw: Rwanda\n    ta: ருவாண்டா\n    te: రువాండా\n    tg: Руанда\n    th: ประเทศรวันดา\n    ti: ሩዋንዳ\n    tk: Ruanda\n    tl: Ruwanda\n    tr: Ruanda\n    ts: Rwanda\n    tt: Руанда\n    ug: رۋاندا\n    uk: Руанда\n    ur: روانڈا\n    uz: Ruanda\n    vi: Rwanda\n    vo: Ruandän\n    wo: Ruwandaa\n    yi: רוואנדע\n    yo: Rùwándà\n    zh: 卢旺达\n    zu: IRuwanda\n"
  },
  {
    "path": "settings/country-names/sa.yaml",
    "content": "name: \n    default: السعودية\n    af: Saoedi-Arabië\n    am: ሳዑዲ አረቢያ\n    an: Arabia Saudí\n    ar: السعودية\n    av: СагIудиязул ГIарабия\n    az: Səudiyyə Ərəbistanı\n    ba: Сәғүд Ғәрәбстаны\n    be: Саудаўская Аравія\n    bg: Саудитска Арабия\n    bm: Saudia Arabu ka Faamamara\n    bn: সৌদি আরব\n    bo: སའུ་དི་ཨ་ར་པི་ཡ།\n    br: Arabia Saoudat\n    bs: Saudijska Arabija\n    ca: Aràbia Saudita\n    ce: СаӀудийн Ӏаьрбийчоь\n    cs: Saúdská Arábie\n    cv: Сауд Аравийĕ\n    cy: Saudi Arabia\n    da: Saudi-Arabien\n    de: Saudi-Arabien\n    dv: ސައޫދީ އަރަބިއްޔާ\n    dz: སའུ་དི་ཨེ་ར་སྦི་ཡ་\n    el: Σαουδική Αραβία\n    en: Saudi Arabia\n    eo: Sauda Arabio\n    es: Arabia Saudita\n    et: Saudi Araabia\n    eu: Saudi Arabia\n    fa: عربستان سعودی\n    fi: Saudi-Arabia\n    fo: Saudi-Arabia\n    fr: Arabie saoudite\n    fy: Saûdy-Araabje\n    ga: An Araib Shádach\n    gd: Aràibia nan Sabhd\n    gl: Arabia Saudí\n    gn: Aravia Saudíta\n    gu: સાઉદી અરેબિયા\n    gv: Yn Araab Saudi\n    he: ערב הסעודית\n    hi: सउदी अरब\n    hr: Saudijska Arabija\n    ht: Arabi Sawoudit\n    hu: Szaúd-Arábia\n    hy: Սաուդյան Արաբիա\n    ia: Arabia Saudita\n    id: Arab Saudi\n    ie: Saudi Arabia\n    io: Saudia Arabia\n    is: Sádí-Arabía\n    it: Arabia Saudita\n    ja: サウジアラビア\n    jv: Arab Saudi\n    ka: საუდის არაბეთი\n    kk: Сауд Арабиясы\n    kl: Saudi Arabia\n    km: អារ៉ាប៊ីសាអូឌីត\n    kn: ಸೌದಿ ಅರೆಬಿಯ\n    ko: 사우디아라비아\n    ku: Erebistana Siyûdî\n    kv: Саудса Аравия\n    kw: Arabi Saoudek\n    ky: Сауд Арабия Падышалыгы\n    la: Arabia Saudiana\n    lb: Saudi-Arabien\n    li: Saoedi-Arabië\n    ln: Saudi Arabia\n    lt: Saudo Arabija\n    lv: Saūda Arābija\n    mk: Саудиска Арабија\n    ml: സൗദി അറേബ്യ\n    mn: Саудын Араб\n    mr: सौदी अरेबिया\n    ms: Arab Saudi\n    mt: Arabja Sawdija\n    my: ဆော်ဒီအာရေဗျနိုင်ငံ\n    na: Taudiarabiya\n    ne: साउदी अरब\n    nl: Saoedi-Arabië\n    \"no\": Saudi-Arabia\n    nv: Ásáí Bikéyah Saʼoodí\n    oc: Arabia Saudita\n    or: ସାଉଦି ଆରବ\n    os: Сауды Арави\n    pa: ਸਉਦੀ ਅਰਬ\n    pl: Arabia Saudyjska\n    ps: سعودي عربستان\n    pt: Arábia Saudita\n    qu: Sawud Arabya\n    rm: Arabia Saudita\n    ro: Arabia Saudită\n    ru: Саудовская Аравия\n    rw: Arabiya Sawudite\n    sa: सऊदी अरब\n    se: Saudi-Arábia\n    sh: Saudijska Arabija\n    si: සවුදි අරාබියාව\n    sk: Saudská Arábia\n    sl: Saudova Arabija\n    so: Sacuudi Carabiya\n    sq: Arabia Saudite\n    sr: Саудијска Арабија\n    ss: I-Arabhiya\n    su: Saudi Arabia\n    sv: Saudiarabien\n    sw: Saudia\n    ta: சவூதி அரேபியா\n    te: సౌదీ అరేబియా\n    tg: Арабистони Саудӣ\n    th: ประเทศซาอุดีอาระเบีย\n    tk: Saud Arabystany\n    tl: Arabyang Saudi\n    tr: Suudi Arabistan\n    tt: Согуд Гарәбстаны\n    ug: سەئۇدى ئەرەبىستان\n    uk: Саудівська Аравія\n    ur: سعودی عرب\n    uz: Saudiya Arabistoni\n    vi: Ả Rập Saudi\n    vo: Sauda-Larabän\n    wo: Araabi Sawdit\n    yi: סאודי אראביע\n    yo: Sáúdí Arábíà\n    zh: 沙特阿拉伯\n"
  },
  {
    "path": "settings/country-names/sb.yaml",
    "content": "name: \n    default: Solomon Islands\n    af: Solomoneilande\n    am: ሰለሞን ደሴቶች\n    an: Islas Salomón\n    ar: جزر سليمان\n    az: Solomon adaları\n    be: Саламонавы Астравы\n    bg: Соломонови острови\n    bn: সলোমন দ্বীপপুঞ্জ\n    bo: སོ་ལོ་མོན་གླིང་ཕྲན་ཚོ་ཁག\n    br: Inizi Solomon\n    bs: Solomonska Ostrva\n    ca: Salomó\n    ce: Соломонан гӀайреш\n    cs: Šalomounovy ostrovy\n    cv: Соломон Утравĕсем\n    cy: Ynysoedd Solomon\n    da: Salomonøerne\n    de: Salomonen\n    dv: ސޮލޮމޮން ޖަޒީރާ\n    el: Νήσοι Σολομώντα\n    en: Solomon Islands\n    eo: Salomonoj\n    es: Islas Salomón\n    et: Saalomoni Saared\n    eu: Salomon Uharteak\n    fa: جزایر سلیمان\n    fi: Salomonsaaret\n    fo: Sálomonoyggjarnar\n    fr: Salomon\n    fy: Salomonseilannen\n    ga: Oileáin Sholamón\n    gd: Na h-Eileanan Sholaimh\n    gl: Illas Salomón\n    gv: Ny h-Ellanyn Holomon\n    he: איי שלמה\n    hi: सोलोमन द्वीपसमूह\n    hr: Solomonski Otoci\n    ht: Salomon\n    hu: Salamon-szigetek\n    hy: Սողոմոնյան Կղզիներ\n    id: Kepulauan Solomon\n    io: Salomon Insuli\n    is: Salómonseyjar\n    it: Isole Salomone\n    ja: ソロモン諸島\n    jv: Kapuloan Solomon\n    ka: სოლომონის კუნძულები\n    kk: Соломон Аралдары\n    kn: ಸಾಲೊಮನ್ ದ್ವೀಪಗಳು\n    ko: 솔로몬 제도\n    ku: Giravên Salomon\n    kw: Ynysow Salamon\n    la: Insulae Salomonis\n    lb: Salomonen\n    li: Salomonseilen\n    lt: Saliamono Salos\n    lv: Zālamana Salas\n    mk: Соломонски Острови\n    ml: സോളമൻ ദ്വീപുകൾ\n    mr: सॉलोमन द्वीपसमूह\n    ms: Kepulauan Solomon\n    mt: Gżejjer Solomon\n    my: ဆော်လမွန်အိုင်းလန်းနိုင်ငံ\n    nb: Salomonøyene\n    ne: सोलोमन द्धीप\n    nl: Salomonseilanden\n    nn: Salomonøyane\n    \"no\": Salomonøyene\n    nv: Sólomon Tó Bináhaazyínígíí\n    oc: Illas Salamon\n    or: ସୋଲୋମନ ଆୟରଲ୍ୟାଣ୍ଡ\n    os: Соломоны сакъадæхтæ\n    pa: ਸੋਲੋਮਨ ਟਾਪੂ\n    pl: Wyspy Salomona\n    pt: Ilhas Salomão\n    qu: Salumun wat'akuna\n    ro: Insulele Solomon\n    ru: Соломоновы Острова\n    rw: Ibirwa bya Solomoni\n    sa: सोलोमन-द्वीप\n    se: Salomonsullot\n    sh: Solomonski Otoci\n    si: සොලමන් දුපත්\n    sk: Šalamúnove ostrovy\n    sl: Salomonovi otoki\n    sm: Solomon Islands\n    so: Jasiiradaha Solomon\n    sq: Ishujt Solomon\n    sr: Соломонска Острва\n    su: Kapuloan Solomon\n    sv: Salomonöarna\n    sw: Visiwa vya Solomon\n    ta: சொலமன் தீவுகள்\n    te: సోలమన్ దీవులు\n    tg: Ҷазираҳои Соломон\n    th: หมู่เกาะโซโลมอน\n    tl: Kapuluang Solomon\n    tr: Solomon Adaları\n    ug: سولومون تاقىم ئاراللىرى\n    uk: Соломонові Острови\n    ur: جزائر سلیمان\n    uz: Solomon Orollari\n    vi: Quần đảo Solomon\n    vo: Solomonuäns\n    wo: Duni Solomon\n    yo: Àwọn Erékùsù Sólómọ́nì\n    zh: 所罗门群岛\n"
  },
  {
    "path": "settings/country-names/sc.yaml",
    "content": "name: \n    default: Sesel\n    af: Seychelle\n    am: ሲሸልስ\n    an: Seychelles\n    ar: سيشيل\n    az: Seyşel adaları\n    be: Сейшэльскія Астравы\n    bg: Сейшели\n    bm: Seshel\n    bn: সেশেল\n    bo: སེ་ཞེལ།\n    br: Sechelez\n    bs: Sejšeli\n    ca: Seychelles\n    ce: Сейшелан гlайреш\n    cs: Seychely\n    cv: Сейшел утравĕсем\n    cy: Seychelles\n    da: Seychellerne\n    de: Seychellen\n    dv: ތޭންގަދީބު\n    el: Σεϋχέλλες\n    en: Seychelles\n    eo: Sejŝeloj\n    es: Seychelles\n    et: Seišellid\n    eu: Seychelleak\n    fa: سیشل\n    fi: Seychellit\n    fo: Seyskelloyggjar\n    fr: Seychelles\n    fy: Seysjellen\n    ga: Na Séiséil\n    gd: Na h-Eileanan Sheiseall\n    gl: Seixeles - Seychelles\n    gv: Ny h-Ellanyn Heshell\n    he: סיישל\n    hi: सेशेल्स\n    hr: Sejšeli\n    ht: Sechèl\n    hu: Seychelle-szigetek\n    ia: Seychelles\n    id: Seychelles\n    ie: Seychelles\n    io: Seycheli\n    is: Seychelles-eyjar\n    it: Seychelles\n    ja: セーシェル\n    jv: Seychelles\n    ka: სეიშელის კუნძულები\n    kg: Seychell\n    kk: Сейшель Аралдары\n    kn: ಸೆಶೆಲ್ಸ್\n    ko: 세이셸\n    ku: Seyşel\n    kw: Seychellys\n    la: Insulae Seisellenses\n    lb: Seychellen\n    li: Seychelle\n    ln: Seyshel\n    lt: Seišeliai\n    lv: Seišelas\n    mg: Seychelles\n    mk: Сејшели\n    ml: സെയ്‌ഷെൽസ്\n    mn: Сейшелийн арлууд\n    mr: सेशेल्स\n    ms: Seychelles\n    mt: Seychelles\n    my: ဆေးရှဲနိုင်ငံ\n    nb: Seychellene\n    nl: Seychellen\n    nn: Seychellane\n    \"no\": Seychellene\n    nv: Seishel\n    oc: Seichèlas\n    or: ସେସେଲଜ\n    os: Сейшелтæ\n    pa: ਸੇਸ਼ੈਲ\n    pl: Seszele\n    ps: سیشل\n    pt: Seychelles\n    qu: Sichillakuna\n    rm: Seychellas\n    ro: Seychelles\n    ru: Сейшелы\n    rw: Seyishele\n    sa: सेशेल\n    sc: Seychelles\n    se: Seychellat\n    sg: Sëyshêle\n    sk: Seychely\n    sl: Sejšeli\n    sn: Seychelles\n    so: Seyshelles\n    sq: Sejshellet\n    sr: Сејшели\n    ss: ISeyishelesi\n    su: Seychéll\n    sv: Seychellerna\n    sw: Shelisheli\n    ta: சீசெல்சு\n    tg: Ҷазираҳои Сейшел\n    th: ประเทศเซเชลส์\n    tk: Seýşel Adalary\n    tl: Seyshels\n    tr: Seyşeller\n    ts: Seychelles\n    tt: Сейшел утраулары\n    ug: سېيشېل ئاراللىرى\n    uk: Сейшельські Острови\n    ur: سیچیلیس\n    uz: Seyshell orollari\n    vi: Seychelles\n    vo: Säceluäns\n    wo: Seysel\n    yo: Ṣèíhẹ́lẹ́sì\n    zh: 塞舌尔\n    zu: IsiSeyisheli\n"
  },
  {
    "path": "settings/country-names/sd.yaml",
    "content": "name: \n    default: السودان\n    af: Soedan\n    ak: Sudan\n    am: ሱዳን\n    an: Sudán\n    ar: السودان\n    az: Sudan\n    ba: Судан\n    be: Судан\n    bg: Судан\n    bm: Sudan\n    bn: সুদান\n    bo: སུའུ་ཏན།\n    br: Soudan\n    bs: Sudan\n    ca: Sudan\n    ce: Судан\n    cs: Súdán\n    cv: Судан\n    cy: Sudan\n    da: Sudan\n    de: Sudan\n    dv: ސޫދާން\n    ee: Sudan\n    el: Σουδάν\n    en: Sudan\n    eo: Sudano\n    es: Sudán\n    et: Sudaan\n    eu: Sudan\n    fa: سودان\n    fi: Sudan\n    fo: Sudan\n    fr: Soudan\n    fy: Sûdan\n    ga: An tSúdáin\n    gd: Sudan\n    gl: Sudán\n    gn: Sudano\n    gu: સુદાન\n    gv: Yn Toodaan\n    ha: Sudan\n    he: סודאן\n    hi: सूडान\n    hr: Sudan\n    ht: Soudan\n    hu: Szudán\n    hy: Սուդան\n    ia: Sudan\n    id: Sudan\n    ie: Sudan\n    ig: Sudan\n    io: Sudan\n    is: Súdan\n    it: Sudan\n    ja: スーダン\n    jv: Sudan\n    ka: სუდანი\n    kg: Sudan\n    ki: Sũdana\n    kk: Судан\n    kn: ಸುಡಾನ್\n    ko: 수단\n    ku: Sûdan\n    kw: Soudan\n    ky: Судан\n    la: Sudania\n    lb: Sudan\n    li: Soedan\n    ln: Sudani\n    lt: Sudanas\n    lv: Sudāna\n    mi: Hūtāne\n    mk: Судан\n    ml: സുഡാൻ\n    mn: Судан\n    mr: सुदान\n    ms: Sudan\n    mt: Sudan\n    my: ဆူဒန်နိုင်ငံ\n    na: Tudan\n    nl: Soedan\n    \"no\": Sudan\n    nv: Soodą́ą\n    ny: Sudan\n    oc: Sodan\n    om: Sudaan\n    or: ସୁଦାନ\n    os: Судан\n    pa: ਸੁਡਾਨ\n    pl: Sudan\n    ps: سوډان\n    pt: Sudão\n    qu: Sudan\n    rm: Sudan\n    ro: Sudan\n    ru: Судан\n    rw: Sudani\n    sa: सूडान\n    sc: Sudan\n    sd: سوڊان\n    se: Sudan\n    sg: Sudäan\n    sh: Sudan\n    sk: Sudán\n    sl: Sudan\n    sm: Sudan\n    sn: Sudan\n    so: Suudaan\n    sq: Sudani\n    sr: Судан\n    ss: ISudani\n    su: Sudan\n    sv: Sudan\n    sw: Sudan\n    ta: சூடான்\n    te: సూడాన్\n    tg: Судон\n    th: ประเทศซูดาน\n    ti: ሱዳን\n    tk: Sudan\n    tl: Sudan\n    tr: Sudan\n    ts: Sudan\n    tt: Судан\n    ug: سۇدان\n    uk: Судан\n    ur: سوڈان\n    uz: Sudan\n    vi: Sudan\n    vo: Sudän\n    wo: Sudaan\n    yi: סודאן\n    yo: Sudan\n    zh: 苏丹共和国\n"
  },
  {
    "path": "settings/country-names/se.yaml",
    "content": "name: \n    default: Sverige\n    ab: Швециа\n    af: Swede\n    ak: Sweden\n    am: ስዊድን\n    an: Suecia\n    ar: السويد\n    az: İsveç\n    ba: Швеция\n    be: Швецыя\n    bg: Швеция\n    bi: Sweden\n    bm: Swedi\n    bn: সুইডেন\n    bo: སི་ཝེ་དེན།\n    br: Sveden\n    bs: Švedska\n    ca: Suècia\n    ce: Швеци\n    co: Svezia\n    cs: Švédsko\n    cu: Свєньско\n    cv: Швеци\n    cy: Sweden\n    da: Sverige\n    de: Schweden\n    dv: ސުވިޑަން\n    dz: སུའི་ཌན་\n    ee: Sweden\n    el: Σουηδία\n    en: Sweden\n    eo: Svedio\n    es: Suecia\n    et: Rootsi\n    eu: Suedia\n    fa: سوئد\n    fi: Ruotsi\n    fo: Svøríki\n    fr: Suède\n    fy: Sweden\n    ga: An tSualainn\n    gd: An t-Suain\n    gl: Suecia\n    gn: Suesia\n    gu: સ્વિડન\n    gv: Yn Toolynn\n    he: שבדיה\n    hi: स्वीडन\n    hr: Švedska\n    ht: Syèd\n    hu: Svédország\n    hy: Շվեդիա\n    ia: Svedia\n    id: Swedia\n    ie: Svedia\n    io: Suedia\n    is: Svíþjóð\n    it: Svezia\n    iu: ᔅᕗᕆᑭ\n    ja: スウェーデン\n    jv: Swédia\n    ka: შვედეთი\n    kg: Suedi\n    ki: Sweden\n    kk: Швеция\n    kl: Svenskit Nunaat\n    km: ស៊ុយអែត\n    kn: ಸ್ವೀಡನ್\n    ko: 스웨덴\n    ku: Swêd\n    kv: Швеция\n    kw: Swedherwyk\n    ky: Швеция\n    la: Suecia\n    lb: Schweden\n    lg: Swiiden\n    li: Zwede\n    ln: Swédi\n    lt: Švedija\n    lv: Zviedrija\n    mg: Soeda\n    mi: Huītene\n    mk: Шведска\n    ml: സ്വീഡൻ\n    mn: Швед\n    mr: स्वीडन\n    ms: Sweden\n    mt: Żvezja\n    my: ဆွီဒင်နိုင်ငံ\n    na: Widen\n    ne: स्वीडेन\n    nl: Zweden\n    \"no\": Sverige\n    oc: Suècia\n    or: ସ୍ଵିଡେନ\n    os: Швеци\n    pa: ਸਵੀਡਨ\n    pl: Szwecja\n    ps: سويډن\n    pt: Suécia\n    qu: Suwidsuyu\n    rm: Svezia\n    ro: Suedia\n    ru: Швеция\n    rw: Suwede\n    sa: स्वीडन\n    sc: Isvetzia\n    se: Ruoŧŧa\n    sh: Švedska\n    sk: Švédsko\n    sl: Švedska\n    sm: Sweden\n    so: Iswiidhan\n    sq: Suedia\n    sr: Шведска\n    ss: ISwideni\n    su: Swédia\n    sv: Sverige\n    sw: Uswidi\n    ta: சுவீடன்\n    te: స్వీడన్\n    tg: Шветсия\n    th: ประเทศสวีเดน\n    tk: Şwesiýa\n    tl: Suwesya\n    tr: İsveç\n    tt: Швеция\n    tw: Sweden\n    ug: شۋېتسىيە\n    uk: Швеція\n    ur: سویڈن\n    uz: Shvetsiya\n    vi: Thụy Điển\n    vo: Svedän\n    wa: Suwedwesse\n    wo: Suweed\n    yi: שוועדן\n    yo: Swídìn\n    zh: 瑞典\n    zu: ISwidi\n"
  },
  {
    "path": "settings/country-names/sg.yaml",
    "content": "name: \n    default: Singapore\n    af: Singapoer\n    am: ሲንጋፖር\n    an: Singapur\n    ar: سنغافورة\n    az: Sinqapur\n    ba: Сингапур\n    be: Сінгапур\n    bg: Сингапур\n    bi: Singapore\n    bn: সিঙ্গাপুর\n    bo: སེང་ག་ཕོར།\n    br: Singapour\n    bs: Singapur\n    ca: Singapur\n    ce: Сингапур\n    cs: Singapur\n    cv: Сингапур\n    cy: Singapore\n    da: Singapore\n    de: Singapur\n    dv: ސިންގަޕޫރު\n    el: Σιγκαπούρη\n    en: Singapore\n    eo: Singapuro\n    es: Singapur\n    et: Singapur\n    eu: Singapur\n    fa: سنگاپور\n    ff: Sinngapuur\n    fi: Singapore\n    fo: Singapor\n    fr: Singapour\n    fy: Singapoer\n    ga: Singeapór\n    gd: Singeapòr\n    gl: Singapur\n    gu: સિંગાપુર\n    gv: Singapore\n    ha: Singapore\n    he: סינגפור\n    hi: सिंगापुर\n    hr: Singapur\n    ht: Sengapou\n    hu: Szingapúr\n    hy: Սինգապուրի Հանրապետություն\n    ia: Singapur\n    id: Singapura\n    ie: Singapor\n    io: Singapur\n    is: Singapúr\n    it: Singapore\n    ja: シンガポール\n    jv: Singapura\n    ka: სინგაპური\n    ki: Singapore\n    kk: Сингапур\n    kl: Singapore\n    km: សិង្ហបុរី\n    kn: ಸಿಂಗಾಪುರ್\n    ko: 싱가포르\n    ku: Singapûr\n    kv: Сингапур\n    kw: Singapour\n    ky: Сингапур\n    la: Singapura\n    lb: Singapur\n    li: Singapore\n    ln: Singapur\n    lt: Singapūras\n    lv: Singapūra\n    mg: Singapaoro\n    mi: Hingapoa\n    mk: Сингапур\n    ml: സിംഗപ്പൂർ\n    mn: Сингапур\n    mr: सिंगापूर\n    ms: Singapura\n    mt: Singapor\n    my: စင်ကာပူနိုင်ငံ\n    na: Tsingapoar\n    ne: सिंगापुर\n    nl: Singapore\n    \"no\": Singapore\n    nv: Sį́ʼgaboo\n    oc: Singapor\n    or: ସିଙ୍ଗାପୁର\n    os: Сингапур\n    pa: ਸਿੰਘਾਪੁਰ\n    pl: Singapur\n    ps: سينګاپور\n    pt: Singapura\n    qu: Singapur\n    ro: Singapore\n    ru: Сингапур\n    rw: Singapore\n    sa: सिङ्गापुरम्\n    se: Singapore\n    sg: Sïngäpûru\n    sh: Singapur\n    sk: Singapur\n    sl: Singapur\n    sm: Sigapoa\n    so: Singabuur\n    sq: Singapori\n    sr: Сингапур\n    ss: ISingapholo\n    su: Singapura\n    sv: Singapore\n    sw: Singapuri\n    ta: சிங்கப்பூர்\n    te: సింగపూరు\n    tg: Сингапур\n    th: ประเทศสิงคโปร์\n    tk: Singapur\n    tl: Singapore\n    tr: Singapur\n    tt: Сингапур\n    ug: سىنگاپور\n    uk: Сінгапур\n    ur: سنگاپور\n    uz: Singapur\n    vi: Singapore\n    vo: Singapurän\n    wo: Singapoor\n    yi: סינגאפור\n    yo: Singapore\n    zh: 新加坡\n"
  },
  {
    "path": "settings/country-names/sh.yaml",
    "content": "name: \n    default: Saint Helena, Ascension and Tristan da Cunha\n    ar: سانت هيلينا، أسينسيون وتريستان دا كونها\n    cs: Svatá Helena, Ascension a Tristan da Cunha\n    de: St. Helena, Ascension und Tristan da Cunha\n    el: Αγία Ελένη, Ασενσιόν και Τριστάν ντα Κούνια\n    en: Saint Helena, Ascension and Tristan da Cunha\n    eo: Sankta Heleno, Ascension kaj Tristan da Cunha\n    es: Santa Elena, Ascensión y Tristán de Acuña\n    fa: سنت هلنا، اسنشن و تریستان دا کونا\n    fr: Sainte-Hélène, Ascension et Tristan da Cunha\n    hr: Sveta Helena\n    hu: Szent Ilona, Ascension és Tristan da Cunha\n    it: Sant'Elena, Ascensione e Tristan da Cunha\n    lt: Šventoji Elena, Dangun Žengimo ir Tristanas da Kunja\n    mk: Света Елена, Успение и Тристан да Куња\n    nl: Sint-Helena, Ascension en Tristan da Cunha\n    \"no\": Sankt Helena, Ascension og Tristan da Cunha\n    pt: Santa Helena, Ascensão e Tristão da Cunha\n    ru: Острова Святой Елены, Вознесения и Тристан-да-Кунья\n    sk: Svätá Helena, Ascension a Tristan da Cunha\n    sr: Света Хелена, Асенсион, и Тристан да Куња\n    tr: Saint Helena, Ascension ve Tristan da Cunha\n    uk: Острови Святої Єлени, Вознесіння і Тристан-да-Кунья\n    vi: Saint Helena, Ascension và Tristan da Cunha\n    zh: 圣赫勒拿、阿森松和特里斯坦-达库尼亚\n"
  },
  {
    "path": "settings/country-names/si.yaml",
    "content": "name: \n    default: Slovenija\n    af: Slowenië\n    am: ስሎቬኒያ\n    an: Eslovenia\n    ar: سلوفينيا\n    az: Sloveniya\n    ba: Словения\n    be: Славенія\n    bg: Словения\n    bi: Slovenia\n    bn: স্লোভেনিয়া\n    bo: སི་ལོ་ཝེ་ནི་ཡ།\n    br: Slovenia\n    bs: Slovenija\n    ca: Eslovènia\n    ce: Словени\n    co: Sluvenia\n    cs: Slovinsko\n    cu: Їллѷрїиска Словѣнїꙗ\n    cv: Словени\n    cy: Slofenia\n    da: Slovenien\n    de: Slowenien\n    dv: ސުލޮވީނިއާ\n    ee: Slovenia\n    el: Σλοβενία\n    en: Slovenia\n    eo: Slovenio\n    es: Eslovenia\n    et: Sloveenia\n    eu: Eslovenia\n    fa: اسلوونی\n    fi: Slovenia\n    fo: Slovenia\n    fr: Slovénie\n    fy: Sloveenje\n    ga: An tSlóivéin\n    gd: Sloibhìnia\n    gl: Eslovenia\n    gn: Eloveña\n    gu: સ્લોવેનિયા\n    gv: Yn Clovean\n    he: סלובניה\n    hi: स्लोवेनिया\n    hr: Slovenija\n    ht: Sloveni\n    hu: Szlovénia\n    hy: Սլովենիա\n    ia: Slovenia\n    id: Slovenia\n    ie: Slovenia\n    io: Slovenia\n    is: Slóvenía\n    it: Slovenia\n    ja: スロベニア\n    jv: Slovénia\n    ka: სლოვენია\n    kg: Slovenia\n    kk: Словения\n    kl: Slovenia\n    ko: 슬로베니아\n    ku: Slovenya\n    kv: Словения\n    kw: Sloveni\n    la: Slovenia\n    lb: Slowenien\n    li: Slovenië\n    ln: Slovenia\n    lt: Slovėnija\n    lv: Slovēnija\n    mi: Horowinia\n    mk: Словенија\n    ml: സ്ലൊവീന്യ\n    mn: Словен\n    mr: स्लोव्हेनिया\n    ms: Slovenia\n    mt: Slovenja\n    my: ဆလိုဗေးနီးယားနိုင်ငံ\n    na: Tsirobeniya\n    ne: स्लोभेनिया\n    nl: Slovenië\n    \"no\": Slovenia\n    nv: Słobíín Bikéyah\n    oc: Eslovènia\n    or: ସ୍ଲୋଭେନିଆ\n    os: Словени\n    pl: Słowenia\n    ps: سلووانیا\n    pt: Eslovénia\n    qu: Isluwinya\n    rm: Slovenia\n    ro: Slovenia\n    ru: Словения\n    rw: Siloveniya\n    sa: स्लोवीनिया\n    sc: Islovènia\n    se: Slovenia\n    sh: Slovenija\n    sk: Slovinsko\n    sl: Slovenija\n    sm: Slovenia\n    so: Isloveeniya\n    sq: Sllovenia\n    sr: Словенија\n    ss: Siloveni\n    st: Slovenia\n    su: Slovénia\n    sv: Slovenien\n    sw: Slovenia\n    ta: சுலோவீனியா\n    te: స్లోవేనియా\n    tg: Словения\n    th: ประเทศสโลวีเนีย\n    tk: Sloweniýa\n    tl: Eslobenya\n    tr: Slovenya\n    tt: Словения\n    ug: Slowéniye\n    uk: Словенія\n    ur: سلووینیا\n    uz: Sloveniya\n    vi: Slovenia\n    vo: Sloveniyän\n    wo: Esloweeni\n    yi: סלאוועניע\n    yo: Sloféníà\n    zh: 斯洛文尼亞\n"
  },
  {
    "path": "settings/country-names/sk.yaml",
    "content": "name: \n    default: Slovensko\n    af: Slowakye\n    am: ስሎቫኪያ\n    an: Eslovaquia\n    ar: سلوفاكيا\n    az: Slovakiya\n    ba: Словакия\n    be: Славакія\n    bg: Словакия\n    bi: Slovakia\n    bn: স্লোভাকিয়া\n    bo: སི་ལོ་ཕ་ཁེ།\n    br: Slovakia\n    bs: Slovačka\n    ca: Eslovàquia\n    ce: Словаки\n    co: Sluvacchia\n    cs: Slovensko\n    cu: Словѣньско\n    cv: Словаки\n    cy: Slofacia\n    da: Slovakiet\n    de: Slowakei\n    dv: ސުލޮވާކިއާ\n    ee: Slovakia\n    el: Σλοβακία\n    en: Slovakia\n    eo: Slovakio\n    es: Eslovaquia\n    et: Slovakkia\n    eu: Eslovakia\n    fa: اسلواکی\n    fi: Slovakia\n    fo: Slovakia\n    fr: Slovaquie\n    fy: Slowakije\n    ga: An tSlóvaic\n    gd: An t-Slòbhac\n    gl: Eslovaquia\n    gn: Elovakia\n    gu: સ્લોવાકિયા\n    gv: Yn Clovack\n    he: סלובקיה\n    hi: स्लोवाकिया\n    hr: Slovačka\n    ht: Slovaki\n    hu: Szlovákia\n    hy: Սլովակիա\n    ia: Slovachia\n    id: Slowakia\n    ie: Slovacia\n    io: Slovakia\n    is: Slóvakía\n    it: Slovacchia\n    ja: スロバキア\n    jv: Slowakia\n    ka: სლოვაკეთი\n    kg: Slovakia\n    kk: Словакия\n    kl: Slovakia\n    ko: 슬로바키아\n    ku: Slovakya\n    kv: Словакия\n    kw: Slovaki\n    ky: Словакия\n    la: Slovacia\n    lb: Slowakei\n    li: Slowakieë\n    ln: Slovakia\n    lt: Slovakija\n    lv: Slovākija\n    mi: Horowākia\n    mk: Словачка\n    ml: സ്ലോവാക്യ\n    mn: Словак\n    mr: स्लोव्हाकिया\n    ms: Slovakia\n    mt: Slovakkja\n    my: ဆလိုဗားကီးယားနိုင်ငံ\n    na: Slowakia\n    ne: स्लोभाकिया\n    nl: Slowakije\n    \"no\": Slovakia\n    nv: Słóbaʼ Bikéyah\n    oc: Eslovaquia\n    or: ସ୍ଲୋଭାକିଆ\n    os: Словаки\n    pl: Słowacja\n    ps: سلواکيا\n    pt: Eslováquia\n    qu: Isluwakya\n    rm: Slovachia\n    ro: Slovacia\n    ru: Словакия\n    rw: Silovakiya\n    sa: स्लोवाकिया\n    se: Slovakia\n    sh: Slovačka\n    sk: Slovensko\n    sl: Slovaška\n    so: Islofaakiya\n    sq: Sllovakia\n    sr: Словачка\n    ss: Silovakhi\n    st: Slovakia\n    su: Slovakia\n    sv: Slovakien\n    sw: Slovakia\n    ta: சிலோவாக்கியா\n    tg: Словакия\n    th: ประเทศสโลวาเกีย\n    tk: Slowakiýa\n    tl: Eslobakya\n    tr: Slovakya\n    tt: Словакия\n    ug: سلوۋاكىيە\n    uk: Словаччина\n    ur: سلوواکیہ\n    uz: Slovakiya\n    vi: Slovakia\n    vo: Slovakiyän\n    wo: Eslowaaki\n    yi: סלאוואקיי\n    yo: Slofákíà\n    zh: 斯洛伐克\n    zu: ISlovaki\n"
  },
  {
    "path": "settings/country-names/sl.yaml",
    "content": "name: \n    default: Sierra Leone\n    af: Sierra Leone\n    ak: Sierra Leone\n    am: ሴየራ ሌዎን\n    an: Sierra Leone\n    ar: سيراليون\n    az: Syerra-Leone\n    ba: Сьерра-Леоне\n    be: Сьера-Леонэ\n    bg: Сиера Леоне\n    bm: Sera Leon\n    bn: সিয়েরা লিওন\n    bo: སི་ར་ལེ་ཨོན།\n    br: Sierra Leone\n    bs: Sijera Leone\n    ca: Sierra Leone\n    ce: Сьерра-Леоне\n    cs: Sierra Leone\n    cy: Sierra Leone\n    da: Sierra Leone\n    de: Sierra Leone\n    dv: ސެރެލިއޯން\n    ee: Sierra Leone\n    el: Σιέρα Λεόνε\n    en: Sierra Leone\n    eo: Siera-Leono\n    es: Sierra Leona\n    et: Sierra Leone\n    eu: Sierra Leona\n    fa: سیرالئون\n    ff: Sarliyon\n    fi: Sierra Leone\n    fo: Sierra Leona\n    fr: Sierra Leone\n    fy: Sierra Leöane\n    ga: Siarra Leon\n    gd: Siarra Leòmhann\n    gl: Serra Leoa\n    gv: Sierra Leone\n    he: סיירה לאונה\n    hi: सिएरा लियोन\n    hr: Sijera Leone\n    ht: Syera Leòn\n    hu: Sierra Leone\n    hy: Սիերա Լեոնե\n    id: Sierra Leone\n    ie: Sierra Leone\n    io: Sierra Leone\n    is: Síerra Leóne\n    it: Sierra Leone\n    ja: シエラレオネ\n    jv: Sierra Leone\n    ka: სიერა-ლეონე\n    kg: Siera Leone\n    kk: Сиерра-Леоне\n    kn: ಸಿಯೆರ್ರಾ ಲಿಯೋನ್\n    ko: 시에라리온\n    ku: Sierra Leone\n    kw: Sierra Leon\n    la: Mons Leoninus\n    lb: Sierra Leone\n    li: Sierra Leone\n    ln: Sierra Leone\n    lt: Siera Leonė\n    lv: Sjerraleone\n    mi: Te Araone\n    mk: Сиера Леоне\n    ml: സീറാ ലിയോൺ\n    mn: Сьерра-Леоне\n    mr: सियेरा लिओन\n    ms: Sierra Leone\n    mt: Sierra Leone\n    my: ဆီရာလီယွန်နိုင်ငံ\n    nl: Sierra Leone\n    \"no\": Sierra Leone\n    nv: Náshdóítsoh Bitsiijįʼ Daditłʼooʼígíí Bidził\n    oc: Sierra Leone\n    or: ସିଏରା ଲିଓନ\n    os: Сьеррæ-Леоне\n    pa: ਸਿਏਰਾ ਲਿਓਨ\n    pl: Sierra Leone\n    ps: سېرالیون\n    pt: Serra Leoa\n    qu: Liyun Urqu\n    ro: Sierra Leone\n    ru: Сьерра-Леоне\n    rw: Siyera Lewone\n    sa: सियारा-लियोन\n    sc: Sierra Leone\n    se: Sierra Leone\n    sg: Sierä-Leône\n    sh: Sijera Leone\n    si: සියෙරා ලියෝන්\n    sk: Sierra Leone\n    sl: Sierra Leone\n    sn: Sierra Leone\n    so: Sierra Leone\n    sq: Siera Leone\n    sr: Сијера Леоне\n    ss: ISiriya-Liyoni\n    su: Sierra Leone\n    sv: Sierra Leone\n    sw: Sierra Leone\n    ta: சியேரா லியோனி\n    tg: Сиерра Леоне\n    th: ประเทศเซียร์ราลีโอน\n    tk: Sýerra-Leone\n    tl: Bulubunduking Leona\n    tr: Sierra Leone\n    ts: Siyera Liyona\n    tw: Sierra Leone\n    ug: سيېررا لېئونې\n    uk: Сьєрра-Леоне\n    ur: سیرالیون\n    uz: Syerra Leone\n    vi: Sierra Leone\n    vo: Sieraleonän\n    wo: Siraa Leyoon\n    yi: סיערע לעאנע\n    yo: Siẹrra Léònè\n    zh: 塞拉利昂\n    zu: ISiera Liyoni\n"
  },
  {
    "path": "settings/country-names/sm.yaml",
    "content": "name: \n    default: San Marino\n    ar: سان مارينو\n    be: Сан-Марына\n    bg: Сан Марино\n    br: San Marino\n    cs: San Marino\n    da: San Marino\n    de: San Marino\n    el: Άγιος Μαρίνος\n    en: San Marino\n    eo: San-Marino\n    fa: سان مارینو\n    fi: San Marino\n    fr: Saint-Marin\n    fy: San Marino\n    ga: San Mairíne\n    he: סן מרינו\n    hr: San Marino\n    hu: San Marino\n    ia: San Marino\n    io: San Marino\n    is: San Marínó\n    it: San Marino\n    la: Sancti Marini\n    lt: San Marinas\n    mi: Hato Marino\n    mn: Сан-Марино\n    nl: San Marino\n    \"no\": San Marino\n    pl: San Marino\n    pt: San Marino\n    ru: Сан-Марино\n    se: San Marino\n    sk: San Maríno\n    sv: San Marino\n    ta: சான் மரீனோ\n    th: ประเทศซานมารีโน\n    uk: Сан-Маріно\n    vo: Sanmarinän\n    zh: 圣马力诺\n"
  },
  {
    "path": "settings/country-names/sn.yaml",
    "content": "name: \n    default: Sénégal\n    af: Senegal\n    am: ሴኔጋል\n    an: Senegal\n    ar: السنغال\n    az: Seneqal\n    ba: Сенегал\n    be: Сенегал\n    bg: Сенегал\n    bm: Senegal\n    bn: সেনেগাল\n    bo: སི་ནི་གཱལ།\n    br: Senegal\n    bs: Senegal\n    ca: Senegal\n    ce: Сенегал\n    cs: Senegal\n    cv: Сенегал\n    cy: Sénégal\n    da: Senegal\n    de: Senegal\n    dv: ސެނެގާލް\n    ee: Senegal\n    el: Σενεγάλη\n    en: Senegal\n    eo: Senegalo\n    es: Senegal\n    et: Senegal\n    eu: Senegal\n    fa: سنگال\n    ff: Senegaal\n    fi: Senegal\n    fo: Senegal\n    fr: Sénégal\n    fy: Senegal\n    ga: An tSeineagáil\n    gd: Seanagal\n    gl: Senegal\n    gv: Yn Tenegaal\n    ha: Senegal\n    he: סנגל\n    hi: सेनेगल\n    hr: Senegal\n    ht: Senegal\n    hu: Szenegál\n    hy: Սենեգալ\n    ia: Senegal\n    id: Senegal\n    ie: Senegal\n    io: Senegal\n    is: Senegal\n    it: Senegal\n    ja: セネガル\n    jv: Senegal\n    ka: სენეგალი\n    kg: Senangale\n    kk: Сенегал\n    kn: ಸೆನೆಗಲ್\n    ko: 세네갈\n    ku: Senegal\n    kw: Senegal\n    ky: Сенегал\n    la: Senegalia\n    lb: Senegal\n    li: Senegal\n    ln: Senegale\n    lt: Senegalas\n    lv: Senegāla\n    mi: Henekara\n    mk: Сенегал\n    ml: സെനെഗൽ\n    mn: Сенегал\n    mr: सेनेगाल\n    ms: Senegal\n    mt: Senegal\n    my: ဆီနီဂေါနိုင်ငံ\n    na: Senegal\n    nl: Senegal\n    \"no\": Senegal\n    oc: Senegal\n    or: ସେନେଗାଲ\n    os: Сенегал\n    pa: ਸੇਨੇਗਲ\n    pl: Senegal\n    ps: سېنېګال\n    pt: Senegal\n    qu: Sinigal\n    ro: Senegal\n    ru: Сенегал\n    rw: Senegali\n    sa: सेनेगल\n    sc: Senegàl\n    sd: سينيگال\n    se: Senegal\n    sg: Senegäle\n    sh: Senegal\n    sk: Senegal\n    sl: Senegal\n    sn: Senegal\n    so: Sinigaal\n    sq: Senegali\n    sr: Сенегал\n    st: Senegal\n    su: Sénégal\n    sv: Senegal\n    sw: Senegal\n    ta: செனிகல்\n    te: సెనెగల్\n    tg: Сенегал\n    th: ประเทศเซเนกัล\n    ti: ሴኔጋል\n    tk: Senegal\n    tl: Senegal\n    tr: Senegal\n    ts: Senegal\n    tt: Сенегал\n    ug: سېنېگال\n    uk: Сенегал\n    ur: سینیگال\n    uz: Senegal\n    vi: Sénégal\n    vo: Senegalän\n    wa: Senegal\n    wo: Senegaal\n    yi: סענעגאל\n    yo: Sẹ̀nẹ̀gàl\n    zh: 塞内加尔\n    zu: ISenegal\n"
  },
  {
    "path": "settings/country-names/so.yaml",
    "content": "name: \n    default: Soomaaliya الصومال\n    af: Somalië\n    am: ሶማሊያ\n    an: Somalia\n    ar: الصومال\n    az: Somali\n    ba: Сомали\n    be: Самалі\n    bg: Сомалия\n    bn: সোমালিয়া\n    bo: སོ་མ་ལི།\n    br: Somalia\n    bs: Somalija\n    ca: Somàlia\n    ce: Сомали\n    cs: Somálsko\n    cy: Somalia\n    da: Somalia\n    de: Somalia\n    dv: ސޯމާލިއާ\n    ee: Somalia\n    el: Σομαλία\n    en: Somalia\n    eo: Somalio\n    es: Somalia\n    et: Somaalia\n    eu: Somalia\n    fa: سومالی\n    fi: Somalia\n    fo: Somalia\n    fr: Somalie\n    fy: Somaalje\n    ga: An tSomáil\n    gd: Somàilia\n    gl: Somalia\n    gv: Yn Tomaal\n    he: סומליה\n    hi: सोमालिया\n    hr: Somalija\n    ht: Somali\n    hu: Szomália\n    hy: Սոմալի\n    ia: Somalia\n    id: Somalia\n    ie: Somalia\n    io: Somalia\n    is: Sómalía\n    it: Somalia\n    ja: ソマリア\n    jv: Somalia\n    ka: სომალი\n    kg: Sômâlia\n    ki: Somalia\n    kk: Сомали\n    kn: ಸೊಮಾಲಿಯ\n    ko: 소말리아\n    ku: Somalya\n    kw: Somali\n    la: Somalia\n    lb: Somalia\n    li: Somalië\n    ln: Somalia\n    lt: Somalis\n    lv: Somālija\n    mg: Somalia\n    mi: Hūmārie\n    mk: Сомалија\n    ml: സൊമാലിയ\n    mn: Сомали\n    mr: सोमालिया प्रजासत्ताक\n    ms: Somalia\n    mt: Somalja\n    my: ဆိုမာလီယာနိုင်ငံ\n    na: Tomariya\n    nl: Somalië\n    \"no\": Somalia\n    nv: Soomáálii Bikéyah\n    oc: Somalia\n    om: Somaaliyaa\n    or: ସୋମାଲିଆ\n    os: Сомали\n    pa: ਸੋਮਾਲੀਆ\n    pl: Somalia\n    ps: سومالیا\n    pt: Somália\n    qu: Sumalya\n    rm: Somalia\n    ro: Somalia\n    ru: Сомали\n    rw: Somaliya\n    sa: सोमालिया\n    sc: Somàlia\n    se: Somália\n    sg: Somalïi\n    sh: Somalija\n    si: සෝමාලියාව\n    sk: Somálsko\n    sl: Somalija\n    sm: Somalia\n    sn: Somalia\n    so: Soomaaliya\n    sq: Somalia\n    sr: Сомалија\n    ss: ISomaliya\n    st: Somalia\n    su: Somalia\n    sv: Somalia\n    sw: Somalia\n    ta: சோமாலியா\n    te: సొమాలియా\n    tg: Сумолӣ\n    th: ประเทศโซมาเลีย\n    ti: ሶማሊያ\n    tk: Somali\n    tl: Somalya\n    tr: Somali\n    ts: Somalia\n    tt: Сомали\n    ug: سومالى\n    uk: Сомалі\n    ur: صومالیہ\n    uz: Somali\n    vi: Somalia\n    vo: Somalän\n    wo: Somali\n    yi: סאמאליע\n    yo: Sòmálíà\n    zh: 索马里\n    zu: ISomalia\n"
  },
  {
    "path": "settings/country-names/sr.yaml",
    "content": "name: \n    default: Suriname\n    af: Suriname\n    am: ሱሪናም\n    an: Surinam\n    ar: سورينام\n    ay: Suriname\n    az: Surinam\n    ba: Суринам\n    be: Сурынам\n    bg: Суринам\n    bn: সুরিনাম\n    bo: སུ་རི་ནེམ།\n    br: Surinam\n    bs: Surinam\n    ca: Surinam\n    ce: Суринам\n    cs: Surinam\n    cv: Суринам\n    cy: Suriname\n    da: Surinam\n    de: Suriname\n    dv: ސުރިނާމް\n    ee: Suriname\n    el: Σουρινάμ\n    en: Suriname\n    eo: Surinamo\n    es: Surinam\n    et: Suriname\n    eu: Surinam\n    fa: سورینام\n    fi: Suriname\n    fo: Surinam\n    fr: Suriname\n    fy: Suriname\n    ga: Suranam\n    gd: Suranam\n    gl: Suriname\n    gn: Surinam\n    gu: સુરીનામ\n    gv: Yn Toorinam\n    he: סורינאם\n    hi: सूरीनाम\n    hr: Surinam\n    ht: Sirinam\n    hu: Suriname\n    hy: Սուրինամ\n    id: Suriname\n    ie: Surinam\n    io: Surinam\n    is: Súrínam\n    it: Suriname\n    ja: スリナム\n    jv: Suriname\n    ka: სურინამი\n    kk: Суринам\n    kl: Suriname\n    kn: ಸುರಿನಾಮ್\n    ko: 수리남\n    ku: Sûrînam\n    kw: Surinam\n    la: Surinamia\n    lb: Surinam\n    li: Suriname\n    ln: Suriname\n    lt: Surinamas\n    lv: Surinama\n    mi: Hurināme\n    mk: Суринам\n    ml: സുരിനാം\n    mn: Суринам\n    mr: सुरिनाम\n    ms: Suriname\n    mt: Surinam\n    my: ဆူရာနမ်နိုင်ငံ\n    nl: Suriname\n    \"no\": Surinam\n    nv: Sówinam\n    oc: Surinam\n    or: ସରିନମ\n    os: Суринам\n    pa: ਸੂਰੀਨਾਮ\n    pl: Surinam\n    ps: سورينام\n    pt: Suriname\n    qu: Surinam\n    rm: Suriname\n    ro: Surinam\n    ru: Суринам\n    rw: Surinamu\n    se: Suriname\n    sh: Surinam\n    sk: Surinam\n    sl: Surinam\n    so: Surinam\n    sq: Surinami\n    sr: Суринам\n    su: Suriname\n    sv: Surinam\n    sw: Surinam\n    ta: சுரிநாம்\n    te: సురినామ్\n    th: ประเทศซูรินาเม\n    tl: Surinam\n    tr: Surinam\n    tt: Суринам\n    ug: سۇرىنام\n    uk: Суринам\n    ur: سرینام\n    uz: Surinam\n    vi: Suriname\n    vo: Surinän\n    wo: Surinaam\n    yi: סורינאם\n    yo: Sùrìnámù\n    zh: 蘇利南\n"
  },
  {
    "path": "settings/country-names/ss.yaml",
    "content": "name: \n    default: South Sudan\n    af: Suid-Soedan\n    am: ደቡብ ሱዳን\n    an: Sudán d'o Sud\n    ar: جنوب السودان\n    av: Югалъулаб Судан\n    az: Cənubi Sudan\n    be: Паўднёвы Судан\n    bg: Южен Судан\n    bn: দক্ষিণ সুদান\n    br: Soudan ar Su\n    bs: Južni Sudan\n    ca: Sudan del Sud\n    cs: Jižní Súdán\n    cv: Кăнтăр Судан\n    cy: De Sudan\n    da: Sydsudan\n    de: Südsudan\n    el: Νότιο Σουδάν\n    en: South Sudan\n    eo: Suda Sudano\n    es: Sudán del Sur\n    et: Lõuna-Sudaan\n    eu: Hego Sudan\n    fa: سودان جنوبی\n    fi: Etelä-Sudan\n    fo: Suðursudan\n    fr: Sud-Soudan\n    fy: Súd-Sûdan\n    ga: An tSúdáin Theas\n    gd: Sudàn a Deas\n    gl: Sudán do Sur\n    gv: Yn Toodaan Yiass\n    he: דרום סודאן\n    hi: दक्षिण सूडान\n    hr: Južni Sudan\n    hu: Dél-Szudán\n    hy: Հարավային Սուդան\n    ia: Sudan del Sud\n    id: Sudan Selatan\n    ie: Sud-Sudan\n    io: Sud-Sudan\n    is: Suður-Súdan\n    it: Sudan del Sud\n    ja: 南部スーダン\n    jv: Sudan Kidul\n    ka: სამხრეთი სუდანი\n    kk: Оңтүстік Судан\n    ko: 남수단\n    ku: Sûdana Başûr\n    kv: Лунвыв Судан\n    kw: Soudan Soth\n    ky: Түштүк Судан\n    la: Sudania Australis\n    lb: Südsudan\n    li: Zuid-Soedan\n    lt: Pietų Sudanas\n    lv: Dienvidsudāna\n    mk: Јужен Судан\n    ml: ദക്ഷിണ സുഡാൻ\n    mr: दक्षिण सुदान\n    ms: Sudan Selatan\n    my: တောင်ဆူဒန်နိုင်ငံ\n    na: South Sudan\n    nl: Zuid-Soedan\n    \"no\": Sør-Sudan\n    nv: Shádiʼááhjí Soodą́ą\n    oc: Sodan del Sud\n    or: ଦକ୍ଷିନ ସୁଦାନ\n    pa: ਦੱਖਣੀ ਸੁਡਾਨ\n    pl: Sudan Południowy\n    ps: سوېلي سوډان\n    pt: Sudão do Sul\n    qu: Urin Sudan\n    rm: Sudan dal Sid\n    ro: Sudanul de Sud\n    ru: Южный Судан\n    sc: Sudan Meridionali\n    se: Lulli-Sudan\n    sg: Sudäan-Mbongo\n    sh: Južni Sudan\n    sk: Južný Sudán\n    sl: Južni Sudan\n    sn: South Sudan\n    so: Koonfur Suudaan\n    sq: Sudani i Jugut\n    sr: Јужни Судан\n    su: Sudan Kidul\n    sv: Sydsudan\n    sw: Sudan Kusini\n    ta: தெற்கு சூடான்\n    te: దక్షిణ సూడాన్\n    th: ประเทศเซาท์ซูดาน\n    tk: Günorta Sudan\n    tl: Timog Sudan\n    tr: Güney Sudan\n    tt: Көньяк Судан\n    uk: Південний Судан\n    ur: جنوبی سوڈان\n    uz: Janubiy Sudan\n    vi: Nam Sudan\n    vo: Sulüda-Sudän\n    yi: דרום סודאן\n    yo: Gúúsù Sudan\n    zh: 南蘇丹\n    zu: ISudan yaseNingizimu\n"
  },
  {
    "path": "settings/country-names/st.yaml",
    "content": "name: \n    default: São Tomé e Príncipe\n    af: São Tomé en Principe\n    ar: سان تومي وبرينسيبي\n    br: São Tomé ha Príncipe\n    ca: São Tomé i Príncipe\n    cs: Svatý Tomáš a Princův ostrov\n    cy: São Tomé a Príncipe\n    da: São Tomé og Príncipe\n    de: São Tomé und Príncipe\n    el: Σάο Τομέ και Πρίνσιπε\n    en: São Tomé and Príncipe\n    eo: Sao-Tomeo kaj Principeo\n    es: Santo Tomé y Príncipe\n    et: São Tomé ja Príncipe\n    fa: سائوتومه و پرینسیپ\n    fi: São Tomé ja Príncipe\n    fr: Sao Tomé-et-Principe\n    fy: Sao Tomee en Prinsipe\n    ga: São Tomé agus Príncipe\n    gd: São Tomé agus Príncipe\n    he: סאו טומה ופרינסיפה\n    hr: Sveti Toma i Princip\n    hu: São Tomé és Príncipe\n    id: Sao Tome dan Principe\n    io: San-Tome e Principe\n    is: Saó Tóme og Prinsípe\n    la: Insulae Sancti Thomae et Principis\n    lb: São Tomé a Príncipe\n    li: São Tomé en Príncipe\n    lt: Sao Tomė ir Prinsipė\n    mn: Сан-Томе ба Принсипи\n    nl: Sao Tomé en Principe\n    \"no\": São Tomé og Príncipe\n    pl: Wyspy Świętego Tomasza i Książęca\n    pt: São Tomé e Príncipe\n    ru: Сан-Томе и Принсипи\n    se: São Tomé ja Príncipe\n    sk: Svätý Tomáš a Princov ostrov\n    sl: Sveti Tomaž in Princ\n    sr: Сао Томе и Принсипе\n    sv: São Tomé och Príncipe\n    ta: சாவோ தொமே மற்றும் பிரின்சிப்பி\n    th: ประเทศเซาตูเมและปรินซิปี\n    tr: São Tomé ve Príncipe\n    uk: Сан-Томе і Принсіпі\n    vi: São Tomé và Príncipe\n    vo: Saluda-Tomeän e Prinsipeän\n    zh: 圣多美和普林西比\n"
  },
  {
    "path": "settings/country-names/sv.yaml",
    "content": "name: \n    default: El Salvador\n    af: El Salvador\n    am: ኤል ሳልቫዶር\n    an: El Salvador\n    ar: السلفادور\n    ay: El Salvador\n    az: Salvador\n    ba: Сальвадор\n    be: Сальвадор\n    bg: Салвадор\n    bm: El Salvador\n    bn: এল সালভাদোর\n    bo: ཨིལ་སལ་ཝ་ཌོར།\n    br: El Salvador\n    bs: El Salvador\n    ca: El Salvador\n    ce: Сальвадор\n    cs: Salvador\n    cy: El Salvador\n    da: El Salvador\n    de: El Salvador\n    dv: އެލްސެލްވަޑޯރު\n    ee: El Salvador\n    el: Ελ Σαλβαδόρ\n    en: El Salvador\n    eo: Salvadoro\n    es: República de El Salvador\n    et: El Salvador\n    eu: El Salvador\n    fa: السالوادور\n    fi: El Salvador\n    fo: El Salvador\n    fr: Salvador\n    fy: El Salvador\n    ga: An tSalvadóir\n    gd: El Salbhador\n    gl: O Salvador\n    gn: Salvador\n    gv: Yn Salvador\n    he: אל סלוודור\n    hi: अल साल्वाडोर\n    hr: Salvador\n    ht: Salvadò\n    hu: Salvador\n    hy: Սալվադոր\n    ia: El Salvador\n    id: El Salvador\n    io: Salvadoria\n    is: El Salvador\n    it: El Salvador\n    ja: エルサルバドル\n    jv: El Salvador\n    ka: სალვადორი\n    kk: Эль-Сальвадор Республикасы\n    kn: ಎಲ್ ಸಾಲ್ವಡಾರ್\n    ko: 엘살바도르\n    ku: El Salvador\n    kw: El Salvador\n    la: Salvatoria\n    lb: El Salvador\n    li: El Salvador\n    ln: El Salvador\n    lt: Salvadoras\n    lv: Salvadora\n    mi: Te Whakaora\n    mk: Ел Салвадор\n    ml: എൽ സാൽവദോർ\n    mn: Эль Сальвадор\n    mr: एल साल्व्हाडोर\n    ms: El Salvador\n    mt: El Salvador\n    my: အယ်ဆာဗေဒိုနိုင်ငံ\n    na: Ersarbador\n    ne: एल साल्भादोर\n    nl: El Salvador\n    \"no\": El Salvador\n    oc: Lo Salvador\n    or: ଏଲ ସାଲଭାଡୋର\n    os: Сальвадор\n    pa: ਸਾਲਵਾਦੋਰ\n    pl: Salwador\n    ps: اېلسلوادور\n    pt: El Salvador\n    qu: Salwadur\n    ro: El Salvador\n    ru: Сальвадор\n    rw: Saluvadoro\n    sa: एल-साल्वाडोर\n    se: El Salvador\n    sh: Salvador\n    si: එල් සැල්ව‍ඩෝ\n    sk: Salvádor\n    sl: Salvador\n    so: El Salfador\n    sq: Salvadori\n    sr: Салвадор\n    ss: ISalivado\n    su: Él Salvador\n    sv: El Salvador\n    sw: El Salvador\n    ta: எல் சால்வடோர்\n    tg: Салвадор\n    th: ประเทศเอลซัลวาดอร์\n    tl: El Salvador\n    tr: El Salvador\n    tt: Сальвадор\n    ug: ئەل سالۋادور\n    uk: Сальвадор\n    ur: ایل سیلواڈور\n    uz: El Salvador\n    vi: El Salvador\n    vo: Salvadorän\n    wo: Salbadoor\n    yi: על סאלוואדאר\n    yo: El Salfador\n    zh: 萨尔瓦多\n    zu: El Salvador\n"
  },
  {
    "path": "settings/country-names/sy.yaml",
    "content": "name: \n    default: سوريا\n    af: Sirië\n    am: ሶርያ\n    an: Siria\n    ar: سوريا\n    av: Сирия\n    az: Suriya\n    ba: Сирия\n    be: Сірыя\n    bg: Сирия\n    bm: Suriya\n    bn: সিরিয়া\n    bo: སི་རི་ཡ།\n    br: Siria\n    bs: Sirija\n    ca: República Àrab Siriana\n    ce: Шема\n    cs: Sýrie\n    cu: Сѷрїꙗ\n    cv: Сири\n    cy: Syria\n    da: Syrien\n    de: Syrien\n    dv: ސޫރިޔާ\n    el: Συρία\n    en: Syria\n    eo: Sirio\n    es: Siria\n    et: Süüria\n    eu: Siria\n    fa: سوریه\n    fi: Syyria\n    fo: Sýria\n    fr: Syrie\n    fy: Syrje\n    ga: An tSiria\n    gd: Siria\n    gl: Siria - سورية\n    gu: સિરિયા\n    gv: Yn Teer\n    he: סוריה\n    hi: सीरिया\n    hr: Sirija\n    ht: Siri\n    hu: Szíria\n    hy: Սիրիա\n    ia: Syria\n    id: Suriah\n    ie: Siria\n    io: Siria\n    is: Sýrland\n    it: Siria\n    ja: シリア\n    jv: Suriah\n    ka: სირია\n    ki: Syria\n    kk: Сирия\n    kl: Syria\n    kn: ಸಿರಿಯಾ\n    ko: 시리아\n    ku: Sûrî\n    kv: Сирия\n    kw: Syri\n    ky: Сирия\n    la: Syria\n    lb: Syrien\n    li: Syrië\n    ln: Sirí\n    lt: Sirija\n    lv: Sīrija\n    mg: Siria\n    mi: Hiria\n    mk: Сирија\n    ml: സിറിയ\n    mn: Сири\n    mr: सीरिया\n    ms: Syria\n    my: ဆီးရီးယားနိုင်ငံ\n    na: Syria\n    ne: सीरिया\n    nl: Syrië\n    \"no\": Syria\n    nv: Sííwiya\n    oc: Siria\n    or: ସିରିଆ\n    os: Сири\n    pa: ਸੀਰੀਆ\n    pl: Syria\n    ps: سوريه\n    pt: Síria\n    qu: Sirya\n    ro: Siria\n    ru: Сирия\n    rw: Siriya\n    sa: सिरिया\n    sc: Siria\n    sd: شام\n    se: Syria\n    sh: Sirija\n    sk: Sýria\n    sl: Sirija\n    so: Suuriya\n    sq: Siria\n    sr: Сирија\n    ss: ISiriya\n    su: Suriah\n    sv: Syrien\n    sw: Syria\n    ta: சிரியா\n    te: సిరియా\n    tg: Сурия\n    th: ประเทศซีเรีย\n    tk: Siriýa\n    tl: Sirya\n    tr: Suriye\n    tt: Сүрия\n    ug: سۇرىيە\n    uk: Сирія\n    ur: شام\n    uz: Suriya\n    vi: Syria\n    vo: Süriyän\n    wa: Sireye\n    wo: Siri\n    yi: סיריע\n    yo: Síríà\n    zh: 叙利亚/敘利亞\n"
  },
  {
    "path": "settings/country-names/sz.yaml",
    "content": "name: \n    default: eSwatini\n    af: Swaziland\n    am: ስዋዚላንድ\n    an: Swazilandia\n    ar: سوازيلاند\n    ay: Suasïsuiu\n    az: Svazilend\n    ba: Свазиленд\n    be: Эсваціні\n    bg: Есватини\n    bm: Swazilandi\n    bn: সোয়াজিল্যান্ড\n    bo: སུ་ཝ་ཛི་ལནཌ།\n    br: Swaziland\n    bs: Svazilend\n    ca: Swazilàndia\n    cs: Svazijsko\n    cy: Gwlad Swazi\n    da: Swaziland\n    de: Eswatini\n    dv: ސުވާޒިލޭންޑު\n    dz: སུ་ཝ་ཛི་ལེནཌ\n    ee: Swaziland\n    el: Σουαζιλάνδη\n    en: Eswatini\n    eo: Svazilando\n    es: Suazilandia\n    et: Svaasimaa\n    eu: Swazilandia\n    fa: سوازیلند\n    ff: Swaasilannda\n    fi: Swazimaa\n    fo: Svasiland\n    fr: Swaziland\n    fy: Swazilân\n    ga: An tSuasalainn\n    gd: Dùthaich nan Suasaidh\n    gl: Suacilandia - Swaziland\n    gu: સ્વાઝીલેન્ડ\n    gv: Yn Çheer Swassee\n    ha: Suwazilan\n    he: סווזילנד\n    hi: स्वाज़ीलैण्ड\n    hr: Svazi\n    ht: Swazilann\n    hu: Szváziföld\n    hy: Սվազիլենդ\n    ia: Swazilandia\n    id: Swaziland\n    ie: Swaziland\n    io: Swazilando\n    is: Svasíland\n    it: Swaziland\n    ja: スワジランド\n    jv: Swaziland\n    ka: სვაზილენდი\n    kg: Swati\n    ki: Uswazi\n    kk: Суазиланд\n    kl: Swazilandi\n    km: សូហ្ស៉ីឡង់\n    kn: ಸ್ವಾಜಿಲ್ಯಾಂಡ್\n    ko: 스와질란드\n    ks: سُوزِلینٛڑ\n    ku: Swaziland\n    kw: Pow Swati\n    la: Swazia\n    lb: Swasiland\n    lg: Swazirandi\n    li: Swaziland\n    ln: Swaziland\n    lo: ສະວາຊິແລນ\n    lt: Svazilandas\n    lv: Svazilenda\n    mg: Soazilandy\n    mi: Warerangi\n    mk: Свазиленд\n    ml: സ്വാസിലാന്റ്\n    mn: Свазиланд\n    mr: स्वाझीलँड\n    ms: Swaziland\n    mt: Sważiland\n    my: ဆွာဇီလန်နိုင်ငံ\n    ne: स्वाजिल्याण्ड\n    nl: Swaziland\n    \"no\": Eswatini\n    nv: Swáazi Dineʼé Bikéyah\n    oc: Swaziland\n    or: ସ୍ଵାଜିଲ୍ୟାଣ୍ଡ\n    os: Свазиленд\n    pa: ਸਵਾਜ਼ੀਲੈਂਡ\n    pl: Eswatini\n    ps: سوازيلانډ\n    pt: eSwatini\n    qu: Swasisuyu\n    rn: Suwazilandi\n    ro: eSwatini\n    ru: Эсватини\n    rw: Swazilande\n    sa: स्वाजीलैंड\n    sc: Swaziland\n    se: Swazieana\n    sg: Swäzïlânde\n    sh: Svazilend\n    si: ස්වාසිලන්තය\n    sk: Svazijsko\n    sl: Esvatini\n    sn: Swaziland\n    so: Swasiland\n    sq: Suazilendi\n    sr: Есватини\n    ss: eSwatini\n    su: Swaziland\n    sv: Swaziland\n    sw: Uswazi\n    ta: சுவாசிலாந்து\n    te: స్వాజీలేండ్\n    tg: Свазиленд\n    th: ประเทศสวาซิแลนด์\n    ti: ስዋዚላንድ\n    tk: Swazilend\n    tl: Suwasilandya\n    to: Suasileni\n    tr: Esvatini\n    ts: Swaziland\n    tt: Свазиленд\n    ug: سۋازىلېند\n    uk: Есватіні\n    ur: سوازی لینڈ\n    uz: Svazilend\n    ve: Swazini\n    vi: Eswatini\n    vo: Svasiyän\n    wo: Suwaasilaand\n    yi: סוואזילאנד\n    yo: Swásílándì\n    zh: 斯威士兰/斯威士蘭/史瓦濟蘭\n    zu: ISwazilandi\n"
  },
  {
    "path": "settings/country-names/tc.yaml",
    "content": "name: \n    default: Turks and Caicos Islands\n    af: Turks en Caicos Eilande\n    an: Islas Turcas e Caicos\n    ar: جزر تركس وكايكوس\n    bg: Търкс и Кайкос\n    bn: টার্কস্‌ ও কেইকোস দ্বীপপুঞ্জ\n    br: Inizi  Turks ha Caicos\n    bs: Ostrva Turks i Caicos\n    ca: Illes Turks i Caicos\n    cs: Turks a Caicos\n    cv: Тĕркс тата Кайкос\n    cy: Ynysoedd Turks a Caicos\n    da: Turks- og Caicosøerne\n    de: Turks- und Caicosinseln\n    dv: ޓާކަސް އަދި ކައިކޯ ޖަޒީރާ\n    el: Τερκς και Κάικος\n    en: Turks and Caicos Islands\n    eo: Turkoj kaj Kajkoj\n    es: Islas Turcas y Caicos\n    et: Turks ja Caicos\n    eu: Turks eta Caicos uharteak\n    fa: جزایر تورکس و کایکوس\n    fi: Turks- ja Caicossaaret\n    fr: Îles Turques-et-Caïques\n    fy: Turks- en Kaikoseilannen\n    ga: Oileáin na dTurcach agus Caicos\n    gd: Oileáin na dTurcach agus Caicos\n    gl: Turks e Caicos\n    he: איי טרקס וקייקוס\n    hi: टर्क्स और केकोस द्वीप-समूह\n    hr: Otočje Turks i Caicos\n    hu: Turks- és Caicos-szigetek\n    id: Kepulauan Turks dan Caicos\n    io: Turks e Kaikos-Insuli\n    is: Turks- og Caicoseyjar\n    it: Turks e Caicos\n    ja: タークス・カイコス諸島\n    jv: Kapuloan Turks lan Caicos\n    ko: 터크스 케이커스 제도\n    kw: Turks ha Kaykos\n    lt: Terksas ir Kaikosas\n    lv: Tērksas un Kaikosas\n    mn: Туркс ба Кайкосын Арлууд\n    mr: टर्क्स आणि कैकास द्वीपसमूह\n    ms: Kepulauan Turks dan Caicos\n    nb: Turks- og Caicosøyene\n    nl: Turks- en Caicoseilanden\n    nn: Turks- og Caicosøyane\n    \"no\": Turks- og Caicosøyene\n    pl: Turks i Caicos\n    pt: Ilhas Turcas e Caicos\n    ro: Insulele Turks şi Caicos\n    ru: Тёркс и Кайкос\n    sh: Turks i Caicos Otoci\n    sk: Turks a Caicos\n    sl: Otoki Turks in Caicos\n    sq: Turks dhe Kaikos\n    sr: Туркс и Кајкос\n    sv: Turks- och Caicosöarna\n    sw: Visiwa vya Turks na Caicos\n    ta: துர்கசு கைகோசு தீவுகள்\n    th: หมู่เกาะเติร์กและไคคอส\n    tr: Turks ve Caicos Adaları\n    ug: Turks we Kaykos Taqim Aralliri\n    uk: Острови Теркс і Кайкос\n    vi: Quần đảo Turks và Caicos\n    wo: Turks and Caicos Islands\n    zh: 特克斯和凱科斯群島\n"
  },
  {
    "path": "settings/country-names/td.yaml",
    "content": "name: \n    default: Tchad تشاد\n    af: Tsjad\n    am: ቻድ\n    an: Chad\n    ar: تشاد\n    az: Çad\n    ba: Чад\n    be: Чад\n    bg: Чад\n    bm: Cad\n    bn: চাদ\n    bo: ཆཱ་ཌ།\n    br: Tchad\n    bs: Čad\n    ca: Txad\n    ce: Чад\n    cs: Čad\n    cv: Чад\n    cy: Tchad\n    da: Tchad\n    de: Tschad\n    dv: ޝާދު\n    ee: Chad\n    el: Τσαντ\n    en: Chad\n    eo: Ĉado\n    es: Chad\n    et: Tšaad\n    eu: Txad\n    fa: چاد\n    fi: Tšad\n    fo: Kjad\n    fr: Tchad\n    fy: Tsjaad\n    ga: Sead\n    gd: An t-Siad\n    gl: Chad - Tchad\n    gu: ચૅડ\n    gv: Shad\n    ha: Cadi\n    he: צ'אד\n    hi: चाड\n    hr: Čad\n    ht: Tchad\n    hu: Csád\n    hy: Չադ\n    ia: Tchad\n    id: Chad\n    ie: Chad\n    ig: Chad\n    io: Chad\n    is: Tsjad\n    it: Ciad\n    ja: チャド\n    jv: Chad\n    ka: ჩადი\n    kg: Tasadi\n    kk: Чад\n    ko: 차드\n    ku: Çad\n    kw: Chad\n    la: Tzadia\n    lb: Tschad\n    li: Tsjaad\n    ln: Tshadi\n    lt: Čadas\n    lv: Čada\n    mi: Kāta\n    mk: Чад\n    ml: ഛാഡ്\n    mn: Чад\n    mr: चाड\n    ms: Chad\n    mt: Ċad\n    my: ချဒ်သမ္မတနိုင်ငံ\n    na: Tsiad\n    nl: Tsjaad\n    \"no\": Tsjad\n    oc: Chad\n    or: ଚାଡ\n    os: Чад\n    pa: ਚਾਡ\n    pl: Czad\n    ps: چاډ\n    pt: Chade\n    qu: Chad\n    rm: Tschad\n    ro: Ciad\n    ru: Чад\n    rw: Cade\n    sa: चाड\n    sc: Chad\n    se: Chad\n    sg: Sâde\n    sh: Čad\n    si: චෑඩ්\n    sk: Čad\n    sl: Čad\n    sn: Chad\n    so: Jad\n    sq: Çadi\n    sr: Чад\n    ss: IShedi\n    su: Chad\n    sv: Tchad\n    sw: Chad\n    ta: சாட்\n    te: చాద్\n    tg: Чад\n    th: ประเทศชาด\n    ti: ቻድ\n    tk: Çad\n    tl: Tsad\n    tr: Çad\n    ts: Chad\n    tt: Чад\n    ug: چاد\n    uk: Чад\n    ur: چاڈ\n    uz: Chad\n    vi: Tchad\n    vo: Tjadän\n    wa: Tchad\n    wo: Cadd\n    yi: טשאד\n    yo: Tsad\n    zh: 乍得\n    zu: ITshedi\n"
  },
  {
    "path": "settings/country-names/tg.yaml",
    "content": "name: \n    default: Togo\n    af: Togo\n    ak: Togo\n    am: ቶጎ\n    an: Togo\n    ar: توغو\n    az: Toqo\n    ba: Того\n    be: Тога\n    bg: Того\n    bm: Togo\n    bn: টোগো\n    bo: ཊོ་གོ\n    br: Togo\n    bs: Togo\n    ca: Togo\n    ce: Того\n    cs: Togo\n    cv: Того\n    cy: Togo\n    da: Togo\n    de: Togo\n    dv: ޓޯގޯ\n    ee: Togo\n    el: Τόγκο\n    en: Togo\n    eo: Togolando\n    es: Togo\n    et: Togo\n    eu: Togo\n    fa: توگو\n    fi: Togo\n    fr: Togo\n    fy: Togo\n    ga: Tóga\n    gd: Tògo\n    gl: Togo\n    gu: ટોગો\n    gv: Yn Togo\n    ha: Togo\n    he: טוגו\n    hi: टोगो\n    hr: Togo\n    ht: Togo\n    hu: Togo\n    hy: Տոգո\n    id: Togo\n    ie: Togo\n    ig: Togo\n    io: Togo\n    is: Tógó\n    it: Togo\n    ja: トーゴ\n    jv: Togo\n    ka: ტოგო\n    kk: Того\n    kn: ಟೊಗೊ\n    ko: 토고\n    ku: Togo\n    kw: Togo\n    la: Togum\n    lb: Togo\n    li: Togo\n    ln: Togo\n    lt: Togas\n    lv: Togo\n    mi: Toko\n    mk: Того\n    ml: ടോഗോ\n    mn: Того\n    mr: टोगो\n    ms: Togo\n    mt: Togo\n    my: တိုဂိုနိုင်ငံ\n    na: Togo\n    nl: Togo\n    \"no\": Togo\n    nv: Tʼóogo\n    oc: Tògo\n    or: ଟୋଗୋ\n    os: Того\n    pa: ਟੋਗੋ\n    pl: Togo\n    pt: Togo\n    qu: Tugu\n    rm: Togo\n    ro: Togo\n    ru: Того\n    rw: Togo\n    sa: टोगो\n    sc: Togo\n    se: Togo\n    sg: Togö\n    sh: Togo\n    si: ටෝගෝ\n    sk: Togo\n    sl: Togo\n    sn: Togo\n    so: Togo\n    sq: Togo\n    sr: Того\n    ss: IThogo\n    st: Togo\n    su: Togo\n    sv: Togo\n    sw: Togo\n    ta: டோகோ\n    tg: Того\n    th: ประเทศโตโก\n    ti: ቶጎ\n    tk: Togo\n    tl: Togo\n    tr: Togo\n    ts: Togo\n    tw: Togo\n    ug: توگو\n    uk: Того\n    ur: ٹوگو\n    uz: Togo\n    vi: Togo\n    vo: Togoän\n    wo: Togóo\n    yi: טאגא\n    yo: Tógò\n    zh: 多哥\n    zu: ITogo\n"
  },
  {
    "path": "settings/country-names/th.yaml",
    "content": "name: \n    default: ประเทศไทย\n    af: Thailand\n    am: ታይላንድ\n    an: Tailandia\n    ar: تايلاند\n    as: থাইলেণ্ড\n    az: Tailand\n    ba: Таиланд\n    be: Тайланд\n    bg: Тайланд\n    bn: থাইল্যান্ড\n    bo: ཐའི་ལེན།\n    br: Thailand\n    bs: Tajland\n    ca: Tailàndia\n    ce: Таиланд\n    cs: Thajsko\n    cv: Таиланд\n    cy: Gwlad Thai\n    da: Thailand\n    de: Thailand\n    dv: ސިޔާމު\n    dz: ཐཱའི་ལེནཌ\n    el: Ταϊλάνδη\n    en: Thailand\n    eo: Tajlando\n    es: Tailandia\n    et: Tai\n    eu: Thailandia\n    fa: تایلند\n    fi: Thaimaa\n    fo: Teiland\n    fr: Thaïlande\n    fy: Tailân\n    ga: An Téalainn\n    gd: Dùthaich nan Tàidh\n    gl: Tailandia\n    gn: Tailandia\n    gu: થાઇલેન્ડ\n    gv: Yn Çheer Thai\n    he: תאילנד\n    hi: थाईलैण्ड\n    hr: Tajland\n    ht: Tayilann\n    hu: Thaiföld\n    hy: Թաիլանդ\n    ia: Thailanda\n    id: Thailand\n    ie: Thailand\n    io: Tailando\n    is: Taíland\n    it: Thailandia\n    ja: タイ王国\n    jv: Thailand\n    ka: ტაილანდი\n    ki: Thailand\n    kk: Тайланд\n    kl: Thailandi\n    km: ថៃ\n    kn: ಥೈಲ್ಯಾಂಡ್\n    ko: 태국\n    ks: تھائی لینڈ\n    ku: Taylenda\n    kv: Таиланд\n    kw: Pow Tay\n    la: Thailandia\n    lb: Thailand\n    li: Thailand\n    lo: ປະເທດໄທ\n    lt: Tailandas\n    lv: Taizeme\n    mg: Tailandy\n    mi: Tairana\n    mk: Тајланд\n    ml: തായ്‌ലാന്റ്\n    mn: Тайланд\n    mr: थायलंड\n    ms: Thailand\n    my: ထိုင်းနိုင်ငံ\n    na: Thailand\n    ne: थाइल्याण्ड\n    nl: Thailand\n    \"no\": Thailand\n    nv: Tʼáí Bikéyah\n    oc: Tailàndia\n    or: ଥାଇଲାଣ୍ଡ\n    os: Таиланд\n    pa: ਥਾਈਲੈਂਡ\n    pl: Tajlandia\n    ps: تايلنډ\n    pt: Tailândia\n    qu: Thaysuyu\n    ro: Thailanda\n    ru: Таиланд\n    rw: Tayilande\n    sa: श्यामदेश\n    sd: ٿائيلينڊ\n    se: Thaieana\n    sg: Tailânde\n    sh: Tajland\n    sk: Thajsko\n    sl: Tajska\n    so: Tayland\n    sq: Tajlanda\n    sr: Тајланд\n    ss: IThayilandi\n    su: Thailand\n    sv: Thailand\n    sw: Uthai\n    ta: தாய்லாந்து\n    te: థాయిలాండ్\n    tg: Таиланд\n    th: Muang Thai\n    tk: Tailand\n    tl: Taylandiya\n    tr: Tayland\n    tt: Таиланд\n    tw: Thailand\n    ug: تايلاند\n    uk: Таїланд\n    ur: تھائی لینڈ\n    uz: Tailand\n    vi: Thái Lan\n    vo: Tayän\n    wo: Taaylaand\n    yi: טיילאנד\n    yo: Tháílàndì\n    za: Daigoz\n    zh: 泰国\n"
  },
  {
    "path": "settings/country-names/tj.yaml",
    "content": "name: \n    default: Тоҷикистон\n    af: Tadjikistan\n    am: ታጂኪስታን\n    an: Tachiquistán\n    ar: طاجيكستان\n    ay: Tayiksuyu\n    az: Tacikistan\n    ba: Тажикстан\n    be: Таджыкістан\n    bg: Таджикистан\n    bn: তাজিকিস্তান\n    bo: ཐ་ཇི་ཁེ་སི་ཏན།\n    br: Tadjikistan\n    bs: Tadžikistan\n    ca: Tadjikistan\n    ce: Таджикистан\n    cs: Tádžikistán\n    cu: Таджикистанъ\n    cv: Таджикистан\n    cy: Tajikistan\n    da: Tadsjikistan\n    de: Tadschikistan\n    dv: ތަޖިކިސްތާން\n    dz: ཏ་ཇག་ཀིསི་ཏཱན་\n    ee: Tajikistan\n    el: Τατζικιστάν\n    en: Tajikistan\n    eo: Taĝikio\n    es: Tayikistán\n    et: Tadžikistan\n    eu: Tajikistan\n    fa: تاجیکستان\n    fi: Tadžikistan\n    fo: Tadsjikistan\n    fr: Tadjikistan\n    fy: Tadzjikistan\n    ga: An Táidsíceastáin\n    gd: Taidigeastàn\n    gl: Taxiquistán\n    gu: તાજિકિસ્તાન\n    gv: Yn Tajikistaan\n    he: טג'יקיסטן\n    hi: ताजिकिस्तान\n    hr: Tadžikistan\n    ht: Tadjikistan\n    hu: Tádzsikisztán\n    hy: Տաջիկստան\n    ia: Tajikistan\n    id: Tajikistan\n    ie: Tadjikistan\n    io: Tajikistan\n    is: Tadsjikistan\n    it: Tagikistan\n    ja: タジキスタン\n    jv: Tajikistan\n    ka: ტაჯიკეთი\n    kk: Тәжікстан\n    km: តាជីគីស្ថាន\n    kn: ತಜಿಕಿಸ್ತಾನ್\n    ko: 타지키스탄\n    ku: Tacîkistan\n    kv: Таджикистан\n    kw: Pow Tajik\n    ky: Тажикстан\n    la: Tadzikistania\n    lb: Tadjikistan\n    li: Tadzjikistan\n    lt: Tadžikija\n    lv: Tadžikistāna\n    mk: Таџикистан\n    ml: താജിക്കിസ്ഥാൻ\n    mn: Тажикистан\n    mr: ताजिकिस्तान\n    ms: Tajikistan\n    my: တာဂျစ်ကစ္စတန်နိုင်ငံ\n    na: Tadjikitan\n    nl: Tadzjikistan\n    \"no\": Tadsjikistan\n    nv: Tʼajiʼ Bikéyah\n    oc: Tatgiquistan\n    or: ତାଜିକିସ୍ତାନ\n    os: Таджикистан\n    pl: Tadżykistan\n    ps: تاجيکستان\n    pt: Tajiquistão\n    qu: Tayiksuyu\n    ro: Tadjikistan\n    ru: Таджикистан\n    rw: Tajikisitani\n    sa: ताजिकिस्थान\n    se: Tažikistan\n    sh: Tadžikistan\n    si: ටජිකිස්ථාන්\n    sk: Tadžikistan\n    sl: Tadžikistan\n    so: Tadsjikistan\n    sq: Taxhikistani\n    sr: Таџикистан\n    ss: IThajiki\n    su: Tajikistan\n    sv: Tadzjikistan\n    sw: Tajikistan\n    ta: தஜிகிஸ்தான்\n    te: తజికిస్తాన్\n    tg: Тоҷикистон\n    th: ประเทศทาจิกิสถาน\n    tk: Täjigistan\n    tl: Tayikistan\n    tr: Tacikistan\n    tt: Таҗикстан\n    ug: تاجىكىستان\n    uk: Таджикистан\n    ur: تاجکستان\n    uz: Tojikiston\n    vi: Tajikistan\n    vo: Tacikistän\n    wo: Tajikistaan\n    yi: טאדזשיקיסטאן\n    yo: Tajikistan\n    zh: 塔吉克斯坦\n"
  },
  {
    "path": "settings/country-names/tk.yaml",
    "content": "name: \n    default: Tokelau\n    am: ቶክላው\n    ar: توكلو\n    be: Такелаў\n    bg: Токелау\n    bm: Tokelo\n    bn: টোকেলাউ\n    br: Tokelau\n    ca: Tokelau\n    cs: Tokelau\n    da: Tokelau\n    de: Tokelau\n    dz: ཏོ་ཀེ་ལའུ་ མཚོ་གླིང\n    ee: Tokelau nutome\n    el: Τοκελάου\n    en: Tokelau\n    eo: Tokelao\n    es: Tokelau\n    fa: توکلائو\n    ff: Tokelaaw\n    fi: Tokelau\n    fr: Tokelau\n    fy: Tokelaû\n    ga: Oileáin Tócalá\n    gu: ટોકેલાઉ\n    ha: Takelau\n    he: טוקלאו\n    hi: तोकेलाउ\n    hr: Tokelau\n    hu: Tokelau-szigetek\n    is: Tókelá\n    ja: トケラウ\n    km: តូខេឡៅ\n    kn: ಟೊಕೆಲಾವ್\n    ko: 토켈라우\n    ks: توکیلاو\n    ku: Tokelau\n    lg: Tokelawu\n    lo: ໂຕເກເລົາ\n    lt: Tokelau\n    lv: Tokelau\n    mg: Tokelao\n    mk: Токелау\n    ml: ടൊകെലാവു\n    mn: Токелау\n    mr: तोकेलाउ\n    mt: Tokelaw\n    ne: तोगो\n    \"no\": Tokelau\n    or: ଟୋକେଲାଉ\n    pl: Tokelau\n    pt: Toquelau\n    rn: Tokelawu\n    ru: Токелау\n    si: ටොකලාවු\n    sk: Tokelau\n    sr: Токелау\n    sv: Tokelauöarna\n    ta: டோகேலோ\n    te: టోకేలావ్\n    th: โตเกเลา\n    ti: ቶክላው\n    uk: Токелау\n    ur: ٹوکیلاؤ\n    vi: Tokelau\n    yo: Orílẹ́ède Tokelau\n    zh: 托克劳\n    zu: i-Tokelau\n"
  },
  {
    "path": "settings/country-names/tl.yaml",
    "content": "name: \n    default: Timór Lorosa'e\n    af: Oos-Timor\n    ar: جمهورية تيمور\n    br: Timor ar Reter\n    ca: Timor Oriental\n    cs: Východní Timor\n    cy: Dwyrain Timor\n    da: Østtimor\n    de: Osttimor\n    el: Ανατολικό Τιμόρ\n    en: East Timor\n    eo: Orienta Timoro\n    es: Timor Oriental\n    et: Ida-Timor\n    fa: تیمور شرقی\n    fi: Itä-Timor\n    fr: Timor oriental\n    fy: East-Timor\n    ga: An Tíomór Thoir\n    gd: Tiomor an Ear\n    he: מזרח טימור\n    hr: Istočni Timor\n    hu: Kelet-Timor\n    id: Timor Leste\n    is: Austur-Tímor\n    it: Timor Est\n    la: Timoria Orientalis\n    li: Oos-Timor\n    lt: Rytų Timoras\n    mn: Зүүн Тимор\n    ms: Timor Timur\n    nb: Øst-Timor\n    nl: Oost-Timor\n    nn: Aust-Timor\n    \"no\": Øst-Timor\n    pl: Timor Wschodni\n    pt: Timor-Leste\n    ru: Восточный Тимор\n    se: Nuorta-Timor\n    sk: Východný Timor\n    sl: Vzhodni Timor\n    sv: Östtimor\n    ta: கிழக்குத் திமோர்\n    th: ประเทศติมอร์ตะวันออก\n    tl: Silangan Timor\n    tr: Doğu Timor\n    tt: Көнчыгыш Тимор\n    uk: Східний Тимор\n    vi: Đông Timor\n    zh: 东帝汶 / 東帝汶\n"
  },
  {
    "path": "settings/country-names/tm.yaml",
    "content": "name: \n    default: Türkmenistan\n    af: Turkmenistan\n    am: ቱርክመኒስታን\n    an: Turkmenistán\n    ar: تركمانستان\n    av: Туркменистан\n    az: Türkmənistan\n    ba: Төрөкмәнстан\n    be: Туркменістан\n    bg: Туркменистан\n    bn: তুর্কমেনিস্তান\n    bo: ཏུརཀ་མེ་ནི་སུཏན།\n    br: Turkmenistan\n    bs: Turkmenistan\n    ca: Turkmenistan\n    co: Turkmenistan\n    cs: Turkmenistán\n    cv: Туркменистан\n    cy: Turkmenistan\n    da: Turkmenistan\n    de: Turkmenistan\n    dv: ތުރުކުމެނިސްތާން\n    ee: Turkmenistan\n    el: Τουρκμενιστάν\n    en: Turkmenistan\n    eo: Turkmenio\n    es: Turkmenistán\n    et: Türkmenistan\n    eu: Turkmenistan\n    fa: ترکمنستان\n    fi: Turkmenistan\n    fo: Turkmenistan\n    fr: Turkménistan\n    fy: Turkmenistan\n    ga: An Tuircméanastáin\n    gd: Turcmanastàn\n    gl: Turcomenistán\n    gu: તુર્કમેનિસ્તાન\n    gv: Yn Turkmenistaan\n    he: טורקמניסטן\n    hi: तुर्कमेनिस्तान\n    hr: Turkmenistan\n    ht: Tirkmenistan\n    hu: Türkmenisztán\n    hy: Թուրքմենստան\n    ia: Turkmenistan\n    id: Turkmenistan\n    ie: Turkmenistan\n    io: Turkmenistan\n    is: Túrkmenistan\n    it: Turkmenistan\n    ja: トルクメニスタン\n    jv: Turkmenistan\n    ka: თურქმენეთი\n    kk: Түрікменстан\n    km: តួរមិនីស្ថាន\n    kn: ತುರ್ಕಮೆನಿಸ್ತಾನ್\n    ko: 투르크메니스탄\n    ku: Tirkmenistan\n    kv: Туркменистан\n    kw: Pow Turkmen\n    ky: Түркмөнстан\n    la: Turcomannia\n    li: Turkmenistan\n    ln: Turkmenistáni\n    lt: Turkmėnija\n    lv: Turkmenistāna\n    mk: Туркменистан\n    ml: തുർക്‌മെനിസ്ഥാൻ\n    mn: Туркменистан\n    mr: तुर्कमेनिस्तान\n    ms: Turkmenistan\n    my: တာ့ခ်မင်နစ္စတန်နိုင်ငံ\n    na: Turkmenistan\n    ne: तुर्कमेनिस्तान\n    nl: Turkmenistan\n    \"no\": Turkmenistan\n    nv: Tʼóokmen Bikéyah\n    oc: Turcmenistan\n    or: ତୁର୍କମେନିସ୍ଥାନ\n    os: Туркмени\n    pa: ਤੁਰਕਮੇਨਸਤਾਨ\n    pl: Turkmenistan\n    ps: ترکمنستان\n    pt: Turquemenistão\n    qu: Turkminsuyu\n    ro: Turkmenistan\n    ru: Туркменистан\n    rw: Turukimenisitani\n    sa: तुर्कमिनिस्थान\n    se: Turkmenistan\n    sh: Turkmenistan\n    sk: Turkménsko\n    sl: Turkmenistan\n    so: Turkmenistan\n    sq: Turkmenistani\n    sr: Туркменистан\n    ss: IThumekhi\n    su: Turkménistan\n    sv: Turkmenistan\n    sw: Turkmenistan\n    ta: துருக்மெனிஸ்தான்\n    te: తుర్కమేనిస్తాన్\n    tg: Туркманистон\n    th: ประเทศเติร์กเมนิสถาน\n    tk: Türkmenistan\n    tl: Turkmenistan\n    tr: Türkmenistan\n    tt: Төрекмәнстан\n    ug: تۈركمەنىستان\n    uk: Туркменістан\n    ur: ترکمانستان\n    uz: Turkmaniston\n    vi: Turkmenistan\n    vo: Turkmenän\n    wo: Turkumenistaan\n    yi: טורקמעניסטאן\n    yo: Turkmẹ́nìstán\n    zh: 土库曼斯坦\n"
  },
  {
    "path": "settings/country-names/tn.yaml",
    "content": "name: \n    default: تونس\n    af: Tunisië\n    am: ቱኒዚያ\n    an: Tunicia\n    ar: تونس\n    az: Tunis\n    ba: Тунис\n    be: Туніс\n    bg: Тунис\n    bm: Tunizi\n    bn: তিউনিসিয়া\n    bo: ཏུ་ནི་ཤི་ཡ།\n    br: Tunizia\n    bs: Tunis\n    ca: Tunísia\n    ce: Тунис\n    cs: Tunisko\n    cv: Тунис\n    cy: Tunisia\n    da: Tunesien\n    de: Tunesien\n    dv: ތޫނިސް\n    ee: Tunisia\n    el: Τυνησία\n    en: Tunisia\n    eo: Tunizio\n    es: Túnez\n    et: Tuneesia\n    eu: Tunisia\n    fa: تونس\n    fi: Tunisia\n    fo: Tunesia\n    fr: Tunisie\n    fy: Tuneezje\n    ga: An Túinéis\n    gd: Tuinisia\n    gl: Tunisia\n    gu: ટ્યુનિશિયા\n    gv: Yn Tooneesh\n    he: תוניסיה\n    hi: ट्यूनिशिया\n    hr: Tunis\n    ht: Tinizi\n    hu: Tunézia\n    hy: Թունիս\n    id: Tunisia\n    ie: Tunisia\n    io: Tunizia\n    is: Túnis\n    it: Tunisia\n    ja: チュニジア\n    jv: Tunisia\n    ka: ტუნისი\n    kg: Tunisia\n    kk: Тунис\n    kn: ಟುನೀಶಿಯ\n    ko: 튀니지\n    ks: تونس\n    ku: Tûnis\n    kw: Tunisi\n    ky: Тунис\n    la: Tunesia\n    lb: Tunesien\n    li: Tunesië\n    ln: Tunisia\n    lt: Tunisas\n    lv: Tunisija\n    mg: Tonizia\n    mi: Tūnihia\n    mk: Тунис\n    ml: ടുണീഷ്യ\n    mn: Тунис\n    mr: ट्युनिसिया\n    ms: Tunisia\n    mt: Tuneżija\n    my: တူနီးရှားနိုင်ငံ\n    nl: Tunesië\n    \"no\": Tunisia\n    oc: Tunisia\n    or: ଟ୍ୟୁନିସିଆ\n    os: Тунис\n    pa: ਤੁਨੀਸੀਆ\n    pl: Tunezja\n    ps: تونس\n    pt: Tunísia\n    qu: Tunisya\n    rm: Tunesia\n    ro: Tunisia\n    ru: Тунис\n    rw: Tunisiya\n    sa: टुनिशिया\n    sc: Tunisia\n    se: Tunisia\n    sg: Tunizïi\n    sh: Tunis\n    sk: Tunisko\n    sl: Tunizija\n    sn: Tunisia\n    so: Tunisiya\n    sq: Tunizia\n    sr: Тунис\n    ss: IThunisiya\n    su: Tunisia\n    sv: Tunisien\n    sw: Tunisia\n    ta: துனீசியா\n    te: ట్యునీషియా\n    tg: Тунис\n    th: ประเทศตูนิเซีย\n    ti: ቱኒዢያ\n    tk: Tunis\n    tl: Tunisya\n    tr: Tunus\n    ts: Tunisia\n    tt: Тунис\n    ug: تۇنىس\n    uk: Туніс\n    ur: تونس\n    uz: Tunis\n    vi: Tunisia\n    vo: Tünisän\n    wa: Tunizeye\n    wo: Tiniisi\n    yi: טוניסיע\n    yo: Tùnísíà\n    zh: 突尼西亞\n    zu: ITunisia\n"
  },
  {
    "path": "settings/country-names/to.yaml",
    "content": "name: \n    default: Tonga\n    af: Tonga\n    am: ቶንጋ\n    an: Tonga\n    ar: تونجا\n    az: Tonqa\n    ba: Тонга\n    be: Тонга\n    bg: Тонга\n    bn: টোঙ্গা\n    bo: ཊོང་ག\n    br: Tonga\n    bs: Tonga\n    ca: Tonga\n    ce: Тонга\n    cs: Tonga\n    cu: Тонга\n    cy: Tonga\n    da: Tonga\n    de: Tonga\n    dv: ޓޮންގާ\n    el: Τόνγκα\n    en: Tonga\n    eo: Tongo\n    es: Tonga\n    et: Tonga\n    eu: Tonga\n    fa: تونگا\n    fi: Tonga\n    fo: Tonga\n    fr: Tonga\n    fy: Tonga\n    ga: Tonga\n    gd: Tonga\n    gl: Tonga\n    gv: Yn Tongey\n    he: טונגה\n    hi: टोंगा\n    hr: Tonga\n    ht: Tonga\n    hu: Tonga\n    hy: Տոնգա\n    ia: Tonga\n    id: Tonga\n    io: Tonga\n    is: Tonga\n    it: Tonga\n    ja: トンガ\n    jv: Tonga\n    ka: ტონგა\n    kk: Тонга\n    kn: ಟೋಂಗಾ\n    ko: 통가\n    ku: Tonga\n    kw: Tonga\n    la: Tonga\n    lb: Tonga\n    li: Tonga\n    lt: Tonga\n    lv: Tonga\n    mk: Тонга\n    ml: ടോങ്ക\n    mn: Тонга\n    mr: टोंगा\n    ms: Tonga\n    mt: Tonga\n    my: တုံဂါနိုင်ငံ\n    nl: Tonga\n    \"no\": Tonga\n    nv: Tʼónga\n    oc: Tònga\n    or: ଟୋଙ୍ଗା\n    os: Тонгæ\n    pa: ਟੋਂਗਾ\n    pl: Tonga\n    pt: Tonga\n    qu: Tunqa\n    rm: Tonga\n    ro: Tonga\n    ru: Тонга\n    rw: Tonga\n    sa: टोंगा\n    se: Tonga\n    sh: Tonga\n    sk: Tonga\n    sl: Tonga\n    sm: Toga\n    sq: Tonga\n    sr: Тонга\n    su: Tonga\n    sv: Tonga\n    sw: Tonga\n    ta: தொங்கா\n    tg: Тонга\n    th: ประเทศตองกา\n    tl: Tonga\n    to: Tonga\n    tr: Tonga\n    ts: Tonga\n    tw: Tonga\n    ty: To’a\n    ug: Ton’ga\n    uk: Тонга\n    ur: ٹونگا\n    uz: Tonga\n    vi: Tonga\n    vo: Tonguäns\n    wo: Tonga\n    yo: Tóngà\n    zh: 東加\n"
  },
  {
    "path": "settings/country-names/tr.yaml",
    "content": "name: \n    default: Türkiye\n    ab: Ҭырқәтәыла\n    af: Turkye\n    ak: Turki\n    am: ቱርክ\n    an: Turquía\n    ar: تركيا\n    av: Туркия\n    ay: Turkiya\n    az: Türkiyə\n    ba: Төркиә\n    be: Турцыя\n    bg: Турция\n    bi: Turkey\n    bn: তুরস\n    bo: ཏུར་ཀི།\n    br: Turkia\n    bs: Turska\n    ca: Turquia\n    ce: Туркойчоь\n    cs: Turecko\n    cu: Тѷрци\n    cv: Турци\n    cy: Twrci\n    da: Tyrkiet\n    de: Türkei\n    dv: ތުރުކީވިލާތް\n    ee: Turkey\n    el: Τουρκία\n    en: Turkey\n    eo: Turkio\n    es: Turquía\n    et: Türgi\n    eu: Turkia\n    fa: ترکیه\n    fi: Turkki\n    fo: Turkaland\n    fr: Turquie\n    fy: Turkije\n    ga: An Tuirc\n    gd: An Tuirc\n    gl: Turquía\n    gn: Tuykia\n    gu: તુર્કસ્તાન\n    gv: Yn Turkee\n    ha: Turkiyya\n    he: טורקיה\n    hi: तुर्की\n    hr: Turska\n    ht: Tiki\n    hu: Törökország\n    hy: Թուրքիա\n    ia: Turchia\n    id: Turki\n    ie: Turcia\n    ik: Turkey\n    io: Turkia\n    is: Tyrkland\n    it: Turchia\n    ja: トルコ\n    jv: Turki\n    ka: თურქეთი\n    kg: Turki\n    ki: Turkey\n    kk: Түркия\n    kl: Tyrkia\n    kn: ಟರ್ಕಿ\n    ko: 터키\n    ku: Tirkiye\n    kv: Турция\n    kw: Turki\n    ky: Түркия Республикасы\n    la: Turcia\n    lb: Tierkei\n    lg: Buturuki\n    li: Turkije\n    ln: Turkí\n    lt: Turkija\n    lv: Turcija\n    mg: Torkia\n    mi: Tākei\n    mk: Турција\n    ml: തുർക്കി\n    mn: Турк\n    mr: तुर्कस्तान\n    ms: Turki\n    mt: Turkija\n    my: တူရကီနိုင်ငံ\n    na: Terki\n    ne: टर्की\n    nl: Turkije\n    \"no\": Tyrkia\n    nv: Tʼóok Bikéyah\n    oc: Turquia\n    or: ତୁର୍କୀ\n    os: Турк\n    pa: ਤੁਰਕੀ\n    pl: Turcja\n    ps: تورکيه\n    pt: Turquia\n    qu: Turkiya\n    rm: Tirchia\n    rn: Turukiya\n    ro: Turcia\n    ru: Турция\n    rw: Turukiya\n    sa: तुर्की\n    sc: Turkia\n    se: Durka\n    sh: Turska\n    si: තුර්කිය\n    sk: Turecko\n    sl: Turčija\n    so: Turki\n    sq: Turqia\n    sr: Турска\n    ss: IThekhi\n    su: Turki\n    sv: Turkiet\n    sw: Uturuki\n    ta: துருக்கி\n    te: టర్కీ\n    tg: Туркия\n    th: ประเทศตุรกี\n    tk: Türkiýe\n    tl: Turkiya\n    tr: Türkiye\n    tt: Төркия\n    tw: Turkey\n    ug: تۈركىيە جۇمھۇرىيىتى\n    uk: Туреччина\n    ur: ترکی\n    uz: Turkiya\n    vi: Thổ Nhĩ Kỳ\n    vo: Türkän\n    wa: Tourkeye\n    wo: Tirki\n    yi: טערקיי\n    yo: Túrkì\n    za: Dujwjgiz\n    zh: 土耳其\n    zu: ITheki\n"
  },
  {
    "path": "settings/country-names/tt.yaml",
    "content": "name: \n    default: Trinidad and Tobago\n    af: Trinidad en Tobago\n    ar: ترينيداد وتوباغو\n    be: Трынідад і Табага\n    br: Trinidad-ha-Tobago\n    ca: Trinitat i Tobago\n    cs: Trinidad a Tobago\n    cy: Trinidad a Tobago\n    da: Trinidad og Tobago\n    de: Trinidad und Tobago\n    en: Trinidad and Tobago\n    eo: Trinidado kaj Tobago\n    es: Trinidad y Tobago\n    et: Trinidad ja Tobago\n    fa: ترینیداد و توباگو\n    fi: Trinidad ja Tobago\n    fr: Trinité-et-Tobago\n    fy: Trinidad en Tobago\n    ga: Oileán na Tríonóide agus Tobága\n    gd: Trianaid agus Tobago\n    he: טרינידד וטובגו\n    hr: Trinidad i Tobago\n    hu: Trinidad és Tobago\n    id: Trinidad dan Tobago\n    is: Trínidad og Tóbagó\n    it: Trinidad e Tobago\n    ja: トリニダード・トバゴ\n    la: Trinitas et Tabacum\n    lt: Trinidadas ir Tobagas\n    mn: Тринидад ба Тобаго\n    nl: Trinidad en Tobago\n    \"no\": Trinidad og Tobago\n    pl: Trynidad i Tobago\n    pt: Trindade e Tobago\n    ru: Тринидад и Тобаго\n    se: Trinidad ja Tobago\n    sk: Trinidad a Tobago\n    sl: Trinidad in Tobago\n    sv: Trinidad och Tobago\n    ta: டிரினிடாட் மற்றும் டொபாகோ\n    th: ประเทศตรินิแดดและโตเบโก\n    tr: Trinidad ve Tobago\n    uk: Тринідад і Тобаго\n    vi: Trinidad và Tobago\n    vo: Trinidadeän e Tobageäns\n    zh: 特立尼达和多巴哥\n"
  },
  {
    "path": "settings/country-names/tv.yaml",
    "content": "name: \n    default: Tuvalu\n    am: ቱቫሉ\n    ar: توفالو\n    be: Тувалу\n    bg: Тувалу\n    bn: টুভালু\n    bo: ཐུ་ཝ་ལུ།\n    br: Tuvalu\n    ca: Tuvalu\n    cs: Tuvalu\n    cy: Twfalw\n    da: Tuvalu\n    de: Tuvalu\n    dz: ཏུ་ཝ་ལུ\n    ee: Tuvalu nutome\n    el: Τουβαλού\n    en: Tuvalu\n    eo: Tuvalo\n    es: Tuvalu\n    fa: تووالو\n    ff: Tuwaluu\n    fi: Tuvalu\n    fr: Tuvalu\n    fy: Tûvalû\n    ga: Tuvalu\n    gd: Tubhalu\n    gu: તુવાલુ\n    gv: Tuvalu\n    ha: Tubalu\n    he: טובלו\n    hi: तुवालु\n    hr: Tuvalu\n    hu: Tuvalu\n    hy: Տուվալու\n    is: Túvalú\n    ja: ツバル\n    ka: ტუვალუ\n    km: ទូវ៉ាលូ\n    kn: ಟುವಾಲು\n    ko: 투발루\n    ks: توٗوالوٗ\n    ku: Tûvalû\n    lo: ຕູວາລູ\n    lt: Tuvalu\n    lv: Tuvalu\n    mg: Tovalò\n    mk: Тувалу\n    ml: തുവാലു\n    mn: Тувалу\n    mr: टुवालु\n    ne: तुभालु\n    \"no\": Tuvalu\n    oc: Tuvalu\n    or: ଟୁଭାଲୁ\n    pl: Tuvalu\n    pt: Tuvalu\n    ru: Тувалу\n    se: Tuvalu\n    sg: Tüvalü\n    si: ටුවාලූ\n    sk: Tuvalu\n    sr: Тувалу\n    sv: Tuvalu\n    ta: துவாலூ\n    te: టువాలు\n    th: ประเทศตูวาลู\n    ti: ቱቫሉ\n    to: Tūvalu\n    uk: Тувалу\n    ur: ٹووالو\n    vo: Tuvaluäns\n    yo: Orílẹ́ède Tufalu\n    zh: 吐瓦鲁\n    zu: i-Tuvalu\n"
  },
  {
    "path": "settings/country-names/tw.yaml",
    "content": "name: \n    default: 臺灣\n    af: Taiwan\n    ak: Taiwan\n    am: ታይዋን\n    an: Taiwán\n    ar: تايوان\n    as: টাইৱান\n    az: Tayvan\n    be: Тайв́ань\n    bg: Тайван\n    bh: ताइवान\n    bm: Tayiwani\n    bn: তাইওয়ান\n    bo: ཐེ་ཝན\n    br: Taiwan\n    bs: Tajvan\n    ca: Taiwan\n    ce: Тайвань\n    cs: Tchaj-wan\n    cv: Тайва́нь\n    cy: Taiwan\n    da: Taiwan\n    de: Taiwan\n    dv: ޖުމްހޫރީ ޗައިނާ\n    dz: ཏའི་ཝཱན་\n    ee: Taiwan\n    el: Ταϊβάν\n    en: Taiwan\n    eo: Tajvano\n    es: Taiwán\n    et: Taiwan\n    eu: Taiwan\n    fa: تایوان\n    ff: Taywaan\n    fi: Taiwan\n    fo: Teivan\n    fr: Taïwan\n    fy: Taiwan\n    ga: an Téaváin\n    gd: Taidh-Bhàn\n    gl: Taiwán\n    gu: તાઇવાન\n    gv: yn Taiwaan\n    he: טאיוואן\n    hi: ताइवान\n    hr: Tajvan\n    ht: Taywann\n    hu: Tajvan\n    hy: Թայվան\n    ia: Taiwan\n    id: Taiwan\n    ie: Taiwan\n    io: Taiwan\n    is: Taívan\n    it: Taiwan\n    ja: 台湾\n    jv: Taiwan\n    ka: ტაივანი\n    ki: Taiwani\n    kk: Тайвань\n    kl: Taiwan\n    km: តៃវ៉ាន់\n    kn: ಟೈವಾನ್\n    ko: 타이완\n    ku: Taywan\n    kw: Taywan\n    ky: Тайвань\n    la: Taivania\n    lb: Taiwan\n    lg: Tayiwani\n    li: Taiwan\n    ln: Taiwan\n    lo: ໄຕ້ຫວັນ\n    lt: Taivanas\n    lv: Taivāna\n    mg: Taiwan\n    mi: Taiwana\n    mk: Тајван\n    ml: തായ്വാൻ\n    mn: Тайвань\n    mr: तैवान\n    ms: Taiwan\n    mt: Tajwan\n    my: ထိုင်ဝမ်\n    ne: ताइवान\n    nl: Taiwan\n    \"no\": Taiwan\n    oc: Taiwan\n    or: ତାଇୱାନ\n    os: Тайван\n    pa: ਤਾਈਵਾਨ\n    pi: तैवान\n    pl: Tajwan\n    ps: تایوان\n    pt: Taiwan\n    qu: Taiwán\n    rm: Taiwan\n    rn: Tayiwani\n    ro: Taiwan\n    ru: Тайвань\n    rw: Tayiwani\n    sa: तैवान\n    se: Taiwan\n    sg: Tâiwâni\n    sh: Tajvan\n    si: තායිවානය\n    sk: Taiwan\n    sl: Tajvan\n    sn: Taiwan\n    so: Taywan\n    sq: Tajvani\n    sr: Тајван\n    ss: iThayiwani\n    su: Tiongkok\n    sv: Taiwan\n    sw: Taiwan\n    te: తైవాన్\n    tg: Тайва́н\n    th: ไต้หวัน\n    tk: Taýwan\n    tl: Taiwan\n    to: Taiuani\n    tr: Tayvan\n    tt: Тайва́нь\n    ug: تەيۋەن\n    uk: Тайва́нь\n    ur: تائیوان\n    uz: Tayvan\n    vi: Đài Loan\n    vo: Tayvän\n    wo: Taaywaan\n    yi: טייוואַן\n    yo: Taiwan\n    za: Daizvanh\n    zh: 臺灣\n    zu: i-Taiwan\n"
  },
  {
    "path": "settings/country-names/tz.yaml",
    "content": "name: \n    default: Tanzania\n    af: Tanzanië\n    ak: Tanzania\n    am: ታንዛኒያ\n    an: Tanzania\n    ar: تنزانيا\n    az: Tanzaniya\n    ba: Танзания\n    be: Танзанія\n    bg: Танзания\n    bm: Tanzania\n    bn: তানজানিয়া\n    bo: ཏན་ཛ་ནི་ཡ།\n    br: Tanzania\n    bs: Tanzanija\n    ca: Tanzània\n    ce: Танзани\n    cs: Tanzanie\n    cv: Танзани\n    cy: Tanzania\n    da: Tanzania\n    de: Tansania\n    dv: ޓެންޒޭނިއާ\n    ee: Tanzania\n    el: Τανζανία\n    en: Tanzania\n    eo: Tanzanio\n    es: Tanzania\n    et: Tansaania\n    eu: Tanzania\n    fa: تانزانیا\n    fi: Tansania\n    fo: Tansania\n    fr: Tanzanie\n    fy: Tanzania\n    ga: An Tansáin\n    gd: Tansainìa\n    gl: Tanzania\n    gu: ટાન્ઝાનિયા\n    gv: Tanzania\n    he: טנזניה\n    hi: तंज़ानिया\n    hr: Tanzanija\n    ht: Tanzani\n    hu: Tanzánia\n    hy: Տանզանիա\n    ia: Tanzania\n    id: Tanzania\n    ie: Tanzania\n    io: Tanzania\n    is: Tansanía\n    it: Tanzania\n    ja: タンザニア\n    jv: Tanzania\n    ka: ტანზანია\n    kg: Tanzania\n    ki: Tanzania\n    kk: Танзания\n    kl: Tanzania\n    kn: ಟಾಂಜಾನಿಯ\n    ko: 탄자니아\n    ku: Tanzanya\n    kw: Tanzania\n    la: Tanzania\n    lb: Tansania\n    li: Tanzania\n    ln: Tanzania\n    lt: Tanzanija\n    lv: Tanzānija\n    mg: Tanzania\n    mi: Tānahia\n    mk: Танзанија\n    ml: ടാൻസാനിയ\n    mn: Танзани\n    mr: टांझानिया\n    ms: Tanzania\n    mt: Tanżanija\n    my: တန်ဇေးနီးယားနိုင်ငံ\n    ne: तन्जानिया\n    nl: Tanzania\n    \"no\": Tanzania\n    nv: Tʼanzanííya\n    ny: Tanzania\n    oc: Tanzania\n    om: Tanzania\n    or: ତାଞ୍ଜାନିଆ\n    os: Танзани\n    pa: ਤਨਜ਼ਾਨੀਆ\n    pl: Tanzania\n    pt: Tanzânia\n    qu: Tansanya\n    rm: Tansania\n    rn: Tanzaniya\n    ro: Tanzania\n    ru: Танзания\n    rw: Tanzaniya\n    sa: टंजानिया\n    sc: Tanzània\n    se: Tanzania\n    sg: Tanzanïi\n    sh: Tanzanija\n    sk: Tanzánia\n    sl: Tanzanija\n    sn: Tanzania\n    so: Tansaaniya\n    sq: Tanzania\n    sr: Танзанија\n    ss: IThanzaniya\n    st: Tanzania\n    su: Tanzania\n    sv: Tanzania\n    sw: Tanzania\n    ta: தன்சானியா\n    te: టాంజానియా\n    tg: Танзания\n    th: ประเทศแทนซาเนีย\n    ti: ታንዛኒያ\n    tk: Tanzaniýa\n    tl: Tanzania\n    tr: Tanzanya\n    ts: Tanzania\n    tt: Танзания\n    tw: Tanzania\n    ug: تانزانىيە\n    uk: Танзанія\n    ur: تنزانیہ\n    uz: Tanzaniya\n    vi: Tanzania\n    vo: Tansanän\n    wo: Tansani\n    yi: טאנזאניע\n    yo: Tànsáníà\n    zh: 坦桑尼亚\n    zu: ITanzania\n"
  },
  {
    "path": "settings/country-names/ua.yaml",
    "content": "name: \n    default: Україна\n    ab: Украина\n    af: Oekraïne\n    am: ዩክሬን\n    an: Ucraína\n    ar: أوكرانيا\n    az: Ukrayna\n    ba: Украина\n    be: Украіна\n    bg: Украйна\n    bi: Ukraine\n    bn: ইউক্রেন\n    bo: ཨུཀ་རཡི་ནི།\n    br: Ukraina\n    bs: Ukrajina\n    ca: Ucraïna\n    ce: Украина\n    cs: Ukrajina\n    cu: Оукраина\n    cv: Украина\n    cy: Wcráin\n    da: Ukraine\n    de: Ukraine\n    dv: ޔުކްރެއިން\n    ee: Ukraine\n    el: Ουκρανία\n    en: Ukraine\n    eo: Ukrainio\n    es: Ucrania\n    et: Ukraina\n    eu: Ukraina\n    fa: اوکراین\n    fi: Ukraina\n    fo: Ukraina\n    fr: Ukraine\n    fy: Oekraïne\n    ga: An Úcráin\n    gd: An Ucràin\n    gl: Ucraína\n    gn: Ukyaña\n    gu: યુક્રેન\n    gv: Yn Ookraan\n    he: אוקראינה\n    hi: युक्रेन\n    hr: Ukrajina\n    ht: Ikrèn\n    hu: Ukrajna\n    hy: Ուկրաինա\n    ia: Ukraina\n    id: Ukraina\n    ie: Ucraina\n    ig: Yukrain\n    io: Ukrainia\n    is: Úkraína\n    it: Ucraina\n    ja: ウクライナ\n    jv: Ukraina\n    ka: უკრაინა\n    kg: Ukrayina\n    kk: Украина\n    kl: Ukraine\n    km: អ៊ុយក្រែន\n    kn: ಯುಕ್ರೇನ್\n    ko: 우크라이나\n    ku: Ûkrayna\n    kv: Украина\n    kw: Ukrayn\n    ky: Украина\n    la: Ucraina\n    lb: Ukrain\n    li: Oekraïne\n    ln: Ukraine\n    lt: Ukraina\n    lv: Ukraina\n    mg: Okraina\n    mi: Ūkareinga\n    mk: Украина\n    ml: ഉക്രൈൻ\n    mn: Украйн\n    mr: युक्रेन\n    ms: Ukraine\n    mt: Ukrajna\n    my: ယူကရိန်းနိုင်ငံ\n    na: Ukraine\n    ne: युक्रेन\n    nl: Oekraïne\n    \"no\": Ukraina\n    nv: Yóókwein\n    oc: Ucraïna\n    or: ୟୁକ୍ରେନ\n    os: Украинæ\n    pa: ਯੂਕ੍ਰੇਨ\n    pl: Ukraina\n    ps: اوکراین\n    pt: Ucrânia\n    qu: Ukranya\n    rm: Ucraina\n    ro: Ucraina\n    ru: Украина\n    rw: Ikerene\n    sc: Ucraina\n    se: Ukraina\n    sh: Ukrajina\n    sk: Ukrajina\n    sl: Ukrajina\n    sm: Ukraine\n    sn: Ukraine\n    so: Ukrain\n    sq: Ukraina\n    sr: Украјина\n    ss: IYukhureni\n    su: Ukraina\n    sv: Ukraina\n    sw: Ukraine\n    ta: உக்ரைன்\n    te: ఉక్రెయిన్\n    tg: Украйина\n    th: ประเทศยูเครน\n    tk: Ukraina\n    tl: Ukranya\n    tr: Ukrayna\n    ts: Ukraine\n    tt: Украина\n    tw: Ukraine\n    ug: ئۇكرائىنا\n    uk: Україна\n    ur: یوکرین\n    uz: Ukraina\n    vi: Ukraina\n    vo: Lukrayän\n    wa: Oucrinne\n    wo: Ukreen\n    yi: אוקראינע\n    yo: Ukréìn\n    zh: 乌克兰/烏克蘭\n"
  },
  {
    "path": "settings/country-names/ug.yaml",
    "content": "name: \n    default: Uganda\n    af: Uganda\n    am: ዩጋንዳ\n    an: Uganda\n    ar: أوغندا\n    az: Uqanda\n    ba: Уганда\n    be: Уганда\n    bg: Уганда\n    bm: Uganda\n    bn: উগান্ডা\n    bo: ཨུ་གན་ད།\n    br: Ouganda\n    bs: Uganda\n    ca: Uganda\n    ce: Уганда\n    cs: Uganda\n    cv: Уганда\n    cy: Uganda\n    da: Uganda\n    de: Uganda\n    dv: ޔުގެންޑާ\n    ee: Uganda\n    el: Ουγκάντα\n    en: Uganda\n    eo: Ugando\n    es: Uganda\n    et: Uganda\n    eu: Uganda\n    fa: اوگاندا\n    fi: Uganda\n    fo: Uganda\n    fr: Ouganda\n    fy: Uganda\n    ga: Uganda\n    gd: Uganda\n    gl: Uganda\n    gv: Ooganda\n    ha: Uganda\n    he: אוגנדה\n    hi: युगाण्डा\n    hr: Uganda\n    ht: Ouganda\n    hu: Uganda\n    hy: Ուգանդա\n    ia: Uganda\n    id: Uganda\n    ie: Uganda\n    io: Uganda\n    is: Úganda\n    it: Uganda\n    ja: ウガンダ\n    jv: Uganda\n    ka: უგანდა\n    kg: Uganda\n    ki: Uganda\n    kk: Уганда\n    kl: Uganda\n    kn: ಉಗಾಂಡ\n    ko: 우간다\n    ku: Ûganda\n    kw: Ouganda\n    la: Uganda\n    lb: Uganda\n    lg: Yuganda\n    li: Oeganda\n    ln: Uganda\n    lt: Uganda\n    lv: Uganda\n    mi: Ukānga\n    mk: Уганда\n    ml: ഉഗാണ്ട\n    mn: Уганда\n    mr: युगांडा\n    ms: Uganda\n    mt: Uganda\n    my: ယူဂန်းဒါးနိုင်ငံ\n    nl: Oeganda\n    \"no\": Uganda\n    nv: Yogénda\n    oc: Oganda\n    or: ଉଗାଣ୍ଡା\n    os: Угандæ\n    pa: ਯੁਗਾਂਡਾ\n    pl: Uganda\n    pt: Uganda\n    qu: Uganda\n    rm: Uganda\n    ro: Uganda\n    ru: Уганда\n    rw: Ubugande\n    sc: Uganda\n    se: Uganda\n    sg: Ugandäa\n    sh: Uganda\n    sk: Uganda\n    sl: Uganda\n    sn: Uganda\n    so: Yugandha\n    sq: Uganda\n    sr: Уганда\n    ss: IBuganda\n    su: Uganda\n    sv: Uganda\n    sw: Uganda\n    ta: உகாண்டா\n    te: ఉగాండా\n    tg: Уганда\n    th: ประเทศยูกันดา\n    tk: Uganda\n    tl: Uganda\n    tr: Uganda\n    ts: Uganda\n    tt: Уганда\n    ug: ئۇگاندا\n    uk: Уганда\n    ur: یوگنڈا\n    uz: Uganda\n    vi: Uganda\n    vo: Lugandayän\n    wo: Ugandaa\n    yi: אוגאנדע\n    yo: Ùgándà\n    zh: 乌干达\n    zu: IYuganda\n"
  },
  {
    "path": "settings/country-names/us.yaml",
    "content": "short_name:\n    default: USA\nname:\n    default: United States\n    ab: Америка Еиду Аштатқәа\n    af: Verenigde State van Amerika\n    am: የተባበሩት የአሜሪካ ግዛቶች\n    an: Estatos Unitos d'America\n    ar: الولايات المتّحدة الأمريكيّة\n    as: মাৰ্কিন যুক্তৰাষ্ট্ৰ\n    av: Америкалъул Цолъарал Штатал\n    ay: Istadus Unidus\n    az: Amerika Birləşmiş Ştatları\n    ba: Америка Ҡушма Штаттары\n    be: Злучаныя Штаты Амерыкі\n    bg: Съединени американски щати\n    bi: Yunaeted Stet blong Amerika\n    bm: Amerika ka Kelenyalen Jamanaw\n    bn: মার্কিন যুক্তরাষ্ট্র\n    bo: ཨ་མེ་རི་ཁ་རྒྱལ་ཕྲན་མཉམ་འབྲེལ་རྒྱལ་ཁབ།\n    br: Stadoù-Unanet Amerika\n    bs: Sjedinjene Američke Države\n    ca: Estats Units d'Amèrica\n    ce: Iамерка пачхьалк\n    co: Stati Uniti d'America\n    cs: Spojené státy americké\n    cu: Амєрика́ньскꙑ Ѥдьнѥнꙑ́ Дрьжа́вꙑ\n    cv: Америкăри Пĕрлешӳллĕ Штатсем\n    cy: Unol Daleithiau America\n    da: Amerikas Forenede Stater\n    de: Vereinigte Staaten von Amerika\n    dv: އެމެރިކާ\n    dz: ཡུ་ནའིཊེཊ་སི་ཊེས\n    ee: United States\n    el: Ηνωμένες Πολιτείες της Αμερικής\n    en: United States\n    eo: Usono\n    es: Estados Unidos de América\n    et: Ameerika Ühendriigid\n    eu: Ameriketako Estatu Batuak\n    fa: ایالات متحده آمریکا\n    ff: Dowlaaji Dentuɗi\n    fi: Amerikan yhdysvallat\n    fo: Sambandsríkið Amerika\n    fr: États-Unis d'Amérique\n    fy: Feriene Steaten fan Amearika\n    ga: Stáit Aontaithe Mheiriceá\n    gd: Na Stàitean Aonaichte\n    gl: Estados Unidos de América\n    gn: Tetã peteĩ reko Amérikagua\n    gu: સંયુક્ત રાજ્ય અમેરિકા\n    gv: Steatyn Unnaneysit America\n    ha: kunkiyar taraiyar Amurika\n    he: ארצות הברית\n    hi: संयुक्त राज्य अमेरिका\n    hr: Sjedinjene Američke Države\n    ht: Etazini\n    hu: Amerikai Egyesült Államok\n    hy: Ամերիկայի Միացյալ Նահանգներ\n    ia: Statos Unite de America\n    id: Amerika Serikat\n    ie: Unit States de America\n    ig: Njikota Obodo Amerika\n    ik: United States of America\n    io: Unionita Stati di Amerika\n    is: Bandaríki Norður-Ameríku\n    it: Stati Uniti d'America\n    iu: ᐊᒥᐊᓕᑲ\n    ja: アメリカ合衆国\n    jv: Amérika Sarékat\n    ka: ამერიკის შეერთებული შტატები\n    ki: United States\n    kk: Америка Құрама Штаттары\n    kl: Naalagaaffeqatigiit\n    km: សហរដ្ឋអាមេរិក\n    kn: ಅಮೇರಿಕ ಸಂಯುಕ್ತ ಸಂಸ್ಥಾನ\n    ko: 미국\n    ks: संयुक्त राज्य अमेरिका\n    ku: Dewletên Yekbûyî yên Amerîkayê\n    kv: Америкаса Ӧтувтӧм Штатъяс\n    kw: Statys Unys Amerika\n    ky: Америка Кошмо Штаттары\n    la: Civitates Foederatae Americae\n    lb: Vereenegt Staate vun Amerika\n    lg: Amereka\n    li: Vereinegde State van Amerika\n    ln: Lisangá lya Ameríka\n    lo: ສະຫະລັດອາເມລິກາ\n    lt: Jungtinės Amerikos Valstijos\n    lv: Amerikas Savienotās Valstis\n    mg: Etazonia\n    mi: Amerika\n    mk: Соединети Американски Држави\n    ml: അമേരിക്കന് ഐക്യനാടുകള്\n    mn: Америкийн Нэгдсэн Улс\n    mo: Стателе Уните але Америчий\n    mr: अमेरिकेची संयुक्त संस्थाने\n    ms: Amerika Syarikat\n    mt: Stati Uniti tal-Amerika\n    my: အမေရိကန်ပြည်ထောင်စု\n    na: Eben Merika\n    nb: USA\n    ne: संयुक्त राज्य अमेरिका\n    nl: Verenigde Staten\n    nn: USA\n    \"no\": Amerikas forente stater\n    nv: Wááshindoon Bikéyah Ałhidadiidzooígíí\n    oc: Estats Units d'America\n    om: USA\n    or: ଯୁକ୍ତରାଷ୍ଟ୍ର ଆମେରିକା\n    os: Америкæйы Иугонд Штаттæ\n    pa: ਸੰਯੁਕਤ ਰਾਜ ਅਮਰੀਕਾ\n    pl: Stany Zjednoczone\n    ps: د امريکا متحده ايالات\n    pt: Estados Unidos da América\n    qu: Hukllachasqa Amirika Suyukuna\n    rm: Stadis Unids da l'America\n    rn: Leta Zunze Ubumwe za Amerika\n    ro: Statele Unite ale Americii\n    ru: Соединённые Штаты Америки\n    rw: Leta Zunze Ubumwe z’Amerika\n    sa: संयुक्तानि राज्यानि\n    sc: Istados Unidos de America\n    sd: آمريڪا\n    se: Amerihká ovttastuvvan stáhtat\n    sg: ÂKödörö-ôko tî Amerîka\n    sh: Sjedinjene Američke Države\n    si: අ'මෙරිකාවේ එක්සත් රාජ්යයන්\n    sk: Spojené štáty americké\n    sl: Združene države Amerike\n    sm: Iunaite Sitete o Amerika\n    sn: United States of America\n    so: Mareykanka\n    sq: Shtetet e Bashkuara të Amerikës\n    sr: Сједињене Америчке Државе\n    ss: IMelika\n    su: Amérika Sarikat\n    sv: Amerikas Förenta Stater\n    sw: Muungano wa Madola ya Amerika\n    ta: அமெரிக்க ஐக்கிய நாடு\n    te: అమెరికా సంయుక్త రాష్ట్రాలు\n    tg: Иёлоти Муттаҳидаи Амрико\n    th: สหรัฐอเมริกา\n    tk: Amerikanyň Birleşen Ştatlary\n    tl: Estados Unidos\n    tn: USA\n    to: Puleʻanga Fakataha 'o 'Amelika\n    tr: Amerika Birleşik Devletleri\n    ts: United States\n    tt: Америка Кушма Штатлары\n    tw: USA\n    ty: Fenua Marite\n    ug: ئامېرىكا قوشما شتاتلىرى\n    uk: Сполучені Штати Америки\n    ur: ریاستہائے متحدہ امریکہ\n    uz: Amerika Qoʻshma Shtatlari\n    vi: Hoa Kỳ\n    vo: Lamerikän\n    wa: Estats Unis d' Amerike\n    wo: Diwaan-yu-Bennoo yu Aamerig\n    xh: IYunayithedi Steyitsi\n    yi: פאראייניקטע שטאטן פון אמעריקע\n    yo: Àwọn Ìpínlẹ̀ Aṣọ̀kan Amẹ́ríkà\n    za: Meijgoz\n    zh: 美利坚合众国/美利堅合眾國\n    zu: IMelika\n"
  },
  {
    "path": "settings/country-names/uy.yaml",
    "content": "name: \n    default: Uruguay\n    af: Uruguay\n    ak: Yurugwae\n    am: ኡራጓይ\n    an: Uruguai\n    ar: أوروغواي\n    ay: Uruwayi\n    az: Uruqvay\n    ba: Уругвай\n    be: Уругвай\n    bg: Уругвай\n    bi: Uruguay\n    bm: Urugwayi\n    bn: উরুগুয়ে\n    bo: ཨུ་རུ་གུ་ཡེ།\n    br: Uruguay\n    bs: Urugvaj\n    ca: Uruguai\n    ce: Уругвай\n    co: Uruguay\n    cs: Uruguay\n    cu: Оуроугваи\n    cv: Уругвай\n    cy: Uruguay\n    da: Uruguay\n    de: Uruguay\n    dv: އުރުގުއޭ\n    dz: ཡུ་རུ་གུ་ཝའི\n    ee: uruguaydukɔ\n    el: Ουρουγουάη\n    en: Uruguay\n    eo: Urugvajo\n    es: Uruguay\n    et: Uruguay\n    eu: Uruguai\n    fa: اروگوئه\n    ff: Uruguwaay\n    fi: Uruguay\n    fo: Uruguei\n    fr: Uruguay\n    fy: Urûguay\n    ga: Uragua\n    gd: Uruguaidh\n    gl: Uruguai\n    gn: Uruguái\n    gu: ઉરુગ્વે\n    gv: Yn Ooraguay\n    ha: Yurugai\n    he: אורוגוואי\n    hi: उरुग्वे\n    hr: Urugvaj\n    ht: Irigwe\n    hu: Uruguay\n    hy: Ուրուգվայ\n    ia: Uruguay\n    id: Uruguay\n    ie: Uruguay\n    io: Uruguay\n    is: Úrúgvæ\n    it: Uruguay\n    ja: ウルグアイ\n    jv: Uruguay\n    ka: ურუგვაი\n    ki: Urugwai\n    kk: Уругвай\n    kl: Uruguay\n    km: អ៊ុយរុយហ្គាយ\n    kn: ಉರುಗ್ವೆ\n    ko: 우루과이\n    ks: یوٗروگے\n    ku: Ûrûguay\n    kw: Urugway\n    la: Uraquaria\n    lb: Uruguay\n    lg: Wurugwayi\n    li: Urugay\n    ln: Ulugwai\n    lo: ອຸລຸກວຍ\n    lt: Urugvajus\n    lv: Urugvaja\n    mg: Orogoay\n    mi: Urukoi\n    mk: Уругвај\n    ml: ഉറുഗ്വേ\n    mn: Уругвай\n    mr: उरुग्वे\n    ms: Uruguay\n    mt: Urugwaj\n    my: ဥရုဂွေးနိုင်ငံ\n    ne: उरुग्वाइ\n    nl: Uruguay\n    \"no\": Uruguay\n    nv: Táłtłʼááh Chʼosh Bitooh (Kéyah Dah Siʼánígíí)\n    oc: Uruguai\n    or: ଉରୁଗୁଏ\n    os: Уругвай\n    pa: ਉਰੂਗੁਏ\n    pl: Urugwaj\n    ps: یوروګوای\n    pt: Uruguai\n    qu: Uruwayi\n    rm: Uruguay\n    rn: Irigwe\n    ro: Uruguay\n    ru: Уругвай\n    rw: Irigwe\n    sa: उरुग्वाय\n    sc: Uruguay\n    se: Uruguay\n    sg: Uruguëe\n    sh: Urugvaj\n    si: උරුගුවායි\n    sk: Uruguaj\n    sl: Urugvaj\n    so: Uruguwaay\n    sq: Uruguaji\n    sr: Уругвај\n    su: Uruguay\n    sv: Uruguay\n    sw: Urugwai\n    ta: உருகுவை\n    te: ఉరుగువే\n    tg: Уругуай\n    th: ประเทศอุรุกวัย\n    ti: ኡራጓይ\n    tl: Urugway\n    to: ʻUlukuei\n    tr: Uruguay\n    tt: Уругвай\n    ug: ئۇرۇگۋاي\n    uk: Уругвай\n    ur: یوراگوئے\n    uz: Urugvay\n    vi: Uruguay\n    vo: Luruguyän\n    wa: Ourougway\n    wo: Uruguwaay\n    yi: אורוגוויי\n    yo: Urugúáì\n    zh: 乌拉圭\n    zu: i-Uruguay\n"
  },
  {
    "path": "settings/country-names/uz.yaml",
    "content": "name: \n    default: Oʻzbekiston\n    af: Oesbekistan\n    am: ኡዝቤኪስታን\n    an: Uzbekistán\n    ar: أوزبكستان\n    az: Özbəkistan\n    ba: Үзбәкстан\n    be: Узбекістан\n    bg: Узбекистан\n    bn: উজবেকিস্তান\n    bo: ཨུ་ཟ་བྷེ་ཁི་སི་ཐན།\n    br: Ouzbekistan\n    bs: Uzbekistan\n    ca: Uzbekistan\n    ce: Узбекистан\n    cs: Uzbekistán\n    cv: Ӳспекстан\n    cy: Uzbekistan\n    da: Usbekistan\n    de: Usbekistan\n    dv: އުޒްބެކިސްތާން\n    dz: ཨུཛ་བེ་ཀིསི་ཏཱན་\n    ee: Uzbekistan\n    el: Ουζμπεκιστάν\n    en: Uzbekistan\n    eo: Uzbekio\n    es: Uzbekistán\n    et: Usbekistan\n    eu: Uzbekistan\n    fa: ازبکستان\n    fi: Uzbekistan\n    fo: Usbekistan\n    fr: Ouzbékistan\n    fy: Oezbekistan\n    ga: An Úisbéiceastáin\n    gd: Usbagastàn\n    gl: Uzbequistán\n    gu: ઉઝબેકિસ્તાન\n    gv: Yn Oosbeckistaan\n    he: אוזבקיסטן\n    hi: उज़्बेकिस्तान\n    hr: Uzbekistan\n    ht: Ouzbekistan\n    hu: Üzbegisztán\n    hy: Ուզբեկստան\n    ia: Uzbekistan\n    id: Uzbekistan\n    ie: Uzbekistan\n    io: Uzbekistan\n    is: Úsbekistan\n    it: Uzbekistan\n    ja: ウズベキスタン\n    jv: Uzbekistan\n    ka: უზბეკეთი\n    kk: Өзбекстан\n    kn: ಉಜ್ಬೇಕಿಸ್ಥಾನ್\n    ko: 우즈베키스탄\n    ku: Ûzbêkistan\n    kv: Узбекистан\n    kw: Pow Ousbek\n    ky: Өзбекстан\n    la: Uzbecia\n    lb: Usbekistan\n    li: Oesbekistan\n    ln: Uzbekistáni\n    lt: Uzbekija\n    lv: Uzbekistāna\n    mk: Узбекистан\n    ml: ഉസ്ബെക്കിസ്ഥാൻ\n    mn: Узбекистан\n    mr: उझबेकिस्तान\n    ms: Uzbekistan\n    my: ဥဇဘက်ကစ္စတန်နိုင်ငံ\n    na: Uzbekistan\n    nl: Oezbekistan\n    \"no\": Usbekistan\n    nv: Ózbeʼ Bikéyah\n    oc: Ozbequistan\n    or: ଉଜବେକିସ୍ଥାନ\n    os: Узбекистан\n    pa: ਉਜ਼ਬੇਕਿਸਤਾਨ\n    pl: Uzbekistan\n    ps: اوزبکستان\n    pt: Uzbequistão\n    qu: Usbiksuyu\n    ro: Uzbekistan\n    ru: Узбекистан\n    rw: Uzubekisitani\n    sa: उजबेकिस्थान\n    sd: ازبڪستان\n    se: Uzbekistan\n    sh: Uzbekistan\n    sk: Uzbekistan\n    sl: Uzbekistan\n    so: Usbekistan\n    sq: Uzbekistani\n    sr: Узбекистан\n    ss: IZubekhi\n    su: Uzbékistan\n    sv: Uzbekistan\n    sw: Uzbekistan\n    ta: உசுபெக்கிசுத்தான்\n    te: ఉజ్బెకిస్తాన్\n    tg: Ӯзбакистон\n    th: ประเทศอุซเบกิสถาน\n    tk: Özbegistan\n    tl: Uzbekistan\n    tr: Özbekistan\n    tt: Үзбәкстан\n    ug: ئۆزبېكىستان\n    uk: Узбекистан\n    ur: ازبکستان\n    uz: Oʻzbekiston\n    vi: Uzbekistan\n    vo: Lusbekän\n    wo: Usbekistaan\n    yi: אוזבעקיסטאן\n    yo: Ùsbẹ̀kìstán\n    zh: 乌兹别克斯坦\n"
  },
  {
    "path": "settings/country-names/va.yaml",
    "content": "name: \n    default: Civitas Vaticana\n    af: Vatikaanstad\n    am: ቫቲካን ከተማ\n    an: Ciudat d'o Vaticano\n    ar: الفاتيكان\n    az: Vatikan\n    ba: Ватикан\n    be: Ватыкан\n    bg: Ватикан\n    bi: Vatican Siti\n    bn: ভ্যাটিকান সিটি\n    bo: ཝ་ཏི་ཀན་གྲོང་ཁྱོར།\n    br: Keoded ar Vatikan\n    bs: Vatikan\n    ca: Ciutat del Vaticà\n    ce: Ватикан\n    co: Cità di u Vaticanu\n    cs: Vatikán\n    cu: Ватиканъ\n    cv: Ватикан\n    cy: Y Fatican\n    da: Vatikanstaten\n    de: Staat Vatikanstadt\n    dv: ވެޓިކަން ސިޓީ\n    dz: བ་ཊི་ཀཱན།\n    ee: Vatican City\n    el: Βατικανό\n    en: Vatican City\n    eo: Vatikano\n    es: Ciudad del Vaticano\n    et: Vatikan\n    eu: Vatikano Hiria\n    fa: واتیکان\n    fi: Vatikaanivaltio\n    fo: Vatikanið\n    fr: Cité du Vatican\n    fy: Fatikaanstêd\n    ga: Cathair na Vatacáine\n    gd: Cathair na Bhatacain\n    gl: Cidade do Vaticano\n    gn: Táva Vatikano\n    gv: Ard-valley yn Phaab\n    he: קריית הוותיקן\n    hi: वैटिकन सिटी\n    hr: Vatikan\n    ht: Vatikan\n    hu: Vatikán\n    hy: Վատիկան\n    ia: Citate Vatican\n    id: Vatikan\n    ie: Vaticano\n    io: Vatikano\n    is: Vatíkanið\n    it: Città del Vaticano\n    ja: バチカン\n    jv: Vatikan\n    ka: ვატიკანი\n    kg: Vatican\n    kk: Ватикан\n    kl: Vatikani\n    km: បុរីវ៉ាទីកង់\n    kn: ವ್ಯಾಟಿಕನ್ ನಗರ\n    ko: 바티칸 시국\n    ku: Vatîkan\n    kv: Ватикан\n    kw: Cita Vatikan\n    ky: Ватикан\n    la: Status Civitatis Vaticanæ\n    lb: Vatikanstad\n    li: Vaticaanstad\n    ln: Vatikáni\n    lt: Vatikanas\n    lv: Vatikāns\n    mi: Poho o Pita\n    mk: Ватикан\n    ml: വത്തിക്കാൻ നഗരം\n    mn: Ватикан\n    mr: व्हॅटिकन सिटी\n    ms: Kota Vatican\n    mt: Belt tal-Vatikan\n    my: ဗာတီကန်စီးတီး\n    na: Batikan\n    ne: भ्याटिकन सिटी\n    nl: Vaticaanstad\n    \"no\": Vatikanstaten\n    nv: Bádikin Sídii\n    oc: Vatican\n    or: ଭାଟିକାନ ସିଟି\n    os: Ватикан\n    pa: ਵੈਟੀਕਨ ਸ਼ਹਿਰ\n    pl: Watykan\n    ps: واټيکان ښار\n    pt: Vaticano\n    qu: Watikanu llaqta\n    rm: Citad dal Vatican\n    ro: Vatican\n    ru: Ватикан\n    rw: Vatikani\n    sa: वैटिकन\n    sc: Tzitade de su Vaticanu\n    se: Vatikána\n    sh: Vatikan\n    si: වතිකානුව\n    sk: Vatikán\n    sl: Vatikan\n    so: Faatikan\n    sq: Vatikani\n    sr: Ватикан\n    ss: IVathikhi\n    su: Vatikan\n    sv: Vatikanstaten\n    sw: Vatikani\n    ta: வத்திக்கான் நகர்\n    te: వాటికన్ నగరం\n    tg: Вотикон\n    th: นครรัฐวาติกัน\n    tk: Watikan\n    tl: Lungsod ng Vaticano\n    tr: Vatikan\n    tt: Ватикан\n    ug: Watikan Shehiri\n    uk: Ватикан\n    ur: ویٹیکن سٹی\n    uz: Vatikan shahri\n    vi: Thành Vatican\n    vo: Vatikän\n    wo: Watikaa\n    yi: וואטיקאן\n    yo: Ìlú Fatikan\n    zh: 梵蒂冈\n    zu: Indolobha yaseVathikhani\n"
  },
  {
    "path": "settings/country-names/vc.yaml",
    "content": "name: \n    default: Saint Vincent and the Grenadines\n    af: Sint Vincent en die Grenadines\n    ar: سانت فنسنت وجزر غرينادين\n    be: Святы Вінцэнт і Грэнадзіны\n    br: Sant-Visant hag ar Grenadinez\n    ca: Saint Vincent i les Grenadines\n    cs: Svatý Vincent a Grenadiny\n    cy: Saint Vincent a'r Grenadines\n    da: Saint Vincent og Grenadinerne\n    de: St. Vincent und die Grenadinen\n    el: Άγιος Βικέντιος και Γρεναδίνες\n    en: Saint Vincent and the Grenadines\n    eo: Sankta Vincento kaj Grenadinoj\n    es: San Vicente y las Granadinas\n    fa: سنت وینسنت و گرنادین\n    fi: Saint Vincent ja Grenadiinit\n    fr: Saint-Vincent-et-les Grenadines\n    fy: Sint Finsint en de Grenadinen\n    ga: San Uinseann agus na Greanáidíní\n    gd: Naomh Bhionsant agus Eileanan Greanadach\n    he: סנט וינסנט והגרנדינים\n    hr: Sveti Vincent i Grenadini\n    hu: Saint Vincent és a Grenadine-szigetek\n    id: Saint Vincent dan Grenadines\n    is: Sankti Vinsent og Grenadíneyjar\n    it: Saint Vincent e Grenadine\n    ja: セントビンセント及びグレナディーン諸島\n    lb: Saint Vincent an d’Grenadinen\n    li: Saint-Vincent\n    lt: Sent Vinsentas ir Grenadinai\n    mn: Сент-Винсент ба Гренадин\n    nb: Saint Vincent og Grenadinene\n    nl: Saint Vincent en de Grenadines\n    nn: Saint Vincent og Grenadinane\n    \"no\": Saint Vincent og Grenadinene\n    pl: Saint Vincent i Grenadyny\n    pt: São Vicente e Granadinas\n    ru: Сент-Винсент и Гренадины\n    se: Saint Vincent ja Grenadiinnat\n    sk: Svätý Vincent a Grenadíny\n    sl: Sveti Vincencij in Grenadine\n    sv: Saint Vincent och Grenadinerna\n    ta: செயின்ட் வின்செண்டு மற்றும் கிரெனடீன்கள்\n    th: ประเทศเซนต์วินเซนต์และเกรนาดีนส์\n    tr: Saint Vincent ve Grenadinler\n    uk: Сент-Вінсент і Гренадини\n    vi: Saint Vincent và Grenadines\n    vo: Saluda-Vinsenteän e Grenadineäns\n    zh: 圣文森特和格林纳丁斯\n"
  },
  {
    "path": "settings/country-names/ve.yaml",
    "content": "name: \n    default: Venezuela\n    af: Venezuela\n    am: ቬኔዝዌላ\n    an: Venezuela\n    ar: فنزويلا\n    av: Венесуэла\n    ay: Winïxwila\n    az: Venesuela\n    ba: Венесуэла\n    be: Венесуэла\n    bg: Венецуела\n    bi: Venezuela\n    bm: Venezuela\n    bn: ভেনেজুয়েলা\n    bo: ཝེ་ནེ་ཟུའེ་ལ།\n    br: Venezuela\n    bs: Venecuela\n    ca: Veneçuela\n    ce: Венесуэла\n    co: Venezuela\n    cs: Venezuela\n    cv: Венесуэла\n    cy: Venezuela\n    da: Venezuela\n    de: Venezuela\n    dv: ވެނެޒުއޭލާ\n    ee: Venezuela\n    el: Βενεζουέλα\n    en: Venezuela\n    eo: Venezuelo\n    es: Venezuela\n    et: Venezuela\n    eu: Venezuela\n    fa: ونزوئلا\n    fi: Venezuela\n    fo: Venesuela\n    fr: Venezuela\n    fy: Fenezuëla\n    ga: Veiniséala\n    gd: A' Bheiniseala\n    gl: Venezuela\n    gn: Venesuéla\n    gu: વેનેઝુએલા\n    gv: Yn Veneswaaley\n    he: ונצואלה\n    hi: वेनेज़ुएला\n    hr: Venezuela\n    ht: Venezwela\n    hu: Venezuela\n    hy: Վենեսուելա\n    ia: Venezuela\n    id: Venezuela\n    ie: Venezuela\n    io: Venezuela\n    is: Venesúela\n    it: Venezuela\n    ja: ベネズエラ\n    jv: Venezuela\n    ka: ვენესუელა\n    kk: Венесуэла\n    kn: ವೆನೆಜುವೆಲಾ\n    ko: 베네수엘라\n    ku: Venezuela\n    kw: Veneswela\n    la: Venetiola\n    lb: Venezuela\n    li: Venezuela\n    ln: Venezwela\n    lt: Venesuela\n    lv: Venecuēla\n    mg: Venezoela\n    mi: Wenehūera\n    mk: Венецуела\n    ml: വെനിസ്വേല\n    mn: Венесуэл\n    mr: व्हेनेझुएला\n    ms: Venezuela\n    mt: Veneżwela\n    my: ဗင်နီဇွဲလားနိုင်ငံ\n    ne: भेनेजुएला\n    nl: Venezuela\n    \"no\": Venezuela\n    nv: Táłkááʼ Bighan Dineʼé Bikéyah\n    oc: Veneçuèla\n    or: ଭେନେଜୁଏଲା\n    os: Венесуэлæ\n    pa: ਵੈਨੇਜ਼ੁਏਲਾ\n    pl: Wenezuela\n    pt: Venezuela\n    qu: Winisuyla\n    rm: Venezuela\n    rn: Venezuela\n    ro: Venezuela\n    ru: Венесуэла\n    rw: Venezuwela\n    sa: वेनेज्वेला\n    se: Venezuela\n    sh: Venezuela\n    sk: Venezuela\n    sl: Venezuela\n    sm: Venesuela\n    so: Fanansuwela\n    sq: Venezuela\n    sr: Венецуела\n    su: Vénézuéla\n    sv: Venezuela\n    sw: Venezuela\n    ta: வெனிசுவேலா\n    tg: Венесуэла\n    th: ประเทศเวเนซุเอลา\n    tk: Wenesuela\n    tl: Venezuela\n    tr: Venezuela\n    tt: Венесуэла\n    ug: ۋېنېسۇئېلا\n    uk: Венесуела\n    ur: وینیزویلا\n    uz: Venesuela\n    ve: Venezuela\n    vi: Venezuela\n    vo: Venesolän\n    wa: Venezwela\n    wo: Benesuwela\n    yi: ווענעזועלע\n    yo: Fenesuela\n    zh: 委內瑞拉\n    zu: Venezuela\n"
  },
  {
    "path": "settings/country-names/vg.yaml",
    "content": "name: \n    default: British Virgin Islands\n    af: Brits-Maagde-eilande\n    ar: جزر فيرجن البريطانية\n    be: Брытанскія Вірджынскія астравы\n    br: Inizi Gwerc’h Breizhveuriat\n    ca: Illes Verges Britàniques\n    cs: Britské Panenské ostrovy\n    da: Britiske Jomfruøer\n    de: Britische Jungferninseln\n    en: British Virgin Islands\n    eo: Britaj Virgulinsuloj\n    es: Islas Vírgenes Británicas\n    et: Briti Neitsisaared\n    eu: Birjina uharte britainiarrak\n    fa: جزایر ویرجین بریتانیا\n    fi: Brittiläiset Neitsytsaaret\n    fr: Îles Vierges britanniques\n    ga: Oileáin Bhriotanacha na Maighdean\n    he: איי הבתולה הבריטיים\n    hr: Britanski Djevičanski Otoci\n    hu: Brit Virgin-szigetek\n    id: Kepulauan Virgin Britania Raya\n    is: Bresku Jómfrúaeyjar\n    it: Isole Vergini Britanniche\n    ja: イギリス領ヴァージン諸島\n    la: Britannicae Virginis Insulae\n    lb: Britesch Joffereninselen\n    lt: Britų Mergelių salos\n    lv: Britu Virdžīnu salas\n    mk: Британски Девствени Острови\n    mn: Виржиний Арлууд, Британийн\n    nb: De britiske jomfruøyene\n    nl: Britse Maagdeneilanden\n    nn: Dei britiske Jomfruøyane\n    \"no\": De britiske jomfruøyene\n    pl: Brytyjskie Wyspy Dziewicze\n    pt: Ilhas Virgens Britânicas\n    ru: Британские Виргинские острова\n    sk: Britské Panenské ostrovy\n    sl: Britanski Deviški otoki\n    sr: Британска Девичанска Острва\n    sv: Brittiska Jungfruöarna\n    th: หมู่เกาะบริติชเวอร์จิน\n    tr: Birleşik Krallık Virgin Adaları\n    uk: Британські Віргінські острови\n    vi: Quần đảo Virgin thuộc Anh\n    zh: 英属维尔京群岛\n"
  },
  {
    "path": "settings/country-names/vn.yaml",
    "content": "name: \n    default: Việt Nam\n    af: Viëtnam\n    ak: Vietnam\n    am: ቬት ናም\n    an: Vietnam\n    ar: فيتنام\n    av: Вьетнам\n    ay: Vietnam\n    az: Vyetnam\n    ba: Вьетнам\n    be: В'етнам\n    bg: Виетнам\n    bi: Vietnam\n    bm: Vietnam\n    bn: ভিয়েতনাম\n    bo: ཝི་ཏི་ནམ།\n    br: Viêt Nam\n    bs: Vijetnam\n    ca: Vietnam\n    ce: Вьетнам\n    ch: Vietnam\n    cs: Vietnam\n    cv: Вьетнам\n    cy: Fietnam\n    da: Vietnam\n    de: Vietnam\n    dv: ވިއެޓުނާމު\n    ee: Vietnam\n    el: Βιετνάμ\n    en: Vietnam\n    eo: Vjetnamio\n    es: Vietnam\n    et: Vietnam\n    eu: Vietnam\n    fa: ویتنام\n    ff: Vietnam\n    fi: Vietnam\n    fo: Vjetnam\n    fr: Viêt Nam\n    fy: Fjetnam\n    ga: Vítneam\n    gd: Bhiet-Nam\n    gl: Vietnam\n    gn: Vietnam\n    gu: વિયેતનામ\n    gv: Yn Vietnam\n    he: וייטנאם\n    hi: वियतनाम\n    hr: Vijetnam\n    ht: Vyetnam\n    hu: Vietnám\n    hy: Վիետնամ\n    ia: Vietnam\n    id: Vietnam\n    ie: Viet-Nam\n    ik: Vietnam\n    io: Vietnam\n    is: Víetnam\n    it: Vietnam\n    ja: ベトナム\n    jv: Viètnam\n    ka: ვიეტნამი\n    kg: Vietnam\n    ki: Vietnam\n    kk: Вьетнам\n    kl: Vietnam\n    km: វៀតណាម\n    kn: ವಿಯೆಟ್ನಾಮ್\n    ko: 베트남\n    ku: Viyetnam\n    kv: Вьетнам\n    kw: Vietnam\n    ky: Вьетнам\n    la: Vietnamia\n    lb: Vietnam\n    li: Vietnam\n    ln: Vietnami\n    lo: ປະເທດຫວຽດນາມ\n    lt: Vietnamas\n    lv: Vjetnama\n    mg: Vietnam\n    mi: Witināma\n    mk: Виетнам\n    ml: വിയറ്റ്നാം\n    mn: Вьетнам\n    mr: व्हियेतनाम\n    ms: Vietnam\n    mt: Vjetnam\n    my: ဗီယက်နမ်နိုင်ငံ\n    na: Bitinam\n    ne: भियतनाम\n    nl: Vietnam\n    \"no\": Vietnam\n    nv: Biʼednam\n    oc: Vietnam\n    om: Veetinaam\n    or: ଭିଏତନାମ\n    os: Вьетнам\n    pa: ਵੀਅਤਨਾਮ\n    pl: Wietnam\n    pt: Vietname\n    qu: Witnam\n    rm: Vietnam\n    rn: Vietnam\n    ro: Vietnam\n    ru: Вьетнам\n    rw: Viyetinamu\n    sa: चम्पादेश\n    sc: Vietnam\n    se: Vietnam\n    sh: Vijetnam\n    si: වියට්නාමය\n    sk: Vietnam\n    sl: Vietnam\n    sm: Vietnam\n    sn: Vietnam\n    so: Fiyetnam\n    sq: Vietnami\n    sr: Вијетнам\n    ss: IViyethina\n    st: Vietnam\n    su: Viétnam\n    sv: Vietnam\n    sw: Vietnam\n    ta: வியட்நாம்\n    te: వియత్నాం\n    tg: Ветнам\n    th: ประเทศเวียดนาม\n    tk: Wýetnam\n    tl: Vietnam\n    tr: Vietnam\n    tt: Вьетнам\n    tw: Vietnam\n    ug: ۋيېتنام\n    uk: В'єтнам\n    ur: ویتنام\n    uz: Vyetnam\n    ve: Viëtnam\n    vi: Việt Nam\n    vo: Vietnamän\n    wa: Vietnam\n    wo: Wiyetnaam\n    yi: וויעטנאם\n    yo: Fiẹtnám\n    za: Yiednamz\n    zh: 越南\n    zu: IViyetnami\n"
  },
  {
    "path": "settings/country-names/vu.yaml",
    "content": "name: \n    default: Vanuatu\n    ab: Вануату\n    ar: فانواتو\n    be: Вануату\n    bg: Вануату\n    bn: ভানুয়াটু\n    bo: ཝ་ནུའ་ཏུ།\n    br: Vanuatu\n    ce: Вануату\n    cs: Vanuatu\n    da: Vanuatu\n    de: Vanuatu\n    dv: ވަނުއާޓޫ\n    el: Βανουάτου\n    en: Vanuatu\n    eo: Vanuatuo\n    es: Vanuatu\n    fa: وانواتو\n    fi: Vanuatu\n    fr: Vanuatu\n    fy: Fanuatû\n    ga: Vanuatú\n    gd: Bhanuatu\n    he: ונואטו\n    hi: वानूअतु\n    hr: Vanuatu\n    ht: Vanwatou\n    hu: Vanuatu\n    hy: Վանուատու\n    is: Vanúatú\n    ja: バヌアツ\n    ka: ვანუატუ\n    kk: Вануату\n    kn: ವನುವಾಟು\n    ko: 바누아투\n    ku: Vanûatû\n    ky: Вануату\n    lt: Vanuatu\n    mk: Вануату\n    ml: വാനുവാടു\n    mn: Вануату\n    mr: व्हानुआतू\n    mt: Vanwatu\n    my: ဗနွားတူနိုင်ငံ\n    na: Banuatu\n    ne: भानुअटु\n    \"no\": Vanuatu\n    nv: Banoʼáátʼoo\n    oc: Vanuatu\n    or: ଭାନୁଆଟୁ\n    os: Вануату\n    pa: ਵਨੁਆਤੂ\n    pl: Vanuatu\n    pt: Vanuatu\n    qu: Wanwatu\n    ru: Вануату\n    rw: Vanuwatu\n    se: Vanuatu\n    sk: Vanuatu\n    sr: Вануату\n    sv: Vanuatu\n    ta: வனுவாட்டு\n    te: వనాటు\n    tg: Вануату\n    th: ประเทศวานูอาตู\n    tt: Вануату\n    ug: ۋانۇئاتۇ\n    uk: Вануату\n    ur: وانواتو\n    vo: Vanuatuäns\n    wo: Wanuatu\n    yo: Fanuatu\n    zh: 瓦努阿图\n"
  },
  {
    "path": "settings/country-names/ws.yaml",
    "content": "name: \n    default: Sāmoa\n    am: ሳሞአ\n    ar: ساموا\n    be: Самоа\n    bg: Самоа\n    bm: Samowa\n    bn: সামোয়া\n    bo: ནུ་བ་ས་མོ་འ།\n    br: Samoa\n    ca: Samoa\n    cs: Samoa\n    da: Samoa\n    de: Samoa\n    dz: ས་མོ་ཨ\n    ee: Samoa nutome\n    el: Σαμόα\n    en: Samoa\n    eo: Samoo\n    es: Samoa\n    et: Samoa\n    fa: ساموآ\n    ff: Samowaa\n    fi: Samoa\n    fo: Sámoa\n    fr: Samoa\n    fy: Samoä\n    ga: Samó\n    gd: Samotha\n    gu: સમોઆ\n    gv: Samoa\n    ha: Samowa\n    he: סמואה\n    hi: समोआ\n    hr: Samoa\n    hu: Szamoa\n    hy: Սամոա\n    ia: Samoa\n    io: Samoa\n    is: Samóa\n    it: Samoa\n    ja: サモア\n    ka: სამოა\n    km: សាមូអា\n    kn: ಸಮೋವಾ\n    ko: 사모아\n    ks: سیمووا\n    ku: Samoa\n    lg: Samowa\n    li: Samoa\n    lo: ຊາມົວ\n    lv: Samoa\n    mi: Hāmoa\n    mk: Самоа\n    ml: സാമോവ\n    mn: Самоа\n    mr: सामोआ\n    ne: सामोआ\n    nl: Samoa\n    \"no\": Samoa\n    or: ସାମୋଆ\n    pl: Samoa\n    rn: Samowa\n    ru: Самоа\n    se: Samoa\n    sg: Samoäa\n    si: සැමෝවා\n    sk: Samoa\n    sl: Samoa\n    sr: Самоа\n    sv: Samoa\n    ta: சமோவா\n    te: సమోవా\n    th: ประเทศซามัว\n    ti: ሳሞአ\n    to: Haʻamoa\n    uk: Самоа\n    ur: ساموآ\n    vo: Samovuäns\n    yo: Orílẹ́ède Samọ\n    zh: 萨摩亚\n    zu: i-Samoa\n"
  },
  {
    "path": "settings/country-names/xk.yaml",
    "content": "name: \n    default: Kosova / Kosovo\n    af: Kosovo\n    am: ኮሶቮ\n    an: Kosovo\n    ar: كوسوفو\n    ay: Kusuwu\n    az: Kosovo\n    ba: Косово\n    be: Косава\n    bg: Косово\n    bn: কসোভো\n    bo: ཁོ་སོ་ཝོ།\n    br: Kosovo\n    bs: Kosovo\n    ca: Kosovo\n    ce: Косово\n    cs: Kosovo\n    cv: Косово\n    cy: Cosofo\n    da: Kosovo\n    de: Kosovo\n    el: Κοσσυφοπέδιο\n    en: Kosovo\n    eo: Kosovo\n    es: Kosovo\n    et: Kosovo\n    eu: Kosovo\n    fa: کوزوو\n    fi: Kosovo\n    fo: Kosovo\n    fr: Kosovo\n    fy: Kosovo\n    ga: An Chosaiv\n    gd: Cosobho\n    gl: Kosovo\n    gn: Kosovo\n    gv: Kosovo\n    he: קוסובו\n    hi: कोसोवो गणराज्य\n    hr: Kosovo\n    hu: Koszovó\n    hy: Կոսովոն\n    ia: Kosovo\n    id: Kosovo\n    ie: Kosovo\n    ig: Kosovo\n    io: Kosovo\n    is: Kosóvó\n    it: Kosovo\n    ja: コソボ\n    jv: Kosovo\n    ka: კოსოვო\n    kk: Косово\n    kl: Kosovo\n    kn: ಕೊಸೊವೊ\n    ko: 코소보\n    ku: Kosova\n    kv: Косово\n    kw: Kosova\n    ky: Косово\n    la: Kosovia\n    lb: Kosovo\n    li: Kosovo\n    lo: ປະເທດໂກໂຊໂວ\n    lt: Kosovas\n    lv: Kosova\n    mk: Косово\n    ml: കൊസോവോ\n    mn: Косово\n    mr: कोसोव्हो\n    ms: Kosovo\n    mt: Kosovo\n    my: ကိုဆိုဗို\n    na: Kosovo\n    nl: Kosovo\n    \"no\": Kosovo\n    ny: Kosovo\n    oc: Kosova\n    os: Косово\n    pa: ਕੋਸੋਵੋ ਗਣਰਾਜ\n    pl: Kosowo\n    pt: Kosovo\n    qu: Kusuwu\n    rm: Cosovo\n    ro: Kosovo\n    ru: Косово\n    rw: Kosovo\n    sc: Kòssovu\n    sh: Kosovo\n    si: කොසෝවො\n    sk: Kosovo\n    sl: Kosovo\n    sm: Kosovo\n    sn: Kosovo\n    so: Kosofo\n    sq: Kosovo\n    sr: Косово\n    su: Kosovo\n    sv: Kosovo\n    sw: Kosovo\n    ta: கொசோவோ\n    te: కొసావో\n    th: ประเทศคอซอวอ\n    tl: Kosovo\n    tr: Kosova\n    ts: Kosovo\n    tt: Косово Җөмһүрияте\n    uk: Косово\n    ur: کوسووہ\n    uz: Kosovo\n    vi: Kosovo\n    vo: Kosovän\n    yo: Kósófò\n    zh: 科索沃\n"
  },
  {
    "path": "settings/country-names/ye.yaml",
    "content": "name: \n    default: اليمن\n    af: Jemen\n    am: የመን (አገር)\n    an: Yemen\n    ar: اليمن\n    az: Yəmən\n    ba: Йемен\n    be: Емен\n    bg: Йемен\n    bn: ইয়েমেন\n    bo: ཡེ་མེན།\n    br: Yemen\n    bs: Jemen\n    ca: Iemen\n    ce: Йемен\n    co: Yemen\n    cs: Jemen\n    cv: Йемен\n    cy: Yemen\n    da: Yemen\n    de: Jemen\n    dv: ޔަމަން\n    el: Υεμένη\n    en: Yemen\n    eo: Jemeno\n    es: Yemen\n    et: Jeemen\n    eu: Yemen\n    fa: یمن\n    fi: Jemen\n    fo: Jemen\n    fr: Yémen\n    fy: Jemen\n    ga: Poblacht Éimin\n    gd: Iemen\n    gl: Iemen - اليمن\n    gn: Jemẽ\n    gu: યેમેન\n    gv: Yn Yeaman\n    he: תימן\n    hi: यमन\n    hr: Jemen\n    ht: Yemèn\n    hu: Jemen\n    hy: Եմեն\n    ia: Yemen\n    id: Yaman\n    ie: Yemen\n    io: Yemen\n    is: Jemen\n    it: Yemen\n    ja: イエメン\n    jv: Yaman\n    ka: იემენი\n    ki: Yemen\n    kk: Йемен\n    kl: Yemen\n    kn: ಯೆಮೆನ್\n    ko: 예멘\n    ks: یَمَن\n    ku: Yemen\n    kv: Йемен\n    kw: Yemen\n    ky: Йемен\n    la: Iemenia\n    lb: Jemen\n    li: Jeme\n    ln: Yeméni\n    lt: Jemenas\n    lv: Jemena\n    mk: Јемен\n    ml: യെമൻ\n    mn: Йемен\n    mr: येमेनचे प्रजासत्ताक\n    ms: Yaman\n    mt: Jemen\n    my: ယီမင်နိုင်ငံ\n    na: Yemen\n    ne: गणतन्त्र यमन\n    nl: Jemen\n    \"no\": Jemen\n    nv: Shádiʼááhjí Ásáí Bikéyah\n    oc: Iemèn\n    or: ୟେମେନ\n    os: Йемен\n    pa: ਯਮਨ\n    pl: Jemen\n    ps: یمن\n    pt: Iémen\n    qu: Yaman\n    ro: Yemen\n    ru: Йемен\n    rw: Yemeni\n    sa: यमन\n    sd: يمن\n    se: Jemen\n    sh: Jemen\n    sk: Jemen\n    sl: Jemen\n    so: Yemen\n    sq: Jemeni\n    sr: Јемен\n    ss: IYemeni\n    su: Yaman\n    sv: Jemen\n    sw: Yemen\n    ta: யெமன்\n    te: యెమన్\n    tg: Яман\n    th: ประเทศเยเมน\n    tk: Ýemen\n    tl: Yemen\n    tr: Yemen\n    tt: Йәмән\n    ug: يەمەن\n    uk: Ємен\n    ur: یمن\n    uz: Yaman\n    vi: Yemen\n    vo: Yämän\n    wo: Yaman\n    yi: תימן\n    yo: Yemen\n    zh: 也门\n    zu: IYemen\n"
  },
  {
    "path": "settings/country-names/za.yaml",
    "content": "name: \n    default: South Africa\n    af: Suid-Afrika\n    ak: Afrika Anaafo\n    am: ደቡብ አፍሪካ\n    an: Sudafrica\n    ar: جنوب أفريقيا\n    az: Cənub Afrika\n    be: Паўднёва-Афрыканская Рэспубліка\n    bg: Южна Африка\n    bm: Worodugu Afriki\n    bn: দক্ষিণ আফ্রিকা\n    bo: ལྷོ་ ཨཕྲི་ཀ།\n    br: Suafrika\n    bs: Južna Afrika\n    ca: Sud-àfrica\n    ce: Къилба-Африкин Республика\n    cs: Jižní Afrika\n    cv: Кăнтăр Африка\n    cy: De Affrica\n    da: Sydafrika\n    de: Südafrika\n    dv: ދެކުނު އެފްރިކާ\n    dz: སཱའུཐ་ ཨཕ་རི་ཀ\n    ee: Anyiehe Afrika nutome\n    el: Νότια Αφρική\n    en: South Africa\n    eo: Sud-Afriko\n    es: Sudáfrica\n    et: Lõuna-Aafrika Vabariik\n    eu: Hegoafrika\n    fa: آفریقای جنوبی\n    ff: Afrik bŋ Worgo\n    fi: Etelä-Afrikka\n    fo: Suðurafrika\n    fr: Afrique du Sud\n    fy: Súd-Afrika\n    ga: An Afraic Theas\n    gd: Afraga a Deas\n    gl: Suráfrica\n    gn: Yvyafrika\n    gu: દક્ષિણ આફ્રિકા\n    gv: Yn Affrick Yiass\n    ha: Afirka ta Kudu\n    he: דרום אפריקה\n    hi: दक्षिण अफ़्रीका\n    hr: Južna Afrika\n    ht: Afrik disid\n    hu: Dél-Afrika\n    hy: Հարավային Աֆրիկա\n    ia: Africa del Sud\n    id: Afrika Selatan\n    ie: Sudafrica\n    io: Sud-Afrika\n    is: Suður-Afríka\n    it: Sudafrica\n    ja: 南アフリカ\n    jv: Afrika Kidul\n    ka: სამხრეთ აფრიკა\n    kg: Afelika ya Sudi\n    ki: Abĩrika Kusini\n    kk: Оңтүстік Африка\n    km: អាព្រិក​ភាគ​ខាង​ត្បូង\n    kn: ದಕ್ಷಿಣ ಆಫ್ರಿಕಾ\n    ko: 남아프리카\n    ks: جَنوٗبی اَفریٖکا\n    ku: Afrîkaya Başûr\n    kv: Лунвыв Африкаса Республика\n    kw: Afrika Dhyhow\n    ky: Африкаанс тили\n    la: Africa Australis\n    lb: Südafrika\n    lg: Sawusafirika\n    li: Zuud-Afrika\n    ln: Sidafríka\n    lo: ອາຟະລິກາໃຕ້\n    lt: Pietų Afrika\n    lv: Dienvidāfrika\n    mg: Afrika Atsimo\n    mi: Awherika ki te Tonga\n    mk: Јужна Африка\n    ml: ദക്ഷിണാഫ്രിക്ക\n    mn: Өмнөд Африк\n    mr: दक्षिण अफ्रिका\n    ms: Afrika Selatan\n    mt: Afrika t’Isfel\n    my: တောင်အာဖရိက\n    ne: दक्षिण अफ्रिका\n    nl: Zuid-Afrika\n    \"no\": Sør-Afrika\n    nv: Kéyah Naakai Łizhinii Bikéyah Shádiʼááhjí Siʼánígíí\n    ny: South Africa\n    oc: Sud d'Africa\n    or: ଦକ୍ଷିଣ ଆଫ୍ରିକା\n    os: Хуссар Африкæйы\n    pa: ਦੱਖਣੀ ਅਫ਼ਰੀਕਾ\n    pl: Republika Południowej Afryki\n    ps: سویلي افریقا\n    pt: África do Sul\n    qu: Urin Aphrika\n    rm: Africa dal Sid\n    rn: Afurika y'Epfo\n    ro: Africa de Sud\n    ru: Южная Африка\n    rw: Afurika y’Epfo\n    sa: दक्षिण-आफ्रिका\n    sc: Sudàfrica\n    se: Lulli-Afrihká\n    sg: Afrîka-Mbongo\n    sh: Južna Afrika\n    si: දකුණු අප්‍රිකාව\n    sk: Južná Afrika\n    sl: Južna Afrika\n    sn: South Africa\n    so: Koonfur Afrika\n    sq: Afrika e Jugut\n    sr: Јужна Африка\n    ss: INingizimu Afrika\n    st: Afrika Borwa\n    su: Afrika Kidul\n    sv: Sydafrika\n    sw: Afrika Kusini\n    ta: தென் ஆப்பிரிக்கா\n    te: దక్షిణ ఆఫ్రికా రాజ్యం\n    tg: Африқои Ҷанубӣ\n    th: แอฟริกาใต้\n    ti: ደቡብ አፍሪካ\n    tk: Günorta Afrika\n    tl: Timog Aprika\n    tn: Aferika Borwa\n    to: ʻAfilika tonga\n    tr: Güney Afrika\n    ts: Afrika-Dzonga\n    tt: Көньяк Африка\n    ug: جەنۇبىي ئافرىقا\n    uk: Південна Африка\n    ur: جنوبی افریقہ\n    uz: Janubiy Afrika\n    ve: Afurika Tshipembe\n    vi: Nam Phi\n    vo: Sulüdafrikän\n    wa: Nonne-Afrike\n    wo: Afrig gu Bëj-saalum\n    xh: uMzantsi Afrika\n    yi: דרום אפריקע\n    yo: Gúúsù Áfríkà\n    zh: 南非\n    zu: iNingizimu Afrika\n"
  },
  {
    "path": "settings/country-names/zm.yaml",
    "content": "name: \n    default: Zambia\n    af: Zambië\n    am: ዛምቢያ\n    an: Zambia\n    ar: زامبيا\n    az: Zambiya\n    ba: Замбия\n    be: Замбія\n    bg: Замбия\n    bm: Zanbia\n    bn: জাম্বিয়া\n    bo: ཛམ་བི་ཡ།\n    br: Zambia\n    bs: Zambija\n    ca: Zàmbia\n    ce: Замби\n    cs: Zambie\n    cv: Замби\n    cy: Zambia\n    da: Zambia\n    de: Sambia\n    dv: ޒެމްބިއާ\n    ee: Zambia\n    el: Ζάμπια\n    en: Zambia\n    eo: Zambio\n    es: Zambia\n    et: Sambia\n    eu: Zambia\n    fa: زامبیا\n    fi: Sambia\n    fo: Sambia\n    fr: Zambie\n    fy: Sambia\n    ga: An tSaimbia\n    gd: Saimbia\n    gl: Zambia\n    gv: Yn Tambia\n    he: זמביה\n    hi: ज़ाम्बिया\n    hr: Zambija\n    ht: Zanbi\n    hu: Zambia\n    hy: Զամբիա\n    id: Zambia\n    ie: Zambia\n    io: Zambia\n    is: Sambía\n    it: Zambia\n    ja: ザンビア\n    jv: Zambia\n    ka: ზამბია\n    kg: Zambia\n    kk: Замбия\n    km: ប្រទេសហ្សំប៊ី\n    ko: 잠비아\n    ku: Zambiya\n    kw: Zambi\n    la: Zambia\n    lb: Sambia\n    li: Zambia\n    ln: Zambia\n    lt: Zambija\n    lv: Zambija\n    mi: Tāmipia\n    mk: Замбија\n    ml: സാംബിയ\n    mn: Замби\n    mr: झांबिया\n    ms: Zambia\n    mt: Żambja\n    my: ဇမ်ဘီယာနိုင်ငံ\n    nl: Zambia\n    \"no\": Zambia\n    ny: Zambia\n    oc: Zambia\n    or: ଜାମ୍ବିଆ\n    os: Замби\n    pa: ਜ਼ਾਂਬੀਆ\n    pl: Zambia\n    ps: زېمبيا\n    pt: Zâmbia\n    qu: Sambya\n    ro: Zambia\n    ru: Замбия\n    rw: Zambiya\n    sa: जाम्बिया\n    sc: Zàmbia\n    se: Zambia\n    sg: Zambïi\n    sh: Zambija\n    sk: Zambia\n    sl: Zambija\n    sn: Zambia\n    so: Saambiya\n    sq: Zambia\n    sr: Замбија\n    ss: IZambiya\n    su: Zambia\n    sv: Zambia\n    sw: Zambia\n    ta: சாம்பியா\n    te: జాంబియా\n    tg: Замбия\n    th: ประเทศแซมเบีย\n    ti: ዛምቢያ\n    tk: Zambiýa\n    tl: Sambya\n    tn: Zambia\n    tr: Zambiya\n    ts: Zambia\n    tt: Замбия\n    ug: زامبىيە\n    uk: Замбія\n    ur: زیمبیا\n    uz: Zambiya\n    vi: Zambia\n    vo: Zambiyän\n    wo: Saambi\n    yi: זאמביע\n    yo: Sámbíà\n    zh: 赞比亚\n    zu: IZambiya\n"
  },
  {
    "path": "settings/country-names/zw.yaml",
    "content": "name: \n    default: Zimbabwe\n    af: Zimbabwe\n    am: ዚምባብዌ\n    an: Zimbabwe\n    ar: زيمبابوي\n    az: Zimbabve\n    ba: Зимбабве\n    be: Зімбабвэ\n    bg: Зимбабве\n    bm: Zimbabwe\n    bn: জিম্বাবুয়ে\n    bo: ཛིམ་བབ་ཝི།\n    br: Zimbabwe\n    bs: Zimbabve\n    ca: Zimbabwe\n    ce: Зимбабве\n    cs: Zimbabwe\n    cv: Зимбабве\n    cy: Zimbabwe\n    da: Zimbabwe\n    de: Simbabwe\n    dv: ޒިމްބާބުވޭ\n    dz: ཛིམ་བབ་ཝེ་\n    ee: Zimbabwe\n    el: Ζιμπάμπουε\n    en: Zimbabwe\n    eo: Zimbabvo\n    es: Zimbabue\n    et: Zimbabwe\n    eu: Zimbabwe\n    fa: زیمبابوه\n    fi: Zimbabwe\n    fo: Simbabvi\n    fr: Zimbabwe\n    fy: Simbabwe\n    ga: An tSiombáib\n    gd: Siombabue\n    gl: Cimbabue\n    gv: Yn Çhimbabwe\n    he: זימבבואה\n    hi: ज़िम्बाब्वे\n    hr: Zimbabve\n    ht: Zimbabwe\n    hu: Zimbabwe\n    hy: Զիմբաբվե\n    id: Zimbabwe\n    ie: Zimbabwe\n    io: Zimbabwe\n    is: Simbabve\n    it: Zimbabwe\n    ja: ジンバブエ\n    jv: Zimbabwe\n    ka: ზიმბაბვე\n    kg: Zimbabwe\n    ki: Zimbabwe\n    kk: Зимбабве\n    kn: ಜಿಂಬಾಬ್ವೆ\n    ko: 짐바브웨\n    ku: Zîmbabwe\n    kw: Zimbabwe\n    la: Zimbabua\n    lb: Simbabwe\n    li: Zimbabwe\n    ln: Zimbabwe\n    lt: Zimbabvė\n    lv: Zimbabve\n    mi: Timuwawe\n    mk: Зимбабве\n    ml: സിംബാബ്വെ\n    mn: Зимбабве\n    mr: झिंबाब्वे\n    ms: Zimbabwe\n    mt: Żimbabwe\n    my: ဇင်ဘာဘွေနိုင်ငံ\n    ne: जिम्बाब्वे\n    nl: Zimbabwe\n    \"no\": Zimbabwe\n    nv: Hooghan Tsé Bee Ádaalyaaí Bikéyah\n    ny: Zimbabwe\n    oc: Zimbabwe\n    or: ଜିମ୍ବାୱେ\n    os: Зимбабве\n    pa: ਜ਼ਿੰਬਾਬਵੇ\n    pl: Zimbabwe\n    ps: زېمبابوې\n    pt: Zimbabué\n    qu: Simbabwi\n    ro: Zimbabwe\n    ru: Зимбабве\n    rw: Zimbabwe\n    sa: जिम्बाबवे\n    sc: Zimbabwe\n    se: Zimbabwe\n    sg: Zimbäbwe\n    sh: Zimbabve\n    si: සිම්බාබ්වේ\n    sk: Zimbabwe\n    sl: Zimbabve\n    sn: Zimbabwe\n    so: Simbaabwi\n    sq: Zimbabveja\n    sr: Зимбабве\n    ss: IZimbabhwe\n    su: Zimbabwé\n    sv: Zimbabwe\n    sw: Zimbabwe\n    ta: சிம்பாப்வே\n    te: జింబాబ్వే\n    tg: Зимбабве\n    th: ประเทศซิมบับเว\n    ti: ዚምባብዌ\n    tk: Zimbabwe\n    tl: Simbabwe\n    tn: Zimbabwe\n    tr: Zimbabve\n    ts: Zimbabwe\n    tt: Зимбабве\n    ug: زىمبابۋې\n    uk: Зімбабве\n    ur: زمبابوے\n    uz: Zimbabve\n    ve: Zimbagwe\n    vi: Zimbabwe\n    vo: Zimbabiyän\n    wo: Simbaawee\n    yi: זימבאבווע\n    yo: Sìmbábúè\n    zh: 辛巴威\n    zu: IZimbabwe\n"
  },
  {
    "path": "settings/country_settings.yaml",
    "content": "# Andorra (Andorra)\nad:\n    partition: 35\n    languages: ca\n    names: !include country-names/ad.yaml\n    postcode:\n      pattern: \"(ddd)\"\n      output: AD\\1\n\n\n# United Arab Emirates (الإمارات العربية المتحدة)\nae:\n    partition: 83\n    languages: ar\n    names: !include country-names/ae.yaml\n    postcode: no\n\n\n# Afghanistan (افغانستان)\naf:\n    partition: 30\n    languages: fa, ps\n    names: !include country-names/af.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Antigua and Barbuda (Antigua and Barbuda)\nag:\n    partition: 205\n    languages: en\n    names: !include country-names/ag.yaml\n    postcode: no\n\n\n# Anguilla (Anguilla)\nai:\n    partition: 175\n    languages: en\n    names: !include country-names/ai.yaml\n    postcode:\n      pattern: \"2640\"\n      output: AI-2640\n\n\n# Albania (Shqipëria)\nal:\n    partition: 9\n    languages: sq\n    names: !include country-names/al.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Armenia (Հայաստան)\nam:\n    partition: 33\n    languages: hy\n    names: !include country-names/am.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Angola (Angola)\nao:\n    partition: 85\n    languages: pt\n    names: !include country-names/ao.yaml\n    postcode: no\n\n\n# Argentina (Argentina)\nar:\n    partition: 39\n    languages: es\n    names: !include country-names/ar.yaml\n    postcode:\n      pattern: \"l?dddd(?:lll)?\"\n\n\n# Austria (Österreich)\nat:\n    partition: 245\n    languages: de\n    names: !include country-names/at.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Australia (Australia)\nau:\n    partition: 139\n    languages: en\n    names: !include country-names/au.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Azerbaijan (Azərbaycan)\naz:\n    partition: 119\n    languages: az\n    names: !include country-names/az.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Bosnia and Herzegovina (Bosna i Hercegovina / Босна и Херцеговина)\nba:\n    partition: 6\n    languages: bs, hr, sr\n    names: !include country-names/ba.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Barbados (Barbados)\nbb:\n    partition: 206\n    languages: en\n    names: !include country-names/bb.yaml\n    postcode:\n      pattern: \"(ddddd)\"\n      output: BB\\1\n\n\n# Bangladesh (Bangladesh)\nbd:\n    partition: 158\n    languages: bn\n    names: !include country-names/bd.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Belgium (België / Belgique / Belgien)\nbe:\n    partition: 15\n    languages: nl, fr, de\n    names: !include country-names/be.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Burkina Faso (Burkina Faso)\nbf:\n    partition: 225\n    languages: fr\n    names: !include country-names/bf.yaml\n    postcode: no\n\n\n# Bulgaria (Бългaрия)\nbg:\n    partition: 140\n    languages: bg\n    names: !include country-names/bg.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Bahrain (البحرين)\nbh:\n    partition: 62\n    languages: ar\n    names: !include country-names/bh.yaml\n    postcode:\n      pattern: \"d?ddd\"\n\n\n# Burundi (Burundi)\nbi:\n    partition: 61\n    languages: fr\n    names: !include country-names/bi.yaml\n    postcode: no\n\n\n# Benin (Bénin)\nbj:\n    partition: 224\n    languages: fr\n    names: !include country-names/bj.yaml\n    postcode: no\n\n\n# Bermuda (Bermuda)\nbm:\n    partition: 176\n    languages: en\n    names: !include country-names/bm.yaml\n    postcode:\n      pattern: \"(ll)[ -]?(dd)\"\n      output: \\1 \\2\n\n\n# Brunei (Brunei)\nbn:\n    partition: 86\n    languages: ms\n    names: !include country-names/bn.yaml\n    postcode:\n      pattern: \"(ll) ?(dddd)\"\n      output: \\1\\2\n\n\n# Bolivia (Bolivia)\nbo:\n    partition: 120\n    languages: es, qu, gn, ay\n    names: !include country-names/bo.yaml\n    postcode: no\n\n\n# Brazil (Brasil)\nbr:\n    partition: 121\n    languages: pt\n    names: !include country-names/br.yaml\n    postcode:\n      pattern: \"(ddddd)-?(ddd)\"\n      output: \\1-\\2\n\n\n# The Bahamas (The Bahamas)\nbs:\n    partition: 207\n    languages: en\n    names: !include country-names/bs.yaml\n    postcode: no\n\n\n# Bhutan (འབྲུག་ཡུལ་)\nbt:\n    partition: 87\n    languages: dz\n    names: !include country-names/bt.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Botswana (Botswana)\nbw:\n    partition: 122\n    languages: en, tn\n    names: !include country-names/bw.yaml\n    postcode: no\n\n\n# Belarus (Беларусь)\nby:\n    partition: 40\n    languages: be, ru\n    names: !include country-names/by.yaml\n    postcode:\n      pattern: \"dddddd\"\n\n\n# Belize (Belize)\nbz:\n    partition: 208\n    languages: en\n    names: !include country-names/bz.yaml\n    postcode: no\n\n\n# Canada (Canada)\nca:\n    partition: 244\n    languages: en, fr\n    names: !include country-names/ca.yaml\n    postcode:\n      pattern: \"(ldl) ?(dld)\"\n      output: \\1 \\2\n\n\n# Democratic Republic of the Congo (République démocratique du Congo)\ncd:\n    partition: 229\n    languages: fr\n    names: !include country-names/cd.yaml\n    postcode: no\n\n\n# Central African Republic (Ködörösêse tî Bêafrîka - République Centrafricaine)\ncf:\n    partition: 227\n    languages: fr, sg\n    names: !include country-names/cf.yaml\n    postcode: no\n\n\n# Congo-Brazzaville (Congo)\ncg:\n    partition: 230\n    languages: fr\n    names: !include country-names/cg.yaml\n    postcode: no\n\n\n# Switzerland (Schweiz/Suisse/Svizzera/Svizra)\nch:\n    partition: 5\n    languages: de, fr, it, rm\n    names: !include country-names/ch.yaml\n    postcode:\n      pattern: \"dddd\"\n      extent: 3000\n\n\n# Côte d'Ivoire (Côte d’Ivoire)\nci:\n    partition: 228\n    languages: fr\n    names: !include country-names/ci.yaml\n    postcode: no\n\n\n# Cook Islands (Kūki 'Āirani)\nck:\n    partition: 41\n    languages: en, rar\n    names: !include country-names/ck.yaml\n    postcode: no\n\n\n# Chile (Chile)\ncl:\n    partition: 88\n    languages: es\n    names: !include country-names/cl.yaml\n    postcode:\n      pattern: \"ddddddd\"\n\n\n# Cameroon (Cameroun)\ncm:\n    partition: 141\n    languages: fr, en\n    names: !include country-names/cm.yaml\n    postcode: no\n\n\n# China (中国)\ncn:\n    partition: 117\n    languages: zh\n    names: !include country-names/cn.yaml\n    postcode:\n      pattern: \"dddddd\"\n\n\n# Colombia (Colombia)\nco:\n    partition: 133\n    languages: es\n    names: !include country-names/co.yaml\n    postcode:\n      pattern: \"dddddd\"\n\n\n# Costa Rica (Costa Rica)\ncr:\n    partition: 64\n    languages: es\n    names: !include country-names/cr.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Cuba (Cuba)\ncu:\n    partition: 42\n    languages: es\n    names: !include country-names/cu.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Cape Verde (Cabo Verde)\ncv:\n    partition: 89\n    languages: pt\n    names: !include country-names/cv.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Cyprus (Κύπρος - Kıbrıs)\ncy:\n    partition: 114\n    languages: el, tr\n    names: !include country-names/cy.yaml\n    postcode:\n      pattern: \"(?:99|d)ddd\"\n\n\n# Czechia (Česko)\ncz:\n    partition: 124\n    languages: cs\n    names: !include country-names/cz.yaml\n    postcode:\n      pattern: \"(ddd) ?(dd)\"\n      output: \\1 \\2\n\n\n# Germany (Deutschland)\nde:\n    partition: 3\n    languages: de\n    names: !include country-names/de.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Djibouti (Djibouti جيبوتي)\ndj:\n    partition: 43\n    languages: fr, ar, so, aa\n    names: !include country-names/dj.yaml\n    postcode: no\n\n\n# Denmark (Danmark)\ndk:\n    partition: 160\n    languages: da\n    names: !include country-names/dk.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Dominica (Dominica)\ndm:\n    partition: 209\n    languages: en\n    names: !include country-names/dm.yaml\n    postcode: no\n\n\n# Dominican Republic (República Dominicana)\ndo:\n    partition: 37\n    languages: es\n    names: !include country-names/do.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Algeria (Algérie / ⵍⵣⵣⴰⵢⴻⵔ / الجزائر)\ndz:\n    partition: 19\n    languages: ar, ber, fr\n    names: !include country-names/dz.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Ecuador (Ecuador)\nec:\n    partition: 78\n    languages: es\n    names: !include country-names/ec.yaml\n    postcode:\n      pattern: \"dddddd\"\n\n\n# Estonia (Eesti)\nee:\n    partition: 125\n    languages: et\n    names: !include country-names/ee.yaml\n    postcode:\n      pattern: \"ddddd\"\n      extent: 3000\n\n\n# Egypt (مصر)\neg:\n    partition: 16\n    languages: ar\n    names: !include country-names/eg.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Sahrawi Arab Democratic Republic (الجمهورية العربية الصحراوية الديمقراطية)\neh:\n    partition: 186\n    languages: ar, es, fr\n    names: !include country-names/eh.yaml\n\n\n# Eritrea (ኤርትራ Eritrea إرتريا)\ner:\n    partition: 142\n    languages: ti, ar, en\n    names: !include country-names/er.yaml\n    postcode: no\n\n\n# Spain (España)\nes:\n    partition: 31\n    languages: es, ast, ca, eu, gl\n    names: !include country-names/es.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Ethiopia (ኢትዮጵያ)\net:\n    partition: 90\n    languages: am, om\n    names: !include country-names/et.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Finland (Suomi)\nfi:\n    partition: 20\n    languages: fi, sv, se\n    names: !include country-names/fi.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Fiji (Viti)\nfj:\n    partition: 210\n    languages: en\n    names: !include country-names/fj.yaml\n    postcode: no\n\n\n# Falkland Islands (Falkland Islands)\nfk:\n    partition: 91\n    languages: en\n    names: !include country-names/fk.yaml\n    postcode:\n      pattern: \"FIQQ 1ZZ\"\n\n\n# Federated States of Micronesia (Micronesia)\nfm:\n    partition: 217\n    languages: en\n    names: !include country-names/fm.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Faroe Islands (Føroyar)\nfo:\n    partition: 10\n    languages: fo, da\n    names: !include country-names/fo.yaml\n    postcode:\n      pattern: \"ddd\"\n\n\n# France (France)\nfr:\n    partition: 4\n    languages: fr\n    names: !include country-names/fr.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Gabon (Gabon)\nga:\n    partition: 239\n    languages: fr\n    names: !include country-names/ga.yaml\n    postcode: no\n\n\n# United Kingdom (United Kingdom)\ngb:\n    partition: 1\n    languages: en\n    names: !include country-names/gb.yaml\n    postcode:\n      pattern: \"(l?ld[A-Z0-9]?) ?(dll)\"\n      output: \\1 \\2\n      extent: 700\n\n\n# Grenada (Grenada)\ngd:\n    partition: 143\n    languages: en\n    names: !include country-names/gd.yaml\n    postcode: no\n\n\n# Georgia (საქართველო)\nge:\n    partition: 21\n    languages: ka\n    names: !include country-names/ge.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Guernsey (Guernsey)\ngg:\n    partition: 77\n    languages: en\n    names: !include country-names/gg.yaml\n    postcode:\n      pattern: \"(GYdd?) ?(dll)\"\n      output: \\1 \\2\n      extent: 1000\n\n\n# Ghana (Ghana)\ngh:\n    partition: 211\n    languages: en\n    names: !include country-names/gh.yaml\n    postcode:\n      pattern: \"ll-d?ddd-dddd\"\n\n\n# Gibraltar (Gibraltar)\ngi:\n    partition: 138\n    languages: en\n    names: !include country-names/gi.yaml\n    postcode:\n      pattern: \"(GX11) ?(1AA)\"\n      output: GX11 1AA\n\n\n# Greenland (Kalaallit Nunaat)\ngl:\n    partition: 111\n    languages: kl, da\n    names: !include country-names/gl.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# The Gambia (Gambia)\ngm:\n    partition: 212\n    languages: en\n    names: !include country-names/gm.yaml\n    postcode: no\n\n\n# Guinea (Guinée)\ngn:\n    partition: 240\n    languages: fr\n    names: !include country-names/gn.yaml\n    postcode:\n      pattern: \"ddd\"\n\n\n# Equatorial Guinea (Guinea Ecuatorial)\ngq:\n    partition: 12\n    languages: es, fr, pt\n    names: !include country-names/gq.yaml\n    postcode: no\n\n\n# Greece (Ελλάς)\ngr:\n    partition: 22\n    languages: el\n    names: !include country-names/gr.yaml\n    postcode:\n      pattern: \"(ddd) ?(dd)\"\n      output: \\1 \\2\n\n\n# South Georgia and the South Sandwich Islands (South Georgia and the South Sandwich Islands)\ngs:\n    partition: 44\n    languages: en\n    names: !include country-names/gs.yaml\n    postcode:\n      pattern: \"(SIQQ) ?(1ZZ)\"\n      output: \\1 \\2\n\n\n# Guatemala (Guatemala)\ngt:\n    partition: 57\n    languages: es\n    names: !include country-names/gt.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Guinea-Bissau (Guiné-Bissau)\ngw:\n    partition: 8\n    languages: pt\n    names: !include country-names/gw.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Guyana (Guyana)\ngy:\n    partition: 213\n    languages: en\n    names: !include country-names/gy.yaml\n    postcode: no\n\n\n# Honduras (Honduras)\nhn:\n    partition: 56\n    languages: es\n    names: !include country-names/hn.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Croatia (Hrvatska)\nhr:\n    partition: 92\n    languages: hr\n    names: !include country-names/hr.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Haiti (Ayiti)\nht:\n    partition: 29\n    languages: fr, ht\n    names: !include country-names/ht.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Hungary (Magyarország)\nhu:\n    partition: 45\n    languages: hu\n    names: !include country-names/hu.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Indonesia (Indonesia)\nid:\n    partition: 110\n    languages: id\n    names: !include country-names/id.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Ireland (Éire / Ireland)\nie:\n    partition: 46\n    languages: en, ga\n    names: !include country-names/ie.yaml\n    postcode:\n      pattern: \"(ldd) ?([0123456789ACDEFHKNPRTVWXY]{4})\"\n      output: \\1 \\2\n      extent: 50\n\n\n# Israel (ישראל)\nil:\n    partition: 65\n    languages: he\n    names: !include country-names/il.yaml\n    postcode:\n      pattern: \"ddddddd\"\n\n\n# Isle of Man (Isle of Man)\nim:\n    partition: 190\n    languages: en\n    names: !include country-names/im.yaml\n    postcode:\n      pattern: \"(IMdd?) ?(dll)\"\n      output: \\1 \\2\n      extent: 700\n\n\n# India (India)\nin:\n    partition: 128\n    languages: hi, en\n    names: !include country-names/in.yaml\n    postcode:\n      pattern: \"(ddd) ?(ddd)\"\n      output: \\1\\2\n\n\n# British Indian Ocean Territory (British Indian Ocean Territory)\nio:\n    partition: 13\n    languages: en\n    names: !include country-names/io.yaml\n    postcode:\n      pattern: \"(BBND) ?(1ZZ)\"\n      output: \\1 \\2\n\n\n# Iraq (العراق)\niq:\n    partition: 144\n    languages: ar, ku\n    names: !include country-names/iq.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Iran (ایران)\nir:\n    partition: 80\n    languages: fa\n    names: !include country-names/ir.yaml\n    postcode:\n      pattern: \"(ddddd)[-_ ]?(ddddd)\"\n      output: \\1-\\2\n\n\n# Iceland (Ísland)\nis:\n    partition: 134\n    languages: is\n    names: !include country-names/is.yaml\n    postcode:\n      pattern: \"ddd\"\n\n\n# Italy (Italia)\nit:\n    partition: 28\n    languages: it, de, fr\n    names: !include country-names/it.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Jersey (Jersey)\nje:\n    partition: 123\n    languages: en\n    names: !include country-names/je.yaml\n    postcode:\n      pattern: \"(JEdd?) ?(dll)\"\n      output: \\1 \\2\n\n\n# Jamaica (Jamaica)\njm:\n    partition: 214\n    languages: en\n    names: !include country-names/jm.yaml\n    postcode: no\n\n\n# Jordan (الأردن)\njo:\n    partition: 17\n    languages: ar\n    names: !include country-names/jo.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Japan (日本)\njp:\n    partition: 11\n    languages: ja\n    names: !include country-names/jp.yaml\n    postcode:\n      pattern: \"(ddd)-?(dddd)\"\n      output: \\1-\\2\n      extent: 3000\n\n\n# Kenya (Kenya)\nke:\n    partition: 126\n    languages: sw, en\n    names: !include country-names/ke.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Kyrgyzstan (Кыргызстан)\nkg:\n    partition: 93\n    languages: ky, ru\n    names: !include country-names/kg.yaml\n    postcode:\n      pattern: \"dddddd\"\n\n\n# Cambodia (ព្រះរាជាណាចក្រ​កម្ពុជា)\nkh:\n    partition: 159\n    languages: km\n    names: !include country-names/kh.yaml\n    postcode:\n      pattern: \"dddddd\"\n\n\n# Kiribati (Kiribati)\nki:\n    partition: 215\n    languages: en\n    names: !include country-names/ki.yaml\n    postcode: no\n\n\n# Comoros (Comores Komori جزر القمر)\nkm:\n    partition: 47\n    languages: ar, fr, sw\n    names: !include country-names/km.yaml\n    postcode: no\n\n\n# Saint Kitts and Nevis (Saint Kitts and Nevis)\nkn:\n    partition: 84\n    languages: en\n    names: !include country-names/kn.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# North Korea (조선민주주의인민공화국)\nkp:\n    partition: 48\n    languages: ko\n    names: !include country-names/kp.yaml\n    postcode: no\n\n\n# South Korea (대한민국)\nkr:\n    partition: 49\n    languages: ko\n    names: !include country-names/kr.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Kuwait (الكويت)\nkw:\n    partition: 127\n    languages: ar\n    names: !include country-names/kw.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Cayman Islands (Cayman Islands)\nky:\n    partition: 38\n    languages: en\n    names: !include country-names/ky.yaml\n    postcode:\n      pattern: \"(d)-(dddd)\"\n      output: KY\\1-\\2\n\n\n# Kazakhstan (Қазақстан)\nkz:\n    partition: 94\n    languages: kk, ru\n    names: !include country-names/kz.yaml\n    postcode:\n      pattern: \"(?:lddldld|dddddd)\"\n\n\n# Laos (ປະເທດລາວ)\nla:\n    partition: 145\n    languages: lo\n    names: !include country-names/la.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Lebanon (لبنان)\nlb:\n    partition: 66\n    languages: ar, fr\n    names: !include country-names/lb.yaml\n    postcode:\n      pattern: \"(dddd)(?: ?dddd)?\"\n\n\n# Saint Lucia (Saint Lucia)\nlc:\n    partition: 146\n    languages: en\n    names: !include country-names/lc.yaml\n    postcode:\n      pattern: \"(dd) ?(ddd)\"\n      output: LC\\1 \\2\n\n\n# Liechtenstein (Liechtenstein)\nli:\n    partition: 246\n    languages: de\n    names: !include country-names/li.yaml\n    postcode:\n      pattern: \"dddd\"\n      extent: 4000\n\n\n# Sri Lanka (ශ්‍රී ලංකාව இலங்கை)\nlk:\n    partition: 95\n    languages: si, ta\n    names: !include country-names/lk.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Liberia (Liberia)\nlr:\n    partition: 216\n    languages: en\n    names: !include country-names/lr.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Lesotho (Lesotho)\nls:\n    partition: 136\n    languages: en, st\n    names: !include country-names/ls.yaml\n    postcode:\n      pattern: \"ddd\"\n\n\n# Lithuania (Lietuva)\nlt:\n    partition: 67\n    languages: lt\n    names: !include country-names/lt.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Luxembourg (Lëtzebuerg)\nlu:\n    partition: 74\n    languages: lb, fr, de\n    names: !include country-names/lu.yaml\n    postcode:\n      pattern: \"dddd\"\n      extent: 1000\n\n\n# Latvia (Latvija)\nlv:\n    partition: 162\n    languages: lv\n    names: !include country-names/lv.yaml\n    postcode:\n      pattern: \"(dddd)\"\n      output: LV-\\1\n\n\n# Libya (ليبيا)\nly:\n    partition: 163\n    languages: ar\n    names: !include country-names/ly.yaml\n    postcode: no\n\n\n# Morocco (Maroc ⵍⵎⵖⵔⵉⴱ المغرب)\nma:\n    partition: 23\n    languages: fr, zgh, ar\n    names: !include country-names/ma.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Monaco (Monaco)\nmc:\n    partition: 242\n    languages: fr\n    names: !include country-names/mc.yaml\n    postcode:\n      pattern: \"980dd\"\n\n\n# Moldova (Moldova)\nmd:\n    partition: 147\n    languages: ro, ru, uk\n    names: !include country-names/md.yaml\n    postcode:\n      pattern: \"(dddd)\"\n      output: MD-\\1\n\n\n# Montenegro (Crna Gora / Црна Гора)\nme:\n    partition: 180\n    languages: srp, sr, hr, bs, sq\n    names: !include country-names/me.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Madagascar (Madagasikara)\nmg:\n    partition: 164\n    languages: mg, fr\n    names: !include country-names/mg.yaml\n    postcode:\n      pattern: \"ddd\"\n\n\n# Marshall Islands (Ṃajeḷ)\nmh:\n    partition: 105\n    languages: en, mh\n    names: !include country-names/mh.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# North Macedonia (Северна Македонија)\nmk:\n    partition: 69\n    languages: mk\n    names: !include country-names/mk.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Mali (Mali)\nml:\n    partition: 241\n    languages: fr\n    names: !include country-names/ml.yaml\n    postcode: no\n\n\n# Myanmar (မြန်မာ)\nmm:\n    partition: 148\n    languages: my\n    names: !include country-names/mm.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Mongolia (Монгол улс ᠮᠤᠩᠭᠤᠯ ᠤᠯᠤᠰ)\nmn:\n    partition: 167\n    languages: mn\n    names: !include country-names/mn.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Mauritania (موريتانيا)\nmr:\n    partition: 149\n    languages: ar, fr\n    names: !include country-names/mr.yaml\n    postcode: no\n\n\n# Montserrat (Montserrat)\nms:\n    partition: 73\n    languages: en\n    names: !include country-names/ms.yaml\n\n\n# Malta (Malta)\nmt:\n    partition: 165\n    languages: mt, en\n    names: !include country-names/mt.yaml\n    postcode:\n      pattern: \"(lll) ?(dddd)\"\n      output: \\1 \\2\n\n\n# Mauritius (Mauritius)\nmu:\n    partition: 150\n    languages: mfe, fr, en\n    names: !include country-names/mu.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Maldives (ދިވެހިރާއްޖެ)\nmv:\n    partition: 96\n    languages: dv\n    names: !include country-names/mv.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Malawi (Malawi)\nmw:\n    partition: 97\n    languages: en, ny\n    names: !include country-names/mw.yaml\n    postcode: no\n\n\n# Mexico (México)\nmx:\n    partition: 166\n    languages: es\n    names: !include country-names/mx.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Malaysia (Malaysia)\nmy:\n    partition: 7\n    languages: ms\n    names: !include country-names/my.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Mozambique (Moçambique)\nmz:\n    partition: 98\n    languages: pt\n    names: !include country-names/mz.yaml\n    postcode:\n      pattern: \"(dddd)(?:-dd)?\"\n\n\n# Namibia (Namibia)\nna:\n    partition: 99\n    languages: en, sf, de\n    names: !include country-names/na.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Niger (Niger)\nne:\n    partition: 226\n    languages: fr\n    names: !include country-names/ne.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Nigeria (Nigeria)\nng:\n    partition: 218\n    languages: en\n    names: !include country-names/ng.yaml\n    postcode:\n      pattern: \"dddddd\"\n\n\n# Nicaragua (Nicaragua)\nni:\n    partition: 151\n    languages: es\n    names: !include country-names/ni.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Netherlands (Nederland)\nnl:\n    partition: 63\n    languages: nl\n    names: !include country-names/nl.yaml\n    postcode:\n      pattern: \"(dddd) ?(ll)\"\n      output: \\1 \\2\n      extent: 800\n\n\n# Norway (Norge)\n\"no\":\n    partition: 60\n    languages: nb, nn, no, se\n    names: !include country-names/no.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Nepal (Nepal)\nnp:\n    partition: 50\n    languages: ne\n    names: !include country-names/np.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Nauru (Naoero)\nnr:\n    partition: 70\n    languages: na, en\n    names: !include country-names/nr.yaml\n    postcode: no\n\n\n# Niue (Niuē)\nnu:\n    partition: 178\n    languages: niu, en\n    names: !include country-names/nu.yaml\n    postcode: no\n\n\n# New Zealand (New Zealand / Aotearoa)\nnz:\n    partition: 27\n    languages: mi, en\n    names: !include country-names/nz.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Oman (عمان)\nom:\n    partition: 137\n    languages: ar\n    names: !include country-names/om.yaml\n    postcode:\n      pattern: \"ddd\"\n\n\n# Panama (Panamá)\npa:\n    partition: 152\n    languages: es\n    names: !include country-names/pa.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Peru (Perú)\npe:\n    partition: 51\n    languages: es\n    names: !include country-names/pe.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Papua New Guinea (Papua Niugini)\npg:\n    partition: 71\n    languages: en, tpi, ho\n    names: !include country-names/pg.yaml\n    postcode:\n      pattern: \"ddd\"\n\n\n# Philippines (Philippines)\nph:\n    partition: 26\n    languages: en, tl\n    names: !include country-names/ph.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Pakistan (پاکستان)\npk:\n    partition: 14\n    languages: en, ur, pnb, sd, ps, bal\n    names: !include country-names/pk.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Poland (Polska)\npl:\n    partition: 168\n    languages: pl\n    names: !include country-names/pl.yaml\n    postcode:\n      pattern: \"(dd)[ -]?(ddd)\"\n      output: \\1-\\2\n\n\n# Pitcairn Islands (Pitcairn Islands)\npn:\n    partition: 113\n    languages: en, pih\n    names: !include country-names/pn.yaml\n    postcode:\n      pattern: \"(PCRN) ?(1ZZ)\"\n      output: \\1 \\2\n\n\n# Palestinian Territory (Palestinian Territory)\nps:\n    partition: 194\n    languages: ar, he\n    names: !include country-names/ps.yaml\n    postcode:\n      pattern: \"ddd\"\n\n\n# Portugal (Portugal)\npt:\n    partition: 34\n    languages: pt\n    names: !include country-names/pt.yaml\n    postcode:\n      pattern: \"dddd(?:-ddd)?\"\n      extent: 1000\n\n\n# Palau (Belau)\npw:\n    partition: 195\n    languages: en, pau, ja, sov, tox\n    names: !include country-names/pw.yaml\n    postcode:\n      pattern: \"969(39|40)\"\n\n\n# Paraguay (Paraguay)\npy:\n    partition: 101\n    languages: es, gn\n    names: !include country-names/py.yaml\n    postcode:\n      pattern: \"dddddd\"\n\n\n# Qatar (قطر)\nqa:\n    partition: 169\n    languages: ar\n    names: !include country-names/qa.yaml\n    postcode: no\n\n\n# Romania (România)\nro:\n    partition: 170\n    languages: ro\n    names: !include country-names/ro.yaml\n    postcode:\n      pattern: \"dddddd\"\n      extent: 2500\n\n\n# Serbia (Србија)\nrs:\n    partition: 59\n    languages: sr\n    names: !include country-names/rs.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Russia (Россия)\nru:\n    partition: 135\n    languages: ru\n    names: !include country-names/ru.yaml\n    postcode:\n      pattern: \"dddddd\"\n\n\n# Rwanda (Rwanda)\nrw:\n    partition: 102\n    languages: rw, fr, en\n    names: !include country-names/rw.yaml\n    postcode: no\n\n\n# Saudi Arabia (السعودية)\nsa:\n    partition: 52\n    languages: ar\n    names: !include country-names/sa.yaml\n    postcode:\n      pattern: \"ddddd(?:-dddd)?\"\n\n\n# Solomon Islands (Solomon Islands)\nsb:\n    partition: 201\n    languages: en\n    names: !include country-names/sb.yaml\n    postcode: no\n\n\n# Seychelles (Sesel)\nsc:\n    partition: 79\n    languages: fr, en, crs\n    names: !include country-names/sc.yaml\n    postcode: no\n\n\n# Sudan (السودان)\nsd:\n    partition: 72\n    languages: ar, en\n    names: !include country-names/sd.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Sweden (Sverige)\nse:\n    partition: 112\n    languages: sv\n    names: !include country-names/se.yaml\n    postcode:\n      pattern: \"(ddd) ?(dd)\"\n      output: \\1 \\2\n\n\n# Singapore (Singapore)\nsg:\n    partition: 115\n    languages: zh-hans, en, ms, ta\n    names: !include country-names/sg.yaml\n    postcode:\n      pattern: \"dddddd\"\n\n\n# Saint Helena, Ascension and Tristan da Cunha (Saint Helena, Ascension and Tristan da Cunha)\nsh:\n    partition: 196\n    languages: en\n    names: !include country-names/sh.yaml\n    postcode:\n      pattern: \"(ASCN|STHL|TDCU) ?(1ZZ)\"\n      output: \\1 \\2\n\n\n# Slovenia (Slovenija)\nsi:\n    partition: 36\n    languages: sl\n    names: !include country-names/si.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Slovakia (Slovensko)\nsk:\n    partition: 172\n    languages: sk\n    names: !include country-names/sk.yaml\n    postcode:\n      pattern: \"(ddd) ?(dd)\"\n      output: \\1 \\2\n\n\n# Sierra Leone (Sierra Leone)\nsl:\n    partition: 219\n    languages: en\n    names: !include country-names/sl.yaml\n    postcode: no\n\n\n# San Marino (San Marino)\nsm:\n    partition: 153\n    languages: it\n    names: !include country-names/sm.yaml\n    postcode:\n      pattern: \"4789d\"\n\n\n# Senegal (Sénégal)\nsn:\n    partition: 237\n    languages: fr\n    names: !include country-names/sn.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Somalia (Soomaaliya الصومال)\nso:\n    partition: 154\n    languages: so, ar\n    names: !include country-names/so.yaml\n    postcode:\n      pattern: \"(ll) ?(ddddd)\"\n      output: \\1 \\2\n\n\n# Suriname (Suriname)\nsr:\n    partition: 24\n    languages: nl\n    names: !include country-names/sr.yaml\n    postcode: no\n\n\n# South Sudan (South Sudan)\nss:\n    partition: 247\n    languages: en\n    names: !include country-names/ss.yaml\n    postcode: no\n\n\n# São Tomé and Príncipe (São Tomé e Príncipe)\nst:\n    partition: 53\n    languages: pt\n    names: !include country-names/st.yaml\n    postcode: no\n\n\n# El Salvador (El Salvador)\nsv:\n    partition: 103\n    languages: es\n    names: !include country-names/sv.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Syria (سوريا)\nsy:\n    partition: 104\n    languages: ar\n    names: !include country-names/sy.yaml\n    postcode: no\n\n\n# Eswatini (eSwatini)\nsz:\n    partition: 82\n    languages: en, ss\n    names: !include country-names/sz.yaml\n    postcode:\n      pattern: \"lddd\"\n\n\n# Turks and Caicos Islands (Turks and Caicos Islands)\ntc:\n    partition: 106\n    languages: en\n    names: !include country-names/tc.yaml\n    postcode:\n      pattern: \"(TKCA) ?(1ZZ)\"\n      output: \\1 \\2\n\n\n# Chad (Tchad تشاد)\ntd:\n    partition: 68\n    languages: fr, ar\n    names: !include country-names/td.yaml\n    postcode: no\n\n\n# Togo (Togo)\ntg:\n    partition: 243\n    languages: fr\n    names: !include country-names/tg.yaml\n    postcode: no\n\n\n# Thailand (ประเทศไทย)\nth:\n    partition: 32\n    languages: th\n    names: !include country-names/th.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Tajikistan (Тоҷикистон)\ntj:\n    partition: 129\n    languages: tg, ru\n    names: !include country-names/tj.yaml\n    postcode:\n      pattern: \"dddddd\"\n\n\n# Tokelau (Tokelau)\ntk:\n    partition: 179\n    languages: tkl, en, sm\n    names: !include country-names/tk.yaml\n    postcode: no\n\n\n# East Timor (Timór Lorosa'e)\ntl:\n    partition: 161\n    languages: pt, tet\n    names: !include country-names/tl.yaml\n    postcode: no\n\n\n# Turkmenistan (Türkmenistan)\ntm:\n    partition: 54\n    languages: tk\n    names: !include country-names/tm.yaml\n    postcode:\n      pattern: \"dddddd\"\n\n\n# Tunisia (تونس)\ntn:\n    partition: 18\n    languages: ar, fr\n    names: !include country-names/tn.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Tonga (Tonga)\nto:\n    partition: 220\n    languages: en\n    names: !include country-names/to.yaml\n    postcode: no\n\n\n# Turkey (Türkiye)\ntr:\n    partition: 81\n    languages: tr\n    names: !include country-names/tr.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Trinidad and Tobago (Trinidad and Tobago)\ntt:\n    partition: 221\n    languages: en\n    names: !include country-names/tt.yaml\n    postcode:\n      pattern: \"dddddd\"\n\n\n# Tuvalu (Tuvalu)\ntv:\n    partition: 156\n    languages: en\n    names: !include country-names/tv.yaml\n    postcode: no\n\n\n# Taiwan (臺灣)\ntw:\n    partition: 25\n    languages: zh-hant\n    names: !include country-names/tw.yaml\n    postcode:\n      pattern: \"ddd(?:ddd?)?\"\n\n\n# Tanzania (Tanzania)\ntz:\n    partition: 130\n    languages: sw, en\n    names: !include country-names/tz.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Ukraine (Україна)\nua:\n    partition: 173\n    languages: uk\n    names: !include country-names/ua.yaml\n    postcode:\n      pattern: \"d?ddddd\"\n\n\n# Uganda (Uganda)\nug:\n    partition: 155\n    languages: en, sw\n    names: !include country-names/ug.yaml\n    postcode: no\n\n\n# United States (United States)\nus:\n    partition: 2\n    languages: en\n    names: !include country-names/us.yaml\n    postcode:\n      pattern: \"(ddddd)(?:-dddd)?\"\n      output: \\1\n\n\n# Uruguay (Uruguay)\nuy:\n    partition: 174\n    languages: es\n    names: !include country-names/uy.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Uzbekistan (Oʻzbekiston)\nuz:\n    partition: 157\n    languages: uz, kaa\n    names: !include country-names/uz.yaml\n    postcode:\n      pattern: \"dddddd\"\n\n\n# Vatican City (Civitas Vaticana)\nva:\n    partition: 107\n    languages: it\n    names: !include country-names/va.yaml\n    postcode:\n      pattern: \"00120\"\n\n\n# Saint Vincent and the Grenadines (Saint Vincent and the Grenadines)\nvc:\n    partition: 171\n    languages: en\n    names: !include country-names/vc.yaml\n    postcode:\n      pattern: \"(dddd)\"\n      output: VC\\1\n\n\n# Venezuela (Venezuela)\nve:\n    partition: 108\n    languages: es\n    names: !include country-names/ve.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# British Virgin Islands (British Virgin Islands)\nvg:\n    partition: 109\n    languages: en\n    names: !include country-names/vg.yaml\n    postcode:\n      pattern: \"(dddd)\"\n      output: VG\\1\n\n\n# Vietnam (Việt Nam)\nvn:\n    partition: 75\n    languages: vi\n    names: !include country-names/vn.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Vanuatu (Vanuatu)\nvu:\n    partition: 116\n    languages: bi, en, fr\n    names: !include country-names/vu.yaml\n    postcode: no\n\n\n# Samoa (Sāmoa)\nws:\n    partition: 131\n    languages: sm, en\n    names: !include country-names/ws.yaml\n\n\n# Kosovo (Kosova / Kosovo)\nxk:\n    partition: 59\n    languages: sq, sr\n    names: !include country-names/xk.yaml\n    postcode:\n      pattern: \"ddddd\"\n\n\n# Yemen (اليمن)\nye:\n    partition: 55\n    languages: ar\n    names: !include country-names/ye.yaml\n    postcode: no\n\n\n# South Africa (South Africa)\nza:\n    partition: 76\n    languages: en, af, st, tn, xh, zu\n    names: !include country-names/za.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Zambia (Zambia)\nzm:\n    partition: 222\n    languages: en\n    names: !include country-names/zm.yaml\n    postcode:\n      pattern: \"dddd\"\n\n\n# Zimbabwe (Zimbabwe)\nzw:\n    partition: 223\n    languages: en, sn, nd\n    names: !include country-names/zw.yaml\n    postcode: no\n"
  },
  {
    "path": "settings/env.defaults",
    "content": "# .env\n# Default configuration settings for Nominatim.\n# This file uses the dotenv format.\n\n# Database connection string.\n# Add host, port, user etc through additional semicolon-separated attributes.\n# e.g. ;host=...;port=...;user=...;password=...\nNOMINATIM_DATABASE_DSN=\"pgsql:dbname=nominatim\"\n\n# Database web user.\n# Nominatim sets up read-only access for this user during installation.\nNOMINATIM_DATABASE_WEBUSER=\"www-data\"\n\n# Tokenizer used for normalizing and parsing queries and names.\n# The tokenizer is set up during import and cannot be changed afterwards\n# without a reimport.\n# Currently available tokenizers: icu, legacy\nNOMINATIM_TOKENIZER=\"icu\"\n\n# If true, admin level changes on places with many contained children are blocked.\nNOMINATIM_LIMIT_REINDEXING=yes\n\n# Restrict search languages.\n# Normally Nominatim will include all language variants of name:XX\n# in the search index. Set this to a comma separated list of language\n# codes, to restrict import to a subset of languages.\n# Currently only affects the initial import of country names and special phrases.\nNOMINATIM_LANGUAGES=\n\n# Configuration file for the tokenizer.\n# The content depends on the tokenizer used. If left empty the default settings\n# for the chosen tokenizer will be used. The configuration can only be set\n# on import and not be changed afterwards.\nNOMINATIM_TOKENIZER_CONFIG=\n\n# Search in the Tiger house number data for the US.\n# Note: The tables must already exist or queries will throw errors.\n# Changing this value requires to run ./utils/setup --create-functions.\nNOMINATIM_USE_US_TIGER_DATA=no\n\n# Location of the osm2pgsql binary.\n# EXPERT ONLY. You should usually use the supplied osm2pgsql.\nNOMINATIM_OSM2PGSQL_BINARY=\n\n# Directory where to find pre-computed Wikipedia importance files.\n# When unset, the data is expected to be located in the project directory.\nNOMINATIM_WIKIPEDIA_DATA_PATH=\n\n# Configuration file for rank assignments.\nNOMINATIM_ADDRESS_LEVEL_CONFIG=address-levels.json\n\n# Configuration file for OSM data import.\n# This may either be the name of one of an internal style or point\n# to a file with a custom style.\n# Internal styles are: admin, street, address, full, extratags\nNOMINATIM_IMPORT_STYLE=extratags\n\n# Location of the flatnode file used by osm2pgsql to store node locations.\n# When unset, osm2pgsql stores the location in the PostgreSQL database. This\n# is especially useful for imports of larger areas, like continents or the\n# full planet. The file needs at least 100GB storage.\nNOMINATIM_FLATNODE_FILE=\n\n### Tablespace settings\n#\n# The following settings allow to move parts of the database tables into\n# different tablespaces. This is especially interesting if you have disks\n# with different speeds. When unset, the default tablespace is used.\n# Only has an effect during import.\n\n# Tablespace used for tables used when searching.\nNOMINATIM_TABLESPACE_SEARCH_DATA=\n# Tablespace used for indexes used when searching.\nNOMINATIM_TABLESPACE_SEARCH_INDEX=\n\n# Tablespace used for the OSM data cache tables. Used for import and update only.\nNOMINATIM_TABLESPACE_OSM_DATA=\n# Tablespace used for the OSM data cache indexes. Used for import and update only.\nNOMINATIM_TABLESPACE_OSM_INDEX=\n\n# Tablespace used for place import table. Used for import and update only.\nNOMINATIM_TABLESPACE_PLACE_DATA=\n# Tablespace used for place import indexes. Used for import and update only.\nNOMINATIM_TABLESPACE_PLACE_INDEX=\n\n# Tablespace for tables used during address computation. Used for import and update only.\nNOMINATIM_TABLESPACE_ADDRESS_DATA=\n# Tablespace for indexes used during address computation. Used for import and update only.\nNOMINATIM_TABLESPACE_ADDRESS_INDEX=\n\n# Tablespace for tables for auxiliary data, e.g. TIGER data, postcodes.\nNOMINATIM_TABLESPACE_AUX_DATA=\n# Tablespace for indexes for auxiliary data, e.g. TIGER data, postcodes.\nNOMINATIM_TABLESPACE_AUX_INDEX=\n\n\n### Replication settings\n#\n# The following settings control where and how updates for the database are\n# retrieved.\n#\n\n#\n# Base URL of replication service.\n# A replication service provides change files of OSM data at regular intervals.\n# These are used to keep the database up to date. Per default it points to\n# the minutely updates for the main OSM database. There are other services\n# geared towards larger update intervals or data extracts.\n# Changing this value requires to rerun 'nominatim replication --init'.\nNOMINATIM_REPLICATION_URL=\"https://planet.openstreetmap.org/replication/minute\"\n\n# Maximum amount of data to download per batch.\n# Size is in MB.\nNOMINATIM_REPLICATION_MAX_DIFF=50\n\n# Publication interval of the replication service (in seconds).\n# Determines when Nominatim will attempt again to download again a new\n# update. The time is computed from the publication date of the last diff\n# downloaded. Setting this to a slightly higher value than the actual\n# publication interval avoids unnecessary rechecks.\nNOMINATIM_REPLICATION_UPDATE_INTERVAL=75\n\n# Wait time to recheck for a pending update (in seconds).\n# Time to wait after an expected update was not available on the server.\nNOMINATIM_REPLICATION_RECHECK_INTERVAL=60\n\n### API settings\n#\n# The following settings configure the API responses.\n\n# Send permissive CORS access headers.\n# When enabled, send CORS headers to allow access to everybody.\nNOMINATIM_CORS_NOACCESSCONTROL=yes\n\n# URL for static icon images.\n# Set this to the /mapicon directory of your nominatim-ui to enable returning\n# icon URLs with the results.\nNOMINATIM_MAPICON_URL=\n\n# Language to assume when no particular language is requested.\n# When unset, the local language (i.e. the name tag without suffix) will be used.\nNOMINATIM_DEFAULT_LANGUAGE=\n\n# Maximum number of OSM ids accepted by /lookup.\nNOMINATIM_LOOKUP_MAX_COUNT=50\n\n# Number of different geometry formats that may be queried in parallel.\n# Set to zero to disable polygon output.\nNOMINATIM_POLYGON_OUTPUT_MAX_TYPES=1\n\n# Offer backwards compatible PHP URLs.\n# When running one of the Python enignes, they will add endpoint aliases\n# under <endpoint>.php\nNOMINATIM_SERVE_LEGACY_URLS=yes\n\n# Maximum number of DB connections a single API object can use.\n# When running Nominatim as a server, then this is the maximum number\n# of connections _per worker_.\nNOMINATIM_API_POOL_SIZE=5\n\n# Timeout is seconds after which a single query to the database is cancelled.\n# The caller receives a TimeoutError (or HTTP 503), when a query times out.\n# When empty, then timeouts are disabled.\nNOMINATIM_QUERY_TIMEOUT=10\n\n# Maximum time a single request is allowed to take. If the timeout is exceeded\n# before the request is able to obtain a database connection from the\n# connection pool, a TimeoutError (or HTTP 503) is thrown. If the timeout\n# is exceeded while the search is ongoing, all results already found will\n# be returned.\n# When empty, then timeouts are disabled.\nNOMINATIM_REQUEST_TIMEOUT=60\n\n# Search elements just within countries\n# If, despite not finding a point within the static grid of countries, it\n# finds a geometry of a region, do not return the geometry. Return \"Unable\n# to geocode\" instead.\nNOMINATIM_SEARCH_WITHIN_COUNTRIES=False\n\n# Specifies the order in which different name tags are used.\n# The values in this list determine the preferred order of name variants,\n# including language-specific names.\n# Comma-separated list, where :XX stands for language-specific tags\n# (e.g. name:en) and no :XX stands for general tags (e.g. name).\nNOMINATIM_OUTPUT_NAMES=name:XX,name,brand,official_name:XX,short_name:XX,official_name,short_name,ref\n\n### Log settings\n#\n# The following options allow to enable logging of API requests.\n#\n# Enable logging of requests into a file.\n# To enable logging set this setting to the file to log to.\nNOMINATIM_LOG_FILE=\n\n# Set the output format of the query log.\n# This is a string following the Python String Format syntax,\n# see https://docs.python.org/3/library/string.html#formatstrings.\n# For possible replacement values, see the full documentation at\n# https://nominatim.org/release-docs/latest/customize/Settings/\nNOMINATIM_LOG_FORMAT='[{start}] {total_time:.4f} {results_total} {endpoint} \"{query_string}\"'\n\n# Echo raw SQL from SQLAlchemy statements.\n# EXPERT: Works only in command line/library use.\nNOMINATIM_DEBUG_SQL=no\n"
  },
  {
    "path": "settings/icu-rules/extended-unicode-to-asccii.yaml",
    "content": "- \"'ł' > 'l'\"\n- \"'ª' > 'a'\"\n- \"'µ' > 'u'\"\n- \"'º' > 'o'\"\n- \"'Ƅ' > '6'\"\n- \"'ƅ' > '6'\"\n- \"'Ɔ' > 'o'\"\n- \"'ƍ' > 'd'\"\n- \"'Ǝ' > '3'\"\n- \"'Ɣ' > 'g'\"\n- \"'ƛ' > 'l'\"\n- \"'Ɯ' > 'w'\"\n- \"'Ɵ' > 'o'\"\n- \"'Ʀ' > 'yr'\"\n- \"'Ƨ' > '2'\"\n- \"'ƨ' > '2'\"\n- \"'Ʃ' > 'sh'\"\n- \"'ƪ' > 'sh'\"\n- \"'Ʊ' > 'y'\"\n- \"'Ʒ' > 'zh'\"\n- \"'Ƹ' > 'zh'\"\n- \"'ƹ' > 'zh'\"\n- \"'ƺ' > 'zh'\"\n- \"'ƻ' > '2'\"\n- \"'Ƽ' > '5'\"\n- \"'ƽ' > '5'\"\n- \"'ƾ' > 'ts'\"\n- \"'ƿ' > 'w'\"\n- \"'Ƕ' > 'hv'\"\n- \"'Ƿ' > 'w'\"\n- \"'Ȝ' > 'y'\"\n- \"'ȝ' > 'y'\"\n- \"'Ƞ' > 'n'\"\n- \"'Ȣ' > 'ou'\"\n- \"'ȣ' > 'ou'\"\n- \"'Ʌ' > 'v'\"\n- \"'Ɋ' > 'q'\"\n- \"'ɋ' > 'q'\"\n- \"'ɐ' > 'a'\"\n- \"'ɑ' > 'a'\"\n- \"'ɒ' > 'a'\"\n- \"'ɔ' > 'o'\"\n- \"'ɘ' > 'e'\"\n- \"'ɜ' > 'e'\"\n- \"'ɝ' > 'e'\"\n- \"'ɞ' > 'e'\"\n- \"'ɣ' > 'g'\"\n- \"'ɤ' > 'u'\"\n- \"'ɥ' > 'y'\"\n- \"'ɩ' > 'i'\"\n- \"'ɮ' > 'lz'\"\n- \"'ɯ' > 'w'\"\n- \"'ɰ' > 'w'\"\n- \"'ɵ' > 'o'\"\n- \"'ɷ' > 'o'\"\n- \"'ɸ' > 'f'\"\n- \"'ɹ' > 'r'\"\n- \"'ɺ' > 'r'\"\n- \"'ɻ' > 'r'\"\n- \"'ɿ' > 'r'\"\n- \"'ʁ' > 'r'\"\n- \"'ʃ' > 's'\"\n- \"'ʄ' > 'j'\"\n- \"'ʅ' > 's'\"\n- \"'ʆ' > 's'\"\n- \"'ʇ' > 't'\"\n- \"'ʊ' > 'u'\"\n- \"'ʍ' > 'w'\"\n- \"'ʎ' > 'y'\"\n- \"'ʒ' > 'z'\"\n- \"'ʓ' > 'z'\"\n- \"'ʗ' > 'c'\"\n- \"'ʚ' > 'e'\"\n- \"'ʞ' > 'k'\"\n- \"'ʤ' > 'dz'\"\n- \"'ʧ' > 'ts'\"\n- \"'ʨ' > 'tc'\"\n- \"'ʩ' > 'fn'\"\n- \"'ʬ' > 'ww'\"\n- \"'ʮ' > 'h'\"\n- \"'ʯ' > 'h'\"\n- \"'ʰ' > 'k'\"\n- \"'ʱ' > 'h'\"\n- \"'ʲ' > 'j'\"\n- \"'ʳ' > 'r'\"\n- \"'ʴ' > 'r'\"\n- \"'ʵ' > 'r'\"\n- \"'ʶ' > 'r'\"\n- \"'ʷ' > 'w'\"\n- \"'ʸ' > 'y'\"\n- \"'ˇ' > 'v'\"\n- \"'ˉ' > ' '\"\n- \"'ˊ' > ' '\"\n- \"'ˌ' > ' '\"\n- \"'ˎ' > ' '\"\n- \"'ˏ' > ' '\"\n- \"'ˑ' > ' '\"\n- \"'ˠ' > 'g'\"\n- \"'ˡ' > 'l'\"\n- \"'ˢ' > 's'\"\n- \"'ˣ' > 'x'\"\n- \"'ˬ' > 'v'\"\n- \"'Ͱ' > 'heta'\"\n- \"'ͱ' > 'heta'\"\n- \"'Ͳ' > 'sampi'\"\n- \"'ͳ' > 'sampi'\"\n- \"'ϗ' > ' '\"\n- \"'Ϙ' > 'koppa'\"\n- \"'ϙ' > 'koppa'\"\n- \"'Ϛ' > 'st'\"\n- \"'ϛ' > 'st'\"\n- \"'Ϝ' > 'w'\"\n- \"'ϝ' > 'w'\"\n- \"'Ϟ' > 'q'\"\n- \"'ϟ' > 'q'\"\n- \"'Ϡ' > 'sp'\"\n- \"'ϡ' > 'sp'\"\n- \"'Ϣ' > 'sh'\"\n- \"'ϣ' > 'sh'\"\n- \"'Ϥ' > 'f'\"\n- \"'ϥ' > 'f'\"\n- \"'Ϧ' > 'kh'\"\n- \"'ϧ' > 'kh'\"\n- \"'Ϩ' > 'h'\"\n- \"'ϩ' > 'h'\"\n- \"'Ϫ' > 'g'\"\n- \"'ϫ' > 'g'\"\n- \"'Ϭ' > 'ch'\"\n- \"'ϭ' > 'ch'\"\n- \"'Ϯ' > 'ti'\"\n- \"'ϯ' > 'ti'\"\n- \"'Ѡ' > 'o'\"\n- \"'ѡ' > 'o'\"\n- \"'Ѣ' > 'e'\"\n- \"'ѣ' > 'e'\"\n- \"'Ѥ' > 'ie'\"\n- \"'ѥ' > 'ie'\"\n- \"'Ѧ' > 'e'\"\n- \"'ѧ' > 'e'\"\n- \"'Ѩ' > 'ie'\"\n- \"'ѩ' > 'ie'\"\n- \"'Ѫ' > 'o'\"\n- \"'ѫ' > 'o'\"\n- \"'Ѭ' > 'io'\"\n- \"'ѭ' > 'io'\"\n- \"'Ѯ' > 'ks'\"\n- \"'ѯ' > 'ks'\"\n- \"'Ѱ' > 'ps'\"\n- \"'ѱ' > 'ps'\"\n- \"'Ѳ' > 'f'\"\n- \"'ѳ' > 'f'\"\n- \"'Ѵ' > 'y'\"\n- \"'ѵ' > 'y'\"\n- \"'Ѷ' > 'y'\"\n- \"'ѷ' > 'y'\"\n- \"'Ѹ' > 'u'\"\n- \"'ѹ' > 'u'\"\n- \"'Ѻ' > 'o'\"\n- \"'ѻ' > 'o'\"\n- \"'Ѽ' > 'o'\"\n- \"'ѽ' > 'o'\"\n- \"'Ѿ' > 'ot'\"\n- \"'ѿ' > 'ot'\"\n- \"'Ҁ' > 'q'\"\n- \"'ҁ' > 'q'\"\n- \"'Ҋ' > 'i'\"\n- \"'ҋ' > 'i'\"\n- \"'Ҏ' > 'r'\"\n- \"'ҏ' > 'r'\"\n- \"'Җ' > 'zh'\"\n- \"'җ' > 'zh'\"\n- \"'Ҝ' > 'k'\"\n- \"'ҝ' > 'k'\"\n- \"'Ҟ' > 'k'\"\n- \"'ҟ' > 'k'\"\n- \"'Ҡ' > 'k'\"\n- \"'ҡ' > 'k'\"\n- \"'Ң' > 'n'\"\n- \"'ң' > 'n'\"\n- \"'Ҥ' > 'ng'\"\n- \"'ҥ' > 'ng'\"\n- \"'Ҧ' > 'p'\"\n- \"'ҧ' > 'p'\"\n- \"'Ҩ' > 'kh'\"\n- \"'ҩ' > 'kh'\"\n- \"'Ҫ' > 's'\"\n- \"'ҫ' > 's'\"\n- \"'Ҭ' > 't'\"\n- \"'ҭ' > 't'\"\n- \"'Ү' > 'u'\"\n- \"'ү' > 'u'\"\n- \"'Ұ' > 'u'\"\n- \"'ұ' > 'u'\"\n- \"'Ҳ' > 'kh'\"\n- \"'ҳ' > 'kh'\"\n- \"'Ҵ' > 'tts'\"\n- \"'ҵ' > 'tts'\"\n- \"'Ҷ' > 'ch'\"\n- \"'ҷ' > 'ch'\"\n- \"'Ҹ' > 'ch'\"\n- \"'ҹ' > 'ch'\"\n- \"'Һ' > 'h'\"\n- \"'һ' > 'h'\"\n- \"'Ҽ' > 'ch'\"\n- \"'ҽ' > 'ch'\"\n- \"'Ҿ' > 'ch'\"\n- \"'ҿ' > 'ch'\"\n- \"'Ӄ' > 'k'\"\n- \"'ӄ' > 'k'\"\n- \"'Ӆ' > 'el'\"\n- \"'ӆ' > 'el'\"\n- \"'Ӈ' > 'n'\"\n- \"'ӈ' > 'n'\"\n- \"'Ӊ' > 'en'\"\n- \"'ӊ' > 'en'\"\n- \"'Ӌ' > 'ch'\"\n- \"'ӌ' > 'ch'\"\n- \"'Ӎ' > 'em'\"\n- \"'ӎ' > 'em'\"\n- \"'ӏ' > 'palochka'\"\n- \"'Ӡ' > 'dz'\"\n- \"'ӡ' > 'dz'\"\n- \"'Ө' > 'o'\"\n- \"'ө' > 'o'\"\n- \"'Ӫ' > 'o'\"\n- \"'ӫ' > 'o'\"\n- \"'Ӷ' > 'ghe'\"\n- \"'ӷ' > 'ghe'\"\n- \"'Ӻ' > 'ghe'\"\n- \"'ӻ' > 'ghe'\"\n- \"'Ӽ' > 'ha'\"\n- \"'ӽ' > 'ha'\"\n- \"'Ӿ' > 'ha'\"\n- \"'ӿ' > 'ha'\"\n- \"'Ԁ' > 'de'\"\n- \"'ԁ' > 'de'\"\n- \"'Ԃ' > 'dje'\"\n- \"'ԃ' > 'dje'\"\n- \"'Ԅ' > 'zje'\"\n- \"'ԅ' > 'zje'\"\n- \"'Ԇ' > 'dzje'\"\n- \"'ԇ' > 'dzje'\"\n- \"'Ԉ' > 'lje'\"\n- \"'ԉ' > 'lje'\"\n- \"'Ԋ' > 'nje'\"\n- \"'ԋ' > 'nje'\"\n- \"'Ԍ' > 'sje'\"\n- \"'ԍ' > 'sje'\"\n- \"'Ԏ' > 'tje'\"\n- \"'ԏ' > 'tje'\"\n- \"'Ԑ' > 'ze'\"\n- \"'ԑ' > 'ze'\"\n- \"'Ԓ' > 'el'\"\n- \"'ԓ' > 'el'\"\n- \"'Ԕ' > 'lha'\"\n- \"'ԕ' > 'lha'\"\n- \"'Ԗ' > 'rha'\"\n- \"'ԗ' > 'rha'\"\n- \"'Ԙ' > 'yae'\"\n- \"'ԙ' > 'yae'\"\n- \"'Ԛ' > 'qa'\"\n- \"'ԛ' > 'qa'\"\n- \"'Ԝ' > 'we'\"\n- \"'ԝ' > 'we'\"\n- \"'Ԟ' > 'aleut'\"\n- \"'ԟ' > 'aleut'\"\n- \"'Ԡ' > 'el'\"\n- \"'ԡ' > 'el'\"\n- \"'Ԣ' > 'en'\"\n- \"'ԣ' > 'en'\"\n- \"'ՙ' > 'left'\"\n- \"'ػ' > 'keheh'\"\n- \"'ؼ' > 'keheh'\"\n- \"'ٮ' > 'beh'\"\n- \"'ٯ' > 'qaf'\"\n- \"'ٱ' > 'alef'\"\n- \"'ٲ' > 'alef'\"\n- \"'ٳ' > 'alef'\"\n- \"'ٴ' > 'high'\"\n- \"'ٹ' > 'tt'\"\n- \"'ٺ' > 'tth'\"\n- \"'ٻ' > 'b'\"\n- \"'ټ' > 't'\"\n- \"'ٽ' > 't'\"\n- \"'ٿ' > 'th'\"\n- \"'ڀ' > 'bh'\"\n- \"'ځ' > 'hah'\"\n- \"'ڂ' > 'h'\"\n- \"'ڃ' > 'ny'\"\n- \"'ڄ' > 'dy'\"\n- \"'څ' > 'h'\"\n- \"'ڇ' > 'cch'\"\n- \"'ڈ' > 'dd'\"\n- \"'ډ' > 'd'\"\n- \"'ڊ' > 'd'\"\n- \"'ڋ' > 'dt'\"\n- \"'ڌ' > 'dh'\"\n- \"'ڍ' > 'ddh'\"\n- \"'ڎ' > 'd'\"\n- \"'ڏ' > 'd'\"\n- \"'ڐ' > 'd'\"\n- \"'ڑ' > 'rr'\"\n- \"'ڒ' > 'r'\"\n- \"'ړ' > 'r'\"\n- \"'ڔ' > 'r'\"\n- \"'ڕ' > 'r'\"\n- \"'ږ' > 'r'\"\n- \"'ڗ' > 'r'\"\n- \"'ڙ' > 'r'\"\n- \"'ڛ' > 's'\"\n- \"'ڜ' > 's'\"\n- \"'ڝ' > 's'\"\n- \"'ڞ' > 's'\"\n- \"'ڟ' > 't'\"\n- \"'ڠ' > 'gh'\"\n- \"'ڡ' > 'f'\"\n- \"'ڢ' > 'f'\"\n- \"'ڣ' > 'f'\"\n- \"'ڥ' > 'f'\"\n- \"'ڦ' > 'ph'\"\n- \"'ڧ' > 'q'\"\n- \"'ڨ' > 'q'\"\n- \"'ڪ' > 'k'\"\n- \"'ګ' > 'k'\"\n- \"'ڬ' > 'k'\"\n- \"'ڮ' > 'k'\"\n- \"'ڰ' > 'g'\"\n- \"'ڱ' > 'n'\"\n- \"'ڲ' > 'g'\"\n- \"'ڳ' > 'g'\"\n- \"'ڴ' > 'g'\"\n- \"'ڵ' > 'l'\"\n- \"'ڶ' > 'l'\"\n- \"'ڷ' > 'l'\"\n- \"'ڸ' > 'l'\"\n- \"'ڹ' > 'n'\"\n- \"'ں' > 'n'\"\n- \"'ڻ' > 'n'\"\n- \"'ڼ' > 'n'\"\n- \"'ڽ' > 'n'\"\n- \"'ھ' > 'h'\"\n- \"'ڿ' > 'ch'\"\n- \"'ہ' > 'h'\"\n- \"'ۃ' > 'teh'\"\n- \"'ۄ' > 'w'\"\n- \"'ۅ' > 'oe'\"\n- \"'ۆ' > 'oe'\"\n- \"'ۇ' > 'u'\"\n- \"'ۈ' > 'yu'\"\n- \"'ۉ' > 'yu'\"\n- \"'ۊ' > 'w'\"\n- \"'ۍ' > 'y'\"\n- \"'ێ' > 'y'\"\n- \"'ۏ' > 'w'\"\n- \"'ې' > 'e'\"\n- \"'ۑ' > 'yeh'\"\n- \"'ے' > 'y'\"\n- \"'ە' > 'ae'\"\n- \"'ۮ' > 'dal'\"\n- \"'ۯ' > 'reh'\"\n- \"'ۺ' > 'sh'\"\n- \"'ۻ' > 'd'\"\n- \"'ۼ' > 'gh'\"\n- \"'ۿ' > 'heh'\"\n- \"'ݐ' > 'beh'\"\n- \"'ݑ' > 'beh'\"\n- \"'ݒ' > 'beh'\"\n- \"'ݓ' > 'beh'\"\n- \"'ݔ' > 'beh'\"\n- \"'ݕ' > 'beh'\"\n- \"'ݖ' > 'beh'\"\n- \"'ݗ' > 'hah'\"\n- \"'ݘ' > 'hah'\"\n- \"'ݙ' > 'dal'\"\n- \"'ݚ' > 'dal'\"\n- \"'ݛ' > 'reh'\"\n- \"'ݜ' > 'seen'\"\n- \"'ݝ' > 'ain'\"\n- \"'ݞ' > 'ain'\"\n- \"'ݟ' > 'ain'\"\n- \"'ݠ' > 'feh'\"\n- \"'ݡ' > 'feh'\"\n- \"'ݢ' > 'keheh'\"\n- \"'ݣ' > 'keheh'\"\n- \"'ݤ' > 'keheh'\"\n- \"'ݥ' > 'meem'\"\n- \"'ݦ' > 'meem'\"\n- \"'ݧ' > 'noon'\"\n- \"'ݨ' > 'noon'\"\n- \"'ݩ' > 'noon'\"\n- \"'ݪ' > 'lam'\"\n- \"'ݫ' > 'reh'\"\n- \"'ݬ' > 'reh'\"\n- \"'ݭ' > 'seen'\"\n- \"'ݮ' > 'hah'\"\n- \"'ݯ' > 'hah'\"\n- \"'ݰ' > 'seen'\"\n- \"'ݱ' > 'reh'\"\n- \"'ݲ' > 'hah'\"\n- \"'ݳ' > 'alef'\"\n- \"'ݴ' > 'alef'\"\n- \"'ݸ' > 'waw'\"\n- \"'ݹ' > 'waw'\"\n- \"'ݺ' > 'yeh'\"\n- \"'ݻ' > 'yeh'\"\n- \"'ݼ' > 'hah'\"\n- \"'ݽ' > 'seen'\"\n- \"'ݾ' > 'seen'\"\n- \"'ݿ' > 'kaf'\"\n- \"'ޜ' > 'z'\"\n- \"'ޡ' > 'z'\"\n- \"'ޥ' > 'w'\"\n- \"'ޱ' > 'naa'\"\n- \"'ߊ' > 'a'\"\n- \"'ߋ' > 'ee'\"\n- \"'ߌ' > 'i'\"\n- \"'ߍ' > 'e'\"\n- \"'ߎ' > 'u'\"\n- \"'ߏ' > 'oo'\"\n- \"'ߐ' > 'o'\"\n- \"'ߑ' > 'dagbasinna'\"\n- \"'ߒ' > 'n'\"\n- \"'ߓ' > 'ba'\"\n- \"'ߔ' > 'pa'\"\n- \"'ߕ' > 'ta'\"\n- \"'ߖ' > 'ja'\"\n- \"'ߗ' > 'cha'\"\n- \"'ߘ' > 'da'\"\n- \"'ߙ' > 'ra'\"\n- \"'ߚ' > 'rra'\"\n- \"'ߛ' > 'sa'\"\n- \"'ߜ' > 'gba'\"\n- \"'ߝ' > 'fa'\"\n- \"'ߞ' > 'ka'\"\n- \"'ߟ' > 'la'\"\n- \"'ߠ' > 'na'\"\n- \"'ߡ' > 'ma'\"\n- \"'ߢ' > 'nya'\"\n- \"'ߣ' > 'na'\"\n- \"'ߤ' > 'ha'\"\n- \"'ߥ' > 'wa'\"\n- \"'ߦ' > 'ya'\"\n- \"'ߧ' > 'nya'\"\n- \"'ߨ' > 'jona'\"\n- \"'ߩ' > 'jona'\"\n- \"'ߪ' > 'jona'\"\n- \"'ॱ' > 'high'\"\n- \"'ॲ' > 'candra'\"\n- \"'ॻ' > 'gga'\"\n- \"'ॼ' > 'jja'\"\n- \"'ॾ' > 'ddda'\"\n- \"'ॿ' > 'bba'\"\n- \"'ௐ' > 'aum'\"\n- \"'ఽ' > 'avagraha'\"\n- \"'ౘ' > 'tsa'\"\n- \"'ౙ' > 'dza'\"\n- \"'ೱ' > 'jihvamuliya'\"\n- \"'ೲ' > 'upadhmaniya'\"\n- \"'ഽ' > 'avagraha'\"\n- \"'අ' > 'a'\"\n- \"'ආ' > 'aa'\"\n- \"'ඇ' > 'i'\"\n- \"'ඈ' > 'ii'\"\n- \"'ඉ' > 'u'\"\n- \"'ඊ' > 'uu'\"\n- \"'උ' > 'r'\"\n- \"'ඌ' > 'l'\"\n- \"'ඍ' > 'iruyanna'\"\n- \"'ඎ' > 'e'\"\n- \"'ඏ' > 'ee'\"\n- \"'ඐ' > 'ai'\"\n- \"'එ' > 'eyanna'\"\n- \"'ඒ' > 'o'\"\n- \"'ඓ' > 'oo'\"\n- \"'ඔ' > 'au'\"\n- \"'ඕ' > 'k'\"\n- \"'ඖ' > 'kh'\"\n- \"'ක' > 'c'\"\n- \"'ඛ' > 'ch'\"\n- \"'ග' > 'j'\"\n- \"'ඝ' > 'jh'\"\n- \"'ඞ' > 'ny'\"\n- \"'ඟ' > 'tt'\"\n- \"'ච' > 'tth'\"\n- \"'ඡ' > 'dd'\"\n- \"'ජ' > 'ddh'\"\n- \"'ඣ' > 'nn'\"\n- \"'ඤ' > 't'\"\n- \"'ඥ' > 'th'\"\n- \"'ඦ' > 'd'\"\n- \"'ට' > 'dh'\"\n- \"'ඨ' > 'n'\"\n- \"'ඩ' > 'alpapraana'\"\n- \"'ඪ' > 'p'\"\n- \"'ණ' > 'ph'\"\n- \"'ඬ' > 'b'\"\n- \"'ත' > 'bh'\"\n- \"'ථ' > 'm'\"\n- \"'ද' > 'y'\"\n- \"'ධ' > 'r'\"\n- \"'න' > 'rr'\"\n- \"'ඳ' > 'll'\"\n- \"'ප' > 'alpapraana'\"\n- \"'ඵ' > 'v'\"\n- \"'බ' > 'sh'\"\n- \"'භ' > 'ss'\"\n- \"'ම' > 's'\"\n- \"'ඹ' > 'h'\"\n- \"'ය' > 'yayanna'\"\n- \"'ර' > 'rayanna'\"\n- \"'ල' > 'dantaja'\"\n- \"'ව' > 'ii'\"\n- \"'ශ' > 'u'\"\n- \"'ෂ' > 'uu'\"\n- \"'ස' > 'r'\"\n- \"'හ' > 'rr'\"\n- \"'ළ' > 'muurdhaja'\"\n- \"'ෆ' > 'e'\"\n- \"'ກ' > 'ko'\"\n- \"'ຂ' > 'n'\"\n- \"'ຄ' > 'kho'\"\n- \"'ງ' > 'ae'\"\n- \"'ຈ' > 'aae'\"\n- \"'ຊ' > 'ii'\"\n- \"'ຍ' > 'r'\"\n- \"'ດ' > 'o'\"\n- \"'ຕ' > 'oo'\"\n- \"'ຖ' > 'au'\"\n- \"'ທ' > 'tho'\"\n- \"'ນ' > 'no'\"\n- \"'ບ' > 'k'\"\n- \"'ປ' > 'kh'\"\n- \"'ຜ' > 'g'\"\n- \"'ຝ' > 'gh'\"\n- \"'ພ' > 'ng'\"\n- \"'ຟ' > 'nng'\"\n- \"'ມ' > 'ch'\"\n- \"'ຢ' > 'j'\"\n- \"'ຣ' > 'jh'\"\n- \"'ລ' > 'jny'\"\n- \"'ວ' > 'tt'\"\n- \"'ສ' > 'ddh'\"\n- \"'ຫ' > 'nn'\"\n- \"'ອ' > 't'\"\n- \"'ຮ' > 'th'\"\n- \"'ຯ' > 'd'\"\n- \"'ະ' > 'dh'\"\n- \"'າ' > 'aa'\"\n- \"'ຳ' > 'nd'\"\n- \"'ຽ' > 'l'\"\n- \"'ເ' > 'v'\"\n- \"'ແ' > 'sh'\"\n- \"'ໂ' > 'ss'\"\n- \"'ໃ' > 's'\"\n- \"'ໄ' > 'h'\"\n- \"'ໆ' > 'f'\"\n- \"'ໜ' > 'o'\"\n- \"'ໝ' > 'oo'\"\n- \"'ໞ' > 'au'\"\n- \"'ໟ' > 'l'\"\n- \"'ༀ' > 'om'\"\n- \"'ཀ' > 'e'\"\n- \"'ཁ' > 'ae'\"\n- \"'ག' > 'o'\"\n- \"'གྷ' > 'ai'\"\n- \"'ང' > 'ai'\"\n- \"'ཅ' > 'ao'\"\n- \"'ཆ' > 'cha'\"\n- \"'ཇ' > 'ja'\"\n- \"'ཉ' > 'nya'\"\n- \"'ཊ' > 'tta'\"\n- \"'ཋ' > 'ttha'\"\n- \"'ཌ' > 'dda'\"\n- \"'ཌྷ' > 'm'\"\n- \"'ཎ' > 'nna'\"\n- \"'ཏ' > 'ta'\"\n- \"'ཐ' > 'tha'\"\n- \"'ད' > 'da'\"\n- \"'དྷ' > 'dha'\"\n- \"'ན' > 'na'\"\n- \"'པ' > 'pa'\"\n- \"'ཕ' > 'pha'\"\n- \"'བ' > 'ba'\"\n- \"'བྷ' > 'bha'\"\n- \"'མ' > 'ma'\"\n- \"'ཙ' > 'tsa'\"\n- \"'ཚ' > 'tsha'\"\n- \"'ཛ' > 'dza'\"\n- \"'ཛྷ' > 'dzha'\"\n- \"'ཝ' > 'wa'\"\n- \"'ཞ' > 'zha'\"\n- \"'ཟ' > 'za'\"\n- \"'འ' > '-a'\"\n- \"'ཡ' > 'ya'\"\n- \"'ར' > 'ra'\"\n- \"'ལ' > 'la'\"\n- \"'ཤ' > 'sha'\"\n- \"'ཥ' > 'ssa'\"\n- \"'ས' > 'sa'\"\n- \"'ཧ' > 'ha'\"\n- \"'ཨ' > 'a'\"\n- \"'ཀྵ' > 'kssa'\"\n- \"'ཫ' > 'kka'\"\n- \"'ཬ' > 'rra'\"\n- \"'ྈ' > 'ch'\"\n- \"'ྉ' > 'mchu'\"\n- \"'ྊ' > 's'\"\n- \"'ྋ' > 'gru'\"\n- \"'က' > 'aum'\"\n- \"'ခ' > 'kha'\"\n- \"'ဂ' > 'ga'\"\n- \"'ဃ' > 'gha'\"\n- \"'င' > 'nga'\"\n- \"'စ' > 'ca'\"\n- \"'ဆ' > 'cha'\"\n- \"'ဇ' > 'ja'\"\n- \"'ဈ' > 'jha'\"\n- \"'ဉ' > 'nya'\"\n- \"'ည' > 'nnya'\"\n- \"'ဋ' > 'tta'\"\n- \"'ဌ' > 'ttha'\"\n- \"'ဍ' > 'dda'\"\n- \"'ဎ' > 'ddha'\"\n- \"'ဏ' > 'nna'\"\n- \"'တ' > 'ta'\"\n- \"'ထ' > 'tha'\"\n- \"'ဒ' > 'da'\"\n- \"'ဓ' > 'dha'\"\n- \"'န' > 'na'\"\n- \"'ပ' > 'pa'\"\n- \"'ဖ' > 'pha'\"\n- \"'ဗ' > 'ba'\"\n- \"'ဘ' > 'bha'\"\n- \"'မ' > 'ma'\"\n- \"'ယ' > 'ya'\"\n- \"'ရ' > 'ra'\"\n- \"'လ' > 'la'\"\n- \"'ဝ' > 'wa'\"\n- \"'သ' > 'sa'\"\n- \"'ဟ' > 'ha'\"\n- \"'ဠ' > 'lla'\"\n- \"'အ' > 'a'\"\n- \"'ဢ' > 'shan'\"\n- \"'ဣ' > 'i'\"\n- \"'ဤ' > 'ii'\"\n- \"'ဥ' > 'u'\"\n- \"'ဦ' > 'uu'\"\n- \"'ဧ' > 'e'\"\n- \"'ဨ' > 'mon'\"\n- \"'ဩ' > 'o'\"\n- \"'ဪ' > 'au'\"\n- \"'ၐ' > 'th'\"\n- \"'ၑ' > 'd'\"\n- \"'ၒ' > 'dh'\"\n- \"'ၓ' > 'n'\"\n- \"'ၔ' > 'p'\"\n- \"'ၕ' > 'ph'\"\n- \"'ၚ' > 'tsh'\"\n- \"'ၛ' > 'dz'\"\n- \"'ၜ' > 'dzh'\"\n- \"'ၝ' > 'w'\"\n- \"'ၡ' > 'y'\"\n- \"'ၥ' > 'ssh'\"\n- \"'ၦ' > 's'\"\n- \"'ၵ' > 'uu'\"\n- \"'ၶ' > 'r'\"\n- \"'ၷ' > 'rr'\"\n- \"'ၸ' > 'l'\"\n- \"'ၹ' > 'll'\"\n- \"'ၺ' > 'e'\"\n- \"'ၻ' > 'ee'\"\n- \"'ၼ' > 'o'\"\n- \"'ၽ' > 'oo'\"\n- \"'ၾ' > 'm'\"\n- \"'ၿ' > 'h'\"\n- \"'ႀ' > 'i'\"\n- \"'ႁ' > 'ii'\"\n- \"'ႎ' > 'rumai'\"\n- \"'Ⴀ' > 'th'\"\n- \"'Ⴁ' > 'd'\"\n- \"'Ⴂ' > 'dh'\"\n- \"'Ⴃ' > 'n'\"\n- \"'Ⴄ' > 'p'\"\n- \"'Ⴅ' > 'ph'\"\n- \"'Ⴆ' > 'b'\"\n- \"'Ⴇ' > 'bh'\"\n- \"'Ⴈ' > 'm'\"\n- \"'Ⴉ' > 'ts'\"\n- \"'Ⴊ' > 'tsh'\"\n- \"'Ⴋ' > 'dz'\"\n- \"'Ⴌ' > 'dzh'\"\n- \"'Ⴍ' > 'w'\"\n- \"'Ⴎ' > 'zh'\"\n- \"'Ⴏ' > 'z'\"\n- \"'Ⴐ' > 'rae'\"\n- \"'Ⴑ' > 'y'\"\n- \"'Ⴒ' > 'r'\"\n- \"'Ⴓ' > 'l'\"\n- \"'Ⴔ' > 'sh'\"\n- \"'Ⴕ' > 'ss'\"\n- \"'Ⴖ' > 's'\"\n- \"'Ⴗ' > 'h'\"\n- \"'Ⴘ' > 'a'\"\n- \"'Ⴙ' > 'kss'\"\n- \"'Ⴚ' > 'w'\"\n- \"'Ⴛ' > 'y'\"\n- \"'Ⴜ' > 'r'\"\n- \"'Ⴞ' > 'x'\"\n- \"'Ⴟ' > 'jhan'\"\n- \"'Ⴠ' > 'hae'\"\n- \"'Ⴡ' > 'he'\"\n- \"'Ⴢ' > 'hie'\"\n- \"'Ⴣ' > 'we'\"\n- \"'Ⴤ' > 'har'\"\n- \"'Ⴥ' > 'hoe'\"\n- \"'ჱ' > 'he'\"\n- \"'ჲ' > 'hie'\"\n- \"'ჵ' > 'hoe'\"\n- \"'ჶ' > 'fi'\"\n- \"'ჷ' > 'yn'\"\n- \"'ჸ' > 'elifi'\"\n- \"'ჹ' > 'gan'\"\n- \"'ჺ' > 'ain'\"\n- \"'ᄓ' > 'dh'\"\n- \"'ᄔ' > 'n'\"\n- \"'ᄕ' > 'p'\"\n- \"'ᄖ' > 'ph'\"\n- \"'ᄗ' > 'b'\"\n- \"'ᄘ' > 'bh'\"\n- \"'ᄙ' > 'm'\"\n- \"'ᄚ' > 'y'\"\n- \"'ᄛ' > 'r'\"\n- \"'ᄜ' > 'l'\"\n- \"'ᄝ' > 'w'\"\n- \"'ᄞ' > 's'\"\n- \"'ᄟ' > 'h'\"\n- \"'ᄠ' > 'll'\"\n- \"'ᄡ' > 'a'\"\n- \"'ᄣ' > 'i'\"\n- \"'ᄤ' > 'ii'\"\n- \"'ᄥ' > 'u'\"\n- \"'ᄦ' > 'uu'\"\n- \"'ᄧ' > 'e'\"\n- \"'ᄩ' > 'o'\"\n- \"'ᄪ' > 'au'\"\n- \"'ᄬ' > 'aa'\"\n- \"'ᄭ' > 'i'\"\n- \"'ᄮ' > 'ii'\"\n- \"'ᄯ' > 'u'\"\n- \"'ᄰ' > 'uu'\"\n- \"'ᄱ' > 'e'\"\n- \"'ᄲ' > 'ai'\"\n- \"'ᄶ' > 'n'\"\n- \"'ᅌ' > 'n'\"\n- \"'ᅍ' > 'r'\"\n- \"'ᅎ' > 'l'\"\n- \"'ᅏ' > 'e'\"\n- \"'ᅐ' > 'sh'\"\n- \"'ᅑ' > 'ss'\"\n- \"'ᅒ' > 'r'\"\n- \"'ᅓ' > 'rr'\"\n- \"'ᅔ' > 'l'\"\n- \"'ᅕ' > 'll'\"\n- \"'ᅖ' > 'r'\"\n- \"'ᅗ' > 'rr'\"\n- \"'ᅘ' > 'l'\"\n- \"'ᅙ' > 'll'\"\n- \"'ᅶ' > 'a-o'\"\n- \"'ᅷ' > 'a-u'\"\n- \"'ᅸ' > 'ya-o'\"\n- \"'ᅹ' > 'ya-yo'\"\n- \"'ᅺ' > 'eo-o'\"\n- \"'ᅻ' > 'eo-u'\"\n- \"'ᅼ' > 'eo-eu'\"\n- \"'ᅽ' > 'yeo-o'\"\n- \"'ᅾ' > 'yeo-u'\"\n- \"'ᅿ' > 'o-eo'\"\n- \"'ᆀ' > 'o-e'\"\n- \"'ᆁ' > 'o-ye'\"\n- \"'ᆂ' > 'o-o'\"\n- \"'ᆃ' > 'o-u'\"\n- \"'ᆄ' > 'yo-ya'\"\n- \"'ᆅ' > 'yo-yae'\"\n- \"'ᆆ' > 'yo-yeo'\"\n- \"'ᆇ' > 'yo-o'\"\n- \"'ᆈ' > 'yo-i'\"\n- \"'ᆉ' > 'u-a'\"\n- \"'ᆊ' > 'u-ae'\"\n- \"'ᆋ' > 'u-eo-eu'\"\n- \"'ᆌ' > 'u-ye'\"\n- \"'ᆍ' > 'u-u'\"\n- \"'ᆎ' > 'yu-a'\"\n- \"'ᆏ' > 'yu-eo'\"\n- \"'ᆐ' > 'yu-e'\"\n- \"'ᆑ' > 'yu-yeo'\"\n- \"'ᆒ' > 'yu-ye'\"\n- \"'ᆓ' > 'yu-u'\"\n- \"'ᆔ' > 'yu-i'\"\n- \"'ᆕ' > 'eu-u'\"\n- \"'ᆖ' > 'eu-eu'\"\n- \"'ᆗ' > 'yi-u'\"\n- \"'ᆘ' > 'i-a'\"\n- \"'ᆙ' > 'i-ya'\"\n- \"'ᆚ' > 'i-o'\"\n- \"'ᆛ' > 'i-u'\"\n- \"'ᆜ' > 'i-eu'\"\n- \"'ᆝ' > 'i-araea'\"\n- \"'ᆞ' > 'araea'\"\n- \"'ᆟ' > 'araea-eo'\"\n- \"'ᆠ' > 'a'\"\n- \"'ᆡ' > 'b'\"\n- \"'ᆢ' > 'g'\"\n- \"'ᆣ' > 'd'\"\n- \"'ᆤ' > 'e'\"\n- \"'ᆥ' > 'v'\"\n- \"'ᆦ' > 'z'\"\n- \"'ᆧ' > 't'\"\n- \"'ᇃ' > 'w'\"\n- \"'ᇄ' > 'xh'\"\n- \"'ᇅ' > 'oe'\"\n- \"'ᇆ' > 'nieun-tikeut'\"\n- \"'ᇇ' > 'nieun-sios'\"\n- \"'ᇈ' > 'nieun-pansios'\"\n- \"'ᇉ' > 'nieun-thieuth'\"\n- \"'ᇊ' > 'tikeut-kiyeok'\"\n- \"'ᇋ' > 'tikeut-rieul'\"\n- \"'ᇌ' > 'rieul-kiyeok-sios'\"\n- \"'ᇍ' > 'rieul-nieun'\"\n- \"'ᇎ' > 'rieul-tikeut'\"\n- \"'ᇏ' > 'rieul-tikeut-hieuh'\"\n- \"'ᇐ' > 'a'\"\n- \"'ᇑ' > 'b'\"\n- \"'ᇒ' > 'g'\"\n- \"'ᇓ' > 'd'\"\n- \"'ᇔ' > 'e'\"\n- \"'ᇕ' > 'v'\"\n- \"'ᇖ' > 'z'\"\n- \"'ᇗ' > 't'\"\n- \"'ᇘ' > 'i'\"\n- \"'ᇙ' > 'k'\"\n- \"'ᇚ' > 'l'\"\n- \"'ᇛ' > 'm'\"\n- \"'ᇜ' > 'n'\"\n- \"'ᇝ' > 'o'\"\n- \"'ᇞ' > 'p'\"\n- \"'ᇟ' > 'zh'\"\n- \"'ᇠ' > 'r'\"\n- \"'ᇡ' > 's'\"\n- \"'ᇢ' > 't'\"\n- \"'ᇣ' > 'u'\"\n- \"'ᇤ' > 'p'\"\n- \"'ᇥ' > 'k'\"\n- \"'ᇦ' > 'g'\"\n- \"'ᇧ' > 'q'\"\n- \"'ᇨ' > 'sh'\"\n- \"'ᇩ' > 'ch'\"\n- \"'ᇪ' > 'c'\"\n- \"'ᇫ' > 'z'\"\n- \"'ᇬ' > 'c'\"\n- \"'ᇭ' > 'ch'\"\n- \"'ᇮ' > 'x'\"\n- \"'ᇯ' > 'j'\"\n- \"'ᇰ' > 'h'\"\n- \"'ᇱ' > 'e'\"\n- \"'ᇲ' > 'y'\"\n- \"'ᇳ' > 'w'\"\n- \"'ᇴ' > 'xh'\"\n- \"'ᇵ' > 'oe'\"\n- \"'ᇶ' > 'f'\"\n- \"'ᇷ' > 'hieuh-mieum'\"\n- \"'ᇸ' > 'hieuh-pieup'\"\n- \"'ᇹ' > 'yeorinhieuh'\"\n- \"'ሀ' > 'g'\"\n- \"'ሁ' > 'gg'\"\n- \"'ሂ' > 'n'\"\n- \"'ሃ' > 'd'\"\n- \"'ሄ' > 'dd'\"\n- \"'ህ' > 'r'\"\n- \"'ሆ' > 'm'\"\n- \"'ሇ' > 'b'\"\n- \"'ለ' > 'bb'\"\n- \"'ሉ' > 's'\"\n- \"'ሊ' > 'ss'\"\n- \"'ላ' > 'laa'\"\n- \"'ሌ' > 'j'\"\n- \"'ል' > 'jj'\"\n- \"'ሎ' > 'c'\"\n- \"'ሏ' > 'k'\"\n- \"'ሐ' > 't'\"\n- \"'ሑ' > 'p'\"\n- \"'ሒ' > 'h'\"\n- \"'ሓ' > 'ng'\"\n- \"'ሔ' > 'nn'\"\n- \"'ሕ' > 'nd'\"\n- \"'ሖ' > 'nb'\"\n- \"'ሗ' > 'dg'\"\n- \"'መ' > 'rn'\"\n- \"'ሙ' > 'rr'\"\n- \"'ሚ' > 'rh'\"\n- \"'ማ' > 'rn'\"\n- \"'ሜ' > 'mb'\"\n- \"'ም' > 'mn'\"\n- \"'ሞ' > 'bg'\"\n- \"'ሟ' > 'bn'\"\n- \"'ሠ' > 'sza'\"\n- \"'ሡ' > 'bs'\"\n- \"'ሢ' > 'bsg'\"\n- \"'ሣ' > 'bst'\"\n- \"'ሤ' > 'bsb'\"\n- \"'ሥ' > 'bss'\"\n- \"'ሦ' > 'bsj'\"\n- \"'ሧ' > 'bj'\"\n- \"'ረ' > 'bc'\"\n- \"'ሩ' > 'bt'\"\n- \"'ሪ' > 'bp'\"\n- \"'ራ' > 'bn'\"\n- \"'ሬ' > 'bbn'\"\n- \"'ር' > 'sg'\"\n- \"'ሮ' > 'sn'\"\n- \"'ሯ' > 'sd'\"\n- \"'ሰ' > 'sr'\"\n- \"'ሱ' > 'sm'\"\n- \"'ሲ' > 'sb'\"\n- \"'ሳ' > 'sbg'\"\n- \"'ሴ' > 'sss'\"\n- \"'ስ' > 's'\"\n- \"'ሶ' > 'sj'\"\n- \"'ሷ' > 'sc'\"\n- \"'ሸ' > 'sk'\"\n- \"'ሹ' > 'st'\"\n- \"'ሺ' > 'sp'\"\n- \"'ሻ' > 'sh'\"\n- \"'ሼ' > 'shee'\"\n- \"'ሽ' > 'she'\"\n- \"'ሾ' > 'sho'\"\n- \"'ሿ' > 'shwa'\"\n- \"'ቀ' > 'z'\"\n- \"'ቁ' > 'g'\"\n- \"'ቂ' > 'd'\"\n- \"'ቃ' > 'm'\"\n- \"'ቄ' > 'b'\"\n- \"'ቅ' > 's'\"\n- \"'ቆ' > 'z'\"\n- \"'ቇ' > 'qoa'\"\n- \"'ቈ' > 'j'\"\n- \"'ቊ' > 't'\"\n- \"'ቋ' > 'p'\"\n- \"'ቌ' > 'n'\"\n- \"'ቍ' > 'j'\"\n- \"'ቐ' > 'qha'\"\n- \"'ቑ' > 'qhu'\"\n- \"'ቒ' > 'ck'\"\n- \"'ቓ' > 'ch'\"\n- \"'ቔ' > 'qhee'\"\n- \"'ቕ' > 'qhe'\"\n- \"'ቖ' > 'pb'\"\n- \"'ቘ' > 'hh'\"\n- \"'ቚ' > 'qhwi'\"\n- \"'ቛ' > 'qhwaa'\"\n- \"'ቜ' > 'qhwee'\"\n- \"'ቝ' > 'qhwe'\"\n- \"'በ' > 'ba'\"\n- \"'ቡ' > 'a'\"\n- \"'ቢ' > 'ae'\"\n- \"'ባ' > 'ya'\"\n- \"'ቤ' > 'yae'\"\n- \"'ብ' > 'eo'\"\n- \"'ቦ' > 'e'\"\n- \"'ቧ' > 'yeo'\"\n- \"'ቨ' > 'ye'\"\n- \"'ቩ' > 'o'\"\n- \"'ቪ' > 'wa'\"\n- \"'ቫ' > 'wae'\"\n- \"'ቬ' > 'oe'\"\n- \"'ቭ' > 'yo'\"\n- \"'ቮ' > 'u'\"\n- \"'ቯ' > 'weo'\"\n- \"'ተ' > 'we'\"\n- \"'ቱ' > 'wi'\"\n- \"'ቲ' > 'yu'\"\n- \"'ታ' > 'eu'\"\n- \"'ቴ' > 'yi'\"\n- \"'ት' > 'i'\"\n- \"'ቶ' > 'a-o'\"\n- \"'ቷ' > 'a-u'\"\n- \"'ቸ' > 'ya-o'\"\n- \"'ቹ' > 'ya-yo'\"\n- \"'ቺ' > 'eo-o'\"\n- \"'ቻ' > 'eo-u'\"\n- \"'ቼ' > 'eo-eu'\"\n- \"'ች' > 'yeo-o'\"\n- \"'ቾ' > 'yeo-u'\"\n- \"'ቿ' > 'o-eo'\"\n- \"'ኀ' > 'o-e'\"\n- \"'ኁ' > 'o-ye'\"\n- \"'ኂ' > 'o-o'\"\n- \"'ኃ' > 'o-u'\"\n- \"'ኄ' > 'yo-ya'\"\n- \"'ኅ' > 'yo-yae'\"\n- \"'ኆ' > 'yo-yeo'\"\n- \"'ኇ' > 'yo-o'\"\n- \"'ኈ' > 'yo-i'\"\n- \"'ኊ' > 'u-ae'\"\n- \"'ኋ' > 'u-eo-eu'\"\n- \"'ኌ' > 'u-ye'\"\n- \"'ኍ' > 'u-u'\"\n- \"'ነ' > 'yu-e'\"\n- \"'ኑ' > 'yu-yeo'\"\n- \"'ኒ' > 'yu-ye'\"\n- \"'ና' > 'yu-u'\"\n- \"'ኔ' > 'yu-i'\"\n- \"'ን' > 'eu-u'\"\n- \"'ኖ' > 'eu-eu'\"\n- \"'ኗ' > 'yi-u'\"\n- \"'ኘ' > 'i-a'\"\n- \"'ኙ' > 'i-ya'\"\n- \"'ኚ' > 'i-o'\"\n- \"'ኛ' > 'i-u'\"\n- \"'ኜ' > 'i-eu'\"\n- \"'ኝ' > 'i-u'\"\n- \"'ኞ' > 'u'\"\n- \"'ኟ' > 'u-eo'\"\n- \"'አ' > 'u-u'\"\n- \"'ኡ' > 'u-i'\"\n- \"'ኢ' > 'uu'\"\n- \"'ኣ' > 'aa'\"\n- \"'ኤ' > 'ee'\"\n- \"'እ' > 'e'\"\n- \"'ኦ' > 'o'\"\n- \"'ኧ' > 'wa'\"\n- \"'ከ' > 'g'\"\n- \"'ኩ' > 'gg'\"\n- \"'ኪ' > 'gs'\"\n- \"'ካ' > 'n'\"\n- \"'ኬ' > 'nj'\"\n- \"'ክ' > 'nh'\"\n- \"'ኮ' > 'd'\"\n- \"'ኯ' > 'l'\"\n- \"'ኰ' > 'lg'\"\n- \"'ኲ' > 'lb'\"\n- \"'ኳ' > 'ls'\"\n- \"'ኴ' > 'lt'\"\n- \"'ኵ' > 'lp'\"\n- \"'ኸ' > 'b'\"\n- \"'ኹ' > 'bs'\"\n- \"'ኺ' > 's'\"\n- \"'ኻ' > 'ss'\"\n- \"'ኼ' > 'ng'\"\n- \"'ኽ' > 'j'\"\n- \"'ኾ' > 'c'\"\n- \"'ዀ' > 't'\"\n- \"'ዂ' > 'h'\"\n- \"'ዃ' > 'gl'\"\n- \"'ዄ' > 'gsg'\"\n- \"'ዅ' > 'ng'\"\n- \"'ወ' > 'nz'\"\n- \"'ዉ' > 'nt'\"\n- \"'ዊ' > 'dg'\"\n- \"'ዋ' > 'tl'\"\n- \"'ዌ' > 'lgs'\"\n- \"'ው' > 'ln'\"\n- \"'ዎ' > 'ld'\"\n- \"'ዏ' > 'lth'\"\n- \"'ዐ' > 'll'\"\n- \"'ዑ' > 'lmg'\"\n- \"'ዒ' > 'lms'\"\n- \"'ዓ' > 'lbs'\"\n- \"'ዔ' > 'lbh'\"\n- \"'ዕ' > 'rnp'\"\n- \"'ዖ' > 'lss'\"\n- \"'ዘ' > 'lk'\"\n- \"'ዙ' > 'lq'\"\n- \"'ዚ' > 'mg'\"\n- \"'ዛ' > 'ml'\"\n- \"'ዜ' > 'mb'\"\n- \"'ዝ' > 'ms'\"\n- \"'ዞ' > 'mss'\"\n- \"'ዟ' > 'mz'\"\n- \"'ዠ' > 'mc'\"\n- \"'ዡ' > 'mh'\"\n- \"'ዢ' > 'mn'\"\n- \"'ዣ' > 'bl'\"\n- \"'ዤ' > 'bp'\"\n- \"'ዥ' > 'ph'\"\n- \"'ዦ' > 'pn'\"\n- \"'ዧ' > 'sg'\"\n- \"'የ' > 'sd'\"\n- \"'ዩ' > 'sl'\"\n- \"'ዪ' > 'sb'\"\n- \"'ያ' > 'z'\"\n- \"'ዬ' > 'g'\"\n- \"'ይ' > 'ss'\"\n- \"'ዮ' > 'yo'\"\n- \"'ዯ' > 'kh'\"\n- \"'ደ' > 'n'\"\n- \"'ዱ' > 'ns'\"\n- \"'ዲ' > 'nz'\"\n- \"'ዳ' > 'pb'\"\n- \"'ዴ' > 'pn'\"\n- \"'ድ' > 'hn'\"\n- \"'ዶ' > 'hl'\"\n- \"'ዷ' > 'hm'\"\n- \"'ዸ' > 'hb'\"\n- \"'ዹ' > 'q'\"\n- \"'ዺ' > 'ddi'\"\n- \"'ዻ' > 'ddaa'\"\n- \"'ዼ' > 'ddee'\"\n- \"'ዽ' > 'dde'\"\n- \"'ዾ' > 'ddo'\"\n- \"'ዿ' > 'ddwa'\"\n- \"'ጀ' > 'ha'\"\n- \"'ጁ' > 'hu'\"\n- \"'ጂ' > 'hi'\"\n- \"'ጃ' > 'haa'\"\n- \"'ጄ' > 'hee'\"\n- \"'ጅ' > 'he'\"\n- \"'ጆ' > 'ho'\"\n- \"'ጇ' > 'jwa'\"\n- \"'ገ' > 'la'\"\n- \"'ጉ' > 'lu'\"\n- \"'ጊ' > 'li'\"\n- \"'ጋ' > 'laa'\"\n- \"'ጌ' > 'lee'\"\n- \"'ግ' > 'le'\"\n- \"'ጎ' > 'lo'\"\n- \"'ጏ' > 'lwa'\"\n- \"'ጐ' > 'hha'\"\n- \"'ጒ' > 'hhi'\"\n- \"'ጓ' > 'hhaa'\"\n- \"'ጔ' > 'hhee'\"\n- \"'ጕ' > 'hhe'\"\n- \"'ጘ' > 'ma'\"\n- \"'ጙ' > 'mu'\"\n- \"'ጚ' > 'mi'\"\n- \"'ጛ' > 'maa'\"\n- \"'ጜ' > 'mee'\"\n- \"'ጝ' > 'me'\"\n- \"'ጞ' > 'mo'\"\n- \"'ጟ' > 'mwa'\"\n- \"'ጠ' > 'sza'\"\n- \"'ጡ' > 'szu'\"\n- \"'ጢ' > 'szi'\"\n- \"'ጣ' > 'szaa'\"\n- \"'ጤ' > 'szee'\"\n- \"'ጥ' > 'sze'\"\n- \"'ጦ' > 'szo'\"\n- \"'ጧ' > 'szwa'\"\n- \"'ጨ' > 'ra'\"\n- \"'ጩ' > 'ru'\"\n- \"'ጪ' > 'ri'\"\n- \"'ጫ' > 'raa'\"\n- \"'ጬ' > 'ree'\"\n- \"'ጭ' > 're'\"\n- \"'ጮ' > 'ro'\"\n- \"'ጯ' > 'rwa'\"\n- \"'ጰ' > 'sa'\"\n- \"'ጱ' > 'su'\"\n- \"'ጲ' > 'si'\"\n- \"'ጳ' > 'saa'\"\n- \"'ጴ' > 'see'\"\n- \"'ጵ' > 'se'\"\n- \"'ጶ' > 'so'\"\n- \"'ጷ' > 'swa'\"\n- \"'ጸ' > 'sha'\"\n- \"'ጹ' > 'shu'\"\n- \"'ጺ' > 'shi'\"\n- \"'ጻ' > 'shaa'\"\n- \"'ጼ' > 'shee'\"\n- \"'ጽ' > 'she'\"\n- \"'ጾ' > 'sho'\"\n- \"'ጿ' > 'shwa'\"\n- \"'ፀ' > 'qa'\"\n- \"'ፁ' > 'qu'\"\n- \"'ፂ' > 'qi'\"\n- \"'ፃ' > 'qaa'\"\n- \"'ፄ' > 'qee'\"\n- \"'ፅ' > 'qe'\"\n- \"'ፆ' > 'qo'\"\n- \"'ፇ' > 'tzoa'\"\n- \"'ፈ' > 'qwa'\"\n- \"'ፉ' > 'fu'\"\n- \"'ፊ' > 'qwi'\"\n- \"'ፋ' > 'qwaa'\"\n- \"'ፌ' > 'qwee'\"\n- \"'ፍ' > 'qwe'\"\n- \"'ፎ' > 'fo'\"\n- \"'ፏ' > 'fwa'\"\n- \"'ፐ' > 'qha'\"\n- \"'ፑ' > 'qhu'\"\n- \"'ፒ' > 'qhi'\"\n- \"'ፓ' > 'qhaa'\"\n- \"'ፔ' > 'qhee'\"\n- \"'ፕ' > 'qhe'\"\n- \"'ፖ' > 'qho'\"\n- \"'ፗ' > 'pwa'\"\n- \"'ፘ' > 'qhwa'\"\n- \"'ፙ' > 'mya'\"\n- \"'ፚ' > 'qhwi'\"\n- \"'ᎀ' > 'xa'\"\n- \"'ᎁ' > 'xu'\"\n- \"'ᎂ' > 'xi'\"\n- \"'ᎃ' > 'xaa'\"\n- \"'ᎄ' > 'xee'\"\n- \"'ᎅ' > 'xe'\"\n- \"'ᎆ' > 'xo'\"\n- \"'ᎇ' > 'bwe'\"\n- \"'ᎈ' > 'xwa'\"\n- \"'ᎉ' > 'fwi'\"\n- \"'ᎊ' > 'xwi'\"\n- \"'ᎋ' > 'xwaa'\"\n- \"'ᎌ' > 'xwee'\"\n- \"'ᎍ' > 'xwe'\"\n- \"'ᎎ' > 'pwee'\"\n- \"'ᎏ' > 'pwe'\"\n- \"'Ꭰ' > 'a'\"\n- \"'Ꭱ' > 'e'\"\n- \"'Ꭲ' > 'i'\"\n- \"'Ꭳ' > 'o'\"\n- \"'Ꭴ' > 'u'\"\n- \"'Ꭵ' > 'v'\"\n- \"'Ꭶ' > 'ga'\"\n- \"'Ꭷ' > 'ka'\"\n- \"'Ꭸ' > 'ka'\"\n- \"'Ꭹ' > 'ku'\"\n- \"'Ꭺ' > 'ki'\"\n- \"'Ꭻ' > 'kaa'\"\n- \"'Ꭼ' > 'kee'\"\n- \"'Ꭽ' > 'ke'\"\n- \"'Ꭾ' > 'ko'\"\n- \"'Ꭿ' > 'hi'\"\n- \"'Ꮀ' > 'kwa'\"\n- \"'Ꮁ' > 'hu'\"\n- \"'Ꮂ' > 'kwi'\"\n- \"'Ꮃ' > 'kwaa'\"\n- \"'Ꮄ' > 'kwee'\"\n- \"'Ꮅ' > 'kwe'\"\n- \"'Ꮆ' > 'lo'\"\n- \"'Ꮇ' > 'lu'\"\n- \"'Ꮈ' > 'kxa'\"\n- \"'Ꮉ' > 'kxu'\"\n- \"'Ꮊ' > 'kxi'\"\n- \"'Ꮋ' > 'kxaa'\"\n- \"'Ꮌ' > 'kxee'\"\n- \"'Ꮍ' > 'kxe'\"\n- \"'Ꮎ' > 'kxo'\"\n- \"'Ꮏ' > 'hna'\"\n- \"'Ꮐ' > 'kxwa'\"\n- \"'Ꮑ' > 'ne'\"\n- \"'Ꮒ' > 'kxwi'\"\n- \"'Ꮓ' > 'kxwaa'\"\n- \"'Ꮔ' > 'kxwee'\"\n- \"'Ꮕ' > 'kxwe'\"\n- \"'Ꮖ' > 'qua'\"\n- \"'Ꮗ' > 'que'\"\n- \"'Ꮘ' > 'wa'\"\n- \"'Ꮙ' > 'wu'\"\n- \"'Ꮚ' > 'wi'\"\n- \"'Ꮛ' > 'waa'\"\n- \"'Ꮜ' > 'wee'\"\n- \"'Ꮝ' > 'we'\"\n- \"'Ꮞ' > 'wo'\"\n- \"'Ꮟ' > 'si'\"\n- \"'Ꮠ' > 'so'\"\n- \"'Ꮡ' > 'su'\"\n- \"'Ꮢ' > 'sv'\"\n- \"'Ꮣ' > 'da'\"\n- \"'Ꮤ' > 'ta'\"\n- \"'Ꮥ' > 'de'\"\n- \"'Ꮦ' > 'te'\"\n- \"'Ꮧ' > 'di'\"\n- \"'Ꮨ' > 'za'\"\n- \"'Ꮩ' > 'zu'\"\n- \"'Ꮪ' > 'zi'\"\n- \"'Ꮫ' > 'zaa'\"\n- \"'Ꮬ' > 'zee'\"\n- \"'Ꮭ' > 'ze'\"\n- \"'Ꮮ' > 'zo'\"\n- \"'Ꮯ' > 'zwa'\"\n- \"'Ꮰ' > 'zha'\"\n- \"'Ꮱ' > 'zhu'\"\n- \"'Ꮲ' > 'zhi'\"\n- \"'Ꮳ' > 'zhaa'\"\n- \"'Ꮴ' > 'zhee'\"\n- \"'Ꮵ' > 'zhe'\"\n- \"'Ꮶ' > 'zho'\"\n- \"'Ꮷ' > 'zhwa'\"\n- \"'Ꮸ' > 'ya'\"\n- \"'Ꮹ' > 'yu'\"\n- \"'Ꮺ' > 'yi'\"\n- \"'Ꮻ' > 'yaa'\"\n- \"'Ꮼ' > 'yee'\"\n- \"'Ꮽ' > 'ye'\"\n- \"'Ꮾ' > 'yo'\"\n- \"'Ꮿ' > 'ya'\"\n- \"'Ᏸ' > 'da'\"\n- \"'Ᏹ' > 'du'\"\n- \"'Ᏺ' > 'di'\"\n- \"'Ᏻ' > 'daa'\"\n- \"'Ᏼ' > 'dee'\"\n- \"'Ᏽ' > 'de'\"\n- \"'ᏸ' > 'dda'\"\n- \"'ᏹ' > 'ddu'\"\n- \"'ᏺ' > 'ddi'\"\n- \"'ᏻ' > 'ddaa'\"\n- \"'ᏼ' > 'ddee'\"\n- \"'ᏽ' > 'dde'\"\n- \"'ᐁ' > 'ju'\"\n- \"'ᐂ' > 'ji'\"\n- \"'ᐃ' > 'jaa'\"\n- \"'ᐄ' > 'jee'\"\n- \"'ᐅ' > 'je'\"\n- \"'ᐆ' > 'jo'\"\n- \"'ᐇ' > 'jwa'\"\n- \"'ᐈ' > 'ga'\"\n- \"'ᐉ' > 'gu'\"\n- \"'ᐊ' > 'gi'\"\n- \"'ᐋ' > 'gaa'\"\n- \"'ᐌ' > 'gee'\"\n- \"'ᐍ' > 'ge'\"\n- \"'ᐎ' > 'go'\"\n- \"'ᐐ' > 'gwa'\"\n- \"'ᐒ' > 'gwi'\"\n- \"'ᐓ' > 'gwaa'\"\n- \"'ᐔ' > 'gwee'\"\n- \"'ᐕ' > 'gwe'\"\n- \"'ᐘ' > 'gga'\"\n- \"'ᐙ' > 'ggu'\"\n- \"'ᐚ' > 'ggi'\"\n- \"'ᐛ' > 'ggaa'\"\n- \"'ᐜ' > 'ggee'\"\n- \"'ᐝ' > 'gge'\"\n- \"'ᐞ' > 'ggo'\"\n- \"'ᐠ' > 'tha'\"\n- \"'ᐡ' > 'thu'\"\n- \"'ᐢ' > 'thi'\"\n- \"'ᐣ' > 'thaa'\"\n- \"'ᐤ' > 'thee'\"\n- \"'ᐥ' > 'the'\"\n- \"'ᐦ' > 'tho'\"\n- \"'ᐧ' > 'thwa'\"\n- \"'ᐨ' > 'cha'\"\n- \"'ᐩ' > 'chu'\"\n- \"'ᐪ' > 'chi'\"\n- \"'ᐫ' > 'chaa'\"\n- \"'ᐬ' > 'chee'\"\n- \"'ᐭ' > 'che'\"\n- \"'ᐮ' > 'cho'\"\n- \"'ᐯ' > 'chwa'\"\n- \"'ᐰ' > 'pha'\"\n- \"'ᐱ' > 'phu'\"\n- \"'ᐲ' > 'phi'\"\n- \"'ᐳ' > 'phaa'\"\n- \"'ᐴ' > 'phee'\"\n- \"'ᐵ' > 'phe'\"\n- \"'ᐶ' > 'pho'\"\n- \"'ᐷ' > 'phwa'\"\n- \"'ᐸ' > 'tsa'\"\n- \"'ᐹ' > 'tsu'\"\n- \"'ᐺ' > 'tsi'\"\n- \"'ᐻ' > 'tsaa'\"\n- \"'ᐼ' > 'tsee'\"\n- \"'ᐽ' > 'tse'\"\n- \"'ᐾ' > 'tso'\"\n- \"'ᐿ' > 'tswa'\"\n- \"'ᑀ' > 'tza'\"\n- \"'ᑁ' > 'tzu'\"\n- \"'ᑂ' > 'tzi'\"\n- \"'ᑃ' > 'tzaa'\"\n- \"'ᑄ' > 'tzee'\"\n- \"'ᑅ' > 'tze'\"\n- \"'ᑆ' > 'tzo'\"\n- \"'ᑈ' > 'fa'\"\n- \"'ᑉ' > 'fu'\"\n- \"'ᑊ' > 'fi'\"\n- \"'ᑋ' > 'faa'\"\n- \"'ᑌ' > 'fee'\"\n- \"'ᑍ' > 'fe'\"\n- \"'ᑎ' > 'fo'\"\n- \"'ᑏ' > 'fwa'\"\n- \"'ᑐ' > 'pa'\"\n- \"'ᑑ' > 'pu'\"\n- \"'ᑒ' > 'pi'\"\n- \"'ᑓ' > 'paa'\"\n- \"'ᑔ' > 'pee'\"\n- \"'ᑕ' > 'pe'\"\n- \"'ᑖ' > 'po'\"\n- \"'ᑗ' > 'pwa'\"\n- \"'ᑘ' > 'rya'\"\n- \"'ᑙ' > 'mya'\"\n- \"'ᑚ' > 'fya'\"\n- \"'ᒠ' > 'a'\"\n- \"'ᒡ' > 'e'\"\n- \"'ᒢ' > 'i'\"\n- \"'ᒣ' > 'o'\"\n- \"'ᒤ' > 'u'\"\n- \"'ᒥ' > 'v'\"\n- \"'ᒦ' > 'ga'\"\n- \"'ᒧ' > 'ka'\"\n- \"'ᒨ' > 'ge'\"\n- \"'ᒩ' > 'gi'\"\n- \"'ᒪ' > 'go'\"\n- \"'ᒫ' > 'gu'\"\n- \"'ᒬ' > 'gv'\"\n- \"'ᒭ' > 'ha'\"\n- \"'ᒮ' > 'he'\"\n- \"'ᒯ' > 'hi'\"\n- \"'ᒰ' > 'ho'\"\n- \"'ᒱ' > 'hu'\"\n- \"'ᒲ' > 'hv'\"\n- \"'ᒳ' > 'la'\"\n- \"'ᒴ' > 'le'\"\n- \"'ᒵ' > 'li'\"\n- \"'ᒶ' > 'lo'\"\n- \"'ᒷ' > 'lu'\"\n- \"'ᒸ' > 'lv'\"\n- \"'ᒹ' > 'ma'\"\n- \"'ᒺ' > 'me'\"\n- \"'ᒻ' > 'mi'\"\n- \"'ᒼ' > 'mo'\"\n- \"'ᒽ' > 'mu'\"\n- \"'ᒾ' > 'na'\"\n- \"'ᒿ' > 'hna'\"\n- \"'ᓀ' > 'nah'\"\n- \"'ᓁ' > 'ne'\"\n- \"'ᓂ' > 'ni'\"\n- \"'ᓃ' > 'no'\"\n- \"'ᓄ' > 'nu'\"\n- \"'ᓅ' > 'nv'\"\n- \"'ᓆ' > 'qua'\"\n- \"'ᓇ' > 'que'\"\n- \"'ᓈ' > 'qui'\"\n- \"'ᓉ' > 'quo'\"\n- \"'ᓊ' > 'quu'\"\n- \"'ᓋ' > 'quv'\"\n- \"'ᓌ' > 'sa'\"\n- \"'ᓍ' > 's'\"\n- \"'ᓎ' > 'se'\"\n- \"'ᓏ' > 'si'\"\n- \"'ᓐ' > 'so'\"\n- \"'ᓑ' > 'su'\"\n- \"'ᓒ' > 'sv'\"\n- \"'ᓓ' > 'da'\"\n- \"'ᓔ' > 'ta'\"\n- \"'ᓕ' > 'de'\"\n- \"'ᓖ' > 'te'\"\n- \"'ᓗ' > 'di'\"\n- \"'ᓘ' > 'ti'\"\n- \"'ᓙ' > 'do'\"\n- \"'ᓚ' > 'du'\"\n- \"'ᓛ' > 'dv'\"\n- \"'ᓜ' > 'dla'\"\n- \"'ᓝ' > 'tla'\"\n- \"'ᓞ' > 'tle'\"\n- \"'ᓟ' > 'tli'\"\n- \"'ᓠ' > 'tlo'\"\n- \"'ᓡ' > 'tlu'\"\n- \"'ᓢ' > 'tlv'\"\n- \"'ᓣ' > 'tsa'\"\n- \"'ᓤ' > 'tse'\"\n- \"'ᓥ' > 'tsi'\"\n- \"'ᓦ' > 'tso'\"\n- \"'ᓧ' > 'tsu'\"\n- \"'ᓨ' > 'tsv'\"\n- \"'ᓩ' > 'wa'\"\n- \"'ᓪ' > 'we'\"\n- \"'ᓫ' > 'wi'\"\n- \"'ᓬ' > 'wo'\"\n- \"'ᓭ' > 'wu'\"\n- \"'ᓮ' > 'wv'\"\n- \"'ᓯ' > 'ya'\"\n- \"'ᓰ' > 'ye'\"\n- \"'ᓱ' > 'yi'\"\n- \"'ᓲ' > 'yo'\"\n- \"'ᓳ' > 'yu'\"\n- \"'ᓴ' > 'yv'\"\n- \"'ᔁ' > 'e'\"\n- \"'ᔂ' > 'aai'\"\n- \"'ᔃ' > 'i'\"\n- \"'ᔄ' > 'ii'\"\n- \"'ᔅ' > 'o'\"\n- \"'ᔆ' > 'oo'\"\n- \"'ᔇ' > 'oo'\"\n- \"'ᔈ' > 'ee'\"\n- \"'ᔉ' > 'i'\"\n- \"'ᔊ' > 'a'\"\n- \"'ᔋ' > 'aa'\"\n- \"'ᔌ' > 'we'\"\n- \"'ᔍ' > 'we'\"\n- \"'ᔎ' > 'wi'\"\n- \"'ᔏ' > 'wi'\"\n- \"'ᔐ' > 'wii'\"\n- \"'ᔑ' > 'wii'\"\n- \"'ᔒ' > 'wo'\"\n- \"'ᔓ' > 'wo'\"\n- \"'ᔔ' > 'woo'\"\n- \"'ᔕ' > 'woo'\"\n- \"'ᔖ' > 'woo'\"\n- \"'ᔗ' > 'wa'\"\n- \"'ᔘ' > 'wa'\"\n- \"'ᔙ' > 'waa'\"\n- \"'ᔚ' > 'waa'\"\n- \"'ᔛ' > 'waa'\"\n- \"'ᔜ' > 'ai'\"\n- \"'ᔝ' > 'w'\"\n- \"'ᔟ' > 't'\"\n- \"'ᔠ' > 'k'\"\n- \"'ᔡ' > 'sh'\"\n- \"'ᔢ' > 's'\"\n- \"'ᔣ' > 'n'\"\n- \"'ᔤ' > 'w'\"\n- \"'ᔥ' > 'n'\"\n- \"'ᔧ' > 'w'\"\n- \"'ᔨ' > 'c'\"\n- \"'ᔪ' > 'l'\"\n- \"'ᔫ' > 'en'\"\n- \"'ᔬ' > 'in'\"\n- \"'ᔭ' > 'on'\"\n- \"'ᔮ' > 'an'\"\n- \"'ᔯ' > 'pe'\"\n- \"'ᔰ' > 'paai'\"\n- \"'ᔱ' > 'pi'\"\n- \"'ᔲ' > 'pii'\"\n- \"'ᔳ' > 'po'\"\n- \"'ᔴ' > 'poo'\"\n- \"'ᔵ' > 'poo'\"\n- \"'ᔶ' > 'hee'\"\n- \"'ᔷ' > 'hi'\"\n- \"'ᔸ' > 'pa'\"\n- \"'ᔹ' > 'paa'\"\n- \"'ᔺ' > 'pwe'\"\n- \"'ᔻ' > 'pwe'\"\n- \"'ᔼ' > 'pwi'\"\n- \"'ᔽ' > 'pwi'\"\n- \"'ᔾ' > 'pwii'\"\n- \"'ᔿ' > 'pwii'\"\n- \"'ᕀ' > 'pwo'\"\n- \"'ᕁ' > 'pwo'\"\n- \"'ᕂ' > 'pwoo'\"\n- \"'ᕃ' > 'pwoo'\"\n- \"'ᕄ' > 'pwa'\"\n- \"'ᕅ' > 'pwa'\"\n- \"'ᕆ' > 'pwaa'\"\n- \"'ᕇ' > 'pwaa'\"\n- \"'ᕈ' > 'pwaa'\"\n- \"'ᕉ' > 'p'\"\n- \"'ᕊ' > 'p'\"\n- \"'ᕋ' > 'h'\"\n- \"'ᕌ' > 'te'\"\n- \"'ᕍ' > 'taai'\"\n- \"'ᕎ' > 'ti'\"\n- \"'ᕏ' > 'tii'\"\n- \"'ᕐ' > 'to'\"\n- \"'ᕑ' > 'too'\"\n- \"'ᕒ' > 'too'\"\n- \"'ᕓ' > 'dee'\"\n- \"'ᕔ' > 'di'\"\n- \"'ᕕ' > 'ta'\"\n- \"'ᕖ' > 'taa'\"\n- \"'ᕗ' > 'twe'\"\n- \"'ᕘ' > 'twe'\"\n- \"'ᕙ' > 'twi'\"\n- \"'ᕚ' > 'twi'\"\n- \"'ᕛ' > 'twii'\"\n- \"'ᕜ' > 'twii'\"\n- \"'ᕝ' > 'two'\"\n- \"'ᕞ' > 'two'\"\n- \"'ᕟ' > 'twoo'\"\n- \"'ᕠ' > 'twoo'\"\n- \"'ᕡ' > 'twa'\"\n- \"'ᕢ' > 'twa'\"\n- \"'ᕣ' > 'twaa'\"\n- \"'ᕤ' > 'twaa'\"\n- \"'ᕥ' > 'twaa'\"\n- \"'ᕦ' > 't'\"\n- \"'ᕧ' > 'tte'\"\n- \"'ᕨ' > 'tti'\"\n- \"'ᕩ' > 'tto'\"\n- \"'ᕪ' > 'tta'\"\n- \"'ᕫ' > 'ke'\"\n- \"'ᕬ' > 'kaai'\"\n- \"'ᕭ' > 'ki'\"\n- \"'ᕮ' > 'kii'\"\n- \"'ᕯ' > 'ko'\"\n- \"'ᕰ' > 'koo'\"\n- \"'ᕱ' > 'koo'\"\n- \"'ᕲ' > 'ka'\"\n- \"'ᕳ' > 'kaa'\"\n- \"'ᕴ' > 'kwe'\"\n- \"'ᕵ' > 'kwe'\"\n- \"'ᕶ' > 'kwi'\"\n- \"'ᕷ' > 'kwi'\"\n- \"'ᕸ' > 'kwii'\"\n- \"'ᕹ' > 'kwii'\"\n- \"'ᕺ' > 'kwo'\"\n- \"'ᕻ' > 'kwo'\"\n- \"'ᕼ' > 'kwoo'\"\n- \"'ᕽ' > 'kwoo'\"\n- \"'ᕾ' > 'kwa'\"\n- \"'ᕿ' > 'kwa'\"\n- \"'ᖀ' > 'kwaa'\"\n- \"'ᖁ' > 'kwaa'\"\n- \"'ᖂ' > 'kwaa'\"\n- \"'ᖃ' > 'k'\"\n- \"'ᖄ' > 'kw'\"\n- \"'ᖅ' > 'keh'\"\n- \"'ᖆ' > 'kih'\"\n- \"'ᖇ' > 'koh'\"\n- \"'ᖈ' > 'kah'\"\n- \"'ᖉ' > 'ce'\"\n- \"'ᖊ' > 'caai'\"\n- \"'ᖋ' > 'ci'\"\n- \"'ᖌ' > 'cii'\"\n- \"'ᖍ' > 'co'\"\n- \"'ᖎ' > 'coo'\"\n- \"'ᖏ' > 'coo'\"\n- \"'ᖐ' > 'ca'\"\n- \"'ᖑ' > 'caa'\"\n- \"'ᖒ' > 'cwe'\"\n- \"'ᖓ' > 'cwe'\"\n- \"'ᖔ' > 'cwi'\"\n- \"'ᖕ' > 'cwi'\"\n- \"'ᖖ' > 'cwii'\"\n- \"'ᖗ' > 'cwii'\"\n- \"'ᖘ' > 'cwo'\"\n- \"'ᖙ' > 'cwo'\"\n- \"'ᖚ' > 'cwoo'\"\n- \"'ᖛ' > 'cwoo'\"\n- \"'ᖜ' > 'cwa'\"\n- \"'ᖝ' > 'cwa'\"\n- \"'ᖞ' > 'cwaa'\"\n- \"'ᖟ' > 'cwaa'\"\n- \"'ᖠ' > 'cwaa'\"\n- \"'ᖡ' > 'c'\"\n- \"'ᖢ' > 'th'\"\n- \"'ᖣ' > 'me'\"\n- \"'ᖤ' > 'maai'\"\n- \"'ᖥ' > 'mi'\"\n- \"'ᖦ' > 'mii'\"\n- \"'ᖧ' > 'mo'\"\n- \"'ᖨ' > 'moo'\"\n- \"'ᖩ' > 'moo'\"\n- \"'ᖪ' > 'ma'\"\n- \"'ᖫ' > 'maa'\"\n- \"'ᖬ' > 'mwe'\"\n- \"'ᖭ' > 'mwe'\"\n- \"'ᖮ' > 'mwi'\"\n- \"'ᖯ' > 'mwi'\"\n- \"'ᖰ' > 'mwii'\"\n- \"'ᖱ' > 'mwii'\"\n- \"'ᖲ' > 'mwo'\"\n- \"'ᖳ' > 'mwo'\"\n- \"'ᖴ' > 'mwoo'\"\n- \"'ᖵ' > 'mwoo'\"\n- \"'ᖶ' > 'mwa'\"\n- \"'ᖷ' > 'mwa'\"\n- \"'ᖸ' > 'mwaa'\"\n- \"'ᖹ' > 'mwaa'\"\n- \"'ᖺ' > 'mwaa'\"\n- \"'ᖻ' > 'm'\"\n- \"'ᖼ' > 'm'\"\n- \"'ᖽ' > 'mh'\"\n- \"'ᖾ' > 'm'\"\n- \"'ᖿ' > 'm'\"\n- \"'ᗀ' > 'ne'\"\n- \"'ᗁ' > 'naai'\"\n- \"'ᗂ' > 'ni'\"\n- \"'ᗃ' > 'nii'\"\n- \"'ᗄ' > 'no'\"\n- \"'ᗅ' > 'noo'\"\n- \"'ᗆ' > 'noo'\"\n- \"'ᗇ' > 'na'\"\n- \"'ᗈ' > 'naa'\"\n- \"'ᗉ' > 'nwe'\"\n- \"'ᗊ' > 'nwe'\"\n- \"'ᗋ' > 'nwa'\"\n- \"'ᗌ' > 'nwa'\"\n- \"'ᗍ' > 'nwaa'\"\n- \"'ᗎ' > 'nwaa'\"\n- \"'ᗏ' > 'nwaa'\"\n- \"'ᗐ' > 'n'\"\n- \"'ᗑ' > 'ng'\"\n- \"'ᗒ' > 'nh'\"\n- \"'ᗓ' > 'le'\"\n- \"'ᗔ' > 'laai'\"\n- \"'ᗕ' > 'li'\"\n- \"'ᗖ' > 'lii'\"\n- \"'ᗗ' > 'lo'\"\n- \"'ᗘ' > 'loo'\"\n- \"'ᗙ' > 'loo'\"\n- \"'ᗚ' > 'la'\"\n- \"'ᗛ' > 'laa'\"\n- \"'ᗜ' > 'lwe'\"\n- \"'ᗝ' > 'lwe'\"\n- \"'ᗞ' > 'lwi'\"\n- \"'ᗟ' > 'lwi'\"\n- \"'ᗠ' > 'lwii'\"\n- \"'ᗡ' > 'lwii'\"\n- \"'ᗢ' > 'lwo'\"\n- \"'ᗣ' > 'lwo'\"\n- \"'ᗤ' > 'lwoo'\"\n- \"'ᗥ' > 'lwoo'\"\n- \"'ᗦ' > 'lwa'\"\n- \"'ᗧ' > 'lwa'\"\n- \"'ᗨ' > 'lwaa'\"\n- \"'ᗩ' > 'lwaa'\"\n- \"'ᗪ' > 'l'\"\n- \"'ᗫ' > 'l'\"\n- \"'ᗬ' > 'l'\"\n- \"'ᗭ' > 'se'\"\n- \"'ᗮ' > 'saai'\"\n- \"'ᗯ' > 'si'\"\n- \"'ᗰ' > 'sii'\"\n- \"'ᗱ' > 'so'\"\n- \"'ᗲ' > 'soo'\"\n- \"'ᗳ' > 'soo'\"\n- \"'ᗴ' > 'sa'\"\n- \"'ᗵ' > 'saa'\"\n- \"'ᗶ' > 'swe'\"\n- \"'ᗷ' > 'swe'\"\n- \"'ᗸ' > 'swi'\"\n- \"'ᗹ' > 'swi'\"\n- \"'ᗺ' > 'swii'\"\n- \"'ᗻ' > 'swii'\"\n- \"'ᗼ' > 'swo'\"\n- \"'ᗽ' > 'swo'\"\n- \"'ᗾ' > 'swoo'\"\n- \"'ᗿ' > 'swoo'\"\n- \"'ᘀ' > 'swa'\"\n- \"'ᘁ' > 'swa'\"\n- \"'ᘂ' > 'swaa'\"\n- \"'ᘃ' > 'swaa'\"\n- \"'ᘄ' > 'swaa'\"\n- \"'ᘅ' > 's'\"\n- \"'ᘆ' > 's'\"\n- \"'ᘇ' > 'sw'\"\n- \"'ᘈ' > 's'\"\n- \"'ᘉ' > 'sk'\"\n- \"'ᘊ' > 'skw'\"\n- \"'ᘋ' > 'sw'\"\n- \"'ᘌ' > 'spwa'\"\n- \"'ᘍ' > 'stwa'\"\n- \"'ᘎ' > 'skwa'\"\n- \"'ᘏ' > 'scwa'\"\n- \"'ᘐ' > 'she'\"\n- \"'ᘑ' > 'shi'\"\n- \"'ᘒ' > 'shii'\"\n- \"'ᘓ' > 'sho'\"\n- \"'ᘔ' > 'shoo'\"\n- \"'ᘕ' > 'sha'\"\n- \"'ᘖ' > 'shaa'\"\n- \"'ᘗ' > 'shwe'\"\n- \"'ᘘ' > 'shwe'\"\n- \"'ᘙ' > 'shwi'\"\n- \"'ᘚ' > 'shwi'\"\n- \"'ᘛ' > 'shwii'\"\n- \"'ᘜ' > 'shwii'\"\n- \"'ᘝ' > 'shwo'\"\n- \"'ᘞ' > 'shwo'\"\n- \"'ᘟ' > 'shwoo'\"\n- \"'ᘠ' > 'shwoo'\"\n- \"'ᘡ' > 'shwa'\"\n- \"'ᘢ' > 'shwa'\"\n- \"'ᘣ' > 'shwaa'\"\n- \"'ᘤ' > 'shwaa'\"\n- \"'ᘥ' > 'sh'\"\n- \"'ᘦ' > 'ye'\"\n- \"'ᘧ' > 'yaai'\"\n- \"'ᘨ' > 'yi'\"\n- \"'ᘩ' > 'yii'\"\n- \"'ᘪ' > 'yo'\"\n- \"'ᘫ' > 'yoo'\"\n- \"'ᘬ' > 'yoo'\"\n- \"'ᘭ' > 'ya'\"\n- \"'ᘮ' > 'yaa'\"\n- \"'ᘯ' > 'ywe'\"\n- \"'ᘰ' > 'ywe'\"\n- \"'ᘱ' > 'ywi'\"\n- \"'ᘲ' > 'ywi'\"\n- \"'ᘳ' > 'ywii'\"\n- \"'ᘴ' > 'ywii'\"\n- \"'ᘵ' > 'ywo'\"\n- \"'ᘶ' > 'ywo'\"\n- \"'ᘷ' > 'ywoo'\"\n- \"'ᘸ' > 'ywoo'\"\n- \"'ᘹ' > 'ywa'\"\n- \"'ᘺ' > 'ywa'\"\n- \"'ᘻ' > 'ywaa'\"\n- \"'ᘼ' > 'ywaa'\"\n- \"'ᘽ' > 'ywaa'\"\n- \"'ᘾ' > 'y'\"\n- \"'ᘿ' > 'y'\"\n- \"'ᙀ' > 'y'\"\n- \"'ᙁ' > 'yi'\"\n- \"'ᙂ' > 're'\"\n- \"'ᙃ' > 're'\"\n- \"'ᙄ' > 'le'\"\n- \"'ᙅ' > 'raai'\"\n- \"'ᙆ' > 'ri'\"\n- \"'ᙇ' > 'rii'\"\n- \"'ᙈ' > 'ro'\"\n- \"'ᙉ' > 'roo'\"\n- \"'ᙊ' > 'lo'\"\n- \"'ᙋ' > 'ra'\"\n- \"'ᙌ' > 'raa'\"\n- \"'ᙍ' > 'la'\"\n- \"'ᙎ' > 'rwaa'\"\n- \"'ᙏ' > 'rwaa'\"\n- \"'ᙐ' > 'r'\"\n- \"'ᙑ' > 'r'\"\n- \"'ᙒ' > 'r'\"\n- \"'ᙓ' > 'fe'\"\n- \"'ᙔ' > 'faai'\"\n- \"'ᙕ' > 'fi'\"\n- \"'ᙖ' > 'fii'\"\n- \"'ᙗ' > 'fo'\"\n- \"'ᙘ' > 'foo'\"\n- \"'ᙙ' > 'fa'\"\n- \"'ᙚ' > 'faa'\"\n- \"'ᙛ' > 'fwaa'\"\n- \"'ᙜ' > 'fwaa'\"\n- \"'ᙝ' > 'f'\"\n- \"'ᙞ' > 'the'\"\n- \"'ᙟ' > 'the'\"\n- \"'ᙠ' > 'thi'\"\n- \"'ᙡ' > 'thi'\"\n- \"'ᙢ' > 'thii'\"\n- \"'ᙣ' > 'thii'\"\n- \"'ᙤ' > 'tho'\"\n- \"'ᙥ' > 'thoo'\"\n- \"'ᙦ' > 'tha'\"\n- \"'ᙧ' > 'thaa'\"\n- \"'ᙨ' > 'thwaa'\"\n- \"'ᙩ' > 'thwaa'\"\n- \"'ᙪ' > 'th'\"\n- \"'ᙫ' > 'tthe'\"\n- \"'ᙬ' > 'tthi'\"\n- \"'ᙯ' > 'tth'\"\n- \"'ᙰ' > 'tye'\"\n- \"'ᙱ' > 'tyi'\"\n- \"'ᙲ' > 'tyo'\"\n- \"'ᙳ' > 'tya'\"\n- \"'ᙴ' > 'he'\"\n- \"'ᙵ' > 'hi'\"\n- \"'ᙶ' > 'hii'\"\n- \"'ᙷ' > 'ho'\"\n- \"'ᙸ' > 'hoo'\"\n- \"'ᙹ' > 'ha'\"\n- \"'ᙺ' > 'haa'\"\n- \"'ᙻ' > 'h'\"\n- \"'ᙼ' > 'h'\"\n- \"'ᙽ' > 'hk'\"\n- \"'ᙾ' > 'qaai'\"\n- \"'ᙿ' > 'qi'\"\n- \"'ᚁ' > 'qo'\"\n- \"'ᚂ' > 'qoo'\"\n- \"'ᚃ' > 'qa'\"\n- \"'ᚄ' > 'qaa'\"\n- \"'ᚅ' > 'q'\"\n- \"'ᚆ' > 'tlhe'\"\n- \"'ᚇ' > 'tlhi'\"\n- \"'ᚈ' > 'tlho'\"\n- \"'ᚉ' > 'tlha'\"\n- \"'ᚊ' > 're'\"\n- \"'ᚋ' > 'ri'\"\n- \"'ᚌ' > 'ro'\"\n- \"'ᚍ' > 'ra'\"\n- \"'ᚎ' > 'ngaai'\"\n- \"'ᚏ' > 'ngi'\"\n- \"'ᚐ' > 'ngii'\"\n- \"'ᚑ' > 'ngo'\"\n- \"'ᚒ' > 'ngoo'\"\n- \"'ᚓ' > 'nga'\"\n- \"'ᚔ' > 'ngaa'\"\n- \"'ᚕ' > 'ng'\"\n- \"'ᚖ' > 'nng'\"\n- \"'ᚗ' > 'she'\"\n- \"'ᚘ' > 'shi'\"\n- \"'ᚙ' > 'sho'\"\n- \"'ᚚ' > 'sha'\"\n- \"'ᚠ' > 'lhi'\"\n- \"'ᚡ' > 'lhii'\"\n- \"'ᚢ' > 'lho'\"\n- \"'ᚣ' > 'lhoo'\"\n- \"'ᚤ' > 'lha'\"\n- \"'ᚥ' > 'lhaa'\"\n- \"'ᚦ' > 'lh'\"\n- \"'ᚧ' > 'the'\"\n- \"'ᚨ' > 'thi'\"\n- \"'ᚩ' > 'thii'\"\n- \"'ᚪ' > 'tho'\"\n- \"'ᚫ' > 'thoo'\"\n- \"'ᚬ' > 'tha'\"\n- \"'ᚭ' > 'thaa'\"\n- \"'ᚮ' > 'th'\"\n- \"'ᚯ' > 'b'\"\n- \"'ᚰ' > 'e'\"\n- \"'ᚱ' > 'i'\"\n- \"'ᚲ' > 'o'\"\n- \"'ᚳ' > 'a'\"\n- \"'ᚴ' > 'we'\"\n- \"'ᚵ' > 'wi'\"\n- \"'ᚶ' > 'wo'\"\n- \"'ᚷ' > 'wa'\"\n- \"'ᚸ' > 'ne'\"\n- \"'ᚹ' > 'ni'\"\n- \"'ᚺ' > 'no'\"\n- \"'ᚻ' > 'na'\"\n- \"'ᚼ' > 'ke'\"\n- \"'ᚽ' > 'ki'\"\n- \"'ᚾ' > 'ko'\"\n- \"'ᚿ' > 'ka'\"\n- \"'ᛀ' > 'he'\"\n- \"'ᛁ' > 'hi'\"\n- \"'ᛂ' > 'ho'\"\n- \"'ᛃ' > 'ha'\"\n- \"'ᛄ' > 'ghu'\"\n- \"'ᛅ' > 'gho'\"\n- \"'ᛆ' > 'ghe'\"\n- \"'ᛇ' > 'ghee'\"\n- \"'ᛈ' > 'ghi'\"\n- \"'ᛉ' > 'gha'\"\n- \"'ᛊ' > 'ru'\"\n- \"'ᛋ' > 'ro'\"\n- \"'ᛌ' > 're'\"\n- \"'ᛍ' > 'ree'\"\n- \"'ᛎ' > 'ri'\"\n- \"'ᛏ' > 'ra'\"\n- \"'ᛐ' > 'wu'\"\n- \"'ᛑ' > 'wo'\"\n- \"'ᛒ' > 'we'\"\n- \"'ᛓ' > 'wee'\"\n- \"'ᛔ' > 'wi'\"\n- \"'ᛕ' > 'wa'\"\n- \"'ᛖ' > 'hwu'\"\n- \"'ᛗ' > 'hwo'\"\n- \"'ᛘ' > 'hwe'\"\n- \"'ᛙ' > 'hwee'\"\n- \"'ᛚ' > 'hwi'\"\n- \"'ᛛ' > 'hwa'\"\n- \"'ᛜ' > 'thu'\"\n- \"'ᛝ' > 'tho'\"\n- \"'ᛞ' > 'the'\"\n- \"'ᛟ' > 'thee'\"\n- \"'ᛠ' > 'thi'\"\n- \"'ᛡ' > 'tha'\"\n- \"'ᛢ' > 'ttu'\"\n- \"'ᛣ' > 'tto'\"\n- \"'ᛤ' > 'tte'\"\n- \"'ᛥ' > 'ttee'\"\n- \"'ᛦ' > 'tti'\"\n- \"'ᛧ' > 'tta'\"\n- \"'ᛨ' > 'pu'\"\n- \"'ᛩ' > 'po'\"\n- \"'ᛪ' > 'pe'\"\n- \"'ᛱ' > 'ge'\"\n- \"'ᛲ' > 'gee'\"\n- \"'ᛳ' > 'gi'\"\n- \"'ᛴ' > 'ga'\"\n- \"'ᛵ' > 'khu'\"\n- \"'ᛶ' > 'kho'\"\n- \"'ᛷ' > 'khe'\"\n- \"'ᛸ' > 'khee'\"\n- \"'ᜀ' > 'kka'\"\n- \"'ᜁ' > 'kk'\"\n- \"'ᜂ' > 'nu'\"\n- \"'ᜃ' > 'no'\"\n- \"'ᜄ' > 'ne'\"\n- \"'ᜅ' > 'nee'\"\n- \"'ᜆ' > 'ni'\"\n- \"'ᜇ' > 'na'\"\n- \"'ᜈ' > 'mu'\"\n- \"'ᜉ' > 'mo'\"\n- \"'ᜊ' > 'me'\"\n- \"'ᜋ' > 'mee'\"\n- \"'ᜌ' > 'mi'\"\n- \"'ᜎ' > 'yu'\"\n- \"'ᜏ' > 'yo'\"\n- \"'ᜐ' > 'ye'\"\n- \"'ᜑ' > 'yee'\"\n- \"'ᜠ' > 'jji'\"\n- \"'ᜡ' > 'jja'\"\n- \"'ᜢ' > 'lu'\"\n- \"'ᜣ' > 'lo'\"\n- \"'ᜤ' > 'le'\"\n- \"'ᜥ' > 'lee'\"\n- \"'ᜦ' > 'li'\"\n- \"'ᜧ' > 'la'\"\n- \"'ᜨ' > 'dlu'\"\n- \"'ᜩ' > 'dlo'\"\n- \"'ᜪ' > 'dle'\"\n- \"'ᜫ' > 'dlee'\"\n- \"'ᜬ' > 'dli'\"\n- \"'ᜭ' > 'dla'\"\n- \"'ᜮ' > 'lhu'\"\n- \"'ᜯ' > 'lho'\"\n- \"'ᜰ' > 'lhe'\"\n- \"'ᜱ' > 'lhee'\"\n- \"'ᝀ' > 'zu'\"\n- \"'ᝁ' > 'zo'\"\n- \"'ᝂ' > 'ze'\"\n- \"'ᝃ' > 'zee'\"\n- \"'ᝄ' > 'zi'\"\n- \"'ᝅ' > 'za'\"\n- \"'ᝆ' > 'z'\"\n- \"'ᝇ' > 'z'\"\n- \"'ᝈ' > 'dzu'\"\n- \"'ᝉ' > 'dzo'\"\n- \"'ᝊ' > 'dze'\"\n- \"'ᝋ' > 'dzee'\"\n- \"'ᝌ' > 'dzi'\"\n- \"'ᝍ' > 'dza'\"\n- \"'ᝎ' > 'su'\"\n- \"'ᝏ' > 'so'\"\n- \"'ᝐ' > 'se'\"\n- \"'ᝑ' > 'see'\"\n- \"'ᝠ' > 'tsa'\"\n- \"'ᝡ' > 'chu'\"\n- \"'ᝢ' > 'cho'\"\n- \"'ᝣ' > 'che'\"\n- \"'ᝤ' > 'chee'\"\n- \"'ᝥ' > 'chi'\"\n- \"'ᝦ' > 'cha'\"\n- \"'ᝧ' > 'ttsu'\"\n- \"'ᝨ' > 'ttso'\"\n- \"'ᝩ' > 'ttse'\"\n- \"'ᝪ' > 'ttsee'\"\n- \"'ᝫ' > 'ttsi'\"\n- \"'ᝬ' > 'ttsa'\"\n- \"'ᝮ' > 'la'\"\n- \"'ᝯ' > 'qai'\"\n- \"'ᝰ' > 'ngai'\"\n- \"'ក' > 'ka'\"\n- \"'ខ' > 'b'\"\n- \"'គ' > 'l'\"\n- \"'ឃ' > 'f'\"\n- \"'ង' > 's'\"\n- \"'ច' > 'n'\"\n- \"'ឆ' > 'h'\"\n- \"'ជ' > 'd'\"\n- \"'ឈ' > 't'\"\n- \"'ញ' > 'c'\"\n- \"'ដ' > 'q'\"\n- \"'ឋ' > 'm'\"\n- \"'ឌ' > 'g'\"\n- \"'ឍ' > 'ng'\"\n- \"'ណ' > 'z'\"\n- \"'ត' > 'r'\"\n- \"'ថ' > 'a'\"\n- \"'ទ' > 'o'\"\n- \"'ធ' > 'u'\"\n- \"'ន' > 'e'\"\n- \"'ប' > 'i'\"\n- \"'ផ' > 'ch'\"\n- \"'ព' > 'th'\"\n- \"'ភ' > 'ph'\"\n- \"'ម' > 'p'\"\n- \"'យ' > 'x'\"\n- \"'រ' > 'p'\"\n- \"'ល' > 'lo'\"\n- \"'វ' > 'vo'\"\n- \"'ឝ' > 'sha'\"\n- \"'ឞ' > 'sso'\"\n- \"'ស' > 'sa'\"\n- \"'ហ' > 'f'\"\n- \"'ឡ' > 'v'\"\n- \"'អ' > 'u'\"\n- \"'ឣ' > 'yr'\"\n- \"'ឤ' > 'y'\"\n- \"'ឥ' > 'w'\"\n- \"'ឦ' > 'th'\"\n- \"'ឧ' > 'th'\"\n- \"'ឨ' > 'a'\"\n- \"'ឩ' > 'o'\"\n- \"'ឪ' > 'ac'\"\n- \"'ឫ' > 'ae'\"\n- \"'ឬ' > 'o'\"\n- \"'ឭ' > 'o'\"\n- \"'ឮ' > 'o'\"\n- \"'ឯ' > 'oe'\"\n- \"'ឰ' > 'on'\"\n- \"'ឱ' > 'r'\"\n- \"'ឲ' > 'k'\"\n- \"'ឳ' > 'c'\"\n- \"'ៗ' > 'm'\"\n- \"'ៜ' > 'ng'\"\n- \"'ᠠ' > 'a'\"\n- \"'ᠡ' > 'e'\"\n- \"'ᠢ' > 'i'\"\n- \"'ᠣ' > 'o'\"\n- \"'ᠤ' > 'u'\"\n- \"'ᠥ' > 'oe'\"\n- \"'ᠦ' > 'ue'\"\n- \"'ᠧ' > 'ee'\"\n- \"'ᠨ' > 'na'\"\n- \"'ᠩ' > 'ang'\"\n- \"'ᠪ' > 'ba'\"\n- \"'ᠫ' > 'pa'\"\n- \"'ᠬ' > 'qa'\"\n- \"'ᠭ' > 'ga'\"\n- \"'ᠮ' > 'ma'\"\n- \"'ᠯ' > 'la'\"\n- \"'ᠰ' > 'sa'\"\n- \"'ᠱ' > 'sha'\"\n- \"'ᠲ' > 'ta'\"\n- \"'ᠳ' > 'da'\"\n- \"'ᠴ' > 'cha'\"\n- \"'ᠵ' > 'ja'\"\n- \"'ᠶ' > 'ya'\"\n- \"'ᠷ' > 'ra'\"\n- \"'ᠸ' > 'wa'\"\n- \"'ᠹ' > 'fa'\"\n- \"'ᠺ' > 'ka'\"\n- \"'ᠻ' > 'kha'\"\n- \"'ᠼ' > 'tsa'\"\n- \"'ᠽ' > 'za'\"\n- \"'ᠾ' > 'haa'\"\n- \"'ᠿ' > 'zra'\"\n- \"'ᡀ' > 'lha'\"\n- \"'ᡁ' > 'zhi'\"\n- \"'ᡂ' > 'chi'\"\n- \"'ᢀ' > 'k'\"\n- \"'ᢁ' > 'kh'\"\n- \"'ᢂ' > 'g'\"\n- \"'ᢃ' > 'gh'\"\n- \"'ᢄ' > 'ng'\"\n- \"'ᢇ' > 'j'\"\n- \"'ᢈ' > 'jh'\"\n- \"'ᢉ' > 'ny'\"\n- \"'ᢊ' > 't'\"\n- \"'ᢋ' > 'tth'\"\n- \"'ᢌ' > 'd'\"\n- \"'ᢍ' > 'ddh'\"\n- \"'ᢎ' > 'nn'\"\n- \"'ᢏ' > 't'\"\n- \"'ᢐ' > 'th'\"\n- \"'ᢑ' > 'd'\"\n- \"'ᢒ' > 'dh'\"\n- \"'ᢓ' > 'n'\"\n- \"'ᢔ' > 'p'\"\n- \"'ᢕ' > 'ph'\"\n- \"'ᢖ' > 'b'\"\n- \"'ᢗ' > 'bh'\"\n- \"'ᢘ' > 'm'\"\n- \"'ᢙ' > 'y'\"\n- \"'ᢚ' > 'r'\"\n- \"'ᢛ' > 'l'\"\n- \"'ᢜ' > 'v'\"\n- \"'ᢝ' > 'sh'\"\n- \"'ᢞ' > 'ss'\"\n- \"'ᢟ' > 's'\"\n- \"'ᢠ' > 'h'\"\n- \"'ᢡ' > 'l'\"\n- \"'ᢢ' > 'q'\"\n- \"'ᢣ' > 'a'\"\n- \"'ᢤ' > 'aa'\"\n- \"'ᢥ' > 'i'\"\n- \"'ᢦ' > 'ii'\"\n- \"'ᢧ' > 'u'\"\n- \"'ᢨ' > 'uk'\"\n- \"'ᢪ' > 'uuv'\"\n- \"'ᢰ' > 'ai'\"\n- \"'ᢱ' > 'oo'\"\n- \"'ᢲ' > 'oo'\"\n- \"'ᢳ' > 'au'\"\n- \"'ᢴ' > 'a'\"\n- \"'ᢵ' > 'aa'\"\n- \"'ᢶ' > 'aa'\"\n- \"'ᢷ' > 'i'\"\n- \"'ᢸ' > 'ii'\"\n- \"'ᢹ' > 'y'\"\n- \"'ᢺ' > 'yy'\"\n- \"'ᢻ' > 'u'\"\n- \"'ᢼ' > 'uu'\"\n- \"'ᢽ' > 'ua'\"\n- \"'ᢾ' > 'oe'\"\n- \"'ᢿ' > 'ya'\"\n- \"'ᣀ' > 'ie'\"\n- \"'ᣁ' > 'e'\"\n- \"'ᣂ' > 'ae'\"\n- \"'ᣃ' > 'ai'\"\n- \"'ᣄ' > 'oo'\"\n- \"'ᣅ' > 'au'\"\n- \"'ᣆ' > 'm'\"\n- \"'ᣇ' > 'h'\"\n- \"'ᣈ' > 'a'\"\n- \"'ᣌ' > 'r'\"\n- \"'ᣛ' > 'kr'\"\n- \"'ᤁ' > 'ka'\"\n- \"'ᤂ' > 'kha'\"\n- \"'ᤃ' > 'ga'\"\n- \"'ᤄ' > 'gha'\"\n- \"'ᤅ' > 'nga'\"\n- \"'ᤆ' > 'ca'\"\n- \"'ᤇ' > 'cha'\"\n- \"'ᤈ' > 'ja'\"\n- \"'ᤉ' > 'jha'\"\n- \"'ᤊ' > 'yan'\"\n- \"'ᤋ' > 'ta'\"\n- \"'ᤌ' > 'tha'\"\n- \"'ᤍ' > 'da'\"\n- \"'ᤎ' > 'dha'\"\n- \"'ᤏ' > 'na'\"\n- \"'ᤐ' > 'pa'\"\n- \"'ᤑ' > 'pha'\"\n- \"'ᤒ' > 'ba'\"\n- \"'ᤓ' > 'bha'\"\n- \"'ᤔ' > 'ma'\"\n- \"'ᤕ' > 'ya'\"\n- \"'ᤖ' > 'ra'\"\n- \"'ᤗ' > 'la'\"\n- \"'ᤘ' > 'wa'\"\n- \"'ᤙ' > 'sha'\"\n- \"'ᤚ' > 'ssa'\"\n- \"'ᤛ' > 'sa'\"\n- \"'ᤜ' > 'ha'\"\n- \"'ᥐ' > 'ka'\"\n- \"'ᥑ' > 'xa'\"\n- \"'ᥒ' > 'nga'\"\n- \"'ᥓ' > 'tsa'\"\n- \"'ᥔ' > 'sa'\"\n- \"'ᥕ' > 'ya'\"\n- \"'ᥖ' > 'ta'\"\n- \"'ᥗ' > 'tha'\"\n- \"'ᥘ' > 'la'\"\n- \"'ᥙ' > 'pa'\"\n- \"'ᥚ' > 'pha'\"\n- \"'ᥛ' > 'ma'\"\n- \"'ᥜ' > 'fa'\"\n- \"'ᥝ' > 'va'\"\n- \"'ᥞ' > 'ha'\"\n- \"'ᥟ' > 'qa'\"\n- \"'ᥠ' > 'kha'\"\n- \"'ᥡ' > 'tsha'\"\n- \"'ᥢ' > 'na'\"\n- \"'ᥣ' > 'a'\"\n- \"'ᥤ' > 'i'\"\n- \"'ᥥ' > 'ee'\"\n- \"'ᥦ' > 'eh'\"\n- \"'ᥧ' > 'u'\"\n- \"'ᥨ' > 'oo'\"\n- \"'ᥩ' > 'o'\"\n- \"'ᥪ' > 'ue'\"\n- \"'ᥫ' > 'e'\"\n- \"'ᥬ' > 'aue'\"\n- \"'ᥭ' > 'ai'\"\n- \"'ᦁ' > 'qa'\"\n- \"'ᦅ' > 'ka'\"\n- \"'ᦆ' > 'xa'\"\n- \"'ᦇ' > 'nga'\"\n- \"'ᦋ' > 'tsa'\"\n- \"'ᦌ' > 'sa'\"\n- \"'ᦍ' > 'ya'\"\n- \"'ᦑ' > 'ta'\"\n- \"'ᦒ' > 'tha'\"\n- \"'ᦓ' > 'na'\"\n- \"'ᦗ' > 'pa'\"\n- \"'ᦘ' > 'pha'\"\n- \"'ᦙ' > 'ma'\"\n- \"'ᦝ' > 'fa'\"\n- \"'ᦞ' > 'va'\"\n- \"'ᦟ' > 'la'\"\n- \"'ᦣ' > 'ha'\"\n- \"'ᦤ' > 'da'\"\n- \"'ᦥ' > 'ba'\"\n- \"'ᦨ' > 'kva'\"\n- \"'ᦩ' > 'xva'\"\n- \"'ᦱ' > 'aa'\"\n- \"'ᦲ' > 'ii'\"\n- \"'ᦳ' > 'u'\"\n- \"'ᦴ' > 'uu'\"\n- \"'ᦵ' > 'e'\"\n- \"'ᦶ' > 'ae'\"\n- \"'ᦷ' > 'o'\"\n- \"'ᦸ' > 'oa'\"\n- \"'ᦹ' > 'ue'\"\n- \"'ᦺ' > 'ay'\"\n- \"'ᦻ' > 'aay'\"\n- \"'ᦼ' > 'uy'\"\n- \"'ᦽ' > 'oy'\"\n- \"'ᦾ' > 'oay'\"\n- \"'ᦿ' > 'uey'\"\n- \"'ᧀ' > 'iy'\"\n- \"'ᨀ' > 'ka'\"\n- \"'ᨁ' > 'ga'\"\n- \"'ᨂ' > 'nga'\"\n- \"'ᨃ' > 'ngka'\"\n- \"'ᨄ' > 'pa'\"\n- \"'ᨅ' > 'ba'\"\n- \"'ᨆ' > 'ma'\"\n- \"'ᨇ' > 'mpa'\"\n- \"'ᨈ' > 'ta'\"\n- \"'ᨉ' > 'da'\"\n- \"'ᨊ' > 'na'\"\n- \"'ᨋ' > 'nra'\"\n- \"'ᨌ' > 'ca'\"\n- \"'ᨍ' > 'ja'\"\n- \"'ᨎ' > 'nya'\"\n- \"'ᨏ' > 'nyca'\"\n- \"'ᨐ' > 'ya'\"\n- \"'ᨑ' > 'ra'\"\n- \"'ᨒ' > 'la'\"\n- \"'ᨓ' > 'va'\"\n- \"'ᨔ' > 'sa'\"\n- \"'ᨕ' > 'a'\"\n- \"'ᨖ' > 'ha'\"\n- \"'ᬅ' > 'akara'\"\n- \"'ᬆ' > 'akara'\"\n- \"'ᬇ' > 'ikara'\"\n- \"'ᬈ' > 'ikara'\"\n- \"'ᬉ' > 'ukara'\"\n- \"'ᬊ' > 'ukara'\"\n- \"'ᬋ' > 'ra'\"\n- \"'ᬌ' > 'ra'\"\n- \"'ᬍ' > 'la'\"\n- \"'ᬎ' > 'la'\"\n- \"'ᬏ' > 'ekara'\"\n- \"'ᬐ' > 'aikara'\"\n- \"'ᬑ' > 'okara'\"\n- \"'ᬒ' > 'okara'\"\n- \"'ᬓ' > 'ka'\"\n- \"'ᬔ' > 'ka'\"\n- \"'ᬕ' > 'ga'\"\n- \"'ᬖ' > 'ga'\"\n- \"'ᬗ' > 'nga'\"\n- \"'ᬘ' > 'ca'\"\n- \"'ᬙ' > 'ca'\"\n- \"'ᬚ' > 'ja'\"\n- \"'ᬛ' > 'ja'\"\n- \"'ᬜ' > 'nya'\"\n- \"'ᬝ' > 'ta'\"\n- \"'ᬞ' > 'ta'\"\n- \"'ᬟ' > 'da'\"\n- \"'ᬠ' > 'da'\"\n- \"'ᬡ' > 'na'\"\n- \"'ᬢ' > 'ta'\"\n- \"'ᬣ' > 'ta'\"\n- \"'ᬤ' > 'da'\"\n- \"'ᬥ' > 'da'\"\n- \"'ᬦ' > 'na'\"\n- \"'ᬧ' > 'pa'\"\n- \"'ᬨ' > 'pa'\"\n- \"'ᬩ' > 'ba'\"\n- \"'ᬪ' > 'ba'\"\n- \"'ᬫ' > 'ma'\"\n- \"'ᬬ' > 'ya'\"\n- \"'ᬭ' > 'ra'\"\n- \"'ᬮ' > 'la'\"\n- \"'ᬯ' > 'wa'\"\n- \"'ᬰ' > 'sa'\"\n- \"'ᬱ' > 'sa'\"\n- \"'ᬲ' > 'sa'\"\n- \"'ᬳ' > 'ha'\"\n- \"'ᭅ' > 'kaf'\"\n- \"'ᭆ' > 'khot'\"\n- \"'ᭇ' > 'tzir'\"\n- \"'ᭈ' > 'ef'\"\n- \"'ᭉ' > 've'\"\n- \"'ᭊ' > 'zal'\"\n- \"'ᭋ' > 'asyura'\"\n- \"'ᮃ' > 'a'\"\n- \"'ᮄ' > 'i'\"\n- \"'ᮅ' > 'u'\"\n- \"'ᮆ' > 'ae'\"\n- \"'ᮇ' > 'o'\"\n- \"'ᮈ' > 'e'\"\n- \"'ᮉ' > 'eu'\"\n- \"'ᮊ' > 'ka'\"\n- \"'ᮋ' > 'qa'\"\n- \"'ᮌ' > 'ga'\"\n- \"'ᮍ' > 'nga'\"\n- \"'ᮎ' > 'ca'\"\n- \"'ᮏ' > 'ja'\"\n- \"'ᮐ' > 'za'\"\n- \"'ᮑ' > 'nya'\"\n- \"'ᮒ' > 'ta'\"\n- \"'ᮓ' > 'da'\"\n- \"'ᮔ' > 'na'\"\n- \"'ᮕ' > 'pa'\"\n- \"'ᮖ' > 'fa'\"\n- \"'ᮗ' > 'va'\"\n- \"'ᮘ' > 'ba'\"\n- \"'ᮙ' > 'ma'\"\n- \"'ᮚ' > 'ya'\"\n- \"'ᮛ' > 'ra'\"\n- \"'ᮜ' > 'la'\"\n- \"'ᮝ' > 'wa'\"\n- \"'ᮞ' > 'sa'\"\n- \"'ᮟ' > 'xa'\"\n- \"'ᮠ' > 'ha'\"\n- \"'ᮮ' > 'kha'\"\n- \"'ᮯ' > 'sya'\"\n- \"'ᰀ' > 'ka'\"\n- \"'ᰁ' > 'kla'\"\n- \"'ᰂ' > 'kha'\"\n- \"'ᰃ' > 'ga'\"\n- \"'ᰄ' > 'gla'\"\n- \"'ᰅ' > 'nga'\"\n- \"'ᰆ' > 'ca'\"\n- \"'ᰇ' > 'cha'\"\n- \"'ᰈ' > 'ja'\"\n- \"'ᰉ' > 'nya'\"\n- \"'ᰊ' > 'ta'\"\n- \"'ᰋ' > 'tha'\"\n- \"'ᰌ' > 'da'\"\n- \"'ᰍ' > 'na'\"\n- \"'ᰎ' > 'pa'\"\n- \"'ᰏ' > 'pla'\"\n- \"'ᰐ' > 'pha'\"\n- \"'ᰑ' > 'fa'\"\n- \"'ᰒ' > 'fla'\"\n- \"'ᰓ' > 'ba'\"\n- \"'ᰔ' > 'bla'\"\n- \"'ᰕ' > 'ma'\"\n- \"'ᰖ' > 'mla'\"\n- \"'ᰗ' > 'tsa'\"\n- \"'ᰘ' > 'tsha'\"\n- \"'ᰙ' > 'dza'\"\n- \"'ᰚ' > 'ya'\"\n- \"'ᰛ' > 'ra'\"\n- \"'ᰜ' > 'la'\"\n- \"'ᰝ' > 'ha'\"\n- \"'ᰞ' > 'hla'\"\n- \"'ᰟ' > 'va'\"\n- \"'ᰠ' > 'sa'\"\n- \"'ᰡ' > 'sha'\"\n- \"'ᰢ' > 'wa'\"\n- \"'ᰣ' > 'a'\"\n- \"'ᱍ' > 'tta'\"\n- \"'ᱎ' > 'ttha'\"\n- \"'ᱏ' > 'dda'\"\n- \"'ᱚ' > 'la'\"\n- \"'ᱛ' > 'at'\"\n- \"'ᱜ' > 'ag'\"\n- \"'ᱝ' > 'ang'\"\n- \"'ᱞ' > 'al'\"\n- \"'ᱟ' > 'laa'\"\n- \"'ᱠ' > 'aak'\"\n- \"'ᱡ' > 'aaj'\"\n- \"'ᱢ' > 'aam'\"\n- \"'ᱣ' > 'aaw'\"\n- \"'ᱤ' > 'li'\"\n- \"'ᱥ' > 'is'\"\n- \"'ᱦ' > 'ih'\"\n- \"'ᱧ' > 'iny'\"\n- \"'ᱨ' > 'ir'\"\n- \"'ᱩ' > 'lu'\"\n- \"'ᱪ' > 'uc'\"\n- \"'ᱫ' > 'ud'\"\n- \"'ᱬ' > 'unn'\"\n- \"'ᱭ' > 'uy'\"\n- \"'ᱮ' > 'le'\"\n- \"'ᱯ' > 'ep'\"\n- \"'ᱰ' > 'edd'\"\n- \"'ᱱ' > 'en'\"\n- \"'ᱲ' > 'err'\"\n- \"'ᱳ' > 'lo'\"\n- \"'ᱴ' > 'ott'\"\n- \"'ᱵ' > 'ob'\"\n- \"'ᱶ' > 'ov'\"\n- \"'ᱷ' > 'oh'\"\n- \"'ᴂ' > 'ae'\"\n- \"'ᴉ' > 'i'\"\n- \"'ᴔ' > 'oe'\"\n- \"'ᴥ' > 'ain'\"\n- \"'ᵃ' > 'a'\"\n- \"'ᵇ' > 'b'\"\n- \"'ᵈ' > 'd'\"\n- \"'ᵉ' > 'e'\"\n- \"'ᵍ' > 'g'\"\n- \"'ᵏ' > 'k'\"\n- \"'ᵐ' > 'm'\"\n- \"'ᵑ' > 'eng'\"\n- \"'ᵒ' > 'o'\"\n- \"'ᵖ' > 'p'\"\n- \"'ᵗ' > 't'\"\n- \"'ᵘ' > 'u'\"\n- \"'ᵛ' > 'v'\"\n- \"'ᵜ' > 'ain'\"\n- \"'ᵝ' > 'beta'\"\n- \"'ᵞ' > 'greek'\"\n- \"'ᵟ' > 'delta'\"\n- \"'ᵠ' > 'greek'\"\n- \"'ᵡ' > 'chi'\"\n- \"'ᵢ' > 'i'\"\n- \"'ᵣ' > 'r'\"\n- \"'ᵤ' > 'u'\"\n- \"'ᵥ' > 'v'\"\n- \"'ᵦ' > 'beta'\"\n- \"'ᵧ' > 'gamma'\"\n- \"'ᵨ' > 'rho'\"\n- \"'ᵩ' > 'phi'\"\n- \"'ᵪ' > 'chi'\"\n- \"'ᵷ' > 'g'\"\n- \"'ᵿ' > 'upsilon'\"\n- \"'ᶋ' > 'esh'\"\n- \"'ᶐ' > 'alpha'\"\n- \"'ᶗ' > 'o'\"\n- \"'ᶘ' > 'esh'\"\n- \"'ᶚ' > 'ezh'\"\n- \"'ᶜ' > 'c'\"\n- \"'ᶝ' > 'c'\"\n- \"'ᶞ' > 'eth'\"\n- \"'ᶠ' > 'f'\"\n- \"'ᶤ' > 'i'\"\n- \"'ᶥ' > 'iota'\"\n- \"'ᶨ' > 'j'\"\n- \"'ᶩ' > 'l'\"\n- \"'ᶪ' > 'l'\"\n- \"'ᶬ' > 'm'\"\n- \"'ᶮ' > 'n'\"\n- \"'ᶯ' > 'n'\"\n- \"'ᶲ' > 'phi'\"\n- \"'ᶳ' > 's'\"\n- \"'ᶴ' > 'esh'\"\n- \"'ᶵ' > 't'\"\n- \"'ᶶ' > 'u'\"\n- \"'ᶷ' > 'upsilon'\"\n- \"'ᶹ' > 'v'\"\n- \"'ᶻ' > 'z'\"\n- \"'ᶼ' > 'z'\"\n- \"'ᶽ' > 'z'\"\n- \"'ᶾ' > 'ezh'\"\n- \"'ᶿ' > 'theta'\"\n- \"'ẟ' > 'ddh'\"\n- \"'ⁱ' > 'i'\"\n- \"'ⁿ' > 'n'\"\n- \"'ₐ' > 'a'\"\n- \"'ₑ' > 'e'\"\n- \"'ₒ' > 'o'\"\n- \"'ₓ' > 'x'\"\n- \"'ↄ' > 'c'\"\n- \"'Ⰰ' > 'azu'\"\n- \"'Ⰱ' > 'buky'\"\n- \"'Ⰲ' > 'vede'\"\n- \"'Ⰳ' > 'glagoli'\"\n- \"'Ⰴ' > 'dobro'\"\n- \"'Ⰵ' > 'yestu'\"\n- \"'Ⰶ' > 'zhivete'\"\n- \"'Ⰷ' > 'dzelo'\"\n- \"'Ⰸ' > 'zemlja'\"\n- \"'Ⰹ' > 'izhe'\"\n- \"'Ⰺ' > 'initial'\"\n- \"'Ⰻ' > 'i'\"\n- \"'Ⰼ' > 'djervi'\"\n- \"'Ⰽ' > 'kako'\"\n- \"'Ⰾ' > 'ljudije'\"\n- \"'Ⰿ' > 'myslite'\"\n- \"'Ⱀ' > 'nashi'\"\n- \"'Ⱁ' > 'onu'\"\n- \"'Ⱂ' > 'pokoji'\"\n- \"'Ⱃ' > 'ritsi'\"\n- \"'Ⱄ' > 'slovo'\"\n- \"'Ⱅ' > 'tvrido'\"\n- \"'Ⱆ' > 'uku'\"\n- \"'Ⱇ' > 'fritu'\"\n- \"'Ⱈ' > 'heru'\"\n- \"'Ⱉ' > 'otu'\"\n- \"'Ⱊ' > 'pe'\"\n- \"'Ⱋ' > 'shta'\"\n- \"'Ⱌ' > 'tsi'\"\n- \"'Ⱍ' > 'chrivi'\"\n- \"'Ⱎ' > 'sha'\"\n- \"'Ⱏ' > 'yeru'\"\n- \"'Ⱐ' > 'yeri'\"\n- \"'Ⱑ' > 'yati'\"\n- \"'Ⱓ' > 'yu'\"\n- \"'Ⱔ' > 'yus'\"\n- \"'Ⱕ' > 'yus'\"\n- \"'Ⱖ' > 'yo'\"\n- \"'Ⱚ' > 'fita'\"\n- \"'Ⱛ' > 'izhitsa'\"\n- \"'Ⱜ' > 'shtapic'\"\n- \"'Ⱝ' > 'trokutasti'\"\n- \"'Ⱞ' > 'latinate'\"\n- \"'ⰰ' > 'azu'\"\n- \"'ⰱ' > 'buky'\"\n- \"'ⰲ' > 'vede'\"\n- \"'ⰳ' > 'glagoli'\"\n- \"'ⰴ' > 'dobro'\"\n- \"'ⰵ' > 'yestu'\"\n- \"'ⰶ' > 'zhivete'\"\n- \"'ⰷ' > 'dzelo'\"\n- \"'ⰸ' > 'zemlja'\"\n- \"'ⰹ' > 'izhe'\"\n- \"'ⰺ' > 'initial'\"\n- \"'ⰻ' > 'i'\"\n- \"'ⰼ' > 'djervi'\"\n- \"'ⰽ' > 'kako'\"\n- \"'ⰾ' > 'ljudije'\"\n- \"'ⰿ' > 'myslite'\"\n- \"'ⱀ' > 'nashi'\"\n- \"'ⱁ' > 'onu'\"\n- \"'ⱂ' > 'pokoji'\"\n- \"'ⱃ' > 'ritsi'\"\n- \"'ⱄ' > 'slovo'\"\n- \"'ⱅ' > 'tvrido'\"\n- \"'ⱆ' > 'uku'\"\n- \"'ⱇ' > 'fritu'\"\n- \"'ⱈ' > 'heru'\"\n- \"'ⱉ' > 'otu'\"\n- \"'ⱊ' > 'pe'\"\n- \"'ⱋ' > 'shta'\"\n- \"'ⱌ' > 'tsi'\"\n- \"'ⱍ' > 'chrivi'\"\n- \"'ⱎ' > 'sha'\"\n- \"'ⱏ' > 'yeru'\"\n- \"'ⱐ' > 'yeri'\"\n- \"'ⱑ' > 'yati'\"\n- \"'ⱓ' > 'yu'\"\n- \"'ⱔ' > 'yus'\"\n- \"'ⱕ' > 'yus'\"\n- \"'ⱖ' > 'yo'\"\n- \"'ⱚ' > 'fita'\"\n- \"'ⱛ' > 'izhitsa'\"\n- \"'ⱜ' > 'shtapic'\"\n- \"'ⱝ' > 'trokutasti'\"\n- \"'ⱞ' > 'latinate'\"\n- \"'Ⱡ' > 'l'\"\n- \"'ⱡ' > 'l'\"\n- \"'Ɫ' > 'l'\"\n- \"'Ᵽ' > 'p'\"\n- \"'Ɽ' > 'r'\"\n- \"'ⱥ' > 'a'\"\n- \"'ⱦ' > 't'\"\n- \"'Ⱨ' > 'h'\"\n- \"'ⱨ' > 'h'\"\n- \"'Ⱪ' > 'k'\"\n- \"'ⱪ' > 'k'\"\n- \"'Ⱬ' > 'z'\"\n- \"'ⱬ' > 'z'\"\n- \"'Ɑ' > 'alpha'\"\n- \"'Ɱ' > 'm'\"\n- \"'Ɐ' > 'a'\"\n- \"'ⱱ' > 'v'\"\n- \"'Ⱳ' > 'w'\"\n- \"'ⱳ' > 'w'\"\n- \"'ⱴ' > 'v'\"\n- \"'ⱸ' > 'e'\"\n- \"'ⱹ' > 'r'\"\n- \"'ⱺ' > 'o'\"\n- \"'ⱼ' > 'j'\"\n- \"'Ⲁ' > 'alfa'\"\n- \"'ⲁ' > 'alfa'\"\n- \"'Ⲃ' > 'vida'\"\n- \"'ⲃ' > 'vida'\"\n- \"'Ⲅ' > 'gamma'\"\n- \"'ⲅ' > 'gamma'\"\n- \"'Ⲇ' > 'dalda'\"\n- \"'ⲇ' > 'dalda'\"\n- \"'Ⲉ' > 'eie'\"\n- \"'ⲉ' > 'eie'\"\n- \"'Ⲋ' > 'sou'\"\n- \"'ⲋ' > 'sou'\"\n- \"'Ⲍ' > 'zata'\"\n- \"'ⲍ' > 'zata'\"\n- \"'Ⲏ' > 'hate'\"\n- \"'ⲏ' > 'hate'\"\n- \"'Ⲑ' > 'thethe'\"\n- \"'ⲑ' > 'thethe'\"\n- \"'Ⲓ' > 'iauda'\"\n- \"'ⲓ' > 'iauda'\"\n- \"'Ⲕ' > 'kapa'\"\n- \"'ⲕ' > 'kapa'\"\n- \"'Ⲗ' > 'laula'\"\n- \"'ⲗ' > 'laula'\"\n- \"'Ⲙ' > 'mi'\"\n- \"'ⲙ' > 'mi'\"\n- \"'Ⲛ' > 'ni'\"\n- \"'ⲛ' > 'ni'\"\n- \"'Ⲝ' > 'ksi'\"\n- \"'ⲝ' > 'ksi'\"\n- \"'Ⲟ' > 'o'\"\n- \"'ⲟ' > 'o'\"\n- \"'Ⲡ' > 'pi'\"\n- \"'ⲡ' > 'pi'\"\n- \"'Ⲣ' > 'ro'\"\n- \"'ⲣ' > 'ro'\"\n- \"'Ⲥ' > 'sima'\"\n- \"'ⲥ' > 'sima'\"\n- \"'Ⲧ' > 'tau'\"\n- \"'ⲧ' > 'tau'\"\n- \"'Ⲩ' > 'ua'\"\n- \"'ⲩ' > 'ua'\"\n- \"'Ⲫ' > 'fi'\"\n- \"'ⲫ' > 'fi'\"\n- \"'Ⲭ' > 'khi'\"\n- \"'ⲭ' > 'khi'\"\n- \"'Ⲯ' > 'psi'\"\n- \"'ⲯ' > 'psi'\"\n- \"'Ⲱ' > 'oou'\"\n- \"'ⲱ' > 'oou'\"\n- \"'Ⳁ' > 'sampi'\"\n- \"'ⳁ' > 'sampi'\"\n- \"'ⴀ' > 'an'\"\n- \"'ⴁ' > 'ban'\"\n- \"'ⴂ' > 'gan'\"\n- \"'ⴃ' > 'don'\"\n- \"'ⴄ' > 'en'\"\n- \"'ⴅ' > 'vin'\"\n- \"'ⴆ' > 'zen'\"\n- \"'ⴇ' > 'tan'\"\n- \"'ⴈ' > 'in'\"\n- \"'ⴉ' > 'kan'\"\n- \"'ⴊ' > 'las'\"\n- \"'ⴋ' > 'man'\"\n- \"'ⴌ' > 'nar'\"\n- \"'ⴍ' > 'on'\"\n- \"'ⴎ' > 'par'\"\n- \"'ⴏ' > 'zhar'\"\n- \"'ⴐ' > 'rae'\"\n- \"'ⴑ' > 'san'\"\n- \"'ⴒ' > 'tar'\"\n- \"'ⴓ' > 'un'\"\n- \"'ⴔ' > 'phar'\"\n- \"'ⴕ' > 'khar'\"\n- \"'ⴖ' > 'ghan'\"\n- \"'ⴗ' > 'qar'\"\n- \"'ⴘ' > 'shin'\"\n- \"'ⴙ' > 'chin'\"\n- \"'ⴚ' > 'can'\"\n- \"'ⴛ' > 'jil'\"\n- \"'ⴜ' > 'cil'\"\n- \"'ⴝ' > 'char'\"\n- \"'ⴞ' > 'xan'\"\n- \"'ⴟ' > 'jhan'\"\n- \"'ⴠ' > 'hae'\"\n- \"'ⴡ' > 'he'\"\n- \"'ⴢ' > 'hie'\"\n- \"'ⴣ' > 'we'\"\n- \"'ⴤ' > 'har'\"\n- \"'ⴥ' > 'hoe'\"\n- \"'ⴰ' > 'ya'\"\n- \"'ⴱ' > 'yab'\"\n- \"'ⴲ' > 'yabh'\"\n- \"'ⴳ' > 'yag'\"\n- \"'ⴴ' > 'yaghh'\"\n- \"'ⴶ' > 'yaj'\"\n- \"'ⴷ' > 'yad'\"\n- \"'ⴸ' > 'yadh'\"\n- \"'ⴹ' > 'yadd'\"\n- \"'ⴺ' > 'yaddh'\"\n- \"'ⴻ' > 'yey'\"\n- \"'ⴼ' > 'yaf'\"\n- \"'ⴽ' > 'yak'\"\n- \"'ⴿ' > 'yakhh'\"\n- \"'ⵀ' > 'yah'\"\n- \"'ⵃ' > 'yahh'\"\n- \"'ⵄ' > 'yaa'\"\n- \"'ⵅ' > 'yakh'\"\n- \"'ⵇ' > 'yaq'\"\n- \"'ⵉ' > 'yi'\"\n- \"'ⵊ' > 'yazh'\"\n- \"'ⵋ' > 'ahaggar'\"\n- \"'ⵍ' > 'yal'\"\n- \"'ⵎ' > 'yam'\"\n- \"'ⵏ' > 'yan'\"\n- \"'ⵒ' > 'yap'\"\n- \"'ⵓ' > 'yu'\"\n- \"'ⵔ' > 'yar'\"\n- \"'ⵕ' > 'yarr'\"\n- \"'ⵖ' > 'yagh'\"\n- \"'ⵘ' > 'ayer'\"\n- \"'ⵙ' > 'yas'\"\n- \"'ⵚ' > 'yass'\"\n- \"'ⵛ' > 'yash'\"\n- \"'ⵜ' > 'yat'\"\n- \"'ⵝ' > 'yath'\"\n- \"'ⵞ' > 'yach'\"\n- \"'ⵟ' > 'yatt'\"\n- \"'ⵠ' > 'yav'\"\n- \"'ⵡ' > 'yaw'\"\n- \"'ⵢ' > 'yay'\"\n- \"'ⵣ' > 'yaz'\"\n- \"'ⵤ' > 'tawellemet'\"\n- \"'ⵥ' > 'yazz'\"\n- \"'ⶀ' > 'loa'\"\n- \"'ⶁ' > 'moa'\"\n- \"'ⶂ' > 'roa'\"\n- \"'ⶃ' > 'soa'\"\n- \"'ⶄ' > 'shoa'\"\n- \"'ⶅ' > 'boa'\"\n- \"'ⶆ' > 'toa'\"\n- \"'ⶇ' > 'coa'\"\n- \"'ⶈ' > 'noa'\"\n- \"'ⶉ' > 'nyoa'\"\n- \"'ⶊ' > 'oa'\"\n- \"'ⶋ' > 'zoa'\"\n- \"'ⶌ' > 'doa'\"\n- \"'ⶍ' > 'ddoa'\"\n- \"'ⶎ' > 'joa'\"\n- \"'ⶏ' > 'thoa'\"\n- \"'ⶐ' > 'choa'\"\n- \"'ⶑ' > 'phoa'\"\n- \"'ⶒ' > 'poa'\"\n- \"'ⶓ' > 'ggwa'\"\n- \"'ⶔ' > 'ggwi'\"\n- \"'ⶕ' > 'ggwee'\"\n- \"'ⶖ' > 'ggwe'\"\n- \"'ⶠ' > 'ssa'\"\n- \"'ⶡ' > 'ssu'\"\n- \"'ⶢ' > 'ssi'\"\n- \"'ⶣ' > 'ssaa'\"\n- \"'ⶤ' > 'ssee'\"\n- \"'ⶥ' > 'sse'\"\n- \"'ⶦ' > 'sso'\"\n- \"'ⶨ' > 'cca'\"\n- \"'ⶩ' > 'ccu'\"\n- \"'ⶪ' > 'cci'\"\n- \"'ⶫ' > 'ccaa'\"\n- \"'ⶬ' > 'ccee'\"\n- \"'ⶭ' > 'cce'\"\n- \"'ⶮ' > 'cco'\"\n- \"'ⶰ' > 'zza'\"\n- \"'ⶱ' > 'zzu'\"\n- \"'ⶲ' > 'zzi'\"\n- \"'ⶳ' > 'zzaa'\"\n- \"'ⶴ' > 'zzee'\"\n- \"'ⶵ' > 'zze'\"\n- \"'ⶶ' > 'zzo'\"\n- \"'ⶸ' > 'ccha'\"\n- \"'ⶹ' > 'cchu'\"\n- \"'ⶺ' > 'cchi'\"\n- \"'ⶻ' > 'cchaa'\"\n- \"'ⶼ' > 'cchee'\"\n- \"'ⶽ' > 'cche'\"\n- \"'ⶾ' > 'ccho'\"\n- \"'ⷀ' > 'qya'\"\n- \"'ⷁ' > 'qyu'\"\n- \"'ⷂ' > 'qyi'\"\n- \"'ⷃ' > 'qyaa'\"\n- \"'ⷄ' > 'qyee'\"\n- \"'ⷅ' > 'qye'\"\n- \"'ⷆ' > 'qyo'\"\n- \"'ⷈ' > 'kya'\"\n- \"'ⷉ' > 'kyu'\"\n- \"'ⷊ' > 'kyi'\"\n- \"'ⷋ' > 'kyaa'\"\n- \"'ⷌ' > 'kyee'\"\n- \"'ⷍ' > 'kye'\"\n- \"'ⷎ' > 'kyo'\"\n- \"'ⷐ' > 'xya'\"\n- \"'ⷑ' > 'xyu'\"\n- \"'ⷒ' > 'xyi'\"\n- \"'ⷓ' > 'xyaa'\"\n- \"'ⷔ' > 'xyee'\"\n- \"'ⷕ' > 'xye'\"\n- \"'ⷖ' > 'xyo'\"\n- \"'ⷘ' > 'gya'\"\n- \"'ⷙ' > 'gyu'\"\n- \"'ⷚ' > 'gyi'\"\n- \"'ⷛ' > 'gyaa'\"\n- \"'ⷜ' > 'gyee'\"\n- \"'ⷝ' > 'gye'\"\n- \"'ⷞ' > 'gyo'\"\n- \"'ゕ' > 'ka'\"\n- \"'ゖ' > 'ke'\"\n- \"'ㄪ' > 'v'\"\n- \"'ㄫ' > 'ng'\"\n- \"'ㄬ' > 'gn'\"\n- \"'ㄭ' > 'ih'\"\n- \"'ㅀ' > 'rieul-hieuh'\"\n- \"'ㅄ' > 'pieup-sios'\"\n- \"'ㅥ' > 'ssangnieun'\"\n- \"'ㅦ' > 'nieun-tikeut'\"\n- \"'ㅧ' > 'nieun-sios'\"\n- \"'ㅨ' > 'nieun-pansios'\"\n- \"'ㅩ' > 'rieul-kiyeok-sios'\"\n- \"'ㅪ' > 'rieul-tikeut'\"\n- \"'ㅫ' > 'rieul-pieup-sios'\"\n- \"'ㅬ' > 'rieul-pansios'\"\n- \"'ㅭ' > 'rieul-yeorinhieuh'\"\n- \"'ㅮ' > 'mieum-pieup'\"\n- \"'ㅯ' > 'mieum-sios'\"\n- \"'ㅰ' > 'mieum-pansios'\"\n- \"'ㅱ' > 'kapyeounmieum'\"\n- \"'ㅲ' > 'pieup-kiyeok'\"\n- \"'ㅳ' > 'pieup-tikeut'\"\n- \"'ㅴ' > 'pieup-sios-kiyeok'\"\n- \"'ㅵ' > 'pieup-sios-tikeut'\"\n- \"'ㅶ' > 'pieup-cieuc'\"\n- \"'ㅷ' > 'pieup-thieuth'\"\n- \"'ㅸ' > 'kapyeounpieup'\"\n- \"'ㅹ' > 'kapyeounssangpieup'\"\n- \"'ㅺ' > 'sios-kiyeok'\"\n- \"'ㅻ' > 'sios-nieun'\"\n- \"'ㅼ' > 'sios-tikeut'\"\n- \"'ㅽ' > 'sios-pieup'\"\n- \"'ㅾ' > 'sios-cieuc'\"\n- \"'ㅿ' > 'pansios'\"\n- \"'ㆀ' > 'ssangieung'\"\n- \"'ㆁ' > 'yesieung'\"\n- \"'ㆂ' > 'yesieung-sios'\"\n- \"'ㆃ' > 'yesieung-pansios'\"\n- \"'ㆄ' > 'kapyeounphieuph'\"\n- \"'ㆅ' > 'ssanghieuh'\"\n- \"'ㆆ' > 'yeorinhieuh'\"\n- \"'ㆇ' > 'yo-ya'\"\n- \"'ㆈ' > 'yo-yae'\"\n- \"'ㆉ' > 'yo-i'\"\n- \"'ㆊ' > 'yu-yeo'\"\n- \"'ㆋ' > 'yu-ye'\"\n- \"'ㆌ' > 'yu-i'\"\n- \"'ㆍ' > 'araea'\"\n- \"'ㆎ' > 'araeae'\"\n- \"'ㆠ' > 'bu'\"\n- \"'ㆡ' > 'zi'\"\n- \"'ㆢ' > 'ji'\"\n- \"'ㆣ' > 'gu'\"\n- \"'ㆤ' > 'ee'\"\n- \"'ㆥ' > 'enn'\"\n- \"'ㆦ' > 'oo'\"\n- \"'ㆧ' > 'onn'\"\n- \"'ㆨ' > 'ir'\"\n- \"'ㆩ' > 'ann'\"\n- \"'ㆪ' > 'inn'\"\n- \"'ㆫ' > 'unn'\"\n- \"'ㆬ' > 'im'\"\n- \"'ㆭ' > 'ngg'\"\n- \"'ㆮ' > 'ainn'\"\n- \"'ㆯ' > 'aunn'\"\n- \"'ㆰ' > 'am'\"\n- \"'ㆱ' > 'om'\"\n- \"'ㆲ' > 'ong'\"\n- \"'ㆳ' > 'innn'\"\n- \"'ㆴ' > 'p'\"\n- \"'ㆵ' > 't'\"\n- \"'ㆶ' > 'k'\"\n- \"'ㆷ' > 'h'\"\n- \"'ㇰ' > 'ku'\"\n- \"'ㇱ' > 'si'\"\n- \"'ㇲ' > 'su'\"\n- \"'ㇳ' > 'to'\"\n- \"'ㇴ' > 'nu'\"\n- \"'ㇵ' > 'ha'\"\n- \"'ㇶ' > 'hi'\"\n- \"'ㇷ' > 'hu'\"\n- \"'ㇸ' > 'he'\"\n- \"'ㇹ' > 'ho'\"\n- \"'ㇺ' > 'mu'\"\n- \"'ㇻ' > 'ra'\"\n- \"'ㇼ' > 'ri'\"\n- \"'ㇽ' > 'ru'\"\n- \"'ㇾ' > 're'\"\n- \"'ㇿ' > 'ro'\"\n- \"'兙' > ' shi'\"\n- \"'兡' > ' bai'\"\n- \"'嗧' > ' jia'\"\n- \"'瓧' > ' seng'\"\n- \"'瓰' > ' bo'\"\n- \"'瓱' > ' gu'\"\n- \"'瓼' > ' feng'\"\n- \"'甅' > ' dang'\"\n- \"'龦' > ' ze'\"\n- \"'龧' > ' qie'\"\n- \"'龨' > ' tuo'\"\n- \"'龩' > ' luo'\"\n- \"'龪' > ' dan'\"\n- \"'龫' > ' xiao'\"\n- \"'龬' > ' ruo'\"\n- \"'龭' > ' jian'\"\n- \"'龮' > ' xuan'\"\n- \"'龯' > ' bian'\"\n- \"'龰' > ' sun'\"\n- \"'龱' > ' xiang'\"\n- \"'龲' > ' xian'\"\n- \"'龳' > ' ping'\"\n- \"'龴' > ' zhen'\"\n- \"'龵' > ' sheng'\"\n- \"'龶' > ' hu'\"\n- \"'龷' > ' shi'\"\n- \"'龸' > ' zhu'\"\n- \"'龹' > ' yue'\"\n- \"'龺' > ' chun'\"\n- \"'龻' > ' lu'\"\n- \"'龼' > ' wu'\"\n- \"'龽' > ' dong'\"\n- \"'龾' > ' xiao'\"\n- \"'龿' > ' ji'\"\n- \"'鿀' > ' jie'\"\n- \"'鿁' > ' huang'\"\n- \"'鿂' > ' xing'\"\n- \"'鿄' > ' fan'\"\n- \"'鿅' > ' chui'\"\n- \"'鿆' > ' zhuan'\"\n- \"'鿇' > ' pian'\"\n- \"'鿈' > ' feng'\"\n- \"'鿉' > ' zhu'\"\n- \"'鿊' > ' hong'\"\n- \"'鿋' > ' qie'\"\n- \"'鿌' > ' hou'\"\n- \"'鿑' > ' kui'\"\n- \"'鿒' > ' sik'\"\n- \"'鿓' > ' lou'\"\n- \"'鿖' > ' tang'\"\n- \"'鿗' > ' yue'\"\n- \"'鿘' > ' chou'\"\n- \"'鿙' > ' gao'\"\n- \"'鿚' > ' fei'\"\n- \"'鿛' > ' ruo'\"\n- \"'鿜' > ' zheng'\"\n- \"'鿝' > ' gou'\"\n- \"'鿞' > ' nie'\"\n- \"'鿟' > ' qian'\"\n- \"'鿠' > ' xiao'\"\n- \"'鿡' > ' cuan'\"\n- \"'鿢' > ' gong'\"\n- \"'鿣' > ' pang'\"\n- \"'鿤' > ' du'\"\n- \"'鿥' > ' li'\"\n- \"'鿦' > ' bi'\"\n- \"'鿧' > ' zhuo'\"\n- \"'鿨' > ' chu'\"\n- \"'鿩' > ' shai'\"\n- \"'鿪' > ' chi'\"\n- \"'鿮' > ' lan'\"\n- \"'鿯' > ' jian'\"\n- \"'ꀀ' > ' ze'\"\n- \"'ꀁ' > ' xi'\"\n- \"'ꀂ' > ' guo'\"\n- \"'ꀃ' > ' yi'\"\n- \"'ꀄ' > ' hu'\"\n- \"'ꀅ' > ' chan'\"\n- \"'ꀆ' > ' kou'\"\n- \"'ꀇ' > ' cu'\"\n- \"'ꀈ' > ' ping'\"\n- \"'ꀉ' > ' chou'\"\n- \"'ꀊ' > ' ji'\"\n- \"'ꀋ' > ' gui'\"\n- \"'ꀌ' > ' su'\"\n- \"'ꀍ' > ' lou'\"\n- \"'ꀎ' > ' zha'\"\n- \"'ꀏ' > ' lu'\"\n- \"'ꀐ' > ' nian'\"\n- \"'ꀑ' > ' suo'\"\n- \"'ꀒ' > ' cuan'\"\n- \"'ꀓ' > ' sasara'\"\n- \"'ꀔ' > ' suo'\"\n- \"'ꀕ' > ' le'\"\n- \"'ꀖ' > ' duan'\"\n- \"'ꀗ' > ' yana'\"\n- \"'ꀘ' > ' xiao'\"\n- \"'ꀙ' > ' bo'\"\n- \"'ꀚ' > ' mi'\"\n- \"'ꀛ' > ' si'\"\n- \"'ꀜ' > ' dang'\"\n- \"'ꀝ' > ' liao'\"\n- \"'ꀞ' > ' dan'\"\n- \"'ꀟ' > ' dian'\"\n- \"'ꀠ' > ' fu'\"\n- \"'ꀡ' > ' jian'\"\n- \"'ꀢ' > ' min'\"\n- \"'ꀣ' > ' kui'\"\n- \"'ꀤ' > ' dai'\"\n- \"'ꀥ' > ' qiao'\"\n- \"'ꀦ' > ' deng'\"\n- \"'ꀧ' > ' huang'\"\n- \"'ꀨ' > ' sun'\"\n- \"'ꀩ' > ' lao'\"\n- \"'ꀪ' > ' zan'\"\n- \"'ꀫ' > ' xiao'\"\n- \"'ꀬ' > ' du'\"\n- \"'ꀭ' > ' shi'\"\n- \"'ꀮ' > ' zan'\"\n- \"'ꀯ' > 'bup'\"\n- \"'ꀰ' > ' pai'\"\n- \"'ꀱ' > ' hata'\"\n- \"'ꀲ' > ' pai'\"\n- \"'ꀳ' > ' gan'\"\n- \"'ꀴ' > ' ju'\"\n- \"'ꀵ' > ' du'\"\n- \"'ꀶ' > ' lu'\"\n- \"'ꀷ' > ' yan'\"\n- \"'ꀸ' > ' bo'\"\n- \"'ꀹ' > ' dang'\"\n- \"'ꀺ' > ' sai'\"\n- \"'ꀻ' > ' ke'\"\n- \"'ꀼ' > ' long'\"\n- \"'ꀽ' > ' qian'\"\n- \"'ꀾ' > ' lian'\"\n- \"'ꀿ' > ' bo'\"\n- \"'ꁀ' > ' zhou'\"\n- \"'ꁁ' > ' lai'\"\n- \"'ꁂ' > 'pap'\"\n- \"'ꁃ' > ' lan'\"\n- \"'ꁄ' > ' kui'\"\n- \"'ꁅ' > ' yu'\"\n- \"'ꁆ' > ' yue'\"\n- \"'ꁇ' > ' hao'\"\n- \"'ꁈ' > ' zhen'\"\n- \"'ꁉ' > ' tai'\"\n- \"'ꁊ' > ' ti'\"\n- \"'ꁋ' > ' mi'\"\n- \"'ꁌ' > ' chou'\"\n- \"'ꁍ' > ' ji'\"\n- \"'ꁎ' > 'purx'\"\n- \"'ꁏ' > ' hata'\"\n- \"'ꁐ' > ' teng'\"\n- \"'ꁑ' > ' zhuan'\"\n- \"'ꁒ' > ' zhou'\"\n- \"'ꁓ' > ' fan'\"\n- \"'ꁔ' > ' sou'\"\n- \"'ꁕ' > ' zhou'\"\n- \"'ꁖ' > ' kuji'\"\n- \"'ꁗ' > ' zhuo'\"\n- \"'ꁘ' > ' teng'\"\n- \"'ꁙ' > ' lu'\"\n- \"'ꁚ' > ' lu'\"\n- \"'ꁛ' > ' jian'\"\n- \"'ꁜ' > ' tuo'\"\n- \"'ꁝ' > ' ying'\"\n- \"'ꁞ' > ' yu'\"\n- \"'ꁟ' > ' lai'\"\n- \"'ꁠ' > ' long'\"\n- \"'ꁡ' > ' shinshi'\"\n- \"'ꁢ' > ' lian'\"\n- \"'ꁣ' > ' lan'\"\n- \"'ꁤ' > ' qian'\"\n- \"'ꁥ' > ' yue'\"\n- \"'ꁦ' > ' zhong'\"\n- \"'ꁧ' > ' qu'\"\n- \"'ꁨ' > ' lian'\"\n- \"'ꁩ' > ' bian'\"\n- \"'ꁪ' > ' duan'\"\n- \"'ꁫ' > ' zuan'\"\n- \"'ꁬ' > ' li'\"\n- \"'ꁭ' > ' si'\"\n- \"'ꁮ' > ' luo'\"\n- \"'ꁯ' > ' ying'\"\n- \"'ꁰ' > ' yue'\"\n- \"'ꁱ' > ' zhuo'\"\n- \"'ꁲ' > ' xu'\"\n- \"'ꁳ' > ' mi'\"\n- \"'ꁴ' > ' di'\"\n- \"'ꁵ' > ' fan'\"\n- \"'ꁶ' > ' shen'\"\n- \"'ꁷ' > ' zhe'\"\n- \"'ꁸ' > ' shen'\"\n- \"'ꁹ' > ' nu'\"\n- \"'ꁺ' > ' xie'\"\n- \"'ꁻ' > ' lei'\"\n- \"'ꁼ' > ' xian'\"\n- \"'ꁽ' > ' zi'\"\n- \"'ꁾ' > ' ni'\"\n- \"'ꁿ' > ' cun'\"\n- \"'ꂀ' > 'nbap'\"\n- \"'ꂁ' > ' qian'\"\n- \"'ꂂ' > ' kume'\"\n- \"'ꂃ' > ' bi'\"\n- \"'ꂄ' > ' ban'\"\n- \"'ꂅ' > ' wu'\"\n- \"'ꂆ' > ' sha'\"\n- \"'ꂇ' > ' kang'\"\n- \"'ꂈ' > ' rou'\"\n- \"'ꂉ' > ' fen'\"\n- \"'ꂊ' > ' bi'\"\n- \"'ꂋ' > ' cui'\"\n- \"'ꂌ' > 'nbyx'\"\n- \"'ꂍ' > ' li'\"\n- \"'ꂎ' > ' chi'\"\n- \"'ꂏ' > ' nukamiso'\"\n- \"'ꂐ' > ' ro'\"\n- \"'ꂑ' > ' ba'\"\n- \"'ꂒ' > ' li'\"\n- \"'ꂓ' > ' gan'\"\n- \"'ꂔ' > ' ju'\"\n- \"'ꂕ' > ' po'\"\n- \"'ꂖ' > ' mo'\"\n- \"'ꂗ' > ' cu'\"\n- \"'ꂘ' > ' nian'\"\n- \"'ꂙ' > ' zhou'\"\n- \"'ꂚ' > ' li'\"\n- \"'ꂛ' > ' su'\"\n- \"'ꂜ' > ' tiao'\"\n- \"'ꂝ' > ' li'\"\n- \"'ꂞ' > ' qi'\"\n- \"'ꂟ' > ' su'\"\n- \"'ꂠ' > ' hong'\"\n- \"'ꂡ' > ' tong'\"\n- \"'ꂢ' > ' zi'\"\n- \"'ꂣ' > ' ce'\"\n- \"'ꂤ' > ' yue'\"\n- \"'ꂥ' > ' zhou'\"\n- \"'ꂦ' > ' lin'\"\n- \"'ꂧ' > ' zhuang'\"\n- \"'ꂨ' > ' bai'\"\n- \"'ꂩ' > 'hmyx'\"\n- \"'ꂪ' > ' fen'\"\n- \"'ꂫ' > ' ji'\"\n- \"'ꂬ' > 'hmyrx'\"\n- \"'ꂭ' > ' sukumo'\"\n- \"'ꂮ' > ' liang'\"\n- \"'ꂯ' > ' xian'\"\n- \"'ꂰ' > ' fu'\"\n- \"'ꂱ' > ' liang'\"\n- \"'ꂲ' > ' can'\"\n- \"'ꂳ' > ' geng'\"\n- \"'ꂴ' > ' li'\"\n- \"'ꂵ' > ' yue'\"\n- \"'ꂶ' > ' lu'\"\n- \"'ꂷ' > ' ju'\"\n- \"'ꂸ' > ' qi'\"\n- \"'ꂹ' > ' cui'\"\n- \"'ꂺ' > ' bai'\"\n- \"'ꂻ' > ' zhang'\"\n- \"'ꂼ' > ' lin'\"\n- \"'ꂽ' > ' zong'\"\n- \"'ꂾ' > ' jing'\"\n- \"'ꂿ' > ' guo'\"\n- \"'ꃀ' > ' kouji'\"\n- \"'ꃁ' > ' san'\"\n- \"'ꃂ' > ' san'\"\n- \"'ꃃ' > ' tang'\"\n- \"'ꃄ' > ' bian'\"\n- \"'ꃅ' > ' rou'\"\n- \"'ꃆ' > ' mian'\"\n- \"'ꃇ' > ' hou'\"\n- \"'ꃈ' > ' xu'\"\n- \"'ꃉ' > ' zong'\"\n- \"'ꃊ' > ' hu'\"\n- \"'ꃋ' > ' jian'\"\n- \"'ꃌ' > ' zan'\"\n- \"'ꃍ' > ' ci'\"\n- \"'ꃎ' > ' li'\"\n- \"'ꃏ' > ' xie'\"\n- \"'ꃐ' > ' fu'\"\n- \"'ꃑ' > ' ni'\"\n- \"'ꃒ' > ' bei'\"\n- \"'ꃓ' > ' gu'\"\n- \"'ꃔ' > ' xiu'\"\n- \"'ꃕ' > ' gao'\"\n- \"'ꃖ' > ' tang'\"\n- \"'ꃗ' > ' qiu'\"\n- \"'ꃘ' > ' sukumo'\"\n- \"'ꃙ' > ' cao'\"\n- \"'ꃚ' > ' zhuang'\"\n- \"'ꃛ' > ' tang'\"\n- \"'ꃜ' > ' mi'\"\n- \"'ꃝ' > ' san'\"\n- \"'ꃞ' > ' fen'\"\n- \"'ꃟ' > ' zao'\"\n- \"'ꃠ' > ' kang'\"\n- \"'ꃡ' > ' jiang'\"\n- \"'ꃢ' > ' mo'\"\n- \"'ꃣ' > ' san'\"\n- \"'ꃤ' > ' san'\"\n- \"'ꃥ' > ' nuo'\"\n- \"'ꃦ' > ' xi'\"\n- \"'ꃧ' > ' liang'\"\n- \"'ꃨ' > ' jiang'\"\n- \"'ꃩ' > ' kuai'\"\n- \"'ꃪ' > ' bo'\"\n- \"'ꃫ' > ' huan'\"\n- \"'ꃬ' > 'va'\"\n- \"'ꃭ' > ' zong'\"\n- \"'ꃮ' > ' xian'\"\n- \"'ꃯ' > ' nuo'\"\n- \"'ꃰ' > ' tuan'\"\n- \"'ꃱ' > ' nie'\"\n- \"'ꃲ' > ' li'\"\n- \"'ꃳ' > ' zuo'\"\n- \"'ꃴ' > ' di'\"\n- \"'ꃵ' > ' nie'\"\n- \"'ꃶ' > ' tiao'\"\n- \"'ꃷ' > ' lan'\"\n- \"'ꃸ' > ' mi'\"\n- \"'ꃹ' > ' jiao'\"\n- \"'ꃺ' > ' jiu'\"\n- \"'ꃻ' > ' xi'\"\n- \"'ꃼ' > ' gong'\"\n- \"'ꃽ' > ' zheng'\"\n- \"'ꃾ' > ' jiu'\"\n- \"'ꃿ' > ' you'\"\n- \"'ꄀ' > ' ji'\"\n- \"'ꄁ' > ' cha'\"\n- \"'ꄂ' > ' zhou'\"\n- \"'ꄃ' > ' xun'\"\n- \"'ꄄ' > ' yue'\"\n- \"'ꄅ' > ' hong'\"\n- \"'ꄆ' > ' yu'\"\n- \"'ꄇ' > ' he'\"\n- \"'ꄈ' > ' wan'\"\n- \"'ꄉ' > ' ren'\"\n- \"'ꄊ' > ' wen'\"\n- \"'ꄋ' > ' wen'\"\n- \"'ꄌ' > ' qiu'\"\n- \"'ꄍ' > ' na'\"\n- \"'ꄎ' > ' zi'\"\n- \"'ꄏ' > ' tou'\"\n- \"'ꄐ' > ' niu'\"\n- \"'ꄑ' > ' fou'\"\n- \"'ꄒ' > ' jie'\"\n- \"'ꄓ' > ' shu'\"\n- \"'ꄔ' > ' chun'\"\n- \"'ꄕ' > ' pi'\"\n- \"'ꄖ' > ' yin'\"\n- \"'ꄗ' > ' sha'\"\n- \"'ꄘ' > ' hong'\"\n- \"'ꄙ' > ' zhi'\"\n- \"'ꄚ' > ' ji'\"\n- \"'ꄛ' > ' fen'\"\n- \"'ꄜ' > ' yun'\"\n- \"'ꄝ' > ' ren'\"\n- \"'ꄞ' > ' dan'\"\n- \"'ꄟ' > ' jin'\"\n- \"'ꄠ' > ' su'\"\n- \"'ꄡ' > ' fang'\"\n- \"'ꄢ' > ' suo'\"\n- \"'ꄣ' > ' cui'\"\n- \"'ꄤ' > ' jiu'\"\n- \"'ꄥ' > ' zha'\"\n- \"'ꄦ' > ' kinu'\"\n- \"'ꄧ' > ' jin'\"\n- \"'ꄨ' > ' fu'\"\n- \"'ꄩ' > ' zhi'\"\n- \"'ꄪ' > ' ci'\"\n- \"'ꄫ' > ' zi'\"\n- \"'ꄬ' > ' chou'\"\n- \"'ꄭ' > ' hong'\"\n- \"'ꄮ' > ' zha'\"\n- \"'ꄯ' > ' lei'\"\n- \"'ꄰ' > ' xi'\"\n- \"'ꄱ' > ' fu'\"\n- \"'ꄲ' > ' xie'\"\n- \"'ꄳ' > ' shen'\"\n- \"'ꄴ' > ' bei'\"\n- \"'ꄵ' > ' zhu'\"\n- \"'ꄶ' > ' qu'\"\n- \"'ꄷ' > ' ling'\"\n- \"'ꄸ' > ' zhu'\"\n- \"'ꄹ' > ' shao'\"\n- \"'ꄺ' > ' gan'\"\n- \"'ꄻ' > ' yang'\"\n- \"'ꄼ' > ' fu'\"\n- \"'ꄽ' > ' tuo'\"\n- \"'ꄾ' > ' zhen'\"\n- \"'ꄿ' > ' dai'\"\n- \"'ꅀ' > ' zhuo'\"\n- \"'ꅁ' > ' shi'\"\n- \"'ꅂ' > ' zhong'\"\n- \"'ꅃ' > ' xian'\"\n- \"'ꅄ' > ' zu'\"\n- \"'ꅅ' > ' jiong'\"\n- \"'ꅆ' > ' ban'\"\n- \"'ꅇ' > ' ju'\"\n- \"'ꅈ' > ' mo'\"\n- \"'ꅉ' > ' shu'\"\n- \"'ꅊ' > ' zui'\"\n- \"'ꅋ' > ' wata'\"\n- \"'ꅌ' > ' jing'\"\n- \"'ꅍ' > ' ren'\"\n- \"'ꅎ' > ' heng'\"\n- \"'ꅏ' > ' xie'\"\n- \"'ꅐ' > ' jie'\"\n- \"'ꅑ' > ' zhu'\"\n- \"'ꅒ' > ' chou'\"\n- \"'ꅓ' > ' gua'\"\n- \"'ꅔ' > ' bai'\"\n- \"'ꅕ' > ' jue'\"\n- \"'ꅖ' > ' kuang'\"\n- \"'ꅗ' > ' hu'\"\n- \"'ꅘ' > ' ci'\"\n- \"'ꅙ' > ' geng'\"\n- \"'ꅚ' > ' geng'\"\n- \"'ꅛ' > ' tao'\"\n- \"'ꅜ' > ' xie'\"\n- \"'ꅝ' > ' ku'\"\n- \"'ꅞ' > ' jiao'\"\n- \"'ꅟ' > ' quan'\"\n- \"'ꅠ' > ' gai'\"\n- \"'ꅡ' > ' luo'\"\n- \"'ꅢ' > ' xuan'\"\n- \"'ꅣ' > ' bing'\"\n- \"'ꅤ' > ' xian'\"\n- \"'ꅥ' > ' fu'\"\n- \"'ꅦ' > ' gei'\"\n- \"'ꅧ' > ' tong'\"\n- \"'ꅨ' > ' rong'\"\n- \"'ꅩ' > ' tiao'\"\n- \"'ꅪ' > ' yin'\"\n- \"'ꅫ' > ' lei'\"\n- \"'ꅬ' > ' xie'\"\n- \"'ꅭ' > ' quan'\"\n- \"'ꅮ' > ' xu'\"\n- \"'ꅯ' > ' lun'\"\n- \"'ꅰ' > ' die'\"\n- \"'ꅱ' > ' tong'\"\n- \"'ꅲ' > ' si'\"\n- \"'ꅳ' > ' jiang'\"\n- \"'ꅴ' > ' xiang'\"\n- \"'ꅵ' > ' hui'\"\n- \"'ꅶ' > ' jue'\"\n- \"'ꅷ' > ' zhi'\"\n- \"'ꅸ' > ' jian'\"\n- \"'ꅹ' > ' juan'\"\n- \"'ꅺ' > ' chi'\"\n- \"'ꅻ' > ' mian'\"\n- \"'ꅼ' > ' zhen'\"\n- \"'ꅽ' > ' lu'\"\n- \"'ꅾ' > ' cheng'\"\n- \"'ꅿ' > ' qiu'\"\n- \"'ꆀ' > ' shu'\"\n- \"'ꆁ' > ' bang'\"\n- \"'ꆂ' > ' tong'\"\n- \"'ꆃ' > ' xiao'\"\n- \"'ꆄ' > ' wan'\"\n- \"'ꆅ' > ' qin'\"\n- \"'ꆆ' > ' geng'\"\n- \"'ꆇ' > ' xiu'\"\n- \"'ꆈ' > ' ti'\"\n- \"'ꆉ' > ' xiu'\"\n- \"'ꆊ' > ' xie'\"\n- \"'ꆋ' > ' hong'\"\n- \"'ꆌ' > ' xi'\"\n- \"'ꆍ' > ' fu'\"\n- \"'ꆎ' > ' ting'\"\n- \"'ꆏ' > ' sui'\"\n- \"'ꆐ' > ' dui'\"\n- \"'ꆑ' > ' kun'\"\n- \"'ꆒ' > ' fu'\"\n- \"'ꆓ' > ' jing'\"\n- \"'ꆔ' > ' hu'\"\n- \"'ꆕ' > ' zhi'\"\n- \"'ꆖ' > ' yan'\"\n- \"'ꆗ' > ' jiong'\"\n- \"'ꆘ' > ' feng'\"\n- \"'ꆙ' > ' ji'\"\n- \"'ꆚ' > ' sok'\"\n- \"'ꆛ' > ' kase'\"\n- \"'ꆜ' > ' zong'\"\n- \"'ꆝ' > ' lin'\"\n- \"'ꆞ' > ' duo'\"\n- \"'ꆟ' > ' li'\"\n- \"'ꆠ' > ' lu'\"\n- \"'ꆡ' > ' liang'\"\n- \"'ꆢ' > ' chou'\"\n- \"'ꆣ' > ' quan'\"\n- \"'ꆤ' > ' shao'\"\n- \"'ꆥ' > ' qi'\"\n- \"'ꆦ' > ' qi'\"\n- \"'ꆧ' > ' zhun'\"\n- \"'ꆨ' > ' qi'\"\n- \"'ꆩ' > ' wan'\"\n- \"'ꆪ' > ' qian'\"\n- \"'ꆫ' > ' xian'\"\n- \"'ꆬ' > ' shou'\"\n- \"'ꆭ' > ' wei'\"\n- \"'ꆮ' > ' qi'\"\n- \"'ꆯ' > ' tao'\"\n- \"'ꆰ' > ' wan'\"\n- \"'ꆱ' > ' gang'\"\n- \"'ꆲ' > ' wang'\"\n- \"'ꆳ' > ' beng'\"\n- \"'ꆴ' > ' zhui'\"\n- \"'ꆵ' > ' cai'\"\n- \"'ꆶ' > ' guo'\"\n- \"'ꆷ' > ' cui'\"\n- \"'ꆸ' > ' lun'\"\n- \"'ꆹ' > ' liu'\"\n- \"'ꆺ' > ' qi'\"\n- \"'ꆻ' > ' zhan'\"\n- \"'ꆼ' > ' bei'\"\n- \"'ꆽ' > ' chuo'\"\n- \"'ꆾ' > ' ling'\"\n- \"'ꆿ' > ' mian'\"\n- \"'ꇀ' > ' qi'\"\n- \"'ꇁ' > ' qie'\"\n- \"'ꇂ' > ' tan'\"\n- \"'ꇃ' > ' zong'\"\n- \"'ꇄ' > ' gun'\"\n- \"'ꇅ' > ' zou'\"\n- \"'ꇆ' > ' yi'\"\n- \"'ꇇ' > ' zi'\"\n- \"'ꇈ' > ' xing'\"\n- \"'ꇉ' > ' liang'\"\n- \"'ꇊ' > ' jin'\"\n- \"'ꇋ' > ' fei'\"\n- \"'ꇌ' > ' rui'\"\n- \"'ꇍ' > ' min'\"\n- \"'ꇎ' > ' yu'\"\n- \"'ꇏ' > ' zong'\"\n- \"'ꇐ' > ' fan'\"\n- \"'ꇑ' > ' lu'\"\n- \"'ꇒ' > ' xu'\"\n- \"'ꇓ' > ' yingl'\"\n- \"'ꇔ' > ' zhang'\"\n- \"'ꇕ' > ' kasuri'\"\n- \"'ꇖ' > ' xu'\"\n- \"'ꇗ' > ' xiang'\"\n- \"'ꇘ' > ' jian'\"\n- \"'ꇙ' > ' ke'\"\n- \"'ꇚ' > ' xian'\"\n- \"'ꇛ' > ' ruan'\"\n- \"'ꇜ' > ' mian'\"\n- \"'ꇝ' > ' qi'\"\n- \"'ꇞ' > ' duan'\"\n- \"'ꇟ' > ' zhong'\"\n- \"'ꇠ' > ' di'\"\n- \"'ꇡ' > ' min'\"\n- \"'ꇢ' > ' miao'\"\n- \"'ꇣ' > ' yuan'\"\n- \"'ꇤ' > ' xie'\"\n- \"'ꇥ' > ' bao'\"\n- \"'ꇦ' > ' si'\"\n- \"'ꇧ' > ' qiu'\"\n- \"'ꇨ' > ' bian'\"\n- \"'ꇩ' > ' huan'\"\n- \"'ꇪ' > ' geng'\"\n- \"'ꇫ' > ' cong'\"\n- \"'ꇬ' > ' mian'\"\n- \"'ꇭ' > ' wei'\"\n- \"'ꇮ' > ' fu'\"\n- \"'ꇯ' > ' wei'\"\n- \"'ꇰ' > ' yu'\"\n- \"'ꇱ' > ' gou'\"\n- \"'ꇲ' > ' miao'\"\n- \"'ꇳ' > ' xie'\"\n- \"'ꇴ' > ' lian'\"\n- \"'ꇵ' > ' zong'\"\n- \"'ꇶ' > ' bian'\"\n- \"'ꇷ' > ' yun'\"\n- \"'ꇸ' > ' yin'\"\n- \"'ꇹ' > ' ti'\"\n- \"'ꇺ' > ' gua'\"\n- \"'ꇻ' > ' zhi'\"\n- \"'ꇼ' > ' yun'\"\n- \"'ꇽ' > ' cheng'\"\n- \"'ꇾ' > ' chan'\"\n- \"'ꇿ' > ' dai'\"\n- \"'ꈀ' > ' xia'\"\n- \"'ꈁ' > ' yuan'\"\n- \"'ꈂ' > ' zong'\"\n- \"'ꈃ' > ' xu'\"\n- \"'ꈄ' > ' nawa'\"\n- \"'ꈅ' > ' odoshi'\"\n- \"'ꈆ' > ' geng'\"\n- \"'ꈇ' > ' sen'\"\n- \"'ꈈ' > ' ying'\"\n- \"'ꈉ' > ' jin'\"\n- \"'ꈊ' > ' yi'\"\n- \"'ꈋ' > ' zhui'\"\n- \"'ꈌ' > ' ni'\"\n- \"'ꈍ' > ' bang'\"\n- \"'ꈎ' > ' gu'\"\n- \"'ꈏ' > ' pan'\"\n- \"'ꈐ' > ' zhou'\"\n- \"'ꈑ' > ' jian'\"\n- \"'ꈒ' > ' cuo'\"\n- \"'ꈓ' > ' quan'\"\n- \"'ꈔ' > ' shuang'\"\n- \"'ꈕ' > ' yun'\"\n- \"'ꈖ' > ' xia'\"\n- \"'ꈗ' > ' shuai'\"\n- \"'ꈘ' > ' xi'\"\n- \"'ꈙ' > ' rong'\"\n- \"'ꈚ' > ' tao'\"\n- \"'ꈛ' > ' fu'\"\n- \"'ꈜ' > ' yun'\"\n- \"'ꈝ' > ' zhen'\"\n- \"'ꈞ' > ' gao'\"\n- \"'ꈟ' > ' ru'\"\n- \"'ꈠ' > ' hu'\"\n- \"'ꈡ' > ' zai'\"\n- \"'ꈢ' > ' teng'\"\n- \"'ꈣ' > ' xian'\"\n- \"'ꈤ' > ' su'\"\n- \"'ꈥ' > ' zhen'\"\n- \"'ꈦ' > ' zong'\"\n- \"'ꈧ' > ' tao'\"\n- \"'ꈨ' > ' horo'\"\n- \"'ꈩ' > ' cai'\"\n- \"'ꈪ' > ' bi'\"\n- \"'ꈫ' > ' feng'\"\n- \"'ꈬ' > ' cu'\"\n- \"'ꈭ' > ' li'\"\n- \"'ꈮ' > ' suo'\"\n- \"'ꈯ' > ' yin'\"\n- \"'ꈰ' > ' xi'\"\n- \"'ꈱ' > ' zong'\"\n- \"'ꈲ' > ' lei'\"\n- \"'ꈳ' > ' zhuan'\"\n- \"'ꈴ' > ' qian'\"\n- \"'ꈵ' > ' man'\"\n- \"'ꈶ' > ' zhi'\"\n- \"'ꈷ' > ' lu'\"\n- \"'ꈸ' > ' mo'\"\n- \"'ꈹ' > ' piao'\"\n- \"'ꈺ' > ' lian'\"\n- \"'ꈻ' > ' mi'\"\n- \"'ꈼ' > ' xuan'\"\n- \"'ꈽ' > ' zong'\"\n- \"'ꈾ' > ' ji'\"\n- \"'ꈿ' > ' shan'\"\n- \"'ꉀ' > ' sui'\"\n- \"'ꉁ' > ' fan'\"\n- \"'ꉂ' > ' shuai'\"\n- \"'ꉃ' > ' beng'\"\n- \"'ꉄ' > ' yi'\"\n- \"'ꉅ' > ' sao'\"\n- \"'ꉆ' > ' mou'\"\n- \"'ꉇ' > ' zhou'\"\n- \"'ꉈ' > ' qiang'\"\n- \"'ꉉ' > ' hun'\"\n- \"'ꉊ' > ' sem'\"\n- \"'ꉋ' > ' xi'\"\n- \"'ꉌ' > ' jung'\"\n- \"'ꉍ' > ' xiu'\"\n- \"'ꉎ' > ' ran'\"\n- \"'ꉏ' > ' xuan'\"\n- \"'ꉐ' > ' hui'\"\n- \"'ꉑ' > ' qiao'\"\n- \"'ꉒ' > ' zeng'\"\n- \"'ꉓ' > ' zuo'\"\n- \"'ꉔ' > ' zhi'\"\n- \"'ꉕ' > ' shan'\"\n- \"'ꉖ' > ' san'\"\n- \"'ꉗ' > ' lin'\"\n- \"'ꉘ' > ' yu'\"\n- \"'ꉙ' > ' fan'\"\n- \"'ꉚ' > ' liao'\"\n- \"'ꉛ' > ' chuo'\"\n- \"'ꉜ' > ' zun'\"\n- \"'ꉝ' > ' jian'\"\n- \"'ꉞ' > ' rao'\"\n- \"'ꉟ' > ' chan'\"\n- \"'ꉠ' > ' rui'\"\n- \"'ꉡ' > ' xiu'\"\n- \"'ꉢ' > ' hui'\"\n- \"'ꉣ' > ' hua'\"\n- \"'ꉤ' > ' zuan'\"\n- \"'ꉥ' > ' xi'\"\n- \"'ꉦ' > ' qiang'\"\n- \"'ꉧ' > ' un'\"\n- \"'ꉨ' > ' da'\"\n- \"'ꉩ' > ' sheng'\"\n- \"'ꉪ' > ' hui'\"\n- \"'ꉫ' > ' xi'\"\n- \"'ꉬ' > ' se'\"\n- \"'ꉭ' > ' jian'\"\n- \"'ꉮ' > ' jiang'\"\n- \"'ꉯ' > ' huan'\"\n- \"'ꉰ' > ' zao'\"\n- \"'ꉱ' > ' cong'\"\n- \"'ꉲ' > ' jie'\"\n- \"'ꉳ' > ' jiao'\"\n- \"'ꉴ' > ' bo'\"\n- \"'ꉵ' > ' chan'\"\n- \"'ꉶ' > ' yi'\"\n- \"'ꉷ' > ' nao'\"\n- \"'ꉸ' > ' sui'\"\n- \"'ꉹ' > ' yi'\"\n- \"'ꉺ' > ' shai'\"\n- \"'ꉻ' > ' xu'\"\n- \"'ꉼ' > ' ji'\"\n- \"'ꉽ' > ' bin'\"\n- \"'ꉾ' > ' qian'\"\n- \"'ꉿ' > ' lan'\"\n- \"'ꊀ' > ' pu'\"\n- \"'ꊁ' > ' xun'\"\n- \"'ꊂ' > ' zuan'\"\n- \"'ꊃ' > ' qi'\"\n- \"'ꊄ' > ' peng'\"\n- \"'ꊅ' > ' li'\"\n- \"'ꊆ' > ' mo'\"\n- \"'ꊇ' > ' lei'\"\n- \"'ꊈ' > ' xie'\"\n- \"'ꊉ' > ' zuan'\"\n- \"'ꊊ' > ' kuang'\"\n- \"'ꊋ' > ' you'\"\n- \"'ꊌ' > ' xu'\"\n- \"'ꊍ' > ' lei'\"\n- \"'ꊎ' > ' xian'\"\n- \"'ꊏ' > ' chan'\"\n- \"'ꊐ' > ' kou'\"\n- \"'ꊑ' > ' lu'\"\n- \"'ꊒ' > ' chan'\"\n- \"'ꊓ' > ' ying'\"\n- \"'ꊔ' > ' cai'\"\n- \"'ꊕ' > ' xiang'\"\n- \"'ꊖ' > ' xian'\"\n- \"'ꊗ' > ' zui'\"\n- \"'ꊘ' > ' zuan'\"\n- \"'ꊙ' > ' luo'\"\n- \"'ꊚ' > ' xi'\"\n- \"'ꊛ' > ' dao'\"\n- \"'ꊜ' > ' lan'\"\n- \"'ꊝ' > ' lei'\"\n- \"'ꊞ' > ' lian'\"\n- \"'ꊟ' > ' si'\"\n- \"'ꊠ' > ' jiu'\"\n- \"'ꊡ' > ' yu'\"\n- \"'ꊢ' > ' hong'\"\n- \"'ꊣ' > ' zhou'\"\n- \"'ꊤ' > ' xian'\"\n- \"'ꊥ' > ' he'\"\n- \"'ꊦ' > ' yue'\"\n- \"'ꊧ' > ' ji'\"\n- \"'ꊨ' > ' wan'\"\n- \"'ꊩ' > ' kuang'\"\n- \"'ꊪ' > ' ji'\"\n- \"'ꊫ' > ' ren'\"\n- \"'ꊬ' > ' wei'\"\n- \"'ꊭ' > ' yun'\"\n- \"'ꊮ' > ' hong'\"\n- \"'ꊯ' > ' chun'\"\n- \"'ꊰ' > ' pi'\"\n- \"'ꊱ' > ' sha'\"\n- \"'ꊲ' > ' gang'\"\n- \"'ꊳ' > ' na'\"\n- \"'ꊴ' > ' ren'\"\n- \"'ꊵ' > ' zong'\"\n- \"'ꊶ' > ' lun'\"\n- \"'ꊷ' > ' fen'\"\n- \"'ꊸ' > ' zhi'\"\n- \"'ꊹ' > ' wen'\"\n- \"'ꊺ' > ' fang'\"\n- \"'ꊻ' > ' zhu'\"\n- \"'ꊼ' > ' yin'\"\n- \"'ꊽ' > ' niu'\"\n- \"'ꊾ' > ' shu'\"\n- \"'ꊿ' > ' xian'\"\n- \"'ꋀ' > ' gan'\"\n- \"'ꋁ' > ' xie'\"\n- \"'ꋂ' > ' fu'\"\n- \"'ꋃ' > ' lian'\"\n- \"'ꋄ' > ' zu'\"\n- \"'ꋅ' > ' shen'\"\n- \"'ꋆ' > ' xi'\"\n- \"'ꋇ' > ' zhi'\"\n- \"'ꋈ' > ' zhong'\"\n- \"'ꋉ' > ' zhou'\"\n- \"'ꋊ' > ' ban'\"\n- \"'ꋋ' > ' fu'\"\n- \"'ꋌ' > ' zhuo'\"\n- \"'ꋍ' > ' shao'\"\n- \"'ꋎ' > ' yi'\"\n- \"'ꋏ' > ' jing'\"\n- \"'ꋐ' > ' dai'\"\n- \"'ꋑ' > ' bang'\"\n- \"'ꋒ' > ' rong'\"\n- \"'ꋓ' > ' jie'\"\n- \"'ꋔ' > ' ku'\"\n- \"'ꋕ' > ' rao'\"\n- \"'ꋖ' > ' die'\"\n- \"'ꋗ' > ' heng'\"\n- \"'ꋘ' > ' hui'\"\n- \"'ꋙ' > ' gei'\"\n- \"'ꋚ' > ' xuan'\"\n- \"'ꋛ' > ' jiang'\"\n- \"'ꋜ' > ' luo'\"\n- \"'ꋝ' > ' jue'\"\n- \"'ꋞ' > ' jiao'\"\n- \"'ꋟ' > ' tong'\"\n- \"'ꋠ' > ' geng'\"\n- \"'ꋡ' > ' xiao'\"\n- \"'ꋢ' > ' juan'\"\n- \"'ꋣ' > ' xiu'\"\n- \"'ꋤ' > ' xi'\"\n- \"'ꋥ' > ' sui'\"\n- \"'ꋦ' > ' tao'\"\n- \"'ꋧ' > ' ji'\"\n- \"'ꋨ' > ' ti'\"\n- \"'ꋩ' > ' ji'\"\n- \"'ꋪ' > ' xu'\"\n- \"'ꋫ' > ' ling'\"\n- \"'ꋬ' > 'zzyr'\"\n- \"'ꋭ' > ' xu'\"\n- \"'ꋮ' > ' qi'\"\n- \"'ꋯ' > ' fei'\"\n- \"'ꋰ' > ' chuo'\"\n- \"'ꋱ' > ' zhang'\"\n- \"'ꋲ' > ' gun'\"\n- \"'ꋳ' > ' sheng'\"\n- \"'ꋴ' > ' wei'\"\n- \"'ꋵ' > ' mian'\"\n- \"'ꋶ' > ' shou'\"\n- \"'ꋷ' > ' beng'\"\n- \"'ꋸ' > ' chou'\"\n- \"'ꋹ' > ' tao'\"\n- \"'ꋺ' > ' liu'\"\n- \"'ꋻ' > ' quan'\"\n- \"'ꋼ' > ' zong'\"\n- \"'ꋽ' > ' zhan'\"\n- \"'ꋾ' > ' wan'\"\n- \"'ꋿ' > ' lu'\"\n- \"'ꌀ' > ' zhui'\"\n- \"'ꌁ' > ' zi'\"\n- \"'ꌂ' > ' ke'\"\n- \"'ꌃ' > ' xiang'\"\n- \"'ꌄ' > ' jian'\"\n- \"'ꌅ' > ' mian'\"\n- \"'ꌆ' > ' lan'\"\n- \"'ꌇ' > ' ti'\"\n- \"'ꌈ' > ' miao'\"\n- \"'ꌉ' > ' qi'\"\n- \"'ꌊ' > ' yun'\"\n- \"'ꌋ' > ' hui'\"\n- \"'ꌌ' > ' si'\"\n- \"'ꌍ' > ' duo'\"\n- \"'ꌎ' > ' duan'\"\n- \"'ꌏ' > ' bian'\"\n- \"'ꌐ' > ' xian'\"\n- \"'ꌑ' > ' gou'\"\n- \"'ꌒ' > ' zhui'\"\n- \"'ꌓ' > ' huan'\"\n- \"'ꌔ' > ' di'\"\n- \"'ꌕ' > ' lu'\"\n- \"'ꌖ' > ' bian'\"\n- \"'ꌗ' > ' min'\"\n- \"'ꌘ' > ' yuan'\"\n- \"'ꌙ' > ' jin'\"\n- \"'ꌚ' > ' fu'\"\n- \"'ꌛ' > ' ru'\"\n- \"'ꌜ' > ' zhen'\"\n- \"'ꌝ' > ' feng'\"\n- \"'ꌞ' > ' shuai'\"\n- \"'ꌟ' > ' gao'\"\n- \"'ꌠ' > ' chan'\"\n- \"'ꌡ' > ' li'\"\n- \"'ꌢ' > ' yi'\"\n- \"'ꌣ' > ' jian'\"\n- \"'ꌤ' > ' bin'\"\n- \"'ꌥ' > ' piao'\"\n- \"'ꌦ' > ' man'\"\n- \"'ꌧ' > ' lei'\"\n- \"'ꌨ' > ' ying'\"\n- \"'ꌩ' > ' suo'\"\n- \"'ꌪ' > ' mou'\"\n- \"'ꌫ' > ' sao'\"\n- \"'ꌬ' > ' xie'\"\n- \"'ꌭ' > ' liao'\"\n- \"'ꌮ' > ' shan'\"\n- \"'ꌯ' > ' zeng'\"\n- \"'ꌰ' > ' jiang'\"\n- \"'ꌱ' > ' qian'\"\n- \"'ꌲ' > ' zao'\"\n- \"'ꌳ' > ' huan'\"\n- \"'ꌴ' > ' jiao'\"\n- \"'ꌵ' > ' zuan'\"\n- \"'ꌶ' > ' fou'\"\n- \"'ꌷ' > ' xie'\"\n- \"'ꌸ' > ' gang'\"\n- \"'ꌹ' > ' fou'\"\n- \"'ꌺ' > ' que'\"\n- \"'ꌻ' > ' fou'\"\n- \"'ꌼ' > ' kaakeru'\"\n- \"'ꌽ' > ' bo'\"\n- \"'ꌾ' > ' ping'\"\n- \"'ꌿ' > ' hou'\"\n- \"'ꍀ' > 'ssyt'\"\n- \"'ꍁ' > ' gang'\"\n- \"'ꍂ' > ' ying'\"\n- \"'ꍃ' > ' ying'\"\n- \"'ꍄ' > ' qing'\"\n- \"'ꍅ' > ' xia'\"\n- \"'ꍆ' > ' guan'\"\n- \"'ꍇ' > ' zun'\"\n- \"'ꍈ' > ' tan'\"\n- \"'ꍉ' > ' chang'\"\n- \"'ꍊ' > ' qi'\"\n- \"'ꍋ' > ' weng'\"\n- \"'ꍌ' > ' ying'\"\n- \"'ꍍ' > ' lei'\"\n- \"'ꍎ' > ' tan'\"\n- \"'ꍏ' > ' lu'\"\n- \"'ꍐ' > ' guan'\"\n- \"'ꍑ' > ' wang'\"\n- \"'ꍒ' > ' wang'\"\n- \"'ꍓ' > ' gang'\"\n- \"'ꍔ' > ' wang'\"\n- \"'ꍕ' > ' han'\"\n- \"'ꍖ' > 'zhux'\"\n- \"'ꍗ' > ' luo'\"\n- \"'ꍘ' > ' fu'\"\n- \"'ꍙ' > ' mi'\"\n- \"'ꍚ' > ' fa'\"\n- \"'ꍛ' > ' gu'\"\n- \"'ꍜ' > ' zhu'\"\n- \"'ꍝ' > ' ju'\"\n- \"'ꍞ' > ' mao'\"\n- \"'ꍟ' > ' gu'\"\n- \"'ꍠ' > ' min'\"\n- \"'ꍡ' > ' gang'\"\n- \"'ꍢ' > ' ba'\"\n- \"'ꍣ' > ' gua'\"\n- \"'ꍤ' > ' ti'\"\n- \"'ꍥ' > ' juan'\"\n- \"'ꍦ' > ' fu'\"\n- \"'ꍧ' > ' lin'\"\n- \"'ꍨ' > ' yan'\"\n- \"'ꍩ' > ' zhao'\"\n- \"'ꍪ' > ' zui'\"\n- \"'ꍫ' > ' gua'\"\n- \"'ꍬ' > ' zhuo'\"\n- \"'ꍭ' > ' yu'\"\n- \"'ꍮ' > ' zhi'\"\n- \"'ꍯ' > ' an'\"\n- \"'ꍰ' > ' fa'\"\n- \"'ꍱ' > ' nan'\"\n- \"'ꍲ' > ' shu'\"\n- \"'ꍳ' > ' si'\"\n- \"'ꍴ' > ' pi'\"\n- \"'ꍵ' > ' ma'\"\n- \"'ꍶ' > ' liu'\"\n- \"'ꍷ' > ' ba'\"\n- \"'ꍸ' > ' fa'\"\n- \"'ꍹ' > ' li'\"\n- \"'ꍺ' > ' chao'\"\n- \"'ꍻ' > ' wei'\"\n- \"'ꍼ' > ' bi'\"\n- \"'ꍽ' > ' ji'\"\n- \"'ꍾ' > ' zeng'\"\n- \"'ꍿ' > ' tong'\"\n- \"'ꎀ' > ' liu'\"\n- \"'ꎁ' > ' ji'\"\n- \"'ꎂ' > ' juan'\"\n- \"'ꎃ' > ' mi'\"\n- \"'ꎄ' > ' zhao'\"\n- \"'ꎅ' > ' luo'\"\n- \"'ꎆ' > ' pi'\"\n- \"'ꎇ' > ' ji'\"\n- \"'ꎈ' > ' ji'\"\n- \"'ꎉ' > ' luan'\"\n- \"'ꎊ' > ' yang'\"\n- \"'ꎋ' > ' mie'\"\n- \"'ꎌ' > ' qiang'\"\n- \"'ꎍ' > ' ta'\"\n- \"'ꎎ' > ' mei'\"\n- \"'ꎏ' > ' yang'\"\n- \"'ꎐ' > ' you'\"\n- \"'ꎑ' > ' you'\"\n- \"'ꎒ' > ' fen'\"\n- \"'ꎓ' > ' ba'\"\n- \"'ꎔ' > ' gao'\"\n- \"'ꎕ' > ' yang'\"\n- \"'ꎖ' > ' gu'\"\n- \"'ꎗ' > ' qiang'\"\n- \"'ꎘ' > ' zang'\"\n- \"'ꎙ' > ' gao'\"\n- \"'ꎚ' > ' ling'\"\n- \"'ꎛ' > ' yi'\"\n- \"'ꎜ' > ' zhu'\"\n- \"'ꎝ' > ' di'\"\n- \"'ꎞ' > ' xiu'\"\n- \"'ꎟ' > ' qian'\"\n- \"'ꎠ' > ' yi'\"\n- \"'ꎡ' > ' xian'\"\n- \"'ꎢ' > ' rong'\"\n- \"'ꎣ' > ' qun'\"\n- \"'ꎤ' > ' qun'\"\n- \"'ꎥ' > ' qian'\"\n- \"'ꎦ' > ' huan'\"\n- \"'ꎧ' > ' zui'\"\n- \"'ꎨ' > ' xian'\"\n- \"'ꎩ' > ' yi'\"\n- \"'ꎪ' > ' yashinau'\"\n- \"'ꎫ' > ' qiang'\"\n- \"'ꎬ' > ' xian'\"\n- \"'ꎭ' > ' yu'\"\n- \"'ꎮ' > ' geng'\"\n- \"'ꎯ' > ' jie'\"\n- \"'ꎰ' > ' tang'\"\n- \"'ꎱ' > ' yuan'\"\n- \"'ꎲ' > ' xi'\"\n- \"'ꎳ' > ' fan'\"\n- \"'ꎴ' > ' shan'\"\n- \"'ꎵ' > ' fen'\"\n- \"'ꎶ' > ' shan'\"\n- \"'ꎷ' > ' lian'\"\n- \"'ꎸ' > ' lei'\"\n- \"'ꎹ' > ' geng'\"\n- \"'ꎺ' > ' nou'\"\n- \"'ꎻ' > ' qiang'\"\n- \"'ꎼ' > ' chan'\"\n- \"'ꎽ' > ' yu'\"\n- \"'ꎾ' > ' gong'\"\n- \"'ꎿ' > ' yi'\"\n- \"'ꏀ' > ' chong'\"\n- \"'ꏁ' > ' weng'\"\n- \"'ꏂ' > ' fen'\"\n- \"'ꏃ' > ' hong'\"\n- \"'ꏄ' > ' chi'\"\n- \"'ꏅ' > ' chi'\"\n- \"'ꏆ' > ' cui'\"\n- \"'ꏇ' > ' fu'\"\n- \"'ꏈ' > ' xia'\"\n- \"'ꏉ' > ' pen'\"\n- \"'ꏊ' > ' yi'\"\n- \"'ꏋ' > ' la'\"\n- \"'ꏌ' > ' yi'\"\n- \"'ꏍ' > ' pi'\"\n- \"'ꏎ' > ' ling'\"\n- \"'ꏏ' > ' liu'\"\n- \"'ꏐ' > ' zhi'\"\n- \"'ꏑ' > ' qu'\"\n- \"'ꏒ' > ' xi'\"\n- \"'ꏓ' > ' xie'\"\n- \"'ꏔ' > ' xiang'\"\n- \"'ꏕ' > ' xi'\"\n- \"'ꏖ' > ' xi'\"\n- \"'ꏗ' > ' qi'\"\n- \"'ꏘ' > ' qiao'\"\n- \"'ꏙ' > ' hui'\"\n- \"'ꏚ' > ' hui'\"\n- \"'ꏛ' > ' xiao'\"\n- \"'ꏜ' > ' se'\"\n- \"'ꏝ' > ' hong'\"\n- \"'ꏞ' > ' jiang'\"\n- \"'ꏟ' > ' di'\"\n- \"'ꏠ' > ' cui'\"\n- \"'ꏡ' > ' fei'\"\n- \"'ꏢ' > ' tao'\"\n- \"'ꏣ' > ' sha'\"\n- \"'ꏤ' > ' chi'\"\n- \"'ꏥ' > ' zhu'\"\n- \"'ꏦ' > ' jian'\"\n- \"'ꏧ' > ' xuan'\"\n- \"'ꏨ' > ' shi'\"\n- \"'ꏩ' > ' pian'\"\n- \"'ꏪ' > ' zong'\"\n- \"'ꏫ' > ' wan'\"\n- \"'ꏬ' > ' hui'\"\n- \"'ꏭ' > ' hou'\"\n- \"'ꏮ' > ' he'\"\n- \"'ꏯ' > ' he'\"\n- \"'ꏰ' > ' han'\"\n- \"'ꏱ' > ' ao'\"\n- \"'ꏲ' > ' piao'\"\n- \"'ꏳ' > ' yi'\"\n- \"'ꏴ' > ' lian'\"\n- \"'ꏵ' > ' qu'\"\n- \"'ꏶ' > 'jyt'\"\n- \"'ꏷ' > ' lin'\"\n- \"'ꏸ' > ' pen'\"\n- \"'ꏹ' > ' qiao'\"\n- \"'ꏺ' > ' ao'\"\n- \"'ꏻ' > ' fan'\"\n- \"'ꏼ' > ' yi'\"\n- \"'ꏽ' > ' hui'\"\n- \"'ꏾ' > ' xuan'\"\n- \"'ꏿ' > ' dao'\"\n- \"'ꐀ' > ' yao'\"\n- \"'ꐁ' > ' lao'\"\n- \"'ꐂ' > 'qie'\"\n- \"'ꐃ' > ' kao'\"\n- \"'ꐄ' > ' mao'\"\n- \"'ꐅ' > ' zhe'\"\n- \"'ꐆ' > ' qi'\"\n- \"'ꐇ' > ' gou'\"\n- \"'ꐈ' > ' gou'\"\n- \"'ꐉ' > ' gou'\"\n- \"'ꐊ' > ' die'\"\n- \"'ꐋ' > ' die'\"\n- \"'ꐌ' > ' er'\"\n- \"'ꐍ' > ' shua'\"\n- \"'ꐎ' > ' ruan'\"\n- \"'ꐏ' > ' er'\"\n- \"'ꐐ' > ' nai'\"\n- \"'ꐑ' > ' zhuan'\"\n- \"'ꐒ' > ' lei'\"\n- \"'ꐓ' > ' ting'\"\n- \"'ꐔ' > ' zi'\"\n- \"'ꐕ' > ' geng'\"\n- \"'ꐖ' > ' chao'\"\n- \"'ꐗ' > ' hao'\"\n- \"'ꐘ' > ' yun'\"\n- \"'ꐙ' > ' pa'\"\n- \"'ꐚ' > ' pi'\"\n- \"'ꐛ' > ' chi'\"\n- \"'ꐜ' > ' si'\"\n- \"'ꐝ' > ' chu'\"\n- \"'ꐞ' > ' jia'\"\n- \"'ꐟ' > ' ju'\"\n- \"'ꐠ' > ' he'\"\n- \"'ꐡ' > ' chu'\"\n- \"'ꐢ' > ' lao'\"\n- \"'ꐣ' > ' lun'\"\n- \"'ꐤ' > ' ji'\"\n- \"'ꐥ' > ' tang'\"\n- \"'ꐦ' > ' ou'\"\n- \"'ꐧ' > ' lou'\"\n- \"'ꐨ' > ' nou'\"\n- \"'ꐩ' > ' gou'\"\n- \"'ꐪ' > ' pang'\"\n- \"'ꐫ' > ' ze'\"\n- \"'ꐬ' > ' lou'\"\n- \"'ꐭ' > ' ji'\"\n- \"'ꐮ' > ' lao'\"\n- \"'ꐯ' > ' huo'\"\n- \"'ꐰ' > ' you'\"\n- \"'ꐱ' > ' mo'\"\n- \"'ꐲ' > ' huai'\"\n- \"'ꐳ' > ' er'\"\n- \"'ꐴ' > ' zhe'\"\n- \"'ꐵ' > ' ting'\"\n- \"'ꐶ' > ' ye'\"\n- \"'ꐷ' > ' da'\"\n- \"'ꐸ' > ' song'\"\n- \"'ꐹ' > ' qin'\"\n- \"'ꐺ' > ' yun'\"\n- \"'ꐻ' > ' chi'\"\n- \"'ꐼ' > ' dan'\"\n- \"'ꐽ' > ' dan'\"\n- \"'ꐾ' > ' hong'\"\n- \"'ꐿ' > ' geng'\"\n- \"'ꑀ' > ' zhi'\"\n- \"'ꑁ' > 'njup'\"\n- \"'ꑂ' > ' nie'\"\n- \"'ꑃ' > ' dan'\"\n- \"'ꑄ' > ' zhen'\"\n- \"'ꑅ' > ' che'\"\n- \"'ꑆ' > ' ling'\"\n- \"'ꑇ' > ' zheng'\"\n- \"'ꑈ' > ' you'\"\n- \"'ꑉ' > ' wa'\"\n- \"'ꑊ' > ' liao'\"\n- \"'ꑋ' > ' long'\"\n- \"'ꑌ' > ' zhi'\"\n- \"'ꑍ' > ' ning'\"\n- \"'ꑎ' > ' tiao'\"\n- \"'ꑏ' > ' er'\"\n- \"'ꑐ' > ' ya'\"\n- \"'ꑑ' > ' die'\"\n- \"'ꑒ' > ' gua'\"\n- \"'ꑓ' > 'nyuo'\"\n- \"'ꑔ' > ' lian'\"\n- \"'ꑕ' > ' hao'\"\n- \"'ꑖ' > ' sheng'\"\n- \"'ꑗ' > ' lie'\"\n- \"'ꑘ' > ' pin'\"\n- \"'ꑙ' > ' jing'\"\n- \"'ꑚ' > ' ju'\"\n- \"'ꑛ' > ' bi'\"\n- \"'ꑜ' > ' di'\"\n- \"'ꑝ' > ' guo'\"\n- \"'ꑞ' > ' wen'\"\n- \"'ꑟ' > ' xu'\"\n- \"'ꑠ' > ' ping'\"\n- \"'ꑡ' > ' cong'\"\n- \"'ꑢ' > ' shikato'\"\n- \"'ꑣ' > 'xie'\"\n- \"'ꑤ' > ' ting'\"\n- \"'ꑥ' > ' yu'\"\n- \"'ꑦ' > ' cong'\"\n- \"'ꑧ' > ' kui'\"\n- \"'ꑨ' > ' tsuraneru'\"\n- \"'ꑩ' > ' kui'\"\n- \"'ꑪ' > ' cong'\"\n- \"'ꑫ' > ' lian'\"\n- \"'ꑬ' > ' weng'\"\n- \"'ꑭ' > ' kui'\"\n- \"'ꑮ' > ' lian'\"\n- \"'ꑯ' > ' lian'\"\n- \"'ꑰ' > ' cong'\"\n- \"'ꑱ' > ' ao'\"\n- \"'ꑲ' > ' sheng'\"\n- \"'ꑳ' > ' song'\"\n- \"'ꑴ' > ' ting'\"\n- \"'ꑵ' > ' kui'\"\n- \"'ꑶ' > ' nie'\"\n- \"'ꑷ' > ' zhi'\"\n- \"'ꑸ' > ' dan'\"\n- \"'ꑹ' > ' ning'\"\n- \"'ꑺ' > ' qie'\"\n- \"'ꑻ' > ' ji'\"\n- \"'ꑼ' > ' ting'\"\n- \"'ꑽ' > ' ting'\"\n- \"'ꑾ' > ' long'\"\n- \"'ꑿ' > ' yu'\"\n- \"'ꒀ' > ' yu'\"\n- \"'ꒁ' > ' zhao'\"\n- \"'ꒂ' > ' si'\"\n- \"'ꒃ' > ' su'\"\n- \"'ꒄ' > ' yi'\"\n- \"'ꒅ' > ' su'\"\n- \"'ꒆ' > ' si'\"\n- \"'ꒇ' > ' zhao'\"\n- \"'ꒈ' > ' zhao'\"\n- \"'ꒉ' > ' rou'\"\n- \"'ꒊ' > ' yi'\"\n- \"'ꒋ' > ' le'\"\n- \"'ꒌ' > ' ji'\"\n- \"'ꓐ' > ' ku'\"\n- \"'ꓑ' > ' zhi'\"\n- \"'ꓒ' > ' ni'\"\n- \"'ꓓ' > ' ping'\"\n- \"'ꓔ' > ' zi'\"\n- \"'ꓕ' > ' fu'\"\n- \"'ꓖ' > ' pang'\"\n- \"'ꓗ' > ' zhen'\"\n- \"'ꓘ' > ' xian'\"\n- \"'ꓙ' > ' zuo'\"\n- \"'ꓚ' > ' pei'\"\n- \"'ꓛ' > ' jia'\"\n- \"'ꓜ' > ' sheng'\"\n- \"'ꓝ' > ' zhi'\"\n- \"'ꓞ' > ' bao'\"\n- \"'ꓟ' > ' mu'\"\n- \"'ꓠ' > ' qu'\"\n- \"'ꓡ' > ' hu'\"\n- \"'ꓢ' > ' ke'\"\n- \"'ꓣ' > ' yi'\"\n- \"'ꓤ' > ' yin'\"\n- \"'ꓥ' > ' xu'\"\n- \"'ꓦ' > ' yang'\"\n- \"'ꓧ' > ' long'\"\n- \"'ꓨ' > ' dong'\"\n- \"'ꓩ' > ' ka'\"\n- \"'ꓪ' > ' lu'\"\n- \"'ꓫ' > ' jing'\"\n- \"'ꓬ' > ' nu'\"\n- \"'ꓭ' > ' yan'\"\n- \"'ꓮ' > ' pang'\"\n- \"'ꓯ' > ' kua'\"\n- \"'ꓰ' > ' yi'\"\n- \"'ꓱ' > ' guang'\"\n- \"'ꓲ' > ' gai'\"\n- \"'ꓳ' > ' ge'\"\n- \"'ꓴ' > ' dong'\"\n- \"'ꓵ' > ' zhi'\"\n- \"'ꓶ' > ' xiao'\"\n- \"'ꓷ' > ' xiong'\"\n- \"'ꓸ' > ' xiong'\"\n- \"'ꓹ' > ' er'\"\n- \"'ꓺ' > ' e'\"\n- \"'ꓻ' > ' xing'\"\n- \"'ꓼ' > ' pian'\"\n- \"'ꓽ' > ' neng'\"\n- \"'ꔀ' > 'ee'\"\n- \"'ꔁ' > 'een'\"\n- \"'ꔂ' > 'hee'\"\n- \"'ꔃ' > 'wee'\"\n- \"'ꔄ' > 'ween'\"\n- \"'ꔅ' > 'pee'\"\n- \"'ꔆ' > 'bhee'\"\n- \"'ꔇ' > 'bee'\"\n- \"'ꔈ' > 'mbee'\"\n- \"'ꔉ' > 'kpee'\"\n- \"'ꔊ' > 'mgbee'\"\n- \"'ꔋ' > 'gbee'\"\n- \"'ꔌ' > 'fee'\"\n- \"'ꔍ' > 'vee'\"\n- \"'ꔎ' > 'tee'\"\n- \"'ꔏ' > 'thee'\"\n- \"'ꔐ' > 'dhee'\"\n- \"'ꔑ' > 'dhhee'\"\n- \"'ꔒ' > 'lee'\"\n- \"'ꔓ' > 'ree'\"\n- \"'ꔔ' > 'dee'\"\n- \"'ꔕ' > 'ndee'\"\n- \"'ꔖ' > 'see'\"\n- \"'ꔗ' > 'shee'\"\n- \"'ꔘ' > 'zee'\"\n- \"'ꔙ' > 'zhee'\"\n- \"'ꔚ' > 'cee'\"\n- \"'ꔛ' > 'jee'\"\n- \"'ꔜ' > 'njee'\"\n- \"'ꔝ' > 'yee'\"\n- \"'ꔞ' > 'kee'\"\n- \"'ꔟ' > 'nggee'\"\n- \"'ꔠ' > 'gee'\"\n- \"'ꔡ' > 'mee'\"\n- \"'ꔢ' > 'nee'\"\n- \"'ꔣ' > 'nyee'\"\n- \"'ꔤ' > 'i'\"\n- \"'ꔥ' > 'in'\"\n- \"'ꔦ' > 'hi'\"\n- \"'ꔧ' > 'hin'\"\n- \"'ꔨ' > 'wi'\"\n- \"'ꔩ' > 'win'\"\n- \"'ꔪ' > 'pi'\"\n- \"'ꔫ' > 'bhi'\"\n- \"'ꔬ' > 'bi'\"\n- \"'ꔭ' > 'mbi'\"\n- \"'ꔮ' > 'kpi'\"\n- \"'ꔯ' > 'mgbi'\"\n- \"'ꔰ' > 'gbi'\"\n- \"'ꔱ' > 'fi'\"\n- \"'ꔲ' > 'vi'\"\n- \"'ꔳ' > 'ti'\"\n- \"'ꔴ' > 'thi'\"\n- \"'ꔵ' > 'dhi'\"\n- \"'ꔶ' > 'dhhi'\"\n- \"'ꔷ' > 'li'\"\n- \"'ꔸ' > 'ri'\"\n- \"'ꔹ' > 'di'\"\n- \"'ꔺ' > 'ndi'\"\n- \"'ꔻ' > 'si'\"\n- \"'ꔼ' > 'shi'\"\n- \"'ꔽ' > 'zi'\"\n- \"'ꔾ' > 'zhi'\"\n- \"'ꔿ' > 'ci'\"\n- \"'ꕀ' > 'ji'\"\n- \"'ꕁ' > 'nji'\"\n- \"'ꕂ' > 'yi'\"\n- \"'ꕃ' > 'ki'\"\n- \"'ꕄ' > 'nggi'\"\n- \"'ꕅ' > 'gi'\"\n- \"'ꕆ' > 'mi'\"\n- \"'ꕇ' > 'ni'\"\n- \"'ꕈ' > 'nyi'\"\n- \"'ꕉ' > 'a'\"\n- \"'ꕊ' > 'an'\"\n- \"'ꕋ' > 'ngan'\"\n- \"'ꕌ' > 'ha'\"\n- \"'ꕍ' > 'han'\"\n- \"'ꕎ' > 'wa'\"\n- \"'ꕏ' > 'wan'\"\n- \"'ꕐ' > 'pa'\"\n- \"'ꕑ' > 'bha'\"\n- \"'ꕒ' > 'ba'\"\n- \"'ꕓ' > 'mba'\"\n- \"'ꕔ' > 'kpa'\"\n- \"'ꕕ' > 'kpan'\"\n- \"'ꕖ' > 'mgba'\"\n- \"'ꕗ' > 'gba'\"\n- \"'ꕘ' > 'fa'\"\n- \"'ꕙ' > 'va'\"\n- \"'ꕚ' > 'ta'\"\n- \"'ꕛ' > 'tha'\"\n- \"'ꕜ' > 'dha'\"\n- \"'ꕝ' > 'dhha'\"\n- \"'ꕞ' > 'la'\"\n- \"'ꕟ' > 'ra'\"\n- \"'ꕠ' > 'da'\"\n- \"'ꕡ' > 'nda'\"\n- \"'ꕢ' > 'sa'\"\n- \"'ꕣ' > 'sha'\"\n- \"'ꕤ' > 'za'\"\n- \"'ꕥ' > 'zha'\"\n- \"'ꕦ' > 'ca'\"\n- \"'ꕧ' > 'ja'\"\n- \"'ꕨ' > 'nja'\"\n- \"'ꕩ' > 'ya'\"\n- \"'ꕪ' > 'ka'\"\n- \"'ꕫ' > 'kan'\"\n- \"'ꕬ' > 'ngga'\"\n- \"'ꕭ' > 'ga'\"\n- \"'ꕮ' > 'ma'\"\n- \"'ꕯ' > 'na'\"\n- \"'ꕰ' > 'nya'\"\n- \"'ꕱ' > 'oo'\"\n- \"'ꕲ' > 'oon'\"\n- \"'ꕳ' > 'hoo'\"\n- \"'ꕴ' > 'woo'\"\n- \"'ꕵ' > 'woon'\"\n- \"'ꕶ' > 'poo'\"\n- \"'ꕷ' > 'bhoo'\"\n- \"'ꕸ' > 'boo'\"\n- \"'ꕹ' > 'mboo'\"\n- \"'ꕺ' > 'kpoo'\"\n- \"'ꕻ' > 'mgboo'\"\n- \"'ꕼ' > 'gboo'\"\n- \"'ꕽ' > 'foo'\"\n- \"'ꕾ' > 'voo'\"\n- \"'ꕿ' > 'too'\"\n- \"'ꖀ' > 'thoo'\"\n- \"'ꖁ' > 'dhoo'\"\n- \"'ꖂ' > 'dhhoo'\"\n- \"'ꖃ' > 'loo'\"\n- \"'ꖄ' > 'roo'\"\n- \"'ꖅ' > 'doo'\"\n- \"'ꖆ' > 'ndoo'\"\n- \"'ꖇ' > 'soo'\"\n- \"'ꖈ' > 'shoo'\"\n- \"'ꖉ' > 'zoo'\"\n- \"'ꖊ' > 'zhoo'\"\n- \"'ꖋ' > 'coo'\"\n- \"'ꖌ' > 'joo'\"\n- \"'ꖍ' > 'njoo'\"\n- \"'ꖎ' > 'yoo'\"\n- \"'ꖏ' > 'koo'\"\n- \"'ꖐ' > 'nggoo'\"\n- \"'ꖑ' > 'goo'\"\n- \"'ꖒ' > 'moo'\"\n- \"'ꖓ' > 'noo'\"\n- \"'ꖔ' > 'nyoo'\"\n- \"'ꖕ' > 'u'\"\n- \"'ꖖ' > 'un'\"\n- \"'ꖗ' > 'hu'\"\n- \"'ꖘ' > 'hun'\"\n- \"'ꖙ' > 'wu'\"\n- \"'ꖚ' > 'wun'\"\n- \"'ꖛ' > 'pu'\"\n- \"'ꖜ' > 'bhu'\"\n- \"'ꖝ' > 'bu'\"\n- \"'ꖞ' > 'mbu'\"\n- \"'ꖟ' > 'kpu'\"\n- \"'ꖠ' > 'mgbu'\"\n- \"'ꖡ' > 'gbu'\"\n- \"'ꖢ' > 'fu'\"\n- \"'ꖣ' > 'vu'\"\n- \"'ꖤ' > 'tu'\"\n- \"'ꖥ' > 'thu'\"\n- \"'ꖦ' > 'dhu'\"\n- \"'ꖧ' > 'dhhu'\"\n- \"'ꖨ' > 'lu'\"\n- \"'ꖩ' > 'ru'\"\n- \"'ꖪ' > 'du'\"\n- \"'ꖫ' > 'ndu'\"\n- \"'ꖬ' > 'su'\"\n- \"'ꖭ' > 'shu'\"\n- \"'ꖮ' > 'zu'\"\n- \"'ꖯ' > 'zhu'\"\n- \"'ꖰ' > 'cu'\"\n- \"'ꖱ' > 'ju'\"\n- \"'ꖲ' > 'nju'\"\n- \"'ꖳ' > 'yu'\"\n- \"'ꖴ' > 'ku'\"\n- \"'ꖵ' > 'nggu'\"\n- \"'ꖶ' > 'gu'\"\n- \"'ꖷ' > 'mu'\"\n- \"'ꖸ' > 'nu'\"\n- \"'ꖹ' > 'nyu'\"\n- \"'ꖺ' > 'o'\"\n- \"'ꖻ' > 'on'\"\n- \"'ꖼ' > 'ngon'\"\n- \"'ꖽ' > 'ho'\"\n- \"'ꖾ' > 'hon'\"\n- \"'ꖿ' > 'wo'\"\n- \"'ꗀ' > 'won'\"\n- \"'ꗁ' > 'po'\"\n- \"'ꗂ' > 'bho'\"\n- \"'ꗃ' > 'bo'\"\n- \"'ꗄ' > 'mbo'\"\n- \"'ꗅ' > 'kpo'\"\n- \"'ꗆ' > 'mgbo'\"\n- \"'ꗇ' > 'gbo'\"\n- \"'ꗈ' > 'gbon'\"\n- \"'ꗉ' > 'fo'\"\n- \"'ꗊ' > 'vo'\"\n- \"'ꗋ' > 'to'\"\n- \"'ꗌ' > 'tho'\"\n- \"'ꗍ' > 'dho'\"\n- \"'ꗎ' > 'dhho'\"\n- \"'ꗏ' > 'lo'\"\n- \"'ꗐ' > 'ro'\"\n- \"'ꗑ' > 'do'\"\n- \"'ꗒ' > 'ndo'\"\n- \"'ꗓ' > 'so'\"\n- \"'ꗔ' > 'sho'\"\n- \"'ꗕ' > 'zo'\"\n- \"'ꗖ' > 'zho'\"\n- \"'ꗗ' > 'co'\"\n- \"'ꗘ' > 'jo'\"\n- \"'ꗙ' > 'njo'\"\n- \"'ꗚ' > 'yo'\"\n- \"'ꗛ' > 'ko'\"\n- \"'ꗜ' > 'nggo'\"\n- \"'ꗝ' > 'go'\"\n- \"'ꗞ' > 'mo'\"\n- \"'ꗟ' > 'no'\"\n- \"'ꗠ' > 'nyo'\"\n- \"'ꗡ' > 'e'\"\n- \"'ꗢ' > 'en'\"\n- \"'ꗣ' > 'ngen'\"\n- \"'ꗤ' > 'he'\"\n- \"'ꗥ' > 'hen'\"\n- \"'ꗦ' > 'we'\"\n- \"'ꗧ' > 'wen'\"\n- \"'ꗨ' > 'pe'\"\n- \"'ꗩ' > 'bhe'\"\n- \"'ꗪ' > 'be'\"\n- \"'ꗫ' > 'mbe'\"\n- \"'ꗬ' > 'kpe'\"\n- \"'ꗭ' > 'kpen'\"\n- \"'ꗮ' > 'mgbe'\"\n- \"'ꗯ' > 'gbe'\"\n- \"'ꗰ' > 'gben'\"\n- \"'ꗱ' > 'fe'\"\n- \"'ꗲ' > 've'\"\n- \"'ꗳ' > 'te'\"\n- \"'ꗴ' > 'the'\"\n- \"'ꗵ' > 'dhe'\"\n- \"'ꗶ' > 'dhhe'\"\n- \"'ꗷ' > 'le'\"\n- \"'ꗸ' > 're'\"\n- \"'ꗹ' > 'de'\"\n- \"'ꗺ' > 'nde'\"\n- \"'ꗻ' > 'se'\"\n- \"'ꗼ' > 'she'\"\n- \"'ꗽ' > 'ze'\"\n- \"'ꗾ' > 'zhe'\"\n- \"'ꗿ' > 'ce'\"\n- \"'ꘀ' > 'je'\"\n- \"'ꘁ' > 'nje'\"\n- \"'ꘂ' > 'ye'\"\n- \"'ꘃ' > 'ke'\"\n- \"'ꘄ' > 'ngge'\"\n- \"'ꘅ' > 'nggen'\"\n- \"'ꘆ' > 'ge'\"\n- \"'ꘇ' > 'gen'\"\n- \"'ꘈ' > 'me'\"\n- \"'ꘉ' > 'ne'\"\n- \"'ꘊ' > 'nye'\"\n- \"'ꘋ' > 'ng'\"\n- \"'ꘐ' > 'ndole'\"\n- \"'ꘑ' > 'ndole'\"\n- \"'ꘒ' > 'ndole'\"\n- \"'ꘪ' > 'ndole'\"\n- \"'ꘫ' > 'ndole'\"\n- \"'Ꙁ' > 'zemlya'\"\n- \"'ꙁ' > 'zemlya'\"\n- \"'Ꙃ' > 'dzelo'\"\n- \"'ꙃ' > 'dzelo'\"\n- \"'Ꙅ' > 'dze'\"\n- \"'ꙅ' > 'dze'\"\n- \"'Ꙇ' > 'iota'\"\n- \"'ꙇ' > 'iota'\"\n- \"'Ꙉ' > 'djerv'\"\n- \"'ꙉ' > 'djerv'\"\n- \"'Ꙑ' > 'yeru'\"\n- \"'ꙑ' > 'yeru'\"\n- \"'Ꙕ' > 'yu'\"\n- \"'ꙕ' > 'yu'\"\n- \"'Ꙟ' > 'yn'\"\n- \"'ꙟ' > 'yn'\"\n- \"'Ꚁ' > 'dwe'\"\n- \"'ꚁ' > 'dwe'\"\n- \"'Ꚃ' > 'dzwe'\"\n- \"'ꚃ' > 'dzwe'\"\n- \"'Ꚅ' > 'zhwe'\"\n- \"'ꚅ' > 'zhwe'\"\n- \"'Ꚇ' > 'cche'\"\n- \"'ꚇ' > 'cche'\"\n- \"'Ꚉ' > 'dzze'\"\n- \"'ꚉ' > 'dzze'\"\n- \"'Ꚋ' > 'te'\"\n- \"'ꚋ' > 'te'\"\n- \"'Ꚍ' > 'twe'\"\n- \"'ꚍ' > 'twe'\"\n- \"'Ꚏ' > 'tswe'\"\n- \"'ꚏ' > 'tswe'\"\n- \"'Ꚑ' > 'tsse'\"\n- \"'ꚑ' > 'tsse'\"\n- \"'Ꚓ' > 'tche'\"\n- \"'ꚓ' > 'tche'\"\n- \"'Ꚕ' > 'hwe'\"\n- \"'ꚕ' > 'hwe'\"\n- \"'Ꚗ' > 'shwe'\"\n- \"'ꚗ' > 'shwe'\"\n- \"'Ꜧ' > 'heng'\"\n- \"'ꜧ' > 'heng'\"\n- \"'Ꜩ' > 'tz'\"\n- \"'ꜩ' > 'tz'\"\n- \"'Ꜫ' > 'tresillo'\"\n- \"'ꜫ' > 'tresillo'\"\n- \"'Ꜭ' > 'cuatrillo'\"\n- \"'ꜭ' > 'cuatrillo'\"\n- \"'Ꜯ' > 'cuatrillo'\"\n- \"'ꜯ' > 'cuatrillo'\"\n- \"'Ꜳ' > 'aa'\"\n- \"'ꜳ' > 'aa'\"\n- \"'Ꜵ' > 'ao'\"\n- \"'ꜵ' > 'ao'\"\n- \"'Ꜷ' > 'au'\"\n- \"'ꜷ' > 'au'\"\n- \"'Ꜹ' > 'av'\"\n- \"'ꜹ' > 'av'\"\n- \"'Ꜻ' > 'av'\"\n- \"'ꜻ' > 'av'\"\n- \"'Ꜽ' > 'ay'\"\n- \"'ꜽ' > 'ay'\"\n- \"'Ꜿ' > 'c'\"\n- \"'ꜿ' > 'c'\"\n- \"'Ꝁ' > 'k'\"\n- \"'ꝁ' > 'k'\"\n- \"'Ꝃ' > 'k'\"\n- \"'ꝃ' > 'k'\"\n- \"'Ꝅ' > 'k'\"\n- \"'ꝅ' > 'k'\"\n- \"'Ꝉ' > 'l'\"\n- \"'ꝉ' > 'l'\"\n- \"'Ꝋ' > 'o'\"\n- \"'ꝋ' > 'o'\"\n- \"'Ꝍ' > 'o'\"\n- \"'ꝍ' > 'o'\"\n- \"'Ꝏ' > 'oo'\"\n- \"'ꝏ' > 'oo'\"\n- \"'Ꝑ' > 'p'\"\n- \"'ꝑ' > 'p'\"\n- \"'Ꝓ' > 'p'\"\n- \"'ꝓ' > 'p'\"\n- \"'Ꝕ' > 'p'\"\n- \"'ꝕ' > 'p'\"\n- \"'Ꝗ' > 'q'\"\n- \"'ꝗ' > 'q'\"\n- \"'Ꝙ' > 'q'\"\n- \"'ꝙ' > 'q'\"\n- \"'Ꝛ' > 'r'\"\n- \"'ꝛ' > 'r'\"\n- \"'Ꝝ' > 'rum'\"\n- \"'ꝝ' > 'rum'\"\n- \"'Ꝟ' > 'v'\"\n- \"'ꝟ' > 'v'\"\n- \"'Ꝡ' > 'vy'\"\n- \"'ꝡ' > 'vy'\"\n- \"'Ꝥ' > 'thorn'\"\n- \"'ꝥ' > 'thorn'\"\n- \"'Ꝧ' > 'thorn'\"\n- \"'ꝧ' > 'thorn'\"\n- \"'Ꝩ' > 'vend'\"\n- \"'ꝩ' > 'vend'\"\n- \"'Ꝫ' > 'et'\"\n- \"'ꝫ' > 'et'\"\n- \"'Ꝭ' > 'is'\"\n- \"'ꝭ' > 'is'\"\n- \"'Ꝯ' > 'con'\"\n- \"'ꝯ' > 'con'\"\n- \"'ꝰ' > 'us'\"\n- \"'ꝱ' > 'dum'\"\n- \"'ꝲ' > 'lum'\"\n- \"'ꝳ' > 'mum'\"\n- \"'ꝴ' > 'num'\"\n- \"'ꝵ' > 'rum'\"\n- \"'ꝷ' > 'tum'\"\n- \"'ꝸ' > 'um'\"\n- \"'Ꞁ' > 'l'\"\n- \"'ꞁ' > 'l'\"\n- \"'ꟻ' > 'f'\"\n- \"'ꟼ' > 'p'\"\n- \"'ꟽ' > 'm'\"\n- \"'ꟾ' > 'i'\"\n- \"'ꟿ' > 'm'\"\n- \"'ꠀ' > 'a'\"\n- \"'ꠁ' > 'i'\"\n- \"'ꠃ' > 'u'\"\n- \"'ꠄ' > 'e'\"\n- \"'ꠅ' > 'o'\"\n- \"'ꠇ' > 'ko'\"\n- \"'ꠈ' > 'kho'\"\n- \"'ꠉ' > 'go'\"\n- \"'ꠊ' > 'gho'\"\n- \"'ꠌ' > 'co'\"\n- \"'ꠍ' > 'cho'\"\n- \"'ꠎ' > 'jo'\"\n- \"'ꠏ' > 'jho'\"\n- \"'ꠐ' > 'tto'\"\n- \"'ꠑ' > 'ttho'\"\n- \"'ꠒ' > 'ddo'\"\n- \"'ꠓ' > 'ddho'\"\n- \"'ꠔ' > 'to'\"\n- \"'ꠕ' > 'tho'\"\n- \"'ꠖ' > 'do'\"\n- \"'ꠗ' > 'dho'\"\n- \"'ꠘ' > 'no'\"\n- \"'ꠙ' > 'po'\"\n- \"'ꠚ' > 'pho'\"\n- \"'ꠛ' > 'bo'\"\n- \"'ꠜ' > 'bho'\"\n- \"'ꠝ' > 'mo'\"\n- \"'ꠞ' > 'ro'\"\n- \"'ꠟ' > 'lo'\"\n- \"'ꠠ' > 'rro'\"\n- \"'ꠡ' > 'so'\"\n- \"'ꠢ' > 'ho'\"\n- \"'ꡀ' > 'ka'\"\n- \"'ꡁ' > 'kha'\"\n- \"'ꡂ' > 'ga'\"\n- \"'ꡃ' > 'nga'\"\n- \"'ꡄ' > 'ca'\"\n- \"'ꡅ' > 'cha'\"\n- \"'ꡆ' > 'ja'\"\n- \"'ꡇ' > 'nya'\"\n- \"'ꡈ' > 'ta'\"\n- \"'ꡉ' > 'tha'\"\n- \"'ꡊ' > 'da'\"\n- \"'ꡋ' > 'na'\"\n- \"'ꡌ' > 'pa'\"\n- \"'ꡍ' > 'pha'\"\n- \"'ꡎ' > 'ba'\"\n- \"'ꡏ' > 'ma'\"\n- \"'ꡐ' > 'tsa'\"\n- \"'ꡑ' > 'tsha'\"\n- \"'ꡒ' > 'dza'\"\n- \"'ꡓ' > 'wa'\"\n- \"'ꡔ' > 'zha'\"\n- \"'ꡕ' > 'za'\"\n- \"'ꡖ' > 'a'\"\n- \"'ꡗ' > 'ya'\"\n- \"'ꡘ' > 'ra'\"\n- \"'ꡙ' > 'la'\"\n- \"'ꡚ' > 'sha'\"\n- \"'ꡛ' > 'sa'\"\n- \"'ꡜ' > 'ha'\"\n- \"'ꡝ' > 'a'\"\n- \"'ꡞ' > 'i'\"\n- \"'ꡟ' > 'u'\"\n- \"'ꡠ' > 'e'\"\n- \"'ꡡ' > 'o'\"\n- \"'ꡢ' > 'qa'\"\n- \"'ꡣ' > 'xa'\"\n- \"'ꡤ' > 'fa'\"\n- \"'ꡥ' > 'gga'\"\n- \"'ꡦ' > 'ee'\"\n- \"'ꡧ' > 'wa'\"\n- \"'ꡨ' > 'ya'\"\n- \"'ꡩ' > 'tta'\"\n- \"'ꡪ' > 'ttha'\"\n- \"'ꡫ' > 'dda'\"\n- \"'ꡬ' > 'nna'\"\n- \"'ꡱ' > 'ra'\"\n- \"'ꡲ' > 'ra'\"\n- \"'ꡳ' > 'candrabindu'\"\n- \"'ꢂ' > 'a'\"\n- \"'ꢃ' > 'aa'\"\n- \"'ꢄ' > 'i'\"\n- \"'ꢅ' > 'ii'\"\n- \"'ꢆ' > 'u'\"\n- \"'ꢇ' > 'uu'\"\n- \"'ꢈ' > 'r'\"\n- \"'ꢉ' > 'rr'\"\n- \"'ꢊ' > 'l'\"\n- \"'ꢋ' > 'll'\"\n- \"'ꢌ' > 'e'\"\n- \"'ꢍ' > 'ee'\"\n- \"'ꢎ' > 'ai'\"\n- \"'ꢏ' > 'o'\"\n- \"'ꢐ' > 'oo'\"\n- \"'ꢑ' > 'au'\"\n- \"'ꢒ' > 'ka'\"\n- \"'ꢓ' > 'kha'\"\n- \"'ꢔ' > 'ga'\"\n- \"'ꢕ' > 'gha'\"\n- \"'ꢖ' > 'nga'\"\n- \"'ꢗ' > 'ca'\"\n- \"'ꢘ' > 'cha'\"\n- \"'ꢙ' > 'ja'\"\n- \"'ꢚ' > 'jha'\"\n- \"'ꢛ' > 'nya'\"\n- \"'ꢜ' > 'tta'\"\n- \"'ꢝ' > 'ttha'\"\n- \"'ꢞ' > 'dda'\"\n- \"'ꢟ' > 'ddha'\"\n- \"'ꢠ' > 'nna'\"\n- \"'ꢡ' > 'ta'\"\n- \"'ꢢ' > 'tha'\"\n- \"'ꢣ' > 'da'\"\n- \"'ꢤ' > 'dha'\"\n- \"'ꢥ' > 'na'\"\n- \"'ꢦ' > 'pa'\"\n- \"'ꢧ' > 'pha'\"\n- \"'ꢨ' > 'ba'\"\n- \"'ꢩ' > 'bha'\"\n- \"'ꢪ' > 'ma'\"\n- \"'ꢫ' > 'ya'\"\n- \"'ꢬ' > 'ra'\"\n- \"'ꢭ' > 'la'\"\n- \"'ꢮ' > 'va'\"\n- \"'ꢯ' > 'sha'\"\n- \"'ꢰ' > 'ssa'\"\n- \"'ꢱ' > 'sa'\"\n- \"'ꢲ' > 'ha'\"\n- \"'ꢳ' > 'lla'\"\n- \"'ꤊ' > 'ka'\"\n- \"'ꤋ' > 'kha'\"\n- \"'ꤌ' > 'ga'\"\n- \"'ꤍ' > 'nga'\"\n- \"'ꤎ' > 'sa'\"\n- \"'ꤏ' > 'sha'\"\n- \"'ꤐ' > 'za'\"\n- \"'ꤑ' > 'nya'\"\n- \"'ꤒ' > 'ta'\"\n- \"'ꤓ' > 'hta'\"\n- \"'ꤔ' > 'na'\"\n- \"'ꤕ' > 'pa'\"\n- \"'ꤖ' > 'pha'\"\n- \"'ꤗ' > 'ma'\"\n- \"'ꤘ' > 'da'\"\n- \"'ꤙ' > 'ba'\"\n- \"'ꤚ' > 'ra'\"\n- \"'ꤛ' > 'ya'\"\n- \"'ꤜ' > 'la'\"\n- \"'ꤝ' > 'wa'\"\n- \"'ꤞ' > 'tha'\"\n- \"'ꤟ' > 'ha'\"\n- \"'ꤠ' > 'va'\"\n- \"'ꤡ' > 'ca'\"\n- \"'ꤢ' > 'a'\"\n- \"'ꤣ' > 'oe'\"\n- \"'ꤤ' > 'i'\"\n- \"'ꤥ' > 'oo'\"\n- \"'ꤰ' > 'ka'\"\n- \"'ꤱ' > 'ga'\"\n- \"'ꤲ' > 'nga'\"\n- \"'ꤳ' > 'ta'\"\n- \"'ꤴ' > 'da'\"\n- \"'ꤵ' > 'na'\"\n- \"'ꤶ' > 'pa'\"\n- \"'ꤷ' > 'ba'\"\n- \"'ꤸ' > 'ma'\"\n- \"'ꤹ' > 'ca'\"\n- \"'ꤺ' > 'ja'\"\n- \"'ꤻ' > 'nya'\"\n- \"'ꤼ' > 'sa'\"\n- \"'ꤽ' > 'ra'\"\n- \"'ꤾ' > 'la'\"\n- \"'ꤿ' > 'ya'\"\n- \"'ꥀ' > 'wa'\"\n- \"'ꥁ' > 'ha'\"\n- \"'ꥂ' > 'mba'\"\n- \"'ꥃ' > 'ngga'\"\n- \"'ꥄ' > 'nda'\"\n- \"'ꥅ' > 'nyja'\"\n- \"'ꥆ' > 'a'\"\n- \"'ꨀ' > 'a'\"\n- \"'ꨁ' > 'i'\"\n- \"'ꨂ' > 'u'\"\n- \"'ꨃ' > 'e'\"\n- \"'ꨄ' > 'ai'\"\n- \"'ꨅ' > 'o'\"\n- \"'ꨆ' > 'ka'\"\n- \"'ꨇ' > 'kha'\"\n- \"'ꨈ' > 'ga'\"\n- \"'ꨉ' > 'gha'\"\n- \"'ꨊ' > 'ngue'\"\n- \"'ꨋ' > 'nga'\"\n- \"'ꨌ' > 'cha'\"\n- \"'ꨍ' > 'chha'\"\n- \"'ꨎ' > 'ja'\"\n- \"'ꨏ' > 'jha'\"\n- \"'ꨐ' > 'nhue'\"\n- \"'ꨑ' > 'nha'\"\n- \"'ꨒ' > 'nhja'\"\n- \"'ꨓ' > 'ta'\"\n- \"'ꨔ' > 'tha'\"\n- \"'ꨕ' > 'da'\"\n- \"'ꨖ' > 'dha'\"\n- \"'ꨗ' > 'nue'\"\n- \"'ꨘ' > 'na'\"\n- \"'ꨙ' > 'dda'\"\n- \"'ꨚ' > 'pa'\"\n- \"'ꨛ' > 'ppa'\"\n- \"'ꨜ' > 'pha'\"\n- \"'ꨝ' > 'ba'\"\n- \"'ꨞ' > 'bha'\"\n- \"'ꨟ' > 'mue'\"\n- \"'ꨠ' > 'ma'\"\n- \"'ꨡ' > 'bba'\"\n- \"'ꨢ' > 'ya'\"\n- \"'ꨣ' > 'ra'\"\n- \"'ꨤ' > 'la'\"\n- \"'ꨥ' > 'va'\"\n- \"'ꨦ' > 'ssa'\"\n- \"'ꨧ' > 'sa'\"\n- \"'ꨨ' > 'ha'\"\n- \"'ힰ' > 'gyeol'\"\n- \"'ힱ' > 'gyeolg'\"\n- \"'ힲ' > 'gyeolm'\"\n- \"'ힳ' > 'gyeolb'\"\n- \"'ힴ' > 'gyeols'\"\n- \"'ힵ' > 'gyeolt'\"\n- \"'ힶ' > 'gyeolp'\"\n- \"'ힷ' > 'gyeolh'\"\n- \"'ힸ' > 'gyeom'\"\n- \"'ힹ' > 'gyeob'\"\n- \"'ힺ' > 'gyeobs'\"\n- \"'ힻ' > 'gyeos'\"\n- \"'ힼ' > 'gyeoss'\"\n- \"'ힽ' > 'gyeong'\"\n- \"'ힾ' > 'gyeoj'\"\n- \"'ힿ' > 'gyeoc'\"\n- \"'ퟀ' > 'gyeok'\"\n- \"'ퟁ' > 'gyeot'\"\n- \"'ퟂ' > 'gyeop'\"\n- \"'ퟃ' > 'gyeoh'\"\n- \"'ퟄ' > 'gye'\"\n- \"'ퟅ' > 'gyeg'\"\n- \"'ퟆ' > 'gyegg'\"\n- \"'ퟋ' > 'gyed'\"\n- \"'ퟌ' > 'gyel'\"\n- \"'ퟍ' > 'gyelg'\"\n- \"'ퟎ' > 'gyelm'\"\n- \"'ퟏ' > 'gyelb'\"\n- \"'ퟐ' > 'gyels'\"\n- \"'ퟑ' > 'gyelt'\"\n- \"'ퟒ' > 'gyelp'\"\n- \"'ퟓ' > 'gyelh'\"\n- \"'ퟔ' > 'gyem'\"\n- \"'ퟕ' > 'gyeb'\"\n- \"'ퟖ' > 'gyebs'\"\n- \"'ퟗ' > 'gyes'\"\n- \"'ퟘ' > 'gyess'\"\n- \"'ퟙ' > 'gyeng'\"\n- \"'ퟚ' > 'gyej'\"\n- \"'ퟛ' > 'gyec'\"\n- \"'ퟜ' > 'gyek'\"\n- \"'ퟝ' > 'gyet'\"\n- \"'ퟞ' > 'gyep'\"\n- \"'ퟟ' > 'gyeh'\"\n- \"'ퟠ' > 'go'\"\n- \"'ퟡ' > 'gog'\"\n- \"'ퟢ' > 'gogg'\"\n- \"'ퟣ' > 'gogs'\"\n- \"'ퟤ' > 'gon'\"\n- \"'ퟥ' > 'gonj'\"\n- \"'ퟦ' > 'gonh'\"\n- \"'ퟧ' > 'god'\"\n- \"'ퟨ' > 'gol'\"\n- \"'ퟩ' > 'golg'\"\n- \"'ퟪ' > 'golm'\"\n- \"'ퟫ' > 'golb'\"\n- \"'ퟬ' > 'gols'\"\n- \"'ퟭ' > 'golt'\"\n- \"'ퟮ' > 'golp'\"\n- \"'ퟯ' > 'golh'\"\n- \"'ퟰ' > 'gom'\"\n- \"'ퟱ' > 'gob'\"\n- \"'ퟲ' > 'gobs'\"\n- \"'ퟳ' > 'gos'\"\n- \"'ퟴ' > 'goss'\"\n- \"'ퟵ' > 'gong'\"\n- \"'ퟶ' > 'goj'\"\n- \"'ퟷ' > 'goc'\"\n- \"'ퟸ' > 'gok'\"\n- \"'ퟹ' > 'got'\"\n- \"'ퟺ' > 'gop'\"\n- \"'ퟻ' > 'goh'\"\n- \"'﨎' > 'geuj'\"\n- \"'﨏' > 'geuc'\"\n- \"'﨑' > 'geut'\"\n- \"'﨓' > 'geuh'\"\n- \"'﨔' > 'gyi'\"\n- \"'﨟' > 'gyilb'\"\n- \"'﨡' > 'gyilt'\"\n- \"'﨣' > 'gyilh'\"\n- \"'﨤' > 'gyim'\"\n- \"'﨧' > 'gyis'\"\n- \"'﨨' > 'gyiss'\"\n- \"'﨩' > 'gying'\"\n- \"'ﬓ' > 'ggyegs'\"\n- \"'ﬔ' > 'ggyen'\"\n- \"'ﬕ' > 'ggyenj'\"\n- \"'ﬖ' > 'ggyenh'\"\n- \"'ﬗ' > 'ggyed'\"\n- \"'ﹳ' > 'nwih'\"\n- \"'ｰ' > 'de'\"\n- \"'ﾞ' > 'dyeobs'\"\n- \"'ﾟ' > 'dyeos'\"\n- \"'ﾠ' > 'dyeoss'\"\n- \"'ﾰ' > 'dyel'\"\n- \"'ﾴ' > 'dyels'\"\n"
  },
  {
    "path": "settings/icu-rules/unicode-digits-to-decimal.yaml",
    "content": "- \"[𞥐𐒠߀𖭐꤀𖩠𑓐𑑐𑋰𑄶꩐꘠᱀᭐᮰᠐០᥆༠໐꧰႐᪐᪀᧐𑵐꯰᱐𑱐𑜰𑛀𑙐𑇐꧐꣐෦𑁦０𝟶𝟘𝟬𝟎𝟢₀⓿⓪⁰零] > 0\"\n- \"[𞥑𐒡߁𖭑꤁𖩡𑓑𑑑𑋱𑄷꩑꘡᱁᭑᮱᠑១᥇༡໑꧱႑᪑᪁᧑𑵑꯱᱑𑱑𑜱𑛁𑙑𑇑꧑꣑෧𑁧１𝟷𝟙𝟭𝟏𝟣₁¹①⑴⒈❶➀➊⓵一] > 1\"\n- \"[𞥒𐒢߂𖭒꤂𖩢𑓒𑑒𑋲𑄸꩒꘢᱂᭒᮲᠒២᥈༢໒꧲႒᪒᪂᧒𑵒꯲᱒𑱒𑜲𑛂𑙒𑇒꧒꣒෨𑁨２𝟸𝟚𝟮𝟐𝟤₂²②⑵⒉❷➁➋⓶二] > 2\"\n- \"[𞥓𐒣߃𖭓꤃𖩣𑓓𑑓𑋳𑄹꩓꘣᱃᭓᮳᠓៣᥉༣໓꧳႓᪓᪃᧓𑵓꯳᱓𑱓𑜳𑛃𑙓𑇓꧓꣓෩𑁩３𝟹𝟛𝟯𝟑𝟥₃³③⑶⒊❸➂➌⓷三] > 3\"\n- \"[𞥔𐒤߄𖭔꤄𖩤𑓔𑑔𑋴𑄺꩔꘤᱄᭔᮴᠔៤᥊༤໔꧴႔᪔᪄᧔𑵔꯴᱔𑱔𑜴𑛄𑙔𑇔꧔꣔෪𑁪４𝟺𝟜𝟰𝟒𝟦₄⁴④⑷⒋❹➃➍⓸四] > 4\"\n- \"[𞥕𐒥߅𖭕꤅𖩥𑓕𑑕𑋵𑄻꩕꘥᱅᭕᮵᠕៥᥋༥໕꧵႕᪕᪅᧕𑵕꯵᱕𑱕𑜵𑛅𑙕𑇕꧕꣕෫𑁫５𝟻𝟝𝟱𝟓𝟧₅⁵⑤⑸⒌❺➄➎⓹五] > 5\"\n- \"[𞥖𐒦߆𖭖꤆𖩦𑓖𑑖𑋶𑄼꩖꘦᱆᭖᮶᠖៦᥌༦໖꧶႖᪖᪆᧖𑵖꯶᱖𑱖𑜶𑛆𑙖𑇖꧖꣖෬𑁬６𝟼𝟞𝟲𝟔𝟨₆⁶⑥⑹⒍❻➅➏⓺六] > 6\"\n- \"[𞥗𐒧߇𖭗꤇𖩧𑓗𑑗𑋷𑄽꩗꘧᱇᭗᮷᠗៧᥍༧໗꧷႗᪗᪇᧗𑵗꯷᱗𑱗𑜷𑛇𑙗𑇗꧗꣗෭𑁭７𝟽𝟟𝟳𝟕𝟩₇⁷⑦⑺⒎❼➆➐⓻七] > 7\"\n- \"[𞥘𐒨߈𖭘꤈𖩨𑓘𑑘𑋸𑄾꩘꘨᱈᭘᮸᠘៨᥎༨໘꧸႘᪘᪈᧘𑵘꯸᱘𑱘𑜸𑛈𑙘𑇘꧘꣘෮𑁮８𝟾𝟠𝟴𝟖𝟪₈⁸⑧⑻⒏❽➇➑⓼八] > 8\"\n- \"[𞥙𐒩߉𖭙꤉𖩩𑓙𑑙𑋹𑄿꩙꘩᱉᭙᮹᠙៩᥏༩໙꧹႙᪙᪉᧙𑵙꯹᱙𑱙𑜹𑛉𑙙𑇙꧙꣙෯𑁯９𝟿𝟡𝟵𝟗𝟫₉⁹⑨⑼⒐❾➈➒⓽九] > 9\"\n- \"[𑜺⑩⑽⒑❿➉➓⓾十] > '10'\"\n- \"[⑪⑾⒒⓫] > '11'\"\n- \"[⑫⑿⒓⓬] > '12'\"\n- \"[⑬⒀⒔⓭] > '13'\"\n- \"[⑭⒁⒕⓮] > '14'\"\n- \"[⑮⒂⒖⓯] > '15'\"\n- \"[⑯⒃⒗⓰] > '16'\"\n- \"[⑰⒄⒘⓱] > '17'\"\n- \"[⑱⒅⒙⓲] > '18'\"\n- \"[⑲⒆⒚⓳] > '19'\"\n- \"[𑜻⑳⒇⒛⓴] > '20'\"\n- \"⅐ > ' 1/7'\"\n- \"⅑ > ' 1/9'\"\n- \"⅒  > ' 1/10'\"\n"
  },
  {
    "path": "settings/icu-rules/variants-bg.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#.D0.91.D1.8A.D0.BB.D0.B3.D0.B0.D1.80.D1.81.D0.BA.D0.B8_.D0.B5.D0.B7.D0.B8.D0.BA_-_Bulgarian\n- lang: bg\n  words:\n    - Блок -> бл\n    - Булевард -> бул\n    - Вход -> вх\n    - Генерал -> ген\n    - Град -> гр\n    - Доктор -> д-р\n    - Доцент -> доц\n    - Капитан -> кап\n    - Митрополит -> мит\n    - Площад -> пл\n    - Професор -> проф\n    - Свети -> Св\n    - Улица -> ул\n    - Село -> с\n    - Квартал -> кв\n    - Жилищен Комплекс -> ж к\n"
  },
  {
    "path": "settings/icu-rules/variants-ca.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Catal.C3.A0_-_Catalan\n- lang: ca\n  words:\n    -  aparcament -> aparc\n    -  apartament -> apmt\n    -  apartat -> apt\n    -  àtic -> àt\n    -  autopista -> auto\n    -  autopista -> autop\n    -  autovia -> autov\n    -  avinguda -> av\n    -  avinguda -> avd\n    -  avinguda -> avda\n    -  baixada -> bda\n    -  baixos -> bxs\n    -  barranc -> bnc\n    -  barri -> b\n    -  barriada -> b\n    -  biblioteca -> bibl\n    -  bloc -> bl\n    -  carrer -> c\n    -  carreró -> cró\n    -  carretera -> ctra\n    -  cantonada -> cant\n    -  cementiri -> cem\n    -  cinturó -> cint\n    -  codi postal -> CP\n    -  collegi -> coll\n    -  collegi públic -> CP\n    -  comissaria -> com\n    -  convent -> convt\n    -  correus -> corr\n    -  districte -> distr\n    -  drecera -> drec\n    -  dreta -> dta\n    -  entrada -> entr\n    -  entresòl -> entl\n    -  escala -> esc\n    -  escola -> esc\n    -  escola universitària -> EU\n    -  església -> esgl\n    -  estació -> est\n    -  estacionament -> estac\n    -  facultat -> fac\n    -  finca -> fca\n    -  habitació -> hab\n    -  hospital -> hosp\n    -  hotel -> H\n    -  monestir -> mtir\n    -  monument -> mon\n    -  mossèn -> Mn\n    -  municipal -> mpal\n    -  museu -> mus\n    -  nacional -> nac\n    -  nombre -> nre\n    -  número -> núm\n    -  número -> n\n    -  sense número -> s/n\n    -  parada -> par\n    -  passadís -> pdís\n    -  passatge -> ptge\n    -  passeig -> pg\n    -  pavelló -> pav\n    -  plaça -> pl\n    -  plaça -> pça\n    -  planta -> pl\n    -  població -> pobl\n    -  polígon -> pol\n    -  polígon industrial -> PI\n    -  polígon industrial -> pol ind\n    -  porta -> pta\n    -  portal -> ptal\n    -  principal -> pral\n    -  pujada -> pda\n    -  punt quilomètric -> PK\n    -  rambla -> rbla\n    -  ronda -> rda\n    -  sagrada -> sgda\n    -  sagrat -> sgt\n    -  sant -> st\n    -  santa -> sta\n    -  sobreàtic -> s/àt\n    -  travessera -> trav\n    -  travessia -> trv\n    -  travessia -> trav\n    -  urbanització -> urb\n    -  sortida -> sort\n    -  via -> v\n"
  },
  {
    "path": "settings/icu-rules/variants-cs.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Cesky_-_Czech\n- lang: cs\n  words:\n    -  Ulice -> Ul\n    -  Třída -> Tř\n    -  Náměstí -> Nám\n"
  },
  {
    "path": "settings/icu-rules/variants-da.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Dansk_-_Danish\n- lang: da\n  words:\n    -  Lille -> Ll\n    -  Nordre -> Ndr\n    -  Nørre -> Nr\n    -  Søndre, Sønder -> Sdr\n    -  Store -> St\n    -  Gammel,Gamle -> Gl\n    -  ~hal => hal\n    -  ~hallen => hallen\n    -  ~hallerne => hallerne\n"
  },
  {
    "path": "settings/icu-rules/variants-de.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Deutsch_-_German\n- lang: de\n  words:\n    -  am -> a\n    -  an der -> a d\n    -  Allgemeines Krankenhaus -> AKH\n    -  Altstoffsammelzentrum -> ASZ\n    -  auf der -> a d\n    -  ~bach -> B\n    -  Bad -> B\n    -  Bahnhof -> Bhf\n    -  Bayerisch, Bayerische, Bayerischer, Bayerisches -> Bayer\n    -  Berg -> B\n    -  ~berg |-> bg\n    -  Bezirk -> Bez\n    -  ~brücke -> Br\n    -  Bundesgymnasium -> BG\n    -  Bundespolizeidirektion -> BPD\n    -  Bundesrealgymnasium -> BRG\n    -  ~burg |-> bg\n    -  burgenländische,burgenländischer,burgenländisches -> bgld\n    -  Bürgermeister -> Bgm\n    -  Chaussee -> Ch\n    -  Deutsche, Deutscher, Deutsches -> dt\n    -  Deutscher Alpenverein -> DAV\n    -  Deutsch -> Dt\n    -  ~denkmal -> Dkm\n    -  Dorf -> Df\n    -  ~dorf |-> df\n    -  Doktor -> Dr\n    -  ehemalige, ehemaliger, ehemaliges -> ehem\n    -  Fabrik -> Fb\n    -  Fachhochschule -> FH\n    -  Freiwillige Feuerwehr -> FF\n    -  Forsthaus -> Fh\n    -  ~gasse |-> g\n    -  Gasthaus -> Gh\n    -  Gasthof -> Ghf\n    -  Gemeinde -> Gde\n    -  Graben -> Gr\n    -  Großer, Große, Großes -> Gr, G\n    -  Gymnasium und Realgymnasium -> GRG\n    -  Handelsakademie -> HAK\n    -  Handelsschule -> HASCH\n    -  Haltestelle -> Hst\n    -  Hauptbahnhof -> Hbf\n    -  Haus -> Hs\n    -  Heilige, Heiliger, Heiliges -> Hl\n    -  Hintere, Hinterer, Hinteres -> Ht, Hint\n    -  Hohe, Hoher, Hohes -> H\n    -  ~höhle -> H\n    -  Höhere Technische Lehranstalt -> HTL\n    -  ~hütte -> Htt\n    -  im -> i\n    -  in -> i\n    -  in der -> i d\n    -  Ingenieur -> Ing\n    -  Internationale, Internationaler, Internationales -> Int\n    -  Jagdhaus -> Jh\n    -  Jagdhütte -> Jhtt\n    -  Kapelle -> Kap, Kpl\n    -  Katastralgemeinde -> KG\n    -  Kläranlage -> KA\n    -  Kleiner, Kleine, Kleines -> kl\n    -  Klein~ -> Kl.\n    -  Kleingartenanlage -> KGA\n    -  Kleingartenverein -> KGV\n    -  Kogel -> Kg\n    -  ~kogel |-> kg\n    -  Konzentrationslager -> KZ, KL\n    -  Krankenhaus -> KH\n    -  ~kreuz |-> kz\n    -  Landeskrankenhaus -> LKH\n    -  Maria -> Ma\n    -  Magister -> Mag\n    -  Magistratsabteilung -> MA\n    -  Markt -> Mkt\n    -  Müllverbrennungsanlage -> MVA\n    -  Nationalpark -> NP\n    -  Naturschutzgebiet -> NSG\n    -  Neue Mittelschule -> NMS\n    -  Niedere, Niederer, Niederes -> Nd\n    -  Niederösterreich -> NÖ\n    -  nördliche, nördlicher, nördliches -> nördl\n    -  Nummer -> Nr\n    -  ob -> o\n    -  Oberer, Obere, Oberes -> ob\n    -  Ober~ -> Ob\n    -  Österreichischer Alpenverein -> ÖAV\n    -  Österreichischer Gebirgsverein -> ÖGV\n    -  Österreichischer Touristenklub -> ÖTK\n    -  östliche, östlicher, östliches -> östl\n    -  Pater -> P\n    -  Pfad -> P\n    -  Platz -> Pl\n    -  ~platz$ -> pl\n    -  Professor -> Prof\n    -  Quelle -> Q, Qu\n    -  Reservoir -> Res\n    -  Rhein -> Rh\n    -  Rundwanderweg -> RWW\n    -  Ruine -> R\n    -  Sandgrube, Schottergrube -> SG\n    -  Sankt -> St\n    -  Schloss -> Schl\n    -  See -> S\n    -  ~siedlung -> sdlg\n    -  Sozialmedizinisches Zentrum -> SMZ\n    -  ~Spitze -> Sp\n    -  Steinbruch -> Stb\n    -  ~stiege -> stg\n    -  ~strasse -> str\n    -  südliche, südlicher, südliches -> südl\n    -  Unterer, Untere, Unteres -> u, unt\n    -  Unter~ -> U\n    -  Teich -> T\n    -  Technische Universität -> TU\n    -  Truppenübungsplatz -> TÜPL, TÜPl\n    -  Unfallkrankenhaus -> UKH\n    -  ~universität -> uni\n    -  verfallen -> verf\n    -  von -> v\n    -  Vordere, Vorderer, Vorderes -> Vd, Vord\n    -  Vorder… -> Vd, Vord\n    -  von der -> v d\n    -  vor der -> v d\n    -  Volksschule -> VS\n    -  Wald -> W\n    -  Wasserfall -> Wsf, Wssf\n    -  ~weg$ -> w\n    -  westliche, westlicher, westliches -> westl\n    -  Wiener -> Wr\n    -  ~wiese$ -> ws\n    -  Wirtschaftsuniversität -> WU\n    -  Wirtshaus -> Wh\n    -  zum -> z\n"
  },
  {
    "path": "settings/icu-rules/variants-el.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#.CE.95.CE.BB.CE.BB.CE.B7.CE.BD.CE.B9.CE.BA.CE.AC_-_Greek\n- lang: el\n  words:\n    -  Αγίας -> Αγ\n    -  Αγίου -> Αγ\n    -  Αγίων -> Αγ\n    -  Αδελφοί -> Αφοί\n    -  Αδελφών -> Αφών\n    -  Αλέξανδρου -> Αλ\n    -  Ανώτατο Τεχνολογικό Εκπαιδευτικό Ίδρυμα -> ΑΤΕΙ\n    -  Αστυνομικό Τμήμα -> ΑΤ\n    -  Βασιλέως -> Β\n    -  Βασιλέως -> Βασ\n    -  Βασιλίσσης -> Β\n    -  Βασιλίσσης -> Βασ\n    -  Γρηγορίου -> Γρ\n    -  Δήμος -> Δ\n    -  Δημοτικό Σχολείο -> ΔΣ\n    -  Δημοτικό Σχολείο -> Δημ Σχ\n    -  Εθνάρχου -> Εθν\n    -  Εθνική -> Εθν\n    -  Εθνικής -> Εθν\n    -  Ελευθέριος -> Ελ\n    -  Ελευθερίου -> Ελ\n    -  Ελληνικά Ταχυδρομεία -> ΕΛΤΑ\n    -  Θεσσαλονίκης -> Θεσ/νίκης\n    -  Ιερά Μονή -> Ι Μ\n    -  Ιερός Ναός -> Ι Ν\n    -  Κτίριο -> Κτ\n    -  Κωνσταντίνου -> Κων/νου\n    -  Λεωφόρος -> Λ\n    -  Λεωφόρος -> Λεωφ\n    -  Λίμνη -> Λ\n    -  Νέα -> Ν\n    -  Νέες -> Ν\n    -  Νέο -> Ν\n    -  Νέοι -> Ν\n    -  Νέος -> Ν\n    -  Νησί -> Ν\n    -  Νομός -> Ν\n    -  Όρος -> Όρ\n    -  Παλαιά -> Π\n    -  Παλαιές -> Π\n    -  Παλαιό -> Π\n    -  Παλαιοί -> Π\n    -  Παλαιός -> Π\n    -  Πανεπιστήμιο -> ΑΕΙ\n    -  Πανεπιστήμιο -> Παν\n    -  Πλατεία -> Πλ\n    -  Ποταμός -> Π\n    -  Ποταμός -> Ποτ\n    -  Στρατηγού -> Στρ\n    -  Ταχυδρομείο -> ΕΛΤΑ\n    -  Τεχνολογικό Εκπαιδευτικό Ίδρυμα -> ΤΕΙ\n"
  },
  {
    "path": "settings/icu-rules/variants-en.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#English\n# Source: https://pe.usps.com/text/pub28/28apc_002.htm\n- lang: en\n  words:\n    -  Access -> Accs\n    -  Air Force Base -> AFB\n    -  Air National Guard Base -> ANGB\n    -  Airport -> Aprt\n    -  Alley -> Al,All,Ally,Aly\n    -  Alleyway -> Alwy\n    -  Amble -> Ambl\n    -  Anex -> Anx\n    -  Apartments -> Apts\n    -  Approach -> Apch,App\n    -  Arcade -> Arc\n    -  Arterial -> Artl\n    -  Artery -> Arty\n    -  Avenue -> Av,Ave\n    -  Back -> Bk\n    -  Banan -> Ba\n    -  Basin -> Basn,Bsn\n    -  Bayou -> Byu\n    -  Beach -> Bch\n    -  Bend -> Bnd\n    -  Block -> Blk\n    -  Bluff -> Blf\n    -  Bluffs -> Blfs\n    -  Boardwalk -> Bwlk\n    -  Bottom -> Btm\n    -  Boulevard -> Blvd,Bvd\n    -  Boundary -> Bdy\n    -  Bowl -> Bl\n    -  Brace -> Br\n    -  Brae -> Br\n    -  Branch -> Br\n    -  Break -> Brk\n    -  Bridge$ -> Bdge,Br,Brdg,Brg,Bri\n    -  Broadway -> Bdwy,Bway,Bwy\n    -  Brook -> Brk\n    -  Brooks -> Brks\n    -  Brow -> Brw\n    -  Buildings -> Bldgs,Bldngs\n    -  Business -> Bus\n    -  Burg -> Bg\n    -  Burgs -> Bgs\n    -  Bypass -> Bps,Byp,Bypa\n    -  Byway -> Bywy\n    -  Camp -> Cp\n    -  Canyon -> Cyn\n    -  Cape -> Cpe\n    -  Caravan -> Cvn\n    -  Causeway -> Caus,Cswy,Cway\n    -  Center,Centre -> Cen,Ctr\n    -  Centers -> Ctrs\n    -  Central -> Ctrl\n    -  Centreway -> Cnwy\n    -  Chase -> Ch\n    -  Church -> Ch\n    -  Circle -> Cir\n    -  Circles -> Cirs\n    -  Circuit -> Cct,Ci\n    -  Circus -> Crc,Crcs\n    -  City -> Cty\n    -  Cliff -> Clf\n    -  Cliffs -> Clfs\n    -  Close -> Cl\n    -  Club -> Clb\n    -  Common -> Cmn,Comm\n    -  Commons -> Cmns\n    -  Community -> Comm\n    -  Concourse -> Cnc\n    -  Concourse -> Con\n    -  Copse -> Cps\n    -  Corner -> Cor,Cnr,Crn\n    -  Corners -> Cors\n    -  Corso -> Cso\n    -  Cottages -> Cotts\n    -  County -> Co\n    -  County Road -> CR\n    -  County Route -> CR\n    -  Course -> Crse\n    -  Court -> Crt,Ct\n    -  Courts -> Cts\n    -  Courtyard -> Cyd\n    -  Courtyard -> Ctyd\n    -  Cove$ -> Ce,Cov,Cv\n    -  Coves -> Cvs\n    -  Creek$ -> Ck,Cr,Crk\n    -  Crescent -> Cr\n    -  Crescent -> Cres\n    -  Crest -> Crst,Cst\n    -  Croft -> Cft\n    -  Cross -> Cs,Crss\n    -  Crossing -> Crsg,Csg,Xing\n    -  Crossroad -> Crd,Xrd\n    -  Crossroads -> Xrds\n    -  Crossway -> Cowy\n    -  Cul-de-sac -> Cds,Csac\n    -  Curve -> Cve,Curv\n    -  Cutting -> Cutt\n    -  Dale -> Dle\n    -  Dam -> Dm\n    -  Deviation -> Devn\n    -  Distributor -> Dstr\n    -  Divide -> Dv\n    -  Down -> Dn\n    -  Downs -> Dn\n    -  Drive -> Dr,Drv,Dv\n    -  Drives -> Drs\n    -  Drive-In => Drive-In # prevent abbreviation here\n    -  Driveway -> Drwy,Dvwy,Dwy\n    -  East -> E\n    -  Edge -> Edg\n    -  Elbow -> Elb\n    -  Entrance -> Ent\n    -  Esplanade -> Esp\n    -  Estate -> Est\n    -  Estates -> Ests\n    -  Expressway -> Exp,Expy,Expwy,Xway\n    -  Extension -> Ex\n    -  Extensions -> Exts\n    -  Fairway -> Fawy,Fy\n    -  Falls -> Fls\n    -  Father -> Fr\n    -  Ferry -> Fy,Fry\n    -  Field -> Fd,Fld\n    -  Fields -> Flds\n    -  Fire Track -> Ftrk\n    -  Firetrail -> Fit\n    -  Flat -> Fl,Flt\n    -  Flats -> Flts\n    -  Follow -> Folw\n    -  Footway -> Ftwy\n    -  Ford -> Frd\n    -  Fords -> Frds\n    -  Foreshore -> Fshr\n    -  Forest -> Frst\n    -  Forest Service Road -> FSR\n    -  Forge -> Frg\n    -  Forges -> Frgs\n    -  Formation -> Form\n    -  Fork -> Frk\n    -  Forks -> Frks\n    -  Fort -> Ft\n    -  Freeway -> Frwy,Fwy\n    -  Front -> Frnt\n    -  Frontage -> Fr,Frtg\n    -  Garden -> Gdn\n    -  Gardens -> Gdn,Gdns\n    -  Gate,Gates -> Ga,Gte\n    -  Gateway -> Gwy,Gtwy\n    -  George -> Geo\n    -  Glade$ -> Gl,Gld,Glde\n    -  Glen -> Gln\n    -  Glens -> Glns\n    -  Grange -> Gra\n    -  Green -> Gn,Grn\n    -  Greens -> Grns\n    -  Ground -> Grnd\n    -  Grove$ -> Gr,Gro,Grv\n    -  Groves -> Grvs\n    -  Grovet -> Gr\n    -  Gully -> Gly\n    -  Harbor -> Hbr,Harbour\n    -  Harbors -> Hbrs\n    -  Harbour -> Hbr,Harbor\n    -  Haven -> Hvn\n    -  Head -> Hd\n    -  Heads -> Hd\n    -  Heights -> Hgts,Ht,Hts\n    -  High School -> HS\n    -  Highroad -> Hird,Hrd\n    -  Highway -> Hwy\n    -  Hill -> Hl\n    -  Hills -> Hl,Hls\n    -  Hollow -> Holw\n    -  Hospital -> Hosp\n    -  House -> Ho,Hse\n    -  Industrial -> Ind\n    -  Inlet -> Inlt\n    -  Interchange -> Intg\n    -  International -> Intl\n    -  Island -> I,Is\n    -  Islands -> Iss\n    -  Junction -> Jct,Jctn,Jnc\n    -  Junctions -> Jcts\n    -  Junior -> Jr\n    -  Key -> Ky\n    -  Keys -> Kys\n    -  Knoll -> Knl\n    -  Knolls -> Knls\n    -  Lagoon -> Lgn\n    -  Lake -> Lk\n    -  Lakes -> L,Lks\n    -  Landing -> Ldg,Lndg\n    -  Lane -> La,Ln\n    -  Laneway -> Lnwy\n    -  Light -> Lgt\n    -  Lights -> Lgts\n    -  Line -> Ln\n    -  Link -> Lk\n    -  Little -> Lit,Lt\n    -  Loaf -> Lf\n    -  Lock -> Lck\n    -  Locks -> Lcks\n    -  Lodge -> Ldg\n    -  Lookout -> Lkt\n    -  Loop -> Lp\n    -  Lower -> Low,Lr,Lwr\n    -  Mall -> Ml\n    -  Manor -> Mnr\n    -  Manors -> Mnrs\n    -  Mansions -> Mans\n    -  Market -> Mkt\n    -  Meadow -> Mdw\n    -  Meadows -> Mdw,Mdws\n    -  Mead -> Md\n    -  Meander -> Mdr,Mndr,Mr\n    -  Medical -> Med\n    -  Memorial -> Mem\n    -  Mews -> Mw\n    -  Middle -> Mid\n    -  Middle School -> MS\n    -  Mile -> Mi\n    -  Military -> Mil\n    -  Mill -> Ml\n    -  Mills -> Mls\n    -  Mission -> Msn\n    -  Motorway -> Mtwy,Mwy\n    -  Mount -> Mt\n    -  Mountain -> Mtn\n    -  Mountains$ -> Mtn,Mtns\n    -  Municipal -> Mun\n    -  Museum -> Mus\n    -  National Park -> NP\n    -  National Recreation Area -> NRA\n    -  National Wildlife Refuge Area -> NWRA\n    -  Neck -> Nck\n    -  Nook -> Nk\n    -  North -> N\n    -  Northeast -> NE\n    -  Northwest -> NW\n    -  Orchard -> Orch\n    -  Outlook -> Out,Otlk\n    -  Overpass -> Opas\n    -  Parade -> Pde\n    -  Paradise -> Pdse\n    -  Park -> Pk\n    -  Parklands -> Pkld\n    -  Parkway -> Pkwy,Pky,Pwy\n    -  Parkways -> Pkwy\n    -  Pass -> Ps\n    -  Passage -> Psge\n    -  Pathway -> Phwy,Pway,Pwy\n    -  Piazza -> Piaz\n    -  Pike -> Pk\n    -  Pine -> Pne\n    -  Pines -> Pnes\n    -  Place -> Pl\n    -  Plain -> Pl,Pln\n    -  Plains -> Pl,Plns\n    -  Plateau -> Plat\n    -  Plaza -> Pl,Plz,Plza\n    -  Pocket -> Pkt\n    -  Point -> Pnt,Pt\n    -  Points -> Pts\n    -  Port -> Prt,Pt\n    -  Ports -> Prts\n    -  Post Office -> PO\n    -  Prairie -> Pr\n    -  Precinct -> Pct\n    -  Promenade -> Prm,Prom\n    -  Quadrangle -> Qdgl\n    -  Quadrant -> Qdrt,Qd\n    -  Quay -> Qy\n    -  Quays -> Qy\n    -  Quays -> Qys\n    -  Radial -> Radl\n    -  Ramble -> Ra\n    -  Ramble -> Rmbl\n    -  Ranch -> Rnch\n    -  Range -> Rge,Rnge\n    -  Rapid -> Rpd\n    -  Rapids -> Rpds\n    -  Reach -> Rch\n    -  Reservation -> Res\n    -  Reserve -> Res\n    -  Reservoir -> Res\n    -  Rest -> Rst\n    -  Retreat -> Rt,Rtt\n    -  Return -> Rtn\n    -  Ridge -> Rdg,Rdge\n    -  Ridges -> Rdgs\n    -  Ridgeway -> Rgwy\n    -  Right of Way -> Rowy\n    -  Rise -> Ri\n    -  ^River -> R,Riv,Rvr\n    -  River$ -> R,Riv,Rvr\n    -  Riverway -> Rvwy\n    -  Riviera -> Rvra\n    -  Road -> Rd\n    -  Roads -> Rds\n    -  Roadside -> Rdsd\n    -  Roadway -> Rdwy,Rdy\n    -  Rocks -> Rks\n    -  Ronde -> Rnde\n    -  Rosebowl -> Rsbl\n    -  Rotary -> Rty\n    -  Round -> Rnd\n    -  Route -> Rt,Rte\n    -  Saint -> St\n    -  Saints -> SS\n    -  Senior -> Sr\n    -  Serviceway -> Swy,Svwy\n    -  Shoal -> Shl\n    -  Shore -> Shr\n    -  Shores -> Shrs\n    -  Shunt -> Shun\n    -  Siding -> Sdng\n    -  Sister -> Sr\n    -  Skyway -> Skwy\n    -  Slope -> Slpe\n    -  Sound -> Snd\n    -  South -> S,Sth\n    -  Southeast -> SE\n    -  Southwest -> SW\n    -  Spring -> Spg\n    -  Springs -> Spgs\n    -  Spurs -> Spur\n    -  Square -> Sq\n    -  Squares -> Sqs\n    -  Stairway -> Strwy\n    -  State Highway -> SH,SHwy\n    -  State Route -> SR\n    -  Station -> Sta,Stn\n    -  Strand -> Sd,Stra\n    -  Stravenue -> Stra\n    -  Stream -> Strm\n    -  Street -> St\n    -  Streets -> Sts\n    -  Strip -> Strp\n    -  Subway -> Sbwy\n    -  Summit -> Smt\n    -  Tarn -> Tn\n    -  Terminal -> Term\n    -  Terrace -> Tce,Ter,Terr\n    -  Thoroughfare -> Thfr,Thor\n    -  Throughway -> Trwy\n    -  Tollway -> Tlwy,Twy\n    -  Towers -> Twrs\n    -  Township -> Twp\n    -  Trace -> Trce\n    -  Track -> Tr,Trak,Trk\n    -  Trafficway -> Trfy\n    -  Trail -> Trl\n    -  Trailer -> Trlr\n    -  Triangle -> Tri\n    -  Trunkway -> Tkwy\n    -  Tunnel -> Tun,Tunl\n    -  Turn -> Tn,Trn\n    -  Turnpike -> Tpk,Tpke\n    -  Underpass -> Upas,Ups\n    -  Union -> Un\n    -  Unions -> Uns\n    -  University -> Uni,Univ\n    -  Upper -> Up\n    -  Upper -> Upr\n    -  Vale -> Va\n    -  Valley -> Vly\n    -  Valley -> Vy\n    -  Valleys -> Vlys\n    -  Viaduct$ -> Vdct,Via,Viad\n    -  View -> Vw\n    -  Views -> Vws\n    -  Village -> Vill,Vlg\n    -  Villages -> Vlgs\n    -  Villas -> Vlls\n    -  Ville -> Vl\n    -  Vista -> Vis,Vst,Vsta\n    -  Walk -> Wk,Wlk\n    -  Walks -> Walk\n    -  Walkway -> Wkwy,Wky\n    -  Waters -> Wtr\n    -  Way -> Wy\n    -  Well -> Wl\n    -  Wells -> Wls\n    -  West -> W\n    -  Wharf -> Whrf\n    -  William -> Wm\n    -  Wynd -> Wyn\n    -  Yard -> Yd\n- lang: en\n  country: ca\n  words:\n    -  Circuit -> CIRCT\n    -  Concession -> CONC\n    -  Corners -> CRNRS\n    -  Crossing -> CROSS\n    -  Diversion -> DIVERS\n    -  Esplanade -> ESPL\n    -  Extension -> EXTEN\n    -  Grounds -> GRNDS\n    -  Harbour -> HARBR\n    -  Highlands -> HGHLDS\n    -  Landing -> LANDNG\n    -  Limits -> LMTS\n    -  Lookout -> LKOUT\n    -  Orchard -> ORCH\n    -  Parkway -> PKY\n    -  Passage -> PASS\n    -  Pathway -> PTWAY\n    -  Private -> PVT\n    -  Range -> RG\n    -  Subdivision -> SUBDIV\n    -  Terrace -> TERR\n    -  Townline -> TLINE\n    -  Turnabout -> TRNABT\n    -  Village -> VILLGE\n- lang: en\n  country: ph\n  words:\n    -  Apartment -> Apt\n    -  Barangay -> Brgy\n    -  Barangay -> Bgy\n    -  Building -> Bldg\n    -  Commission -> Comm\n    -  Compound -> Cmpd\n    -  Compound -> Cpd\n    -  Cooperative -> Coop\n    -  Department -> Dept\n    -  Department -> Dep't\n    -  General -> Gen\n    -  Governor -> Gov\n    -  National -> Nat'l\n    -  National High School -> NHS\n    -  Philippine -> Phil\n    -  Police Community Precinct -> PCP\n    -  Province -> Prov\n    -  Senior High School -> SHS\n    -  Subdivision -> Subd\n- lang: en\n  country: pk\n  words:\n    - Bazaar -> Bazar\n    - Bazaar -> Bzr\n    - Block -> B\n    - Cantonment -> Cant\n    - Cantonment -> Cantt\n    - Chak -> Ch\n    - Chak -> Ck\n    - Chak -> Chk\n    - Co-operative Housing Society -> CHS\n    - Cooperative Housing Society -> CHS\n    - Commercial -> Com\n    - Commercial -> Comm\n    - Defense Housing Authority -> DHA\n    - Dera Ghazi -> DG\n    - District -> Dist\n    - District -> Distt\n    - District Council -> DC\n    - Extension -> Ext\n    - Federal Government Public School -> FGPS\n    - General Bus Stand -> GBS\n    - General Post Office -> GPO\n    - Government -> Govt\n    - Government Elementary School -> GES\n    - Government Primary School -> GPS\n    - Government Girls Primary School -> GGPS\n    - Government Girls High School -> GGHS\n    - Government High School -> GHS\n    - Gwadar Port Authority -> GPA\n    - Highway -> Hi\n    - Industrial Trading Estate -> ITE\n    - International -> Int\n    - Khasra -> Kh\n    - Khasra -> Kha\n    - Local Government -> LG\n    - Local Government Unit -> LGU\n    - Main Road -> MR\n    - Markaz -> Mkz\n    - Mauza -> Mz\n    - Mauza -> Mza\n    - Metropolitan Corporation -> MC\n    - Mohammad -> Moh\n    - Muhammad -> Moh\n    - Mohammad -> Mohd\n    - Muhammad -> Mohd\n    - Mohammad Ali -> MA\n    - Muhammad Ali -> MA\n    - Mouza -> Mz\n    - Mouza -> Mza\n    - National Highway -> NH\n    - National Highway Authority -> NHA\n    - Ring Road -> RR\n    - Sector -> Sec\n    - Sector -> Sect\n    - Sector -> Sectr\n    - Service -> Ser\n    - Service -> Serv\n    - Taluka Municipal Administration -> TMA\n    - Tehsil Municipal Administration -> TMA\n    - Union Council -> UC\n"
  },
  {
    "path": "settings/icu-rules/variants-es.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Espa.C3.B1ol_-_Spanish\n- lang: es\n  words:\n    -  Acequia -> Aceq\n    -  Alameda -> Alam\n    -  Alquería -> Alque\n    -  Andador -> Andad\n    -  Angosta -> Angta\n    -  Apartamento -> Apto\n    -  Apartamentos -> Aptos\n    -  Apeadero -> Apdro\n    -  Arboleda -> Arb\n    -  Arrabal -> Arral\n    -  Arroyo -> Arry\n    -  Asociación de Vecinos -> A VV\n    -  Asociación Vecinal -> A V\n    -  Autopista -> Auto\n    -  Autovía -> Autov\n    -  Avenida -> Av\n    -  Avenida -> Avd\n    -  Avenida -> Avda\n    -  Balneario -> Balnr\n    -  Banda -> B\n    -  Banda -> Bda\n    -  Barranco -> Branc\n    -  Barranquil -> Bqllo\n    -  Barriada -> Barda\n    -  Barrio -> B.º\n    -  Barrio -> Bo\n    -  Bloque -> Blq\n    -  Bulevar -> Blvr\n    -  Boulevard -> Blvd\n    -  Calle -> C\n    -  Calle -> Cl\n    -  Calleja -> Cllja\n    -  Callejón -> Callej\n    -  Callejón -> Cjón\n    -  Callejón -> Cllón\n    -  Callejuela -> Cjla\n    -  Callizo -> Cllzo\n    -  Calzada -> Czada\n    -  Camino -> Cno\n    -  Camino -> Cmno\n    -  Camino hondo -> C H\n    -  Camino nuevo -> C N\n    -  Camino viejo -> C V\n    -  Camping -> Campg\n    -  Cantera -> Cantr\n    -  Cantina -> Canti\n    -  Cantón -> Cant\n    -  Carrera -> Cra\n    -  Carrero -> Cro\n    -  Carretera -> Ctra\n    -  Carreterín -> Ctrin\n    -  Carretil -> Crtil\n    -  Caserío -> Csrio\n    -  Centro Integrado de Formación Profesional -> CIFP\n    -  Cinturón -> Cint\n    -  Circunvalación -> Ccvcn\n    -  Cobertizo -> Cbtiz\n    -  Colegio de Educación Especial -> CEE\n    -  Colegio de Educación Infantil -> CEI\n    -  Colegio de Educación Infantil y Primaria -> CEIP\n    -  Colegio Rural Agrupado -> CRA\n    -  Colonia -> Col\n    -  Complejo -> Compj\n    -  Conjunto -> Cjto\n    -  Convento -> Cnvto\n    -  Cooperativa -> Coop\n    -  Corralillo -> Crrlo\n    -  Corredor -> Crrdo\n    -  Cortijo -> Crtjo\n    -  Costanilla -> Cstan\n    -  Costera -> Coste\n    -  Dehesa -> Dhsa\n    -  Demarcación -> Demar\n    -  Diagonal -> Diag\n    -  Diseminado -> Disem\n    -  Doctor -> Dr\n    -  Doctora -> Dra\n    -  Edificio -> Edif\n    -  Empresa -> Empr\n    -  Entrada -> Entd\n    -  Escalera -> Esca\n    -  Escalinata -> Escal\n    -  Espalda -> Eslda\n    -  Estación -> Estcn\n    -  Estrada -> Estda\n    -  Explanada -> Expla\n    -  Extramuros -> Extrm\n    -  Extrarradio -> Extrr\n    -  Fábrica -> Fca\n    -  Fábrica -> Fbrca\n    -  Ferrocarril -> F C\n    -  Ferrocarriles -> FF CC\n    -  Galería -> Gale\n    -  Glorieta -> Gta\n    -  Gran Vía -> G V\n    -  Hipódromo -> Hipód\n    -  Instituto de Educación Secundaria -> IES\n    -  Jardín -> Jdín\n    -  Llanura -> Llnra\n    -  Lote -> Lt\n    -  Malecón -> Malec\n    -  Manzana -> Mz\n    -  Mercado -> Merc\n    -  Mirador -> Mrdor\n    -  Monasterio -> Mtrio\n    -  Nuestra Señora -> N.ª S.ª\n    -  Nuestra Señora -> Ntr.ª Sr.ª\n    -  Nuestra Señora -> Ntra Sra\n    -  Palacio -> Palac\n    -  Pantano -> Pant\n    -  Parque -> Pque\n    -  Particular -> Parti\n    -  Partida -> Ptda\n    -  Pasadizo -> Pzo\n    -  Pasaje -> Psje\n    -  Paseo -> P.º\n    -  Paseo marítimo -> P.º mar\n    -  Pasillo -> Psllo\n    -  Plaza -> Pl\n    -  Plaza -> Pza\n    -  Plazoleta -> Pzta\n    -  Plazuela -> Plzla\n    -  Poblado -> Pbdo\n    -  Polígono -> Políg\n    -  Polígono industrial -> Pg ind\n    -  Pórtico -> Prtco\n    -  Portillo -> Ptilo\n    -  Prazuela -> Przla\n    -  Prolongación -> Prol\n    -  Pueblo -> Pblo\n    -  Puente -> Pte\n    -  Puerta -> Pta\n    -  Puerto -> Pto\n    -  Punto kilométrico -> P k\n    -  Rambla -> Rbla\n    -  Residencial -> Resid\n    -  Ribera -> Rbra\n    -  Rincón -> Rcón\n    -  Rinconada -> Rcda\n    -  Rotonda -> Rtda\n    -  San -> S\n    -  Sanatorio -> Sanat\n    -  Santa -> Sta\n    -  Santo -> Sto\n    -  Santas -> Stas\n    -  Santos -> Stos\n    -  Santuario -> Santu\n    -  Sector -> Sect\n    -  Sendera -> Sedra\n    -  Sendero -> Send\n    -  Torrente -> Trrnt\n    -  Tránsito -> Tráns\n    -  Transversal -> Trval\n    -  Trasera -> Tras\n    -  Travesía -> Trva\n    -  Urbanización -> Urb\n    -  Vecindario -> Vecin\n    -  Viaducto -> Vcto\n    -  Viviendas -> Vvdas\n"
  },
  {
    "path": "settings/icu-rules/variants-et.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Eesti_-_Estonian\n- lang: et\n  words:\n    -  Maantee -> mnt\n    -  Puiestee -> pst\n    -  Raudtee -> rdt\n    -  Raudteejaam -> rdtj\n    -  Tänav -> tn\n"
  },
  {
    "path": "settings/icu-rules/variants-eu.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Euskara_-_Basque\n- lang: eu\n  words:\n    -  Etorbidea -> Etorb\n    -  Errepidea -> Err\n    -  Kalea -> K\n"
  },
  {
    "path": "settings/icu-rules/variants-fi.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Suomi_-_Finnish\n- lang: fi\n  words:\n    -  ~alue -> al\n    -  ~asema -> as\n    -  ~aukio -> auk\n    -  ~kaari -> kri\n    -  ~katu -> k\n    -  ~kuja -> kj\n    -  ~kylä -> kl\n    -  ~penger -> pgr\n    -  ~polku -> p\n    -  ~puistikko -> pko\n    -  ~puisto -> ps\n    -  ~raitti -> r\n    -  ~rautatieasema -> ras\n    -  ~ranta -> rt\n    -  ~rinne -> rn\n    -  ~taival -> tvl\n    -  ~tie -> t\n    -  tienhaara -> th\n    -  ~tori -> tr\n    -  ~väylä -> vlä\n"
  },
  {
    "path": "settings/icu-rules/variants-fr.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Fran.C3.A7ais_-_French\n- lang: fr\n  words:\n    -  Abbaye -> ABE\n    -  Agglomération -> AGL\n    -  Aires -> AIRE\n    -  Allée -> ALL\n    -  Allées -> ALL\n    -  Ancien chemin -> ACH\n    -  Ancienne route -> ART\n    -  Anciennes routes -> ART\n    -  Arcade -> ARC\n    -  Arcades -> ARC\n    -  Autoroute -> AUT\n    -  Avenue -> AV\n    -  Barrière -> BRE\n    -  Barrières -> BRE\n    -  Bas chemin -> BCH\n    -  Bastide -> BSTD\n    -  Baston -> BAST\n    -  Béguinage -> BEGI\n    -  Béguinages -> BEGI\n    -  Berge -> BER\n    -  Berges -> BER\n    -  Bois -> BOIS\n    -  Boucle -> BCLE\n    -  Boulevard -> BD\n    -  Bourg -> BRG\n    -  Butte -> BUT\n    -  Cités -> CITE\n    -  Côteau -> COTE\n    -  Campagne -> CGNE\n    -  Camping -> CPG\n    -  Carreau -> CAU\n    -  Carrefour -> CAR\n    -  Carrière -> CARE\n    -  Carrières -> CARE\n    -  Carré -> CARR\n    -  Castel -> CST\n    -  Cavée -> CAV\n    -  Central -> CTRE\n    -  Centre -> CTRE\n    -  Chalet -> CHL\n    -  Chapelle -> CHP\n    -  Charmille -> CHI\n    -  Chaussée -> CHS\n    -  Chaussées -> CHS\n    -  Chemin -> Ch\n    -  Chemin -> CHE\n    -  Chemin vicinal -> CHV\n    -  Cheminement -> CHEM\n    -  Cheminements -> CHEM\n    -  Chemins -> CHE\n    -  Chemins vicinaux -> CHV\n    -  Château -> CHT\n    -  Cloître -> CLOI\n    -  Colline -> COLI\n    -  Collines -> COLI\n    -  Contour -> CTR\n    -  Corniche -> COR\n    -  Corniches -> COR\n    -  Cottage -> COTT\n    -  Cottages -> COTT\n    -  Cours -> CRS\n    -  Darse -> DARS\n    -  Degré -> DEG\n    -  Degrés -> DEG\n    -  Descente -> DSG\n    -  Descentes -> DSG\n    -  Digue -> DIG\n    -  Digues -> DIG\n    -  Domaine -> DOM\n    -  Domaines -> DOM\n    -  Écluse -> ECL\n    -  Écluses -> ECL\n    -  Église -> EGL\n    -  Enceinte -> EN\n    -  Enclave -> ENV\n    -  Enclos -> ENC\n    -  Escalier -> ESC\n    -  Escaliers -> ESC\n    -  Espace -> ESPA\n    -  Esplanade -> ESP\n    -  Esplanades -> ESP\n    -  Faubourg -> FG\n    -  Ferme -> FRM\n    -  Fermes -> FRM\n    -  Fontaine -> FON\n    -  Forum -> FORM\n    -  Fosse -> FOS\n    -  Fosses -> FOS\n    -  Foyer -> FOYR\n    -  Galerie -> GAL\n    -  Galeries -> GAL\n    -  Garenne -> GARN\n    -  Grand boulevard -> GBD\n    -  Grand ensemble -> GDEN\n    -  Grand’rue -> GR\n    -  Grande rue -> GR\n    -  Grandes rues -> GR\n    -  Grands ensembles -> GDEN\n    -  Grille -> GRI\n    -  Grimpette -> GRIM\n    -  Groupe -> GPE\n    -  Groupement -> GPT\n    -  Groupes -> GPE\n    -  Halle -> HLE\n    -  Halles -> HLE\n    -  Hameau -> HAM\n    -  Hameaux -> HAM\n    -  Haut chemin -> HCH\n    -  Hauts chemins -> HCH\n    -  Hippodrome -> HIP\n    -  Immeuble -> IMM\n    -  Immeubles -> IMM\n    -  Impasse -> IMP\n    -  Impasses -> IMP\n    -  Jardin -> JARD\n    -  Jardins -> JARD\n    -  Jetée -> JTE\n    -  Jetées -> JTE\n    -  Levée -> LEVE\n    -  Lieu-dit -> LD\n    -  Lotissement -> LOT\n    -  Lotissements -> LOT\n    -  Maison forestière -> MF\n    -  Manoir -> MAN\n    -  Marche -> MAR\n    -  Marches -> MAR\n    -  Maréchal -> MAL\n    -  Monseigneur -> Mgr\n    -  Mont -> Mt\n    -  Montée -> MTE\n    -  Montées -> MTE\n    -  Moulin -> MLN\n    -  Moulins -> MLN\n    -  Musée -> MUS\n    -  Métro -> MET\n    -  Métro -> MÉT\n    -  Nouvelle route -> NTE\n    -  Palais -> PAL\n    -  Parking -> PKG\n    -  Parvis -> PRV\n    -  Passage -> PAS\n    -  Passage à niveau -> PN\n    -  Passe -> PASS\n    -  Passerelle -> PLE\n    -  Passerelles -> PLE\n    -  Passes -> PASS\n    -  Patio -> PAT\n    -  Pavillon -> PAV\n    -  Pavillons -> PAV\n    -  Petit chemin -> PCH\n    -  Petite allée -> PTA\n    -  Petite avenue -> PAE\n    -  Petite impasse -> PIM\n    -  Petite route -> PRT\n    -  Petite rue -> PTR\n    -  Petites allées -> PTA\n    -  Place -> PL\n    -  Placis -> PLCI\n    -  Plage -> PLAG\n    -  Plages -> PLAG\n    -  Plaine -> PLN\n    -  Plateau -> PLT\n    -  Plateaux -> PLT\n    -  Pointe -> PNT\n    -  Porche -> PCH\n    -  Porte -> PTE\n    -  Portique -> PORQ\n    -  Portiques -> PORQ\n    -  Poterne -> POT\n    -  Pourtour -> POUR\n    -  Presqu’île -> PRQ\n    -  Promenade -> PROM\n    -  Périphérique -> PERI\n    -  Péristyle -> PSTY\n    -  Quai -> QU\n    -  Quartier -> QUA\n    -  Raccourci -> RAC\n    -  Raidillon -> RAID\n    -  Rampe -> RPE\n    -  Rempart -> REM\n    -  Rocade -> ROC\n    -  Rond point -> RPT\n    -  Roquet -> ROQT\n    -  Rotonde -> RTD\n    -  Route -> RTE\n    -  Routes -> RTE\n    -  Rue -> R\n    -  Rue -> R\n    -  Ruelle -> RLE\n    -  Ruelles -> RLE\n    -  Rues -> R\n    -  Résidence -> RES\n    -  Résidences -> RES\n    -  Saint -> St\n    -  Sainte -> Ste\n    -  Sente -> SEN\n    -  Sentes -> SEN\n    -  Sentier -> SEN\n    -  Sentiers -> SEN\n    -  Square -> SQ\n    -  Stade -> STDE\n    -  Station -> STA\n    -  Terrain -> TRN\n    -  Terrasse -> TSSE\n    -  Terrasses -> TSSE\n    -  Terre plein -> TPL\n    -  Tertre -> TRT\n    -  Tertres -> TRT\n    -  Traverse -> TRA\n    -  Vallon -> VAL\n    -  Vallée -> VAL\n    -  Venelle -> VEN\n    -  Venelles -> VEN\n    -  Vieille route -> VTE\n    -  Vieux chemin -> VCHE\n    -  Villa -> VLA\n    -  Village -> VGE\n    -  Villages -> VGE\n    -  Villas -> VLA\n    -  Voie -> VOI\n    -  Voies -> VOI\n    -  Zone artisanale -> ZA\n    -  Zone d'aménagement concerté -> ZAC\n    -  Zone d'aménagement différé -> ZAD\n    -  Zone industrielle -> ZI\n    -  Zone à urbaniser en priorité -> ZUP\n- lang: fr\n  country: ca\n  words:\n    -  Boulevard -> BOUL\n    -  Carré -> CAR\n    -  Carrefour -> CARREF\n    -  Centre -> C\n    -  Chemin -> CH\n    -  Croissant -> CROIS\n    -  Diversion -> DIVERS\n    -  Échangeur -> ÉCH\n    -  Esplanade -> ESPL\n    -  Passage -> PASS\n    -  Plateau -> PLAT\n    -  Rond-point -> RDPT\n    -  Sentier -> SENT\n    -  Subdivision -> SUBDIV\n    -  Terrasse -> TSSE\n    -  Village -> VILLGE\n"
  },
  {
    "path": "settings/icu-rules/variants-gl.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Galego_-_Galician\n- lang: gl\n  words:\n    -  Asociación Veciñal -> A V\n    -  Asociación de Veciños -> A VV\n    -  Avenida -> Av\n    -  Avenida -> Avda\n    -  Centro Integrado de Formación Profesional -> CIFP\n    -  Colexio de Educación Especial -> CEE\n    -  Colexio de Educación Infantil -> CEI\n    -  Colexio de Educación Infantil e Primaria -> CEIP\n    -  Colexio Rural Agrupado -> CRA\n    -  Doutor -> Dr\n    -  Doutora -> Dra\n    -  Edificio -> Edif\n    -  Estrada -> Estda\n    -  Ferrocarril -> F C\n    -  Ferrocarrís -> FF CC\n    -  Instituto de Educación Secundaria -> IES\n    -  Rúa -> R/\n    -  San -> S\n    -  Santa -> Sta\n    -  Santo -> Sto\n    -  Santas -> Stas\n    -  Santos -> Stos\n    -  Señora -> Sra\n    -  Urbanización -> Urb\n"
  },
  {
    "path": "settings/icu-rules/variants-hu.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Magyar_-_Hungarian\n- lang: hu\n  words:\n    -  utca -> u\n"
  },
  {
    "path": "settings/icu-rules/variants-it.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Italiano_-_Italian\n- lang: it\n  words:\n    -  Calle -> C.le\n    -  Campo -> C.po\n    -  Cascina -> C.na\n    -  Cinque -> 5\n    -  Corso -> C.so\n    -  Corte -> C.te\n    -  Decima -> X\n    -  Decimo -> X\n    -  Due -> 2\n    -  Fondamenta -> F.ta\n    -  Largo -> L.go\n    -  Località -> Loc\n    -  Lungomare -> L.mare\n    -  Nona -> IX\n    -  Nono -> IX\n    -  Nove -> 9\n    -  Otto -> 8\n    -  Ottava -> VIII\n    -  Ottavo -> VIII\n    -  Piazza -> P.za\n    -  Piazza -> P.zza\n    -  Piazzale -> P.le\n    -  Piazzetta -> P.ta\n    -  Ponte -> P.te\n    -  Porta -> P.ta\n    -  Prima -> I\n    -  Primo -> I\n    -  Primo -> 1\n    -  Quarta -> IV\n    -  Quarto -> IV\n    -  Quattro -> IV\n    -  Quattro -> 4\n    -  Quinta -> V\n    -  Quinto -> V\n    -  Salizada -> S.da\n    -  San -> S\n    -  Santa -> S\n    -  Santo -> S\n    -  Sant' -> S\n    -  Santi -> SS\n    -  Santissima -> SS.ma\n    -  Santissime -> SS.me\n    -  Santissimi -> SS.mi\n    -  Santissimo -> SS.mo\n    -  Seconda -> II\n    -  Secondo -> II\n    -  Sei -> 6\n    -  Sesta -> VI\n    -  Sesto -> VI\n    -  Sette -> 7\n    -  Settima -> VII\n    -  Settimo -> VII\n    -  Stazione -> Staz\n    -  Strada Comunale -> SC\n    -  Strada Provinciale -> SP\n    -  Strada Regionale -> SR\n    -  Strada Statale -> SS\n    -  Terzo -> III\n    -  Terza -> III\n    -  Tre -> 3\n    -  Trenta -> XXX\n    -  Un -> 1\n    -  Una -> 1\n    -  Venti -> XX\n    -  Venti -> 20\n    -  Venticinque -> XXV\n    -  Venticinque -> 25\n    -  Ventiquattro -> XXIV\n    -  Ventitreesimo -> XXIII\n    -  Via -> V\n    -  Viale -> V.le\n    -  Vico -> V.co\n    -  Vicolo -> V.lo\n"
  },
  {
    "path": "settings/icu-rules/variants-mg.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Malagasy_-_Malgache\n- lang: mg\n  words:\n    -  Ambato -> Ato\n    -  Ambinany -> Any\n    -  Ambodi -> Adi\n    -  Ambohi -> Ahi\n    -  Ambohitr' -> Atr'\n    -  Ambony -> Ani\n    -  Ampasi -> Asi\n    -  Andoha -> Aha\n    -  Andrano -> Ano\n"
  },
  {
    "path": "settings/icu-rules/variants-ms.yaml",
    "content": "# Malay language abbreviations for Nominatim\n#\n# Primary source for Malaysia:\n#   JUPEM (Jabatan Ukur dan Pemetaan Malaysia) Toponymic Guidelines\n#   \"Abbreviations of Geographical Terms and Other Words Used in Maps\"\n#\n# Secondary sources:\n#   https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Bahasa_Melayu_-_Malay\n#   https://wiki.openstreetmap.org/wiki/Malaysia/Abbreviations\n\n- lang: ms\n  words:\n    - Jalan -> Jln\n    - Lorong -> Lrg,Lor\n    - Lebuh -> Lbh\n    - Simpang -> Spg\n    - Kampung -> Kg\n    - Kampong -> Kg\n    - Taman -> Tmn\n    - Bangunan -> Bgn\n    - Bukit -> Bkt\n    - Batu -> Bt\n    - Sungai -> Sg\n    - Pulau -> P,Pl\n    - Tanjung -> Tg\n    - Tanjong -> Tg\n    - Teluk -> Tlk\n    - Telok -> Tlk\n    - Gunung -> G,Gn\n    - Gunong -> G,Gn\n    - Haji -> Hj\n    - Hajjah -> Hjh\n    - Abdul -> Abd\n\n- lang: ms\n  country: my\n  words:\n    - Persiaran -> Psrn\n    - Lebuhraya -> Lbh.Raya\n    - Bandar -> Bdr\n    - Kondominium -> Kondo\n    - Bahagian -> Bhg\n    - Blok -> Blk\n    - Kuala -> K,Kl\n    - Alur -> Alr\n    - Bakau -> Bak\n    - Hulu -> H\n    - Hilir -> Hr\n    - Jeram -> J,Jr\n    - Lembah -> Lmbh\n    - Padang -> Pdg\n    - Parit -> Pt\n    - Permatang -> Pmtg\n    - Pelabuhan -> Plbh\n    - Kepulauan -> Kep\n    - Ladang -> Ldg\n    - Lapangan -> Lpg\n    - Gosong -> Gsg\n    - Sekolah kebangsaan -> SK\n    - Sekolah menengah -> SM\n    - Sekolah menengah kebangsaan -> SMK\n    - Sekolah rendah -> SR\n    - Hospital -> Hosp\n    - Dispensari -> Disp\n\n- lang: ms\n  country: bn\n  words:\n    - Pengiran -> Pg\n    - Awang -> Awg\n    - Dayang -> Dyg\n\n- lang: ms\n  country: sg\n  words:\n    - Bukit -> Bt\n    - Lorong -> Lor\n"
  },
  {
    "path": "settings/icu-rules/variants-nl.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Nederlands_-_Dutch\n- lang: nl\n  words:\n    -  Broeder -> Br\n    -  Burgemeester -> Burg\n    -  Commandant -> Cmdt\n    -  Doctor -> dr\n    -  Dokter -> Dr\n    -  Dominee -> ds\n    -  Gebroeders -> Gebr\n    -  Generaal -> Gen\n    -  ~gracht -> gr\n    -  Ingenieur -> ir\n    -  Jonkheer -> Jhr\n    -  Kolonel -> Kol\n    -  Kanunnik -> Kan\n    -  Kardinaal -> Kard\n    -  Kort(e) -> Kte, K\n    -  Koning -> Kon\n    -  Koningin -> Kon\n    -  ~laan -> ln\n    -  Lange -> L\n    -  Luitenant -> Luit\n    -  ~markt -> mkt\n    -  Meester -> Mr, mr\n    -  Mejuffrouw -> Mej\n    -  Mevrouw -> Mevr\n    -  Minister -> Min\n    -  Monseigneur -> Mgr\n    -  Noordzijde -> NZ, N Z\n    -  Oostzijde -> OZ, O Z\n    -  Onze-Lieve-Vrouw,Onze-Lieve-Vrouwe -> O L V, OLV\n    -  Pastoor -> Past\n    -  ~plein -> pln\n    -  President -> Pres\n    -  Prins -> Pr\n    -  Prinses -> Pr\n    -  Professor -> Prof\n    -  ~singel -> sngl\n    -  ~straat -> str\n    -  ~steenweg -> stwg\n    -  Sint -> St\n    -  Van -> V\n    -  Van De -> V D, vd\n    -  Van Den -> V D, vd\n    -  Van Der -> V D, vd\n    -  Verlengde -> Verl\n    -  ~vliet -> vlt\n    -  Vrouwe -> Vr\n    -  ~weg -> wg\n    -  Westzijde -> WZ, W Z\n    -  Zuidzijde -> ZZ, Z Z\n    -  Zuster -> Zr\n"
  },
  {
    "path": "settings/icu-rules/variants-no.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Norsk_-_Norwegian\n- lang: \"no\"\n  words:\n    # convert between Nynorsk and Bookmal here\n    -  ~vei, ~veg -> v,vei,veg\n    -  ~veien, ~vegen -> vn,veien,vegen\n    # convert between the two female forms\n    -  gate, gaten, gata -> g,gt\n    -  plass, plassen -> pl\n    -  sving, svingen -> sv\n"
  },
  {
    "path": "settings/icu-rules/variants-pl.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Polski_.E2.80.93_Polish\n- lang: pl\n  words:\n    -  Aleja, Aleje, Alei, Alejach, Aleją -> al\n    -  Ulica, Ulice, Ulicą, Ulicy -> ul\n    -  Plac, Placu, Placem -> pl\n    -  Wybrzeże, Wybrzeża, Wybrzeżem -> wyb\n    -  Bulwar -> bulw\n    -  Dolny, Dolna, Dolne -> Dln\n    -  Drugi, Druga, Drugie -> 2\n    -  Drugi, Druga, Drugie -> II\n    -  Duży, Duża, Duże -> Dz\n    -  Duży, Duża, Duże -> Dż\n    -  Górny, Górna, Górne -> Grn\n    -  Kolonia -> kol\n    -  koło, kolo -> k\n    -  Mały, Mała, Małe -> Ml\n    -  Mały, Mała, Małe -> Mł\n    -  Mazowiecka, Mazowiecki, Mazowieckie -> maz\n    -  Miasto -> m\n    -  Nowy, Nowa, Nowe -> Nw\n    -  Nowy, Nowa, Nowe -> N\n    -  Osiedle, Osiedlu -> os\n    -  Pierwszy, Pierwsza, Pierwsze -> 1\n    -  Pierwszy, Pierwsza, Pierwsze -> I\n    -  Szkoła Podstawowa -> SP\n    -  Stary, Stara, Stare -> St\n    -  Stary, Stara, Stare -> Str\n    -  Trzeci, Trzecia, Trzecie -> III\n    -  Trzeci, Trzecia, Trzecie -> 3\n    -  Wielki, Wielka, Wielkie -> Wlk\n    -  Wielkopolski, Wielkopolska, Wielkopolskie -> wlkp\n    -  Województwo, Województwie -> woj\n    -  kardynała, kardynał -> kard\n    -  pułkownika, pułkownik -> płk\n    -  marszałka, marszałek -> marsz\n    -  generała, generał -> gen\n    -  Świętego, Świętej, Świętych, święty, święta, święci -> św\n    -  Świętych, święci -> śś\n    -  Ojców -> oo\n    -  Błogosławionego, Błogosławionej, Błogosławionych, błogosławiony, błogosławiona, błogosławieni -> bł\n    -  księdza, ksiądz -> ks\n    -  księcia, książe -> ks\n    -  doktora, doktor -> dr\n    -  majora, major -> mjr\n    -  biskupa, biskup -> bpa\n    -  biskupa, biskup -> bp\n    -  rotmistrza, rotmistrz -> rotm\n    -  profesora, profesor -> prof\n    -  hrabiego, hrabiny, hrabia, hrabina -> hr\n    -  porucznika, porucznik -> por\n    -  podpułkownika, podpułkownik -> ppłk\n    -  pułkownika, pułkownik -> płk\n    -  podporucznika, podporucznik -> ppor\n    -  porucznika, porucznik -> por\n    -  marszałka, marszałek -> marsz\n    -  chorążego, chorąży -> chor\n    -  szeregowego, szeregowego -> szer\n    -  kaprala, kapral -> kpr\n    -  plutonowego, plutonowy -> plut\n    -  kapitana, kapitan -> kpt\n    -  admirała, admirał -> adm\n    -  wiceadmirała, wiceadmirał -> wadm\n    -  kontradmirała, kontradmirał -> kontradm\n    -  batalionów, bataliony -> bat\n    -  batalionu, batalion -> bat\n"
  },
  {
    "path": "settings/icu-rules/variants-pt.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Portugu.C3.AAs_-_Portuguese\n- lang: pt\n  words:\n    -  Associação -> Ass\n    -  Alameda -> Al\n    -  Alferes -> Alf\n    -  Almirante -> Alm\n    -  Arquitecto -> Arq\n    -  Arquitecto -> Arqº\n    -  Arquiteto -> Arq\n    -  Arquiteto -> Arqº\n    -  Auto-estrada -> A\n    -  Avenida -> Av\n    -  Avenida -> Avª\n    -  Azinhaga -> Az\n    -  Bairro -> B\n    -  Bairro -> Bº\n    -  Bairro -> Br\n    -  Beco -> Bc\n    -  Beco -> Bco\n    -  Bloco -> Bl\n    -  Bombeiros Voluntários -> BV\n    -  Bombeiros Voluntários -> B.V\n    -  Brigadeiro -> Brg\n    -  Cacique -> Cac\n    -  Calçada -> Cc\n    -  Calçadinha -> Ccnh\n    -  Câmara Municipal -> CM\n    -  Câmara Municipal -> C.M\n    -  Caminho -> Cam\n    -  Capitão -> Cap\n    -  Casal -> Csl\n    -  Cave -> Cv\n    -  Centro Comercial -> CC\n    -  Centro Comercial -> C.C\n    -  Ciclo do Ensino Básico -> CEB\n    -  Ciclo do Ensino Básico -> C.E.B\n    -  Ciclo do Ensino Básico -> C. E. B\n    -  Comandante -> Cmdt\n    -  Comendador -> Comend\n    -  Companhia -> Cª\n    -  Conselheiro -> Cons\n    -  Coronel -> Cor\n    -  Coronel -> Cel\n    -  Corte -> C.te\n    -  De -> D´\n    -  De -> D'\n    -  Departamento -> Dept\n    -  Deputado -> Dep\n    -  Direito -> Dto\n    -  Dom -> D\n    -  Dona -> D\n    -  Dona -> Dª\n    -  Doutor -> Dr\n    -  Doutora -> Dr\n    -  Doutora -> Drª\n    -  Doutora -> Dra\n    -  Duque -> Dq\n    -  Edifício -> Ed\n    -  Edifício -> Edf\n    -  Embaixador -> Emb\n    -  Empresa Pública -> EP\n    -  Empresa Pública -> E.P\n    -  Enfermeiro -> Enfo\n    -  Enfermeiro -> Enfº\n    -  Enfermeiro -> Enf\n    -  Engenheiro -> Eng\n    -  Engenheiro -> Engº\n    -  Engenheira -> Eng\n    -  Engenheira -> Engª\n    -  Escadas -> Esc\n    -  Escadinhas -> Escnh\n    -  Escola Básica -> EB\n    -  Escola Básica -> E.B\n    -  Esquerdo -> Esq\n    -  Estação de Tratamento de Águas Residuais -> ETAR\n    -  Estação de Tratamento de Águas Residuais -> E.T.A.R\n    -  Estrada -> Estr\n    -  Estrada Municipal -> EM\n    -  Estrada Nacional -> EN\n    -  Estrada Regional -> ER\n    -  Frei -> Fr\n    -  Frente -> Ft\n    -  Futebol Clube -> FC\n    -  Futebol Clube -> F.C\n    -  Guarda Nacional Republicana -> GNR\n    -  Guarda Nacional Republicana -> G.N.R\n    -  General -> Gen\n    -  General -> Gal\n    -  Habitação -> Hab\n    -  Infante -> Inf\n    -  Instituto -> Inst\n    -  Irmã -> Ima\n    -  Irmã -> Imª\n    -  Irmã -> Im\n    -  Irmão -> Imo\n    -  Irmão -> Imº\n    -  Irmão -> Im\n    -  Itinerário Complementar -> IC\n    -  Itinerário Principal -> IP\n    -  Jardim -> Jrd\n    -  Júnior -> Jr\n    -  Largo -> Lg\n    -  Limitada -> Lda\n    -  Loja -> Lj\n    -  Lote -> Lt\n    -  Loteamento -> Loteam\n    -  Lugar -> Lg\n    -  Lugar -> Lug\n    -  Maestro -> Mto\n    -  Major -> Maj\n    -  Marechal -> Mal\n    -  Marquês -> Mq\n    -  Madre -> Me\n    -  Mestre -> Me\n    -  Ministério -> Min\n    -  Monsenhor -> Mons\n    -  Municipal -> M\n    -  Nacional -> N\n    -  Nossa -> N\n    -  Nossa -> Nª\n    -  Nossa Senhora -> Ns\n    -  Nosso -> N\n    -  Número -> N\n    -  Número -> Nº\n    -  Padre -> Pe\n    -  Parque -> Pq\n    -  Particular -> Part\n    -  Pátio -> Pto\n    -  Pavilhão -> Pav\n    -  Polícia de Segurança Pública -> PSP\n    -  Polícia de Segurança Pública -> P.S.P\n    -  Polícia Judiciária -> PJ\n    -  Polícia Judiciária -> P.J\n    -  Praça -> Pc\n    -  Praça -> Pç\n    -  Praça -> Pr\n    -  Praceta -> Pct\n    -  Praceta -> Pctª\n    -  Presidente -> Presid\n    -  Primeiro -> 1º\n    -  Professor -> Prof\n    -  Professora -> Prof\n    -  Professora -> Profª\n    -  Projectada -> Proj\n    -  Projetada -> Proj\n    -  Prolongamento -> Prolng\n    -  Quadra -> Q\n    -  Quadra -> Qd\n    -  Quinta -> Qta\n    -  Regional -> R\n    -  Rés-do-chão -> R/c\n    -  Rés-do-chão -> Rc\n    -  Rotunda -> Rot\n    -  Ribeira -> Rª\n    -  Ribeira -> Rib\n    -  Ribeira -> Ribª\n    -  Rio -> R\n    -  Rua -> R\n    -  Santa -> Sta\n    -  Santa -> Stª\n    -  Santo -> St\n    -  Santo -> Sto\n    -  Santo -> Stº\n    -  São -> S\n    -  Sargento -> Sarg\n    -  Sem Número -> S/n\n    -  Sem Número -> Sn\n    -  Senhor -> S\n    -  Senhor -> Sr\n    -  Senhora -> S\n    -  Senhora -> Sª\n    -  Senhora -> Srª\n    -  Senhora -> Sr.ª\n    -  Senhora -> S.ra\n    -  Senhora -> Sra\n    -  Sobre-Loja -> Slj\n    -  Sociedade -> Soc\n    -  Sociedade Anónima -> SA\n    -  Sociedade Anónima -> S.A\n    -  Sport Clube -> SC\n    -  Sport Clube -> S.C\n    -  Sub-Cave -> Scv\n    -  Superquadra -> Sq\n    -  Tenente -> Ten\n    -  Torre -> Tr\n    -  Transversal -> Transv\n    -  Travessa -> Trav\n    -  Travessa -> Trv\n    -  Travessa -> Tv\n    -  Universidade -> Univ\n    -  Urbanização -> Urb\n    -  Vila -> Vl\n    -  Visconde -> Visc\n    -  Vivenda -> Vv\n    -  Zona -> Zn\n"
  },
  {
    "path": "settings/icu-rules/variants-ro.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Rom.C3.A2n.C4.83_-_Romanian\n- lang: ro\n  words:\n    -  Aleea -> ale\n    -  Aleea -> al\n    -  Bulevardul -> bulevard\n    -  Bulevardul -> bulev\n    -  Bulevardul -> b-dul\n    -  Bulevardul -> blvd\n    -  Bulevardul -> blv\n    -  Bulevardul -> bdul\n    -  Bulevardul -> bul\n    -  Bulevardul -> bd\n    -  Calea -> cal\n    -  Fundătura -> fnd\n    -  Fundacul -> fdc\n    -  Intrarea -> intr\n    -  Intrarea -> int\n    -  Piața -> p-ța\n    -  Piața -> pța\n    -  Strada -> stra\n    -  Strada -> str\n    -  Stradela -> str-la\n    -  Stradela -> sdla\n    -  Șoseaua -> sos\n    -  Splaiul -> sp\n    -  Splaiul -> splaiul\n    -  Splaiul -> spl\n    -  Vârful -> virful\n    -  Vârful -> virf\n    -  Vârful -> varf\n    -  Vârful -> vf\n    -  Muntele -> m-tele\n    -  Muntele -> m-te\n    -  Muntele -> mnt\n    -  Muntele -> mt\n"
  },
  {
    "path": "settings/icu-rules/variants-ru.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#.D0.A0.D1.83.D1.81.D1.81.D0.BA.D0.B8.D0.B9_-_Russian\n# Source: https://www.plantarium.ru/page/help/topic/abbreviations.html\n# Source: https://dic.academic.ru/dic.nsf/ruwiki/1871310\n- lang: ru\n  words:\n    -  Академик, Академика -> Ак\n    -  акционерное общество -> АО\n    -  аллея -> ал\n    -  архипелаг -> арх\n    -  атомная электростанция -> АЭС\n    -  аэродром -> аэрд\n    -  аэропорт -> аэрп\n    -  Башкирский, Башкирская, Башкирское, Башкирские -> Баш, Башк, Башкир\n    -  Белый, Белая, Белое. Белые -> Бел\n    -  болото -> бол\n    -  больница -> больн\n    -  Большой, Большая, Большое, Большие -> Б, Бол\n    -  брод -> бр\n    -  бульвар -> бул\n    -  бухта -> бух\n    -  бывший, бывшая, бывшее, бывшие -> бывш\n    -  Великий, Великая, Великое, Великие -> Вел\n    -  Верхний, Верхняя, Верхнее, Верхние -> В, Верх\n    -  водокачка -> вдкч\n    -  водопад -> вдп\n    -  водохранилище -> вдхр\n    -  вокзал -> вкз, вокз\n    -  Восточный, Восточная, Восточное, Восточные -> В, Вост\n    -  вулкан -> влк\n    -  гидроэлектростанция -> ГЭС\n    -  гора -> г\n    -  город -> г\n    -  дворец культуры, дом культуры -> ДК\n    -  дворец спорта -> ДС\n    -  деревня -> д, дер\n    -  детский оздоровительный лагерь -> ДОЛ\n    -  дом -> д\n    -  дом отдыха -> Д О\n    -  железная дорога -> ж д\n    -  железнодорожный, железнодорожная, железнодорожное -> ж-д\n    -  железобетонных изделий -> ЖБИ\n    -  жилой комплекс -> ЖК\n    -  завод -> з-д\n    -  закрытое административно-территориальное образование -> ЗАТО\n    -  залив -> зал\n    -  Западный, Западная, Западное, Западные -> З, Зап, Запад\n    -  заповедник -> запов\n    -  имени -> им\n    -  институт -> инст\n    -  исправительная колония -> ИК\n    -  километр -> км\n    -  Красный, Красная, Красное, Красные -> Кр, Крас\n    -  лагерь -> лаг\n    -  Левый, Левая,Левое, Левые -> Л, Лев\n    -  ледник -> ледн\n    -  лесничество -> леснич\n    -  лесной, лесная, лесное -> лес\n    -  линия электропередачи -> ЛЭП\n    -  Малый, Малая, Малое, Малые -> М, Мал\n    -  Мордовский, Мордовская, Мордовское, Мордовские -> Мордов\n    -  морской, морская, морское -> мор\n    -  Московский, Московская, Московское, Московские -> Мос, Моск\n    -  мыс -> м\n    -  набережная -> наб\n    -  Нижний, Нижняя, Нижнее, Нижние -> Ниж, Н\n    -  Новый, Новая, Новое, Новые -> Нов, Н\n    -  обгонный пункт -> обг п\n    -  область -> обл\n    -  озеро -> оз\n    -  особо охраняемая природная территория -> ООПТ\n    -  остановочный пункт -> о п\n    -  остров -> о\n    -  острова -> о-ва\n    -  парк культуры и отдыха -> ПКиО\n    -  перевал -> пер\n    -  переулок -> пер\n    -  пещера -> пещ\n    -  пионерский лагерь -> пионерлаг\n    -  платформа -> пл, платф\n    -  площадь -> пл\n    -  подсобное хозяйство -> подсоб хоз\n    -  полуостров -> п-ов\n    -  посёлок -> пос, п\n    -  посёлок городского типа -> п г т, пгт\n    -  Правый, Правая, Правое, Правые -> П, Пр, Прав\n    -  проезд -> пр\n    -  проспект -> просп\n    -  пруд -> пр\n    -  пустыня -> пуст\n    -  разъезд -> рзд\n    -  район -> р-н\n    -  резинотехнических изделий -> РТИ\n    -  река -> р\n    -  речной, речная, речное -> реч, речн\n    -  Российский, Российская, Российское, Российские -> Рос\n    -  Русский, Русская, Русское, Русские -> Рус, Русск\n    -  ручей -> руч\n    -  садовое некоммерческое товарищество -> СНТ\n    -  садовые участки -> сад уч\n    -  санаторий -> сан\n    -  сарай -> сар\n    -  Северный, Северная, Северное, Северные -> С, Сев\n    -  село -> с\n    -  Сибирский, Сибирская, Сибирское, Сибирские -> Сиб\n    -  Советский, Советская, Советское, Советские -> Сов\n    -  совхоз -> свх\n    -  Сортировочный, Сортировочная, Сортировочное, Сортировочные -> Сорт\n    -  станция -> ст\n    -  Старый, Старая, Среднее, Средние -> Ср\n    -  Татарский, Татарская, Татарское, Татарские -> Тат, Татар\n    -  теплоэлекстростанция -> ТЭС\n    -  теплоэлектроцентраль -> ТЭЦ\n    -  техникум -> техн\n    -  тоннель, туннель -> тун\n    -  тупик -> туп\n    -  улица -> ул\n    -  Уральский, Уральская, Уральское, Уральские -> Ур, Урал\n    -  урочище -> ур\n    -  хозяйство -> хоз, хоз-во\n    -  хребет -> хр\n    -  хутор -> хут\n    -  Чёрный, Чёрная, Чёрное, Чёрные -> Черн\n    -  Чувашский, Чувашская, Чувашское, Чувашские -> Чуваш\n    -  шахта -> шах\n    -  школа -> шк\n    -  шоссе -> ш\n    -  элеватор -> элев\n    -  Южный, Южная, Южное, Южные -> Ю, Юж, Южн"
  },
  {
    "path": "settings/icu-rules/variants-sk.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Slovensky_-_Slovak\n- lang: sk\n  words:\n    -  Ulica -> Ul\n    -  Námestie -> Nám\n    -  Svätého, Svätej -> Sv\n    -  Generála -> Gen\n    -  Armádneho generála -> Arm gen\n    -  Doktora, Doktorky -> Dr\n    -  Inžiniera, Inžinierky -> Ing\n    -  Majora -> Mjr\n    -  Profesora, Profesorky -> Prof\n    -  Československej -> Čsl\n    -  Plukovníka -> Plk\n    -  Podplukovníka -> Pplk\n    -  Kapitána -> Kpt\n    -  Poručíka -> Por\n    -  Podporučíka -> Ppor\n    -  Sídlisko -> Sídl\n    -  Nábrežie -> Nábr\n"
  },
  {
    "path": "settings/icu-rules/variants-sl.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Sloven.C5.A1.C4.8Dina_-_Slovenian\n- lang: sl\n  words:\n    -  Cesta -> C\n    -  Gasilski Dom -> GD\n    -  Osnovna šola -> OŠ\n    -  Prostovoljno Gasilsko Društvo -> PGD\n    -  Savinjski -> Savinj\n    -  Slovenskih -> Slov\n    -  Spodnja -> Sp\n    -  Spodnje -> Sp\n    -  Spodnji -> Sp\n    -  Srednja -> Sr\n    -  Srednje -> Sr\n    -  Srednji -> Sr\n    -  Sveta -> Sv\n    -  Svete -> Sv\n    -  Sveti -> Sv\n    -  Svetega -> Sv\n    -  Šent -> Št\n    -  Ulica -> Ul\n    -  Velika -> V\n    -  Velike -> V\n    -  Veliki -> V\n    -  Veliko -> V\n    -  Velikem -> V\n    -  Velika -> Vel\n    -  Velike -> Vel\n    -  Veliki -> Vel\n    -  Veliko -> Vel\n    -  Velikem -> Vel\n    -  Zdravstveni dom -> ZD\n    -  Zgornja -> Zg\n    -  Zgornje -> Zg\n    -  Zgornji -> Zg\n"
  },
  {
    "path": "settings/icu-rules/variants-sv.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Svenska_-_Swedish\n- lang: sv\n  words:\n    -  ~väg, ~vägen -> v\n    -  ~gatan, ~gata -> g\n    -  ~gränd, ~gränden -> gr\n    -  gamla -> G:la\n    -  södra -> s\n    -  södra -> s:a\n    -  norra -> n\n    -  norra -> n:a\n    -  östra -> ö\n    -  östra -> ö:a\n    -  västra -> v\n    -  västra -> v:a\n    -  ~stig, ~stigen -> st\n    -  sankt -> s:t\n    -  sankta -> s:ta\n    -  ~plats, ~platsen -> pl\n    -  lilla -> l\n    -  stora -> st\n"
  },
  {
    "path": "settings/icu-rules/variants-tr.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#T.C3.BCrk.C3.A7e_-_Turkish\n- lang: tr\n  words:\n    -  Sokak -> Sk\n    -  Sokak -> Sok\n    -  Sokağı -> Sk\n    -  Sokağı -> Sok\n    -  Cadde -> Cd\n    -  Caddesi -> Cd\n    -  Bulvar -> Bl\n    -  Bulvar -> Blv\n    -  Bulvarı -> Bl\n    -  Mahalle -> Mh\n    -  Mahalle -> Mah\n"
  },
  {
    "path": "settings/icu-rules/variants-uk.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#.D0.A3.D0.BA.D1.80.D0.B0.D1.97.D0.BD.D1.81.D1.8C.D0.BA.D0.B0_-_Ukrainian\n- lang: uk\n  words:\n    -  бульвар -> бул\n    -  дорога -> дор\n    -  провулок -> пров\n    -  площа -> пл\n    -  проспект -> просп\n    -  шосе -> ш\n    -  вулиця -> вул\n"
  },
  {
    "path": "settings/icu-rules/variants-vi.yaml",
    "content": "# Source: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Ti.E1.BA.BFng_Vi.E1.BB.87t_.E2.80.93_Vietnamese\n- lang: vi\n  words:\n    -  Thành phố -> TP\n    -  Thị xã -> TX\n    -  Thị trấn -> TT\n    -  Quận -> Q\n    -  Phường -> P\n    -  Phường -> Ph\n    -  Quốc lộ -> QL\n    -  Tỉnh lộ -> TL\n    -  Đại lộ -> ĐL\n    -  Đường -> Đ\n    -  Công trường -> CT\n    -  Quảng trường -> QT\n    -  Sân bay -> SB\n    -  Sân bay quốc tế -> SBQT\n    -  Phi trường -> PT\n    -  Đường sắt -> ĐS\n    -  Trung tâm -> TT\n    -  Trung tâm Thương mại -> TTTM\n    -  Khách sạn -> KS\n    -  Khách sạn -> K/S\n    -  Bưu điện -> BĐ\n    -  Đại học -> ĐH\n    -  Cao đẳng -> CĐ\n    -  Trung học Phổ thông -> THPT\n    -  Trung học Cơ sở -> THCS\n    -  Tiểu học -> TH\n    -  Khu công nghiệp -> KCN\n    -  Khu nghỉ mát -> KNM\n    -  Khu du lịch -> KDL\n    -  Công viên văn hóa -> CVVH\n    -  Công viên -> CV\n    -  Vươn quốc gia -> VQG\n    -  Viện bảo tàng -> VBT\n    -  Sân vận động -> SVĐ\n    -  Nhà thi đấu -> NTĐ\n    -  Câu lạc bộ -> CLB\n    -  Nhà thờ -> NT\n    -  Nhà hát -> NH\n    -  Rạp hát -> RH\n    -  Công ty -> Cty\n    -  Tổng công ty -> TCty\n    -  Tổng công ty -> TCT\n    -  Công ty cổ phần -> CTCP\n    -  Công ty cổ phần -> Cty CP\n    -  Căn cứ không quân -> CCKQ\n"
  },
  {
    "path": "settings/icu_tokenizer.yaml",
    "content": "query-preprocessing:\n    - step: split_japanese_phrases\n    - step: normalize\nnormalization:\n    - \":: lower ()\"\n    - \":: Hans-Hant\"\n    - !include icu-rules/unicode-digits-to-decimal.yaml\n    - \"'№' > 'no'\"\n    - \"'n°' > 'no'\"\n    - \"'nº' > 'no'\"\n    - \"ª > a\"\n    - \"º > o\"\n    - \"[[:Punctuation:][:Symbol:][\\u02bc] - [-:]]+  > '-'\"\n    - \"ß > 'ss'\" # German szet is unambiguously equal to double ss\n    - \"[^[:alnum:] [:Canonical_Combining_Class=Virama:] [:Space:] [-:]] >\"\n    - \"[:Lm:] >\"\n    - \":: [[:Number:]] Latin ()\"\n    - \":: [[:Number:]] Ascii ();\"\n    - \":: [[:Number:]] NFD ();\"\n    - \"[[:Nonspacing Mark:] [:Cf:]] >;\"\n    - \"[-:]?[:Space:]+[-:]? > ' '\"\ntransliteration:\n    - \"[-:]  > ' '\"\n    - \":: Latin ()\"\n    - !include icu-rules/extended-unicode-to-asccii.yaml\n    - \":: Ascii ()\"\n    - \":: NFD ()\"\n    - \":: lower ()\"\n    - \"[^a-z0-9[:Space:]] >\"\n    - \":: NFC ()\"\n    - \"[:Space:]+ > ' '\"\nsanitizers:\n    - step: clean-housenumbers\n      filter-kind:\n        - housenumber\n        - conscriptionnumber\n        - streetnumber\n      convert-to-name:\n        - (\\A|.*,)[^\\d,]{3,}(,.*|\\Z)\n    - step: clean-postcodes\n      convert-to-address: yes\n      default-pattern: \"[A-Z0-9- ]{3,12}\"\n    - step: clean-tiger-tags\n    - step: split-name-list\n      delimiters: ;\n    - step: strip-brace-terms\n    - step: tag-analyzer-by-language\n      filter-kind: [\".*name.*\"]\n      whitelist: [bg,ca,cs,da,de,el,en,es,et,eu,fi,fr,gl,hu,it,ja,mg,ms,nl,\"no\",pl,pt,ro,ru,sk,sl,sv,tr,uk,vi]\n      use-defaults: all\n      mode: append\n    - step: tag-japanese\ntoken-analysis:\n    - analyzer: generic\n    - id: \"@housenumber\"\n      analyzer: housenumbers\n    - id: \"@postcode\"\n      analyzer: postcodes\n    - id: bg\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-bg.yaml\n    - id: ca\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-ca.yaml\n    - id: cs\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-cs.yaml\n    - id: da\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-da.yaml\n    - id: de\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-de.yaml\n      mutations:\n          - pattern: ä\n            replacements: [\"ä\", \"ae\"]\n          - pattern: ö\n            replacements: [\"ö\", \"oe\"]\n          - pattern: ü\n            replacements: [\"ü\", \"ue\"]\n    - id: el\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-el.yaml\n    - id: en\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-en.yaml\n    - id: es\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-es.yaml\n    - id: et\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-et.yaml\n    - id: eu\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-eu.yaml\n    - id: fi\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-fi.yaml\n    - id: fr\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-fr.yaml\n    - id: gl\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-gl.yaml\n    - id: hu\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-hu.yaml\n    - id: it\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-it.yaml\n    - id: mg\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-mg.yaml\n    - id: ms\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-ms.yaml\n    - id: nl\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-nl.yaml\n    - id: \"no\"\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-no.yaml\n    - id: pl\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-pl.yaml\n    - id: pt\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-pt.yaml\n    - id: ro\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-ro.yaml\n    - id: ru\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-ru.yaml\n    - id: sk\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-sk.yaml\n    - id: sl\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-sl.yaml\n    - id: sv\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-sv.yaml\n    - id: tr\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-tr.yaml\n    - id: uk\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-uk.yaml\n    - id: vi\n      analyzer: generic\n      mode: variant-only\n      variants:\n          - !include icu-rules/variants-vi.yaml\n"
  },
  {
    "path": "settings/phrase-settings.json",
    "content": "{\n    \"Comments\": [\n        \"Black list correspond to class/type combinations to exclude\",\n        \"If a class is in the white list then all types will\",\n        \"be ignored except the ones given in the list.\",\n        \"Also use this list to exclude an entire class from special phrases.\"\n    ],\n    \"blackList\": {\n        \"boundary\": [\n            \"administrative\"\n        ],\n        \"place\": [\n            \"house\",\n            \"houses\"\n        ]\n    },\n    \"whiteList\": {\n        \"highway\": [\n            \"bus_stop\",\n            \"rest_area\",\n            \"raceway'\"\n        ],\n        \"building\": []\n    }\n}\n"
  },
  {
    "path": "src/nominatim_api/__init__.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nThe public interface of the Nominatim library.\n\nClasses and functions defined in this file are considered stable. Always\nimport from this file, not from the source files directly.\n\"\"\"\n\nfrom .errors import (UsageError as UsageError)\nfrom .config import (Configuration as Configuration)\n\nfrom .core import (NominatimAPI as NominatimAPI,\n                   NominatimAPIAsync as NominatimAPIAsync)\nfrom .connection import (SearchConnection as SearchConnection)\nfrom .status import (StatusResult as StatusResult)\nfrom .types import (PlaceID as PlaceID,\n                    OsmID as OsmID,\n                    PlaceRef as PlaceRef,\n                    Point as Point,\n                    Bbox as Bbox,\n                    GeometryFormat as GeometryFormat,\n                    DataLayer as DataLayer,\n                    QueryStatistics as QueryStatistics)\nfrom .results import (SourceTable as SourceTable,\n                      AddressLine as AddressLine,\n                      AddressLines as AddressLines,\n                      WordInfo as WordInfo,\n                      WordInfos as WordInfos,\n                      DetailedResult as DetailedResult,\n                      ReverseResult as ReverseResult,\n                      ReverseResults as ReverseResults,\n                      SearchResult as SearchResult,\n                      SearchResults as SearchResults)\nfrom .localization import (Locales as Locales)\nfrom .result_formatting import (FormatDispatcher as FormatDispatcher,\n                                load_format_dispatcher as load_format_dispatcher)\n\nfrom .version import NOMINATIM_API_VERSION as __version__\n"
  },
  {
    "path": "src/nominatim_api/config.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\n# This file is just a placeholder to make the config module available\n# during development. It will be replaced by nominatim_db/config.py on\n# installation.\n# flake8: noqa\nfrom nominatim_db.config import *\n"
  },
  {
    "path": "src/nominatim_api/connection.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nExtended SQLAlchemy connection class that also includes access to the schema.\n\"\"\"\nfrom typing import cast, Any, Mapping, Sequence, Union, Dict, Optional, Set, \\\n                   Awaitable, Callable, TypeVar\nimport asyncio\n\nimport sqlalchemy as sa\nfrom sqlalchemy.ext.asyncio import AsyncConnection\n\nfrom .typing import SaFromClause\nfrom .sql.sqlalchemy_schema import SearchTables\nfrom .sql.sqlalchemy_types import Geometry\nfrom .logging import log\nfrom .config import Configuration\n\nT = TypeVar('T')\n\n\nclass SearchConnection:\n    \"\"\" An extended SQLAlchemy connection class, that also contains\n        the table definitions. The underlying asynchronous SQLAlchemy\n        connection can be accessed with the 'connection' property.\n        The 't' property is the collection of Nominatim tables.\n    \"\"\"\n\n    def __init__(self, conn: AsyncConnection,\n                 tables: SearchTables,\n                 properties: Dict[str, Any],\n                 config: Configuration) -> None:\n        self.connection = conn\n        self.t = tables\n        self.config = config\n        self._property_cache = properties\n        self._classtables: Optional[Set[str]] = None\n        self.query_timeout: Optional[int] = None\n\n    def set_query_timeout(self, timeout: Optional[int]) -> None:\n        \"\"\" Set the timeout after which a query over this connection\n            is cancelled.\n        \"\"\"\n        self.query_timeout = timeout\n\n    async def scalar(self, sql: sa.sql.base.Executable,\n                     params: Union[Mapping[str, Any], None] = None) -> Any:\n        \"\"\" Execute a 'scalar()' query on the connection.\n        \"\"\"\n        log().sql(self.connection, sql, params)\n        return await asyncio.wait_for(self.connection.scalar(sql, params), self.query_timeout)\n\n    async def execute(self, sql: 'sa.Executable',\n                      params: Union[Mapping[str, Any], Sequence[Mapping[str, Any]], None] = None\n                      ) -> 'sa.Result[Any]':\n        \"\"\" Execute a 'execute()' query on the connection.\n        \"\"\"\n        log().sql(self.connection, sql, params)\n        return await asyncio.wait_for(self.connection.execute(sql, params), self.query_timeout)\n\n    async def get_property(self, name: str, cached: bool = True) -> str:\n        \"\"\" Get a property from Nominatim's property table.\n\n            Property values are normally cached so that they are only\n            retrieved from the database when they are queried for the\n            first time with this function. Set 'cached' to False to force\n            reading the property from the database.\n\n            Raises a ValueError if the property does not exist.\n        \"\"\"\n        lookup_name = f'DBPROP:{name}'\n\n        if cached and lookup_name in self._property_cache:\n            return cast(str, self._property_cache[lookup_name])\n\n        sql = sa.select(self.t.properties.c.value)\\\n            .where(self.t.properties.c.property == name)\n        value = await self.connection.scalar(sql)\n\n        if value is None:\n            raise ValueError(f\"Property '{name}' not found in database.\")\n\n        self._property_cache[lookup_name] = cast(str, value)\n\n        return cast(str, value)\n\n    async def get_db_property(self, name: str) -> Any:\n        \"\"\" Get a setting from the database. At the moment, only\n            'server_version', the version of the database software, can\n            be retrieved with this function.\n\n            Raises a ValueError if the property does not exist.\n        \"\"\"\n        if name != 'server_version':\n            raise ValueError(f\"DB setting '{name}' not found in database.\")\n\n        return self._property_cache['DB:server_version']\n\n    async def get_cached_value(self, group: str, name: str,\n                               factory: Callable[[], Awaitable[T]]) -> T:\n        \"\"\" Access the cache for this Nominatim instance.\n            Each cache value needs to belong to a group and have a name.\n            This function is for internal API use only.\n\n            `factory` is an async callback function that produces\n            the value if it is not already cached.\n\n            Returns the cached value or the result of factory (also caching\n            the result).\n        \"\"\"\n        full_name = f'{group}:{name}'\n\n        if full_name in self._property_cache:\n            return cast(T, self._property_cache[full_name])\n\n        value = await factory()\n        self._property_cache[full_name] = value\n\n        return value\n\n    async def get_class_table(self, cls: str, typ: str) -> Optional[SaFromClause]:\n        \"\"\" Lookup up if there is a classtype table for the given category\n            and return a SQLAlchemy table for it, if it exists.\n        \"\"\"\n        if self._classtables is None:\n            res = await self.execute(sa.text(\"\"\"SELECT tablename FROM pg_tables\n                                                WHERE tablename LIKE 'place_classtype_%'\n                                             \"\"\"))\n            self._classtables = {r[0] for r in res}\n\n        tablename = f\"place_classtype_{cls}_{typ}\"\n\n        if tablename not in self._classtables:\n            return None\n\n        if tablename in self.t.meta.tables:\n            return self.t.meta.tables[tablename]\n\n        return sa.Table(tablename, self.t.meta,\n                        sa.Column('place_id', sa.BigInteger),\n                        sa.Column('centroid', Geometry))\n"
  },
  {
    "path": "src/nominatim_api/core.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImplementation of classes for API access via libraries.\n\"\"\"\nfrom typing import Mapping, Optional, Any, AsyncIterator, Dict, Sequence, List, \\\n                   Union, Tuple, cast\nimport asyncio\nimport sys\nimport contextlib\nfrom pathlib import Path\n\nif sys.version_info >= (3, 11):\n    from asyncio import timeout_at\nelse:\n    from async_timeout import timeout_at\n\nimport sqlalchemy as sa\nimport sqlalchemy.ext.asyncio as sa_asyncio\n\nfrom .errors import UsageError\nfrom .sql.sqlalchemy_schema import SearchTables\nfrom .sql.async_core_library import PGCORE_LIB, PGCORE_ERROR\nfrom .config import Configuration\nfrom .sql import sqlite_functions, sqlalchemy_functions  # noqa\nfrom .connection import SearchConnection\nfrom .status import get_status, StatusResult\nfrom .lookup import get_places, get_detailed_place\nfrom .reverse import ReverseGeocoder\nfrom .timeout import Timeout\nfrom . import search as nsearch\nfrom . import types as ntyp\nfrom .results import DetailedResult, ReverseResult, SearchResults\n\n\nclass NominatimAPIAsync:\n    \"\"\" The main frontend to the Nominatim database implements the\n        functions for lookup, forward and reverse geocoding using\n        asynchronous functions.\n\n        This class shares most of the functions with its synchronous\n        version. There are some additional functions or parameters,\n        which are documented below.\n\n        This class should usually be used as a context manager in 'with' context.\n    \"\"\"\n    def __init__(self, project_dir: Optional[Union[str, Path]] = None,\n                 environ: Optional[Mapping[str, str]] = None,\n                 loop: Optional[asyncio.AbstractEventLoop] = None) -> None:\n        \"\"\" Initiate a new frontend object with synchronous API functions.\n\n            Parameters:\n              project_dir: Path to the\n                  [project directory](../admin/Import.md#creating-the-project-directory)\n                  of the local Nominatim installation.\n              environ: Mapping of [configuration parameters](../customize/Settings.md).\n                  When set, replaces any configuration via environment variables.\n                  Settings in this mapping also have precedence over any\n                  parameters found in the `.env` file of the project directory.\n              loop: The asyncio event loop that will be used when calling\n                  functions. Only needed, when a custom event loop is used\n                  and the Python version is 3.9 or earlier.\n        \"\"\"\n        self.config = Configuration(project_dir, environ)\n        self.query_timeout = self.config.get_int('QUERY_TIMEOUT') \\\n            if self.config.QUERY_TIMEOUT else None\n        self.request_timeout = self.config.get_int('REQUEST_TIMEOUT') \\\n            if self.config.REQUEST_TIMEOUT else None\n        self.reverse_restrict_to_country_area = self.config.get_bool('SEARCH_WITHIN_COUNTRIES')\n        self.server_version = 0\n\n        if sys.version_info >= (3, 10):\n            self._engine_lock = asyncio.Lock()\n        else:\n            self._engine_lock = asyncio.Lock(loop=loop)\n        self._engine: Optional[sa_asyncio.AsyncEngine] = None\n        self._tables: Optional[SearchTables] = None\n        self._property_cache: Dict[str, Any] = {'DB:server_version': 0}\n\n    async def setup_database(self) -> None:\n        \"\"\" Set up the SQL engine and connections.\n\n            This function will be implicitly called when the database is\n            accessed for the first time. You may also call it explicitly to\n            avoid that the first call is delayed by the setup.\n        \"\"\"\n        async with self._engine_lock:\n            if self._engine:\n                return\n\n            extra_args: Dict[str, Any] = {'future': True,\n                                          'echo': self.config.get_bool('DEBUG_SQL')}\n\n            if self.config.get_int('API_POOL_SIZE') == 0:\n                extra_args['poolclass'] = sa.pool.NullPool\n            else:\n                extra_args['poolclass'] = sa.pool.AsyncAdaptedQueuePool\n                extra_args['max_overflow'] = 0\n                extra_args['pool_size'] = self.config.get_int('API_POOL_SIZE')\n\n            is_sqlite = self.config.DATABASE_DSN.startswith('sqlite:')\n\n            if is_sqlite:\n                params = dict((p.split('=', 1)\n                              for p in self.config.DATABASE_DSN[7:].split(';')))\n                dburl = sa.engine.URL.create('sqlite+aiosqlite',\n                                             database=params.get('dbname'))\n\n                if not ('NOMINATIM_DATABASE_RW' in self.config.environ\n                        and self.config.get_bool('DATABASE_RW')) \\\n                   and not Path(params.get('dbname', '')).is_file():\n                    raise UsageError(f\"SQlite database '{params.get('dbname')}' does not exist.\")\n            else:\n                dsn = self.config.get_database_params()\n                query = {k: str(v) for k, v in dsn.items()\n                         if k not in ('user', 'password', 'dbname', 'host', 'port')}\n\n                dburl = sa.engine.URL.create(\n                           f'postgresql+{PGCORE_LIB}',\n                           database=cast(str, dsn.get('dbname')),\n                           username=cast(str, dsn.get('user')),\n                           password=cast(str, dsn.get('password')),\n                           host=cast(str, dsn.get('host')),\n                           port=int(cast(str, dsn['port'])) if 'port' in dsn else None,\n                           query=query)\n\n            engine = sa_asyncio.create_async_engine(dburl, **extra_args)\n\n            if is_sqlite:\n                server_version = 0\n\n                @sa.event.listens_for(engine.sync_engine, \"connect\")\n                def _on_sqlite_connect(dbapi_con: Any, _: Any) -> None:\n                    dbapi_con.run_async(lambda conn: conn.enable_load_extension(True))\n                    sqlite_functions.install_custom_functions(dbapi_con)\n                    cursor = dbapi_con.cursor()\n                    cursor.execute(\"SELECT load_extension('mod_spatialite')\")\n                    cursor.execute('SELECT SetDecimalPrecision(7)')\n                    dbapi_con.run_async(lambda conn: conn.enable_load_extension(False))\n            else:\n                try:\n                    async with engine.begin() as conn:\n                        result = await conn.scalar(sa.text('SHOW server_version_num'))\n                        server_version = int(result)\n                        await conn.execute(sa.text(\"SET jit_above_cost TO '-1'\"))\n                        await conn.execute(sa.text(\n                                \"SET max_parallel_workers_per_gather TO '0'\"))\n                except (PGCORE_ERROR, sa.exc.OperationalError):\n                    server_version = 0\n\n                @sa.event.listens_for(engine.sync_engine, \"connect\")\n                def _on_connect(dbapi_con: Any, _: Any) -> None:\n                    cursor = dbapi_con.cursor()\n                    cursor.execute(\"SET jit_above_cost TO '-1'\")\n                    cursor.execute(\"SET max_parallel_workers_per_gather TO '0'\")\n\n            self._property_cache['DB:server_version'] = server_version\n\n            self._tables = SearchTables(sa.MetaData())\n            self._engine = engine\n\n    async def close(self) -> None:\n        \"\"\" Close all active connections to the database. The NominatimAPIAsync\n            object remains usable after closing. If a new API functions is\n            called, new connections are created.\n        \"\"\"\n        if self._engine is not None:\n            await self._engine.dispose()\n\n    async def __aenter__(self) -> 'NominatimAPIAsync':\n        return self\n\n    async def __aexit__(self, *_: Any) -> None:\n        await self.close()\n\n    @contextlib.asynccontextmanager\n    async def begin(self, abs_timeout: Optional[float] = None) -> AsyncIterator[SearchConnection]:\n        \"\"\" Create a new connection with automatic transaction handling.\n\n            This function may be used to get low-level access to the database.\n            Refer to the documentation of SQLAlchemy for details how to use\n            the connection object.\n\n            You may optionally give an absolute timeout until when to wait\n            for a connection to become available.\n        \"\"\"\n        if self._engine is None:\n            await self.setup_database()\n\n        assert self._engine is not None\n        assert self._tables is not None\n\n        async with timeout_at(abs_timeout), self._engine.begin() as conn:\n            yield SearchConnection(conn, self._tables, self._property_cache, self.config)\n\n    async def status(self) -> StatusResult:\n        \"\"\" Return the status of the database.\n        \"\"\"\n        timeout = Timeout(self.request_timeout)\n        try:\n            async with self.begin(abs_timeout=timeout.abs) as conn:\n                conn.set_query_timeout(self.query_timeout)\n                status = await get_status(conn)\n        except (PGCORE_ERROR, sa.exc.OperationalError):\n            return StatusResult(700, 'Database connection failed')\n\n        return status\n\n    async def details(self, place: ntyp.PlaceRef, **params: Any) -> Optional[DetailedResult]:\n        \"\"\" Get detailed information about a place in the database.\n\n            Returns None if there is no entry under the given ID.\n        \"\"\"\n        timeout = Timeout(self.request_timeout)\n        details = ntyp.LookupDetails.from_kwargs(params)\n        with details.query_stats as qs:\n            async with self.begin(abs_timeout=timeout.abs) as conn:\n                qs.log_time('start_query')\n                conn.set_query_timeout(self.query_timeout)\n                if details.keywords:\n                    await nsearch.make_query_analyzer(conn)\n                return await get_detailed_place(conn, place, details)\n\n    async def lookup(self, places: Sequence[ntyp.PlaceRef], **params: Any) -> SearchResults:\n        \"\"\" Get simple information about a list of places.\n\n            Returns a list of place information for all IDs that were found.\n        \"\"\"\n        timeout = Timeout(self.request_timeout)\n        details = ntyp.LookupDetails.from_kwargs(params)\n        with details.query_stats as qs:\n            async with self.begin(abs_timeout=timeout.abs) as conn:\n                qs.log_time('start_query')\n                conn.set_query_timeout(self.query_timeout)\n                if details.keywords:\n                    await nsearch.make_query_analyzer(conn)\n                return await get_places(conn, places, details)\n\n    async def reverse(self, coord: ntyp.AnyPoint, **params: Any) -> Optional[ReverseResult]:\n        \"\"\" Find a place by its coordinates. Also known as reverse geocoding.\n\n            Returns the closest result that can be found or None if\n            no place matches the given criteria.\n        \"\"\"\n        # The following negation handles NaN correctly. Don't change.\n        if not abs(coord[0]) <= 180 or not abs(coord[1]) <= 90:\n            # There are no results to be expected outside valid coordinates.\n            return None\n\n        timeout = Timeout(self.request_timeout)\n        details = ntyp.ReverseDetails.from_kwargs(params)\n        with details.query_stats as qs:\n            async with self.begin(abs_timeout=timeout.abs) as conn:\n                qs.log_time('start_query')\n                conn.set_query_timeout(self.query_timeout)\n                if details.keywords:\n                    await nsearch.make_query_analyzer(conn)\n                geocoder = ReverseGeocoder(conn, details,\n                                           self.reverse_restrict_to_country_area)\n                return await geocoder.lookup(coord)\n\n    async def search(self, query: str, **params: Any) -> SearchResults:\n        \"\"\" Find a place by free-text search. Also known as forward geocoding.\n        \"\"\"\n        timeout = Timeout(self.request_timeout)\n        details = ntyp.SearchDetails.from_kwargs(params)\n        with details.query_stats as qs:\n            query = query.strip()\n            if not query:\n                raise UsageError('Nothing to search for.')\n\n            async with self.begin(abs_timeout=timeout.abs) as conn:\n                qs.log_time('start_query')\n                conn.set_query_timeout(self.query_timeout)\n                geocoder = nsearch.ForwardGeocoder(conn, details, timeout)\n                phrases = [nsearch.Phrase(nsearch.PHRASE_ANY, p.strip()) for p in query.split(',')]\n                return await geocoder.lookup(phrases)\n\n    async def search_address(self, amenity: Optional[str] = None,\n                             street: Optional[str] = None,\n                             city: Optional[str] = None,\n                             county: Optional[str] = None,\n                             state: Optional[str] = None,\n                             country: Optional[str] = None,\n                             postalcode: Optional[str] = None,\n                             **params: Any) -> SearchResults:\n        \"\"\" Find an address using structured search.\n        \"\"\"\n        timeout = Timeout(self.request_timeout)\n        details = ntyp.SearchDetails.from_kwargs(params)\n        with details.query_stats as qs:\n            phrases: List[nsearch.Phrase] = []\n\n            if amenity:\n                phrases.append(nsearch.Phrase(nsearch.PHRASE_AMENITY, amenity))\n            if street:\n                phrases.append(nsearch.Phrase(nsearch.PHRASE_STREET, street))\n            if city:\n                phrases.append(nsearch.Phrase(nsearch.PHRASE_CITY, city))\n            if county:\n                phrases.append(nsearch.Phrase(nsearch.PHRASE_COUNTY, county))\n            if state:\n                phrases.append(nsearch.Phrase(nsearch.PHRASE_STATE, state))\n            if postalcode:\n                phrases.append(nsearch.Phrase(nsearch.PHRASE_POSTCODE, postalcode))\n            if country:\n                phrases.append(nsearch.Phrase(nsearch.PHRASE_COUNTRY, country))\n\n            if not phrases:\n                raise UsageError('Nothing to search for.')\n\n            if amenity or street:\n                details.restrict_min_max_rank(26, 30)\n            elif city:\n                details.restrict_min_max_rank(13, 25)\n            elif county:\n                details.restrict_min_max_rank(10, 12)\n            elif state:\n                details.restrict_min_max_rank(5, 9)\n            elif postalcode:\n                details.restrict_min_max_rank(5, 11)\n            else:\n                details.restrict_min_max_rank(4, 4)\n\n            if details.layers is None:\n                details.layers = ntyp.DataLayer.ADDRESS\n                if amenity:\n                    details.layers |= ntyp.DataLayer.POI\n\n            async with self.begin(abs_timeout=timeout.abs) as conn:\n                qs.log_time('start_query')\n                conn.set_query_timeout(self.query_timeout)\n                geocoder = nsearch.ForwardGeocoder(conn, details, timeout)\n                return await geocoder.lookup(phrases)\n\n    async def search_category(self, categories: List[Tuple[str, str]],\n                              near_query: Optional[str] = None,\n                              **params: Any) -> SearchResults:\n        \"\"\" Find an object of a certain category near another place.\n            The near place may either be given as an unstructured search\n            query in itself or as coordinates.\n        \"\"\"\n        timeout = Timeout(self.request_timeout)\n        details = ntyp.SearchDetails.from_kwargs(params)\n        with details.query_stats as qs:\n            if not categories:\n                return SearchResults()\n\n            async with self.begin(abs_timeout=timeout.abs) as conn:\n                qs.log_time('start_query')\n                conn.set_query_timeout(self.query_timeout)\n                if near_query:\n                    phrases = [nsearch.Phrase(nsearch.PHRASE_ANY, p) for p in near_query.split(',')]\n                else:\n                    phrases = []\n                    if details.keywords:\n                        await nsearch.make_query_analyzer(conn)\n\n                geocoder = nsearch.ForwardGeocoder(conn, details, timeout)\n                return await geocoder.lookup_pois(categories, phrases)\n\n\nclass NominatimAPI:\n    \"\"\" This class provides a thin synchronous wrapper around the asynchronous\n        Nominatim functions. It creates its own event loop and runs each\n        synchronous function call to completion using that loop.\n\n        This class should usually be used as a context manager in 'with' context.\n    \"\"\"\n\n    def __init__(self, project_dir: Optional[Union[str, Path]] = None,\n                 environ: Optional[Mapping[str, str]] = None) -> None:\n        \"\"\" Initiate a new frontend object with synchronous API functions.\n\n            Parameters:\n              project_dir: Path to the\n                  [project directory](../admin/Import.md#creating-the-project-directory)\n                  of the local Nominatim installation.\n              environ: Mapping of [configuration parameters](../customize/Settings.md).\n                  When set, replaces any configuration via environment variables.\n                  Settings in this mapping also have precedence over any\n                  parameters found in the `.env` file of the project directory.\n        \"\"\"\n        self._loop = asyncio.new_event_loop()\n        self._async_api = NominatimAPIAsync(project_dir, environ, loop=self._loop)\n\n    def close(self) -> None:\n        \"\"\" Close all active connections to the database.\n\n            This function also closes the asynchronous worker loop making\n            the NominatimAPI object unusable.\n        \"\"\"\n        if not self._loop.is_closed():\n            self._loop.run_until_complete(self._async_api.close())\n            self._loop.close()\n\n    def __enter__(self) -> 'NominatimAPI':\n        return self\n\n    def __exit__(self, *_: Any) -> None:\n        self.close()\n\n    @property\n    def config(self) -> Configuration:\n        \"\"\" Provide read-only access to the [configuration](Configuration.md)\n            used by the API.\n        \"\"\"\n        return self._async_api.config\n\n    def status(self) -> StatusResult:\n        \"\"\" Return the status of the database as a dataclass object\n            with the fields described below.\n\n            Returns:\n              status(int): A status code as described on the status page.\n              message(str): Either 'OK' or a human-readable message of the\n                  problem encountered.\n              software_version(tuple): A tuple with the version of the\n                  Nominatim library consisting of (major, minor, patch, db-patch)\n                  version.\n              database_version(tuple): A tuple with the version of the library\n                  which was used for the import or last migration.\n                  Also consists of (major, minor, patch, db-patch).\n              data_updated(datetime): Timestamp with the age of the data.\n        \"\"\"\n        return self._loop.run_until_complete(self._async_api.status())\n\n    def details(self, place: ntyp.PlaceRef, **params: Any) -> Optional[DetailedResult]:\n        \"\"\" Get detailed information about a place in the database.\n\n            The result is a dataclass object with the fields described below\n            or `None` if the place could not be found in the database.\n\n            Parameters:\n              place: Description of the place to look up. See\n                     [Place identification](Input-Parameter-Types.md#place-identification)\n                     for the various ways to reference a place.\n\n            Other parameters:\n              geometry_output (enum): Add the full geometry of the place to the result.\n                Multiple formats may be selected. Note that geometries can become\n                quite large. (Default: none)\n              geometry_simplification (float): Simplification factor to use on\n                the geometries before returning them. The factor expresses\n                the tolerance in degrees from which the geometry may differ.\n                Topology is preserved. (Default: 0.0)\n              address_details (bool): Add detailed information about the places\n                that make up the address of the requested object. (Default: False)\n              linked_places (bool): Add detailed information about the places\n                that link to the result. (Default: False)\n              parented_places (bool): Add detailed information about all places\n                for which the requested object is a parent, i.e. all places for\n                which the object provides the address details.\n                Only POI places can have parents. (Default: False)\n              keywords (bool): Add detailed information about the search terms\n                used for this place.\n              query_stats (QueryStatistics): When given collects statistics\n                about the query execution.\n\n            Returns:\n              source_table (enum): Data source of the place. See below for possible values.\n              category (tuple): A tuple of two strings with the primary OSM tag\n                  and value.\n              centroid (Point): Point position of the place.\n              place_id (Optional[int]): Internal ID of the place. This ID may differ\n                  for the same place between different installations.\n              parent_place_id (Optional(int]): Internal ID of the parent of this\n                  place. Only meaning full for POI-like objects (places with a\n                  rank_address of 30).\n              linked_place_id (Optional[int]): Internal ID of the place this object\n                  links to. When this ID is set then there is no guarantee that\n                  the rest of the result information is complete.\n              admin_level (int): Value of the `admin_level` OSM tag. Only meaningful\n                  for administrative boundary objects.\n              indexed_date (datetime): Timestamp when the place was last updated.\n              osm_object (Optional[tuple]): OSM type and ID of the place, if available.\n              names (Optional[dict]): Dictionary of names of the place. Keys are\n                  usually the corresponding OSM tag keys.\n              address (Optional[dict]): Dictionary of address parts directly\n                  attributed to the place. Keys are usually the corresponding\n                  OSM tag keys with the `addr:` prefix removed.\n              extratags (Optional[dict]): Dictionary of additional attributes for\n                  the place. Usually OSM tag keys and values.\n              housenumber (Optional[str]): House number of the place, normalised\n                  for lookup. To get the house number in its original spelling,\n                  use `address['housenumber']`.\n              postcode (Optional[str]): Computed postcode for the place. To get\n                  directly attributed postcodes, use `address['postcode']` instead.\n              wikipedia (Optional[str]): Reference to a wikipedia site for the place.\n                  The string has the format <language code>:<wikipedia title>.\n              rank_address (int): [Address rank](../customize/Ranking.md#address-rank).\n              rank_search (int): [Search rank](../customize/Ranking.md#search-rank).\n              importance (Optional[float]): Relative importance of the place. This is a measure\n                  how likely the place will be searched for.\n              country_code (Optional[str]): Country the feature is in as\n                  ISO 3166-1 alpha-2 country code.\n              address_rows (Optional[AddressLines]): List of places that make up the\n                  computed address. `None` when `address_details` parameter was False.\n              linked_rows (Optional[AddressLines]): List of places that link to the object.\n                  `None` when `linked_places` parameter was False.\n              parented_rows (Optional[AddressLines]): List of direct children of the place.\n                  `None` when `parented_places` parameter was False.\n              name_keywords (Optional[WordInfos]): List of search words for the name of\n                   the place. `None` when `keywords` parameter is set to False.\n              address_keywords (Optional[WordInfos]): List of search word for the address of\n                   the place. `None` when `keywords` parameter is set to False.\n              geometry (dict): Dictionary containing the full geometry of the place\n                   in the formats requested in the `geometry_output` parameter.\n        \"\"\"\n        return self._loop.run_until_complete(self._async_api.details(place, **params))\n\n    def lookup(self, places: Sequence[ntyp.PlaceRef], **params: Any) -> SearchResults:\n        \"\"\" Get simple information about a list of places.\n\n            Returns a list of place information for all IDs that were found.\n            Each result is a dataclass with the fields detailed below.\n\n            Parameters:\n              places: List of descriptions of the place to look up. See\n                      [Place identification](Input-Parameter-Types.md#place-identification)\n                      for the various ways to reference a place.\n\n            Other parameters:\n              geometry_output (enum): Add the full geometry of the place to the result.\n                Multiple formats may be selected. Note that geometries can become\n                quite large. (Default: none)\n              geometry_simplification (float): Simplification factor to use on\n                the geometries before returning them. The factor expresses\n                the tolerance in degrees from which the geometry may differ.\n                Topology is preserved. (Default: 0.0)\n              address_details (bool): Add detailed information about the places\n                that make up the address of the requested object. (Default: False)\n              linked_places (bool): Add detailed information about the places\n                that link to the result. (Default: False)\n              parented_places (bool): Add detailed information about all places\n                for which the requested object is a parent, i.e. all places for\n                which the object provides the address details.\n                Only POI places can have parents. (Default: False)\n              keywords (bool): Add detailed information about the search terms\n                used for this place.\n              query_stats (QueryStatistics): When given collects statistics\n                about the query execution.\n\n            Returns:\n              source_table (enum): Data source of the place. See below for possible values.\n              category (tuple): A tuple of two strings with the primary OSM tag\n                  and value.\n              centroid (Point): Point position of the place.\n              place_id (Optional[int]): Internal ID of the place. This ID may differ\n                  for the same place between different installations.\n              osm_object (Optional[tuple]): OSM type and ID of the place, if available.\n              names (Optional[dict]): Dictionary of names of the place. Keys are\n                  usually the corresponding OSM tag keys.\n              address (Optional[dict]): Dictionary of address parts directly\n                  attributed to the place. Keys are usually the corresponding\n                  OSM tag keys with the `addr:` prefix removed.\n              extratags (Optional[dict]): Dictionary of additional attributes for\n                  the place. Usually OSM tag keys and values.\n              housenumber (Optional[str]): House number of the place, normalised\n                  for lookup. To get the house number in its original spelling,\n                  use `address['housenumber']`.\n              postcode (Optional[str]): Computed postcode for the place. To get\n                  directly attributed postcodes, use `address['postcode']` instead.\n              wikipedia (Optional[str]): Reference to a wikipedia site for the place.\n                  The string has the format <language code>:<wikipedia title>.\n              rank_address (int): [Address rank](../customize/Ranking.md#address-rank).\n              rank_search (int): [Search rank](../customize/Ranking.md#search-rank).\n              importance (Optional[float]): Relative importance of the place. This is a measure\n                  how likely the place will be searched for.\n              country_code (Optional[str]): Country the feature is in as\n                  ISO 3166-1 alpha-2 country code.\n              address_rows (Optional[AddressLines]): List of places that make up the\n                  computed address. `None` when `address_details` parameter was False.\n              linked_rows (Optional[AddressLines]): List of places that link to the object.\n                  `None` when `linked_places` parameter was False.\n              parented_rows (Optional[AddressLines]): List of direct children of the place.\n                  `None` when `parented_places` parameter was False.\n              name_keywords (Optional[WordInfos]): List of search words for the name of\n                   the place. `None` when `keywords` parameter is set to False.\n              address_keywords (Optional[WordInfos]): List of search word for the address of\n                   the place. `None` when `keywords` parameter is set to False.\n              bbox (Bbox): Bounding box of the full geometry of the place.\n                   If the place is a single point, then the size of the bounding\n                   box is guessed according to the type of place.\n              geometry (dict): Dictionary containing the full geometry of the place\n                   in the formats requested in the `geometry_output` parameter.\n        \"\"\"\n        return self._loop.run_until_complete(self._async_api.lookup(places, **params))\n\n    def reverse(self, coord: ntyp.AnyPoint, **params: Any) -> Optional[ReverseResult]:\n        \"\"\" Find a place by its coordinates. Also known as reverse geocoding.\n\n            Returns the closest result that can be found or `None` if\n            no place matches the given criteria. The result is a dataclass\n            with the fields as detailed below.\n\n            Parameters:\n              coord: Coordinate to lookup the place for as a Point\n                     or a tuple (x, y). Must be in WGS84 projection.\n\n            Other parameters:\n              max_rank (int): Highest address rank to return. Can be used to\n                restrict search to streets or settlements.\n              layers (enum): Defines the kind of data to take into account.\n                See description of layers below. (Default: addresses and POIs)\n              geometry_output (enum): Add the full geometry of the place to the result.\n                Multiple formats may be selected. Note that geometries can become\n                quite large. (Default: none)\n              geometry_simplification (float): Simplification factor to use on\n                the geometries before returning them. The factor expresses\n                the tolerance in degrees from which the geometry may differ.\n                Topology is preserved. (Default: 0.0)\n              address_details (bool): Add detailed information about the places\n                that make up the address of the requested object. (Default: False)\n              linked_places (bool): Add detailed information about the places\n                that link to the result. (Default: False)\n              parented_places (bool): Add detailed information about all places\n                for which the requested object is a parent, i.e. all places for\n                which the object provides the address details.\n                Only POI places can have parents. (Default: False)\n              keywords (bool): Add detailed information about the search terms\n                used for this place.\n              query_stats (QueryStatistics): When given collects statistics\n                about the query execution.\n\n            Returns:\n              source_table (enum): Data source of the place. See below for possible values.\n              category (tuple): A tuple of two strings with the primary OSM tag\n                  and value.\n              centroid (Point): Point position of the place.\n              place_id (Optional[int]): Internal ID of the place. This ID may differ\n                  for the same place between different installations.\n              osm_object (Optional[tuple]): OSM type and ID of the place, if available.\n              names (Optional[dict]): Dictionary of names of the place. Keys are\n                  usually the corresponding OSM tag keys.\n              address (Optional[dict]): Dictionary of address parts directly\n                  attributed to the place. Keys are usually the corresponding\n                  OSM tag keys with the `addr:` prefix removed.\n              extratags (Optional[dict]): Dictionary of additional attributes for\n                  the place. Usually OSM tag keys and values.\n              housenumber (Optional[str]): House number of the place, normalised\n                  for lookup. To get the house number in its original spelling,\n                  use `address['housenumber']`.\n              postcode (Optional[str]): Computed postcode for the place. To get\n                  directly attributed postcodes, use `address['postcode']` instead.\n              wikipedia (Optional[str]): Reference to a wikipedia site for the place.\n                  The string has the format <language code>:<wikipedia title>.\n              rank_address (int): [Address rank](../customize/Ranking.md#address-rank).\n              rank_search (int): [Search rank](../customize/Ranking.md#search-rank).\n              importance (Optional[float]): Relative importance of the place. This is a measure\n                  how likely the place will be searched for.\n              country_code (Optional[str]): Country the feature is in as\n                  ISO 3166-1 alpha-2 country code.\n              address_rows (Optional[AddressLines]): List of places that make up the\n                  computed address. `None` when `address_details` parameter was False.\n              linked_rows (Optional[AddressLines]): List of places that link to the object.\n                  `None` when `linked_places` parameter was False.\n              parented_rows (Optional[AddressLines]): List of direct children of the place.\n                  `None` when `parented_places` parameter was False.\n              name_keywords (Optional[WordInfos]): List of search words for the name of\n                   the place. `None` when `keywords` parameter is set to False.\n              address_keywords (Optional[WordInfos]): List of search word for the address of\n                   the place. `None` when `keywords` parameter is set to False.\n              bbox (Bbox): Bounding box of the full geometry of the place.\n                   If the place is a single point, then the size of the bounding\n                   box is guessed according to the type of place.\n              geometry (dict): Dictionary containing the full geometry of the place\n                   in the formats requested in the `geometry_output` parameter.\n              distance (Optional[float]): Distance in degree from the input point.\n        \"\"\"\n        return self._loop.run_until_complete(self._async_api.reverse(coord, **params))\n\n    def search(self, query: str, **params: Any) -> SearchResults:\n        \"\"\" Find a place by free-text search. Also known as forward geocoding.\n\n            Parameters:\n              query: Free-form text query searching for a place.\n\n            Other parameters:\n              max_results (int): Maximum number of results to return. The\n                actual number of results may be less. (Default: 10)\n              min_rank (int): Lowest permissible rank for the result.\n                For addressable places this is the minimum\n                [address rank](../customize/Ranking.md#address-rank). For all\n                other places the [search rank](../customize/Ranking.md#search-rank)\n                is used.\n              max_rank (int): Highest permissible rank for the result. See min_rank above.\n              layers (enum): Defines the kind of data to take into account.\n                See [layers section](Input-Parameter-Types.md#layers) for details.\n                (Default: addresses and POIs)\n              countries (list[str]): Restrict search to countries with the given\n                ISO 3166-1 alpha-2 country code. An empty list (the default)\n                disables this filter.\n              excluded (list[int | str]): A list of internal Nominatim IDs or OSM IDs to exclude\n                from the search.\n              viewbox (Optional[Bbox]): Bounding box of an area to focus search on.\n              bounded_viewbox (bool): Consider the bounding box given in `viewbox`\n                as a filter and return only results within the bounding box.\n              near (Optional[Point]): Focus search around the given point and\n                return results ordered by distance to the given point.\n              near_radius (Optional[float]): Restrict results to results within\n                the given distance in degrees of `near` point. Ignored, when\n                `near` is not set.\n              categories (list[tuple]): Restrict search to places of the given\n                categories. The category is the main OSM tag assigned to each\n                place. An empty list (the default) disables this filter.\n              geometry_output (enum): Add the full geometry of the place to the result.\n                Multiple formats may be selected. Note that geometries can become\n                quite large. (Default: none)\n              geometry_simplification (float): Simplification factor to use on\n                the geometries before returning them. The factor expresses\n                the tolerance in degrees from which the geometry may differ.\n                Topology is preserved. (Default: 0.0)\n              address_details (bool): Add detailed information about the places\n                that make up the address of the requested object. (Default: False)\n              linked_places (bool): Add detailed information about the places\n                that link to the result. (Default: False)\n              parented_places (bool): Add detailed information about all places\n                for which the requested object is a parent, i.e. all places for\n                which the object provides the address details.\n                Only POI places can have parents. (Default: False)\n              keywords (bool): Add detailed information about the search terms\n                used for this place.\n              query_stats (QueryStatistics): When given collects statistics\n                about the query execution.\n\n            Returns:\n              source_table (enum): Data source of the place. See below for possible values.\n              category (tuple): A tuple of two strings with the primary OSM tag\n                  and value.\n              centroid (Point): Point position of the place.\n              place_id (Optional[int]): Internal ID of the place. This ID may differ\n                  for the same place between different installations.\n              osm_object (Optional[tuple]): OSM type and ID of the place, if available.\n              names (Optional[dict]): Dictionary of names of the place. Keys are\n                  usually the corresponding OSM tag keys.\n              address (Optional[dict]): Dictionary of address parts directly\n                  attributed to the place. Keys are usually the corresponding\n                  OSM tag keys with the `addr:` prefix removed.\n              extratags (Optional[dict]): Dictionary of additional attributes for\n                  the place. Usually OSM tag keys and values.\n              housenumber (Optional[str]): House number of the place, normalised\n                  for lookup. To get the house number in its original spelling,\n                  use `address['housenumber']`.\n              postcode (Optional[str]): Computed postcode for the place. To get\n                  directly attributed postcodes, use `address['postcode']` instead.\n              wikipedia (Optional[str]): Reference to a wikipedia site for the place.\n                  The string has the format <language code>:<wikipedia title>.\n              rank_address (int): [Address rank](../customize/Ranking.md#address-rank).\n              rank_search (int): [Search rank](../customize/Ranking.md#search-rank).\n              importance (Optional[float]): Relative importance of the place. This is a measure\n                  how likely the place will be searched for.\n              country_code (Optional[str]): Country the feature is in as\n                  ISO 3166-1 alpha-2 country code.\n              address_rows (Optional[AddressLines]): List of places that make up the\n                  computed address. `None` when `address_details` parameter was False.\n              linked_rows (Optional[AddressLines]): List of places that link to the object.\n                  `None` when `linked_places` parameter was False.\n              parented_rows (Optional[AddressLines]): List of direct children of the place.\n                  `None` when `parented_places` parameter was False.\n              name_keywords (Optional[WordInfos]): List of search words for the name of\n                   the place. `None` when `keywords` parameter is set to False.\n              address_keywords (Optional[WordInfos]): List of search word for the address of\n                   the place. `None` when `keywords` parameter is set to False.\n              bbox (Bbox): Bounding box of the full geometry of the place.\n                   If the place is a single point, then the size of the bounding\n                   box is guessed according to the type of place.\n              geometry (dict): Dictionary containing the full geometry of the place\n                   in the formats requested in the `geometry_output` parameter.\n        \"\"\"\n        return self._loop.run_until_complete(\n                   self._async_api.search(query, **params))\n\n    def search_address(self, amenity: Optional[str] = None,\n                       street: Optional[str] = None,\n                       city: Optional[str] = None,\n                       county: Optional[str] = None,\n                       state: Optional[str] = None,\n                       country: Optional[str] = None,\n                       postalcode: Optional[str] = None,\n                       **params: Any) -> SearchResults:\n        \"\"\" Find an address using structured search.\n\n            Parameters:\n              amenity: Name of a POI.\n              street: Street and optionally housenumber of the address. If the address\n                does not have a street, then the place the housenumber references to.\n              city: Postal city of the address.\n              county: County equivalent of the address. Does not exist in all\n                jurisdictions.\n              state: State or province of the address.\n              country: Country with its full name or its ISO 3166-1 alpha-2 country code.\n                Do not use together with the country_code filter.\n              postalcode: Post code or ZIP for the place.\n\n            Other parameters:\n              max_results (int): Maximum number of results to return. The\n                actual number of results may be less. (Default: 10)\n              min_rank (int): Lowest permissible rank for the result.\n                For addressable places this is the minimum\n                [address rank](../customize/Ranking.md#address-rank). For all\n                other places the [search rank](../customize/Ranking.md#search-rank)\n                is used.\n              max_rank (int): Highest permissible rank for the result. See min_rank above.\n              layers (enum): Defines the kind of data to take into account.\n                See [layers section](Input-Parameter-Types.md#layers) for details.\n                (Default: addresses and POIs)\n              countries (list[str]): Restrict search to countries with the given\n                ISO 3166-1 alpha-2 country code. An empty list (the default)\n                disables this filter. Do not use, when the country parameter\n                is used.\n              excluded (list[int | str]): A list of internal Nominatim IDs or OSM IDs to exclude\n                from the search.\n              viewbox (Optional[Bbox]): Bounding box of an area to focus search on.\n              bounded_viewbox (bool): Consider the bounding box given in `viewbox`\n                as a filter and return only results within the bounding box.\n              near (Optional[Point]): Focus search around the given point and\n                return results ordered by distance to the given point.\n              near_radius (Optional[float]): Restrict results to results within\n                the given distance in degrees of `near` point. Ignored, when\n                `near` is not set.\n              categories (list[tuple]): Restrict search to places of the given\n                categories. The category is the main OSM tag assigned to each\n                place. An empty list (the default) disables this filter.\n              geometry_output (enum): Add the full geometry of the place to the result.\n                Multiple formats may be selected. Note that geometries can become\n                quite large. (Default: none)\n              geometry_simplification (float): Simplification factor to use on\n                the geometries before returning them. The factor expresses\n                the tolerance in degrees from which the geometry may differ.\n                Topology is preserved. (Default: 0.0)\n              address_details (bool): Add detailed information about the places\n                that make up the address of the requested object. (Default: False)\n              linked_places (bool): Add detailed information about the places\n                that link to the result. (Default: False)\n              parented_places (bool): Add detailed information about all places\n                for which the requested object is a parent, i.e. all places for\n                which the object provides the address details.\n                Only POI places can have parents. (Default: False)\n              keywords (bool): Add detailed information about the search terms\n                used for this place.\n              query_stats (QueryStatistics): When given collects statistics\n                about the query execution.\n\n            Returns:\n              source_table (enum): Data source of the place. See below for possible values.\n              category (tuple): A tuple of two strings with the primary OSM tag\n                  and value.\n              centroid (Point): Point position of the place.\n              place_id (Optional[int]): Internal ID of the place. This ID may differ\n                  for the same place between different installations.\n              osm_object (Optional[tuple]): OSM type and ID of the place, if available.\n              names (Optional[dict]): Dictionary of names of the place. Keys are\n                  usually the corresponding OSM tag keys.\n              address (Optional[dict]): Dictionary of address parts directly\n                  attributed to the place. Keys are usually the corresponding\n                  OSM tag keys with the `addr:` prefix removed.\n              extratags (Optional[dict]): Dictionary of additional attributes for\n                  the place. Usually OSM tag keys and values.\n              housenumber (Optional[str]): House number of the place, normalised\n                  for lookup. To get the house number in its original spelling,\n                  use `address['housenumber']`.\n              postcode (Optional[str]): Computed postcode for the place. To get\n                  directly attributed postcodes, use `address['postcode']` instead.\n              wikipedia (Optional[str]): Reference to a wikipedia site for the place.\n                  The string has the format <language code>:<wikipedia title>.\n              rank_address (int): [Address rank](../customize/Ranking.md#address-rank).\n              rank_search (int): [Search rank](../customize/Ranking.md#search-rank).\n              importance (Optional[float]): Relative importance of the place. This is a measure\n                  how likely the place will be searched for.\n              country_code (Optional[str]): Country the feature is in as\n                  ISO 3166-1 alpha-2 country code.\n              address_rows (Optional[AddressLines]): List of places that make up the\n                  computed address. `None` when `address_details` parameter was False.\n              linked_rows (Optional[AddressLines]): List of places that link to the object.\n                  `None` when `linked_places` parameter was False.\n              parented_rows (Optional[AddressLines]): List of direct children of the place.\n                  `None` when `parented_places` parameter was False.\n              name_keywords (Optional[WordInfos]): List of search words for the name of\n                   the place. `None` when `keywords` parameter is set to False.\n              address_keywords (Optional[WordInfos]): List of search word for the address of\n                   the place. `None` when `keywords` parameter is set to False.\n              bbox (Bbox): Bounding box of the full geometry of the place.\n                   If the place is a single point, then the size of the bounding\n                   box is guessed according to the type of place.\n              geometry (dict): Dictionary containing the full geometry of the place\n                   in the formats requested in the `geometry_output` parameter.\n        \"\"\"\n        return self._loop.run_until_complete(\n                   self._async_api.search_address(amenity, street, city, county,\n                                                  state, country, postalcode, **params))\n\n    def search_category(self, categories: List[Tuple[str, str]],\n                        near_query: Optional[str] = None,\n                        **params: Any) -> SearchResults:\n        \"\"\" Find an object of a certain category near another place.\n\n            The near place may either be given as an unstructured search\n            query in itself or as a geographic area through the\n            viewbox or near parameters.\n\n            Parameters:\n              categories: Restrict search to places of the given\n                categories. The category is the main OSM tag assigned to each\n                place.\n              near_query: Optional free-text query to define the are to\n                restrict search to.\n\n            Other parameters:\n              max_results (int): Maximum number of results to return. The\n                actual number of results may be less. (Default: 10)\n              min_rank (int): Lowest permissible rank for the result.\n                For addressable places this is the minimum\n                [address rank](../customize/Ranking.md#address-rank). For all\n                other places the [search rank](../customize/Ranking.md#search-rank)\n                is used.\n              max_rank (int): Highest permissible rank for the result. See min_rank above.\n              layers (enum): Defines the kind of data to take into account.\n                See [layers section](Input-Parameter-Types.md#layers) for details.\n                (Default: addresses and POIs)\n              countries (list[str]): Restrict search to countries with the given\n                ISO 3166-1 alpha-2 country code. An empty list (the default)\n                disables this filter.\n              excluded (list[int | str]): A list of internal Nominatim IDs or OSM IDs to exclude\n                from the search.\n              viewbox (Optional[Bbox]): Bounding box of an area to focus search on.\n              bounded_viewbox (bool): Consider the bounding box given in `viewbox`\n                as a filter and return only results within the bounding box.\n              near (Optional[Point]): Focus search around the given point and\n                return results ordered by distance to the given point.\n              near_radius (Optional[float]): Restrict results to results within\n                the given distance in degrees of `near` point. Ignored, when\n                `near` is not set.\n              geometry_output (enum): Add the full geometry of the place to the result.\n                Multiple formats may be selected. Note that geometries can become\n                quite large. (Default: none)\n              geometry_simplification (float): Simplification factor to use on\n                the geometries before returning them. The factor expresses\n                the tolerance in degrees from which the geometry may differ.\n                Topology is preserved. (Default: 0.0)\n              address_details (bool): Add detailed information about the places\n                that make up the address of the requested object. (Default: False)\n              linked_places (bool): Add detailed information about the places\n                that link to the result. (Default: False)\n              parented_places (bool): Add detailed information about all places\n                for which the requested object is a parent, i.e. all places for\n                which the object provides the address details.\n                Only POI places can have parents. (Default: False)\n              keywords (bool): Add detailed information about the search terms\n                used for this place.\n              query_stats (QueryStatistics): When given collects statistics\n                about the query execution.\n\n            Returns:\n              source_table (enum): Data source of the place. See below for possible values.\n              category (tuple): A tuple of two strings with the primary OSM tag\n                  and value.\n              centroid (Point): Point position of the place.\n              place_id (Optional[int]): Internal ID of the place. This ID may differ\n                  for the same place between different installations.\n              osm_object (Optional[tuple]): OSM type and ID of the place, if available.\n              names (Optional[dict]): Dictionary of names of the place. Keys are\n                  usually the corresponding OSM tag keys.\n              address (Optional[dict]): Dictionary of address parts directly\n                  attributed to the place. Keys are usually the corresponding\n                  OSM tag keys with the `addr:` prefix removed.\n              extratags (Optional[dict]): Dictionary of additional attributes for\n                  the place. Usually OSM tag keys and values.\n              housenumber (Optional[str]): House number of the place, normalised\n                  for lookup. To get the house number in its original spelling,\n                  use `address['housenumber']`.\n              postcode (Optional[str]): Computed postcode for the place. To get\n                  directly attributed postcodes, use `address['postcode']` instead.\n              wikipedia (Optional[str]): Reference to a wikipedia site for the place.\n                  The string has the format <language code>:<wikipedia title>.\n              rank_address (int): [Address rank](../customize/Ranking.md#address-rank).\n              rank_search (int): [Search rank](../customize/Ranking.md#search-rank).\n              importance (Optional[float]): Relative importance of the place. This is a measure\n                  how likely the place will be searched for.\n              country_code (Optional[str]): Country the feature is in as\n                  ISO 3166-1 alpha-2 country code.\n              address_rows (Optional[AddressLines]): List of places that make up the\n                  computed address. `None` when `address_details` parameter was False.\n              linked_rows (Optional[AddressLines]): List of places that link to the object.\n                  `None` when `linked_places` parameter was False.\n              parented_rows (Optional[AddressLines]): List of direct children of the place.\n                  `None` when `parented_places` parameter was False.\n              name_keywords (Optional[WordInfos]): List of search words for the name of\n                   the place. `None` when `keywords` parameter is set to False.\n              address_keywords (Optional[WordInfos]): List of search word for the address of\n                   the place. `None` when `keywords` parameter is set to False.\n              bbox (Bbox): Bounding box of the full geometry of the place.\n                   If the place is a single point, then the size of the bounding\n                   box is guessed according to the type of place.\n              geometry (dict): Dictionary containing the full geometry of the place\n                   in the formats requested in the `geometry_output` parameter.\n        \"\"\"\n        return self._loop.run_until_complete(\n                   self._async_api.search_category(categories, near_query, **params))\n"
  },
  {
    "path": "src/nominatim_api/errors.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nCustom exception and error classes for Nominatim.\n\"\"\"\n\n\nclass UsageError(Exception):\n    \"\"\" An error raised because of bad user input. This error will usually\n        not cause a stack trace to be printed unless debugging is enabled.\n    \"\"\"\n"
  },
  {
    "path": "src/nominatim_api/localization.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nHelper functions for localizing names of results.\n\"\"\"\nfrom typing import Mapping, List, Optional\nfrom .results import AddressLines, BaseResultT\n\nimport re\n\n\nclass Locales:\n    \"\"\" Helper class for localization of names.\n\n        It takes a list of language prefixes in their order of preferred\n        usage and comma separated name keys (Configuration.OUTPUT_NAMES).\n    \"\"\"\n\n    def __init__(self, langs: Optional[List[str]] = None,\n                 names: str = 'name:XX,name') -> None:\n        self.languages = langs or []\n        self.name_tags: List[str] = []\n\n        parts = names.split(',') if names else []\n\n        for part in parts:\n            part = part.strip()\n            if part.endswith(\":XX\"):\n                self._add_lang_tags(part[:-3])\n            else:\n                self._add_tags(part)\n\n    def __bool__(self) -> bool:\n        return len(self.languages) > 0\n\n    def _add_tags(self, *tags: str) -> None:\n        for tag in tags:\n            self.name_tags.append(tag)\n            self.name_tags.append(f\"_place_{tag}\")\n\n    def _add_lang_tags(self, *tags: str) -> None:\n        for tag in tags:\n            for lang in self.languages:\n                self.name_tags.append(f\"{tag}:{lang}\")\n                self.name_tags.append(f\"_place_{tag}:{lang}\")\n\n    def display_name(self, names: Optional[Mapping[str, str]]) -> str:\n        \"\"\" Return the best matching name from a dictionary of names\n            containing different name variants.\n\n            If 'names' is null or empty, an empty string is returned. If no\n            appropriate localization is found, the first name is returned.\n        \"\"\"\n        if not names:\n            return ''\n\n        if len(names) > 1:\n            for tag in self.name_tags:\n                if tag in names:\n                    return names[tag]\n\n        # Nothing? Return any of the other names as a default.\n        return next(iter(names.values()))\n\n    @staticmethod\n    def from_accept_languages(langstr: str, names: str = 'name:XX,name') -> 'Locales':\n        \"\"\" Create a localization object from a language list in the\n            format of HTTP accept-languages header.\n\n            The functions tries to be forgiving of format errors by first splitting\n            the string into comma-separated parts and then parsing each\n            description separately. Badly formatted parts are then ignored.\n        \"\"\"\n        # split string into languages\n        candidates = []\n        for desc in langstr.split(','):\n            m = re.fullmatch(r'\\s*([a-z_-]+)(?:;\\s*q\\s*=\\s*([01](?:\\.\\d+)?))?\\s*',\n                             desc, flags=re.I)\n            if m:\n                candidates.append((m[1], float(m[2] or 1.0)))\n\n        # sort the results by the weight of each language (preserving order).\n        candidates.sort(reverse=True, key=lambda e: e[1])\n\n        # If a language has a region variant, also add the language without\n        # variant but only if it isn't already in the list to not mess up the weight.\n        languages = []\n        for lid, _ in candidates:\n            languages.append(lid)\n            parts = lid.split('-', 1)\n            if len(parts) > 1 and all(c[0] != parts[0] for c in candidates):\n                languages.append(parts[0])\n\n        return Locales(languages, names)\n\n    def localize(self, lines: AddressLines) -> None:\n        \"\"\" Sets the local name of address parts according to the chosen\n            locale.\n\n            Only address parts that are marked as isaddress are localized.\n\n            AddressLines should be modified in place.\n        \"\"\"\n        for line in lines:\n            if line.isaddress and line.names:\n                line.local_name = self.display_name(line.names)\n\n    def localize_results(self, results: List[BaseResultT]) -> None:\n        \"\"\" Set the local name of results according to the chosen\n            locale.\n        \"\"\"\n        for result in results:\n            result.locale_name = self.display_name(result.names)\n            if result.address_rows:\n                self.localize(result.address_rows)\n"
  },
  {
    "path": "src/nominatim_api/logging.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nFunctions for specialised logging with HTML output.\n\"\"\"\nfrom typing import Any, Iterator, Optional, List, Tuple, cast, Union, Mapping, Sequence\nfrom contextvars import ContextVar\nimport datetime as dt\nimport textwrap\nimport io\nimport re\nimport html\n\nimport sqlalchemy as sa\nfrom sqlalchemy.ext.asyncio import AsyncConnection\n\ntry:\n    from pygments import highlight\n    from pygments.lexers import PythonLexer, PostgresLexer\n    from pygments.formatters import HtmlFormatter\n    CODE_HIGHLIGHT = True\nexcept ModuleNotFoundError:\n    CODE_HIGHLIGHT = False\n\n\ndef _debug_name(res: Any) -> str:\n    if res.names:\n        return cast(str, res.names.get('name', next(iter(res.names.values()))))\n\n    return f\"Hnr {res.housenumber}\" if res.housenumber is not None else '[NONE]'\n\n\nclass BaseLogger:\n    \"\"\" Interface for logging function.\n\n        The base implementation does nothing. Overwrite the functions\n        in derived classes which implement logging functionality.\n    \"\"\"\n    def get_buffer(self) -> str:\n        \"\"\" Return the current content of the log buffer.\n        \"\"\"\n        return ''\n\n    def function(self, func: str, **kwargs: Any) -> None:\n        \"\"\" Start a new debug chapter for the given function and its parameters.\n        \"\"\"\n\n    def section(self, heading: str) -> None:\n        \"\"\" Start a new section with the given title.\n        \"\"\"\n\n    def comment(self, text: str) -> None:\n        \"\"\" Add a simple comment to the debug output.\n        \"\"\"\n\n    def var_dump(self, heading: str, var: Any) -> None:\n        \"\"\" Print the content of the variable to the debug output prefixed by\n            the given heading.\n        \"\"\"\n\n    def table_dump(self, heading: str, rows: Iterator[Optional[List[Any]]]) -> None:\n        \"\"\" Print the table generated by the generator function.\n        \"\"\"\n\n    def result_dump(self, heading: str, results: Iterator[Tuple[Any, Any]]) -> None:\n        \"\"\" Print a list of search results generated by the generator function.\n        \"\"\"\n\n    def sql(self, conn: AsyncConnection, statement: 'sa.Executable',\n            params: Union[Mapping[str, Any], Sequence[Mapping[str, Any]], None]) -> None:\n        \"\"\" Print the SQL for the given statement.\n        \"\"\"\n\n    def format_sql(self, conn: AsyncConnection, statement: 'sa.Executable',\n                   extra_params: Union[Mapping[str, Any], Sequence[Mapping[str, Any]], None]\n                   ) -> str:\n        \"\"\" Return the compiled version of the statement.\n        \"\"\"\n        compiled = cast('sa.ClauseElement', statement).compile(conn.sync_engine)\n\n        params = dict(compiled.params)\n        if isinstance(extra_params, Mapping):\n            for k, v in extra_params.items():\n                if hasattr(v, 'to_wkt'):\n                    params[k] = v.to_wkt()\n                elif isinstance(v, (int, float)):\n                    params[k] = v\n                else:\n                    params[k] = str(v)\n        elif isinstance(extra_params, Sequence) and extra_params:\n            for k in extra_params[0]:\n                params[k] = f':{k}'\n\n        sqlstr = str(compiled)\n\n        if conn.dialect.name == 'postgresql':\n            if sa.__version__.startswith('1'):\n                try:\n                    sqlstr = re.sub(r'__\\[POSTCOMPILE_[^]]*\\]', '%s', sqlstr)\n                    return sqlstr % tuple((repr(params.get(name, None))\n                                          for name in compiled.positiontup))  # type: ignore\n                except TypeError:\n                    return sqlstr\n\n            sqlstr = re.sub(r'__\\[POSTCOMPILE_([^]]*)\\]', r'%(\\1)s', sqlstr)\n            return sqlstr % params\n\n        assert conn.dialect.name == 'sqlite'\n\n        # params in positional order\n        pparams = (repr(params.get(name, None)) for name in compiled.positiontup)  # type: ignore\n\n        sqlstr = re.sub(r'__\\[POSTCOMPILE_([^]]*)\\]', '?', sqlstr)\n        sqlstr = re.sub(r\"\\?\", lambda m: next(pparams), sqlstr)\n\n        return sqlstr\n\n\nclass HTMLLogger(BaseLogger):\n    \"\"\" Logger that formats messages in HTML.\n    \"\"\"\n    def __init__(self) -> None:\n        self.buffer = io.StringIO()\n\n    def _timestamp(self) -> None:\n        self._write(f'<p class=\"timestamp\">[{dt.datetime.now()}]</p>')\n\n    def get_buffer(self) -> str:\n        return HTML_HEADER + self.buffer.getvalue() + HTML_FOOTER\n\n    def function(self, func: str, **kwargs: Any) -> None:\n        self._timestamp()\n        self._write(f\"<h1>Debug output for {func}()</h1>\\n<p>Parameters:<dl>\")\n        for name, value in kwargs.items():\n            self._write(f'<dt>{name}</dt><dd>{self._python_var(value)}</dd>')\n        self._write('</dl></p>')\n\n    def section(self, heading: str) -> None:\n        self._timestamp()\n        self._write(f\"<h2>{heading}</h2>\")\n\n    def comment(self, text: str) -> None:\n        self._timestamp()\n        self._write(f\"<p>{text}</p>\")\n\n    def var_dump(self, heading: str, var: Any) -> None:\n        self._timestamp()\n        if callable(var):\n            var = var()\n\n        self._write(f'<h5>{heading}</h5>{self._python_var(var)}')\n\n    def table_dump(self, heading: str, rows: Iterator[Optional[List[Any]]]) -> None:\n        self._timestamp()\n        head = next(rows)\n        assert head\n        self._write(f'<table><thead><tr><th colspan=\"{len(head)}\">{heading}</th></tr><tr>')\n        for cell in head:\n            self._write(f'<th>{cell}</th>')\n        self._write('</tr></thead><tbody>')\n        for row in rows:\n            if row is not None:\n                self._write('<tr>')\n                for cell in row:\n                    self._write(f'<td>{cell}</td>')\n                self._write('</tr>')\n        self._write('</tbody></table>')\n\n    def result_dump(self, heading: str, results: Iterator[Tuple[Any, Any]]) -> None:\n        \"\"\" Print a list of search results generated by the generator function.\n        \"\"\"\n        self._timestamp()\n\n        def format_osm(osm_object: Optional[Tuple[str, int]]) -> str:\n            if not osm_object:\n                return '-'\n\n            t, i = osm_object\n            if t == 'N':\n                fullt = 'node'\n            elif t == 'W':\n                fullt = 'way'\n            elif t == 'R':\n                fullt = 'relation'\n            else:\n                return f'{t}{i}'\n\n            return f'<a href=\"https://www.openstreetmap.org/{fullt}/{i}\">{t}{i}</a>'\n\n        self._write(f'<h5>{heading}</h5><p><dl>')\n        total = 0\n        for rank, res in results:\n            self._write(f'<dt>[{rank:.3f}]</dt>  <dd>{res.source_table.name}(')\n            self._write(f\"{_debug_name(res)}, type=({','.join(res.category)}), \")\n            self._write(f\"rank={res.rank_address}, \")\n            self._write(f\"osm={format_osm(res.osm_object)}, \")\n            self._write(f'cc={res.country_code}, ')\n            self._write(f'importance={res.importance or float(\"nan\"):.5f})</dd>')\n            total += 1\n        self._write(f'</dl><b>TOTAL:</b> {total}</p>')\n\n    def sql(self, conn: AsyncConnection, statement: 'sa.Executable',\n            params: Union[Mapping[str, Any], Sequence[Mapping[str, Any]], None]) -> None:\n        self._timestamp()\n        sqlstr = self.format_sql(conn, statement, params)\n        if CODE_HIGHLIGHT:\n            sqlstr = highlight(sqlstr, PostgresLexer(),\n                               HtmlFormatter(nowrap=True, lineseparator='<br />'))\n            self._write(f'<div class=\"highlight\"><code class=\"lang-sql\">{sqlstr}</code></div>')\n        else:\n            self._write(f'<code class=\"lang-sql\">{html.escape(sqlstr)}</code>')\n\n    def _python_var(self, var: Any) -> str:\n        if CODE_HIGHLIGHT:\n            fmt = highlight(str(var), PythonLexer(), HtmlFormatter(nowrap=True))\n            return f'<div class=\"highlight\"><code class=\"lang-python\">{fmt}</code></div>'\n\n        return f'<code class=\"lang-python\">{html.escape(str(var))}</code>'\n\n    def _write(self, text: str) -> None:\n        \"\"\" Add the raw text to the debug output.\n        \"\"\"\n        self.buffer.write(text)\n\n\nclass TextLogger(BaseLogger):\n    \"\"\" Logger creating output suitable for the console.\n    \"\"\"\n    def __init__(self) -> None:\n        self.buffer = io.StringIO()\n\n    def _timestamp(self) -> None:\n        self._write(f'[{dt.datetime.now()}]\\n')\n\n    def get_buffer(self) -> str:\n        return self.buffer.getvalue()\n\n    def function(self, func: str, **kwargs: Any) -> None:\n        self._write(f\"#### Debug output for {func}()\\n\\nParameters:\\n\")\n        for name, value in kwargs.items():\n            self._write(f'  {name}: {self._python_var(value)}\\n')\n        self._write('\\n')\n\n    def section(self, heading: str) -> None:\n        self._timestamp()\n        self._write(f\"\\n# {heading}\\n\\n\")\n\n    def comment(self, text: str) -> None:\n        self._write(f\"{text}\\n\")\n\n    def var_dump(self, heading: str, var: Any) -> None:\n        if callable(var):\n            var = var()\n\n        self._write(f'{heading}:\\n  {self._python_var(var)}\\n\\n')\n\n    def table_dump(self, heading: str, rows: Iterator[Optional[List[Any]]]) -> None:\n        self._write(f'{heading}:\\n')\n        data = [list(map(self._python_var, row)) if row else None for row in rows]\n        assert data[0] is not None\n        num_cols = len(data[0])\n\n        maxlens = [max(len(d[i]) for d in data if d) for i in range(num_cols)]\n        tablewidth = sum(maxlens) + 3 * num_cols + 1\n        row_format = '| ' + ' | '.join(f'{{:<{ln}}}' for ln in maxlens) + ' |\\n'\n        self._write('-'*tablewidth + '\\n')\n        self._write(row_format.format(*data[0]))\n        self._write('-'*tablewidth + '\\n')\n        for row in data[1:]:\n            if row:\n                self._write(row_format.format(*row))\n            else:\n                self._write('-'*tablewidth + '\\n')\n        if data[-1]:\n            self._write('-'*tablewidth + '\\n')\n\n    def result_dump(self, heading: str, results: Iterator[Tuple[Any, Any]]) -> None:\n        self._timestamp()\n        self._write(f'{heading}:\\n')\n        total = 0\n        for rank, res in results:\n            self._write(f'[{rank:.3f}]  {res.source_table.name}(')\n            self._write(f\"{_debug_name(res)}, type=({','.join(res.category)}), \")\n            self._write(f\"rank={res.rank_address}, \")\n            self._write(f\"osm={''.join(map(str, res.osm_object or []))}, \")\n            self._write(f'cc={res.country_code}, ')\n            self._write(f'importance={res.importance or float(\"NaN\"):.5f})\\n')\n            total += 1\n        self._write(f'TOTAL: {total}\\n\\n')\n\n    def sql(self, conn: AsyncConnection, statement: 'sa.Executable',\n            params: Union[Mapping[str, Any], Sequence[Mapping[str, Any]], None]) -> None:\n        self._timestamp()\n        sqlstr = '\\n| '.join(textwrap.wrap(self.format_sql(conn, statement, params), width=78))\n        self._write(f\"| {sqlstr}\\n\\n\")\n\n    def _python_var(self, var: Any) -> str:\n        return str(var)\n\n    def _write(self, text: str) -> None:\n        self.buffer.write(text)\n\n\nlogger: ContextVar[BaseLogger] = ContextVar('logger', default=BaseLogger())\n\n\ndef set_log_output(fmt: str) -> None:\n    \"\"\" Enable collecting debug information.\n    \"\"\"\n    if fmt == 'html':\n        logger.set(HTMLLogger())\n    elif fmt == 'text':\n        logger.set(TextLogger())\n    else:\n        logger.set(BaseLogger())\n\n\ndef log() -> BaseLogger:\n    \"\"\" Return the logger for the current context.\n    \"\"\"\n    return logger.get()\n\n\ndef get_and_disable() -> str:\n    \"\"\" Return the current content of the debug buffer and disable logging.\n    \"\"\"\n    buf = logger.get().get_buffer()\n    logger.set(BaseLogger())\n    return buf\n\n\nHTML_HEADER: str = \"\"\"<!DOCTYPE html>\n<html>\n<head>\n  <title>Nominatim - Debug</title>\n  <style>\n\"\"\" + \\\n    (HtmlFormatter(nobackground=True).get_style_defs('.highlight')  # type: ignore[no-untyped-call]\n     if CODE_HIGHLIGHT else '') + \\\n    \"\"\"\n    h2 { font-size: x-large }\n\n    dl {\n      padding-left: 10pt;\n      font-family: monospace\n    }\n\n    dt {\n      float: left;\n      font-weight: bold;\n      margin-right: 0.5em\n    }\n\n    dt::after { content: \": \"; }\n\n    dd::after {\n      clear: left;\n      display: block\n    }\n\n    .lang-sql {\n      color: #555;\n      font-size: small\n    }\n\n    h5 {\n        border: solid lightgrey 0.1pt;\n        margin-bottom: 0;\n        background-color: #f7f7f7\n    }\n\n    h5 + .highlight {\n        padding: 3pt;\n        border: solid lightgrey 0.1pt\n    }\n\n    table, th, tbody {\n        border: thin solid;\n        border-collapse: collapse;\n    }\n    td {\n        border-right: thin solid;\n        padding-left: 3pt;\n        padding-right: 3pt;\n    }\n\n    .timestamp {\n        font-size: 0.8em;\n        color: darkblue;\n        width: calc(100% - 5pt);\n        text-align: right;\n        position: absolute;\n        left: 0;\n        margin-top: -5px;\n    }\n  </style>\n</head>\n<body>\n\"\"\"\n\nHTML_FOOTER: str = \"</body></html>\"\n"
  },
  {
    "path": "src/nominatim_api/lookup.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImplementation of place lookup by ID (doing many places at once).\n\"\"\"\nfrom typing import Optional, Callable, Type, Iterable, Tuple, Union\nfrom dataclasses import dataclass\nimport datetime as dt\n\nimport sqlalchemy as sa\n\nfrom .typing import SaColumn, SaRow, SaSelect\nfrom .connection import SearchConnection\nfrom .logging import log\nfrom . import types as ntyp\nfrom . import results as nres\n\nRowFunc = Callable[[SaRow, Type[nres.BaseResultT]], nres.BaseResultT]\n\nGEOMETRY_TYPE_MAP = {\n    'POINT': 'ST_Point',\n    'MULTIPOINT': 'ST_MultiPoint',\n    'LINESTRING': 'ST_LineString',\n    'MULTILINESTRING': 'ST_MultiLineString',\n    'POLYGON': 'ST_Polygon',\n    'MULTIPOLYGON': 'ST_MultiPolygon',\n    'GEOMETRYCOLLECTION': 'ST_GeometryCollection'\n}\n\n\n@dataclass\nclass LookupTuple:\n    \"\"\" Data class saving the SQL result for a single lookup.\n    \"\"\"\n    pid: ntyp.PlaceRef\n    result: Optional[nres.SearchResult] = None\n\n\nclass LookupCollector:\n    \"\"\" Result collector for the simple lookup.\n\n        Allows for lookup of multiple places simultaneously.\n    \"\"\"\n\n    def __init__(self, places: Iterable[ntyp.PlaceRef],\n                 details: ntyp.LookupDetails) -> None:\n        self.details = details\n        self.lookups = [LookupTuple(p) for p in places]\n\n    def get_results(self) -> nres.SearchResults:\n        \"\"\" Return the list of results available.\n        \"\"\"\n        return nres.SearchResults(p.result for p in self.lookups if p.result is not None)\n\n    async def add_rows_from_sql(self, conn: SearchConnection, sql: SaSelect,\n                                col: SaColumn, row_func: RowFunc[nres.SearchResult]) -> bool:\n        if self.details.geometry_output:\n            if self.details.geometry_simplification > 0.0:\n                col = sa.func.ST_SimplifyPreserveTopology(\n                    col, self.details.geometry_simplification)\n\n            if self.details.geometry_output & ntyp.GeometryFormat.GEOJSON:\n                sql = sql.add_columns(sa.func.ST_AsGeoJSON(col, 7).label('geometry_geojson'))\n            if self.details.geometry_output & ntyp.GeometryFormat.TEXT:\n                sql = sql.add_columns(sa.func.ST_AsText(col).label('geometry_text'))\n            if self.details.geometry_output & ntyp.GeometryFormat.KML:\n                sql = sql.add_columns(sa.func.ST_AsKML(col, 7).label('geometry_kml'))\n            if self.details.geometry_output & ntyp.GeometryFormat.SVG:\n                sql = sql.add_columns(sa.func.ST_AsSVG(col, 0, 7).label('geometry_svg'))\n\n        for row in await conn.execute(sql):\n            result = row_func(row, nres.SearchResult)\n            if hasattr(row, 'bbox'):\n                result.bbox = ntyp.Bbox.from_wkb(row.bbox)\n\n            if self.lookups[row._idx].result is None:\n                self.lookups[row._idx].result = result\n\n        return all(p.result is not None for p in self.lookups)\n\n    def enumerate_free_place_ids(self) -> Iterable[Tuple[int, ntyp.PlaceID]]:\n        return ((i, p.pid) for i, p in enumerate(self.lookups)\n                if p.result is None and isinstance(p.pid, ntyp.PlaceID))\n\n    def enumerate_free_osm_ids(self) -> Iterable[Tuple[int, ntyp.OsmID]]:\n        return ((i, p.pid) for i, p in enumerate(self.lookups)\n                if p.result is None and isinstance(p.pid, ntyp.OsmID))\n\n\nclass DetailedCollector:\n    \"\"\" Result collector for detailed lookup.\n\n        Only one place at the time may be looked up.\n    \"\"\"\n\n    def __init__(self, place: ntyp.PlaceRef, with_geometry: bool) -> None:\n        self.with_geometry = with_geometry\n        self.place = place\n        self.result: Optional[nres.DetailedResult] = None\n\n    async def add_rows_from_sql(self, conn: SearchConnection, sql: SaSelect,\n                                col: SaColumn, row_func: RowFunc[nres.DetailedResult]) -> bool:\n        if self.with_geometry:\n            sql = sql.add_columns(\n                sa.func.ST_AsGeoJSON(\n                    sa.case((sa.func.ST_NPoints(col) > 5000,\n                             sa.func.ST_SimplifyPreserveTopology(col, 0.0001)),\n                            else_=col), 7).label('geometry_geojson'))\n        else:\n            sql = sql.add_columns(sa.func.ST_GeometryType(col).label('geometry_type'))\n\n        for row in await conn.execute(sql):\n            self.result = row_func(row, nres.DetailedResult)\n            # add missing details\n            if 'type' in self.result.geometry:\n                self.result.geometry['type'] = \\\n                    GEOMETRY_TYPE_MAP.get(self.result.geometry['type'],\n                                          self.result.geometry['type'])\n            indexed_date = getattr(row, 'indexed_date', None)\n            if indexed_date is not None:\n                self.result.indexed_date = indexed_date.replace(tzinfo=dt.timezone.utc)\n\n            return True\n\n        # Nothing found.\n        return False\n\n    def enumerate_free_place_ids(self) -> Iterable[Tuple[int, ntyp.PlaceID]]:\n        if self.result is None and isinstance(self.place, ntyp.PlaceID):\n            return [(0, self.place)]\n        return []\n\n    def enumerate_free_osm_ids(self) -> Iterable[Tuple[int, ntyp.OsmID]]:\n        if self.result is None and isinstance(self.place, ntyp.OsmID):\n            return [(0, self.place)]\n        return []\n\n\nCollector = Union[LookupCollector, DetailedCollector]\n\n\nasync def get_detailed_place(conn: SearchConnection, place: ntyp.PlaceRef,\n                             details: ntyp.LookupDetails) -> Optional[nres.DetailedResult]:\n    \"\"\" Retrieve a place with additional details from the database.\n    \"\"\"\n    log().function('get_detailed_place', place=place, details=details)\n\n    if details.geometry_output and details.geometry_output != ntyp.GeometryFormat.GEOJSON:\n        raise ValueError(\"lookup only supports geojosn polygon output.\")\n\n    collector = DetailedCollector(place,\n                                  bool(details.geometry_output & ntyp.GeometryFormat.GEOJSON))\n\n    for func in (find_in_placex, find_in_osmline, find_in_postcode, find_in_tiger):\n        if await func(conn, collector):\n            break\n\n    if collector.result is not None:\n        await nres.add_result_details(conn, [collector.result], details)\n\n    return collector.result\n\n\nasync def get_places(conn: SearchConnection, places: Iterable[ntyp.PlaceRef],\n                     details: ntyp.LookupDetails) -> nres.SearchResults:\n    \"\"\" Retrieve a list of places as simple search results from the\n        database.\n    \"\"\"\n    log().function('get_places', places=places, details=details)\n\n    collector = LookupCollector(places, details)\n\n    for func in (find_in_placex, find_in_osmline, find_in_postcode, find_in_tiger):\n        if await func(conn, collector):\n            break\n\n    results = collector.get_results()\n    await nres.add_result_details(conn, results, details)\n\n    return results\n\n\nasync def find_in_placex(conn: SearchConnection, collector: Collector) -> bool:\n    \"\"\" Search for the given places in the main placex table.\n    \"\"\"\n    log().section(\"Find in placex table\")\n    t = conn.t.placex\n    sql = sa.select(t.c.place_id, t.c.osm_type, t.c.osm_id, t.c.name,\n                    t.c.class_, t.c.type, t.c.admin_level,\n                    t.c.address, t.c.extratags,\n                    t.c.housenumber, t.c.postcode, t.c.country_code,\n                    t.c.importance, t.c.wikipedia, t.c.indexed_date,\n                    t.c.parent_place_id, t.c.rank_address, t.c.rank_search,\n                    t.c.linked_place_id,\n                    t.c.geometry.ST_Expand(0).label('bbox'),\n                    t.c.centroid)\n\n    for osm_type in ('N', 'W', 'R'):\n        osm_ids = [{'i': i, 'oi': p.osm_id, 'oc': p.osm_class or ''}\n                   for i, p in collector.enumerate_free_osm_ids()\n                   if p.osm_type == osm_type]\n\n        if osm_ids:\n            oid_tab = sa.func.JsonArrayEach(sa.type_coerce(osm_ids, sa.JSON))\\\n                        .table_valued(sa.column('value', type_=sa.JSON))\n            psql = sql.add_columns(oid_tab.c.value['i'].as_integer().label('_idx'))\\\n                      .where(t.c.osm_type == osm_type)\\\n                      .where(t.c.osm_id == oid_tab.c.value['oi'].as_string().cast(sa.BigInteger))\\\n                      .where(sa.or_(oid_tab.c.value['oc'].as_string() == '',\n                                    oid_tab.c.value['oc'].as_string() == t.c.class_))\\\n                      .order_by(t.c.class_)\n\n            if await collector.add_rows_from_sql(conn, psql, t.c.geometry,\n                                                 nres.create_from_placex_row):\n                return True\n\n    place_ids = [{'i': i, 'id': p.place_id}\n                 for i, p in collector.enumerate_free_place_ids()]\n\n    if place_ids:\n        pid_tab = sa.func.JsonArrayEach(sa.type_coerce(place_ids, sa.JSON))\\\n                    .table_valued(sa.column('value', type_=sa.JSON))\n        psql = sql.add_columns(pid_tab.c.value['i'].as_integer().label('_idx'))\\\n                  .where(t.c.place_id == pid_tab.c.value['id'].as_string().cast(sa.BigInteger))\n\n        return await collector.add_rows_from_sql(conn, psql, t.c.geometry,\n                                                 nres.create_from_placex_row)\n\n    return False\n\n\nasync def find_in_osmline(conn: SearchConnection, collector: Collector) -> bool:\n    \"\"\" Search for the given places in the table for address interpolations.\n\n        Return true when all places have been resolved.\n    \"\"\"\n    log().section(\"Find in interpolation table\")\n    t = conn.t.osmline\n    sql = sa.select(t.c.place_id, t.c.osm_id, t.c.parent_place_id,\n                    t.c.indexed_date, t.c.startnumber, t.c.endnumber,\n                    t.c.step, t.c.address, t.c.postcode, t.c.country_code,\n                    t.c.linegeo.ST_Centroid().label('centroid'))\n\n    osm_ids = [{'i': i, 'oi': p.osm_id, 'oc': p.class_as_housenumber()}\n               for i, p in collector.enumerate_free_osm_ids() if p.osm_type == 'W']\n\n    if osm_ids:\n        oid_tab = sa.func.JsonArrayEach(sa.type_coerce(osm_ids, sa.JSON))\\\n                    .table_valued(sa.column('value', type_=sa.JSON))\n        psql = sql.add_columns(oid_tab.c.value['i'].as_integer().label('_idx'))\\\n                  .where(t.c.osm_id == oid_tab.c.value['oi'].as_string().cast(sa.BigInteger))\\\n                  .order_by(sa.func.greatest(0,\n                                             oid_tab.c.value['oc'].as_integer() - t.c.endnumber,\n                                             t.c.startnumber - oid_tab.c.value['oc'].as_integer()))\n\n        if await collector.add_rows_from_sql(conn, psql, t.c.linegeo,\n                                             nres.create_from_osmline_row):\n            return True\n\n    place_ids = [{'i': i, 'id': p.place_id}\n                 for i, p in collector.enumerate_free_place_ids()]\n\n    if place_ids:\n        pid_tab = sa.func.JsonArrayEach(sa.type_coerce(place_ids, sa.JSON))\\\n                    .table_valued(sa.column('value', type_=sa.JSON))\n        psql = sql.add_columns(pid_tab.c.value['i'].label('_idx'))\\\n                  .where(t.c.place_id == pid_tab.c.value['id'].as_string().cast(sa.BigInteger))\n\n        return await collector.add_rows_from_sql(conn, psql, t.c.linegeo,\n                                                 nres.create_from_osmline_row)\n\n    return False\n\n\nasync def find_in_postcode(conn: SearchConnection, collector: Collector) -> bool:\n    \"\"\" Search for the given places in the postcode table.\n\n        Return true when all places have been resolved.\n    \"\"\"\n    log().section(\"Find in postcode table\")\n\n    place_ids = [{'i': i, 'id': p.place_id}\n                 for i, p in collector.enumerate_free_place_ids()]\n\n    if place_ids:\n        pid_tab = sa.func.JsonArrayEach(sa.type_coerce(place_ids, sa.JSON))\\\n                    .table_valued(sa.column('value', type_=sa.JSON))\n        t = conn.t.postcode\n        sql = sa.select(pid_tab.c.value['i'].as_integer().label('_idx'),\n                        t.c.osm_id, t.c.place_id, t.c.parent_place_id,\n                        t.c.rank_search,\n                        t.c.indexed_date, t.c.postcode, t.c.country_code,\n                        t.c.centroid)\\\n                .where(t.c.place_id == pid_tab.c.value['id'].as_string().cast(sa.BigInteger))\n\n        if await collector.add_rows_from_sql(conn, sql, t.c.geometry,\n                                             nres.create_from_postcode_row):\n            return True\n\n    osm_ids = [{'i': i, 'oi': p.osm_id}\n               for i, p in collector.enumerate_free_osm_ids() if p.osm_type == 'R']\n\n    if osm_ids:\n        pid_tab = sa.func.JsonArrayEach(sa.type_coerce(osm_ids, sa.JSON))\\\n                    .table_valued(sa.column('value', type_=sa.JSON))\n        t = conn.t.postcode\n        sql = sa.select(pid_tab.c.value['i'].as_integer().label('_idx'),\n                        t.c.osm_id, t.c.place_id, t.c.parent_place_id,\n                        t.c.rank_search,\n                        t.c.indexed_date, t.c.postcode, t.c.country_code,\n                        t.c.centroid)\\\n                .where(t.c.osm_id == pid_tab.c.value['oi'].as_string().cast(sa.BigInteger))\n\n        return await collector.add_rows_from_sql(conn, sql, t.c.geometry,\n                                                 nres.create_from_postcode_row)\n\n    return False\n\n\nasync def find_in_tiger(conn: SearchConnection, collector: Collector) -> bool:\n    \"\"\" Search for the given places in the TIGER address table.\n\n        Return true when all places have been resolved.\n    \"\"\"\n    log().section(\"Find in tiger table\")\n\n    place_ids = [{'i': i, 'id': p.place_id}\n                 for i, p in collector.enumerate_free_place_ids()]\n\n    if place_ids:\n        pid_tab = sa.func.JsonArrayEach(sa.type_coerce(place_ids, sa.JSON))\\\n                    .table_valued(sa.column('value', type_=sa.JSON))\n        t = conn.t.tiger\n        parent = conn.t.placex\n        sql = sa.select(pid_tab.c.value['i'].as_integer().label('_idx'),\n                        t.c.place_id, t.c.parent_place_id,\n                        parent.c.osm_type, parent.c.osm_id,\n                        t.c.startnumber, t.c.endnumber, t.c.step,\n                        t.c.postcode,\n                        t.c.linegeo.ST_Centroid().label('centroid'))\\\n                .join(parent, t.c.parent_place_id == parent.c.place_id, isouter=True)\\\n                .where(t.c.place_id == pid_tab.c.value['id'].as_string().cast(sa.BigInteger))\n\n        return await collector.add_rows_from_sql(conn, sql, t.c.linegeo,\n                                                 nres.create_from_tiger_row)\n\n    return False\n"
  },
  {
    "path": "src/nominatim_api/py.typed",
    "content": ""
  },
  {
    "path": "src/nominatim_api/query_preprocessing/__init__.py",
    "content": ""
  },
  {
    "path": "src/nominatim_api/query_preprocessing/base.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nCommon data types and protocols for preprocessing.\n\"\"\"\nfrom typing import List, Callable\n\nfrom ..typing import Protocol\nfrom ..search import query as qmod\nfrom .config import QueryConfig\n\nQueryProcessingFunc = Callable[[List[qmod.Phrase]], List[qmod.Phrase]]\n\n\nclass QueryHandler(Protocol):\n    \"\"\" Protocol for query modules.\n    \"\"\"\n    def create(self, config: QueryConfig) -> QueryProcessingFunc:\n        \"\"\"\n        Create a function for sanitizing a place.\n        Arguments:\n            config: A dictionary with the additional configuration options\n                    specified in the tokenizer configuration\n            normalizer: A instance to transliterate text\n        Return:\n            The result is a list modified by the preprocessor.\n        \"\"\"\n        pass\n"
  },
  {
    "path": "src/nominatim_api/query_preprocessing/config.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nConfiguration for Sanitizers.\n\"\"\"\nfrom typing import Any, TYPE_CHECKING\nfrom collections import UserDict\n\n# working around missing generics in Python < 3.8\n# See https://github.com/python/typing/issues/60#issuecomment-869757075\nif TYPE_CHECKING:\n    _BaseUserDict = UserDict[str, Any]\nelse:\n    _BaseUserDict = UserDict\n\n\nclass QueryConfig(_BaseUserDict):\n    \"\"\" The `QueryConfig` class is a read-only dictionary\n        with configuration options for the preprocessor.\n        In addition to the usual dictionary functions, the class provides\n        accessors to standard preprocessor options that are used by many of the\n        preprocessors.\n    \"\"\"\n\n    def set_normalizer(self, normalizer: Any) -> 'QueryConfig':\n        \"\"\" Set the normalizer function to be used.\n        \"\"\"\n        self['_normalizer'] = normalizer\n\n        return self\n"
  },
  {
    "path": "src/nominatim_api/query_preprocessing/normalize.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nNormalize query text using the same ICU normalization rules that are\napplied during import. If a phrase becomes empty because the normalization\nremoves all terms, then the phrase is deleted.\n\nThis preprocessor does not come with any extra information. Instead it will\nuse the configuration from the `normalization` section.\n\"\"\"\nfrom typing import cast\n\nfrom .config import QueryConfig\nfrom .base import QueryProcessingFunc\nfrom ..search.query import Phrase\n\n\ndef create(config: QueryConfig) -> QueryProcessingFunc:\n    normalizer = config.get('_normalizer')\n\n    if not normalizer:\n        return lambda p: p\n\n    return lambda phrases: list(\n        filter(lambda p: p.text,\n               (Phrase(p.ptype, cast(str, normalizer.transliterate(p.text)).strip('-: '))\n                for p in phrases)))\n"
  },
  {
    "path": "src/nominatim_api/query_preprocessing/regex_replace.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nThis preprocessor replaces values in a given input based on pre-defined regex rules.\n\nArguments:\n    pattern: Regex pattern to be applied on the input\n    replace: The string that it is to be replaced with\n\"\"\"\nfrom typing import List\nimport re\n\nfrom .config import QueryConfig\nfrom .base import QueryProcessingFunc\nfrom ..search.query import Phrase\n\n\nclass _GenericPreprocessing:\n    \"\"\"Perform replacements to input phrases using custom regex patterns.\"\"\"\n\n    def __init__(self, config: QueryConfig) -> None:\n        \"\"\"Initialise the _GenericPreprocessing class with patterns from the ICU config file.\"\"\"\n        self.config = config\n\n        match_patterns = self.config.get('replacements', 'Key not found')\n        self.compiled_patterns = [\n            (re.compile(item['pattern']), item['replace']) for item in match_patterns\n            ]\n\n    def split_phrase(self, phrase: Phrase) -> Phrase:\n        \"\"\"This function performs replacements on the given text using regex patterns.\"\"\"\n        for item in self.compiled_patterns:\n            phrase.text = item[0].sub(item[1], phrase.text)\n\n        return phrase\n\n    def __call__(self, phrases: List[Phrase]) -> List[Phrase]:\n        \"\"\"\n        Return the final Phrase list.\n        Returns an empty list if there is nothing left after split_phrase.\n        \"\"\"\n        result = [p for p in map(self.split_phrase, phrases) if p.text.strip()]\n        return result\n\n\ndef create(config: QueryConfig) -> QueryProcessingFunc:\n    \"\"\" Create a function for generic preprocessing.\"\"\"\n    return _GenericPreprocessing(config)\n"
  },
  {
    "path": "src/nominatim_api/query_preprocessing/split_japanese_phrases.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nThis file divides Japanese addresses into three categories:\nprefecture, municipality, and other.\nThe division is not strict but simple using these keywords.\n\"\"\"\nfrom typing import List\nimport re\n\nfrom .config import QueryConfig\nfrom .base import QueryProcessingFunc\nfrom ..search.query import Phrase\n\nMATCH_PATTERNS = [\n    r'''\n                (...??[都都道府県縣])            # [group1] prefecture\n                (.+?[市区區町村])              # [group2] municipalities (city/wards/towns/villages)\n                (.+)                         # [group3] other words\n                ''',\n    r'''\n                (...??[都都道府県縣])            # [group1] prefecture\n                (.+)                         # [group3] other words\n                ''',\n    r'''\n                (.+?[市区區町村])              # [group2] municipalities (city/wards/towns/villages)\n                (.+)                         # [group3] other words\n                '''\n]\n\n\nclass _JapanesePreprocessing:\n\n    def __init__(self, config: QueryConfig) -> None:\n        self.config = config\n\n    def split_phrase(self, phrase: Phrase) -> Phrase:\n        \"\"\"\n        This function performs a division on the given text using a regular expression.\n        \"\"\"\n        for pattern in MATCH_PATTERNS:\n            result = re.match(pattern, phrase.text, re.VERBOSE)\n            if result is not None:\n                return Phrase(phrase.ptype, ':'.join(result.groups()))\n\n        return phrase\n\n    def __call__(self, phrases: List[Phrase]) -> List[Phrase]:\n        \"\"\"Split a Japanese address using japanese_tokenizer.\n        \"\"\"\n        return [self.split_phrase(p) for p in phrases]\n\n\ndef create(config: QueryConfig) -> QueryProcessingFunc:\n    \"\"\" Create a function of japanese preprocessing.\n    \"\"\"\n    return _JapanesePreprocessing(config)\n"
  },
  {
    "path": "src/nominatim_api/result_formatting.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nHelper classes and functions for formatting results into API responses.\n\"\"\"\nfrom typing import Type, TypeVar, Dict, List, Callable, Any, Mapping, Optional, cast\nfrom collections import defaultdict\nfrom pathlib import Path\nimport importlib.util\n\nfrom .server.content_types import CONTENT_JSON\n\nT = TypeVar('T')\nFormatFunc = Callable[[T, Mapping[str, Any]], str]\nErrorFormatFunc = Callable[[str, str, int], str]\n\n\nclass FormatDispatcher:\n    \"\"\" Container for formatting functions for results.\n        Functions can conveniently be added by using decorated functions.\n    \"\"\"\n\n    def __init__(self, content_types: Optional[Mapping[str, str]] = None) -> None:\n        self.error_handler: ErrorFormatFunc = lambda ct, msg, status: f\"ERROR {status}: {msg}\"\n        self.content_types: Dict[str, str] = {}\n        if content_types:\n            self.content_types.update(content_types)\n        self.format_functions: Dict[Type[Any], Dict[str, FormatFunc[Any]]] = defaultdict(dict)\n\n    def format_func(self, result_class: Type[T],\n                    fmt: str) -> Callable[[FormatFunc[T]], FormatFunc[T]]:\n        \"\"\" Decorator for a function that formats a given type of result into the\n            selected format.\n        \"\"\"\n        def decorator(func: FormatFunc[T]) -> FormatFunc[T]:\n            self.format_functions[result_class][fmt] = func\n            return func\n\n        return decorator\n\n    def error_format_func(self, func: ErrorFormatFunc) -> ErrorFormatFunc:\n        \"\"\" Decorator for a function that formats error messages.\n            There is only one error formatter per dispatcher. Using\n            the decorator repeatedly will overwrite previous functions.\n        \"\"\"\n        self.error_handler = func\n        return func\n\n    def list_formats(self, result_type: Type[Any]) -> List[str]:\n        \"\"\" Return a list of formats supported by this formatter.\n        \"\"\"\n        return list(self.format_functions[result_type].keys())\n\n    def supports_format(self, result_type: Type[Any], fmt: str) -> bool:\n        \"\"\" Check if the given format is supported by this formatter.\n        \"\"\"\n        return fmt in self.format_functions[result_type]\n\n    def format_result(self, result: Any, fmt: str, options: Mapping[str, Any]) -> str:\n        \"\"\" Convert the given result into a string using the given format.\n\n            The format is expected to be in the list returned by\n            `list_formats()`.\n        \"\"\"\n        return self.format_functions[type(result)][fmt](result, options)\n\n    def format_error(self, content_type: str, msg: str, status: int) -> str:\n        \"\"\" Convert the given error message into a response string\n            taking the requested content_type into account.\n\n            Change the format using the error_format_func decorator.\n        \"\"\"\n        return self.error_handler(content_type, msg, status)\n\n    def set_content_type(self, fmt: str, content_type: str) -> None:\n        \"\"\" Set the content type for the given format. This is the string\n            that will be returned in the Content-Type header of the HTML\n            response, when the given format is chosen.\n        \"\"\"\n        self.content_types[fmt] = content_type\n\n    def get_content_type(self, fmt: str) -> str:\n        \"\"\" Return the content type for the given format.\n\n            If no explicit content type has been defined, then\n            JSON format is assumed.\n        \"\"\"\n        return self.content_types.get(fmt, CONTENT_JSON)\n\n\ndef load_format_dispatcher(api_name: str, project_dir: Optional[Path]) -> FormatDispatcher:\n    \"\"\" Load the dispatcher for the given API.\n\n        The function first tries to find a module api/<api_name>/format.py\n        in the project directory. This file must export a single variable\n        `dispatcher`.\n\n        If the function does not exist, the default formatter is loaded.\n    \"\"\"\n    if project_dir is not None:\n        priv_module = project_dir / 'api' / api_name / 'format.py'\n        if priv_module.is_file():\n            spec = importlib.util.spec_from_file_location(f'api.{api_name},format',\n                                                          str(priv_module))\n            if spec:\n                module = importlib.util.module_from_spec(spec)\n                # Do not add to global modules because there is no standard\n                # module name that Python can resolve.\n                assert spec.loader is not None\n                spec.loader.exec_module(module)\n\n                return cast(FormatDispatcher, module.dispatch)\n\n    return cast(FormatDispatcher,\n                importlib.import_module(f'nominatim_api.{api_name}.format').dispatch)\n"
  },
  {
    "path": "src/nominatim_api/results.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nDataclasses for search results and helper functions to fill them.\n\nData classes are part of the public API while the functions are for\ninternal use only. That's why they are implemented as free-standing functions\ninstead of member functions.\n\"\"\"\nfrom typing import (\n    Optional, Tuple, Dict, Sequence, TypeVar, Type, List,\n    cast, Callable\n)\nimport enum\nimport dataclasses\nimport datetime as dt\n\nimport sqlalchemy as sa\n\nfrom .typing import SaSelect, SaRow\nfrom .sql.sqlalchemy_types import Geometry\nfrom .types import Point, Bbox, LookupDetails, EntranceDetails\nfrom .connection import SearchConnection\nfrom .logging import log\n\n# This file defines complex result data classes.\n\n\ndef _mingle_name_tags(names: Optional[Dict[str, str]]) -> Optional[Dict[str, str]]:\n    \"\"\" Mix-in names from linked places, so that they show up\n        as standard names where necessary.\n    \"\"\"\n    if not names:\n        return None\n\n    out = {}\n    for k, v in names.items():\n        if k.startswith('_place_'):\n            outkey = k[7:]\n            out[k if outkey in names else outkey] = v\n        else:\n            out[k] = v\n\n    return out\n\n\nclass SourceTable(enum.Enum):\n    \"\"\" The `SourceTable` type lists the possible sources a result can have.\n    \"\"\"\n    PLACEX = 1\n    \"\"\" The placex table is the main source for result usually containing\n        OSM data.\n    \"\"\"\n    OSMLINE = 2\n    \"\"\" The osmline table contains address interpolations from OSM data.\n        Interpolation addresses are always approximate. The OSM id in the\n        result refers to the OSM way with the interpolation line object.\n    \"\"\"\n    TIGER = 3\n    \"\"\" TIGER address data contains US addresses imported on the side,\n        see [Installing TIGER data](../customize/Tiger.md).\n        TIGER address are also interpolations. The addresses always refer\n        to a street from OSM data. The OSM id in the result refers to\n        that street.\n    \"\"\"\n    POSTCODE = 4\n    \"\"\" The postcode table contains artificial centroids for postcodes,\n        computed from the postcodes available with address points. Results\n        are always approximate.\n    \"\"\"\n    COUNTRY = 5\n    \"\"\" The country table provides a fallback, when country data is missing\n        in the OSM data.\n    \"\"\"\n\n\n@dataclasses.dataclass\nclass AddressLine:\n    \"\"\" The `AddressLine` may contain the following fields about a related place\n        and its function as an address object. Most fields are optional.\n        Their presence depends on the kind and function of the address part.\n    \"\"\"\n    category: Tuple[str, str]\n    \"\"\" Main category of the place, described by a key-value pair.\n    \"\"\"\n    names: Dict[str, str]\n    \"\"\" All available names for the place including references, alternative\n        names and translations.\n    \"\"\"\n    fromarea: bool\n    \"\"\" If true, then the exact area of the place is known. Without area\n        information, Nominatim has to make an educated guess if an address\n        belongs to one place or another.\n    \"\"\"\n    isaddress: bool\n    \"\"\" If true, this place should be considered for the final address display.\n        Nominatim will sometimes include more than one candidate for\n        the address in the list when it cannot reliably determine where the\n        place belongs. It will consider names of all candidates when searching\n        but when displaying the result, only the most likely candidate should\n        be shown.\n    \"\"\"\n    rank_address: int\n    \"\"\" [Address rank](../customize/Ranking.md#address-rank) of the place.\n    \"\"\"\n    distance: float\n    \"\"\" Distance in degrees between the result place and this address part.\n    \"\"\"\n    place_id: Optional[int] = None\n    \"\"\" Internal ID of the place.\n    \"\"\"\n    osm_object: Optional[Tuple[str, int]] = None\n    \"\"\" OSM type and ID of the place, if such an object exists.\n    \"\"\"\n    extratags: Optional[Dict[str, str]] = None\n    \"\"\" Any extra information available about the place. This is a dictionary\n        that usually contains OSM tag key-value pairs.\n    \"\"\"\n\n    admin_level: Optional[int] = None\n    \"\"\" The administrative level of a boundary as tagged in the input data.\n        This field is only meaningful for places of the category\n        (boundary, administrative).\n    \"\"\"\n\n    local_name: Optional[str] = None\n    \"\"\" Place holder for localization of this address part. See\n        [Localization](Result-Handling.md#localization) below.\n    \"\"\"\n\n    @property\n    def display_name(self) -> Optional[str]:\n        \"\"\" Dynamically compute the display name for the Address Line component\n        \"\"\"\n        if self.local_name:\n            return self.local_name\n        elif 'name' in self.names:\n            return self.names['name']\n        elif self.names:\n            return next(iter(self.names.values()), None)\n        return None\n\n\nclass AddressLines(List[AddressLine]):\n    \"\"\" A wrapper around a list of AddressLine objects.\"\"\"\n\n\n@dataclasses.dataclass\nclass WordInfo:\n    \"\"\" Each entry in the list of search terms contains the\n        following detailed information.\n    \"\"\"\n    word_id: int\n    \"\"\" Internal identifier for the word.\n    \"\"\"\n    word_token: str\n    \"\"\" Normalised and transliterated form of the word.\n        This form is used for searching.\n    \"\"\"\n    word: Optional[str] = None\n    \"\"\" Untransliterated form, if available.\n    \"\"\"\n\n\nWordInfos = Sequence[WordInfo]\n\n\n@dataclasses.dataclass\nclass BaseResult:\n    \"\"\" Data class collecting information common to all\n        types of search results.\n    \"\"\"\n    source_table: SourceTable\n    category: Tuple[str, str]\n    centroid: Point\n\n    place_id: Optional[int] = None\n    osm_object: Optional[Tuple[str, int]] = None\n    parent_place_id: Optional[int] = None\n    linked_place_id: Optional[int] = None\n    admin_level: int = 15\n\n    locale_name: Optional[str] = None\n\n    names: Optional[Dict[str, str]] = None\n    address: Optional[Dict[str, str]] = None\n    extratags: Optional[Dict[str, str]] = None\n\n    housenumber: Optional[str] = None\n    postcode: Optional[str] = None\n    wikipedia: Optional[str] = None\n\n    rank_address: int = 30\n    rank_search: int = 30\n    importance: Optional[float] = None\n\n    country_code: Optional[str] = None\n\n    address_rows: Optional[AddressLines] = None\n    linked_rows: Optional[AddressLines] = None\n    parented_rows: Optional[AddressLines] = None\n    name_keywords: Optional[WordInfos] = None\n    address_keywords: Optional[WordInfos] = None\n\n    entrances: Optional[List[EntranceDetails]] = None\n\n    geometry: Dict[str, str] = dataclasses.field(default_factory=dict)\n\n    @property\n    def lat(self) -> float:\n        \"\"\" Get the latitude (or y) of the center point of the place.\n        \"\"\"\n        return self.centroid[1]\n\n    @property\n    def lon(self) -> float:\n        \"\"\" Get the longitude (or x) of the center point of the place.\n        \"\"\"\n        return self.centroid[0]\n\n    @property\n    def display_name(self) -> Optional[str]:\n        \"\"\" Dynamically compute the display name for the result place\n            and, if available, its address information..\n        \"\"\"\n        if self.address_rows:  # if this is true we need additional processing\n            label_parts: List[str] = []\n\n            for line in self.address_rows:  # assume locale_name is set by external formatter\n                if line.isaddress and line.names:\n                    address_name = line.display_name\n\n                    if address_name and (not label_parts or label_parts[-1] != address_name):\n                        label_parts.append(address_name)\n\n            if label_parts:\n                return ', '.join(label_parts)\n\n        # Now adding additional information for reranking\n        if self.locale_name:\n            return self.locale_name\n        elif self.names and 'name' in self.names:\n            return self.names['name']\n        elif self.names:\n            return next(iter(self.names.values()))\n        elif self.housenumber:\n            return self.housenumber\n        return None\n\n    def calculated_importance(self) -> float:\n        \"\"\" Get a valid importance value. This is either the stored importance\n            of the value or an artificial value computed from the place's\n            search rank.\n        \"\"\"\n        return self.importance or (0.40001 - (self.rank_search/75.0))\n\n\nBaseResultT = TypeVar('BaseResultT', bound=BaseResult)\n\n\n@dataclasses.dataclass\nclass DetailedResult(BaseResult):\n    \"\"\" A search result with more internal information from the database\n        added.\n    \"\"\"\n    indexed_date: Optional[dt.datetime] = None\n\n\n@dataclasses.dataclass\nclass ReverseResult(BaseResult):\n    \"\"\" A search result for reverse geocoding.\n    \"\"\"\n    distance: Optional[float] = None\n    bbox: Optional[Bbox] = None\n\n\nclass ReverseResults(List[ReverseResult]):\n    \"\"\" Sequence of reverse lookup results ordered by distance.\n        May be empty when no result was found.\n    \"\"\"\n\n\n@dataclasses.dataclass\nclass SearchResult(BaseResult):\n    \"\"\" A search result for forward geocoding.\n    \"\"\"\n    bbox: Optional[Bbox] = None\n    accuracy: float = 0.0\n\n    @property\n    def ranking(self) -> float:\n        \"\"\" Return the ranking, a combined measure of accuracy and importance.\n        \"\"\"\n        return (self.accuracy if self.accuracy is not None else 1) \\\n            - self.calculated_importance()\n\n\nclass SearchResults(List[SearchResult]):\n    \"\"\" Sequence of forward lookup results ordered by relevance.\n        May be empty when no result was found.\n    \"\"\"\n\n\ndef _filter_geometries(row: SaRow) -> Dict[str, str]:\n    return {k[9:]: v for k, v in row._mapping.items()\n            if k.startswith('geometry_')}\n\n\ndef create_from_placex_row(row: SaRow, class_type: Type[BaseResultT]) -> BaseResultT:\n    \"\"\" Construct a new result and add the data from the result row\n        from the placex table. 'class_type' defines the type of result\n        to return. Returns None if the row is None.\n    \"\"\"\n    return class_type(source_table=SourceTable.PLACEX,\n                      place_id=row.place_id,\n                      osm_object=(row.osm_type, row.osm_id),\n                      category=(row.class_, row.type),\n                      parent_place_id=row.parent_place_id,\n                      linked_place_id=getattr(row, 'linked_place_id', None),\n                      admin_level=getattr(row, 'admin_level', 15),\n                      names=_mingle_name_tags(row.name),\n                      address=row.address,\n                      extratags=row.extratags,\n                      housenumber=row.housenumber,\n                      postcode=row.postcode,\n                      wikipedia=row.wikipedia,\n                      rank_address=row.rank_address,\n                      rank_search=row.rank_search,\n                      importance=row.importance,\n                      country_code=row.country_code,\n                      centroid=Point.from_wkb(row.centroid),\n                      geometry=_filter_geometries(row))\n\n\ndef create_from_osmline_row(row: SaRow, class_type: Type[BaseResultT]) -> BaseResultT:\n    \"\"\" Construct a new result and add the data from the result row\n        from the address interpolation table osmline. 'class_type' defines\n        the type of result to return. Returns None if the row is None.\n\n        If the row contains a housenumber, then the housenumber is filled out.\n        Otherwise the result contains the interpolation information in extratags.\n    \"\"\"\n    hnr = getattr(row, 'housenumber', None)\n\n    res = class_type(source_table=SourceTable.OSMLINE,\n                     place_id=row.place_id,\n                     parent_place_id=row.parent_place_id,\n                     osm_object=('W', row.osm_id),\n                     category=('place', 'houses' if hnr is None else 'house'),\n                     address=row.address,\n                     postcode=row.postcode,\n                     country_code=row.country_code,\n                     centroid=Point.from_wkb(row.centroid),\n                     geometry=_filter_geometries(row))\n\n    if hnr is None:\n        res.extratags = {'startnumber': str(row.startnumber),\n                         'endnumber': str(row.endnumber),\n                         'step': str(row.step)}\n    else:\n        res.housenumber = str(hnr)\n\n    return res\n\n\ndef create_from_tiger_row(row: SaRow,\n                          class_type: Type[BaseResultT],\n                          osm_type: Optional[str] = None,\n                          osm_id: Optional[int] = None) -> BaseResultT:\n    \"\"\" Construct a new result and add the data from the result row\n        from the Tiger data interpolation table. 'class_type' defines\n        the type of result to return. Returns None if the row is None.\n\n        If the row contains a housenumber, then the housenumber is filled out.\n        Otherwise the result contains the interpolation information in extratags.\n    \"\"\"\n    hnr = getattr(row, 'housenumber', None)\n\n    res = class_type(source_table=SourceTable.TIGER,\n                     place_id=row.place_id,\n                     parent_place_id=row.parent_place_id,\n                     osm_object=(osm_type or row.osm_type, osm_id or row.osm_id),\n                     category=('place', 'houses' if hnr is None else 'house'),\n                     postcode=row.postcode,\n                     country_code='us',\n                     centroid=Point.from_wkb(row.centroid),\n                     geometry=_filter_geometries(row))\n\n    if hnr is None:\n        res.extratags = {'startnumber': str(row.startnumber),\n                         'endnumber': str(row.endnumber),\n                         'step': str(row.step)}\n    else:\n        res.housenumber = str(hnr)\n\n    return res\n\n\ndef create_from_postcode_row(row: SaRow, class_type: Type[BaseResultT]) -> BaseResultT:\n    \"\"\" Construct a new result and add the data from the result row\n        from the postcode table. 'class_type' defines\n        the type of result to return. Returns None if the row is None.\n    \"\"\"\n    return class_type(source_table=SourceTable.POSTCODE,\n                      place_id=row.place_id,\n                      osm_object=None if row.osm_id is None else ('R', row.osm_id),\n                      parent_place_id=row.parent_place_id,\n                      category=(('place', 'postcode') if row.osm_id is None\n                                else ('boundary', 'postal_code')),\n                      names={'ref': row.postcode},\n                      rank_search=row.rank_search,\n                      rank_address=5,\n                      country_code=row.country_code,\n                      centroid=Point.from_wkb(row.centroid),\n                      geometry=_filter_geometries(row))\n\n\ndef create_from_country_row(row: SaRow, class_type: Type[BaseResultT]) -> BaseResultT:\n    \"\"\" Construct a new result and add the data from the result row\n        from the fallback country tables. 'class_type' defines\n        the type of result to return. Returns None if the row is None.\n    \"\"\"\n    return class_type(source_table=SourceTable.COUNTRY,\n                      category=('place', 'country'),\n                      centroid=Point.from_wkb(row.centroid),\n                      names=row.name,\n                      rank_address=4, rank_search=4,\n                      country_code=row.country_code,\n                      geometry=_filter_geometries(row))\n\n\nasync def add_result_details(conn: SearchConnection, results: List[BaseResultT],\n                             details: LookupDetails) -> None:\n    \"\"\" Retrieve more details from the database according to the\n        parameters specified in 'details'.\n    \"\"\"\n    if results:\n        log().section('Query details for result')\n        if details.address_details:\n            log().comment('Query address details')\n            await complete_address_details(conn, results)\n        if details.linked_places:\n            log().comment('Query linked places')\n            for result in results:\n                await complete_linked_places(conn, result)\n        if details.parented_places:\n            log().comment('Query parent places')\n            for result in results:\n                await complete_parented_places(conn, result)\n        if details.entrances:\n            log().comment('Query entrances details')\n            await complete_entrances_details(conn, results)\n        if details.keywords:\n            log().comment('Query keywords')\n            for result in results:\n                await complete_keywords(conn, result)\n\n\ndef _result_row_to_address_row(row: SaRow, isaddress: Optional[bool] = None) -> AddressLine:\n    \"\"\" Create a new AddressLine from the results of a database query.\n    \"\"\"\n    extratags: Dict[str, str] = getattr(row, 'extratags', {}) or {}\n    if 'linked_place' in extratags:\n        extratags['place'] = extratags['linked_place']\n\n    names = _mingle_name_tags(row.name) or {}\n    if getattr(row, 'housenumber', None) is not None:\n        names['housenumber'] = row.housenumber\n\n    if isaddress is None:\n        isaddress = getattr(row, 'isaddress', True)\n\n    return AddressLine(place_id=row.place_id,\n                       osm_object=None if row.osm_type is None else (row.osm_type, row.osm_id),\n                       category=(getattr(row, 'class'), row.type),\n                       names=names,\n                       extratags=extratags,\n                       admin_level=row.admin_level,\n                       fromarea=row.fromarea,\n                       isaddress=isaddress,\n                       rank_address=row.rank_address,\n                       distance=row.distance)\n\n\ndef _get_address_lookup_id(result: BaseResultT) -> int:\n    assert result.place_id\n    if result.source_table != SourceTable.PLACEX or result.rank_search > 27:\n        return result.parent_place_id or result.place_id\n\n    return result.linked_place_id or result.place_id\n\n\nasync def _finalize_entry(conn: SearchConnection, result: BaseResultT) -> None:\n    assert result.address_rows is not None\n\n    postcode = result.postcode or (result.address and result.address.get('postcode'))\n    if postcode and ',' not in postcode and ';' not in postcode:\n        result.address_rows.append(AddressLine(\n            category=('place', 'postcode'),\n            names={'ref': postcode},\n            fromarea=False, isaddress=True, rank_address=5,\n            distance=0.0))\n\n    if result.country_code:\n        async def _get_country_names() -> Optional[Dict[str, str]]:\n            t = conn.t.country_name\n            sql = sa.select(t.c.name, t.c.derived_name)\\\n                    .where(t.c.country_code == result.country_code)\n            for cres in await conn.execute(sql):\n                names = cast(Dict[str, str], cres[0])\n                if cres[1]:\n                    names.update(cast(Dict[str, str], cres[1]))\n                return names\n            return None\n\n        country_names = await conn.get_cached_value('COUNTRY_NAME',\n                                                    result.country_code,\n                                                    _get_country_names)\n        if country_names:\n            result.address_rows.append(AddressLine(\n                category=('place', 'country'),\n                names=country_names,\n                fromarea=False, isaddress=True, rank_address=4,\n                distance=0.0))\n        result.address_rows.append(AddressLine(\n            category=('place', 'country_code'),\n            names={'ref': result.country_code}, extratags={},\n            fromarea=True, isaddress=False, rank_address=4,\n            distance=0.0))\n\n\ndef _setup_address_details(result: BaseResultT) -> None:\n    \"\"\" Retrieve information about places that make up the address of the result.\n    \"\"\"\n    result.address_rows = AddressLines()\n    if result.names:\n        result.address_rows.append(AddressLine(\n            place_id=result.place_id,\n            osm_object=result.osm_object,\n            category=result.category,\n            names=result.names,\n            extratags=result.extratags or {},\n            admin_level=result.admin_level,\n            fromarea=True, isaddress=True,\n            rank_address=result.rank_address, distance=0.0))\n    if result.source_table == SourceTable.PLACEX and result.address:\n        housenumber = result.address.get('housenumber')\\\n                      or result.address.get('streetnumber')\\\n                      or result.address.get('conscriptionnumber')\n    elif result.housenumber:\n        housenumber = result.housenumber\n    else:\n        housenumber = None\n    if housenumber:\n        result.address_rows.append(AddressLine(\n            category=('place', 'house_number'),\n            names={'ref': housenumber},\n            fromarea=True, isaddress=True, rank_address=28, distance=0))\n    if result.address and '_unlisted_place' in result.address:\n        result.address_rows.append(AddressLine(\n            category=('place', 'locality'),\n            names={'name': result.address['_unlisted_place']},\n            fromarea=False, isaddress=True, rank_address=25, distance=0))\n\n\nasync def complete_address_details(conn: SearchConnection, results: List[BaseResultT]) -> None:\n    \"\"\" Retrieve information about places that make up the address of the result.\n    \"\"\"\n    for result in results:\n        _setup_address_details(result)\n\n    # Lookup entries from place_address line\n\n    lookup_ids = [{'pid': r.place_id,\n                   'lid': _get_address_lookup_id(r),\n                   'names': list(r.address.values()) if r.address else [],\n                   'c': ('SRID=4326;' + r.centroid.to_wkt()) if r.centroid else ''}\n                  for r in results if r.place_id]\n\n    if not lookup_ids:\n        return\n\n    ltab = sa.func.JsonArrayEach(sa.type_coerce(lookup_ids, sa.JSON))\\\n             .table_valued(sa.column('value', type_=sa.JSON))\n\n    t = conn.t.placex\n    taddr = conn.t.addressline\n\n    sql = sa.select(ltab.c.value['pid'].as_integer().label('src_place_id'),\n                    t.c.place_id, t.c.osm_type, t.c.osm_id, t.c.name,\n                    t.c.class_, t.c.type, t.c.extratags,\n                    t.c.admin_level, taddr.c.fromarea,\n                    sa.case((t.c.rank_address == 11, 5),\n                            else_=t.c.rank_address).label('rank_address'),\n                    taddr.c.distance, t.c.country_code, t.c.postcode)\\\n            .join(taddr, sa.or_(taddr.c.place_id == ltab.c.value['pid'].as_integer(),\n                                taddr.c.place_id == ltab.c.value['lid'].as_integer()))\\\n            .join(t, taddr.c.address_place_id == t.c.place_id)\\\n            .order_by('src_place_id')\\\n            .order_by(sa.column('rank_address').desc())\\\n            .order_by((taddr.c.place_id == ltab.c.value['pid'].as_integer()).desc())\\\n            .order_by(sa.case((sa.func.CrosscheckNames(t.c.name, ltab.c.value['names']), 2),\n                              (taddr.c.isaddress, 0),\n                              (sa.and_(taddr.c.fromarea,\n                                       t.c.geometry.ST_Contains(\n                                           sa.func.ST_GeomFromEWKT(\n                                               ltab.c.value['c'].as_string()))), 1),\n                              else_=-1).desc())\\\n            .order_by(taddr.c.fromarea.desc())\\\n            .order_by(taddr.c.distance.desc())\\\n            .order_by(t.c.rank_search.desc())\n\n    current_result = None\n    current_rank_address = -1\n    for row in await conn.execute(sql):\n        if current_result is None or row.src_place_id != current_result.place_id:\n            current_result = next((r for r in results if r.place_id == row.src_place_id), None)\n            assert current_result is not None\n            current_rank_address = -1\n\n        location_isaddress = row.rank_address != current_rank_address\n\n        if current_result.country_code is None and row.country_code:\n            current_result.country_code = row.country_code\n\n        assert current_result.address_rows is not None\n        current_result.address_rows.append(_result_row_to_address_row(row, location_isaddress))\n        current_rank_address = row.rank_address\n\n    for result in results:\n        await _finalize_entry(conn, result)\n\n    # Finally add the record for the parent entry where necessary.\n\n    parent_lookup_ids = list(filter(lambda e: e['pid'] != e['lid'], lookup_ids))\n    if parent_lookup_ids:\n        ltab = sa.func.JsonArrayEach(sa.type_coerce(parent_lookup_ids, sa.JSON))\\\n                 .table_valued(sa.column('value', type_=sa.JSON))\n        sql = sa.select(ltab.c.value['pid'].as_integer().label('src_place_id'),\n                        t.c.place_id, t.c.osm_type, t.c.osm_id, t.c.name,\n                        t.c.class_, t.c.type, t.c.extratags,\n                        t.c.admin_level,\n                        t.c.rank_address)\\\n                .where(t.c.place_id == ltab.c.value['lid'].as_integer())\n\n        for row in await conn.execute(sql):\n            current_result = next((r for r in results if r.place_id == row.src_place_id), None)\n            assert current_result is not None\n            assert current_result.address_rows is not None\n\n            current_result.address_rows.append(AddressLine(\n                    place_id=row.place_id,\n                    osm_object=(row.osm_type, row.osm_id),\n                    category=(row.class_, row.type),\n                    names=row.name, extratags=row.extratags or {},\n                    admin_level=row.admin_level,\n                    fromarea=True, isaddress=True,\n                    rank_address=row.rank_address, distance=0.0))\n\n    # Now sort everything\n    def mk_sort_key(place_id: Optional[int]) -> Callable[[AddressLine], Tuple[bool, int, bool]]:\n        return lambda a: (a.place_id != place_id, -a.rank_address, a.isaddress)\n\n    for result in results:\n        assert result.address_rows is not None\n        result.address_rows.sort(key=mk_sort_key(result.place_id))\n\n\ndef _placex_select_address_row(conn: SearchConnection,\n                               centroid: Point) -> SaSelect:\n    t = conn.t.placex\n    return sa.select(t.c.place_id, t.c.osm_type, t.c.osm_id, t.c.name,\n                     t.c.class_.label('class'), t.c.type,\n                     t.c.admin_level, t.c.housenumber,\n                     t.c.geometry.is_area().label('fromarea'),\n                     t.c.rank_address,\n                     t.c.geometry.distance_spheroid(\n                       sa.bindparam('centroid', value=centroid, type_=Geometry)).label('distance'))\n\n\nasync def complete_linked_places(conn: SearchConnection, result: BaseResult) -> None:\n    \"\"\" Retrieve information about places that link to the result.\n    \"\"\"\n    result.linked_rows = AddressLines()\n    if result.source_table != SourceTable.PLACEX:\n        return\n\n    sql = _placex_select_address_row(conn, result.centroid)\\\n        .where(conn.t.placex.c.linked_place_id == result.place_id)\n\n    for row in await conn.execute(sql):\n        result.linked_rows.append(_result_row_to_address_row(row))\n\n\nasync def complete_entrances_details(conn: SearchConnection, results: List[BaseResultT]) -> None:\n    \"\"\" Retrieve information about tagged entrances for the given results.\n    \"\"\"\n    place_ids = (r.place_id for r in results if r.source_table == SourceTable.PLACEX)\n\n    t = conn.t.placex_entrance\n    sql = sa.select(t.c.place_id, t.c.osm_id, t.c.type, t.c.location, t.c.extratags)\\\n            .where(t.c.place_id.in_(place_ids))\n\n    current_result = None\n    for row in await conn.execute(sql):\n        if current_result is None or row.place_id != current_result.place_id:\n            current_result = next((r for r in results if r.place_id == row.place_id), None)\n            assert current_result is not None\n        if current_result.entrances is None:\n            current_result.entrances = []\n        current_result.entrances.append(EntranceDetails(\n            osm_id=row.osm_id,\n            type=row.type,\n            location=Point.from_wkb(row.location),\n            extratags=row.extratags,\n            ))\n\n\nasync def complete_keywords(conn: SearchConnection, result: BaseResult) -> None:\n    \"\"\" Retrieve information about the search terms used for this place.\n\n        Requires that the query analyzer was initialised to get access to\n        the word table.\n    \"\"\"\n    t = conn.t.search_name\n    sql = sa.select(t.c.name_vector, t.c.nameaddress_vector)\\\n            .where(t.c.place_id == result.place_id)\n\n    result.name_keywords = []\n    result.address_keywords = []\n\n    t = conn.t.meta.tables['word']\n    sel = sa.select(t.c.word_id, t.c.word_token, t.c.word)\n\n    for name_tokens, address_tokens in await conn.execute(sql):\n        for row in await conn.execute(sel.where(t.c.word_id.in_(name_tokens))):\n            result.name_keywords.append(WordInfo(*row))\n\n        for row in await conn.execute(sel.where(t.c.word_id.in_(address_tokens))):\n            result.address_keywords.append(WordInfo(*row))\n\n\nasync def complete_parented_places(conn: SearchConnection, result: BaseResult) -> None:\n    \"\"\" Retrieve information about places that the result provides the\n        address for.\n    \"\"\"\n    result.parented_rows = AddressLines()\n    if result.source_table != SourceTable.PLACEX:\n        return\n\n    sql = _placex_select_address_row(conn, result.centroid)\\\n        .where(conn.t.placex.c.parent_place_id == result.place_id)\\\n        .where(conn.t.placex.c.rank_search == 30)\n\n    for row in await conn.execute(sql):\n        result.parented_rows.append(_result_row_to_address_row(row))\n"
  },
  {
    "path": "src/nominatim_api/reverse.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImplementation of reverse geocoding.\n\"\"\"\nfrom typing import Optional, List, Callable, Type, Tuple, Dict, Any, cast, Union\nimport functools\n\nimport sqlalchemy as sa\n\nfrom .typing import SaColumn, SaSelect, SaFromClause, SaLabel, SaRow, \\\n                    SaBind, SaLambdaSelect\nfrom .sql.sqlalchemy_types import Geometry\nfrom .connection import SearchConnection\nfrom . import results as nres\nfrom .logging import log\nfrom .types import AnyPoint, DataLayer, ReverseDetails, GeometryFormat, Bbox\n\n\nRowFunc = Callable[[SaRow, Type[nres.ReverseResult]], nres.ReverseResult]\n\nWKT_PARAM: SaBind = sa.bindparam('wkt', type_=Geometry)\nMAX_RANK_PARAM: SaBind = sa.bindparam('max_rank')\n\n\ndef no_index(expr: SaColumn) -> SaColumn:\n    \"\"\" Wrap the given expression, so that the query planner will\n        refrain from using the expression for index lookup.\n    \"\"\"\n    return sa.func.coalesce(sa.null(), expr)\n\n\ndef _select_from_placex(t: SaFromClause, use_wkt: bool = True) -> SaSelect:\n    \"\"\" Create a select statement with the columns relevant for reverse\n        results.\n    \"\"\"\n    if not use_wkt:\n        distance = t.c.distance\n        centroid = t.c.centroid\n    else:\n        distance = t.c.geometry.ST_Distance(WKT_PARAM)\n        centroid = sa.case((t.c.geometry.is_line_like(), t.c.geometry.ST_ClosestPoint(WKT_PARAM)),\n                           else_=t.c.centroid).label('centroid')\n\n    return sa.select(t.c.place_id, t.c.osm_type, t.c.osm_id, t.c.name,\n                     t.c.class_, t.c.type,\n                     t.c.address, t.c.extratags,\n                     t.c.housenumber, t.c.postcode, t.c.country_code,\n                     t.c.importance, t.c.wikipedia,\n                     t.c.parent_place_id, t.c.rank_address, t.c.rank_search,\n                     centroid,\n                     t.c.linked_place_id, t.c.admin_level,\n                     distance.label('distance'),\n                     t.c.geometry.ST_Expand(0).label('bbox'))\n\n\ndef _interpolated_housenumber(table: SaFromClause) -> SaLabel:\n    return sa.cast(table.c.startnumber\n                   + sa.func.round(((table.c.endnumber - table.c.startnumber) * table.c.position)\n                                   / table.c.step) * table.c.step,\n                   sa.Integer).label('housenumber')\n\n\ndef _interpolated_position(table: SaFromClause) -> SaLabel:\n    fac = sa.cast(table.c.step, sa.Float) / (table.c.endnumber - table.c.startnumber)\n    rounded_pos = sa.func.round(table.c.position / fac) * fac\n    return sa.case(\n        (table.c.endnumber == table.c.startnumber, table.c.linegeo.ST_Centroid()),\n        else_=table.c.linegeo.ST_LineInterpolatePoint(rounded_pos)).label('centroid')\n\n\ndef _locate_interpolation(table: SaFromClause) -> SaLabel:\n    \"\"\" Given a position, locate the closest point on the line.\n    \"\"\"\n    return sa.case((table.c.linegeo.is_line_like(),\n                    table.c.linegeo.ST_LineLocatePoint(WKT_PARAM)),\n                   else_=0).label('position')\n\n\ndef _get_closest(*rows: Optional[SaRow]) -> Optional[SaRow]:\n    return min(rows, key=lambda row: 1000 if row is None else row.distance)\n\n\nclass ReverseGeocoder:\n    \"\"\" Class implementing the logic for looking up a place from a\n        coordinate.\n    \"\"\"\n\n    def __init__(self, conn: SearchConnection, params: ReverseDetails,\n                 restrict_to_country_areas: bool = False) -> None:\n        self.conn = conn\n        self.params = params\n        self.restrict_to_country_areas = restrict_to_country_areas\n\n        self.bind_params: Dict[str, Any] = {'max_rank': params.max_rank}\n\n    @property\n    def max_rank(self) -> int:\n        \"\"\" Return the maximum configured rank.\n        \"\"\"\n        return self.params.max_rank\n\n    def has_geometries(self) -> bool:\n        \"\"\" Check if any geometries are requested.\n        \"\"\"\n        return bool(self.params.geometry_output)\n\n    def layer_enabled(self, *layer: DataLayer) -> bool:\n        \"\"\" Return true when any of the given layer types are requested.\n        \"\"\"\n        return any(self.params.layers & ly for ly in layer)\n\n    def layer_disabled(self, *layer: DataLayer) -> bool:\n        \"\"\" Return true when none of the given layer types is requested.\n        \"\"\"\n        return not any(self.params.layers & ly for ly in layer)\n\n    def has_feature_layers(self) -> bool:\n        \"\"\" Return true if any layer other than ADDRESS or POI is requested.\n        \"\"\"\n        return self.layer_enabled(DataLayer.RAILWAY, DataLayer.MANMADE, DataLayer.NATURAL)\n\n    def _add_geometry_columns(self, sql: SaLambdaSelect, col: SaColumn) -> SaSelect:\n        out = []\n\n        if self.params.geometry_simplification > 0.0:\n            col = sa.func.ST_SimplifyPreserveTopology(col, self.params.geometry_simplification)\n\n        if self.params.geometry_output & GeometryFormat.GEOJSON:\n            out.append(sa.func.ST_AsGeoJSON(col, 7).label('geometry_geojson'))\n        if self.params.geometry_output & GeometryFormat.TEXT:\n            out.append(sa.func.ST_AsText(col).label('geometry_text'))\n        if self.params.geometry_output & GeometryFormat.KML:\n            out.append(sa.func.ST_AsKML(col, 7).label('geometry_kml'))\n        if self.params.geometry_output & GeometryFormat.SVG:\n            out.append(sa.func.ST_AsSVG(col, 0, 7).label('geometry_svg'))\n\n        return sql.add_columns(*out)\n\n    def _filter_by_layer(self, table: SaFromClause) -> SaColumn:\n        if self.layer_enabled(DataLayer.MANMADE):\n            exclude = []\n            if self.layer_disabled(DataLayer.RAILWAY):\n                exclude.append('railway')\n            if self.layer_disabled(DataLayer.NATURAL):\n                exclude.extend(('natural', 'water', 'waterway'))\n            return table.c.class_.not_in(tuple(exclude))\n\n        include = []\n        if self.layer_enabled(DataLayer.RAILWAY):\n            include.append('railway')\n        if self.layer_enabled(DataLayer.NATURAL):\n            include.extend(('natural', 'water', 'waterway'))\n        return table.c.class_.in_(tuple(include))\n\n    async def _find_closest_street_or_pois(self, distance: float,\n                                           fuzziness: float) -> list[SaRow]:\n        \"\"\" Look up the closest rank 26+ place in the database.\n            The function finds the object that is closest to the reverse\n            search point as well as all objects within 'fuzziness' distance\n            to that best result.\n        \"\"\"\n        t = self.conn.t.placex\n\n        # PostgreSQL must not get the distance as a parameter because\n        # there is a danger it won't be able to properly estimate index use\n        # when used with prepared statements\n        diststr = sa.text(f\"{distance + fuzziness}\")\n\n        sql: SaLambdaSelect = sa.lambda_stmt(\n            lambda: _select_from_placex(t)\n            .where(t.c.geometry.within_distance(WKT_PARAM, diststr))\n            .where(t.c.indexed_status == 0)\n            .where(t.c.linked_place_id == None)\n            .where(sa.or_(sa.not_(t.c.geometry.is_area()),\n                          t.c.centroid.ST_Distance(WKT_PARAM) < diststr)))\n\n        if self.has_geometries():\n            sql = self._add_geometry_columns(sql, t.c.geometry)\n\n        restrict: List[Union[SaColumn, Callable[[], SaColumn]]] = []\n\n        if self.layer_enabled(DataLayer.ADDRESS):\n            max_rank = min(29, self.max_rank)\n            restrict.append(lambda: no_index(t.c.rank_address).between(26, max_rank))\n            if self.max_rank == 30:\n                restrict.append(lambda: sa.func.IsAddressPoint(t))\n        if self.layer_enabled(DataLayer.POI) and self.max_rank == 30:\n            restrict.append(lambda: sa.and_(no_index(t.c.rank_search) == 30,\n                                            t.c.class_.not_in(('place', 'building')),\n                                            sa.not_(t.c.geometry.is_line_like())))\n        if self.has_feature_layers():\n            restrict.append(sa.and_(no_index(t.c.rank_search).between(26, MAX_RANK_PARAM),\n                                    no_index(t.c.rank_address) == 0,\n                                    self._filter_by_layer(t)))\n\n        if not restrict:\n            return []\n\n        inner = sql.where(sa.or_(*restrict)) \\\n                   .add_columns(t.c.geometry.label('_geometry')) \\\n                   .subquery()\n\n        # Use a window function to get the closest results to the best result.\n        windowed = sa.select(inner,\n                             sa.func.first_value(inner.c.distance)\n                                    .over(order_by=inner.c.distance)\n                                    .label('_min_distance'),\n                             sa.func.first_value(\n                                        sa.case((inner.c.rank_search <= 27,\n                                                 inner.c._geometry.ST_ClosestPoint(WKT_PARAM)),\n                                                else_=None))\n                                    .over(order_by=inner.c.distance)\n                                    .label('_closest_point'),\n                             sa.func.first_value(sa.case((sa.or_(inner.c.rank_search <= 27,\n                                                                 inner.c.osm_type == 'N'), None),\n                                                         else_=inner.c._geometry))\n                                    .over(order_by=inner.c.distance)\n                                    .label('_best_geometry')) \\\n                     .subquery()\n\n        outer = sa.select(*(c for c in windowed.c if not c.key.startswith('_')),\n                          sa.case((sa.or_(windowed.c._closest_point == None,\n                                          windowed.c.housenumber == None), None),\n                                  else_=windowed.c.centroid.ST_Distance(windowed.c._closest_point))\n                            .label('distance_from_best'),\n                          sa.case((sa.or_(windowed.c._best_geometry == None,\n                                          windowed.c.rank_search <= 27,\n                                          windowed.c.osm_type != 'N'), False),\n                                  else_=windowed.c.centroid.ST_CoveredBy(windowed.c._best_geometry))\n                            .label('best_inside')) \\\n                  .where(windowed.c.distance < windowed.c._min_distance + fuzziness) \\\n                  .order_by(windowed.c.distance)\n\n        return list(await self.conn.execute(outer, self.bind_params))\n\n    async def _find_housenumber_for_street(self, parent_place_id: int) -> Optional[SaRow]:\n        t = self.conn.t.placex\n\n        def _base_query() -> SaSelect:\n            return _select_from_placex(t)\\\n                .where(t.c.geometry.within_distance(WKT_PARAM, 0.001))\\\n                .where(t.c.parent_place_id == parent_place_id)\\\n                .where(sa.func.IsAddressPoint(t))\\\n                .where(t.c.indexed_status == 0)\\\n                .where(t.c.linked_place_id == None)\\\n                .order_by('distance')\\\n                .limit(1)\n\n        sql: SaLambdaSelect\n        if self.has_geometries():\n            sql = self._add_geometry_columns(_base_query(), t.c.geometry)\n        else:\n            sql = sa.lambda_stmt(_base_query)\n\n        return (await self.conn.execute(sql, self.bind_params)).one_or_none()\n\n    async def _find_interpolation_for_street(self, parent_place_id: Optional[int],\n                                             distance: float) -> Optional[SaRow]:\n        t = self.conn.t.osmline\n\n        sql = sa.select(t,\n                        t.c.linegeo.ST_Distance(WKT_PARAM).label('distance'),\n                        _locate_interpolation(t))\\\n                .where(t.c.linegeo.within_distance(WKT_PARAM, distance))\\\n                .where(t.c.startnumber != None)\\\n                .order_by('distance')\\\n                .limit(1)\n\n        if parent_place_id is not None:\n            sql = sql.where(t.c.parent_place_id == parent_place_id)\n\n        inner = sql.subquery('ipol')\n\n        sql = sa.select(inner.c.place_id, inner.c.osm_id,\n                        inner.c.parent_place_id, inner.c.address,\n                        _interpolated_housenumber(inner),\n                        _interpolated_position(inner),\n                        inner.c.postcode, inner.c.country_code,\n                        inner.c.distance)\n\n        if self.has_geometries():\n            sub = sql.subquery('geom')\n            sql = self._add_geometry_columns(sa.select(sub), sub.c.centroid)\n\n        return (await self.conn.execute(sql, self.bind_params)).one_or_none()\n\n    async def _find_tiger_number_for_street(self, parent_place_id: int) -> Optional[SaRow]:\n        t = self.conn.t.tiger\n\n        def _base_query() -> SaSelect:\n            inner = sa.select(t,\n                              t.c.linegeo.ST_Distance(WKT_PARAM).label('distance'),\n                              _locate_interpolation(t))\\\n                      .where(t.c.linegeo.within_distance(WKT_PARAM, 0.001))\\\n                      .where(t.c.parent_place_id == parent_place_id)\\\n                      .order_by('distance')\\\n                      .limit(1)\\\n                      .subquery('tiger')\n\n            return sa.select(inner.c.place_id,\n                             inner.c.parent_place_id,\n                             _interpolated_housenumber(inner),\n                             _interpolated_position(inner),\n                             inner.c.postcode,\n                             inner.c.distance)\n\n        sql: SaLambdaSelect\n        if self.has_geometries():\n            sub = _base_query().subquery('geom')\n            sql = self._add_geometry_columns(sa.select(sub), sub.c.centroid)\n        else:\n            sql = sa.lambda_stmt(_base_query)\n\n        return (await self.conn.execute(sql, self.bind_params)).one_or_none()\n\n    async def lookup_street_poi(self) -> Tuple[Optional[SaRow], RowFunc]:\n        \"\"\" Find a street or POI/address for the given WKT point.\n        \"\"\"\n        log().section('Reverse lookup on street/address level')\n        row_func: RowFunc = nres.create_from_placex_row\n        distance = 0.006\n\n        result = None\n        hnr_distance = None\n        parent_street = None\n        for row in await self._find_closest_street_or_pois(distance, 0.001):\n            if result is None:\n                log().var_dump('Closest result', row)\n                result = row\n                if self.max_rank > 27 \\\n                        and self.layer_enabled(DataLayer.ADDRESS) \\\n                        and result.rank_address <= 27:\n                    parent_street = result.place_id\n                    distance = 0.001\n                else:\n                    distance = row.distance\n            # If the closest result was a street but an address was requested,\n            # see if we can refine the result with a housenumber closeby.\n            elif parent_street is not None \\\n                    and row.distance_from_best is not None \\\n                    and row.distance_from_best < 0.001 \\\n                    and (hnr_distance is None or hnr_distance > row.distance_from_best) \\\n                    and row.parent_place_id == parent_street:\n                log().var_dump('Housenumber to closest result', row)\n                result = row\n                hnr_distance = row.distance_from_best\n                distance = row.distance\n            # If the closest object is inside an area, then check if there is\n            # a POI nearby and return that with preference.\n            elif result.osm_type != 'N' and result.rank_search > 27 \\\n                    and result.distance == 0 \\\n                    and row.best_inside:\n                log().var_dump('POI near closest result area', row)\n                result = row\n                break  # it can't get better than that, everything else is farther away\n\n        # For the US also check the TIGER data, when no housenumber/POI was found.\n        if result is not None and parent_street is not None and hnr_distance is None \\\n                and result.country_code == 'us':\n            log().comment('Find TIGER housenumber for street')\n            addr_row = await self._find_tiger_number_for_street(parent_street)\n            log().var_dump('Result (street Tiger housenumber)', addr_row)\n\n            if addr_row is not None:\n                row_func = cast(RowFunc,\n                                functools.partial(nres.create_from_tiger_row,\n                                                  osm_type=row.osm_type,\n                                                  osm_id=row.osm_id))\n                result = addr_row\n\n        # Check for an interpolation that is either closer than our result\n        # or belongs to a close street found.\n        # No point in doing this when the result is already inside a building,\n        # i.e. when the distance is already 0.\n        if self.max_rank > 27 and self.layer_enabled(DataLayer.ADDRESS) and distance > 0:\n            log().comment('Find interpolation for street')\n            addr_row = await self._find_interpolation_for_street(parent_street, distance)\n            log().var_dump('Result (street interpolation)', addr_row)\n            if addr_row is not None:\n                return addr_row, nres.create_from_osmline_row\n\n        return result, row_func\n\n    async def _lookup_area_address(self) -> Optional[SaRow]:\n        \"\"\" Lookup large addressable areas for the given WKT point.\n        \"\"\"\n        log().comment('Reverse lookup by larger address area features')\n        t = self.conn.t.placex\n\n        def _base_query() -> SaSelect:\n            # The inner SQL brings results in the right order, so that\n            # later only a minimum of results needs to be checked with ST_Contains.\n            inner = sa.select(t, sa.literal(0.0).label('distance'))\\\n                      .where(t.c.rank_search.between(5, MAX_RANK_PARAM))\\\n                      .where(t.c.rank_address != 5)\\\n                      .where(t.c.rank_address != 11)\\\n                      .where(t.c.geometry.intersects(WKT_PARAM))\\\n                      .where(sa.func.PlacexGeometryReverseLookuppolygon())\\\n                      .order_by(sa.desc(t.c.rank_search))\\\n                      .limit(50)\\\n                      .subquery('area')\n\n            return _select_from_placex(inner, False)\\\n                .where(inner.c.geometry.ST_Contains(WKT_PARAM))\\\n                .order_by(sa.desc(inner.c.rank_search))\\\n                .limit(1)\n\n        sql: SaLambdaSelect = sa.lambda_stmt(_base_query)\n        if self.has_geometries():\n            sql = self._add_geometry_columns(sql, sa.literal_column('area.geometry'))\n\n        address_row = (await self.conn.execute(sql, self.bind_params)).one_or_none()\n        log().var_dump('Result (area)', address_row)\n\n        if address_row is not None and address_row.rank_search < self.max_rank:\n            log().comment('Search for better matching place nodes inside the area')\n\n            address_rank = address_row.rank_search\n            address_id = address_row.place_id\n\n            def _place_inside_area_query() -> SaSelect:\n                inner = \\\n                    sa.select(t, t.c.geometry.ST_Distance(WKT_PARAM).label('distance'))\\\n                    .where(t.c.rank_search > address_rank)\\\n                    .where(t.c.rank_search <= MAX_RANK_PARAM)\\\n                    .where(t.c.indexed_status == 0)\\\n                    .where(sa.func.IntersectsReverseDistance(t, WKT_PARAM))\\\n                    .order_by(sa.desc(t.c.rank_search))\\\n                    .limit(50)\\\n                    .subquery('places')\n\n                touter = t.alias('outer')\n                return _select_from_placex(inner, False)\\\n                    .join(touter, touter.c.geometry.ST_Contains(inner.c.geometry))\\\n                    .where(touter.c.place_id == address_id)\\\n                    .where(sa.func.IsBelowReverseDistance(inner.c.distance, inner.c.rank_search))\\\n                    .order_by(sa.desc(inner.c.rank_search), inner.c.distance)\\\n                    .limit(1)\n\n            if self.has_geometries():\n                sql = self._add_geometry_columns(_place_inside_area_query(),\n                                                 sa.literal_column('places.geometry'))\n            else:\n                sql = sa.lambda_stmt(_place_inside_area_query)\n\n            place_address_row = (await self.conn.execute(sql, self.bind_params)).one_or_none()\n            log().var_dump('Result (place node)', place_address_row)\n\n            if place_address_row is not None:\n                return place_address_row\n\n        return address_row\n\n    async def _lookup_area_others(self) -> Optional[SaRow]:\n        t = self.conn.t.placex\n\n        inner = sa.select(t, t.c.geometry.ST_Distance(WKT_PARAM).label('distance'))\\\n                  .where(t.c.rank_address == 0)\\\n                  .where(t.c.rank_search.between(5, MAX_RANK_PARAM))\\\n                  .where(t.c.name != None)\\\n                  .where(t.c.indexed_status == 0)\\\n                  .where(t.c.linked_place_id == None)\\\n                  .where(self._filter_by_layer(t))\\\n                  .where(t.c.geometry.intersects(sa.func.ST_Expand(WKT_PARAM, 0.007)))\\\n                  .order_by(sa.desc(t.c.rank_search))\\\n                  .order_by('distance')\\\n                  .limit(50)\\\n                  .subquery()\n\n        sql = _select_from_placex(inner, False)\\\n            .where(sa.or_(sa.not_(inner.c.geometry.is_area()),\n                          inner.c.geometry.ST_Contains(WKT_PARAM)))\\\n            .order_by(sa.desc(inner.c.rank_search), inner.c.distance)\\\n            .limit(1)\n\n        if self.has_geometries():\n            sql = self._add_geometry_columns(sql, inner.c.geometry)\n\n        row = (await self.conn.execute(sql, self.bind_params)).one_or_none()\n        log().var_dump('Result (non-address feature)', row)\n\n        return row\n\n    async def lookup_area(self) -> Optional[SaRow]:\n        \"\"\" Lookup large areas for the current search.\n        \"\"\"\n        log().section('Reverse lookup by larger area features')\n\n        if self.layer_enabled(DataLayer.ADDRESS):\n            address_row = await self._lookup_area_address()\n        else:\n            address_row = None\n\n        if self.has_feature_layers():\n            other_row = await self._lookup_area_others()\n        else:\n            other_row = None\n\n        return _get_closest(address_row, other_row)\n\n    async def lookup_country_codes(self) -> List[str]:\n        \"\"\" Lookup the country for the current search.\n        \"\"\"\n        log().section('Reverse lookup by country code')\n        t = self.conn.t.country_grid\n        sql = sa.select(t.c.country_code).distinct()\\\n                .where(t.c.geometry.ST_Contains(WKT_PARAM))\n\n        ccodes = [cast(str, r[0]) for r in await self.conn.execute(sql, self.bind_params)]\n        log().var_dump('Country codes', ccodes)\n        return ccodes\n\n    async def lookup_country(self, ccodes: List[str]) -> Tuple[Optional[SaRow], RowFunc]:\n        \"\"\" Lookup the country for the current search.\n        \"\"\"\n        row_func = nres.create_from_placex_row\n        if not ccodes:\n            ccodes = await self.lookup_country_codes()\n\n        if not ccodes:\n            return None, row_func\n\n        t = self.conn.t.placex\n        if self.max_rank > 4:\n            log().comment('Search for place nodes in country')\n\n            def _base_query() -> SaSelect:\n                inner = sa.select(t, t.c.geometry.ST_Distance(WKT_PARAM).label('distance'))\\\n                          .where(t.c.rank_search > 4)\\\n                          .where(t.c.rank_search <= MAX_RANK_PARAM)\\\n                          .where(t.c.indexed_status == 0)\\\n                          .where(t.c.country_code.in_(ccodes))\\\n                          .where(sa.func.IntersectsReverseDistance(t, WKT_PARAM))\\\n                          .order_by(sa.desc(t.c.rank_search))\\\n                          .limit(50)\\\n                          .subquery('area')\n\n                return _select_from_placex(inner, False)\\\n                    .where(sa.func.IsBelowReverseDistance(inner.c.distance, inner.c.rank_search))\\\n                    .order_by(sa.desc(inner.c.rank_search), inner.c.distance)\\\n                    .limit(1)\n\n            sql: SaLambdaSelect\n            if self.has_geometries():\n                sql = self._add_geometry_columns(_base_query(),\n                                                 sa.literal_column('area.geometry'))\n            else:\n                sql = sa.lambda_stmt(_base_query)\n\n            address_row = (await self.conn.execute(sql, self.bind_params)).one_or_none()\n            log().var_dump('Result (addressable place node)', address_row)\n        else:\n            address_row = None\n\n        if address_row is None:\n            # Still nothing, then return a country with the appropriate country code.\n            def _country_base_query() -> SaSelect:\n                return _select_from_placex(t)\\\n                         .where(t.c.country_code.in_(ccodes))\\\n                         .where(t.c.rank_address == 4)\\\n                         .where(t.c.rank_search == 4)\\\n                         .where(t.c.linked_place_id == None)\\\n                         .order_by('distance')\\\n                         .limit(1)\n\n            if self.has_geometries():\n                sql = self._add_geometry_columns(_country_base_query(), t.c.geometry)\n            else:\n                sql = sa.lambda_stmt(_country_base_query)\n\n            address_row = (await self.conn.execute(sql, self.bind_params)).one_or_none()\n\n        if address_row is None:\n            # finally fall back to country table\n            t = self.conn.t.country_name\n            tgrid = self.conn.t.country_grid\n\n            sql = sa.select(tgrid.c.country_code,\n                            tgrid.c.geometry.ST_Centroid().ST_Collect().ST_Centroid()\n                                 .label('centroid'),\n                            tgrid.c.geometry.ST_Collect().ST_Expand(0).label('bbox'))\\\n                    .where(tgrid.c.country_code.in_(ccodes))\\\n                    .group_by(tgrid.c.country_code)\n\n            sub = sql.subquery('grid')\n            sql = sa.select(t.c.country_code,\n                            t.c.name.merge(t.c.derived_name).label('name'),\n                            sub.c.centroid, sub.c.bbox)\\\n                    .join(sub, t.c.country_code == sub.c.country_code)\\\n                    .order_by(t.c.country_code)\\\n                    .limit(1)\n\n            sql = self._add_geometry_columns(sql, sub.c.centroid)\n\n            address_row = (await self.conn.execute(sql, self.bind_params)).one_or_none()\n            row_func = nres.create_from_country_row\n\n        return address_row, row_func\n\n    async def lookup(self, coord: AnyPoint) -> Optional[nres.ReverseResult]:\n        \"\"\" Look up a single coordinate. Returns the place information,\n            if a place was found near the coordinates or None otherwise.\n        \"\"\"\n        log().function('reverse_lookup', coord=coord, params=self.params)\n\n        self.bind_params['wkt'] = f'POINT({coord[0]} {coord[1]})'\n\n        row: Optional[SaRow] = None\n        row_func: RowFunc = nres.create_from_placex_row\n\n        if self.max_rank >= 26:\n            row, tmp_row_func = await self.lookup_street_poi()\n            if row is not None:\n                row_func = tmp_row_func\n\n        if row is None:\n            if self.restrict_to_country_areas:\n                ccodes = await self.lookup_country_codes()\n                if not ccodes:\n                    return None\n            else:\n                ccodes = []\n\n            if self.max_rank > 4:\n                row = await self.lookup_area()\n            if row is None and self.layer_enabled(DataLayer.ADDRESS):\n                row, row_func = await self.lookup_country(ccodes)\n\n        if row is None:\n            return None\n\n        result = row_func(row, nres.ReverseResult)\n        result.distance = getattr(row,  'distance', 0)\n        if hasattr(row, 'bbox'):\n            result.bbox = Bbox.from_wkb(row.bbox)\n        await nres.add_result_details(self.conn, [result], self.params)\n\n        return result\n"
  },
  {
    "path": "src/nominatim_api/search/__init__.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nModule for forward search.\n\"\"\"\nfrom .geocoder import (ForwardGeocoder as ForwardGeocoder)\nfrom .query import (Phrase as Phrase,\n                    PHRASE_ANY as PHRASE_ANY,\n                    PHRASE_AMENITY as PHRASE_AMENITY,\n                    PHRASE_STREET as PHRASE_STREET,\n                    PHRASE_CITY as PHRASE_CITY,\n                    PHRASE_COUNTY as PHRASE_COUNTY,\n                    PHRASE_STATE as PHRASE_STATE,\n                    PHRASE_POSTCODE as PHRASE_POSTCODE,\n                    PHRASE_COUNTRY as PHRASE_COUNTRY)\nfrom .query_analyzer_factory import (make_query_analyzer as make_query_analyzer)\n"
  },
  {
    "path": "src/nominatim_api/search/db_search_builder.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nConversion from token assignment to an abstract DB search.\n\"\"\"\nfrom typing import Optional, List, Tuple, Iterator, Dict\nimport heapq\n\nfrom ..types import SearchDetails, DataLayer\nfrom . import query as qmod\nfrom .token_assignment import TokenAssignment\nfrom . import db_search_fields as dbf\nfrom . import db_searches as dbs\nfrom . import db_search_lookups as lookups\n\n\ndef wrap_near_search(categories: List[Tuple[str, str]],\n                     search: dbs.AbstractSearch) -> dbs.NearSearch:\n    \"\"\" Create a new search that wraps the given search in a search\n        for near places of the given category.\n    \"\"\"\n    return dbs.NearSearch(penalty=search.penalty,\n                          categories=dbf.WeightedCategories(categories,\n                                                            [0.0] * len(categories)),\n                          search=search)\n\n\ndef build_poi_search(category: List[Tuple[str, str]],\n                     countries: Optional[List[str]]) -> dbs.PoiSearch:\n    \"\"\" Create a new search for places by the given category, possibly\n        constraint to the given countries.\n    \"\"\"\n    if countries:\n        ccs = dbf.WeightedStrings(countries, [0.0] * len(countries))\n    else:\n        ccs = dbf.WeightedStrings([], [])\n\n    class _PoiData(dbf.SearchData):\n        penalty = 0.0\n        qualifiers = dbf.WeightedCategories(category, [0.0] * len(category))\n        countries = ccs\n\n    return dbs.PoiSearch(_PoiData())\n\n\nclass SearchBuilder:\n    \"\"\" Build the abstract search queries from token assignments.\n    \"\"\"\n\n    def __init__(self, query: qmod.QueryStruct, details: SearchDetails) -> None:\n        self.query = query\n        self.details = details\n\n    @property\n    def configured_for_country(self) -> bool:\n        \"\"\" Return true if the search details are configured to\n            allow countries in the result.\n        \"\"\"\n        return self.details.min_rank <= 4 and self.details.max_rank >= 4 \\\n            and self.details.layer_enabled(DataLayer.ADDRESS)\n\n    @property\n    def configured_for_postcode(self) -> bool:\n        \"\"\" Return true if the search details are configured to\n            allow postcodes in the result.\n        \"\"\"\n        return self.details.min_rank <= 5 and self.details.max_rank >= 11\\\n            and self.details.layer_enabled(DataLayer.ADDRESS)\n\n    @property\n    def configured_for_housenumbers(self) -> bool:\n        \"\"\" Return true if the search details are configured to\n            allow addresses in the result.\n        \"\"\"\n        return self.details.max_rank >= 30 \\\n            and self.details.layer_enabled(DataLayer.ADDRESS)\n\n    def build(self, assignment: TokenAssignment) -> Iterator[dbs.AbstractSearch]:\n        \"\"\" Yield all possible abstract searches for the given token assignment.\n        \"\"\"\n        sdata = self.get_search_data(assignment)\n        if sdata is None:\n            return\n\n        near_items = self.get_near_items(assignment)\n        if near_items is not None and not near_items:\n            return  # impossible combination of near items and category parameter\n\n        if assignment.name is None:\n            if near_items and not sdata.postcodes:\n                sdata.qualifiers = near_items\n                near_items = None\n                builder = self.build_poi_search(sdata)\n            elif assignment.housenumber:\n                hnr_tokens = self.query.get_tokens(assignment.housenumber,\n                                                   qmod.TOKEN_HOUSENUMBER)\n                builder = self.build_housenumber_search(sdata, hnr_tokens, assignment.address)\n            else:\n                builder = self.build_special_search(sdata, assignment.address,\n                                                    bool(near_items))\n        else:\n            builder = self.build_name_search(sdata, assignment.name, assignment.address,\n                                             bool(near_items))\n\n        if near_items:\n            penalty = min(near_items.penalties)\n            near_items.penalties = [p - penalty for p in near_items.penalties]\n            for search in builder:\n                search_penalty = search.penalty\n                search.penalty = 0.0\n                yield dbs.NearSearch(penalty + assignment.penalty + search_penalty,\n                                     near_items, search)\n        else:\n            for search in builder:\n                search.penalty += assignment.penalty\n                yield search\n\n    def build_poi_search(self, sdata: dbf.SearchData) -> Iterator[dbs.AbstractSearch]:\n        \"\"\" Build abstract search query for a simple category search.\n            This kind of search requires an additional geographic constraint.\n        \"\"\"\n        if not sdata.housenumbers \\\n           and ((self.details.viewbox and self.details.bounded_viewbox) or self.details.near):\n            yield dbs.PoiSearch(sdata)\n\n    def build_special_search(self, sdata: dbf.SearchData,\n                             address: List[qmod.TokenRange],\n                             is_category: bool) -> Iterator[dbs.AbstractSearch]:\n        \"\"\" Build abstract search queries for searches that do not involve\n            a named place.\n        \"\"\"\n        if sdata.qualifiers:\n            # No special searches over qualifiers supported.\n            return\n\n        if sdata.countries and not address and not sdata.postcodes \\\n           and self.configured_for_country:\n            yield dbs.CountrySearch(sdata)\n\n        if sdata.postcodes and (is_category or self.configured_for_postcode):\n            penalty = 0.0 if sdata.countries else 0.1\n            if address:\n                sdata.lookups = [dbf.FieldLookup('nameaddress_vector',\n                                                 [t.token for r in address\n                                                  for t in self.query.iter_partials(r)],\n                                                 lookups.Restrict)]\n            yield dbs.PostcodeSearch(penalty, sdata)\n\n    def build_housenumber_search(self, sdata: dbf.SearchData, hnrs: List[qmod.Token],\n                                 address: List[qmod.TokenRange]) -> Iterator[dbs.AbstractSearch]:\n        \"\"\" Build a simple address search for special entries where the\n            housenumber is the main name token.\n        \"\"\"\n        partials = dbf.CountedTokenIDs((t for trange in address\n                                        for t in self.query.iter_partials(trange)),\n                                       'addr_count')\n\n        if not partials:\n            # can happen when none of the partials is indexed\n            return\n\n        expected_count = sum(t.count for t in hnrs)\n        hnr_tokens = [t.token for t in hnrs]\n\n        if expected_count < 10000:\n            sdata.lookups = [dbf.FieldLookup('name_vector', hnr_tokens, lookups.LookupAny),\n                             dbf.FieldLookup('nameaddress_vector',\n                                             partials.get_tokens(),\n                                             lookups.Restrict)]\n        else:\n            split = partials.get_num_lookup_tokens(20000, 5)\n            if split > 0:\n                sdata.lookups = partials.split_lookup(split, 'nameaddress_vector')\n                sdata.lookups.append(\n                    dbf.FieldLookup('name_vector', hnr_tokens, lookups.Restrict))\n                expected_count = partials.min_count() / (5**(split - 1))\n            else:\n                addr_fulls = [t.token for t in\n                              self.query.get_tokens(address[0], qmod.TOKEN_WORD)]\n                if len(addr_fulls) > 5:\n                    return\n                sdata.lookups = [\n                    dbf.FieldLookup('name_vector', hnr_tokens, lookups.LookupAny),\n                    dbf.FieldLookup('nameaddress_vector', addr_fulls, lookups.LookupAny)]\n\n        sdata.housenumbers = dbf.WeightedStrings([], [])\n        yield dbs.PlaceSearch(0.0, sdata, expected_count, True)\n\n    def build_name_search(self, sdata: dbf.SearchData,\n                          name: qmod.TokenRange, address: List[qmod.TokenRange],\n                          is_category: bool) -> Iterator[dbs.AbstractSearch]:\n        \"\"\" Build abstract search queries for simple name or address searches.\n        \"\"\"\n        if is_category or not sdata.housenumbers or self.configured_for_housenumbers:\n            ranking = self.get_name_ranking(name)\n            name_penalty = ranking.normalize_penalty()\n            if ranking.rankings:\n                sdata.rankings.append(ranking)\n            for penalty, count, lookup in self.yield_lookups(name, address):\n                sdata.lookups = lookup\n                if sdata.housenumbers:\n                    yield dbs.AddressSearch(penalty + name_penalty, sdata, count, bool(address))\n                else:\n                    yield dbs.PlaceSearch(penalty + name_penalty, sdata, count, bool(address))\n\n    def yield_lookups(self, name: qmod.TokenRange, address: List[qmod.TokenRange]\n                      ) -> Iterator[Tuple[float, int, List[dbf.FieldLookup]]]:\n        \"\"\" Yield all variants how the given name and address should best\n            be searched for. This takes into account how frequent the terms\n            are and tries to find a lookup that optimizes index use.\n        \"\"\"\n        name_partials = dbf.CountedTokenIDs(self.query.iter_partials(name))\n        addr_partials = dbf.CountedTokenIDs((t for r in address\n                                             for t in self.query.iter_partials(r)),\n                                            'addr_count')\n\n        if not addr_partials:\n            yield from self.yield_name_only_lookups(name_partials, name)\n        else:\n            yield from self.yield_address_lookups(name_partials, addr_partials, name)\n\n    def yield_name_only_lookups(self, partials: dbf.CountedTokenIDs, name: qmod.TokenRange\n                                ) -> Iterator[Tuple[float, int, List[dbf.FieldLookup]]]:\n        \"\"\" Yield the best lookup for a name-only search.\n        \"\"\"\n        split = partials.get_num_lookup_tokens(30000, 6)\n\n        if split > 0:\n            yield 0.0, partials.expected_for_all_search(5), \\\n                  partials.split_lookup(split, 'name_vector')\n        else:\n            # lots of results expected: try lookup by full names first\n            name_fulls = list(filter(lambda t: t.count < 50000,\n                                     self.query.get_tokens(name, qmod.TOKEN_WORD)))\n            if name_fulls:\n                yield 0.0, sum(t.count for t in name_fulls), \\\n                      dbf.lookup_by_any_name([t.token for t in name_fulls], [], [])\n\n            # look the name up by its partials\n            exp_count = partials.expected_for_all_search(5)\n            if exp_count < 50000:\n                yield 1.0, exp_count, \\\n                      [dbf.FieldLookup('name_vector', partials.get_tokens(), lookups.LookupAll)]\n\n    def yield_address_lookups(self, name_partials: dbf.CountedTokenIDs,\n                              addr_partials: dbf.CountedTokenIDs, name: qmod.TokenRange,\n                              ) -> Iterator[Tuple[float, int, List[dbf.FieldLookup]]]:\n        penalty = 0.0  # extra penalty\n\n        name_split = name_partials.get_num_lookup_tokens(20000, 6)\n        addr_split = addr_partials.get_num_lookup_tokens(10000, 3)\n\n        if name_split < 0 and addr_split < 0:\n            # Partial term too frequent. Try looking up by rare full names first.\n            name_fulls = self.query.get_tokens(name, qmod.TOKEN_WORD)\n            if name_fulls:\n                fulls_count = sum(t.count for t in name_fulls)\n\n                if fulls_count < 80000:\n                    yield 0.0, fulls_count, \\\n                          dbf.lookup_by_any_name([t.token for t in name_fulls],\n                                                 addr_partials.get_tokens(),\n                                                 [])\n                    penalty += 0.2\n            penalty += 0.4\n\n            name_split = name_partials.get_num_lookup_tokens(50000, 10)\n            addr_split = addr_partials.get_num_lookup_tokens(30000, 5)\n\n        if name_split > 0 \\\n           and (addr_split < 0 or name_partials.min_count() <= addr_partials.min_count()):\n            # lookup by name\n            lookup = name_partials.split_lookup(name_split, 'name_vector')\n            lookup.append(dbf.FieldLookup('nameaddress_vector',\n                                          addr_partials.get_tokens(), lookups.Restrict))\n            yield penalty, name_partials.expected_for_all_search(5), lookup\n        elif addr_split > 0:\n            # lookup by address\n            lookup = addr_partials.split_lookup(addr_split, 'nameaddress_vector')\n            lookup.append(dbf.FieldLookup('name_vector',\n                                          name_partials.get_tokens(), lookups.Restrict))\n            yield penalty, addr_partials.expected_for_all_search(3), lookup\n        elif len(name_partials) > 1:\n            penalty += 0.5\n            # To catch remaining results, lookup by name and address\n            # We only do this if there is a reasonable number of results expected.\n            exp_count = min(name_partials.min_count(), addr_partials.min_count())\n            exp_count = int(exp_count / (min(3, len(name_partials)) + min(3, len(addr_partials))))\n            if exp_count < 50000:\n                lookup = name_partials.split_lookup(3, 'name_vector')\n                lookup.extend(addr_partials.split_lookup(3, 'nameaddress_vector'))\n\n                yield penalty, exp_count, lookup\n\n    def get_name_ranking(self, trange: qmod.TokenRange,\n                         db_field: str = 'name_vector') -> dbf.FieldRanking:\n        \"\"\" Create a ranking expression for a name term in the given range.\n        \"\"\"\n        name_fulls = self.query.get_tokens(trange, qmod.TOKEN_WORD)\n        full_word_penalty = self.query.get_in_word_penalty(trange)\n        ranks = [dbf.RankedTokens(t.penalty + full_word_penalty, [t.token])\n                 for t in name_fulls]\n        ranks.sort(key=lambda r: r.penalty)\n        # Fallback, sum of penalty for partials\n        default = sum(t.penalty for t in self.query.iter_partials(trange)) + 0.2\n        default += sum(n.word_break_penalty\n                       for n in self.query.nodes[trange.start + 1:trange.end])\n        return dbf.FieldRanking(db_field, default, ranks)\n\n    def get_addr_ranking(self, trange: qmod.TokenRange) -> dbf.FieldRanking:\n        \"\"\" Create a list of ranking expressions for an address term\n            for the given ranges.\n        \"\"\"\n        todo: List[Tuple[int, int, dbf.RankedTokens]] = []\n        heapq.heappush(todo, (0, trange.start, dbf.RankedTokens(0.0, [])))\n        ranks: List[dbf.RankedTokens] = []\n\n        while todo:\n            _, pos, rank = heapq.heappop(todo)\n            # partial node\n            partial = self.query.nodes[pos].partial\n            if partial is not None:\n                if pos + 1 < trange.end:\n                    penalty = rank.penalty + partial.penalty \\\n                              + self.query.nodes[pos + 1].word_break_penalty\n                    heapq.heappush(todo, (-(pos + 1), pos + 1,\n                                   dbf.RankedTokens(penalty, rank.tokens)))\n                else:\n                    ranks.append(dbf.RankedTokens(rank.penalty + partial.penalty,\n                                                  rank.tokens))\n            # full words\n            for tlist in self.query.nodes[pos].starting:\n                if tlist.ttype == qmod.TOKEN_WORD:\n                    if tlist.end < trange.end:\n                        chgpenalty = self.query.nodes[tlist.end].word_break_penalty \\\n                                     + self.query.get_in_word_penalty(\n                                            qmod.TokenRange(pos, tlist.end))\n                        for t in tlist.tokens:\n                            heapq.heappush(todo, (-tlist.end, tlist.end,\n                                                  rank.with_token(t, chgpenalty)))\n                    elif tlist.end == trange.end:\n                        chgpenalty = self.query.get_in_word_penalty(\n                                        qmod.TokenRange(pos, tlist.end))\n                        ranks.extend(rank.with_token(t, chgpenalty)\n                                     for t in tlist.tokens)\n\n            if len(ranks) >= 10:\n                # Too many variants, bail out and only add\n                # Worst-case Fallback: sum of penalty of partials\n                default = sum(t.penalty for t in self.query.iter_partials(trange)) + 0.2\n                default += sum(n.word_break_penalty\n                               for n in self.query.nodes[trange.start + 1:trange.end])\n                ranks.append(dbf.RankedTokens(rank.penalty + default, []))\n                # Bail out of outer loop\n                break\n\n        ranks.sort(key=lambda r: len(r.tokens))\n        default = ranks[0].penalty + 0.3\n        del ranks[0]\n        ranks.sort(key=lambda r: r.penalty)\n\n        return dbf.FieldRanking('nameaddress_vector', default, ranks)\n\n    def get_search_data(self, assignment: TokenAssignment) -> Optional[dbf.SearchData]:\n        \"\"\" Collect the tokens for the non-name search fields in the\n            assignment.\n        \"\"\"\n        sdata = dbf.SearchData()\n        sdata.penalty = assignment.penalty\n        if assignment.country:\n            tokens = self.get_country_tokens(assignment.country)\n            if not tokens:\n                return None\n            sdata.set_countries(tokens)\n            sdata.penalty += self.query.get_in_word_penalty(assignment.country)\n        elif self.details.countries:\n            sdata.countries = dbf.WeightedStrings(self.details.countries,\n                                                  [0.0] * len(self.details.countries))\n        if assignment.housenumber:\n            sdata.set_strings('housenumbers',\n                              self.query.get_tokens(assignment.housenumber,\n                                                    qmod.TOKEN_HOUSENUMBER))\n            sdata.penalty += self.query.get_in_word_penalty(assignment.housenumber)\n        if assignment.postcode:\n            sdata.set_strings('postcodes',\n                              self.query.get_tokens(assignment.postcode,\n                                                    qmod.TOKEN_POSTCODE))\n            sdata.penalty += self.query.get_in_word_penalty(assignment.postcode)\n        if assignment.qualifier:\n            tokens = self.get_qualifier_tokens(assignment.qualifier)\n            if not tokens:\n                return None\n            sdata.set_qualifiers(tokens)\n            sdata.penalty += self.query.get_in_word_penalty(assignment.qualifier)\n        elif self.details.categories:\n            sdata.qualifiers = dbf.WeightedCategories(self.details.categories,\n                                                      [0.0] * len(self.details.categories))\n\n        if assignment.address:\n            sdata.set_ranking([self.get_addr_ranking(r) for r in assignment.address])\n        else:\n            sdata.rankings = []\n\n        return sdata\n\n    def get_country_tokens(self, trange: qmod.TokenRange) -> List[qmod.Token]:\n        \"\"\" Return the list of country tokens for the given range,\n            optionally filtered by the country list from the details\n            parameters.\n        \"\"\"\n        tokens = self.query.get_tokens(trange, qmod.TOKEN_COUNTRY)\n        if self.details.countries:\n            tokens = [t for t in tokens if t.get_country() in self.details.countries]\n\n        return tokens\n\n    def get_qualifier_tokens(self, trange: qmod.TokenRange) -> List[qmod.Token]:\n        \"\"\" Return the list of qualifier tokens for the given range,\n            optionally filtered by the qualifier list from the details\n            parameters.\n        \"\"\"\n        tokens = self.query.get_tokens(trange, qmod.TOKEN_QUALIFIER)\n        if self.details.categories:\n            tokens = [t for t in tokens if t.get_category() in self.details.categories]\n\n        return tokens\n\n    def get_near_items(self, assignment: TokenAssignment) -> Optional[dbf.WeightedCategories]:\n        \"\"\" Collect tokens for near items search or use the categories\n            requested per parameter.\n            Returns None if no category search is requested.\n        \"\"\"\n        if assignment.near_item:\n            tokens: Dict[Tuple[str, str], float] = {}\n            for t in self.query.get_tokens(assignment.near_item, qmod.TOKEN_NEAR_ITEM):\n                cat = t.get_category()\n                # The category of a near search will be that of near_item.\n                # Thus, if search is restricted to a category parameter,\n                # the two sets must intersect.\n                if (not self.details.categories or cat in self.details.categories)\\\n                   and t.penalty < tokens.get(cat, 1000.0):\n                    tokens[cat] = t.penalty\n            return dbf.WeightedCategories(list(tokens.keys()), list(tokens.values()))\n\n        return None\n"
  },
  {
    "path": "src/nominatim_api/search/db_search_fields.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nData structures for more complex fields in abstract search descriptions.\n\"\"\"\nfrom typing import List, Tuple, Iterator, Dict, Type, cast\nimport dataclasses\n\nimport sqlalchemy as sa\n\nfrom ..typing import SaFromClause, SaColumn, SaExpression\nfrom ..utils.json_writer import JsonWriter\nfrom .query import Token\nfrom . import db_search_lookups as lookups\n\n\nclass CountedTokenIDs:\n    \"\"\" A list of token IDs with their respective counts, sorted\n        from least frequent to most frequent.\n\n        If a token count is one, then statistics are likely to be unavailable\n        and a relatively high count is assumed instead.\n    \"\"\"\n\n    def __init__(self, tokens: Iterator[Token], count_column: str = 'count'):\n        self.tokens = list({(cast(int, getattr(t, count_column)), t.token) for t in tokens})\n        self.tokens.sort(key=lambda t: t[0] if t[0] > 1 else 100000)\n\n    def __len__(self) -> int:\n        return len(self.tokens)\n\n    def get_num_lookup_tokens(self, limit: int, fac: int) -> int:\n        \"\"\" Suggest the number of tokens to be used for an index lookup.\n            The idea here is to use as few items as possible while making\n            sure the number of rows returned stays below 'limit' which\n            makes recheck of the returned rows more expensive than adding\n            another item for the index lookup. 'fac' is the factor by which\n            the limit is increased every time a lookup item is added.\n\n            If the list of tokens doesn't seem suitable at all for index\n            lookup, -1 is returned.\n        \"\"\"\n        length = len(self.tokens)\n        min_count = self.tokens[0][0]\n        if min_count == 1:\n            return min(length, 3)  # no statistics available, use index\n\n        for i in range(min(length, 3)):\n            if min_count < limit:\n                return i + 1\n            limit = limit * fac\n\n        return -1\n\n    def min_count(self) -> int:\n        return self.tokens[0][0]\n\n    def expected_for_all_search(self, fac: int = 5) -> int:\n        return int(self.tokens[0][0] / (fac**(len(self.tokens) - 1)))\n\n    def get_tokens(self) -> List[int]:\n        return [t[1] for t in self.tokens]\n\n    def get_head_tokens(self, num_tokens: int) -> List[int]:\n        return [t[1] for t in self.tokens[:num_tokens]]\n\n    def get_tail_tokens(self, first: int) -> List[int]:\n        return [t[1] for t in self.tokens[first:]]\n\n    def split_lookup(self, split: int, column: str) -> 'List[FieldLookup]':\n        lookup = [FieldLookup(column, self.get_head_tokens(split), lookups.LookupAll)]\n        if split < len(self.tokens):\n            lookup.append(FieldLookup(column, self.get_tail_tokens(split), lookups.Restrict))\n        return lookup\n\n\n@dataclasses.dataclass\nclass WeightedStrings:\n    \"\"\" A list of strings together with a penalty.\n    \"\"\"\n    values: List[str]\n    penalties: List[float]\n\n    def __bool__(self) -> bool:\n        return bool(self.values)\n\n    def __iter__(self) -> Iterator[Tuple[str, float]]:\n        return iter(zip(self.values, self.penalties))\n\n    def get_penalty(self, value: str, default: float = 1000.0) -> float:\n        \"\"\" Get the penalty for the given value. Returns the given default\n            if the value does not exist.\n        \"\"\"\n        try:\n            return self.penalties[self.values.index(value)]\n        except ValueError:\n            pass\n        return default\n\n\n@dataclasses.dataclass\nclass WeightedCategories:\n    \"\"\" A list of class/type tuples together with a penalty.\n    \"\"\"\n    values: List[Tuple[str, str]]\n    penalties: List[float]\n\n    def __bool__(self) -> bool:\n        return bool(self.values)\n\n    def __iter__(self) -> Iterator[Tuple[Tuple[str, str], float]]:\n        return iter(zip(self.values, self.penalties))\n\n    def get_penalty(self, value: Tuple[str, str], default: float = 1000.0) -> float:\n        \"\"\" Get the penalty for the given value. Returns the given default\n            if the value does not exist.\n        \"\"\"\n        try:\n            return self.penalties[self.values.index(value)]\n        except ValueError:\n            pass\n        return default\n\n    def sql_restrict(self, table: SaFromClause) -> SaExpression:\n        \"\"\" Return an SQLAlcheny expression that restricts the\n            class and type columns of the given table to the values\n            in the list.\n            Must not be used with an empty list.\n        \"\"\"\n        assert self.values\n        if len(self.values) == 1:\n            return sa.and_(table.c.class_ == self.values[0][0],\n                           table.c.type == self.values[0][1])\n\n        return sa.or_(*(sa.and_(table.c.class_ == c, table.c.type == t)\n                        for c, t in self.values))\n\n\n@dataclasses.dataclass(order=True)\nclass RankedTokens:\n    \"\"\" List of tokens together with the penalty of using it.\n    \"\"\"\n    penalty: float\n    tokens: List[int]\n\n    def with_token(self, t: Token, transition_penalty: float) -> 'RankedTokens':\n        \"\"\" Create a new RankedTokens list with the given token appended.\n            The tokens penalty as well as the given transition penalty\n            are added to the overall penalty.\n        \"\"\"\n        return RankedTokens(self.penalty + t.penalty + transition_penalty,\n                            self.tokens + [t.token])\n\n\n@dataclasses.dataclass\nclass FieldRanking:\n    \"\"\" A list of rankings to be applied sequentially until one matches.\n        The matched ranking determines the penalty. If none matches a\n        default penalty is applied.\n    \"\"\"\n    column: str\n    default: float\n    rankings: List[RankedTokens]\n\n    def normalize_penalty(self) -> float:\n        \"\"\" Reduce the default and ranking penalties, such that the minimum\n            penalty is 0. Return the penalty that was subtracted.\n        \"\"\"\n        if self.rankings:\n            min_penalty = min(self.default, min(r.penalty for r in self.rankings))\n        else:\n            min_penalty = self.default\n        if min_penalty > 0.0:\n            self.default -= min_penalty\n            for ranking in self.rankings:\n                ranking.penalty -= min_penalty\n        return min_penalty\n\n    def sql_penalty(self, table: SaFromClause) -> SaColumn:\n        \"\"\" Create an SQL expression for the rankings.\n        \"\"\"\n        assert self.rankings\n\n        rout = JsonWriter().start_array()\n        for rank in self.rankings:\n            rout.start_array().value(rank.penalty).next()\n            rout.start_array()\n            for token in rank.tokens:\n                rout.value(token).next()\n            rout.end_array()\n            rout.end_array().next()\n        rout.end_array()\n\n        return sa.func.weigh_search(table.c[self.column], rout(), self.default)\n\n\n@dataclasses.dataclass\nclass FieldLookup:\n    \"\"\" A list of tokens to be searched for. The column names the database\n        column to search in and the lookup_type the operator that is applied.\n        'lookup_all' requires all tokens to match. 'lookup_any' requires\n        one of the tokens to match. 'restrict' requires to match all tokens\n        but avoids the use of indexes.\n    \"\"\"\n    column: str\n    tokens: List[int]\n    lookup_type: Type[lookups.LookupType]\n\n    def sql_condition(self, table: SaFromClause) -> SaColumn:\n        \"\"\" Create an SQL expression for the given match condition.\n        \"\"\"\n        return self.lookup_type(table, self.column, self.tokens)\n\n\nclass SearchData:\n    \"\"\" Search fields derived from query and token assignment\n        to be used with the SQL queries.\n    \"\"\"\n    penalty: float\n\n    lookups: List[FieldLookup] = []\n    rankings: List[FieldRanking]\n\n    housenumbers: WeightedStrings = WeightedStrings([], [])\n    postcodes: WeightedStrings = WeightedStrings([], [])\n    countries: WeightedStrings = WeightedStrings([], [])\n\n    qualifiers: WeightedCategories = WeightedCategories([], [])\n\n    def set_strings(self, field: str, tokens: List[Token]) -> None:\n        \"\"\" Set on of the WeightedStrings properties from the given\n            token list. Adapt the global penalty, so that the\n            minimum penalty is 0.\n        \"\"\"\n        if tokens:\n            min_penalty = min(t.penalty for t in tokens)\n            self.penalty += min_penalty\n            wstrs = WeightedStrings([t.lookup_word for t in tokens],\n                                    [t.penalty - min_penalty for t in tokens])\n\n            setattr(self, field, wstrs)\n\n    def set_countries(self, tokens: List[Token]) -> None:\n        \"\"\" Set the WeightedStrings properties for countries. Multiple\n            entries for the same country are deduplicated and the minimum\n            penalty is used. Adapts the global penalty, so that the\n            minimum penalty is 0.\n        \"\"\"\n        if tokens:\n            min_penalty = min(t.penalty for t in tokens)\n            self.penalty += min_penalty\n            countries: dict[str, float] = {}\n            for t in tokens:\n                cc = t.get_country()\n                countries[cc] = min(t.penalty - min_penalty, countries.get(cc, 10000))\n            self.countries = WeightedStrings(list(countries.keys()), list(countries.values()))\n\n    def set_qualifiers(self, tokens: List[Token]) -> None:\n        \"\"\" Set the qulaifier field from the given tokens.\n        \"\"\"\n        if tokens:\n            categories: Dict[Tuple[str, str], float] = {}\n            min_penalty = 1000.0\n            for t in tokens:\n                min_penalty = min(min_penalty, t.penalty)\n                cat = t.get_category()\n                if t.penalty < categories.get(cat, 1000.0):\n                    categories[cat] = t.penalty\n            self.penalty += min_penalty\n            self.qualifiers = WeightedCategories(list(categories.keys()),\n                                                 list(categories.values()))\n\n    def set_ranking(self, rankings: List[FieldRanking]) -> None:\n        \"\"\" Set the list of rankings and normalize the ranking.\n        \"\"\"\n        self.rankings = []\n        for ranking in rankings:\n            if ranking.rankings:\n                self.penalty += ranking.normalize_penalty()\n                self.rankings.append(ranking)\n            else:\n                self.penalty += ranking.default\n\n\ndef lookup_by_any_name(name_tokens: List[int], addr_restrict_tokens: List[int],\n                       addr_lookup_tokens: List[int]) -> List[FieldLookup]:\n    \"\"\" Create a lookup list where name tokens are looked up via index\n        and only one of the name tokens must be present.\n        Potential address tokens are used to restrict the search further.\n    \"\"\"\n    lookup = [FieldLookup('name_vector', name_tokens, lookups.LookupAny)]\n    if addr_restrict_tokens:\n        lookup.append(FieldLookup('nameaddress_vector', addr_restrict_tokens, lookups.Restrict))\n    if addr_lookup_tokens:\n        lookup.append(FieldLookup('nameaddress_vector', addr_lookup_tokens, lookups.LookupAll))\n\n    return lookup\n"
  },
  {
    "path": "src/nominatim_api/search/db_search_lookups.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImplementation of lookup functions for the search_name table.\n\"\"\"\nfrom typing import List, Any\n\nimport sqlalchemy as sa\nfrom sqlalchemy.ext.compiler import compiles\n\nfrom ..typing import SaFromClause\nfrom ..sql.sqlalchemy_types import IntArray\n\n\nLookupType = sa.sql.expression.FunctionElement[Any]\n\n\nclass LookupAll(LookupType):\n    \"\"\" Find all entries in search_name table that contain all of\n        a given list of tokens using an index for the search.\n    \"\"\"\n    inherit_cache = True\n\n    def __init__(self, table: SaFromClause, column: str, tokens: List[int]) -> None:\n        super().__init__(table.c.place_id, getattr(table.c, column), column,\n                         sa.type_coerce(tokens, IntArray))\n\n\n@compiles(LookupAll)\ndef _default_lookup_all(element: LookupAll,\n                        compiler: 'sa.Compiled', **kw: Any) -> str:\n    _, col, _, tokens = list(element.clauses)\n    return \"(%s @> %s)\" % (compiler.process(col, **kw),\n                           compiler.process(tokens, **kw))\n\n\n@compiles(LookupAll, 'sqlite')\ndef _sqlite_lookup_all(element: LookupAll,\n                       compiler: 'sa.Compiled', **kw: Any) -> str:\n    place, col, colname, tokens = list(element.clauses)\n    return \"(%s IN (SELECT CAST(value as bigint) FROM\"\\\n           \" (SELECT array_intersect_fuzzy(places) as p FROM\"\\\n           \"   (SELECT places FROM reverse_search_name\"\\\n           \"   WHERE word IN (SELECT value FROM json_each('[' || %s || ']'))\"\\\n           \"     AND column = %s\"\\\n           \"   ORDER BY length(places)) as x) as u,\"\\\n           \" json_each('[' || u.p || ']'))\"\\\n           \" AND array_contains(%s, %s))\"\\\n        % (compiler.process(place, **kw),\n           compiler.process(tokens, **kw),\n           compiler.process(colname, **kw),\n           compiler.process(col, **kw),\n           compiler.process(tokens, **kw))\n\n\nclass LookupAny(LookupType):\n    \"\"\" Find all entries that contain at least one of the given tokens.\n        Use an index for the search.\n    \"\"\"\n    inherit_cache = True\n\n    def __init__(self, table: SaFromClause, column: str, tokens: List[int]) -> None:\n        super().__init__(table.c.place_id, getattr(table.c, column), column,\n                         sa.type_coerce(tokens, IntArray))\n\n\n@compiles(LookupAny)\ndef _default_lookup_any(element: LookupAny,\n                        compiler: 'sa.Compiled', **kw: Any) -> str:\n    _, col, _, tokens = list(element.clauses)\n    return \"(%s && %s)\" % (compiler.process(col, **kw),\n                           compiler.process(tokens, **kw))\n\n\n@compiles(LookupAny, 'sqlite')\ndef _sqlite_lookup_any(element: LookupAny,\n                       compiler: 'sa.Compiled', **kw: Any) -> str:\n    place, _, colname, tokens = list(element.clauses)\n    return \"%s IN (SELECT CAST(value as bigint) FROM\"\\\n           \" (SELECT array_union(places) as p FROM reverse_search_name\"\\\n           \"   WHERE word IN (SELECT value FROM json_each('[' || %s || ']'))\"\\\n           \"     AND column = %s) as u,\"\\\n           \" json_each('[' || u.p || ']'))\" % (compiler.process(place, **kw),\n                                               compiler.process(tokens, **kw),\n                                               compiler.process(colname, **kw))\n\n\nclass Restrict(LookupType):\n    \"\"\" Find all entries that contain all of the given tokens.\n        Do not use an index for the search.\n    \"\"\"\n    inherit_cache = True\n\n    def __init__(self, table: SaFromClause, column: str, tokens: List[int]) -> None:\n        super().__init__(getattr(table.c, column),\n                         sa.type_coerce(tokens, IntArray))\n\n\n@compiles(Restrict)\ndef _default_restrict(element: Restrict,\n                      compiler: 'sa.Compiled', **kw: Any) -> str:\n    arg1, arg2 = list(element.clauses)\n    return \"(coalesce(null, %s) @> %s)\" % (compiler.process(arg1, **kw),\n                                           compiler.process(arg2, **kw))\n\n\n@compiles(Restrict, 'sqlite')\ndef _sqlite_restrict(element: Restrict,\n                     compiler: 'sa.Compiled', **kw: Any) -> str:\n    return \"array_contains(%s)\" % compiler.process(element.clauses, **kw)\n"
  },
  {
    "path": "src/nominatim_api/search/db_searches/__init__.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nModule implementing the actual database accesses for forward search.\n\"\"\"\n\nfrom .base import AbstractSearch as AbstractSearch\nfrom .near_search import NearSearch as NearSearch\nfrom .poi_search import PoiSearch as PoiSearch\nfrom .country_search import CountrySearch as CountrySearch\nfrom .postcode_search import PostcodeSearch as PostcodeSearch\nfrom .place_search import PlaceSearch as PlaceSearch\nfrom .address_search import AddressSearch as AddressSearch\n"
  },
  {
    "path": "src/nominatim_api/search/db_searches/address_search.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImplementation of search for an address (search with housenumber).\n\"\"\"\nfrom typing import cast, List, AsyncIterator\n\nimport sqlalchemy as sa\n\nfrom . import base\nfrom ...typing import SaBind, SaExpression, SaColumn, SaFromClause, SaScalarSelect\nfrom ...types import SearchDetails, Bbox\nfrom ...sql.sqlalchemy_types import Geometry\nfrom ...connection import SearchConnection\nfrom ... import results as nres\nfrom ..db_search_fields import SearchData\n\n\nLIMIT_PARAM: SaBind = sa.bindparam('limit')\nMIN_RANK_PARAM: SaBind = sa.bindparam('min_rank')\nMAX_RANK_PARAM: SaBind = sa.bindparam('max_rank')\nVIEWBOX_PARAM: SaBind = sa.bindparam('viewbox', type_=Geometry)\nVIEWBOX2_PARAM: SaBind = sa.bindparam('viewbox2', type_=Geometry)\nNEAR_PARAM: SaBind = sa.bindparam('near', type_=Geometry)\nNEAR_RADIUS_PARAM: SaBind = sa.bindparam('near_radius')\nCOUNTRIES_PARAM: SaBind = sa.bindparam('countries')\n\n\ndef _int_list_to_subquery(inp: List[int]) -> 'sa.Subquery':\n    \"\"\" Create a subselect that returns the given list of integers\n        as rows in the column 'nr'.\n    \"\"\"\n    vtab = sa.func.JsonArrayEach(sa.type_coerce(inp, sa.JSON))\\\n             .table_valued(sa.column('value', type_=sa.JSON))\n    return sa.select(sa.cast(sa.cast(vtab.c.value, sa.Text), sa.Integer).label('nr')).subquery()\n\n\ndef _interpolated_position(table: SaFromClause, nr: SaColumn) -> SaColumn:\n    pos = sa.cast(nr - table.c.startnumber, sa.Float) / (table.c.endnumber - table.c.startnumber)\n    return sa.case(\n            (table.c.endnumber == table.c.startnumber, table.c.linegeo.ST_Centroid()),\n            else_=table.c.linegeo.ST_LineInterpolatePoint(pos)).label('centroid')\n\n\ndef _make_interpolation_subquery(table: SaFromClause, inner: SaFromClause,\n                                 numerals: List[int], details: SearchDetails) -> SaScalarSelect:\n    all_ids = sa.func.ArrayAgg(table.c.place_id)\n    sql = sa.select(all_ids).where(table.c.parent_place_id == inner.c.place_id)\n\n    if len(numerals) == 1:\n        sql = sql.where(sa.between(numerals[0], table.c.startnumber, table.c.endnumber))\\\n                 .where((numerals[0] - table.c.startnumber) % table.c.step == 0)\n    else:\n        sql = sql.where(sa.or_(\n                *(sa.and_(sa.between(n, table.c.startnumber, table.c.endnumber),\n                          (n - table.c.startnumber) % table.c.step == 0)\n                  for n in numerals)))\n\n    if details.excluded:\n        sql = sql.where(base.exclude_places(table))\n        sql = sql.where(table.c.parent_place_id.not_in(sa.bindparam('excluded')))\n\n    return sql.scalar_subquery()\n\n\nasync def _get_placex_housenumbers(conn: SearchConnection,\n                                   place_ids: List[int],\n                                   details: SearchDetails) -> AsyncIterator[nres.SearchResult]:\n    t = conn.t.placex\n    sql = base.select_placex(t).add_columns(t.c.importance)\\\n                               .where(t.c.place_id.in_(place_ids))\n\n    if details.geometry_output:\n        sql = base.add_geometry_columns(sql, t.c.geometry, details)\n\n    for row in await conn.execute(sql):\n        result = nres.create_from_placex_row(row, nres.SearchResult)\n        result.bbox = Bbox.from_wkb(row.bbox)\n        yield result\n\n\nasync def _get_osmline(conn: SearchConnection, place_ids: List[int],\n                       numerals: List[int],\n                       details: SearchDetails) -> AsyncIterator[nres.SearchResult]:\n    t = conn.t.osmline\n\n    values = _int_list_to_subquery(numerals)\n    sql = sa.select(t.c.place_id, t.c.osm_id,\n                    t.c.parent_place_id, t.c.address,\n                    values.c.nr.label('housenumber'),\n                    _interpolated_position(t, values.c.nr),\n                    t.c.postcode, t.c.country_code)\\\n            .where(t.c.place_id.in_(place_ids))\\\n            .join(values, values.c.nr.between(t.c.startnumber, t.c.endnumber))\n\n    if details.geometry_output:\n        sub = sql.subquery()\n        sql = base.add_geometry_columns(sa.select(sub), sub.c.centroid, details)\n\n    for row in await conn.execute(sql):\n        yield nres.create_from_osmline_row(row, nres.SearchResult)\n\n\nasync def _get_tiger(conn: SearchConnection, place_ids: List[int],\n                     numerals: List[int], osm_id: int,\n                     details: SearchDetails) -> AsyncIterator[nres.SearchResult]:\n    t = conn.t.tiger\n    values = _int_list_to_subquery(numerals)\n    sql = sa.select(t.c.place_id, t.c.parent_place_id,\n                    sa.literal('W').label('osm_type'),\n                    sa.literal(osm_id).label('osm_id'),\n                    values.c.nr.label('housenumber'),\n                    _interpolated_position(t, values.c.nr),\n                    t.c.postcode)\\\n            .where(t.c.place_id.in_(place_ids))\\\n            .join(values, values.c.nr.between(t.c.startnumber, t.c.endnumber))\n\n    if details.geometry_output:\n        sub = sql.subquery()\n        sql = base.add_geometry_columns(sa.select(sub), sub.c.centroid, details)\n\n    for row in await conn.execute(sql):\n        yield nres.create_from_tiger_row(row, nres.SearchResult)\n\n\nclass AddressSearch(base.AbstractSearch):\n    \"\"\" Generic search for an address or named place.\n    \"\"\"\n    SEARCH_PRIO = 1\n\n    def __init__(self, extra_penalty: float, sdata: SearchData,\n                 expected_count: int, has_address_terms: bool) -> None:\n        assert sdata.housenumbers\n        super().__init__(sdata.penalty + extra_penalty)\n        self.countries = sdata.countries\n        self.postcodes = sdata.postcodes\n        self.housenumbers = sdata.housenumbers\n        self.qualifiers = sdata.qualifiers\n        self.lookups = sdata.lookups\n        self.rankings = sdata.rankings\n        self.expected_count = expected_count\n        self.has_address_terms = has_address_terms\n\n    def _inner_search_name_cte(self, conn: SearchConnection,\n                               details: SearchDetails) -> 'sa.CTE':\n        \"\"\" Create a subquery that preselects the rows in the search_name\n            table.\n        \"\"\"\n        t = conn.t.search_name\n\n        penalty: SaExpression = sa.literal(self.penalty)\n        for ranking in self.rankings:\n            penalty += ranking.sql_penalty(t)\n\n        sql = sa.select(t.c.place_id, penalty.label('penalty'))\n\n        for lookup in self.lookups:\n            sql = sql.where(lookup.sql_condition(t))\n\n        if self.countries:\n            sql = sql.where(t.c.country_code.in_(self.countries.values))\n\n        if self.postcodes:\n            if self.expected_count > 10000:\n                tpc = conn.t.postcode\n                sql = sql.where(sa.select(tpc.c.postcode)\n                                  .where(tpc.c.postcode.in_(self.postcodes.values))\n                                  .where(tpc.c.country_code == t.c.country_code)\n                                  .where(t.c.centroid.intersects(tpc.c.geometry,\n                                                                 use_index=False))\n                                  .exists())\n\n        if details.viewbox is not None:\n            if details.bounded_viewbox:\n                sql = sql.where(t.c.centroid\n                                   .intersects(VIEWBOX_PARAM,\n                                               use_index=details.viewbox.area < 0.2))\n\n        if details.near is not None and details.near_radius is not None:\n            if details.near_radius < 0.1:\n                sql = sql.where(t.c.centroid.within_distance(NEAR_PARAM,\n                                                             NEAR_RADIUS_PARAM))\n            else:\n                sql = sql.where(t.c.centroid\n                                 .ST_Distance(NEAR_PARAM) < NEAR_RADIUS_PARAM)\n\n        if self.has_address_terms:\n            sql = sql.where(t.c.address_rank.between(16, 30))\n        else:\n            # If no further address terms are given, then the base street must\n            # be in the name. No search for named POIs with the given house number.\n            sql = sql.where(t.c.address_rank.between(16, 27))\n\n        inner = sql.limit(10000).order_by(sa.desc(sa.text('importance'))).subquery()\n\n        sql = sa.select(inner.c.place_id, inner.c.penalty)\n\n        return sql.cte('searches')\n\n    async def lookup(self, conn: SearchConnection,\n                     details: SearchDetails) -> nres.SearchResults:\n        \"\"\" Find results for the search in the database.\n        \"\"\"\n        t = conn.t.placex\n        tsearch = self._inner_search_name_cte(conn, details)\n\n        sql = base.select_placex(t).join(tsearch, t.c.place_id == tsearch.c.place_id)\n\n        if details.geometry_output:\n            sql = base.add_geometry_columns(sql, t.c.geometry, details)\n\n        penalty: SaExpression = tsearch.c.penalty\n\n        if self.postcodes:\n            tpc = conn.t.postcode\n            pcs = self.postcodes.values\n\n            pc_near = sa.select(sa.func.min(tpc.c.centroid.ST_Distance(t.c.centroid)\n                                            * (tpc.c.rank_search - 19)))\\\n                        .where(tpc.c.postcode.in_(pcs))\\\n                        .where(tpc.c.country_code == t.c.country_code)\\\n                        .scalar_subquery()\n            penalty += sa.case((t.c.postcode.in_(pcs), 0.0),\n                               else_=sa.func.coalesce(pc_near, cast(SaColumn, 2.0)))\n\n        if details.viewbox is not None and not details.bounded_viewbox:\n            penalty += sa.case((t.c.geometry.intersects(VIEWBOX_PARAM, use_index=False), 0.0),\n                               (t.c.geometry.intersects(VIEWBOX2_PARAM, use_index=False), 0.5),\n                               else_=1.0)\n\n        if details.near is not None:\n            sql = sql.add_columns((-t.c.centroid.ST_Distance(NEAR_PARAM))\n                                  .label('importance'))\n            sql = sql.order_by(sa.desc(sa.text('importance')))\n        else:\n            sql = sql.order_by(penalty - t.c.importance)\n            sql = sql.add_columns(t.c.importance)\n\n        sql = sql.add_columns(penalty.label('accuracy'))\\\n                 .order_by(sa.text('accuracy'))\n\n        hnr_list = '|'.join(self.housenumbers.values)\n\n        if self.has_address_terms:\n            sql = sql.where(sa.or_(t.c.rank_address < 30,\n                                   sa.func.RegexpWord(hnr_list, t.c.housenumber)))\n\n        inner = sql.subquery()\n\n        # Housenumbers from placex\n        thnr = conn.t.placex.alias('hnr')\n        pid_list = sa.func.ArrayAgg(thnr.c.place_id)\n        place_sql = sa.select(pid_list)\\\n                      .where(thnr.c.parent_place_id == inner.c.place_id)\\\n                      .where(sa.func.RegexpWord(hnr_list, thnr.c.housenumber))\\\n                      .where(thnr.c.linked_place_id == None)\\\n                      .where(thnr.c.indexed_status == 0)\n\n        if details.excluded:\n            place_sql = place_sql.where(thnr.c.place_id.not_in(sa.bindparam('excluded')))\n        if self.qualifiers:\n            place_sql = place_sql.where(self.qualifiers.sql_restrict(thnr))\n\n        numerals = [int(n) for n in self.housenumbers.values\n                    if n.isdigit() and len(n) < 8]\n        interpol_sql: SaColumn\n        tiger_sql: SaColumn\n        if numerals and \\\n           (not self.qualifiers or ('place', 'house') in self.qualifiers.values):\n            # Housenumbers from interpolations\n            interpol_sql = _make_interpolation_subquery(conn.t.osmline, inner,\n                                                        numerals, details)\n            # Housenumbers from Tiger\n            tiger_sql = sa.case((inner.c.country_code == 'us',\n                                 _make_interpolation_subquery(conn.t.tiger, inner,\n                                                              numerals, details)\n                                 ), else_=None)\n        else:\n            interpol_sql = sa.null()\n            tiger_sql = sa.null()\n\n        unsort = sa.select(inner, place_sql.scalar_subquery().label('placex_hnr'),\n                           interpol_sql.label('interpol_hnr'),\n                           tiger_sql.label('tiger_hnr')).subquery('unsort')\n        sql = sa.select(unsort)\\\n                .order_by(unsort.c.accuracy +\n                          sa.case((unsort.c.placex_hnr != None, 0),\n                                  (unsort.c.interpol_hnr != None, 0),\n                                  (unsort.c.tiger_hnr != None, 0),\n                                  else_=1),\n                          sa.case((unsort.c.placex_hnr != None, 1),\n                                  (unsort.c.interpol_hnr != None, 2),\n                                  (unsort.c.tiger_hnr != None, 3),\n                                  else_=4))\n\n        sql = sql.limit(LIMIT_PARAM)\n\n        bind_params = {\n            'limit': details.max_results,\n            'min_rank': details.min_rank,\n            'max_rank': details.max_rank,\n            'viewbox': details.viewbox,\n            'viewbox2': details.viewbox_x2,\n            'near': details.near,\n            'near_radius': details.near_radius,\n            'excluded': details.excluded_place_ids,\n            'countries': details.countries\n        }\n\n        results = nres.SearchResults()\n        for row in await conn.execute(sql, bind_params):\n            result = nres.create_from_placex_row(row, nres.SearchResult)\n            result.bbox = Bbox.from_wkb(row.bbox)\n            result.accuracy = row.accuracy\n            if row.rank_address < 30:\n                if row.placex_hnr:\n                    subs = _get_placex_housenumbers(conn, row.placex_hnr, details)\n                elif row.interpol_hnr:\n                    subs = _get_osmline(conn, row.interpol_hnr, numerals, details)\n                elif row.tiger_hnr:\n                    subs = _get_tiger(conn, row.tiger_hnr, numerals, row.osm_id, details)\n                else:\n                    subs = None\n\n                if subs is not None:\n                    async for sub in subs:\n                        assert sub.housenumber\n                        sub.accuracy = result.accuracy\n                        if not any(nr in self.housenumbers.values\n                                   for nr in sub.housenumber.split(';')):\n                            sub.accuracy += 0.6\n                        results.append(sub)\n\n                # Only add the street as a result, if it meets all other\n                # filter conditions.\n                if (not details.excluded or result.place_id not in details.excluded_place_ids)\\\n                   and (not self.qualifiers or result.category in self.qualifiers.values)\\\n                   and result.rank_address >= details.min_rank:\n                    result.accuracy += 1.0  # penalty for missing housenumber\n                    results.append(result)\n            else:\n                results.append(result)\n\n        return results\n"
  },
  {
    "path": "src/nominatim_api/search/db_searches/base.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nInterface for classes implementing a database search.\n\"\"\"\nfrom typing import Callable, List\nimport abc\n\nimport sqlalchemy as sa\n\nfrom ...typing import SaFromClause, SaSelect, SaColumn, SaExpression, SaLambdaSelect\nfrom ...sql.sqlalchemy_types import Geometry\nfrom ...connection import SearchConnection\nfrom ...types import SearchDetails, DataLayer, GeometryFormat\nfrom ...results import SearchResults\n\n\nclass AbstractSearch(abc.ABC):\n    \"\"\" Encapuslation of a single lookup in the database.\n    \"\"\"\n    SEARCH_PRIO: int = 2\n\n    def __init__(self, penalty: float) -> None:\n        self.penalty = penalty\n\n    @abc.abstractmethod\n    async def lookup(self, conn: SearchConnection, details: SearchDetails) -> SearchResults:\n        \"\"\" Find results for the search in the database.\n        \"\"\"\n\n\ndef select_placex(t: SaFromClause) -> SaSelect:\n    \"\"\" Return the basic select query for placex which returns all\n        fields necessary to fill a Nominatim result. 't' must either be\n        the placex table or a subquery returning appropriate fields from\n        a placex-related query.\n    \"\"\"\n    return sa.select(t.c.place_id, t.c.osm_type, t.c.osm_id, t.c.name,\n                     t.c.class_, t.c.type,\n                     t.c.address, t.c.extratags,\n                     t.c.housenumber, t.c.postcode, t.c.country_code,\n                     t.c.wikipedia,\n                     t.c.parent_place_id, t.c.rank_address, t.c.rank_search,\n                     t.c.linked_place_id, t.c.admin_level,\n                     t.c.centroid,\n                     t.c.geometry.ST_Expand(0).label('bbox'))\n\n\ndef exclude_places(t: SaFromClause) -> Callable[[], SaExpression]:\n    \"\"\" Return an expression to exclude place IDs and OSM IDs from the list in the\n        SearchDetails.\n\n        Requires the excluded IDs to be supplied as a bind parameter in SQL.\n    \"\"\"\n    return lambda: t.c.place_id.not_in(sa.bindparam('excluded'))\n\n\ndef filter_by_layer(table: SaFromClause, layers: DataLayer) -> SaColumn:\n    \"\"\" Return an expression that filters the given table by layers.\n    \"\"\"\n    orexpr: List[SaExpression] = []\n    if layers & DataLayer.ADDRESS and layers & DataLayer.POI:\n        orexpr.append(no_index(table.c.rank_address).between(1, 30))\n    elif layers & DataLayer.ADDRESS:\n        orexpr.append(no_index(table.c.rank_address).between(1, 29))\n        orexpr.append(sa.func.IsAddressPoint(table))\n    elif layers & DataLayer.POI:\n        orexpr.append(sa.and_(no_index(table.c.rank_address) == 30,\n                              table.c.class_.not_in(('place', 'building'))))\n\n    if layers & DataLayer.MANMADE:\n        exclude = []\n        if not layers & DataLayer.RAILWAY:\n            exclude.append('railway')\n        if not layers & DataLayer.NATURAL:\n            exclude.extend(('natural', 'water', 'waterway'))\n        orexpr.append(sa.and_(table.c.class_.not_in(tuple(exclude)),\n                              no_index(table.c.rank_address) == 0))\n    else:\n        include = []\n        if layers & DataLayer.RAILWAY:\n            include.append('railway')\n        if layers & DataLayer.NATURAL:\n            include.extend(('natural', 'water', 'waterway'))\n        orexpr.append(sa.and_(table.c.class_.in_(tuple(include)),\n                              no_index(table.c.rank_address) == 0))\n\n    if len(orexpr) == 1:\n        return orexpr[0]\n\n    return sa.or_(*orexpr)\n\n\ndef no_index(expr: SaColumn) -> SaColumn:\n    \"\"\" Wrap the given expression, so that the query planner will\n        refrain from using the expression for index lookup.\n    \"\"\"\n    return sa.func.coalesce(sa.null(), expr)\n\n\ndef filter_by_area(sql: SaSelect, t: SaFromClause,\n                   details: SearchDetails, avoid_index: bool = False) -> SaSelect:\n    \"\"\" Apply SQL statements for filtering by viewbox and near point,\n        if applicable.\n    \"\"\"\n    if details.near is not None and details.near_radius is not None:\n        if details.near_radius < 0.1 and not avoid_index:\n            sql = sql.where(\n                t.c.geometry.within_distance(sa.bindparam('near', type_=Geometry),\n                                             sa.bindparam('near_radius')))\n        else:\n            sql = sql.where(\n                t.c.geometry.ST_Distance(\n                    sa.bindparam('near', type_=Geometry)) <= sa.bindparam('near_radius'))\n    if details.viewbox is not None and details.bounded_viewbox:\n        sql = sql.where(t.c.geometry.intersects(sa.bindparam('viewbox', type_=Geometry),\n                                                use_index=not avoid_index and\n                                                details.viewbox.area < 0.2))\n\n    return sql\n\n\ndef add_geometry_columns(sql: SaLambdaSelect, col: SaColumn, details: SearchDetails) -> SaSelect:\n    \"\"\" Add columns for requested geometry formats and return the new query.\n    \"\"\"\n    out = []\n\n    if details.geometry_simplification > 0.0:\n        col = sa.func.ST_SimplifyPreserveTopology(col, details.geometry_simplification)\n\n    if details.geometry_output & GeometryFormat.GEOJSON:\n        out.append(sa.func.ST_AsGeoJSON(col, 7).label('geometry_geojson'))\n    if details.geometry_output & GeometryFormat.TEXT:\n        out.append(sa.func.ST_AsText(col).label('geometry_text'))\n    if details.geometry_output & GeometryFormat.KML:\n        out.append(sa.func.ST_AsKML(col, 7).label('geometry_kml'))\n    if details.geometry_output & GeometryFormat.SVG:\n        out.append(sa.func.ST_AsSVG(col, 0, 7).label('geometry_svg'))\n\n    return sql.add_columns(*out)\n"
  },
  {
    "path": "src/nominatim_api/search/db_searches/country_search.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImplementation of searches for a country.\n\"\"\"\n\nimport sqlalchemy as sa\n\nfrom . import base\nfrom ..db_search_fields import SearchData\nfrom ... import results as nres\nfrom ...connection import SearchConnection\nfrom ...types import SearchDetails, Bbox\n\n\nclass CountrySearch(base.AbstractSearch):\n    \"\"\" Search for a country name or country code.\n    \"\"\"\n    SEARCH_PRIO = 0\n\n    def __init__(self, sdata: SearchData) -> None:\n        super().__init__(sdata.penalty)\n        self.countries = sdata.countries\n\n    async def lookup(self, conn: SearchConnection,\n                     details: SearchDetails) -> nres.SearchResults:\n        \"\"\" Find results for the search in the database.\n        \"\"\"\n        t = conn.t.placex\n\n        ccodes = self.countries.values\n        sql = base.select_placex(t)\\\n            .add_columns(t.c.importance)\\\n            .where(t.c.country_code.in_(ccodes))\\\n            .where(t.c.rank_address == 4)\n\n        if details.geometry_output:\n            sql = base.add_geometry_columns(sql, t.c.geometry, details)\n\n        if details.excluded:\n            sql = sql.where(base.exclude_places(t))\n\n        sql = base.filter_by_area(sql, t, details)\n\n        bind_params = {\n            'excluded': details.excluded_place_ids,\n            'viewbox': details.viewbox,\n            'near': details.near,\n            'near_radius': details.near_radius\n        }\n\n        results = nres.SearchResults()\n        for row in await conn.execute(sql, bind_params):\n            result = nres.create_from_placex_row(row, nres.SearchResult)\n            result.accuracy = self.penalty + self.countries.get_penalty(row.country_code, 5.0)\n            result.bbox = Bbox.from_wkb(row.bbox)\n            results.append(result)\n\n        if not results:\n            results = await self.lookup_in_country_table(conn, details)\n\n        if results:\n            details.min_rank = min(5, details.max_rank)\n            details.max_rank = min(25, details.max_rank)\n\n        return results\n\n    async def lookup_in_country_table(self, conn: SearchConnection,\n                                      details: SearchDetails) -> nres.SearchResults:\n        \"\"\" Look up the country in the fallback country tables.\n        \"\"\"\n        # Avoid the fallback search when this is a more search. Country results\n        # usually are in the first batch of results and it is not possible\n        # to exclude these fallbacks.\n        if details.excluded:\n            return nres.SearchResults()\n\n        t = conn.t.country_name\n        tgrid = conn.t.country_grid\n\n        sql = sa.select(tgrid.c.country_code,\n                        tgrid.c.geometry.ST_Centroid().ST_Collect().ST_Centroid()\n                             .label('centroid'),\n                        tgrid.c.geometry.ST_Collect().ST_Expand(0).label('bbox'))\\\n                .where(tgrid.c.country_code.in_(self.countries.values))\\\n                .group_by(tgrid.c.country_code)\n\n        sql = base.filter_by_area(sql, tgrid, details, avoid_index=True)\n\n        sub = sql.subquery('grid')\n\n        sql = sa.select(t.c.country_code,\n                        t.c.name.merge(t.c.derived_name).label('name'),\n                        sub.c.centroid, sub.c.bbox)\\\n                .join(sub, t.c.country_code == sub.c.country_code)\n\n        if details.geometry_output:\n            sql = base.add_geometry_columns(sql, sub.c.centroid, details)\n\n        bind_params = {\n            'viewbox': details.viewbox,\n            'near': details.near,\n            'near_radius': details.near_radius\n        }\n\n        results = nres.SearchResults()\n        for row in await conn.execute(sql, bind_params):\n            result = nres.create_from_country_row(row, nres.SearchResult)\n            result.bbox = Bbox.from_wkb(row.bbox)\n            result.accuracy = self.penalty + self.countries.get_penalty(row.country_code, 5.0)\n            results.append(result)\n\n        return results\n"
  },
  {
    "path": "src/nominatim_api/search/db_searches/near_search.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImplementation of a category search around a place.\n\"\"\"\nfrom typing import List, Tuple\n\nimport sqlalchemy as sa\n\nfrom . import base\nfrom ...typing import SaBind\nfrom ...types import SearchDetails, Bbox\nfrom ...connection import SearchConnection\nfrom ... import results as nres\nfrom ..db_search_fields import WeightedCategories\n\n\nLIMIT_PARAM: SaBind = sa.bindparam('limit')\nMIN_RANK_PARAM: SaBind = sa.bindparam('min_rank')\nMAX_RANK_PARAM: SaBind = sa.bindparam('max_rank')\nCOUNTRIES_PARAM: SaBind = sa.bindparam('countries')\n\n\nclass NearSearch(base.AbstractSearch):\n    \"\"\" Category search of a place type near the result of another search.\n    \"\"\"\n    def __init__(self, penalty: float, categories: WeightedCategories,\n                 search: base.AbstractSearch) -> None:\n        super().__init__(penalty)\n        self.search = search\n        self.categories = categories\n\n    async def lookup(self, conn: SearchConnection,\n                     details: SearchDetails) -> nres.SearchResults:\n        \"\"\" Find results for the search in the database.\n        \"\"\"\n        results = nres.SearchResults()\n        base = await self.search.lookup(conn, details)\n\n        if not base:\n            return results\n\n        base.sort(key=lambda r: (r.accuracy, r.rank_search))\n        max_accuracy = base[0].accuracy + 0.5\n        if base[0].rank_address == 0:\n            min_rank = 0\n            max_rank = 0\n        elif base[0].rank_address < 26:\n            min_rank = 1\n            max_rank = min(25, base[0].rank_address + 4)\n        else:\n            min_rank = 26\n            max_rank = 30\n        base = nres.SearchResults(r for r in base\n                                  if (r.source_table == nres.SourceTable.PLACEX\n                                      and r.accuracy <= max_accuracy\n                                      and r.bbox and r.bbox.area < 20\n                                      and r.rank_address >= min_rank\n                                      and r.rank_address <= max_rank))\n\n        if base:\n            baseids = [b.place_id for b in base[:5] if b.place_id]\n\n            for category, penalty in self.categories:\n                await self.lookup_category(results, conn, baseids, category, penalty, details)\n                if len(results) >= details.max_results:\n                    break\n\n        return results\n\n    async def lookup_category(self, results: nres.SearchResults,\n                              conn: SearchConnection, ids: List[int],\n                              category: Tuple[str, str], penalty: float,\n                              details: SearchDetails) -> None:\n        \"\"\" Find places of the given category near the list of\n            place ids and add the results to 'results'.\n        \"\"\"\n        table = await conn.get_class_table(*category)\n\n        tgeom = conn.t.placex.alias('pgeom')\n\n        if table is None:\n            # No classtype table available, do a simplified lookup in placex.\n            table = conn.t.placex\n            sql = sa.select(table.c.place_id,\n                            sa.func.min(tgeom.c.centroid.ST_Distance(table.c.centroid))\n                              .label('dist'))\\\n                    .join(tgeom, table.c.geometry.intersects(tgeom.c.centroid.ST_Expand(0.01)))\\\n                    .where(table.c.class_ == category[0])\\\n                    .where(table.c.type == category[1])\n        else:\n            # Use classtype table. We can afford to use a larger\n            # radius for the lookup.\n            sql = sa.select(table.c.place_id,\n                            sa.func.min(tgeom.c.centroid.ST_Distance(table.c.centroid))\n                              .label('dist'))\\\n                    .join(tgeom,\n                          table.c.centroid.ST_CoveredBy(\n                              sa.case((sa.and_(tgeom.c.rank_address > 9,\n                                               tgeom.c.geometry.is_area()),\n                                       tgeom.c.geometry),\n                                      else_=tgeom.c.centroid.ST_Expand(0.05))))\n\n        inner = sql.where(tgeom.c.place_id.in_(ids))\\\n                   .group_by(table.c.place_id).subquery()\n\n        t = conn.t.placex\n        sql = base.select_placex(t).add_columns((-inner.c.dist).label('importance'))\\\n                                   .join(inner, inner.c.place_id == t.c.place_id)\\\n                                   .order_by(inner.c.dist)\n\n        sql = sql.where(base.no_index(t.c.rank_address).between(MIN_RANK_PARAM, MAX_RANK_PARAM))\n        if details.countries:\n            sql = sql.where(t.c.country_code.in_(COUNTRIES_PARAM))\n        if details.excluded:\n            sql = sql.where(base.exclude_places(t))\n        if details.layers is not None:\n            sql = sql.where(base.filter_by_layer(t, details.layers))\n\n        sql = sql.limit(LIMIT_PARAM)\n\n        bind_params = {'limit': details.max_results,\n                       'min_rank': details.min_rank,\n                       'max_rank': details.max_rank,\n                       'excluded': details.excluded_place_ids,\n                       'countries': details.countries}\n        for row in await conn.execute(sql, bind_params):\n            result = nres.create_from_placex_row(row, nres.SearchResult)\n            result.accuracy = self.penalty + penalty\n            result.bbox = Bbox.from_wkb(row.bbox)\n            results.append(result)\n"
  },
  {
    "path": "src/nominatim_api/search/db_searches/place_search.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImplementation of search for a named place (without housenumber).\n\"\"\"\nfrom typing import cast\n\nimport sqlalchemy as sa\n\nfrom . import base\nfrom ...typing import SaBind, SaExpression, SaColumn\nfrom ...types import SearchDetails, Bbox\nfrom ...sql.sqlalchemy_types import Geometry\nfrom ...connection import SearchConnection\nfrom ... import results as nres\nfrom ..db_search_fields import SearchData\n\n\nLIMIT_PARAM: SaBind = sa.bindparam('limit')\nMIN_RANK_PARAM: SaBind = sa.bindparam('min_rank')\nMAX_RANK_PARAM: SaBind = sa.bindparam('max_rank')\nVIEWBOX_PARAM: SaBind = sa.bindparam('viewbox', type_=Geometry)\nVIEWBOX2_PARAM: SaBind = sa.bindparam('viewbox2', type_=Geometry)\nNEAR_PARAM: SaBind = sa.bindparam('near', type_=Geometry)\nNEAR_RADIUS_PARAM: SaBind = sa.bindparam('near_radius')\nCOUNTRIES_PARAM: SaBind = sa.bindparam('countries')\n\n\nclass PlaceSearch(base.AbstractSearch):\n    \"\"\" Generic search for a named place.\n    \"\"\"\n    SEARCH_PRIO = 1\n\n    def __init__(self, extra_penalty: float, sdata: SearchData,\n                 expected_count: int, has_address_terms: bool) -> None:\n        assert not sdata.housenumbers\n        super().__init__(sdata.penalty + extra_penalty)\n        self.countries = sdata.countries\n        self.postcodes = sdata.postcodes\n        self.qualifiers = sdata.qualifiers\n        self.lookups = sdata.lookups\n        self.rankings = sdata.rankings\n        self.expected_count = expected_count\n        self.has_address_terms = has_address_terms\n\n    def _inner_search_name_cte(self, conn: SearchConnection,\n                               details: SearchDetails) -> 'sa.CTE':\n        \"\"\" Create a subquery that preselects the rows in the search_name\n            table.\n        \"\"\"\n        t = conn.t.search_name\n\n        penalty: SaExpression = sa.literal(self.penalty)\n        for ranking in self.rankings:\n            penalty += ranking.sql_penalty(t)\n\n        sql = sa.select(t.c.place_id, t.c.importance)\n\n        for lookup in self.lookups:\n            sql = sql.where(lookup.sql_condition(t))\n\n        if self.countries:\n            sql = sql.where(t.c.country_code.in_(self.countries.values))\n\n        if self.postcodes:\n            # if a postcode is given, don't search for state or country level objects\n            sql = sql.where(t.c.address_rank > 9)\n            if self.expected_count > 10000:\n                # Many results expected. Restrict by postcode.\n                tpc = conn.t.postcode\n                sql = sql.where(sa.select(tpc.c.postcode)\n                                  .where(tpc.c.postcode.in_(self.postcodes.values))\n                                  .where(t.c.centroid.intersects(tpc.c.geometry,\n                                                                 use_index=False))\n                                  .exists())\n\n        if details.viewbox is not None:\n            if details.bounded_viewbox:\n                sql = sql.where(t.c.centroid\n                                   .intersects(VIEWBOX_PARAM,\n                                               use_index=details.viewbox.area < 0.2))\n            else:\n                penalty += sa.case((t.c.centroid.intersects(VIEWBOX_PARAM, use_index=False), 0.0),\n                                   (t.c.centroid.intersects(VIEWBOX2_PARAM, use_index=False), 0.5),\n                                   else_=1.0)\n\n        if details.near is not None and details.near_radius is not None:\n            if details.near_radius < 0.1:\n                sql = sql.where(t.c.centroid.within_distance(NEAR_PARAM,\n                                                             NEAR_RADIUS_PARAM))\n            else:\n                sql = sql.where(t.c.centroid\n                                 .ST_Distance(NEAR_PARAM) < NEAR_RADIUS_PARAM)\n\n        if details.excluded:\n            sql = sql.where(base.exclude_places(t))\n        # Do not restrict ranks too much yet because rank restriction\n        # currently also depends on search_rank to account for state-cities\n        # like Berlin.\n        if details.max_rank < 26:\n            sql = sql.where(t.c.address_rank < 26)\n        elif details.max_rank < 30:\n            sql = sql.where(t.c.address_rank < MAX_RANK_PARAM)\n\n        sql = sql.add_columns(penalty.label('penalty'))\n\n        inner = sql.limit(5000 if self.qualifiers else 1000)\\\n                   .order_by(sa.desc(sa.text('importance')))\\\n                   .subquery()\n\n        sql = sa.select(inner.c.place_id, inner.c.importance, inner.c.penalty)\n\n        # If the query has no geographic preference,\n        # preselect most important items to restrict the number of places\n        # that need to be looked up in placex.\n        if (details.viewbox is None or not details.bounded_viewbox)\\\n           and (details.near is None or details.near_radius is None)\\\n           and not self.qualifiers:\n            sql = sql.add_columns(sa.func.first_value(inner.c.penalty - inner.c.importance)\n                                    .over(order_by=inner.c.penalty - inner.c.importance)\n                                    .label('min_penalty'))\n\n            inner = sql.subquery()\n\n            sql = sa.select(inner.c.place_id, inner.c.penalty)\\\n                    .where(inner.c.penalty - inner.c.importance < inner.c.min_penalty + 0.5)\n\n        return sql.cte('searches')\n\n    async def lookup(self, conn: SearchConnection,\n                     details: SearchDetails) -> nres.SearchResults:\n        \"\"\" Find results for the search in the database.\n        \"\"\"\n        t = conn.t.placex\n        tsearch = self._inner_search_name_cte(conn, details)\n\n        sql = base.select_placex(t).join(tsearch, t.c.place_id == tsearch.c.place_id)\n\n        if details.geometry_output:\n            sql = base.add_geometry_columns(sql, t.c.geometry, details)\n\n        penalty: SaExpression = tsearch.c.penalty\n\n        if self.postcodes:\n            if self.has_address_terms:\n                tpc = conn.t.postcode\n                pcs = self.postcodes.values\n\n                pc_near = sa.select(sa.func.min(tpc.c.centroid.ST_Distance(t.c.centroid)))\\\n                            .where(tpc.c.postcode.in_(pcs))\\\n                            .scalar_subquery()\n                penalty += sa.case((t.c.postcode.in_(pcs), 0.0),\n                                   else_=sa.func.coalesce(pc_near, cast(SaColumn, 2.0)))\n            else:\n                # High penalty if the postcode is not an exact match.\n                # The postcode search needs to get priority here.\n                penalty += sa.case((t.c.postcode.in_(self.postcodes.values), 0.0), else_=1.0)\n\n        if details.near is not None:\n            sql = sql.add_columns((-t.c.centroid.ST_Distance(NEAR_PARAM))\n                                  .label('importance'))\n            sql = sql.order_by(sa.desc(sa.text('importance')))\n        else:\n            sql = sql.order_by(penalty - t.c.importance)\n            sql = sql.add_columns(t.c.importance)\n\n        if details.min_rank > 0:\n            sql = sql.where(sa.or_(t.c.rank_address >= MIN_RANK_PARAM,\n                                   t.c.rank_search >= MIN_RANK_PARAM))\n        if details.max_rank < 30:\n            sql = sql.where(sa.or_(t.c.rank_address <= MAX_RANK_PARAM,\n                                   t.c.rank_search <= MAX_RANK_PARAM))\n\n        sql = sql.add_columns(penalty.label('accuracy'))\\\n                 .order_by(sa.text('accuracy'))\n\n        sql = sql.where(t.c.linked_place_id == None)\\\n                 .where(t.c.indexed_status == 0)\n        if self.qualifiers:\n            sql = sql.where(self.qualifiers.sql_restrict(t))\n        if details.layers is not None:\n            sql = sql.where(base.filter_by_layer(t, details.layers))\n\n        sql = sql.limit(LIMIT_PARAM)\n\n        bind_params = {\n            'limit': details.max_results,\n            'min_rank': details.min_rank,\n            'max_rank': details.max_rank,\n            'viewbox': details.viewbox,\n            'viewbox2': details.viewbox_x2,\n            'near': details.near,\n            'near_radius': details.near_radius,\n            'excluded': details.excluded_place_ids,\n            'countries': details.countries\n        }\n\n        results = nres.SearchResults()\n        for row in await conn.execute(sql, bind_params):\n            result = nres.create_from_placex_row(row, nres.SearchResult)\n            result.bbox = Bbox.from_wkb(row.bbox)\n            result.accuracy = row.accuracy\n            results.append(result)\n\n        return results\n"
  },
  {
    "path": "src/nominatim_api/search/db_searches/poi_search.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImplementation of category search.\n\"\"\"\nfrom typing import List\n\nimport sqlalchemy as sa\n\nfrom . import base\nfrom ..db_search_fields import SearchData\nfrom ... import results as nres\nfrom ...typing import SaBind, SaRow, SaSelect, SaLambdaSelect\nfrom ...sql.sqlalchemy_types import Geometry\nfrom ...connection import SearchConnection\nfrom ...types import SearchDetails, Bbox\n\n\nLIMIT_PARAM: SaBind = sa.bindparam('limit')\nVIEWBOX_PARAM: SaBind = sa.bindparam('viewbox', type_=Geometry)\nNEAR_PARAM: SaBind = sa.bindparam('near', type_=Geometry)\nNEAR_RADIUS_PARAM: SaBind = sa.bindparam('near_radius')\n\n\nclass PoiSearch(base.AbstractSearch):\n    \"\"\" Category search in a geographic area.\n    \"\"\"\n    def __init__(self, sdata: SearchData) -> None:\n        super().__init__(sdata.penalty)\n        self.qualifiers = sdata.qualifiers\n        self.countries = sdata.countries\n\n    async def lookup(self, conn: SearchConnection,\n                     details: SearchDetails) -> nres.SearchResults:\n        \"\"\" Find results for the search in the database.\n        \"\"\"\n        bind_params = {\n            'limit': details.max_results,\n            'viewbox': details.viewbox,\n            'near': details.near,\n            'near_radius': details.near_radius,\n            'excluded': details.excluded_place_ids\n        }\n\n        t = conn.t.placex\n\n        rows: List[SaRow] = []\n\n        if details.near and details.near_radius is not None and details.near_radius < 0.2:\n            # simply search in placex table\n            def _base_query() -> SaSelect:\n                return base.select_placex(t) \\\n                           .add_columns((-t.c.centroid.ST_Distance(NEAR_PARAM))\n                                        .label('importance'))\\\n                           .where(t.c.linked_place_id == None) \\\n                           .where(t.c.geometry.within_distance(NEAR_PARAM, NEAR_RADIUS_PARAM)) \\\n                           .order_by(t.c.centroid.ST_Distance(NEAR_PARAM)) \\\n                           .limit(LIMIT_PARAM)\n\n            classtype = self.qualifiers.values\n            if len(classtype) == 1:\n                cclass, ctype = classtype[0]\n                sql: SaLambdaSelect = sa.lambda_stmt(\n                    lambda: _base_query().where(t.c.class_ == cclass)\n                                         .where(t.c.type == ctype))\n            else:\n                sql = _base_query().where(sa.or_(*(sa.and_(t.c.class_ == cls, t.c.type == typ)\n                                                   for cls, typ in classtype)))\n\n            if self.countries:\n                sql = sql.where(t.c.country_code.in_(self.countries.values))\n\n            if details.viewbox is not None and details.bounded_viewbox:\n                sql = sql.where(t.c.geometry.intersects(VIEWBOX_PARAM))\n\n            if details.excluded:\n                sql = sql.where(base.exclude_places(t))\n\n            rows.extend(await conn.execute(sql, bind_params))\n        else:\n            # use the class type tables\n            for category in self.qualifiers.values:\n                table = await conn.get_class_table(*category)\n                if table is not None:\n                    sql = base.select_placex(t)\\\n                               .add_columns(t.c.importance)\\\n                               .join(table, t.c.place_id == table.c.place_id)\\\n                               .where(t.c.class_ == category[0])\\\n                               .where(t.c.type == category[1])\n\n                    if details.viewbox is not None and details.bounded_viewbox:\n                        sql = sql.where(table.c.centroid.intersects(VIEWBOX_PARAM))\n\n                    if details.near and details.near_radius is not None:\n                        sql = sql.order_by(table.c.centroid.ST_Distance(NEAR_PARAM))\\\n                                 .where(table.c.centroid.within_distance(NEAR_PARAM,\n                                                                         NEAR_RADIUS_PARAM))\n\n                    if self.countries:\n                        sql = sql.where(t.c.country_code.in_(self.countries.values))\n\n                    if details.excluded:\n                        sql = sql.where(base.exclude_places(t))\n\n                    sql = sql.limit(LIMIT_PARAM)\n                    rows.extend(await conn.execute(sql, bind_params))\n\n        results = nres.SearchResults()\n        for row in rows:\n            result = nres.create_from_placex_row(row, nres.SearchResult)\n            result.accuracy = self.penalty + self.qualifiers.get_penalty((row.class_, row.type))\n            result.bbox = Bbox.from_wkb(row.bbox)\n            results.append(result)\n\n        return results\n"
  },
  {
    "path": "src/nominatim_api/search/db_searches/postcode_search.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImplementation of search for a postcode.\n\"\"\"\n\nimport sqlalchemy as sa\n\nfrom . import base\nfrom ...typing import SaBind, SaExpression\nfrom ...sql.sqlalchemy_types import Geometry, IntArray\nfrom ...connection import SearchConnection\nfrom ...types import SearchDetails, Bbox\nfrom ... import results as nres\nfrom ..db_search_fields import SearchData\n\n\nLIMIT_PARAM: SaBind = sa.bindparam('limit')\nVIEWBOX_PARAM: SaBind = sa.bindparam('viewbox', type_=Geometry)\nVIEWBOX2_PARAM: SaBind = sa.bindparam('viewbox2', type_=Geometry)\nNEAR_PARAM: SaBind = sa.bindparam('near', type_=Geometry)\n\n\nclass PostcodeSearch(base.AbstractSearch):\n    \"\"\" Search for a postcode.\n    \"\"\"\n    def __init__(self, extra_penalty: float, sdata: SearchData) -> None:\n        super().__init__(sdata.penalty + extra_penalty)\n        self.countries = sdata.countries\n        self.postcodes = sdata.postcodes\n        self.lookups = sdata.lookups\n        self.rankings = sdata.rankings\n\n    async def lookup(self, conn: SearchConnection,\n                     details: SearchDetails) -> nres.SearchResults:\n        \"\"\" Find results for the search in the database.\n        \"\"\"\n        t = conn.t.postcode\n        pcs = self.postcodes.values\n\n        sql = sa.select(t.c.place_id, t.c.parent_place_id, t.c.osm_id,\n                        t.c.rank_search, t.c.postcode, t.c.country_code,\n                        t.c.centroid,\n                        t.c.geometry.ST_Expand(0).label('bbox'))\\\n                .where(t.c.postcode.in_(pcs))\n\n        if details.geometry_output:\n            pcgeom = sa.case((sa.func.ST_NPoints(t.c.geometry) > 5, t.c.geometry),\n                             else_=t.c.centroid)\n            sql = base.add_geometry_columns(sql, pcgeom, details)\n\n        penalty: SaExpression = sa.literal(self.penalty)\n\n        if details.viewbox is not None and not details.bounded_viewbox:\n            penalty += sa.case((t.c.geometry.intersects(VIEWBOX_PARAM), 0.0),\n                               (t.c.geometry.intersects(VIEWBOX2_PARAM), 0.5),\n                               else_=1.0)\n\n        if details.near is not None:\n            sql = sql.order_by(t.c.centroid.ST_Distance(NEAR_PARAM))\n\n        sql = base.filter_by_area(sql, t, details)\n\n        if self.countries:\n            sql = sql.where(t.c.country_code.in_(self.countries.values))\n\n        if details.excluded:\n            sql = sql.where(base.exclude_places(t))\n\n        if self.lookups:\n            assert len(self.lookups) == 1\n            tsearch = conn.t.search_name\n            sql = sql.where(tsearch.c.place_id == t.c.parent_place_id)\\\n                     .where((tsearch.c.name_vector + tsearch.c.nameaddress_vector)\n                            .contains(sa.type_coerce(self.lookups[0].tokens,\n                                                     IntArray)))\n            # Do NOT add rerank penalties based on the address terms.\n            # The standard rerank penalty only checks the address vector\n            # while terms may appear in name and address vector. This would\n            # lead to overly high penalties.\n            # We assume that a postcode is precise enough to not require\n            # additional full name matches.\n\n        penalty += sa.case(*((t.c.postcode == v, p) for v, p in self.postcodes),\n                           else_=1.0)\n\n        sql = sql.add_columns(penalty.label('accuracy'))\n        sql = sql.order_by('accuracy').limit(LIMIT_PARAM)\n\n        bind_params = {\n            'limit': details.max_results,\n            'viewbox': details.viewbox,\n            'viewbox2': details.viewbox_x2,\n            'near': details.near,\n            'near_radius': details.near_radius,\n            'excluded': details.excluded_place_ids\n        }\n\n        results = nres.SearchResults()\n        for row in await conn.execute(sql, bind_params):\n            result = nres.create_from_postcode_row(row, nres.SearchResult)\n\n            result.bbox = Bbox.from_wkb(row.bbox)\n            result.accuracy = row.accuracy\n            results.append(result)\n\n        return results\n"
  },
  {
    "path": "src/nominatim_api/search/geocoder.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nPublic interface to the search code.\n\"\"\"\nfrom typing import List, Any, Optional, Iterator, Tuple, Dict\nimport itertools\nimport re\nimport difflib\n\nimport sqlalchemy as sa\n\nfrom ..connection import SearchConnection\nfrom ..types import PlaceRef, SearchDetails, PlaceID, OsmID\nfrom ..results import SearchResult, SearchResults, add_result_details\nfrom ..timeout import Timeout\nfrom ..logging import log\nfrom .token_assignment import yield_token_assignments\nfrom .db_search_builder import SearchBuilder, build_poi_search, wrap_near_search\nfrom .db_searches import AbstractSearch\nfrom .query_analyzer_factory import make_query_analyzer, AbstractQueryAnalyzer\nfrom .query import Phrase, QueryStruct\n\n\nclass ForwardGeocoder:\n    \"\"\" Main class responsible for place search.\n    \"\"\"\n\n    def __init__(self, conn: SearchConnection,\n                 params: SearchDetails, timeout: Timeout) -> None:\n        self.conn = conn\n        self.params = params\n        self.timeout = timeout\n        self.query_analyzer: Optional[AbstractQueryAnalyzer] = None\n\n    @property\n    def limit(self) -> int:\n        \"\"\" Return the configured maximum number of search results.\n        \"\"\"\n        return self.params.max_results\n\n    async def _resolve_excluded_osm_ids(self) -> None:\n        \"\"\" Resolve any OsmID entries in the excluded list to PlaceID entries\n            by looking them up in the placex and location_postcode table.\n        \"\"\"\n        excluded = self.params.excluded\n        if not excluded or all(isinstance(e, PlaceID) for e in excluded):\n            return\n\n        place_ids: List[PlaceRef] = [e for e in excluded if isinstance(e, PlaceID)]\n        osm_ids = [e for e in excluded if isinstance(e, OsmID)]\n\n        if osm_ids:\n            t = self.conn.t.placex\n            conditions = [\n                sa.and_(t.c.osm_type == oid.osm_type, t.c.osm_id == oid.osm_id)\n                for oid in osm_ids\n            ]\n            sql = sa.select(t.c.place_id).where(sa.or_(*conditions))\n            place_ids.extend(PlaceID(row.place_id)\n                             for row in await self.conn.execute(sql))\n\n            relation_ids = [oid.osm_id for oid in osm_ids if oid.osm_type == 'R']\n            if relation_ids:\n                p = self.conn.t.postcode\n                sql = sa.select(p.c.place_id).where(p.c.osm_id.in_(relation_ids))\n                place_ids.extend(PlaceID(row.place_id)\n                                 for row in await self.conn.execute(sql))\n\n        self.params.excluded = place_ids\n\n    async def build_searches(self,\n                             phrases: List[Phrase]) -> Tuple[QueryStruct, List[AbstractSearch]]:\n        \"\"\" Analyse the query and return the tokenized query and list of\n            possible searches over it.\n        \"\"\"\n        if self.query_analyzer is None:\n            self.query_analyzer = await make_query_analyzer(self.conn)\n\n        query = await self.query_analyzer.analyze_query(phrases)\n        query.compute_direction_penalty()\n        log().var_dump('Query direction penalty',\n                       lambda: f\"[{'LR' if query.dir_penalty < 0 else 'RL'}] {query.dir_penalty}\")\n\n        searches: List[AbstractSearch] = []\n        if query.num_token_slots() > 0:\n            # 2. Compute all possible search interpretations\n            log().section('Compute abstract searches')\n            search_builder = SearchBuilder(query, self.params)\n            num_searches = 0\n            for assignment in yield_token_assignments(query):\n                searches.extend(search_builder.build(assignment))\n                if num_searches < len(searches):\n                    log().table_dump('Searches for assignment',\n                                     _dump_searches(searches, query, num_searches))\n                num_searches = len(searches)\n            searches.sort(key=lambda s: (s.penalty, s.SEARCH_PRIO))\n\n        return query, searches\n\n    async def execute_searches(self, query: QueryStruct,\n                               searches: List[AbstractSearch]) -> SearchResults:\n        \"\"\" Run the abstract searches against the database until a result\n            is found.\n        \"\"\"\n        log().section('Execute database searches')\n        results: Dict[Any, SearchResult] = {}\n        qs = self.params.query_stats\n\n        qs['search_min_penalty'] = round(searches[0].penalty, 2)\n        min_ranking = searches[0].penalty + 1.5\n        prev_penalty = 0.0\n        for i, search in enumerate(searches):\n            if search.penalty > prev_penalty and (search.penalty > min_ranking or i > 15):\n                break\n            log().table_dump(f\"{i + 1}. Search\", _dump_searches([search], query))\n            log().var_dump('Params', self.params)\n            lookup_results = await search.lookup(self.conn, self.params)\n            for result in lookup_results:\n                rhash = (result.source_table, result.place_id,\n                         result.housenumber, result.country_code)\n                prevresult = results.get(rhash)\n                if prevresult:\n                    prevresult.accuracy = min(prevresult.accuracy, result.accuracy)\n                else:\n                    if not results:\n                        qs['search_first_result_round'] = i\n                    spenalty = round(search.penalty, 2)\n                    if 'search_min_result_penalty' not in qs or \\\n                            spenalty < qs['search_min_result_penalty']:\n                        qs['search_min_result_penalty'] = spenalty\n                        qs['search_best_penalty_round'] = i\n                    results[rhash] = result\n                min_ranking = min(min_ranking,\n                                  search.penalty + 0.4,\n                                  result.accuracy + 0.1)\n            log().result_dump('Results', ((r.accuracy, r) for r in lookup_results))\n            prev_penalty = search.penalty\n            if self.timeout.is_elapsed():\n                break\n\n        qs['search_rounds'] = i + 1\n        return SearchResults(results.values())\n\n    def pre_filter_results(self, results: SearchResults) -> SearchResults:\n        \"\"\" Remove results that are significantly worse than the\n            best match.\n        \"\"\"\n        if results:\n            max_ranking = min(r.ranking for r in results) + 0.5\n            results = SearchResults(r for r in results if r.ranking < max_ranking)\n\n        return results\n\n    def sort_and_cut_results(self, results: SearchResults) -> SearchResults:\n        \"\"\" Remove badly matching results, sort by ranking and\n            limit to the configured number of results.\n        \"\"\"\n        results.sort(key=lambda r: (r.ranking, 0 if r.bbox is None else -r.bbox.area))\n\n        final = SearchResults()\n        min_rank = results[0].rank_search\n        min_ranking = results[0].ranking\n\n        for r in results:\n            if r.ranking + 0.03 * (r.rank_search - min_rank) < min_ranking + 0.5:\n                final.append(r)\n                min_rank = min(r.rank_search, min_rank)\n            if len(final) == self.limit:\n                break\n\n        return final\n\n    def rerank_by_query(self, query: QueryStruct, results: SearchResults) -> None:\n        \"\"\" Adjust the accuracy of the localized result according to how well\n            they match the original query.\n        \"\"\"\n        assert self.query_analyzer is not None\n        qwords = [word for phrase in query.source\n                  for word in re.split('[-,: ]+', phrase.text) if word]\n        if not qwords:\n            return\n\n        for result in results:\n            # Negative importance indicates ordering by distance, which is\n            # more important than word matching.\n            if not result.display_name\\\n               or (result.importance is not None and result.importance < 0):\n                continue\n            distance = 0.0\n            norm = self.query_analyzer.normalize_text(' '.join((result.display_name,\n                                                                result.country_code or '')))\n            words = set((w for w in re.split('[-,: ]+', norm) if w))\n            if not words:\n                continue\n            for qword in qwords:\n                # only add distance penalty if there is no perfect match\n                if qword not in words:\n                    wdist = max(difflib.SequenceMatcher(a=qword, b=w).quick_ratio() for w in words)\n                    distance += len(qword) if wdist < 0.4 else 1\n            # Countries with high importance can dominate results when matched\n            # via an alternate-language name. Apply a language-aware penalty\n            # to offset this.\n            if result.rank_address == 4:\n                if self.params.locales and result.names:\n                    loc_names = [result.names[t] for t in self.params.locales.name_tags\n                                 if t in result.names]\n                    if loc_names:\n                        norm_loc = self.query_analyzer.normalize_text(' '.join(loc_names))\n                        loc_words = set(w for w in re.split('[-,: ]+', norm_loc) if w)\n                        if loc_words and loc_words.isdisjoint(qwords):\n                            result.accuracy += result.calculated_importance() * 0.5\n                else:\n                    distance *= 2\n            result.accuracy += distance * 0.3 / sum(len(w) for w in qwords)\n\n    async def lookup_pois(self, categories: List[Tuple[str, str]],\n                          phrases: List[Phrase]) -> SearchResults:\n        \"\"\" Look up places by category. If phrase is given, a place search\n            over the phrase will be executed first and places close to the\n            results returned.\n        \"\"\"\n        log().function('forward_lookup_pois', categories=categories, params=self.params)\n\n        await self._resolve_excluded_osm_ids()\n\n        if phrases:\n            query, searches = await self.build_searches(phrases)\n\n            if query:\n                searches = [wrap_near_search(categories, s) for s in searches[:50]]\n                results = await self.execute_searches(query, searches)\n                results = self.pre_filter_results(results)\n                await add_result_details(self.conn, results, self.params)\n                log().result_dump('Preliminary Results', ((r.accuracy, r) for r in results))\n                results = self.sort_and_cut_results(results)\n            else:\n                results = SearchResults()\n        else:\n            search = build_poi_search(categories, self.params.countries)\n            results = await search.lookup(self.conn, self.params)\n            await add_result_details(self.conn, results, self.params)\n\n        log().result_dump('Final Results', ((r.accuracy, r) for r in results))\n\n        return results\n\n    async def lookup(self, phrases: List[Phrase]) -> SearchResults:\n        \"\"\" Look up a single free-text query.\n        \"\"\"\n        log().function('forward_lookup', phrases=phrases, params=self.params)\n        results = SearchResults()\n\n        if self.params.is_impossible():\n            return results\n\n        await self._resolve_excluded_osm_ids()\n\n        query, searches = await self.build_searches(phrases)\n\n        if searches:\n            # Execute SQL until an appropriate result is found.\n            results = await self.execute_searches(query, searches[:50])\n            results = self.pre_filter_results(results)\n            await add_result_details(self.conn, results, self.params)\n            log().result_dump('Preliminary Results', ((r.accuracy, r) for r in results))\n            if len(results) > 1:\n                self.rerank_by_query(query, results)\n                log().result_dump('Results after reranking', ((r.accuracy, r) for r in results))\n                results = self.sort_and_cut_results(results)\n            log().result_dump('Final Results', ((r.accuracy, r) for r in results))\n\n        return results\n\n\ndef _dump_searches(searches: List[AbstractSearch], query: QueryStruct,\n                   start: int = 0) -> Iterator[Optional[List[Any]]]:\n    yield ['Penalty', 'Lookups', 'Housenr', 'Postcode', 'Countries',\n           'Qualifier', 'Catgeory', 'Rankings']\n\n    def tk(tl: List[int]) -> str:\n        tstr = [f\"{query.find_lookup_word_by_id(t)}({t})\" for t in tl]\n\n        return f\"[{','.join(tstr)}]\"\n\n    def fmt_ranking(f: Any) -> str:\n        if not f:\n            return ''\n        ranks = ','.join((f\"{tk(r.tokens)}^{r.penalty:.3g}\" for r in f.rankings))\n        if len(ranks) > 100:\n            ranks = ranks[:100] + '...'\n        return f\"{f.column}({ranks},def={f.default:.3g})\"\n\n    def fmt_lookup(lk: Any) -> str:\n        if not lk:\n            return ''\n\n        return f\"{lk.lookup_type.__name__}({lk.column}{tk(lk.tokens)})\"\n\n    def fmt_cstr(c: Any) -> str:\n        if not c:\n            return ''\n\n        return f'{c[0]}^{c[1]}'\n\n    for search in searches[start:]:\n        fields = ('lookups', 'rankings', 'countries', 'housenumbers',\n                  'postcodes', 'qualifiers')\n        if hasattr(search, 'search'):\n            iters = itertools.zip_longest([f\"{search.penalty:.3g}\"],\n                                          *(getattr(search.search, attr, []) for attr in fields),\n                                          getattr(search, 'categories', []),\n                                          fillvalue='')\n        else:\n            iters = itertools.zip_longest([f\"{search.penalty:.3g}\"],\n                                          *(getattr(search, attr, []) for attr in fields),\n                                          [],\n                                          fillvalue='')\n        for penalty, lookup, rank, cc, hnr, pc, qual, cat in iters:\n            yield [penalty, fmt_lookup(lookup), fmt_cstr(hnr),\n                   fmt_cstr(pc), fmt_cstr(cc), fmt_cstr(qual), fmt_cstr(cat), fmt_ranking(rank)]\n        yield None\n"
  },
  {
    "path": "src/nominatim_api/search/icu_tokenizer.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImplementation of query analysis for the ICU tokenizer.\n\"\"\"\nfrom typing import Tuple, Dict, List, Optional, Iterator, Any, cast\nimport dataclasses\nimport difflib\nimport re\nfrom itertools import zip_longest\n\nfrom icu import Transliterator\n\nimport sqlalchemy as sa\n\nfrom ..errors import UsageError\nfrom ..typing import SaRow\nfrom ..sql.sqlalchemy_types import Json\nfrom ..connection import SearchConnection\nfrom ..logging import log\nfrom . import query as qmod\nfrom ..query_preprocessing.config import QueryConfig\nfrom ..query_preprocessing.base import QueryProcessingFunc\nfrom .query_analyzer_factory import AbstractQueryAnalyzer\nfrom .postcode_parser import PostcodeParser\n\n\nDB_TO_TOKEN_TYPE = {\n    'W': qmod.TOKEN_WORD,\n    'w': qmod.TOKEN_PARTIAL,\n    'H': qmod.TOKEN_HOUSENUMBER,\n    'P': qmod.TOKEN_POSTCODE,\n    'C': qmod.TOKEN_COUNTRY\n}\n\nPENALTY_BREAK = {\n     qmod.BREAK_START: -0.5,\n     qmod.BREAK_END: -0.5,\n     qmod.BREAK_PHRASE: -0.5,\n     qmod.BREAK_SOFT_PHRASE: -0.5,\n     qmod.BREAK_WORD: 0.1,\n     qmod.BREAK_PART: 0.2,\n     qmod.BREAK_TOKEN: 0.4\n}\n\n\n@dataclasses.dataclass\nclass ICUToken(qmod.Token):\n    \"\"\" Specialised token for ICU tokenizer.\n    \"\"\"\n    word_token: str\n    info: Optional[Dict[str, Any]]\n\n    def get_category(self) -> Tuple[str, str]:\n        assert self.info\n        return self.info.get('class', ''), self.info.get('type', '')\n\n    def get_country(self) -> str:\n        assert self.info\n        return cast(str, self.info.get('cc', ''))\n\n    def match_penalty(self, norm: str) -> float:\n        \"\"\" Check how well the token matches the given normalized string\n            and add a penalty, if necessary.\n        \"\"\"\n        if not self.lookup_word:\n            return 0.0\n\n        seq = difflib.SequenceMatcher(a=self.lookup_word, b=norm)\n        distance = 0\n        for tag, afrom, ato, bfrom, bto in seq.get_opcodes():\n            if tag in ('delete', 'insert') and (afrom == 0 or ato == len(self.lookup_word)):\n                distance += 1\n            elif tag == 'replace':\n                distance += max((ato-afrom), (bto-bfrom))\n            elif tag != 'equal':\n                distance += abs((ato-afrom) - (bto-bfrom))\n        return (distance/len(self.lookup_word))\n\n    @staticmethod\n    def from_db_row(row: SaRow) -> 'ICUToken':\n        \"\"\" Create a ICUToken from the row of the word table.\n        \"\"\"\n        count = 1 if row.info is None else row.info.get('count', 1)\n        addr_count = 1 if row.info is None else row.info.get('addr_count', 1)\n\n        penalty = 0.0\n        if row.type == 'w':\n            penalty += 0.3\n        elif row.type == 'W':\n            if len(row.word_token) == 1 and row.word_token == row.word:\n                penalty += 0.2 if row.word.isdigit() else 0.3\n        elif row.type == 'H':\n            penalty += sum(0.1 for c in row.word_token if c != ' ' and not c.isdigit())\n            if all(not c.isdigit() for c in row.word_token):\n                penalty += 0.2 * (len(row.word_token) - 1)\n        elif row.type == 'C':\n            if len(row.word_token) == 1:\n                penalty += 0.3\n\n        if row.info is None:\n            lookup_word = row.word\n        else:\n            lookup_word = row.info.get('lookup', row.word)\n        if lookup_word:\n            lookup_word = lookup_word.split('@', 1)[0]\n        else:\n            lookup_word = row.word_token\n\n        return ICUToken(penalty=penalty, token=row.word_id, count=max(1, count),\n                        lookup_word=lookup_word,\n                        word_token=row.word_token, info=row.info,\n                        addr_count=max(1, addr_count))\n\n\n@dataclasses.dataclass\nclass ICUAnalyzerConfig:\n    postcode_parser: PostcodeParser\n    normalizer: Transliterator\n    transliterator: Transliterator\n    preprocessors: List[QueryProcessingFunc]\n\n    @staticmethod\n    async def create(conn: SearchConnection) -> 'ICUAnalyzerConfig':\n        rules = await conn.get_property('tokenizer_import_normalisation')\n        normalizer = Transliterator.createFromRules(\"normalization\", rules)\n\n        rules = await conn.get_property('tokenizer_import_transliteration')\n        transliterator = Transliterator.createFromRules(\"transliteration\", rules)\n\n        preprocessing_rules = conn.config.load_sub_configuration('icu_tokenizer.yaml',\n                                                                 config='TOKENIZER_CONFIG')\\\n                                         .get('query-preprocessing', [])\n\n        preprocessors: List[QueryProcessingFunc] = []\n        for func in preprocessing_rules:\n            if 'step' not in func:\n                raise UsageError(\"Preprocessing rule is missing the 'step' attribute.\")\n            if not isinstance(func['step'], str):\n                raise UsageError(\"'step' attribute must be a simple string.\")\n\n            module = conn.config.load_plugin_module(\n                        func['step'], 'nominatim_api.query_preprocessing')\n            preprocessors.append(\n                module.create(QueryConfig(func).set_normalizer(normalizer)))\n\n        return ICUAnalyzerConfig(PostcodeParser(conn.config),\n                                 normalizer, transliterator, preprocessors)\n\n\nclass ICUQueryAnalyzer(AbstractQueryAnalyzer):\n    \"\"\" Converter for query strings into a tokenized query\n        using the tokens created by a ICU tokenizer.\n    \"\"\"\n    def __init__(self, conn: SearchConnection, config: ICUAnalyzerConfig) -> None:\n        self.conn = conn\n        self.postcode_parser = config.postcode_parser\n        self.normalizer = config.normalizer\n        self.transliterator = config.transliterator\n        self.preprocessors = config.preprocessors\n\n    async def analyze_query(self, phrases: List[qmod.Phrase]) -> qmod.QueryStruct:\n        \"\"\" Analyze the given list of phrases and return the\n            tokenized query.\n        \"\"\"\n        log().section('Analyze query (using ICU tokenizer)')\n        for func in self.preprocessors:\n            phrases = func(phrases)\n        query = qmod.QueryStruct(phrases)\n\n        log().var_dump('Normalized query', query.source)\n        if not query.source:\n            return query\n\n        self.split_query(query)\n        log().var_dump('Transliterated query',\n                       lambda: ''.join(f\"{n.term_lookup}{n.btype}\" for n in query.nodes)\n                               + ' / '\n                               + ''.join(f\"{n.term_normalized}{n.btype}\" for n in query.nodes))\n        words = query.extract_words()\n\n        for row in await self.lookup_in_db(list(words.keys())):\n            for trange in words[row.word_token]:\n                # Create a new token for each position because the token\n                # penalty can vary depending on the position in the query.\n                # (See rerank_tokens() below.)\n                token = ICUToken.from_db_row(row)\n                if row.type == 'S':\n                    if row.info['op'] in ('in', 'near'):\n                        if trange.start == 0:\n                            query.add_token(trange, qmod.TOKEN_NEAR_ITEM, token)\n                    else:\n                        if trange.start == 0 and trange.end == query.num_token_slots():\n                            query.add_token(trange, qmod.TOKEN_NEAR_ITEM, token)\n                        else:\n                            query.add_token(trange, qmod.TOKEN_QUALIFIER, token)\n                else:\n                    query.add_token(trange, DB_TO_TOKEN_TYPE[row.type], token)\n\n        self.add_extra_tokens(query)\n        for start, end, pc in self.postcode_parser.parse(query):\n            term = ' '.join(n.term_lookup for n in query.nodes[start + 1:end + 1])\n            query.add_token(qmod.TokenRange(start, end),\n                            qmod.TOKEN_POSTCODE,\n                            ICUToken(penalty=0.0, token=0, count=1, addr_count=1,\n                                     lookup_word=pc, word_token=term,\n                                     info=None))\n        self.rerank_tokens(query)\n        self.compute_break_penalties(query)\n\n        log().table_dump('Word tokens', _dump_word_tokens(query))\n\n        return query\n\n    def normalize_text(self, text: str) -> str:\n        \"\"\" Bring the given text into a normalized form. That is the\n            standardized form search will work with. All information removed\n            at this stage is inevitably lost.\n        \"\"\"\n        return cast(str, self.normalizer.transliterate(text)).strip('-: ')\n\n    def split_transliteration(self, trans: str, word: str) -> list[tuple[str, str]]:\n        \"\"\" Split the given transliteration string into sub-words and\n            return them together with the original part of the word.\n        \"\"\"\n        subwords = trans.split(' ')\n\n        if len(subwords) == 1:\n            return [(trans, word)]\n\n        tlist = []\n        titer = filter(None, subwords)\n        current_trans: Optional[str] = next(titer)\n        assert current_trans\n        current_word = ''\n        for letter in word:\n            current_word += letter\n            if self.transliterator.transliterate(current_word).rstrip() == current_trans:\n                tlist.append((current_trans, current_word))\n                current_trans = next(titer, None)\n                if current_trans is None:\n                    return tlist\n                current_word = ''\n\n        if current_word:\n            tlist.append((current_trans, current_word))\n\n        return tlist\n\n    def split_query(self, query: qmod.QueryStruct) -> None:\n        \"\"\" Transliterate the phrases and split them into tokens.\n        \"\"\"\n        for phrase in query.source:\n            query.nodes[-1].ptype = phrase.ptype\n            phrase_split = re.split('([ :-])', phrase.text)\n            # The zip construct will give us the pairs of word/break from\n            # the regular expression split. As the split array ends on the\n            # final word, we simply use the fillvalue to even out the list and\n            # add the phrase break at the end.\n            for word, breakchar in zip_longest(*[iter(phrase_split)]*2, fillvalue=','):\n                if not word:\n                    continue\n                if trans := self.transliterator.transliterate(word):\n                    for term, term_word in self.split_transliteration(trans, word):\n                        if term:\n                            query.add_node(qmod.BREAK_TOKEN, phrase.ptype, term, term_word)\n                    query.nodes[-1].btype = breakchar\n\n        query.nodes[-1].btype = qmod.BREAK_END\n\n    async def lookup_in_db(self, words: List[str]) -> 'sa.Result[Any]':\n        \"\"\" Return the token information from the database for the\n            given word tokens.\n\n            This function excludes postcode tokens\n        \"\"\"\n        t = self.conn.t.meta.tables['word']\n        return await self.conn.execute(t.select()\n                                        .where(t.c.word_token.in_(words))\n                                        .where(t.c.type != 'P'))\n\n    def add_extra_tokens(self, query: qmod.QueryStruct) -> None:\n        \"\"\" Add tokens to query that are not saved in the database.\n        \"\"\"\n        need_hnr = False\n        for i, node in enumerate(query.nodes):\n            is_full_token = node.btype not in (qmod.BREAK_TOKEN, qmod.BREAK_PART)\n            if need_hnr and is_full_token \\\n                    and len(node.term_normalized) <= 4 and node.term_normalized.isdigit():\n                query.add_token(qmod.TokenRange(i-1, i), qmod.TOKEN_HOUSENUMBER,\n                                ICUToken(penalty=0.2, token=0,\n                                         count=1, addr_count=1,\n                                         lookup_word=node.term_lookup,\n                                         word_token=node.term_lookup, info=None))\n\n            need_hnr = is_full_token and not node.has_tokens(i+1, qmod.TOKEN_HOUSENUMBER)\n\n    def rerank_tokens(self, query: qmod.QueryStruct) -> None:\n        \"\"\" Add penalties to tokens that depend on presence of other token.\n        \"\"\"\n        for start, end, tlist in query.iter_tokens_by_edge():\n            if len(tlist) > 1:\n                # If it looks like a Postcode, give preference.\n                if qmod.TOKEN_POSTCODE in tlist:\n                    for ttype, tokens in tlist.items():\n                        if ttype != qmod.TOKEN_POSTCODE and \\\n                               (ttype != qmod.TOKEN_HOUSENUMBER or\n                                start + 1 > end or\n                                len(query.nodes[end].term_lookup) > 4):\n                            for token in tokens:\n                                token.penalty += 0.39\n                        if (start + 1 == end):\n                            if partial := query.nodes[start].partial:\n                                partial.penalty += 0.39\n\n                # If it looks like a simple housenumber, prefer that.\n                if qmod.TOKEN_HOUSENUMBER in tlist:\n                    hnr_lookup = tlist[qmod.TOKEN_HOUSENUMBER][0].lookup_word\n                    if len(hnr_lookup) <= 3 and any(c.isdigit() for c in hnr_lookup):\n                        penalty = 0.5 - tlist[qmod.TOKEN_HOUSENUMBER][0].penalty\n                        for ttype, tokens in tlist.items():\n                            if ttype != qmod.TOKEN_HOUSENUMBER:\n                                for token in tokens:\n                                    token.penalty += penalty\n                        if (start + 1 == end):\n                            if partial := query.nodes[start].partial:\n                                partial.penalty += penalty\n\n            # rerank tokens against the normalized form\n            norm = ''.join(f\"{n.term_normalized}{'' if n.btype == qmod.BREAK_TOKEN else ' '}\"\n                           for n in query.nodes[start + 1:end + 1]).strip()\n            for ttype, tokens in tlist.items():\n                for token in tokens:\n                    itok = cast(ICUToken, token)\n                    itok.penalty += itok.match_penalty(norm) * \\\n                        (1 if ttype in (qmod.TOKEN_WORD, qmod.TOKEN_PARTIAL) else 2)\n\n    def compute_break_penalties(self, query: qmod.QueryStruct) -> None:\n        \"\"\" Set the break penalties for the nodes in the query.\n        \"\"\"\n        for node in query.nodes:\n            node.penalty = PENALTY_BREAK[node.btype]\n\n\ndef _dump_word_tokens(query: qmod.QueryStruct) -> Iterator[List[Any]]:\n    yield ['type', 'from', 'to', 'token', 'word_token', 'lookup_word', 'penalty', 'count', 'info']\n    for i, node in enumerate(query.nodes):\n        if node.partial is not None:\n            t = cast(ICUToken, node.partial)\n            yield [qmod.TOKEN_PARTIAL, str(i), str(i + 1), t.token,\n                   t.word_token, t.lookup_word, t.penalty, t.count, t.info]\n        for tlist in node.starting:\n            for token in tlist.tokens:\n                t = cast(ICUToken, token)\n                yield [tlist.ttype, str(i), str(tlist.end), t.token, t.word_token or '',\n                       t.lookup_word or '', t.penalty, t.count, t.info]\n\n\nasync def create_query_analyzer(conn: SearchConnection) -> AbstractQueryAnalyzer:\n    \"\"\" Create and set up a new query analyzer for a database based\n        on the ICU tokenizer.\n    \"\"\"\n    async def _get_config() -> ICUAnalyzerConfig:\n        if 'word' not in conn.t.meta.tables:\n            sa.Table('word', conn.t.meta,\n                     sa.Column('word_id', sa.Integer),\n                     sa.Column('word_token', sa.Text, nullable=False),\n                     sa.Column('type', sa.Text, nullable=False),\n                     sa.Column('word', sa.Text),\n                     sa.Column('info', Json))\n\n        return await ICUAnalyzerConfig.create(conn)\n\n    config = await conn.get_cached_value('ICUTOK', 'config', _get_config)\n\n    return ICUQueryAnalyzer(conn, config)\n"
  },
  {
    "path": "src/nominatim_api/search/postcode_parser.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nHandling of arbitrary postcode tokens in tokenized query string.\n\"\"\"\nfrom typing import Tuple, Set, Dict, List\nimport re\nfrom collections import defaultdict\n\nimport yaml\n\nfrom ..config import Configuration\nfrom . import query as qmod\n\n\nclass PostcodeParser:\n    \"\"\" Pattern-based parser for postcodes in tokenized queries.\n\n        The postcode patterns are read from the country configuration.\n        The parser does currently not return country restrictions.\n    \"\"\"\n\n    def __init__(self, config: Configuration) -> None:\n        # skip over includes here to avoid loading the complete country name data\n        yaml.add_constructor('!include', lambda loader, node: [],\n                             Loader=yaml.SafeLoader)\n        cdata = yaml.safe_load(config.find_config_file('country_settings.yaml')\n                                     .read_text(encoding='utf-8'))\n\n        unique_patterns: Dict[str, Dict[str, List[str]]] = {}\n        for cc, data in cdata.items():\n            if data.get('postcode'):\n                pat = data['postcode']['pattern'].replace('d', '[0-9]').replace('l', '[A-Z]')\n                out = data['postcode'].get('output')\n                if pat not in unique_patterns:\n                    unique_patterns[pat] = defaultdict(list)\n                unique_patterns[pat][out].append(cc.upper())\n\n        self.global_pattern = re.compile(\n                '(?:(?P<cc>[A-Z][A-Z])(?P<space>[ -]?))?(?P<pc>(?:(?:'\n                + ')|(?:'.join(unique_patterns) + '))[:, >].*)')\n\n        self.local_patterns = [(re.compile(f\"{pat}[:, >]\"), list(info.items()))\n                               for pat, info in unique_patterns.items()]\n\n    def parse(self, query: qmod.QueryStruct) -> Set[Tuple[int, int, str]]:\n        \"\"\" Parse postcodes in the given list of query tokens taking into\n            account the list of breaks from the nodes.\n\n            The result is a sequence of tuples with\n            [start node id, end node id, postcode token]\n        \"\"\"\n        nodes = query.nodes\n        outcodes: Set[Tuple[int, int, str]] = set()\n\n        terms = [n.term_normalized.upper() + n.btype for n in nodes]\n        for i in range(query.num_token_slots()):\n            if nodes[i].btype in '<,: ' and nodes[i + 1].btype != '`' \\\n                    and (i == 0 or nodes[i - 1].ptype != qmod.PHRASE_POSTCODE):\n                if nodes[i].ptype == qmod.PHRASE_ANY:\n                    word = terms[i + 1]\n                    if word[-1] in ' -' and nodes[i + 2].btype != '`' \\\n                            and nodes[i + 1].ptype == qmod.PHRASE_ANY:\n                        word += terms[i + 2]\n                        if word[-1] in ' -' and nodes[i + 3].btype != '`' \\\n                                and nodes[i + 2].ptype == qmod.PHRASE_ANY:\n                            word += terms[i + 3]\n\n                    self._match_word(word, i, False, outcodes)\n                elif nodes[i].ptype == qmod.PHRASE_POSTCODE:\n                    word = terms[i + 1]\n                    for j in range(i + 1, query.num_token_slots()):\n                        if nodes[j].ptype != qmod.PHRASE_POSTCODE:\n                            break\n                        word += terms[j + 1]\n\n                    self._match_word(word, i, True, outcodes)\n\n        return outcodes\n\n    def _match_word(self, word: str, pos: int, fullmatch: bool,\n                    outcodes: Set[Tuple[int, int, str]]) -> None:\n        # Use global pattern to check for presence of any postcode.\n        m = self.global_pattern.fullmatch(word)\n        if m:\n            # If there was a match, check against each pattern separately\n            # because multiple patterns might be machting at the end.\n            cc = m.group('cc')\n            pc_word = m.group('pc')\n            cc_spaces = len(m.group('space') or '')\n            for pattern, info in self.local_patterns:\n                lm = pattern.fullmatch(pc_word) if fullmatch else pattern.match(pc_word)\n                if lm:\n                    trange = (pos, pos + cc_spaces + sum(c in ' ,-:>' for c in lm.group(0)))\n                    for out, out_ccs in info:\n                        if cc is None or cc in out_ccs:\n                            if out:\n                                outcodes.add((*trange, lm.expand(out)))\n                            else:\n                                outcodes.add((*trange, lm.group(0)[:-1]))\n"
  },
  {
    "path": "src/nominatim_api/search/query.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nDatastructures for a tokenized query.\n\"\"\"\nfrom typing import Dict, List, Tuple, Optional, Iterator\nfrom abc import ABC, abstractmethod\nfrom collections import defaultdict\nimport dataclasses\n\n# Precomputed denominator for the computation of the linear regression slope\n# used to determine the query direction.\n# The x value for the regression computation will be the position of the\n# token in the query. Thus we know the x values will be [0, query length).\n# As the denominator only depends on the x values, we can pre-compute here\n# the denominator to use for a given query length.\n# Note that query length of two or less is special cased and will not use\n# the values from this array. Thus it is not a problem that they are 0.\nLINFAC = [i * (sum(si * si for si in range(i)) - (i - 1) * i * (i - 1) / 4)\n          for i in range(50)]\n\n\nBreakType = str\n\"\"\" Type of break between tokens.\n\"\"\"\nBREAK_START = '<'\n\"\"\" Begin of the query. \"\"\"\nBREAK_END = '>'\n\"\"\" End of the query. \"\"\"\nBREAK_PHRASE = ','\n\"\"\" Hard break between two phrases. Address parts cannot cross hard\n    phrase boundaries.\"\"\"\nBREAK_SOFT_PHRASE = ':'\n\"\"\" Likely break between two phrases. Address parts should not cross soft\n    phrase boundaries. Soft breaks can be inserted by a preprocessor\n    that is analysing the input string.\n\"\"\"\nBREAK_WORD = ' '\n\"\"\" Break between words. \"\"\"\nBREAK_PART = '-'\n\"\"\" Break inside a word, for example a hyphen or apostrophe. \"\"\"\nBREAK_TOKEN = '`'\n\"\"\" Break created as a result of tokenization.\n    This may happen in languages without spaces between words.\n\"\"\"\n\n\nTokenType = str\n\"\"\" Type of token.\n\"\"\"\nTOKEN_WORD = 'W'\n\"\"\" Full name of a place. \"\"\"\nTOKEN_PARTIAL = 'w'\n\"\"\" Word term without breaks, does not necessarily represent a full name. \"\"\"\nTOKEN_HOUSENUMBER = 'H'\n\"\"\" Housenumber term. \"\"\"\nTOKEN_POSTCODE = 'P'\n\"\"\" Postal code term. \"\"\"\nTOKEN_COUNTRY = 'C'\n\"\"\" Country name or reference. \"\"\"\nTOKEN_QUALIFIER = 'Q'\n\"\"\" Special term used together with name (e.g. _Hotel_ Bellevue). \"\"\"\nTOKEN_NEAR_ITEM = 'N'\n\"\"\" Special term used as searchable object(e.g. supermarket in ...). \"\"\"\n\n\nPhraseType = int\n\"\"\" Designation of a phrase.\n\"\"\"\nPHRASE_ANY = 0\n\"\"\" No specific designation (i.e. source is free-form query). \"\"\"\nPHRASE_AMENITY = 1\n\"\"\" Contains name or type of a POI. \"\"\"\nPHRASE_STREET = 2\n\"\"\" Contains a street name optionally with a housenumber. \"\"\"\nPHRASE_CITY = 3\n\"\"\" Contains the postal city. \"\"\"\nPHRASE_COUNTY = 4\n\"\"\" Contains the equivalent of a county. \"\"\"\nPHRASE_STATE = 5\n\"\"\" Contains a state or province. \"\"\"\nPHRASE_POSTCODE = 6\n\"\"\" Contains a postal code. \"\"\"\nPHRASE_COUNTRY = 7\n\"\"\" Contains the country name or code. \"\"\"\n\n\ndef _phrase_compatible_with(ptype: PhraseType, ttype: TokenType,\n                            is_full_phrase: bool) -> bool:\n    \"\"\" Check if the given token type can be used with the phrase type.\n    \"\"\"\n    if ptype == PHRASE_ANY:\n        return not is_full_phrase or ttype != TOKEN_QUALIFIER\n    if ptype == PHRASE_AMENITY:\n        return ttype in (TOKEN_WORD, TOKEN_PARTIAL)\\\n               or (is_full_phrase and ttype == TOKEN_NEAR_ITEM)\\\n               or (not is_full_phrase and ttype == TOKEN_QUALIFIER)\n    if ptype == PHRASE_STREET:\n        return ttype in (TOKEN_WORD, TOKEN_PARTIAL, TOKEN_HOUSENUMBER)\n    if ptype == PHRASE_POSTCODE:\n        return ttype == TOKEN_POSTCODE\n    if ptype == PHRASE_COUNTRY:\n        return ttype == TOKEN_COUNTRY\n\n    return ttype in (TOKEN_WORD, TOKEN_PARTIAL)\n\n\n@dataclasses.dataclass\nclass Token(ABC):\n    \"\"\" Base type for tokens.\n        Specific query analyzers must implement the concrete token class.\n    \"\"\"\n\n    penalty: float\n    token: int\n    count: int\n    addr_count: int\n    lookup_word: str\n\n    @abstractmethod\n    def get_category(self) -> Tuple[str, str]:\n        \"\"\" Return the category restriction for qualifier terms and\n            category objects.\n        \"\"\"\n\n    @abstractmethod\n    def get_country(self) -> str:\n        \"\"\" Return the country code this token is associated with\n            (currently for country tokens only).\n        \"\"\"\n\n\n@dataclasses.dataclass\nclass TokenRange:\n    \"\"\" Indexes of query nodes over which a token spans.\n    \"\"\"\n    start: int\n    end: int\n\n    def __lt__(self, other: 'TokenRange') -> bool:\n        return self.end <= other.start\n\n    def __le__(self, other: 'TokenRange') -> bool:\n        return NotImplemented\n\n    def __gt__(self, other: 'TokenRange') -> bool:\n        return self.start >= other.end\n\n    def __ge__(self, other: 'TokenRange') -> bool:\n        return NotImplemented\n\n    def replace_start(self, new_start: int) -> 'TokenRange':\n        \"\"\" Return a new token range with the new start.\n        \"\"\"\n        return TokenRange(new_start, self.end)\n\n    def replace_end(self, new_end: int) -> 'TokenRange':\n        \"\"\" Return a new token range with the new end.\n        \"\"\"\n        return TokenRange(self.start, new_end)\n\n    def split(self, index: int) -> Tuple['TokenRange', 'TokenRange']:\n        \"\"\" Split the span into two spans at the given index.\n            The index must be within the span.\n        \"\"\"\n        return self.replace_end(index), self.replace_start(index)\n\n\n@dataclasses.dataclass\nclass TokenList:\n    \"\"\" List of all tokens of a given type going from one breakpoint to another.\n    \"\"\"\n    end: int\n    ttype: TokenType\n    tokens: List[Token]\n\n    def add_penalty(self, penalty: float) -> None:\n        \"\"\" Add the given penalty to all tokens in the list.\n        \"\"\"\n        for token in self.tokens:\n            token.penalty += penalty\n\n\n@dataclasses.dataclass\nclass QueryNode:\n    \"\"\" A node of the query representing a break between terms.\n\n        The node also contains information on the source term\n        ending at the node. The tokens are created from this information.\n    \"\"\"\n    btype: BreakType\n    ptype: PhraseType\n\n    penalty: float\n    \"\"\" Penalty for having a word break at this position. The penalty\n        may be negative, when a word break is more likely than continuing\n        the word after the node.\n    \"\"\"\n    term_lookup: str\n    \"\"\" Transliterated term ending at this node.\n    \"\"\"\n    term_normalized: str\n    \"\"\" Normalised form of term ending at this node.\n    \"\"\"\n\n    starting: List[TokenList] = dataclasses.field(default_factory=list)\n    \"\"\" List of all full tokens starting at this node.\n    \"\"\"\n    partial: Optional[Token] = None\n    \"\"\" Base token going to the next node.\n        May be None when the query has parts for which no words are known.\n        Note that the query may still be parsable when there are other\n        types of tokens spanning over the gap.\n    \"\"\"\n\n    @property\n    def word_break_penalty(self) -> float:\n        \"\"\" Penalty to apply when a words ends at this node.\n        \"\"\"\n        return max(0, self.penalty)\n\n    @property\n    def word_continuation_penalty(self) -> float:\n        \"\"\" Penalty to apply when a word continues over this node\n            (i.e. is a multi-term word).\n        \"\"\"\n        return max(0, -self.penalty)\n\n    def name_address_ratio(self) -> float:\n        \"\"\" Return the probability that the partial token belonging to\n            this node forms part of a name (as opposed of part of the address).\n        \"\"\"\n        if self.partial is None:\n            return 0.5\n\n        return self.partial.count / (self.partial.count + self.partial.addr_count)\n\n    def has_tokens(self, end: int, *ttypes: TokenType) -> bool:\n        \"\"\" Check if there are tokens of the given types ending at the\n            given node.\n        \"\"\"\n        return any(tl.end == end and tl.ttype in ttypes for tl in self.starting)\n\n    def get_tokens(self, end: int, ttype: TokenType) -> Optional[List[Token]]:\n        \"\"\" Get the list of tokens of the given type starting at this node\n            and ending at the node 'end'. Returns 'None' if no such\n            tokens exist.\n        \"\"\"\n        for tlist in self.starting:\n            if tlist.end == end and tlist.ttype == ttype:\n                return tlist.tokens\n        return None\n\n\n@dataclasses.dataclass\nclass Phrase:\n    \"\"\" A normalized query part. Phrases may be typed which means that\n        they then represent a specific part of the address.\n    \"\"\"\n    ptype: PhraseType\n    text: str\n\n\nclass QueryStruct:\n    \"\"\" A tokenized search query together with the normalized source\n        from which the tokens have been parsed.\n\n        The query contains a list of nodes that represent the breaks\n        between words. Tokens span between nodes, which don't necessarily\n        need to be direct neighbours. Thus the query is represented as a\n        directed acyclic graph.\n\n        A query also has a direction penalty 'dir_penalty'. This describes\n        the likelihood if the query should be read from left-to-right or\n        vice versa. A negative 'dir_penalty' should be read as a penalty on\n        right-to-left reading, while a positive value represents a penalty\n        for left-to-right reading. The default value is 0, which is equivalent\n        to having no information about the reading.\n\n        When created, a query contains a single node: the start of the\n        query. Further nodes can be added by appending to 'nodes'.\n    \"\"\"\n\n    def __init__(self, source: List[Phrase]) -> None:\n        self.source = source\n        self.dir_penalty = 0.0\n        self.nodes: List[QueryNode] = \\\n            [QueryNode(BREAK_START, source[0].ptype if source else PHRASE_ANY,\n                       0.0, '', '')]\n\n    def num_token_slots(self) -> int:\n        \"\"\" Return the length of the query in vertice steps.\n        \"\"\"\n        return len(self.nodes) - 1\n\n    def add_node(self, btype: BreakType, ptype: PhraseType,\n                 term_lookup: str = '', term_normalized: str = '') -> None:\n        \"\"\" Append a new break node with the given break type.\n            The phrase type denotes the type for any tokens starting\n            at the node.\n        \"\"\"\n        self.nodes.append(QueryNode(btype, ptype, 0.0, term_lookup, term_normalized))\n\n    def add_token(self, trange: TokenRange, ttype: TokenType, token: Token) -> None:\n        \"\"\" Add a token to the query. 'start' and 'end' are the indexes of the\n            nodes from which to which the token spans. The indexes must exist\n            and are expected to be in the same phrase.\n            'ttype' denotes the type of the token and 'token' the token to\n            be inserted.\n\n            If the token type is not compatible with the phrase it should\n            be added to, then the token is silently dropped.\n        \"\"\"\n        snode = self.nodes[trange.start]\n        if ttype == TOKEN_PARTIAL:\n            assert snode.partial is None\n            if _phrase_compatible_with(snode.ptype, TOKEN_PARTIAL, False):\n                snode.partial = token\n        else:\n            full_phrase = snode.btype in (BREAK_START, BREAK_PHRASE)\\\n                and self.nodes[trange.end].btype in (BREAK_PHRASE, BREAK_END)\n            if _phrase_compatible_with(snode.ptype, ttype, full_phrase):\n                tlist = snode.get_tokens(trange.end, ttype)\n                if tlist is None:\n                    snode.starting.append(TokenList(trange.end, ttype, [token]))\n                else:\n                    tlist.append(token)\n\n    def compute_direction_penalty(self) -> None:\n        \"\"\" Recompute the direction probability from the partial tokens\n            of each node.\n        \"\"\"\n        n = len(self.nodes) - 1\n        if n <= 1 or n >= 50:\n            self.dir_penalty = 0\n        elif n == 2:\n            self.dir_penalty = (self.nodes[1].name_address_ratio()\n                                - self.nodes[0].name_address_ratio()) / 3\n        else:\n            ratios = [n.name_address_ratio() for n in self.nodes[:-1]]\n            self.dir_penalty = (n * sum(i * r for i, r in enumerate(ratios))\n                                - sum(ratios) * n * (n - 1) / 2) / LINFAC[n]\n\n    def get_tokens(self, trange: TokenRange, ttype: TokenType) -> List[Token]:\n        \"\"\" Get the list of tokens of a given type, spanning the given\n            nodes. The nodes must exist. If no tokens exist, an\n            empty list is returned.\n\n            Cannot be used to get the partial token.\n        \"\"\"\n        assert ttype != TOKEN_PARTIAL\n        return self.nodes[trange.start].get_tokens(trange.end, ttype) or []\n\n    def get_in_word_penalty(self, trange: TokenRange) -> float:\n        \"\"\" Gets the sum of penalties for all token transitions\n            within the given range.\n        \"\"\"\n        return sum(n.word_continuation_penalty\n                   for n in self.nodes[trange.start + 1:trange.end])\n\n    def iter_partials(self, trange: TokenRange) -> Iterator[Token]:\n        \"\"\" Iterate over the partial tokens between the given nodes.\n            Missing partials are ignored.\n        \"\"\"\n        return (n.partial for n in self.nodes[trange.start:trange.end] if n.partial is not None)\n\n    def iter_tokens_by_edge(self) -> Iterator[Tuple[int, int, Dict[TokenType, List[Token]]]]:\n        \"\"\" Iterator over all tokens except partial ones grouped by edge.\n\n            Returns the start and end node indexes and a dictionary\n            of list of tokens by token type.\n        \"\"\"\n        for i, node in enumerate(self.nodes):\n            by_end: Dict[int, Dict[TokenType, List[Token]]] = defaultdict(dict)\n            for tlist in node.starting:\n                by_end[tlist.end][tlist.ttype] = tlist.tokens\n            for end, endlist in by_end.items():\n                yield i, end, endlist\n\n    def find_lookup_word_by_id(self, token: int) -> str:\n        \"\"\" Find the first token with the given token ID and return\n            its lookup word. Returns 'None' if no such token exists.\n            The function is very slow and must only be used for\n            debugging.\n        \"\"\"\n        for node in self.nodes:\n            if node.partial is not None and node.partial.token == token:\n                return f\"[P]{node.partial.lookup_word}\"\n            for tlist in node.starting:\n                for t in tlist.tokens:\n                    if t.token == token:\n                        return f\"[{tlist.ttype}]{t.lookup_word}\"\n        return 'None'\n\n    def extract_words(self, start: int = 0,\n                      endpos: Optional[int] = None) -> Dict[str, List[TokenRange]]:\n        \"\"\" Add all combinations of words that can be formed from the terms\n            between the given start and endnode. The terms are joined with\n            spaces for each break. Words can never go across a BREAK_PHRASE.\n\n            The functions returns a dictionary of possible words with their\n            position within the query.\n        \"\"\"\n        if endpos is None:\n            endpos = len(self.nodes)\n\n        words: Dict[str, List[TokenRange]] = defaultdict(list)\n\n        for first, first_node in enumerate(self.nodes[start + 1:endpos], start):\n            word = first_node.term_lookup\n            words[word].append(TokenRange(first, first + 1))\n            if first_node.btype != BREAK_PHRASE:\n                max_last = min(first + 20, endpos)\n                for last, last_node in enumerate(self.nodes[first + 2:max_last], first + 2):\n                    word = ' '.join((word, last_node.term_lookup))\n                    words[word].append(TokenRange(first, last))\n                    if last_node.btype == BREAK_PHRASE:\n                        break\n\n        return words\n"
  },
  {
    "path": "src/nominatim_api/search/query_analyzer_factory.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nFactory for creating a query analyzer for the configured tokenizer.\n\"\"\"\nfrom typing import List, cast, TYPE_CHECKING\nfrom abc import ABC, abstractmethod\nfrom pathlib import Path\nimport importlib\n\nfrom ..logging import log\nfrom ..connection import SearchConnection\n\nif TYPE_CHECKING:\n    from .query import Phrase, QueryStruct\n\n\nclass AbstractQueryAnalyzer(ABC):\n    \"\"\" Class for analysing incoming queries.\n\n        Query analyzers are tied to the tokenizer used on import.\n    \"\"\"\n\n    @abstractmethod\n    async def analyze_query(self, phrases: List['Phrase']) -> 'QueryStruct':\n        \"\"\" Analyze the given phrases and return the tokenized query.\n        \"\"\"\n\n    @abstractmethod\n    def normalize_text(self, text: str) -> str:\n        \"\"\" Bring the given text into a normalized form. That is the\n            standardized form search will work with. All information removed\n            at this stage is inevitably lost.\n        \"\"\"\n\n\nasync def make_query_analyzer(conn: SearchConnection) -> AbstractQueryAnalyzer:\n    \"\"\" Create a query analyzer for the tokenizer used by the database.\n    \"\"\"\n    name = await conn.get_property('tokenizer')\n\n    src_file = Path(__file__).parent / f'{name}_tokenizer.py'\n    if not src_file.is_file():\n        log().comment(f\"No tokenizer named '{name}' available. Database not set up properly.\")\n        raise RuntimeError('Tokenizer not found')\n\n    module = importlib.import_module(f'nominatim_api.search.{name}_tokenizer')\n\n    return cast(AbstractQueryAnalyzer, await module.create_query_analyzer(conn))\n"
  },
  {
    "path": "src/nominatim_api/search/token_assignment.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nCreate query interpretations where each vertice in the query is assigned\na specific function (expressed as a token type).\n\"\"\"\nfrom typing import Optional, List, Iterator\nimport dataclasses\n\nfrom ..logging import log\nfrom . import query as qmod\n\n\n@dataclasses.dataclass\nclass TypedRange:\n    \"\"\" A token range for a specific type of tokens.\n    \"\"\"\n    ttype: qmod.TokenType\n    trange: qmod.TokenRange\n\n\nTypedRangeSeq = List[TypedRange]\n\n\n@dataclasses.dataclass\nclass TokenAssignment:\n    \"\"\" Representation of a possible assignment of token types\n        to the tokens in a tokenized query.\n    \"\"\"\n    penalty: float = 0.0\n    name: Optional[qmod.TokenRange] = None\n    address: List[qmod.TokenRange] = dataclasses.field(default_factory=list)\n    housenumber: Optional[qmod.TokenRange] = None\n    postcode: Optional[qmod.TokenRange] = None\n    country: Optional[qmod.TokenRange] = None\n    near_item: Optional[qmod.TokenRange] = None\n    qualifier: Optional[qmod.TokenRange] = None\n\n    @staticmethod\n    def from_ranges(ranges: TypedRangeSeq) -> 'TokenAssignment':\n        \"\"\" Create a new token assignment from a sequence of typed spans.\n        \"\"\"\n        out = TokenAssignment()\n        for token in ranges:\n            if token.ttype == qmod.TOKEN_PARTIAL:\n                out.address.append(token.trange)\n            elif token.ttype == qmod.TOKEN_HOUSENUMBER:\n                out.housenumber = token.trange\n            elif token.ttype == qmod.TOKEN_POSTCODE:\n                out.postcode = token.trange\n            elif token.ttype == qmod.TOKEN_COUNTRY:\n                out.country = token.trange\n            elif token.ttype == qmod.TOKEN_NEAR_ITEM:\n                out.near_item = token.trange\n            elif token.ttype == qmod.TOKEN_QUALIFIER:\n                out.qualifier = token.trange\n        return out\n\n\nclass _TokenSequence:\n    \"\"\" Working state used to put together the token assignments.\n\n        Represents an intermediate state while traversing the tokenized\n        query.\n    \"\"\"\n    def __init__(self, seq: TypedRangeSeq,\n                 direction: int = 0, penalty: float = 0.0) -> None:\n        self.seq = seq\n        self.direction = direction\n        self.penalty = penalty\n\n    def __str__(self) -> str:\n        seq = ''.join(f'[{r.trange.start} - {r.trange.end}: {r.ttype}]' for r in self.seq)\n        return f'{seq} (dir: {self.direction}, penalty: {self.penalty})'\n\n    @property\n    def end_pos(self) -> int:\n        \"\"\" Return the index of the global end of the current sequence.\n        \"\"\"\n        return self.seq[-1].trange.end if self.seq else 0\n\n    def has_types(self, *ttypes: qmod.TokenType) -> bool:\n        \"\"\" Check if the current sequence contains any typed ranges of\n            the given types.\n        \"\"\"\n        return any(s.ttype in ttypes for s in self.seq)\n\n    def is_final(self) -> bool:\n        \"\"\" Return true when the sequence cannot be extended by any\n            form of token anymore.\n        \"\"\"\n        # Country and category must be the final term for left-to-right\n        return len(self.seq) > 1 and \\\n            self.seq[-1].ttype in (qmod.TOKEN_COUNTRY, qmod.TOKEN_NEAR_ITEM)\n\n    def appendable(self, ttype: qmod.TokenType) -> Optional[int]:\n        \"\"\" Check if the give token type is appendable to the existing sequence.\n\n            Returns None if the token type is not appendable, otherwise the\n            new direction of the sequence after adding such a type. The\n            token is not added.\n        \"\"\"\n        if ttype == qmod.TOKEN_WORD:\n            return None\n\n        if not self.seq:\n            # Append unconditionally to the empty list\n            if ttype == qmod.TOKEN_COUNTRY:\n                return -1\n            if ttype in (qmod.TOKEN_HOUSENUMBER, qmod.TOKEN_QUALIFIER):\n                return 1\n            return self.direction\n\n        # Name tokens are always acceptable and don't change direction\n        if ttype == qmod.TOKEN_PARTIAL:\n            # qualifiers cannot appear in the middle of the query. They need\n            # to be near the next phrase.\n            if self.direction == -1 \\\n               and any(t.ttype == qmod.TOKEN_QUALIFIER for t in self.seq[:-1]):\n                return None\n            return self.direction\n\n        # Other tokens may only appear once\n        if self.has_types(ttype):\n            return None\n\n        if ttype == qmod.TOKEN_HOUSENUMBER:\n            if self.direction == 1:\n                if len(self.seq) == 1 and self.seq[0].ttype == qmod.TOKEN_QUALIFIER:\n                    return None\n                if len(self.seq) > 2 \\\n                   or self.has_types(qmod.TOKEN_POSTCODE, qmod.TOKEN_COUNTRY):\n                    return None  # direction left-to-right: housenumber must come before anything\n            elif (self.direction == -1\n                  or self.has_types(qmod.TOKEN_POSTCODE, qmod.TOKEN_COUNTRY)):\n                return -1  # force direction right-to-left if after other terms\n\n            return self.direction\n\n        if ttype == qmod.TOKEN_POSTCODE:\n            if self.direction == -1:\n                if self.has_types(qmod.TOKEN_HOUSENUMBER, qmod.TOKEN_QUALIFIER):\n                    return None\n                return -1\n            if self.direction == 1:\n                return None if self.has_types(qmod.TOKEN_COUNTRY) else 1\n            if self.has_types(qmod.TOKEN_HOUSENUMBER, qmod.TOKEN_QUALIFIER):\n                return 1\n            return self.direction\n\n        if ttype == qmod.TOKEN_COUNTRY:\n            return None if self.direction == -1 else 1\n\n        if ttype == qmod.TOKEN_NEAR_ITEM:\n            return self.direction\n\n        if ttype == qmod.TOKEN_QUALIFIER:\n            if self.direction == 1:\n                if (len(self.seq) == 1\n                    and self.seq[0].ttype in (qmod.TOKEN_PARTIAL, qmod.TOKEN_NEAR_ITEM)) \\\n                   or (len(self.seq) == 2\n                       and self.seq[0].ttype == qmod.TOKEN_NEAR_ITEM\n                       and self.seq[1].ttype == qmod.TOKEN_PARTIAL):\n                    return 1\n                return None\n            if self.direction == -1:\n                return -1\n\n            tempseq = self.seq[1:] if self.seq[0].ttype == qmod.TOKEN_NEAR_ITEM else self.seq\n            if len(tempseq) == 0:\n                return 1\n            if len(tempseq) == 1 and self.seq[0].ttype == qmod.TOKEN_HOUSENUMBER:\n                return None\n            if len(tempseq) > 1 or self.has_types(qmod.TOKEN_POSTCODE, qmod.TOKEN_COUNTRY):\n                return -1\n            return 0\n\n        return None\n\n    def advance(self, ttype: qmod.TokenType, end_pos: int,\n                force_break: bool, break_penalty: float) -> Optional['_TokenSequence']:\n        \"\"\" Return a new token sequence state with the given token type\n            extended.\n        \"\"\"\n        newdir = self.appendable(ttype)\n        if newdir is None:\n            return None\n\n        if not self.seq:\n            newseq = [TypedRange(ttype, qmod.TokenRange(0, end_pos))]\n            new_penalty = 0.0\n        else:\n            last = self.seq[-1]\n            if not force_break and last.ttype == ttype:\n                # extend the existing range\n                newseq = self.seq[:-1] + [TypedRange(ttype, last.trange.replace_end(end_pos))]\n                new_penalty = 0.0\n            else:\n                # start a new range\n                newseq = list(self.seq) + [TypedRange(ttype,\n                                                      qmod.TokenRange(last.trange.end, end_pos))]\n                new_penalty = break_penalty\n\n        return _TokenSequence(newseq, newdir, self.penalty + new_penalty)\n\n    def _adapt_penalty_from_priors(self, priors: int, new_dir: int) -> bool:\n        if priors >= 2:\n            if self.direction == 0:\n                self.direction = new_dir\n            else:\n                if priors == 2:\n                    self.penalty += 0.8\n                else:\n                    return False\n\n        return True\n\n    def recheck_sequence(self) -> bool:\n        \"\"\" Check that the sequence is a fully valid token assignment\n            and adapt direction and penalties further if necessary.\n\n            This function catches some impossible assignments that need\n            forward context and can therefore not be excluded when building\n            the assignment.\n        \"\"\"\n        # housenumbers may not be further than 2 words from the beginning.\n        # If there are two words in front, give it a penalty.\n        hnrpos = next((i for i, tr in enumerate(self.seq)\n                       if tr.ttype == qmod.TOKEN_HOUSENUMBER),\n                      None)\n        if hnrpos is not None:\n            if self.direction != -1:\n                priors = sum(1 for t in self.seq[:hnrpos] if t.ttype == qmod.TOKEN_PARTIAL)\n                if not self._adapt_penalty_from_priors(priors, -1):\n                    return False\n            if self.direction != 1:\n                priors = sum(1 for t in self.seq[hnrpos+1:] if t.ttype == qmod.TOKEN_PARTIAL)\n                if not self._adapt_penalty_from_priors(priors, 1):\n                    return False\n            if any(t.ttype == qmod.TOKEN_NEAR_ITEM for t in self.seq):\n                self.penalty += 1.0\n\n        return True\n\n    def _get_assignments_postcode(self, base: TokenAssignment,\n                                  query_len: int) -> Iterator[TokenAssignment]:\n        \"\"\" Yield possible assignments of Postcode searches with an\n            address component.\n        \"\"\"\n        assert base.postcode is not None\n\n        if (base.postcode.start == 0 and self.direction != -1)\\\n           or (base.postcode.end == query_len and self.direction != 1):\n            log().comment('postcode search')\n            # <address>,<postcode> should give preference to address search\n            if base.postcode.start == 0:\n                penalty = self.penalty\n            else:\n                penalty = self.penalty + 0.1\n            penalty += 0.1 * max(0, len(base.address) - 1)\n            yield dataclasses.replace(base, penalty=penalty)\n\n    def _get_assignments_address_forward(self, base: TokenAssignment,\n                                         query: qmod.QueryStruct) -> Iterator[TokenAssignment]:\n        \"\"\" Yield possible assignments of address searches with\n            left-to-right reading.\n        \"\"\"\n        first = base.address[0]\n\n        # The postcode must come after the name.\n        if base.postcode and base.postcode < first:\n            log().var_dump('skip forward', (base.postcode, first))\n            return\n\n        penalty = self.penalty\n        if not base.country and self.direction == 1 and query.dir_penalty > 0:\n            penalty += query.dir_penalty\n\n        log().comment('first word = name')\n        yield dataclasses.replace(base, penalty=penalty,\n                                  name=first, address=base.address[1:])\n\n        # To paraphrase:\n        #  * if another name term comes after the first one and before the\n        #    housenumber\n        #  * a qualifier comes after the name\n        #  * the containing phrase is strictly typed\n        if (base.housenumber and first.end < base.housenumber.start)\\\n           or (base.qualifier and base.qualifier > first)\\\n           or (query.nodes[first.start].ptype != qmod.PHRASE_ANY):\n            return\n\n        # Penalty for:\n        #  * <name>, <street>, <housenumber> , ...\n        #  * queries that are comma-separated\n        if (base.housenumber and base.housenumber > first) or len(query.source) > 1:\n            penalty += 0.25\n\n        if self.direction == 0 and query.dir_penalty > 0:\n            penalty += query.dir_penalty\n\n        for i in range(first.start + 1, first.end):\n            name, addr = first.split(i)\n            log().comment(f'split first word = name ({i - first.start})')\n            yield dataclasses.replace(base, name=name, address=[addr] + base.address[1:],\n                                      penalty=penalty + query.nodes[i].word_break_penalty)\n\n    def _get_assignments_address_backward(self, base: TokenAssignment,\n                                          query: qmod.QueryStruct) -> Iterator[TokenAssignment]:\n        \"\"\" Yield possible assignments of address searches with\n            right-to-left reading.\n        \"\"\"\n        last = base.address[-1]\n\n        # The postcode must come before the name for backward direction.\n        if base.postcode and base.postcode > last:\n            log().var_dump('skip backward', (base.postcode, last))\n            return\n\n        penalty = self.penalty\n        if not base.country and self.direction == -1 and query.dir_penalty < 0:\n            penalty -= query.dir_penalty\n\n        if self.direction == -1 or len(base.address) > 1 or base.postcode:\n            log().comment('last word = name')\n            yield dataclasses.replace(base, penalty=penalty,\n                                      name=last, address=base.address[:-1])\n\n        # To paraphrase:\n        #  * if another name term comes before the last one and after the\n        #    housenumber\n        #  * a qualifier comes before the name\n        #  * the containing phrase is strictly typed\n        if (base.housenumber and last.start > base.housenumber.end)\\\n           or (base.qualifier and base.qualifier < last)\\\n           or (query.nodes[last.start].ptype != qmod.PHRASE_ANY):\n            return\n\n        if base.housenumber and base.housenumber < last:\n            penalty += 0.4\n        if len(query.source) > 1:\n            penalty += 0.25\n\n        if self.direction == 0 and query.dir_penalty < 0:\n            penalty -= query.dir_penalty\n\n        for i in range(last.start + 1, last.end):\n            addr, name = last.split(i)\n            log().comment(f'split last word = name ({i - last.start})')\n            yield dataclasses.replace(base, name=name, address=base.address[:-1] + [addr],\n                                      penalty=penalty + query.nodes[i].word_break_penalty)\n\n    def get_assignments(self, query: qmod.QueryStruct) -> Iterator[TokenAssignment]:\n        \"\"\" Yield possible assignments for the current sequence.\n\n            This function splits up general name assignments into name\n            and address and yields all possible variants of that.\n        \"\"\"\n        base = TokenAssignment.from_ranges(self.seq)\n\n        num_addr_tokens = sum(t.end - t.start for t in base.address)\n        if num_addr_tokens > 50:\n            return\n\n        # Postcode search (postcode-only search is covered in next case)\n        if base.postcode is not None and base.address:\n            yield from self._get_assignments_postcode(base, query.num_token_slots())\n\n        # Postcode or country-only search\n        if not base.address:\n            if not base.housenumber and (base.postcode or base.country or base.near_item):\n                log().comment('postcode/country search')\n                yield dataclasses.replace(base, penalty=self.penalty)\n        else:\n            # <postcode>,<address> should give preference to postcode search\n            if base.postcode and base.postcode.start == 0:\n                self.penalty += 0.1\n\n            min_penalty = self.penalty + 2.0\n\n            # Left-to-right reading of the address\n            if self.direction != -1:\n                for result in self._get_assignments_address_forward(base, query):\n                    min_penalty = min(min_penalty, result.penalty)\n                    yield result\n\n            # Right-to-left reading of the address\n            if self.direction != 1:\n                for result in self._get_assignments_address_backward(base, query):\n                    min_penalty = min(min_penalty, result.penalty)\n                    yield result\n\n            # variant for special housenumber searches\n            if base.housenumber and not base.qualifier:\n                yield dataclasses.replace(base, penalty=min_penalty + 0.1)\n\n\ndef yield_token_assignments(query: qmod.QueryStruct) -> Iterator[TokenAssignment]:\n    \"\"\" Return possible word type assignments to word positions.\n\n        The assignments are computed from the concrete tokens listed\n        in the tokenized query.\n\n        The result includes the penalty for transitions from one word type to\n        another. It does not include penalties for transitions within a\n        type.\n    \"\"\"\n    todo = [_TokenSequence([], direction=0 if query.source[0].ptype == qmod.PHRASE_ANY else 1)]\n\n    while todo:\n        state = todo.pop()\n        node = query.nodes[state.end_pos]\n\n        for tlist in node.starting:\n            yield from _append_state_to_todo(\n                query, todo,\n                state.advance(tlist.ttype, tlist.end,\n                              True, node.word_break_penalty))\n\n        if node.partial is not None:\n            yield from _append_state_to_todo(\n                query, todo,\n                state.advance(qmod.TOKEN_PARTIAL, state.end_pos + 1,\n                              node.btype == qmod.BREAK_PHRASE,\n                              node.word_break_penalty))\n\n\ndef _append_state_to_todo(query: qmod.QueryStruct, todo: List[_TokenSequence],\n                          newstate: Optional[_TokenSequence]) -> Iterator[TokenAssignment]:\n    if newstate is not None:\n        if newstate.end_pos == query.num_token_slots():\n            if newstate.recheck_sequence():\n                log().var_dump('Assignment', newstate)\n                yield from newstate.get_assignments(query)\n        elif not newstate.is_final():\n            todo.append(newstate)\n"
  },
  {
    "path": "src/nominatim_api/server/__init__.py",
    "content": ""
  },
  {
    "path": "src/nominatim_api/server/asgi_adaptor.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nBase abstraction for implementing based on different ASGI frameworks.\n\"\"\"\nfrom typing import Optional, Any, NoReturn, Callable\nimport abc\nimport math\n\nfrom ..config import Configuration\nfrom ..core import NominatimAPIAsync\nfrom ..types import QueryStatistics\nfrom ..result_formatting import FormatDispatcher\nfrom .content_types import CONTENT_TEXT\n\n\nclass ASGIAdaptor(abc.ABC):\n    \"\"\" Adapter class for the different ASGI frameworks.\n        Wraps functionality over concrete requests and responses.\n    \"\"\"\n    content_type: str = CONTENT_TEXT\n\n    @abc.abstractmethod\n    def get(self, name: str, default: Optional[str] = None) -> Optional[str]:\n        \"\"\" Return an input parameter as a string. If the parameter was\n            not provided, return the 'default' value.\n        \"\"\"\n\n    @abc.abstractmethod\n    def get_header(self, name: str, default: Optional[str] = None) -> Optional[str]:\n        \"\"\" Return a HTTP header parameter as a string. If the parameter was\n            not provided, return the 'default' value.\n        \"\"\"\n\n    @abc.abstractmethod\n    def error(self, msg: str, status: int = 400) -> Exception:\n        \"\"\" Construct an appropriate exception from the given error message.\n            The exception must result in a HTTP error with the given status.\n        \"\"\"\n\n    @abc.abstractmethod\n    def create_response(self, status: int, output: str, num_results: int) -> Any:\n        \"\"\" Create a response from the given parameters. The result will\n            be returned by the endpoint functions. The adaptor may also\n            return None when the response is created internally with some\n            different means.\n\n            The response must return the HTTP given status code 'status', set\n            the HTTP content-type headers to the string provided and the\n            body of the response to 'output'.\n        \"\"\"\n\n    @abc.abstractmethod\n    def base_uri(self) -> str:\n        \"\"\" Return the URI of the original request.\n        \"\"\"\n\n    @abc.abstractmethod\n    def config(self) -> Configuration:\n        \"\"\" Return the current configuration object.\n        \"\"\"\n\n    @abc.abstractmethod\n    def formatting(self) -> FormatDispatcher:\n        \"\"\" Return the formatting object to use.\n        \"\"\"\n\n    @abc.abstractmethod\n    def query_stats(self) -> Optional[QueryStatistics]:\n        \"\"\" Return the object for saving query statistics or None if\n            no statistics are required.\n        \"\"\"\n\n    def get_int(self, name: str, default: Optional[int] = None) -> int:\n        \"\"\" Return an input parameter as an int. Raises an exception if\n            the parameter is given but not in an integer format.\n\n            If 'default' is given, then it will be returned when the parameter\n            is missing completely. When 'default' is None, an error will be\n            raised on a missing parameter.\n        \"\"\"\n        value = self.get(name)\n\n        if value is None:\n            if default is not None:\n                return default\n\n            self.raise_error(f\"Parameter '{name}' missing.\")\n\n        try:\n            intval = int(value)\n        except ValueError:\n            self.raise_error(f\"Parameter '{name}' must be a number.\")\n\n        return intval\n\n    def get_float(self, name: str, default: Optional[float] = None) -> float:\n        \"\"\" Return an input parameter as a flaoting-point number. Raises an\n            exception if the parameter is given but not in an float format.\n\n            If 'default' is given, then it will be returned when the parameter\n            is missing completely. When 'default' is None, an error will be\n            raised on a missing parameter.\n        \"\"\"\n        value = self.get(name)\n\n        if value is None:\n            if default is not None:\n                return default\n\n            self.raise_error(f\"Parameter '{name}' missing.\")\n\n        try:\n            fval = float(value)\n        except ValueError:\n            self.raise_error(f\"Parameter '{name}' must be a number.\")\n\n        if math.isnan(fval) or math.isinf(fval):\n            self.raise_error(f\"Parameter '{name}' must be a number.\")\n\n        return fval\n\n    def get_bool(self, name: str, default: Optional[bool] = None) -> bool:\n        \"\"\" Return an input parameter as bool. Only '0' is accepted as\n            an input for 'false' all other inputs will be interpreted as 'true'.\n\n            If 'default' is given, then it will be returned when the parameter\n            is missing completely. When 'default' is None, an error will be\n            raised on a missing parameter.\n        \"\"\"\n        value = self.get(name)\n\n        if value is None:\n            if default is not None:\n                return default\n\n            self.raise_error(f\"Parameter '{name}' missing.\")\n\n        return value != '0'\n\n    def raise_error(self, msg: str, status: int = 400) -> NoReturn:\n        \"\"\" Raise an exception resulting in the given HTTP status and\n            message. The message will be formatted according to the\n            output format chosen by the request.\n        \"\"\"\n        raise self.error(self.formatting().format_error(self.content_type, msg, status),\n                         status)\n\n\nEndpointFunc = Callable[[NominatimAPIAsync, ASGIAdaptor], Any]\n"
  },
  {
    "path": "src/nominatim_api/server/content_types.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nConstants for various content types for server responses.\n\"\"\"\n\nCONTENT_TEXT = 'text/plain; charset=utf-8'\nCONTENT_XML = 'text/xml; charset=utf-8'\nCONTENT_HTML = 'text/html; charset=utf-8'\nCONTENT_JSON = 'application/json; charset=utf-8'\n"
  },
  {
    "path": "src/nominatim_api/server/falcon/__init__.py",
    "content": ""
  },
  {
    "path": "src/nominatim_api/server/falcon/server.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nServer implementation using the falcon webserver framework.\n\"\"\"\nfrom __future__ import annotations\n\nfrom typing import Optional, Mapping, Any, List, cast\nfrom pathlib import Path\nimport asyncio\nimport datetime as dt\n\nfrom falcon.asgi import App, Request, Response\n\nfrom ...config import Configuration\nfrom ...core import NominatimAPIAsync\nfrom ...types import QueryStatistics\nfrom ... import v1 as api_impl\nfrom ...result_formatting import FormatDispatcher, load_format_dispatcher\nfrom ... import logging as loglib\nfrom ..asgi_adaptor import ASGIAdaptor, EndpointFunc\n\n\nclass HTTPNominatimError(Exception):\n    \"\"\" A special exception class for errors raised during processing.\n    \"\"\"\n    def __init__(self, msg: str, status: int, content_type: str) -> None:\n        self.msg = msg\n        self.status = status\n        self.content_type = content_type\n\n\nasync def nominatim_error_handler(req: Request, resp: Response,\n                                  exception: HTTPNominatimError,\n                                  _: Any) -> None:\n    \"\"\" Special error handler that passes message and content type as\n        per exception info.\n    \"\"\"\n    resp.status = exception.status\n    resp.text = exception.msg\n    resp.content_type = exception.content_type\n\n\nasync def timeout_error_handler(req: Request, resp: Response,\n                                exception: TimeoutError,\n                                _: Any) -> None:\n    \"\"\" Special error handler that passes message and content type as\n        per exception info.\n    \"\"\"\n    resp.status = 503\n\n    loglib.log().comment('Aborted: Query took too long to process.')\n    logdata = loglib.get_and_disable()\n    if logdata:\n        resp.text = logdata\n        resp.content_type = 'text/html; charset=utf-8'\n    else:\n        resp.text = \"Query took too long to process.\"\n        resp.content_type = 'text/plain; charset=utf-8'\n\n\nclass ParamWrapper(ASGIAdaptor):\n    \"\"\" Adaptor class for server glue to Falcon framework.\n    \"\"\"\n\n    def __init__(self, req: Request, resp: Response,\n                 config: Configuration, formatter: FormatDispatcher) -> None:\n        self.request = req\n        self.response = resp\n        self._config = config\n        self._formatter = formatter\n\n    def get(self, name: str, default: Optional[str] = None) -> Optional[str]:\n        return self.request.get_param(name, default=default)\n\n    def get_header(self, name: str, default: Optional[str] = None) -> Optional[str]:\n        return self.request.get_header(name, default=default)\n\n    def error(self, msg: str, status: int = 400) -> HTTPNominatimError:\n        return HTTPNominatimError(msg, status, self.content_type)\n\n    def create_response(self, status: int, output: str, num_results: int) -> None:\n        self.response.context.num_results = num_results\n        self.response.status = status\n        self.response.text = output\n        self.response.content_type = self.content_type\n\n    def base_uri(self) -> str:\n        return self.request.forwarded_prefix\n\n    def config(self) -> Configuration:\n        return self._config\n\n    def formatting(self) -> FormatDispatcher:\n        return self._formatter\n\n    def query_stats(self) -> Optional[QueryStatistics]:\n        return cast(Optional[QueryStatistics], getattr(self.request.context, 'query_stats', None))\n\n\nclass EndpointWrapper:\n    \"\"\" Converter for server glue endpoint functions to Falcon request handlers.\n    \"\"\"\n\n    def __init__(self, name: str, func: EndpointFunc, api: NominatimAPIAsync,\n                 formatter: FormatDispatcher) -> None:\n        self.name = name\n        self.func = func\n        self.api = api\n        self.formatter = formatter\n\n    async def on_get(self, req: Request, resp: Response) -> None:\n        \"\"\" Implementation of the endpoint.\n        \"\"\"\n        await self.func(self.api, ParamWrapper(req, resp, self.api.config,\n                                               self.formatter))\n\n\nclass FileLoggingMiddleware:\n    \"\"\" Middleware to log selected requests into a file.\n    \"\"\"\n\n    def __init__(self, file_name: str, logstr: str):\n        self.logstr = logstr + '\\n'\n        self.fd = open(file_name, 'a', buffering=1, encoding='utf8')\n\n    async def process_request(self, req: Request, _: Response) -> None:\n        \"\"\" Callback before the request starts timing.\n        \"\"\"\n        req.context.query_stats = QueryStatistics()\n\n    async def process_response(self, req: Request, resp: Response,\n                               resource: Optional[EndpointWrapper],\n                               req_succeeded: bool) -> None:\n        \"\"\" Callback after requests writes to the logfile. It only\n            writes logs for successful requests for search, reverse and lookup.\n        \"\"\"\n        qs = req.context.query_stats\n\n        if not req_succeeded or 'start' not in qs\\\n           or resource is None or resp.status != 200\\\n           or resource.name not in ('reverse', 'search', 'lookup', 'details'):\n            return\n\n        qs['endpoint'] = resource.name\n        qs['query_string'] = req.scope['query_string'].decode('utf8')\n        qs['results_total'] = getattr(resp.context, 'num_results', 0)\n        for param in ('start', 'end', 'start_query'):\n            if isinstance(qs.get(param), dt.datetime):\n                qs[param] = qs[param].replace(tzinfo=None)\\\n                                     .isoformat(sep=' ', timespec='milliseconds')\n\n        self.fd.write(self.logstr.format_map(qs))\n\n\nclass APIMiddleware:\n    \"\"\" Middleware managing the Nominatim database connection.\n    \"\"\"\n\n    def __init__(self, project_dir: Path, environ: Optional[Mapping[str, str]]) -> None:\n        self.api = NominatimAPIAsync(project_dir, environ)\n        self.app: Optional[App[Request, Response]] = None\n\n    @property\n    def config(self) -> Configuration:\n        \"\"\" Get the configuration for Nominatim.\n        \"\"\"\n        return self.api.config\n\n    def set_app(self, app: App[Request, Response]) -> None:\n        \"\"\" Set the Falcon application this middleware is connected to.\n        \"\"\"\n        self.app = app\n\n    async def process_startup(self, *_: Any) -> None:\n        \"\"\" Process the ASGI lifespan startup event.\n        \"\"\"\n        assert self.app is not None\n        legacy_urls = self.api.config.get_bool('SERVE_LEGACY_URLS')\n        formatter = load_format_dispatcher('v1', self.api.config.project_dir)\n        for name, func in await api_impl.get_routes(self.api):\n            endpoint = EndpointWrapper(name, func, self.api, formatter)\n            # If func is a LazySearchEndpoint, give it a reference to wrapper\n            # so it can replace wrapper.func dynamically\n            if hasattr(func, 'set_wrapper'):\n                func.set_wrapper(endpoint)\n            self.app.add_route(f\"/{name}\", endpoint)\n            if legacy_urls:\n                self.app.add_route(f\"/{name}.php\", endpoint)\n\n    async def process_shutdown(self, *_: Any) -> None:\n        \"\"\"Process the ASGI lifespan shutdown event.\n        \"\"\"\n        await self.api.close()\n\n\ndef get_application(project_dir: Path,\n                    environ: Optional[Mapping[str, str]] = None) -> App[Request, Response]:\n    \"\"\" Create a Nominatim Falcon ASGI application.\n    \"\"\"\n    apimw = APIMiddleware(project_dir, environ)\n\n    middleware: List[Any] = [apimw]\n    log_file = apimw.config.LOG_FILE\n    if log_file:\n        middleware.append(FileLoggingMiddleware(log_file, apimw.config.LOG_FORMAT))\n\n    app = App(cors_enable=apimw.config.get_bool('CORS_NOACCESSCONTROL'),\n              middleware=middleware)\n\n    apimw.set_app(app)\n    app.add_error_handler(HTTPNominatimError, nominatim_error_handler)\n    app.add_error_handler(TimeoutError, timeout_error_handler)\n    # different from TimeoutError in Python <= 3.10\n    app.add_error_handler(asyncio.TimeoutError, timeout_error_handler)  # type: ignore[arg-type]\n\n    return app\n\n\ndef run_wsgi() -> App[Request, Response]:\n    \"\"\" Entry point for uvicorn.\n\n        Make sure uvicorn is run from the project directory.\n    \"\"\"\n    return get_application(Path('.'))\n"
  },
  {
    "path": "src/nominatim_api/server/starlette/__init__.py",
    "content": ""
  },
  {
    "path": "src/nominatim_api/server/starlette/server.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nServer implementation using the starlette webserver framework.\n\"\"\"\nfrom typing import Any, Optional, Mapping, Callable, cast, Coroutine, Dict, \\\n                   Awaitable, AsyncIterator\nfrom pathlib import Path\nimport asyncio\nimport contextlib\nimport datetime as dt\n\nfrom starlette.applications import Starlette\nfrom starlette.routing import Route\nfrom starlette.exceptions import HTTPException\nfrom starlette.responses import Response, PlainTextResponse, HTMLResponse\nfrom starlette.requests import Request\nfrom starlette.middleware import Middleware\nfrom starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint\nfrom starlette.middleware.cors import CORSMiddleware\n\nfrom ...config import Configuration\nfrom ...core import NominatimAPIAsync\nfrom ...types import QueryStatistics\nfrom ... import v1 as api_impl\nfrom ...result_formatting import FormatDispatcher, load_format_dispatcher\nfrom ..asgi_adaptor import ASGIAdaptor, EndpointFunc\nfrom ... import logging as loglib\n\n\nclass ParamWrapper(ASGIAdaptor):\n    \"\"\" Adaptor class for server glue to Starlette framework.\n    \"\"\"\n\n    def __init__(self, request: Request) -> None:\n        self.request = request\n\n    def get(self, name: str, default: Optional[str] = None) -> Optional[str]:\n        return self.request.query_params.get(name, default)\n\n    def get_header(self, name: str, default: Optional[str] = None) -> Optional[str]:\n        return self.request.headers.get(name, default)\n\n    def error(self, msg: str, status: int = 400) -> HTTPException:\n        return HTTPException(status, detail=msg,\n                             headers={'content-type': self.content_type})\n\n    def create_response(self, status: int, output: str, num_results: int) -> Response:\n        setattr(self.request.state, 'num_results', num_results)\n        return Response(output, status_code=status, media_type=self.content_type)\n\n    def base_uri(self) -> str:\n        scheme = self.request.url.scheme\n        host = self.request.url.hostname\n        port = self.request.url.port\n        root = self.request.scope['root_path']\n        if (scheme == 'http' and port == 80) or (scheme == 'https' and port == 443):\n            port = None\n        if port is not None:\n            return f\"{scheme}://{host}:{port}{root}\"\n\n        return f\"{scheme}://{host}{root}\"\n\n    def config(self) -> Configuration:\n        return cast(Configuration, self.request.app.state.API.config)\n\n    def formatting(self) -> FormatDispatcher:\n        return cast(FormatDispatcher, self.request.app.state.formatter)\n\n    def query_stats(self) -> Optional[QueryStatistics]:\n        return cast(Optional[QueryStatistics], getattr(self.request.state, 'query_stats', None))\n\n\ndef _wrap_endpoint(func: EndpointFunc)\\\n        -> Callable[[Request], Coroutine[Any, Any, Response]]:\n    async def _callback(request: Request) -> Response:\n        return cast(Response, await func(request.app.state.API, ParamWrapper(request)))\n\n    return _callback\n\n\nclass FileLoggingMiddleware(BaseHTTPMiddleware):\n    \"\"\" Middleware to log selected requests into a file.\n    \"\"\"\n\n    def __init__(self, app: Starlette, file_name: str = '', logstr: str = ''):\n        super().__init__(app)\n        self.fd = open(file_name, 'a', buffering=1, encoding='utf8')\n        self.logstr = logstr + '\\n'\n\n    async def dispatch(self, request: Request,\n                       call_next: RequestResponseEndpoint) -> Response:\n        qs = QueryStatistics()\n        setattr(request.state, 'query_stats', qs)\n        response = await call_next(request)\n\n        if response.status_code != 200 or 'start' not in qs:\n            return response\n\n        for endpoint in ('reverse', 'search', 'lookup', 'details'):\n            if request.url.path.startswith('/' + endpoint):\n                qs['endpoint'] = endpoint\n                break\n        else:\n            return response\n\n        qs['query_string'] = request.scope['query_string'].decode('utf8')\n        qs['results_total'] = getattr(request.state, 'num_results', 0)\n        for param in ('start', 'end', 'start_query'):\n            if isinstance(qs.get(param), dt.datetime):\n                qs[param] = qs[param].replace(tzinfo=None)\\\n                                     .isoformat(sep=' ', timespec='milliseconds')\n\n        self.fd.write(self.logstr.format_map(qs))\n\n        return response\n\n\nasync def timeout_error(request: Request,\n                        _: Exception) -> Response:\n    \"\"\" Error handler for query timeouts.\n    \"\"\"\n    loglib.log().comment('Aborted: Query took too long to process.')\n    logdata = loglib.get_and_disable()\n\n    if logdata:\n        return HTMLResponse(logdata)\n\n    return PlainTextResponse(\"Query took too long to process.\", status_code=503)\n\n\ndef get_application(project_dir: Path,\n                    environ: Optional[Mapping[str, str]] = None,\n                    debug: bool = True) -> Starlette:\n    \"\"\" Create a Nominatim falcon ASGI application.\n    \"\"\"\n    config = Configuration(project_dir, environ)\n\n    middleware = []\n    if config.get_bool('CORS_NOACCESSCONTROL'):\n        middleware.append(Middleware(CORSMiddleware,\n                                     allow_origins=['*'],\n                                     allow_methods=['GET', 'OPTIONS'],\n                                     max_age=86400))\n\n    log_file = config.LOG_FILE\n    if log_file:\n        middleware.append(Middleware(FileLoggingMiddleware, file_name=log_file,  # type: ignore\n                                     logstr=config.LOG_FORMAT))\n\n    exceptions: Dict[Any, Callable[[Request, Exception], Awaitable[Response]]] = {\n        TimeoutError: timeout_error,\n        asyncio.TimeoutError: timeout_error\n    }\n\n    @contextlib.asynccontextmanager\n    async def lifespan(app: Starlette) -> AsyncIterator[Any]:\n        app.state.API = NominatimAPIAsync(project_dir, environ)\n        config = app.state.API.config\n\n        legacy_urls = config.get_bool('SERVE_LEGACY_URLS')\n        for name, func in await api_impl.get_routes(app.state.API):\n            endpoint = _wrap_endpoint(func)\n            app.routes.append(Route(f\"/{name}\", endpoint=endpoint))\n            if legacy_urls:\n                app.routes.append(Route(f\"/{name}.php\", endpoint=endpoint))\n\n        yield\n\n        await app.state.API.close()\n\n    app = Starlette(debug=debug, middleware=middleware,\n                    exception_handlers=exceptions,\n                    lifespan=lifespan)\n\n    app.state.formatter = load_format_dispatcher('v1', project_dir)\n\n    return app\n\n\ndef run_wsgi() -> Starlette:\n    \"\"\" Entry point for uvicorn.\n    \"\"\"\n    return get_application(Path('.'), debug=False)\n"
  },
  {
    "path": "src/nominatim_api/sql/__init__.py",
    "content": ""
  },
  {
    "path": "src/nominatim_api/sql/async_core_library.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImport the base library to use with asynchronous SQLAlchemy.\n\"\"\"\nfrom typing import Any\n\n# flake8: noqa\n\ntry:\n    import sqlalchemy.dialects.postgresql.psycopg\n    import psycopg\n    PGCORE_LIB = 'psycopg'\n    PGCORE_ERROR: Any = psycopg.Error\nexcept ModuleNotFoundError:\n    import sqlalchemy.dialects.postgresql.asyncpg\n    import asyncpg\n    PGCORE_LIB = 'asyncpg'\n    PGCORE_ERROR = asyncpg.PostgresError\n"
  },
  {
    "path": "src/nominatim_api/sql/sqlalchemy_functions.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nCustom functions and expressions for SQLAlchemy.\n\"\"\"\nfrom __future__ import annotations\nfrom typing import Any\n\nimport sqlalchemy as sa\nfrom sqlalchemy.ext.compiler import compiles\n\nfrom ..typing import SaColumn\n\n\nclass PlacexGeometryReverseLookuppolygon(sa.sql.functions.GenericFunction[Any]):\n    \"\"\" Check for conditions that allow partial index use on\n        'idx_placex_geometry_reverse_lookupPolygon'.\n\n        Needs to be constant, so that the query planner picks them up correctly\n        in prepared statements.\n    \"\"\"\n    name = 'PlacexGeometryReverseLookuppolygon'\n    inherit_cache = True\n\n\n@compiles(PlacexGeometryReverseLookuppolygon)\ndef _default_intersects(element: PlacexGeometryReverseLookuppolygon,\n                        compiler: 'sa.Compiled', **kw: Any) -> str:\n    return (\"(ST_GeometryType(placex.geometry) in ('ST_Polygon', 'ST_MultiPolygon')\"\n            \" AND placex.rank_address between 4 and 25\"\n            \" AND placex.name is not null\"\n            \" AND placex.indexed_status = 0\"\n            \" AND placex.linked_place_id is null)\")\n\n\n@compiles(PlacexGeometryReverseLookuppolygon, 'sqlite')\ndef _sqlite_intersects(element: PlacexGeometryReverseLookuppolygon,\n                       compiler: 'sa.Compiled', **kw: Any) -> str:\n    return (\"(ST_GeometryType(placex.geometry) in ('POLYGON', 'MULTIPOLYGON')\"\n            \" AND placex.rank_address between 4 and 25\"\n            \" AND placex.name is not null\"\n            \" AND placex.indexed_status = 0\"\n            \" AND placex.linked_place_id is null)\")\n\n\nclass IntersectsReverseDistance(sa.sql.functions.GenericFunction[Any]):\n    name = 'IntersectsReverseDistance'\n    inherit_cache = True\n\n    def __init__(self, table: sa.Table, geom: SaColumn) -> None:\n        super().__init__(table.c.geometry,\n                         table.c.rank_search, geom)\n        self.tablename = table.name\n\n\n@compiles(IntersectsReverseDistance)\ndef default_reverse_place_diameter(element: IntersectsReverseDistance,\n                                   compiler: 'sa.Compiled', **kw: Any) -> str:\n    table = element.tablename\n    return f\"({table}.rank_address between 4 and 25\"\\\n           f\" AND {table}.name is not null\"\\\n           f\" AND {table}.linked_place_id is null\"\\\n           f\" AND {table}.osm_type = 'N'\" + \\\n           \" AND ST_Buffer(%s, reverse_place_diameter(%s)) && %s)\" \\\n        % tuple(map(lambda c: compiler.process(c, **kw), element.clauses))\n\n\n@compiles(IntersectsReverseDistance, 'sqlite')\ndef sqlite_reverse_place_diameter(element: IntersectsReverseDistance,\n                                  compiler: 'sa.Compiled', **kw: Any) -> str:\n    geom1, rank, geom2 = list(element.clauses)\n    table = element.tablename\n\n    return (f\"({table}.rank_address between 4 and 25\"\n            f\" AND {table}.name is not null\"\n            f\" AND {table}.linked_place_id is null\"\n            f\" AND {table}.osm_type = 'N'\"\n            \"  AND MbrIntersects(%s, ST_Expand(%s, 14.0 * exp(-0.2 * %s) - 0.03))\"\n            f\" AND {table}.place_id IN\"\n            \"  (SELECT place_id FROM placex_place_node_areas\"\n            \"   WHERE ROWID IN (SELECT ROWID FROM SpatialIndex\"\n            \"   WHERE f_table_name = 'placex_place_node_areas'\"\n            \"   AND search_frame = %s)))\") % (\n                compiler.process(geom1, **kw),\n                compiler.process(geom2, **kw),\n                compiler.process(rank, **kw),\n                compiler.process(geom2, **kw))\n\n\nclass IsBelowReverseDistance(sa.sql.functions.GenericFunction[Any]):\n    name = 'IsBelowReverseDistance'\n    inherit_cache = True\n\n\n@compiles(IsBelowReverseDistance)\ndef default_is_below_reverse_distance(element: IsBelowReverseDistance,\n                                      compiler: 'sa.Compiled', **kw: Any) -> str:\n    dist, rank = list(element.clauses)\n    return \"%s < reverse_place_diameter(%s)\" % (compiler.process(dist, **kw),\n                                                compiler.process(rank, **kw))\n\n\n@compiles(IsBelowReverseDistance, 'sqlite')\ndef sqlite_is_below_reverse_distance(element: IsBelowReverseDistance,\n                                     compiler: 'sa.Compiled', **kw: Any) -> str:\n    dist, rank = list(element.clauses)\n    return \"%s < 14.0 * exp(-0.2 * %s) - 0.03\" % (compiler.process(dist, **kw),\n                                                  compiler.process(rank, **kw))\n\n\nclass IsAddressPoint(sa.sql.functions.GenericFunction[Any]):\n    name = 'IsAddressPoint'\n    inherit_cache = True\n\n    def __init__(self, table: sa.Table) -> None:\n        super().__init__(table.c.rank_address,\n                         table.c.housenumber, table.c.name, table.c.address)\n\n\n@compiles(IsAddressPoint)\ndef default_is_address_point(element: IsAddressPoint,\n                             compiler: 'sa.Compiled', **kw: Any) -> str:\n    rank, hnr, name, address = list(element.clauses)\n    return \"(%s = 30 AND (%s IS NULL OR NOT %s ? '_inherited')\" \\\n           \" AND (%s IS NOT NULL OR %s ? 'addr:housename'))\" % (\n                compiler.process(rank, **kw),\n                compiler.process(address, **kw),\n                compiler.process(address, **kw),\n                compiler.process(hnr, **kw),\n                compiler.process(name, **kw))\n\n\n@compiles(IsAddressPoint, 'sqlite')\ndef sqlite_is_address_point(element: IsAddressPoint,\n                            compiler: 'sa.Compiled', **kw: Any) -> str:\n    rank, hnr, name, address = list(element.clauses)\n    return \"(%s = 30 AND json_extract(%s, '$._inherited') IS NULL\" \\\n           \" AND coalesce(%s, json_extract(%s, '$.addr:housename')) IS NOT NULL)\" % (\n                compiler.process(rank, **kw),\n                compiler.process(address, **kw),\n                compiler.process(hnr, **kw),\n                compiler.process(name, **kw))\n\n\nclass CrosscheckNames(sa.sql.functions.GenericFunction[Any]):\n    \"\"\" Check if in the given list of names in parameters 1 any of the names\n        from the JSON array in parameter 2 are contained.\n    \"\"\"\n    name = 'CrosscheckNames'\n    inherit_cache = True\n\n\n@compiles(CrosscheckNames)\ndef compile_crosscheck_names(element: CrosscheckNames,\n                             compiler: 'sa.Compiled', **kw: Any) -> str:\n    arg1, arg2 = list(element.clauses)\n    return \"coalesce(avals(%s) && ARRAY(SELECT * FROM json_array_elements_text(%s)), false)\" % (\n            compiler.process(arg1, **kw), compiler.process(arg2, **kw))\n\n\n@compiles(CrosscheckNames, 'sqlite')\ndef compile_sqlite_crosscheck_names(element: CrosscheckNames,\n                                    compiler: 'sa.Compiled', **kw: Any) -> str:\n    arg1, arg2 = list(element.clauses)\n    return \"EXISTS(SELECT *\"\\\n           \" FROM json_each(%s) as name, json_each(%s) as match_name\"\\\n           \" WHERE name.value = match_name.value)\"\\\n           % (compiler.process(arg1, **kw), compiler.process(arg2, **kw))\n\n\nclass JsonArrayEach(sa.sql.functions.GenericFunction[Any]):\n    \"\"\" Return elements of a json array as a set.\n    \"\"\"\n    name = 'JsonArrayEach'\n    inherit_cache = True\n\n\n@compiles(JsonArrayEach)\ndef default_json_array_each(element: JsonArrayEach, compiler: 'sa.Compiled', **kw: Any) -> str:\n    return \"json_array_elements(%s)\" % compiler.process(element.clauses, **kw)\n\n\n@compiles(JsonArrayEach, 'sqlite')\ndef sqlite_json_array_each(element: JsonArrayEach, compiler: 'sa.Compiled', **kw: Any) -> str:\n    return \"json_each(%s)\" % compiler.process(element.clauses, **kw)\n\n\nclass Greatest(sa.sql.functions.GenericFunction[Any]):\n    \"\"\" Function to compute maximum of all its input parameters.\n    \"\"\"\n    name = 'greatest'\n    inherit_cache = True\n\n\n@compiles(Greatest, 'sqlite')\ndef sqlite_greatest(element: Greatest, compiler: 'sa.Compiled', **kw: Any) -> str:\n    return \"max(%s)\" % compiler.process(element.clauses, **kw)\n\n\nclass RegexpWord(sa.sql.functions.GenericFunction[Any]):\n    \"\"\" Check if a full word is in a given string.\n    \"\"\"\n    name = 'RegexpWord'\n    inherit_cache = True\n\n\n@compiles(RegexpWord, 'postgresql')\ndef postgres_regexp_nocase(element: RegexpWord, compiler: 'sa.Compiled', **kw: Any) -> str:\n    arg1, arg2 = list(element.clauses)\n    return \"%s ~* ('\\\\m(' || %s  || ')\\\\M')::text\" \\\n        % (compiler.process(arg2, **kw), compiler.process(arg1, **kw))\n\n\n@compiles(RegexpWord, 'sqlite')\ndef sqlite_regexp_nocase(element: RegexpWord, compiler: 'sa.Compiled', **kw: Any) -> str:\n    arg1, arg2 = list(element.clauses)\n    return \"regexp('\\\\b(' || %s  || ')\\\\b', %s)\"\\\n        % (compiler.process(arg1, **kw), compiler.process(arg2, **kw))\n"
  },
  {
    "path": "src/nominatim_api/sql/sqlalchemy_schema.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nSQLAlchemy definitions for all tables used by the frontend.\n\"\"\"\nimport sqlalchemy as sa\n\nfrom .sqlalchemy_types import Geometry, KeyValueStore, IntArray\n\n\nclass SearchTables:\n    \"\"\" Data class that holds the tables of the Nominatim database.\n\n        This schema strictly reflects the read-access view of the database.\n        Any data used for updates only will not be visible.\n    \"\"\"\n\n    def __init__(self, meta: sa.MetaData) -> None:\n        self.meta = meta\n\n        self.import_status = sa.Table(\n            'import_status', meta,\n            sa.Column('lastimportdate', sa.DateTime(True), nullable=False),\n            sa.Column('sequence_id', sa.Integer),\n            sa.Column('indexed', sa.Boolean))\n\n        self.properties = sa.Table(\n            'nominatim_properties', meta,\n            sa.Column('property', sa.Text, nullable=False),\n            sa.Column('value', sa.Text))\n\n        self.placex = sa.Table(\n            'placex', meta,\n            sa.Column('place_id', sa.BigInteger, nullable=False),\n            sa.Column('parent_place_id', sa.BigInteger),\n            sa.Column('linked_place_id', sa.BigInteger),\n            sa.Column('importance', sa.Float, nullable=False),\n            sa.Column('indexed_date', sa.DateTime),\n            sa.Column('rank_address', sa.SmallInteger, nullable=False),\n            sa.Column('rank_search', sa.SmallInteger, nullable=False),\n            sa.Column('indexed_status', sa.SmallInteger, nullable=False),\n            sa.Column('osm_type', sa.String(1), nullable=False),\n            sa.Column('osm_id', sa.BigInteger, nullable=False),\n            sa.Column('class', sa.Text, nullable=False, key='class_'),\n            sa.Column('type', sa.Text, nullable=False),\n            sa.Column('admin_level', sa.SmallInteger),\n            sa.Column('name', KeyValueStore),\n            sa.Column('address', KeyValueStore),\n            sa.Column('extratags', KeyValueStore),\n            sa.Column('geometry', Geometry, nullable=False),\n            sa.Column('wikipedia', sa.Text),\n            sa.Column('country_code', sa.String(2)),\n            sa.Column('housenumber', sa.Text),\n            sa.Column('postcode', sa.Text),\n            sa.Column('centroid', Geometry, nullable=False))\n\n        self.addressline = sa.Table(\n            'place_addressline', meta,\n            sa.Column('place_id', sa.BigInteger, nullable=False),\n            sa.Column('address_place_id', sa.BigInteger, nullable=False),\n            sa.Column('distance', sa.Float, nullable=False),\n            sa.Column('fromarea', sa.Boolean, nullable=False),\n            sa.Column('isaddress', sa.Boolean, nullable=False))\n\n        self.postcode = sa.Table(\n            'location_postcodes', meta,\n            sa.Column('place_id', sa.BigInteger, nullable=False),\n            sa.Column('parent_place_id', sa.BigInteger),\n            sa.Column('osm_id', sa.BigInteger),\n            sa.Column('rank_search', sa.SmallInteger, nullable=False),\n            sa.Column('indexed_status', sa.SmallInteger, nullable=False),\n            sa.Column('indexed_date', sa.DateTime),\n            sa.Column('country_code', sa.String(2), nullable=False),\n            sa.Column('postcode', sa.Text, nullable=False),\n            sa.Column('centroid', Geometry, nullable=False),\n            sa.Column('geometry', Geometry, nullable=False))\n\n        self.osmline = sa.Table(\n            'location_property_osmline', meta,\n            sa.Column('place_id', sa.BigInteger, nullable=False),\n            sa.Column('osm_id', sa.BigInteger, nullable=False),\n            sa.Column('parent_place_id', sa.BigInteger),\n            sa.Column('indexed_date', sa.DateTime),\n            sa.Column('startnumber', sa.Integer),\n            sa.Column('endnumber', sa.Integer),\n            sa.Column('step', sa.SmallInteger),\n            sa.Column('indexed_status', sa.SmallInteger, nullable=False),\n            sa.Column('linegeo', Geometry, nullable=False),\n            sa.Column('address', KeyValueStore),\n            sa.Column('postcode', sa.Text),\n            sa.Column('country_code', sa.String(2)))\n\n        self.country_name = sa.Table(\n            'country_name', meta,\n            sa.Column('country_code', sa.String(2)),\n            sa.Column('name', KeyValueStore),\n            sa.Column('derived_name', KeyValueStore),\n            sa.Column('partition', sa.Integer))\n\n        self.country_grid = sa.Table(\n            'country_osm_grid', meta,\n            sa.Column('country_code', sa.String(2)),\n            sa.Column('area', sa.Float),\n            sa.Column('geometry', Geometry))\n\n        # The following tables are not necessarily present.\n        self.search_name = sa.Table(\n            'search_name', meta,\n            sa.Column('place_id', sa.BigInteger, nullable=False),\n            sa.Column('importance', sa.Float, nullable=False),\n            sa.Column('address_rank', sa.SmallInteger, nullable=False),\n            sa.Column('name_vector', IntArray, nullable=False),\n            sa.Column('nameaddress_vector', IntArray, nullable=False),\n            sa.Column('country_code', sa.String(2)),\n            sa.Column('centroid', Geometry, nullable=False))\n\n        self.tiger = sa.Table(\n            'location_property_tiger', meta,\n            sa.Column('place_id', sa.BigInteger, nullable=False),\n            sa.Column('parent_place_id', sa.BigInteger),\n            sa.Column('startnumber', sa.Integer, nullable=False),\n            sa.Column('endnumber', sa.Integer, nullable=False),\n            sa.Column('step', sa.SmallInteger, nullable=False),\n            sa.Column('linegeo', Geometry, nullable=False),\n            sa.Column('postcode', sa.Text))\n\n        self.placex_entrance = sa.Table(\n            'placex_entrance', meta,\n            sa.Column('place_id', sa.BigInteger, nullable=False),\n            sa.Column('osm_id', sa.BigInteger, nullable=False),\n            sa.Column('type', sa.Text, nullable=False),\n            sa.Column('location', Geometry, nullable=False),\n            sa.Column('extratags', KeyValueStore))\n"
  },
  {
    "path": "src/nominatim_api/sql/sqlalchemy_types/__init__.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nModule with custom types for SQLAlchemy\n\"\"\"\n\nfrom .geometry import (Geometry as Geometry)\nfrom .int_array import (IntArray as IntArray)\nfrom .key_value import (KeyValueStore as KeyValueStore)\nfrom .json import (Json as Json)\n"
  },
  {
    "path": "src/nominatim_api/sql/sqlalchemy_types/geometry.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nCustom types for SQLAlchemy.\n\"\"\"\nfrom __future__ import annotations\nfrom typing import Callable, Any, cast\n\nimport sqlalchemy as sa\nfrom sqlalchemy.ext.compiler import compiles\nfrom sqlalchemy import types\n\nfrom ...typing import SaColumn, SaBind\n\n\nclass Geometry_DistanceSpheroid(sa.sql.expression.FunctionElement[float]):\n    \"\"\" Function to compute the spherical distance in meters.\n    \"\"\"\n    type = sa.Float()\n    name = 'Geometry_DistanceSpheroid'\n    inherit_cache = True\n\n\n@compiles(Geometry_DistanceSpheroid)\ndef _default_distance_spheroid(element: Geometry_DistanceSpheroid,\n                               compiler: 'sa.Compiled', **kw: Any) -> str:\n    return \"ST_DistanceSpheroid(%s,\"\\\n           \" 'SPHEROID[\\\"WGS 84\\\",6378137,298.257223563, AUTHORITY[\\\"EPSG\\\",\\\"7030\\\"]]')\"\\\n             % compiler.process(element.clauses, **kw)\n\n\n@compiles(Geometry_DistanceSpheroid, 'sqlite')\ndef _spatialite_distance_spheroid(element: Geometry_DistanceSpheroid,\n                                  compiler: 'sa.Compiled', **kw: Any) -> str:\n    return \"COALESCE(Distance(%s, true), 0.0)\" % compiler.process(element.clauses, **kw)\n\n\nclass Geometry_IsLineLike(sa.sql.expression.FunctionElement[Any]):\n    \"\"\" Check if the geometry is a line or multiline.\n    \"\"\"\n    name = 'Geometry_IsLineLike'\n    inherit_cache = True\n\n\n@compiles(Geometry_IsLineLike)\ndef _default_is_line_like(element: Geometry_IsLineLike,\n                          compiler: 'sa.Compiled', **kw: Any) -> str:\n    return \"ST_GeometryType(%s) IN ('ST_LineString', 'ST_MultiLineString')\" % \\\n               compiler.process(element.clauses, **kw)\n\n\n@compiles(Geometry_IsLineLike, 'sqlite')\ndef _sqlite_is_line_like(element: Geometry_IsLineLike,\n                         compiler: 'sa.Compiled', **kw: Any) -> str:\n    return \"ST_GeometryType(%s) IN ('LINESTRING', 'MULTILINESTRING')\" % \\\n               compiler.process(element.clauses, **kw)\n\n\nclass Geometry_IsAreaLike(sa.sql.expression.FunctionElement[Any]):\n    \"\"\" Check if the geometry is a polygon or multipolygon.\n    \"\"\"\n    name = 'Geometry_IsLineLike'\n    inherit_cache = True\n\n\n@compiles(Geometry_IsAreaLike)\ndef _default_is_area_like(element: Geometry_IsAreaLike,\n                          compiler: 'sa.Compiled', **kw: Any) -> str:\n    return \"ST_GeometryType(%s) IN ('ST_Polygon', 'ST_MultiPolygon')\" % \\\n               compiler.process(element.clauses, **kw)\n\n\n@compiles(Geometry_IsAreaLike, 'sqlite')\ndef _sqlite_is_area_like(element: Geometry_IsAreaLike,\n                         compiler: 'sa.Compiled', **kw: Any) -> str:\n    return \"ST_GeometryType(%s) IN ('POLYGON', 'MULTIPOLYGON')\" % \\\n               compiler.process(element.clauses, **kw)\n\n\nclass Geometry_IntersectsBbox(sa.sql.expression.FunctionElement[Any]):\n    \"\"\" Check if the bounding boxes of the given geometries intersect.\n    \"\"\"\n    name = 'Geometry_IntersectsBbox'\n    inherit_cache = True\n\n\n@compiles(Geometry_IntersectsBbox)\ndef _default_intersects(element: Geometry_IntersectsBbox,\n                        compiler: 'sa.Compiled', **kw: Any) -> str:\n    arg1, arg2 = list(element.clauses)\n    return \"%s && %s\" % (compiler.process(arg1, **kw), compiler.process(arg2, **kw))\n\n\n@compiles(Geometry_IntersectsBbox, 'sqlite')\ndef _sqlite_intersects(element: Geometry_IntersectsBbox,\n                       compiler: 'sa.Compiled', **kw: Any) -> str:\n    return \"MbrIntersects(%s) = 1\" % compiler.process(element.clauses, **kw)\n\n\nclass Geometry_ColumnIntersectsBbox(sa.sql.expression.FunctionElement[Any]):\n    \"\"\" Check if the bounding box of the geometry intersects with the\n        given table column, using the spatial index for the column.\n\n        The index must exist or the query may return nothing.\n    \"\"\"\n    name = 'Geometry_ColumnIntersectsBbox'\n    inherit_cache = True\n\n\n@compiles(Geometry_ColumnIntersectsBbox)\ndef default_intersects_column(element: Geometry_ColumnIntersectsBbox,\n                              compiler: 'sa.Compiled', **kw: Any) -> str:\n    arg1, arg2 = list(element.clauses)\n    return \"%s && %s\" % (compiler.process(arg1, **kw), compiler.process(arg2, **kw))\n\n\n@compiles(Geometry_ColumnIntersectsBbox, 'sqlite')\ndef spatialite_intersects_column(element: Geometry_ColumnIntersectsBbox,\n                                 compiler: 'sa.Compiled', **kw: Any) -> str:\n    arg1, arg2 = list(element.clauses)\n    return \"MbrIntersects(%s, %s) = 1 and \"\\\n           \"%s.ROWID IN (SELECT ROWID FROM SpatialIndex \"\\\n           \"             WHERE f_table_name = '%s' AND f_geometry_column = '%s' \"\\\n           \"             AND search_frame = %s)\"\\\n        % (compiler.process(arg1, **kw),\n           compiler.process(arg2, **kw),\n           arg1.table.name, arg1.table.name, arg1.name,\n           compiler.process(arg2, **kw))\n\n\nclass Geometry_ColumnDWithin(sa.sql.expression.FunctionElement[Any]):\n    \"\"\" Check if the geometry is within the distance of the\n        given table column, using the spatial index for the column.\n\n        The index must exist or the query may return nothing.\n    \"\"\"\n    name = 'Geometry_ColumnDWithin'\n    inherit_cache = True\n\n\n@compiles(Geometry_ColumnDWithin)\ndef default_dwithin_column(element: Geometry_ColumnDWithin,\n                           compiler: 'sa.Compiled', **kw: Any) -> str:\n    return \"ST_DWithin(%s)\" % compiler.process(element.clauses, **kw)\n\n\n@compiles(Geometry_ColumnDWithin, 'sqlite')\ndef spatialite_dwithin_column(element: Geometry_ColumnDWithin,\n                              compiler: 'sa.Compiled', **kw: Any) -> str:\n    geom1, geom2, dist = list(element.clauses)\n    return \"ST_Distance(%s, %s) < %s and \"\\\n           \"%s.ROWID IN (SELECT ROWID FROM SpatialIndex \"\\\n           \"             WHERE f_table_name = '%s' AND f_geometry_column = '%s' \"\\\n           \"             AND search_frame = ST_Expand(%s, %s))\"\\\n        % (compiler.process(geom1, **kw),\n           compiler.process(geom2, **kw),\n           compiler.process(dist, **kw),\n           geom1.table.name, geom1.table.name, geom1.name,\n           compiler.process(geom2, **kw),\n           compiler.process(dist, **kw))\n\n\nclass Geometry(types.UserDefinedType):  # type: ignore[type-arg]\n    \"\"\" Simplified type decorator for PostGIS geometry. This type\n        only supports geometries in 4326 projection.\n    \"\"\"\n    cache_ok = True\n\n    def __init__(self, subtype: str = 'Geometry'):\n        self.subtype = subtype\n\n    def get_col_spec(self, **_: Any) -> str:\n        return f'GEOMETRY({self.subtype}, 4326)'\n\n    def bind_processor(self, dialect: 'sa.Dialect') -> Callable[[Any], str]:\n        def process(value: Any) -> str:\n            if value is None:\n                return 'null'\n            if isinstance(value, str):\n                return value\n\n            return cast(str, value.to_wkt())\n        return process\n\n    def result_processor(self, dialect: 'sa.Dialect', coltype: object) -> Callable[[Any], str]:\n        def process(value: Any) -> str:\n            assert isinstance(value, str)\n            return value\n        return process\n\n    def column_expression(self, col: SaColumn) -> SaColumn:\n        return sa.func.ST_AsEWKB(col)\n\n    def bind_expression(self, bindvalue: SaBind) -> SaColumn:\n        return sa.func.ST_GeomFromText(bindvalue, sa.text('4326'), type_=self)\n\n    class comparator_factory(types.UserDefinedType.Comparator):  # type: ignore[type-arg]\n\n        def intersects(self, other: SaColumn, use_index: bool = True) -> 'sa.Operators':\n            if not use_index:\n                return Geometry_IntersectsBbox(sa.func.coalesce(sa.null(), self.expr), other)\n\n            if isinstance(self.expr, sa.Column):\n                return Geometry_ColumnIntersectsBbox(self.expr, other)\n\n            return Geometry_IntersectsBbox(self.expr, other)\n\n        def is_line_like(self) -> SaColumn:\n            return Geometry_IsLineLike(self)\n\n        def is_area(self) -> SaColumn:\n            return Geometry_IsAreaLike(self)\n\n        def within_distance(self, other: SaColumn, distance: SaColumn) -> SaColumn:\n            if isinstance(self.expr, sa.Column):\n                return Geometry_ColumnDWithin(self.expr, other, distance)\n\n            return self.ST_Distance(other) < distance\n\n        def ST_Distance(self, other: SaColumn) -> SaColumn:\n            return sa.func.ST_Distance(self, other, type_=sa.Float)\n\n        def ST_Contains(self, other: SaColumn) -> SaColumn:\n            return sa.func.ST_Contains(self, other, type_=sa.Boolean)\n\n        def ST_CoveredBy(self, other: SaColumn) -> SaColumn:\n            return sa.func.ST_CoveredBy(self, other, type_=sa.Boolean)\n\n        def ST_ClosestPoint(self, other: SaColumn) -> SaColumn:\n            return sa.func.coalesce(sa.func.ST_ClosestPoint(self, other, type_=Geometry),\n                                    other)\n\n        def ST_Buffer(self, other: SaColumn) -> SaColumn:\n            return sa.func.ST_Buffer(self, other, type_=Geometry)\n\n        def ST_Expand(self, other: SaColumn) -> SaColumn:\n            return sa.func.ST_Expand(self, other, type_=Geometry)\n\n        def ST_Collect(self) -> SaColumn:\n            return sa.func.ST_Collect(self, type_=Geometry)\n\n        def ST_Centroid(self) -> SaColumn:\n            return sa.func.ST_Centroid(self, type_=Geometry)\n\n        def ST_LineInterpolatePoint(self, other: SaColumn) -> SaColumn:\n            return sa.func.ST_LineInterpolatePoint(self, other, type_=Geometry)\n\n        def ST_LineLocatePoint(self, other: SaColumn) -> SaColumn:\n            return sa.func.ST_LineLocatePoint(self, other, type_=sa.Float)\n\n        def distance_spheroid(self, other: SaColumn) -> SaColumn:\n            return Geometry_DistanceSpheroid(self, other)\n\n\n@compiles(Geometry, 'sqlite')\ndef get_col_spec(self, *args, **kwargs):  # type: ignore[no-untyped-def]\n    return 'GEOMETRY'\n\n\nSQLITE_FUNCTION_ALIAS = (\n    ('ST_AsEWKB', sa.Text, 'AsEWKB'),\n    ('ST_GeomFromEWKT', Geometry, 'GeomFromEWKT'),\n    ('ST_AsGeoJSON', sa.Text, 'AsGeoJSON'),\n    ('ST_AsKML', sa.Text, 'AsKML'),\n    ('ST_AsSVG', sa.Text, 'AsSVG'),\n    ('ST_LineLocatePoint', sa.Float, 'ST_Line_Locate_Point'),\n    ('ST_LineInterpolatePoint', sa.Float, 'ST_Line_Interpolate_Point'),\n)\n\n\ndef _add_function_alias(func: str, ftype: type, alias: str) -> None:\n    _FuncDef = type(func, (sa.sql.functions.GenericFunction, ), {\n        \"type\": ftype(),\n        \"name\": func,\n        \"identifier\": func,\n        \"inherit_cache\": True})\n\n    func_templ = f\"{alias}(%s)\"\n\n    def _sqlite_impl(element: Any, compiler: Any, **kw: Any) -> Any:\n        return func_templ % compiler.process(element.clauses, **kw)\n\n    compiles(_FuncDef, 'sqlite')(_sqlite_impl)\n\n\nfor alias in SQLITE_FUNCTION_ALIAS:\n    _add_function_alias(*alias)\n"
  },
  {
    "path": "src/nominatim_api/sql/sqlalchemy_types/int_array.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nCustom type for an array of integers.\n\"\"\"\nfrom typing import Any, List, Optional\n\nimport sqlalchemy as sa\nfrom sqlalchemy.ext.compiler import compiles\nfrom sqlalchemy.dialects.postgresql import ARRAY\n\nfrom ...typing import SaDialect, SaColumn\n\n\nclass IntList(sa.types.TypeDecorator[Any]):\n    \"\"\" A list of integers saved as a text of comma-separated numbers.\n    \"\"\"\n    impl = sa.types.Unicode\n    cache_ok = True\n\n    def process_bind_param(self, value: Optional[Any], dialect: 'sa.Dialect') -> Optional[str]:\n        if value is None:\n            return None\n\n        assert isinstance(value, list)\n        return ','.join(map(str, value))\n\n    def process_result_value(self, value: Optional[Any],\n                             dialect: SaDialect) -> Optional[List[int]]:\n        return [int(v) for v in value.split(',')] if value is not None else None\n\n\nclass IntArray(sa.types.TypeDecorator[Any]):\n    \"\"\" Dialect-independent list of integers.\n    \"\"\"\n    impl = IntList\n    cache_ok = True\n\n    def load_dialect_impl(self, dialect: SaDialect) -> sa.types.TypeEngine[Any]:\n        if dialect.name == 'postgresql':\n            return ARRAY(sa.Integer())\n\n        return IntList()\n\n    class comparator_factory(sa.types.UserDefinedType.Comparator):  # type: ignore[type-arg]\n\n        def __add__(self, other: SaColumn) -> 'sa.ColumnOperators':\n            \"\"\" Concate the array with the given array. If one of the\n                operants is null, the value of the other will be returned.\n            \"\"\"\n            return ArrayCat(self.expr, other)\n\n        def contains(self, other: SaColumn, **kwargs: Any) -> 'sa.ColumnOperators':\n            \"\"\" Return true if the array contains all the value of the argument\n                array.\n            \"\"\"\n            return ArrayContains(self.expr, other)\n\n\nclass ArrayAgg(sa.sql.functions.GenericFunction[Any]):\n    \"\"\" Aggregate function to collect elements in an array.\n    \"\"\"\n    type = IntArray()\n    identifier = 'ArrayAgg'\n    name = 'array_agg'\n    inherit_cache = True\n\n\n@compiles(ArrayAgg, 'sqlite')\ndef sqlite_array_agg(element: ArrayAgg, compiler: 'sa.Compiled', **kw: Any) -> str:\n    return \"group_concat(%s, ',')\" % compiler.process(element.clauses, **kw)\n\n\nclass ArrayContains(sa.sql.expression.FunctionElement[Any]):\n    \"\"\" Function to check if an array is fully contained in another.\n    \"\"\"\n    name = 'ArrayContains'\n    inherit_cache = True\n\n\n@compiles(ArrayContains)\ndef generic_array_contains(element: ArrayContains, compiler: 'sa.Compiled', **kw: Any) -> str:\n    arg1, arg2 = list(element.clauses)\n    return \"(%s @> %s)\" % (compiler.process(arg1, **kw),\n                           compiler.process(arg2, **kw))\n\n\n@compiles(ArrayContains, 'sqlite')\ndef sqlite_array_contains(element: ArrayContains, compiler: 'sa.Compiled', **kw: Any) -> str:\n    return \"array_contains(%s)\" % compiler.process(element.clauses, **kw)\n\n\nclass ArrayCat(sa.sql.expression.FunctionElement[Any]):\n    \"\"\" Function to check if an array is fully contained in another.\n    \"\"\"\n    type = IntArray()\n    identifier = 'ArrayCat'\n    inherit_cache = True\n\n\n@compiles(ArrayCat)\ndef generic_array_cat(element: ArrayCat, compiler: 'sa.Compiled', **kw: Any) -> str:\n    return \"array_cat(%s)\" % compiler.process(element.clauses, **kw)\n\n\n@compiles(ArrayCat, 'sqlite')\ndef sqlite_array_cat(element: ArrayCat, compiler: 'sa.Compiled', **kw: Any) -> str:\n    arg1, arg2 = list(element.clauses)\n    return \"(%s || ',' || %s)\" % (compiler.process(arg1, **kw), compiler.process(arg2, **kw))\n"
  },
  {
    "path": "src/nominatim_api/sql/sqlalchemy_types/json.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nCommon json type for different dialects.\n\"\"\"\nfrom typing import Any\n\nimport sqlalchemy as sa\nfrom sqlalchemy.dialects.postgresql import JSONB\nfrom sqlalchemy.dialects.sqlite import JSON as sqlite_json\n\nfrom ...typing import SaDialect\n\n\nclass Json(sa.types.TypeDecorator[Any]):\n    \"\"\" Dialect-independent type for JSON.\n    \"\"\"\n    impl = sa.types.JSON\n    cache_ok = True\n\n    def load_dialect_impl(self, dialect: SaDialect) -> sa.types.TypeEngine[Any]:\n        if dialect.name == 'postgresql':\n            return JSONB(none_as_null=True)\n\n        return sqlite_json(none_as_null=True)\n"
  },
  {
    "path": "src/nominatim_api/sql/sqlalchemy_types/key_value.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nA custom type that implements a simple key-value store of strings.\n\"\"\"\nfrom typing import Any\n\nimport sqlalchemy as sa\nfrom sqlalchemy.ext.compiler import compiles\nfrom sqlalchemy.dialects.postgresql import HSTORE\nfrom sqlalchemy.dialects.sqlite import JSON as sqlite_json\n\nfrom ...typing import SaDialect, SaColumn\n\n\nclass KeyValueStore(sa.types.TypeDecorator[Any]):\n    \"\"\" Dialect-independent type of a simple key-value store of strings.\n    \"\"\"\n    impl = HSTORE\n    cache_ok = True\n\n    def load_dialect_impl(self, dialect: SaDialect) -> sa.types.TypeEngine[Any]:\n        if dialect.name == 'postgresql':\n            return HSTORE()  # type: ignore[no-untyped-call]\n\n        return sqlite_json(none_as_null=True)\n\n    class comparator_factory(sa.types.UserDefinedType.Comparator):  # type: ignore[type-arg]\n\n        def merge(self, other: SaColumn) -> 'sa.Operators':\n            \"\"\" Merge the values from the given KeyValueStore into this\n                one, overwriting values where necessary. When the argument\n                is null, nothing happens.\n            \"\"\"\n            return KeyValueConcat(self.expr, other)\n\n\nclass KeyValueConcat(sa.sql.expression.FunctionElement[Any]):\n    \"\"\" Return the merged key-value store from the input parameters.\n    \"\"\"\n    type = KeyValueStore()\n    name = 'JsonConcat'\n    inherit_cache = True\n\n\n@compiles(KeyValueConcat)\ndef default_json_concat(element: KeyValueConcat, compiler: 'sa.Compiled', **kw: Any) -> str:\n    arg1, arg2 = list(element.clauses)\n    return \"(%s || coalesce(%s, ''::hstore))\"\\\n        % (compiler.process(arg1, **kw), compiler.process(arg2, **kw))\n\n\n@compiles(KeyValueConcat, 'sqlite')\ndef sqlite_json_concat(element: KeyValueConcat, compiler: 'sa.Compiled', **kw: Any) -> str:\n    arg1, arg2 = list(element.clauses)\n    return \"json_patch(%s, coalesce(%s, '{}'))\"\\\n        % (compiler.process(arg1, **kw), compiler.process(arg2, **kw))\n"
  },
  {
    "path": "src/nominatim_api/sql/sqlite_functions.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nCustom functions for SQLite.\n\"\"\"\nfrom typing import cast, Optional, Set, Any\nimport json\n\n\ndef weigh_search(search_vector: Optional[str], rankings: str, default: float) -> float:\n    \"\"\" Custom weight function for search results.\n    \"\"\"\n    if search_vector is not None:\n        svec = [int(x) for x in search_vector.split(',')]\n        for rank in json.loads(rankings):\n            if all(r in svec for r in rank[1]):\n                return cast(float, rank[0])\n\n    return default\n\n\nclass ArrayIntersectFuzzy:\n    \"\"\" Compute the array of common elements of all input integer arrays.\n        Very large input parameters may be ignored to speed up\n        computation. Therefore, the result is a superset of common elements.\n\n        Input and output arrays are given as comma-separated lists.\n    \"\"\"\n    def __init__(self) -> None:\n        self.first = ''\n        self.values: Optional[Set[int]] = None\n\n    def step(self, value: Optional[str]) -> None:\n        \"\"\" Add the next array to the intersection.\n        \"\"\"\n        if value is not None:\n            if not self.first:\n                self.first = value\n            elif len(value) < 10000000:\n                if self.values is None:\n                    self.values = {int(x) for x in self.first.split(',')}\n                self.values.intersection_update((int(x) for x in value.split(',')))\n\n    def finalize(self) -> str:\n        \"\"\" Return the final result.\n        \"\"\"\n        if self.values is not None:\n            return ','.join(map(str, self.values))\n\n        return self.first\n\n\nclass ArrayUnion:\n    \"\"\" Compute the set of all elements of the input integer arrays.\n\n        Input and output arrays are given as strings of comma-separated lists.\n    \"\"\"\n    def __init__(self) -> None:\n        self.values: Optional[Set[str]] = None\n\n    def step(self, value: Optional[str]) -> None:\n        \"\"\" Add the next array to the union.\n        \"\"\"\n        if value is not None:\n            if self.values is None:\n                self.values = set(value.split(','))\n            else:\n                self.values.update(value.split(','))\n\n    def finalize(self) -> str:\n        \"\"\" Return the final result.\n        \"\"\"\n        return '' if self.values is None else ','.join(self.values)\n\n\ndef array_contains(container: Optional[str], containee: Optional[str]) -> Optional[bool]:\n    \"\"\" Is the array 'containee' completely contained in array 'container'.\n    \"\"\"\n    if container is None or containee is None:\n        return None\n\n    vset = container.split(',')\n    return all(v in vset for v in containee.split(','))\n\n\ndef array_pair_contains(container1: Optional[str], container2: Optional[str],\n                        containee: Optional[str]) -> Optional[bool]:\n    \"\"\" Is the array 'containee' completely contained in the union of\n        array 'container1' and array 'container2'.\n    \"\"\"\n    if container1 is None or container2 is None or containee is None:\n        return None\n\n    vset = container1.split(',') + container2.split(',')\n    return all(v in vset for v in containee.split(','))\n\n\ndef install_custom_functions(conn: Any) -> None:\n    \"\"\" Install helper functions for Nominatim into the given SQLite\n        database connection.\n    \"\"\"\n    conn.create_function('weigh_search', 3, weigh_search, deterministic=True)\n    conn.create_function('array_contains', 2, array_contains, deterministic=True)\n    conn.create_function('array_pair_contains', 3, array_pair_contains, deterministic=True)\n    _create_aggregate(conn, 'array_intersect_fuzzy', 1, ArrayIntersectFuzzy)\n    _create_aggregate(conn, 'array_union', 1, ArrayUnion)\n\n\nasync def _make_aggregate(aioconn: Any, *args: Any) -> None:\n    await aioconn._execute(aioconn._conn.create_aggregate, *args)\n\n\ndef _create_aggregate(conn: Any, name: str, nargs: int, aggregate: Any) -> None:\n    try:\n        conn.await_(_make_aggregate(conn._connection, name, nargs, aggregate))\n    except Exception as error:\n        conn._handle_exception(error)\n"
  },
  {
    "path": "src/nominatim_api/status.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nClasses and function related to status call.\n\"\"\"\nfrom typing import Optional\nimport datetime as dt\nimport dataclasses\n\nimport sqlalchemy as sa\n\nfrom .connection import SearchConnection\nfrom .version import NOMINATIM_API_VERSION\n\n\n@dataclasses.dataclass\nclass StatusResult:\n    \"\"\" Result of a call to the status API.\n    \"\"\"\n    status: int\n    message: str\n    software_version = NOMINATIM_API_VERSION\n    data_updated: Optional[dt.datetime] = None\n    database_version: Optional[str] = None\n\n\nasync def get_status(conn: SearchConnection) -> StatusResult:\n    \"\"\" Execute a status API call.\n    \"\"\"\n    status = StatusResult(0, 'OK')\n\n    # Last update date\n    sql = sa.select(conn.t.import_status.c.lastimportdate).limit(1)\n    status.data_updated = await conn.scalar(sql)\n\n    if status.data_updated is not None:\n        if status.data_updated.tzinfo is None:\n            status.data_updated = status.data_updated.replace(tzinfo=dt.timezone.utc)\n        else:\n            status.data_updated = status.data_updated.astimezone(dt.timezone.utc)\n\n    # Database version\n    try:\n        status.database_version = await conn.get_property('database_version')\n    except ValueError:\n        pass\n\n    return status\n"
  },
  {
    "path": "src/nominatim_api/timeout.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nHelpers for handling of timeouts for request.\n\"\"\"\nfrom typing import Union, Optional\nimport asyncio\n\n\nclass Timeout:\n    \"\"\" A class that provides helper functions to ensure a given timeout\n        is respected. Can only be used from coroutines.\n    \"\"\"\n    def __init__(self, timeout: Optional[Union[int, float]]) -> None:\n        self.abs = None if timeout is None else asyncio.get_running_loop().time() + timeout\n\n    def is_elapsed(self) -> bool:\n        \"\"\" Check if the timeout has already passed.\n        \"\"\"\n        return (self.abs is not None) and (asyncio.get_running_loop().time() >= self.abs)\n"
  },
  {
    "path": "src/nominatim_api/types.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nComplex datatypes used by the Nominatim API.\n\"\"\"\nfrom typing import Optional, Union, Tuple, NamedTuple, TypeVar, Type, Dict, \\\n                   Any, List, Sequence, TYPE_CHECKING\nfrom collections import abc\nimport dataclasses\nimport datetime as dt\nimport enum\nimport math\nfrom struct import unpack\nfrom binascii import unhexlify\n\nif TYPE_CHECKING:\n    from .localization import Locales\nfrom .errors import UsageError\n\n\n@dataclasses.dataclass\nclass PlaceID:\n    \"\"\" Reference a place by Nominatim's internal ID.\n\n        A PlaceID may reference place from the main table placex, from\n        the interpolation tables or the postcode tables. Place IDs are not\n        stable between installations. You may use this type theefore only\n        with place IDs obtained from the same database.\n    \"\"\"\n    place_id: int\n    \"\"\"\n    The internal ID of the place to reference.\n    \"\"\"\n\n    def __str__(self) -> str:\n        return str(self.place_id)\n\n\n@dataclasses.dataclass\nclass OsmID:\n    \"\"\" Reference a place by its OSM ID and potentially the basic category.\n\n        The OSM ID may refer to places in the main table placex and OSM\n        interpolation lines.\n    \"\"\"\n    osm_type: str\n    \"\"\" OSM type of the object. Must be one of `N`(node), `W`(way) or\n        `R`(relation).\n    \"\"\"\n    osm_id: int\n    \"\"\" The OSM ID of the object.\n    \"\"\"\n    osm_class: Optional[str] = None\n    \"\"\" The same OSM object may appear multiple times in the database under\n        different categories. The optional class parameter allows to distinguish\n        the different categories and corresponds to the key part of the category.\n        If there are multiple objects in the database and `osm_class` is\n        left out, then one of the objects is returned at random.\n    \"\"\"\n\n    def __str__(self) -> str:\n        return f\"{self.osm_type}{self.osm_id}\"\n\n    def __post_init__(self) -> None:\n        if self.osm_type not in ('N', 'W', 'R'):\n            raise ValueError(f\"Illegal OSM type '{self.osm_type}'. Must be one of N, W, R.\")\n\n    def class_as_housenumber(self) -> Optional[int]:\n        \"\"\" Interpret the class property as a housenumber and return it.\n\n            If the OSM ID points to an interpolation, then the class may be\n            a number pointing to the exact number requested. This function\n            returns the housenumber as an int, if class is set and is a number.\n        \"\"\"\n        if self.osm_class and self.osm_class.isdigit():\n            return int(self.osm_class)\n        return None\n\n\nPlaceRef = Union[PlaceID, OsmID]\n\n\nclass Point(NamedTuple):\n    \"\"\" A geographic point in WGS84 projection.\n    \"\"\"\n    x: float\n    y: float\n\n    @property\n    def lat(self) -> float:\n        \"\"\" Return the latitude of the point.\n        \"\"\"\n        return self.y\n\n    @property\n    def lon(self) -> float:\n        \"\"\" Return the longitude of the point.\n        \"\"\"\n        return self.x\n\n    def to_geojson(self) -> str:\n        \"\"\" Return the point in GeoJSON format.\n        \"\"\"\n        return f'{{\"type\": \"Point\",\"coordinates\": [{self.x}, {self.y}]}}'\n\n    @staticmethod\n    def from_wkb(wkb: Union[str, bytes]) -> 'Point':\n        \"\"\" Create a point from EWKB as returned from the database.\n        \"\"\"\n        if isinstance(wkb, str):\n            wkb = unhexlify(wkb)\n        if len(wkb) != 25:\n            raise ValueError(f\"Point wkb has unexpected length {len(wkb)}\")\n        if wkb[0] == 0:\n            gtype, srid, x, y = unpack('>iidd', wkb[1:])\n        elif wkb[0] == 1:\n            gtype, srid, x, y = unpack('<iidd', wkb[1:])\n        else:\n            raise ValueError(\"WKB has unknown endian value.\")\n\n        if gtype != 0x20000001:\n            raise ValueError(\"WKB must be a point geometry.\")\n        if srid != 4326:\n            raise ValueError(\"Only WGS84 WKB supported.\")\n\n        return Point(x, y)\n\n    @staticmethod\n    def from_param(inp: Any) -> 'Point':\n        \"\"\" Create a point from an input parameter. The parameter\n            may be given as a point, a string or a sequence of\n            strings or floats. Raises a UsageError if the format is\n            not correct.\n        \"\"\"\n        if isinstance(inp, Point):\n            return inp\n\n        seq: Sequence[str]\n        if isinstance(inp, str):\n            seq = inp.split(',')\n        elif isinstance(inp, abc.Sequence):\n            seq = inp\n\n        if len(seq) != 2:\n            raise UsageError('Point parameter needs 2 coordinates.')\n        try:\n            x, y = filter(math.isfinite, map(float, seq))\n        except ValueError as exc:\n            raise UsageError('Point parameter needs to be numbers.') from exc\n\n        if not -180 <= x <= 180 or not -90 <= y <= 90.0:\n            raise UsageError('Point coordinates invalid.')\n\n        return Point(x, y)\n\n    def to_wkt(self) -> str:\n        \"\"\" Return the WKT representation of the point.\n        \"\"\"\n        return f'POINT({self.x} {self.y})'\n\n\nAnyPoint = Union[Point, Tuple[float, float]]\n\nWKB_BBOX_HEADER_LE = b'\\x01\\x03\\x00\\x00\\x20\\xE6\\x10\\x00\\x00\\x01\\x00\\x00\\x00\\x05\\x00\\x00\\x00'\nWKB_BBOX_HEADER_BE = b'\\x00\\x20\\x00\\x00\\x03\\x00\\x00\\x10\\xe6\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x05'\n\n\nclass Bbox:\n    \"\"\" A bounding box in WGS84 projection.\n\n        The coordinates are available as an array in the 'coord'\n        property in the order (minx, miny, maxx, maxy).\n    \"\"\"\n    def __init__(self, minx: float, miny: float, maxx: float, maxy: float) -> None:\n        \"\"\" Create a new bounding box with the given coordinates in WGS84\n            projection.\n        \"\"\"\n        self.coords = (minx, miny, maxx, maxy)\n\n    @property\n    def minlat(self) -> float:\n        \"\"\" Southern-most latitude, corresponding to the minimum y coordinate.\n        \"\"\"\n        return self.coords[1]\n\n    @property\n    def maxlat(self) -> float:\n        \"\"\" Northern-most latitude, corresponding to the maximum y coordinate.\n        \"\"\"\n        return self.coords[3]\n\n    @property\n    def minlon(self) -> float:\n        \"\"\" Western-most longitude, corresponding to the minimum x coordinate.\n        \"\"\"\n        return self.coords[0]\n\n    @property\n    def maxlon(self) -> float:\n        \"\"\" Eastern-most longitude, corresponding to the maximum x coordinate.\n        \"\"\"\n        return self.coords[2]\n\n    @property\n    def area(self) -> float:\n        \"\"\" Return the area of the box in WGS84.\n        \"\"\"\n        return (self.coords[2] - self.coords[0]) * (self.coords[3] - self.coords[1])\n\n    def contains(self, pt: Point) -> bool:\n        \"\"\" Check if the point is inside or on the boundary of the box.\n        \"\"\"\n        return self.coords[0] <= pt[0] and self.coords[1] <= pt[1]\\\n            and self.coords[2] >= pt[0] and self.coords[3] >= pt[1]\n\n    def to_wkt(self) -> str:\n        \"\"\" Return the WKT representation of the Bbox. This\n            is a simple polygon with four points.\n        \"\"\"\n        return 'POLYGON(({0} {1},{0} {3},{2} {3},{2} {1},{0} {1}))'\\\n            .format(*self.coords)\n\n    @staticmethod\n    def from_wkb(wkb: Union[None, str, bytes]) -> 'Optional[Bbox]':\n        \"\"\" Create a Bbox from a bounding box polygon as returned by\n            the database. Returns `None` if the input value is None.\n        \"\"\"\n        if wkb is None:\n            return None\n\n        if isinstance(wkb, str):\n            wkb = unhexlify(wkb)\n\n        if len(wkb) != 97:\n            raise ValueError(\"WKB must be a bounding box polygon\")\n        if wkb.startswith(WKB_BBOX_HEADER_LE):\n            x1, y1, _, _, x2, y2 = unpack('<dddddd', wkb[17:65])\n        elif wkb.startswith(WKB_BBOX_HEADER_BE):\n            x1, y1, _, _, x2, y2 = unpack('>dddddd', wkb[17:65])\n        else:\n            raise ValueError(\"WKB has wrong header\")\n\n        return Bbox(min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2))\n\n    @staticmethod\n    def from_point(pt: Point, buffer: float) -> 'Bbox':\n        \"\"\" Return a Bbox around the point with the buffer added to all sides.\n        \"\"\"\n        return Bbox(pt[0] - buffer, pt[1] - buffer,\n                    pt[0] + buffer, pt[1] + buffer)\n\n    @staticmethod\n    def from_param(inp: Any) -> 'Bbox':\n        \"\"\" Return a Bbox from an input parameter. The box may be\n            given as a Bbox, a string or a list or strings or integer.\n            Raises a UsageError if the format is incorrect.\n        \"\"\"\n        if isinstance(inp, Bbox):\n            return inp\n\n        seq: Sequence[str]\n        if isinstance(inp, str):\n            seq = inp.split(',')\n        elif isinstance(inp, abc.Sequence):\n            seq = inp\n\n        if len(seq) != 4:\n            raise UsageError('Bounding box parameter needs 4 coordinates.')\n        try:\n            x1, y1, x2, y2 = filter(math.isfinite, map(float, seq))\n        except ValueError as exc:\n            raise UsageError('Bounding box parameter needs to be numbers.') from exc\n\n        x1 = min(180, max(-180, x1))\n        x2 = min(180, max(-180, x2))\n        y1 = min(90, max(-90, y1))\n        y2 = min(90, max(-90, y2))\n\n        if x1 == x2 or y1 == y2:\n            raise UsageError('Bounding box with invalid parameters.')\n\n        return Bbox(min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2))\n\n\nclass GeometryFormat(enum.Flag):\n    \"\"\" All search functions support returning the full geometry of a place in\n        various formats. The internal geometry is converted by PostGIS to\n        the desired format and then returned as a string. It is possible to\n        request multiple formats at the same time.\n    \"\"\"\n    NONE = 0\n    \"\"\" No geometry requested. Alias for a empty flag.\n    \"\"\"\n    GEOJSON = enum.auto()\n    \"\"\"\n    [GeoJSON](https://geojson.org/) format\n    \"\"\"\n    KML = enum.auto()\n    \"\"\"\n    [KML](https://en.wikipedia.org/wiki/Keyhole_Markup_Language) format\n    \"\"\"\n    SVG = enum.auto()\n    \"\"\"\n    [SVG](http://www.w3.org/TR/SVG/paths.html) format\n    \"\"\"\n    TEXT = enum.auto()\n    \"\"\"\n    [WKT](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry) format\n    \"\"\"\n\n\nclass DataLayer(enum.Flag):\n    \"\"\" The `DataLayer` flag type defines the layers that can be selected\n        for reverse and forward search.\n    \"\"\"\n    ADDRESS = enum.auto()\n    \"\"\" The address layer contains all places relevant for addresses:\n        fully qualified addresses with a house number (or a house name equivalent,\n        for some addresses) and places that can be part of an address like\n        roads, cities, states.\n    \"\"\"\n    POI = enum.auto()\n    \"\"\" Layer for points of interest like shops, restaurants but also\n        recycling bins or postboxes.\n    \"\"\"\n    RAILWAY = enum.auto()\n    \"\"\" Layer with railway features including tracks and other infrastructure.\n        Note that in Nominatim's standard configuration, only very few railway\n        features are imported into the database. Thus a custom configuration\n        is required to make full use of this layer.\n    \"\"\"\n    NATURAL = enum.auto()\n    \"\"\" Layer with natural features like rivers, lakes and mountains.\n    \"\"\"\n    MANMADE = enum.auto()\n    \"\"\" Layer with other human-made features and boundaries. This layer is\n        the catch-all and includes all features not covered by the other\n        layers. A typical example for this layer are national park boundaries.\n    \"\"\"\n\n\nclass QueryStatistics(dict[str, Any]):\n    \"\"\" A specialised dictionary for collecting query statistics.\n    \"\"\"\n\n    def __enter__(self) -> 'QueryStatistics':\n        self.log_time('start')\n        return self\n\n    def __exit__(self, *_: Any) -> None:\n        self.log_time('end')\n        self['total_time'] = (self['end'] - self['start']).total_seconds()\n        if 'start_query' in self:\n            self['wait_time'] = (self['start_query'] - self['start']).total_seconds()\n        else:\n            self['wait_time'] = self['total_time']\n            self['start_query'] = self['end']\n        self['query_time'] = self['total_time'] - self['wait_time']\n\n    def __missing__(self, key: str) -> str:\n        return ''\n\n    def log_time(self, key: str) -> None:\n        self[key] = dt.datetime.now(tz=dt.timezone.utc)\n\n\nclass NoQueryStats:\n    \"\"\" Null object to use, when no query statistics are requested.\n    \"\"\"\n\n    def __enter__(self) -> 'NoQueryStats':\n        return self\n\n    def __exit__(self, *_: Any) -> None:\n        pass\n\n    def __setitem__(self, key: str, value: Any) -> None:\n        pass\n\n    def __getitem__(self, key: str) -> Any:\n        return None\n\n    def __contains__(self, key: str, default: Any = None) -> bool:\n        return False\n\n    def log_time(self, key: str) -> None:\n        pass\n\n\ndef format_country(cc: Any) -> List[str]:\n    \"\"\" Extract a list of country codes from the input which may be either\n        a string or list of strings. Filters out all values that are not\n        a two-letter string.\n    \"\"\"\n    clist: Sequence[str]\n    if isinstance(cc, str):\n        clist = cc.split(',')\n    elif isinstance(cc, abc.Sequence):\n        clist = cc\n    else:\n        raise UsageError(\"Parameter 'country' needs to be a comma-separated list \"\n                         \"or a Python list of strings.\")\n\n    return [cc.lower() for cc in clist if isinstance(cc, str) and len(cc) == 2]\n\n\ndef format_excluded(ids: Any) -> List[PlaceRef]:\n    \"\"\" Extract a list of place IDs and OSM IDs from the input.\n    \"\"\"\n    if not ids:\n        return []\n\n    plist: Sequence[str]\n    if isinstance(ids, str):\n        plist = [s.strip() for s in ids.split(',')]\n    elif isinstance(ids, abc.Sequence):\n        plist = ids\n    else:\n        raise UsageError(\"Parameter 'excluded' needs to be a comma-separated list \"\n                         \"or a Python list of place IDs or OSM IDs.\")\n\n    result: List[PlaceRef] = []\n    for i in plist:\n        if not i:\n            continue\n        if isinstance(i, (PlaceID, OsmID)):\n            result.append(i)\n        elif isinstance(i, int):\n            if i > 0:\n                result.append(PlaceID(i))\n        elif isinstance(i, str):\n            if i.isdigit():\n                if int(i) > 0:\n                    result.append(PlaceID(int(i)))\n            elif len(i) > 1 and i[0].upper() in ('N', 'W', 'R') and i[1:].isdigit():\n                if int(i[1:]) > 0:\n                    result.append(OsmID(i[0].upper(), int(i[1:])))\n            else:\n                raise UsageError(f\"Invalid exclude ID: {i}\")\n        else:\n            raise UsageError(\"Parameter 'excluded' contains invalid types.\")\n\n    return result\n\n\ndef format_categories(categories: List[Tuple[str, str]]) -> List[Tuple[str, str]]:\n    \"\"\" Extract a list of categories. Currently a noop.\n    \"\"\"\n    return categories\n\n\nTParam = TypeVar('TParam', bound='LookupDetails')\n\n\n@dataclasses.dataclass\nclass LookupDetails:\n    \"\"\" Collection of parameters that define which kind of details are\n        returned with a lookup or details result.\n    \"\"\"\n    geometry_output: GeometryFormat = GeometryFormat.NONE\n    \"\"\" Add the full geometry of the place to the result. Multiple\n        formats may be selected. Note that geometries can become quite large.\n    \"\"\"\n    address_details: bool = False\n    \"\"\" Get detailed information on the places that make up the address\n        for the result.\n    \"\"\"\n    linked_places: bool = False\n    \"\"\" Get detailed information on the places that link to the result.\n    \"\"\"\n    parented_places: bool = False\n    \"\"\" Get detailed information on all places that this place is a parent\n        for, i.e. all places for which it provides the address details.\n        Only POI places can have parents.\n    \"\"\"\n    entrances: bool = False\n    \"\"\" Get detailed information about the tagged entrances for the result.\n    \"\"\"\n    keywords: bool = False\n    \"\"\" Add information about the search terms used for this place.\n    \"\"\"\n    geometry_simplification: float = 0.0\n    \"\"\" Simplification factor for a geometry in degrees WGS. A factor of\n        0.0 means the original geometry is kept. The higher the value, the\n        more the geometry gets simplified.\n    \"\"\"\n    query_stats: Union[QueryStatistics, NoQueryStats] = \\\n        dataclasses.field(default_factory=NoQueryStats)\n    \"\"\" Optional QueryStatistics object collecting information about\n        runtime behaviour of the call.\n    \"\"\"\n\n    @classmethod\n    def from_kwargs(cls: Type[TParam], kwargs: Dict[str, Any]) -> TParam:\n        \"\"\" Load the data fields of the class from a dictionary.\n            Unknown entries in the dictionary are ignored, missing ones\n            get the default setting.\n\n            The function supports type checking and throws a UsageError\n            when the value does not fit.\n        \"\"\"\n        def _check_field(v: Any, field: 'dataclasses.Field[Any]') -> Any:\n            if v is None:\n                return field.default_factory() \\\n                       if field.default_factory != dataclasses.MISSING \\\n                       else field.default\n            if field.metadata and 'transform' in field.metadata:\n                return field.metadata['transform'](v)\n            if not isinstance(v, field.type):  # type: ignore[arg-type]\n                raise UsageError(f\"Parameter '{field.name}' needs to be of {field.type!s}.\")\n            return v\n\n        return cls(**{f.name: _check_field(kwargs[f.name], f)\n                      for f in dataclasses.fields(cls) if f.name in kwargs})\n\n\n@dataclasses.dataclass\nclass ReverseDetails(LookupDetails):\n    \"\"\" Collection of parameters for the reverse call.\n    \"\"\"\n\n    max_rank: int = dataclasses.field(default=30,\n                                      metadata={'transform': lambda v: max(0, min(v, 30))})\n    \"\"\" Highest address rank to return.\n    \"\"\"\n\n    layers: DataLayer = DataLayer.ADDRESS | DataLayer.POI\n    \"\"\" Filter which kind of data to include.\n    \"\"\"\n\n\n@dataclasses.dataclass\nclass SearchDetails(LookupDetails):\n    \"\"\" Collection of parameters for the search call.\n    \"\"\"\n    max_results: int = 10\n    \"\"\" Maximum number of results to be returned. The actual number of results\n        may be less.\n    \"\"\"\n\n    min_rank: int = dataclasses.field(default=0,\n                                      metadata={'transform': lambda v: max(0, min(v, 30))})\n    \"\"\" Lowest address rank to return.\n    \"\"\"\n\n    max_rank: int = dataclasses.field(default=30,\n                                      metadata={'transform': lambda v: max(0, min(v, 30))})\n    \"\"\" Highest address rank to return.\n    \"\"\"\n\n    layers: Optional[DataLayer] = dataclasses.field(default=None,\n                                                    metadata={'transform': lambda r: r})\n    \"\"\" Filter which kind of data to include. When 'None' (the default) then\n        filtering by layers is disabled.\n    \"\"\"\n\n    countries: List[str] = dataclasses.field(default_factory=list,\n                                             metadata={'transform': format_country})\n    \"\"\" Restrict search results to the given countries. An empty list (the\n        default) will disable this filter.\n    \"\"\"\n\n    excluded: List[PlaceRef] = dataclasses.field(default_factory=list,\n                                                 metadata={'transform': format_excluded})\n    \"\"\" List of OSM objects to exclude from the results,\n        provided as either internal Place IDs or OSM IDs.\n    \"\"\"\n\n    viewbox: Optional[Bbox] = dataclasses.field(default=None,\n                                                metadata={'transform': Bbox.from_param})\n    \"\"\" Focus the search on a given map area.\n    \"\"\"\n\n    bounded_viewbox: bool = False\n    \"\"\" Use 'viewbox' as a filter and restrict results to places within the\n        given area.\n    \"\"\"\n\n    near: Optional[Point] = dataclasses.field(default=None,\n                                              metadata={'transform': Point.from_param})\n    \"\"\" Order results by distance to the given point.\n    \"\"\"\n\n    near_radius: Optional[float] = dataclasses.field(default=None,\n                                                     metadata={'transform': lambda r: r})\n    \"\"\" Use near point as a filter and drop results outside the given\n        radius. Radius is given in degrees WSG84.\n    \"\"\"\n\n    categories: List[Tuple[str, str]] = dataclasses.field(default_factory=list,\n                                                          metadata={'transform': format_categories})\n    \"\"\" Restrict search to places with one of the given class/type categories.\n        An empty list (the default) will disable this filter.\n    \"\"\"\n\n    viewbox_x2: Optional[Bbox] = None\n\n    locales: Optional['Locales'] = dataclasses.field(\n        default=None, metadata={'transform': lambda v: v})\n    \"\"\" Locale preferences of the caller.\n        Used during result re-ranking to prefer results that match the\n        caller's locale over results that only match in an alternate language.\n    \"\"\"\n\n    def __post_init__(self) -> None:\n        if self.viewbox is not None:\n            xext = (self.viewbox.maxlon - self.viewbox.minlon)/2\n            yext = (self.viewbox.maxlat - self.viewbox.minlat)/2\n            self.viewbox_x2 = Bbox(self.viewbox.minlon - xext, self.viewbox.minlat - yext,\n                                   self.viewbox.maxlon + xext, self.viewbox.maxlat + yext)\n\n    @property\n    def excluded_place_ids(self) -> List[int]:\n        \"\"\" Return excluded entries as a plain list of place ID integers.\n            Only includes PlaceID entries. Returns [0] if empty to\n            ensure SQL NOT IN clauses work correctly.\n        \"\"\"\n        return [e.place_id for e in self.excluded if isinstance(e, PlaceID)] or [0]\n\n    def restrict_min_max_rank(self, new_min: int, new_max: int) -> None:\n        \"\"\" Change the min_rank and max_rank fields to respect the\n            given boundaries.\n        \"\"\"\n        assert new_min <= new_max\n        self.min_rank = max(self.min_rank, new_min)\n        self.max_rank = min(self.max_rank, new_max)\n\n    def is_impossible(self) -> bool:\n        \"\"\" Check if the parameter configuration is contradictionary and\n            cannot yield any results.\n        \"\"\"\n        return (self.min_rank > self.max_rank\n                or (self.bounded_viewbox\n                    and self.viewbox is not None and self.near is not None\n                    and self.viewbox.contains(self.near))\n                or (self.layers is not None and not self.layers)\n                or (self.max_rank <= 4 and\n                    self.layers is not None and not self.layers & DataLayer.ADDRESS))\n\n    def layer_enabled(self, layer: DataLayer) -> bool:\n        \"\"\" Check if the given layer has been chosen. Also returns\n            true when layer restriction has been disabled completely.\n        \"\"\"\n        return self.layers is None or bool(self.layers & layer)\n\n\n@dataclasses.dataclass\nclass EntranceDetails:\n    \"\"\" Reference a place by its OSM ID and potentially the basic category.\n\n        The OSM ID may refer to places in the main table placex and OSM\n        interpolation lines.\n    \"\"\"\n    osm_id: int\n    \"\"\" The OSM ID of the object.\n    \"\"\"\n    type: str\n    \"\"\" The value of the OSM entrance tag (i.e. yes, main, secondary, etc.).\n    \"\"\"\n    location: Point\n    \"\"\" The location of the entrance node.\n    \"\"\"\n    extratags: Dict[str, str]\n    \"\"\" The other tags associated with the entrance node.\n    \"\"\"\n"
  },
  {
    "path": "src/nominatim_api/typing.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nType definitions for typing annotations.\n\nComplex type definitions are moved here, to keep the source files readable.\n\"\"\"\nfrom typing import Union, TYPE_CHECKING\n\n# flake8: noqa\n\n# SQLAlchemy introduced generic types in version 2.0 making typing\n# incompatible with older versions. Add wrappers here so we don't have\n# to litter the code with bare-string types.\n\nif TYPE_CHECKING:\n    from typing import Any\n    import sqlalchemy as sa\n    import os\n    from typing_extensions import (TypeAlias as TypeAlias,\n                                   Protocol as Protocol)\nelse:\n    TypeAlias = str\n    Protocol = object\n\nStrPath = Union[str, 'os.PathLike[str]']\n\nSaLambdaSelect: TypeAlias = 'Union[sa.Select[Any], sa.StatementLambdaElement]'\nSaSelect: TypeAlias = 'sa.Select[Any]'\nSaScalarSelect: TypeAlias = 'sa.ScalarSelect[Any]'\nSaRow: TypeAlias = 'sa.Row[Any]'\nSaColumn: TypeAlias = 'sa.ColumnElement[Any]'\nSaExpression: TypeAlias = 'sa.ColumnElement[bool]'\nSaLabel: TypeAlias = 'sa.Label[Any]'\nSaFromClause: TypeAlias = 'sa.FromClause'\nSaSelectable: TypeAlias = 'sa.Selectable'\nSaBind: TypeAlias = 'sa.BindParameter[Any]'\nSaDialect: TypeAlias = 'sa.Dialect'\n"
  },
  {
    "path": "src/nominatim_api/utils/__init__.py",
    "content": ""
  },
  {
    "path": "src/nominatim_api/utils/json_writer.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nStreaming JSON encoder.\n\"\"\"\nfrom typing import Any, TypeVar, Optional, Callable\nimport io\ntry:\n    import ujson as json\nexcept ModuleNotFoundError:\n    import json  # type: ignore[no-redef]\n\nT = TypeVar('T')\n\n\nclass JsonWriter:\n    \"\"\" JSON encoder that renders the output directly into an output\n        stream. This is a very simple writer which produces JSON in a\n        compact as possible form.\n\n        The writer does not check for syntactic correctness. It is the\n        responsibility of the caller to call the write functions in an\n        order that produces correct JSON.\n\n        All functions return the writer object itself so that function\n        calls can be chained.\n    \"\"\"\n\n    def __init__(self) -> None:\n        self.data = io.StringIO()\n        self.pending = ''\n\n    def __call__(self) -> str:\n        \"\"\" Return the rendered JSON content as a string.\n            The writer remains usable after calling this function.\n        \"\"\"\n        if self.pending:\n            assert self.pending in (']', '}')\n            self.data.write(self.pending)\n            self.pending = ''\n        return self.data.getvalue()\n\n    def start_object(self) -> 'JsonWriter':\n        \"\"\" Write the open bracket of a JSON object.\n        \"\"\"\n        if self.pending:\n            self.data.write(self.pending)\n        self.pending = '{'\n        return self\n\n    def end_object(self) -> 'JsonWriter':\n        \"\"\" Write the closing bracket of a JSON object.\n        \"\"\"\n        assert self.pending in (',', '{', '')\n        if self.pending == '{':\n            self.data.write(self.pending)\n        self.pending = '}'\n        return self\n\n    def start_array(self) -> 'JsonWriter':\n        \"\"\" Write the opening bracket of a JSON array.\n        \"\"\"\n        if self.pending:\n            self.data.write(self.pending)\n        self.pending = '['\n        return self\n\n    def end_array(self) -> 'JsonWriter':\n        \"\"\" Write the closing bracket of a JSON array.\n        \"\"\"\n        assert self.pending in (',', '[', ']', ')', '')\n        if self.pending not in (',', ''):\n            self.data.write(self.pending)\n        self.pending = ']'\n        return self\n\n    def key(self, name: str) -> 'JsonWriter':\n        \"\"\" Write the key string of a JSON object.\n        \"\"\"\n        assert self.pending\n        self.data.write(self.pending)\n        self.data.write(json.dumps(name, ensure_ascii=False))\n        self.pending = ':'\n        return self\n\n    def value(self, value: Any) -> 'JsonWriter':\n        \"\"\" Write out a value as JSON. The function uses the json.dumps()\n            function for encoding the JSON. Thus any value that can be\n            encoded by that function is permissible here.\n        \"\"\"\n        return self.raw(json.dumps(value, ensure_ascii=False))\n\n    def float(self, value: float, precision: int) -> 'JsonWriter':\n        \"\"\" Write out a float value with the given precision.\n        \"\"\"\n        return self.raw(f\"{value:0.{precision}f}\")\n\n    def next(self) -> 'JsonWriter':\n        \"\"\" Write out a delimiter comma between JSON object or array elements.\n        \"\"\"\n        if self.pending:\n            self.data.write(self.pending)\n        self.pending = ','\n        return self\n\n    def raw(self, raw_json: str) -> 'JsonWriter':\n        \"\"\" Write out the given value as is. This function is useful if\n            a value is already available in JSON format.\n        \"\"\"\n        if self.pending:\n            self.data.write(self.pending)\n            self.pending = ''\n        self.data.write(raw_json)\n        return self\n\n    def keyval(self, key: str, value: Any) -> 'JsonWriter':\n        \"\"\" Write out an object element with the given key and value.\n            This is a shortcut for calling 'key()', 'value()' and 'next()'.\n        \"\"\"\n        self.key(key)\n        self.value(value)\n        return self.next()\n\n    def keyval_not_none(self, key: str, value: Optional[T],\n                        transform: Optional[Callable[[T], Any]] = None) -> 'JsonWriter':\n        \"\"\" Write out an object element only if the value is not None.\n            If 'transform' is given, it must be a function that takes the\n            value type and returns a JSON encodable type. The transform\n            function will be called before the value is written out.\n        \"\"\"\n        if value is not None:\n            self.key(key)\n            self.value(transform(value) if transform else value)\n            self.next()\n        return self\n"
  },
  {
    "path": "src/nominatim_api/v1/__init__.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImplementation of API version v1 (aka the legacy version).\n\"\"\"\n\nfrom .server_glue import get_routes as get_routes\n"
  },
  {
    "path": "src/nominatim_api/v1/classtypes.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nHard-coded information about tag categories.\n\nThese tables have been copied verbatim from the old PHP code. For future\nversion a more flexible formatting is required.\n\"\"\"\nfrom typing import Tuple, Optional, Mapping, Union\n\nfrom ..results import ReverseResult, SearchResult\nfrom ..types import Bbox\n\n\ndef get_label_tag(category: Tuple[str, str], extratags: Optional[Mapping[str, str]],\n                  rank: int, country: Optional[str]) -> str:\n    \"\"\" Create a label tag for the given place that can be used as an XML name.\n    \"\"\"\n    if category in (('place', 'postcode'), ('boundary', 'postal_code')):\n        label = 'postcode'\n    elif rank < 26 and extratags and 'place' in extratags:\n        label = extratags['place']\n    elif rank < 26 and extratags and 'linked_place' in extratags:\n        label = extratags['linked_place']\n    elif category == ('boundary', 'administrative'):\n        label = ADMIN_LABELS.get((country or '', rank // 2))\\\n                or ADMIN_LABELS.get(('', rank // 2))\\\n                or 'Administrative'\n    elif rank < 26:\n        label = category[1] if category[1] != 'yes' else category[0]\n    elif rank < 28:\n        label = 'road'\n    elif (category[0] == 'place'\n          and category[1] in ('house_number', 'house_name', 'country_code')):\n        label = category[1]\n    else:\n        label = category[0]\n\n    return label.lower().replace(' ', '_')\n\n\ndef bbox_from_result(result: Union[ReverseResult, SearchResult]) -> Bbox:\n    \"\"\" Compute a bounding box for the result. For ways and relations\n        a given boundingbox is used. For all other object, a box is computed\n        around the centroid according to dimensions derived from the\n        search rank.\n    \"\"\"\n    if result.category == ('place', 'postcode') and result.bbox is None:\n        return Bbox.from_point(result.centroid,\n                               0.05 - 0.012 * (result.rank_search - 21))\n\n    if (result.osm_object and result.osm_object[0] == 'N') or result.bbox is None:\n\n        extent = NODE_EXTENT.get(result.category, 0.00005)\n        return Bbox.from_point(result.centroid, extent)\n\n    return result.bbox\n\n\nOSM_ATTRIBUTION = 'Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright'\n\n\nOSM_TYPE_NAME = {\n    'N': 'node',\n    'W': 'way',\n    'R': 'relation'\n}\n\n\nADMIN_LABELS = {\n  ('', 1): 'Continent',\n  ('', 2): 'Country',\n  ('', 3): 'Region',\n  ('', 4): 'State',\n  ('', 5): 'State District',\n  ('', 6): 'County',\n  ('', 7): 'Municipality',\n  ('', 8): 'City',\n  ('', 9): 'City District',\n  ('', 10): 'Suburb',\n  ('', 11): 'Neighbourhood',\n  ('', 12): 'City Block',\n  ('no', 3): 'State',\n  ('no', 4): 'County',\n  ('se', 3): 'State',\n  ('se', 4): 'County'\n}\n\n\nICONS = {\n    ('boundary', 'administrative'): 'poi_boundary_administrative',\n    ('place', 'city'): 'poi_place_city',\n    ('place', 'town'): 'poi_place_town',\n    ('place', 'village'): 'poi_place_village',\n    ('place', 'hamlet'): 'poi_place_village',\n    ('place', 'suburb'): 'poi_place_village',\n    ('place', 'locality'): 'poi_place_village',\n    ('place', 'airport'): 'transport_airport2',\n    ('aeroway', 'aerodrome'): 'transport_airport2',\n    ('railway', 'station'): 'transport_train_station2',\n    ('amenity', 'place_of_worship'): 'place_of_worship_unknown3',\n    ('amenity', 'pub'): 'food_pub',\n    ('amenity', 'bar'): 'food_bar',\n    ('amenity', 'university'): 'education_university',\n    ('tourism', 'museum'): 'tourist_museum',\n    ('amenity', 'arts_centre'): 'tourist_art_gallery2',\n    ('tourism', 'zoo'): 'tourist_zoo',\n    ('tourism', 'theme_park'): 'poi_point_of_interest',\n    ('tourism', 'attraction'): 'poi_point_of_interest',\n    ('leisure', 'golf_course'): 'sport_golf',\n    ('historic', 'castle'): 'tourist_castle',\n    ('amenity', 'hospital'): 'health_hospital',\n    ('amenity', 'school'): 'education_school',\n    ('amenity', 'theatre'): 'tourist_theatre',\n    ('amenity', 'library'): 'amenity_library',\n    ('amenity', 'fire_station'): 'amenity_firestation3',\n    ('amenity', 'police'): 'amenity_police2',\n    ('amenity', 'bank'): 'money_bank2',\n    ('amenity', 'post_office'): 'amenity_post_office',\n    ('tourism', 'hotel'): 'accommodation_hotel2',\n    ('amenity', 'cinema'): 'tourist_cinema',\n    ('tourism', 'artwork'): 'tourist_art_gallery2',\n    ('historic', 'archaeological_site'): 'tourist_archaeological2',\n    ('amenity', 'doctors'): 'health_doctors',\n    ('leisure', 'sports_centre'): 'sport_leisure_centre',\n    ('leisure', 'swimming_pool'): 'sport_swimming_outdoor',\n    ('shop', 'supermarket'): 'shopping_supermarket',\n    ('shop', 'convenience'): 'shopping_convenience',\n    ('amenity', 'restaurant'): 'food_restaurant',\n    ('amenity', 'fast_food'): 'food_fastfood',\n    ('amenity', 'cafe'): 'food_cafe',\n    ('tourism', 'guest_house'): 'accommodation_bed_and_breakfast',\n    ('amenity', 'pharmacy'): 'health_pharmacy_dispensing',\n    ('amenity', 'fuel'): 'transport_fuel',\n    ('natural', 'peak'): 'poi_peak',\n    ('natural', 'wood'): 'landuse_coniferous_and_deciduous',\n    ('shop', 'bicycle'): 'shopping_bicycle',\n    ('shop', 'clothes'): 'shopping_clothes',\n    ('shop', 'hairdresser'): 'shopping_hairdresser',\n    ('shop', 'doityourself'): 'shopping_diy',\n    ('shop', 'estate_agent'): 'shopping_estateagent2',\n    ('shop', 'car'): 'shopping_car',\n    ('shop', 'garden_centre'): 'shopping_garden_centre',\n    ('shop', 'car_repair'): 'shopping_car_repair',\n    ('shop', 'bakery'): 'shopping_bakery',\n    ('shop', 'butcher'): 'shopping_butcher',\n    ('shop', 'apparel'): 'shopping_clothes',\n    ('shop', 'laundry'): 'shopping_laundrette',\n    ('shop', 'beverages'): 'shopping_alcohol',\n    ('shop', 'alcohol'): 'shopping_alcohol',\n    ('shop', 'optician'): 'health_opticians',\n    ('shop', 'chemist'): 'health_pharmacy',\n    ('shop', 'gallery'): 'tourist_art_gallery2',\n    ('shop', 'jewelry'): 'shopping_jewelry',\n    ('tourism', 'information'): 'amenity_information',\n    ('historic', 'ruins'): 'tourist_ruin',\n    ('amenity', 'college'): 'education_school',\n    ('historic', 'monument'): 'tourist_monument',\n    ('historic', 'memorial'): 'tourist_monument',\n    ('historic', 'mine'): 'poi_mine',\n    ('tourism', 'caravan_site'): 'accommodation_caravan_park',\n    ('amenity', 'bus_station'): 'transport_bus_station',\n    ('amenity', 'atm'): 'money_atm2',\n    ('tourism', 'viewpoint'): 'tourist_view_point',\n    ('tourism', 'guesthouse'): 'accommodation_bed_and_breakfast',\n    ('railway', 'tram'): 'transport_tram_stop',\n    ('amenity', 'courthouse'): 'amenity_court',\n    ('amenity', 'recycling'): 'amenity_recycling',\n    ('amenity', 'dentist'): 'health_dentist',\n    ('natural', 'beach'): 'tourist_beach',\n    ('railway', 'tram_stop'): 'transport_tram_stop',\n    ('amenity', 'prison'): 'amenity_prison',\n    ('highway', 'bus_stop'): 'transport_bus_stop2'\n}\n\nNODE_EXTENT = {\n    ('place', 'continent'): 25,\n    ('place', 'country'): 7,\n    ('place', 'state'): 2.6,\n    ('place', 'province'): 2.6,\n    ('place', 'region'): 1.0,\n    ('place', 'county'): 0.7,\n    ('place', 'city'): 0.16,\n    ('place', 'municipality'): 0.16,\n    ('place', 'island'): 0.32,\n    ('place', 'postcode'): 0.16,\n    ('place', 'town'): 0.04,\n    ('place', 'village'): 0.02,\n    ('place', 'hamlet'): 0.02,\n    ('place', 'district'): 0.02,\n    ('place', 'borough'): 0.02,\n    ('place', 'suburb'): 0.02,\n    ('place', 'locality'): 0.01,\n    ('place', 'neighbourhood'): 0.01,\n    ('place', 'quarter'): 0.01,\n    ('place', 'city_block'): 0.01,\n    ('landuse', 'farm'): 0.01,\n    ('place', 'farm'): 0.01,\n    ('place', 'airport'): 0.015,\n    ('aeroway', 'aerodrome'): 0.015,\n    ('railway', 'station'): 0.005\n}\n"
  },
  {
    "path": "src/nominatim_api/v1/format.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nOutput formatters for API version v1.\n\"\"\"\nfrom typing import List, Dict, Mapping, Any\nimport collections\nimport datetime as dt\n\nfrom ..utils.json_writer import JsonWriter\nfrom ..status import StatusResult\nfrom ..results import DetailedResult, ReverseResults, SearchResults, \\\n                      AddressLines, AddressLine\nfrom ..localization import Locales\nfrom ..result_formatting import FormatDispatcher\nfrom .classtypes import ICONS\nfrom . import format_json, format_xml\nfrom .helpers import _add_admin_level\nfrom .. import logging as loglib\nfrom ..server import content_types as ct\n\n\nclass RawDataList(List[Dict[str, Any]]):\n    \"\"\" Data type for formatting raw data lists 'as is' in json.\n    \"\"\"\n\n\ndispatch = FormatDispatcher({'text': ct.CONTENT_TEXT,\n                             'xml': ct.CONTENT_XML,\n                             'debug': ct.CONTENT_HTML})\n\n\n@dispatch.error_format_func\ndef _format_error(content_type: str, msg: str, status: int) -> str:\n    if content_type == ct.CONTENT_XML:\n        return f\"\"\"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n                   <error>\n                     <code>{status}</code>\n                     <message>{msg}</message>\n                   </error>\n                \"\"\"\n\n    if content_type == ct.CONTENT_JSON:\n        return f\"\"\"{{\"error\":{{\"code\":{status},\"message\":\"{msg}\"}}}}\"\"\"\n\n    if content_type == ct.CONTENT_HTML:\n        loglib.log().section('Execution error')\n        loglib.log().var_dump('Status', status)\n        loglib.log().var_dump('Message', msg)\n        return loglib.get_and_disable()\n\n    return f\"ERROR {status}: {msg}\"\n\n\n@dispatch.format_func(StatusResult, 'text')\ndef _format_status_text(result: StatusResult, _: Mapping[str, Any]) -> str:\n    if result.status:\n        return f\"ERROR: {result.message}\"\n\n    return 'OK'\n\n\n@dispatch.format_func(StatusResult, 'json')\ndef _format_status_json(result: StatusResult, _: Mapping[str, Any]) -> str:\n    out = JsonWriter()\n\n    out.start_object()\\\n        .keyval('status', result.status)\\\n        .keyval('message', result.message)\\\n        .keyval_not_none('data_updated', result.data_updated,\n                         lambda v: v.isoformat())\\\n        .keyval('software_version', str(result.software_version))\\\n        .keyval_not_none('database_version', result.database_version, str)\\\n        .end_object()\n\n    return out()\n\n\ndef _add_address_row(writer: JsonWriter, row: AddressLine,\n                     locales: Locales) -> None:\n    writer.start_object()\\\n            .keyval('localname', locales.display_name(row.names))\\\n            .keyval_not_none('place_id', row.place_id)\n\n    if row.osm_object is not None:\n        writer.keyval('osm_id', row.osm_object[1])\\\n              .keyval('osm_type', row.osm_object[0])\n\n    if row.extratags:\n        writer.keyval_not_none('place_type', row.extratags.get('place_type'))\n\n    writer.keyval('class', row.category[0])\\\n          .keyval('type', row.category[1])\\\n          .keyval_not_none('admin_level', row.admin_level)\\\n          .keyval('rank_address', row.rank_address)\\\n          .keyval('distance', row.distance)\\\n          .keyval('isaddress', row.isaddress)\\\n        .end_object()\n\n\ndef _add_address_rows(writer: JsonWriter, section: str, rows: AddressLines,\n                      locales: Locales) -> None:\n    writer.key(section).start_array()\n    for row in rows:\n        _add_address_row(writer, row, locales)\n        writer.next()\n    writer.end_array().next()\n\n\ndef _add_parent_rows_grouped(writer: JsonWriter, rows: AddressLines,\n                             locales: Locales) -> None:\n    # group by category type\n    data = collections.defaultdict(list)\n    for row in rows:\n        sub = JsonWriter()\n        _add_address_row(sub, row, locales)\n        data[row.category[1]].append(sub())\n\n    writer.key('hierarchy').start_object()\n    for group, grouped in data.items():\n        writer.key(group).start_array()\n        grouped.sort()  # sorts alphabetically by local name\n        for line in grouped:\n            writer.raw(line).next()\n        writer.end_array().next()\n\n    writer.end_object().next()\n\n\n@dispatch.format_func(DetailedResult, 'json')\ndef _format_details_json(result: DetailedResult, options: Mapping[str, Any]) -> str:\n    locales = options.get('locales') or Locales()\n    geom = result.geometry.get('geojson')\n    centroid = result.centroid.to_geojson()\n\n    out = JsonWriter()\n    out.start_object()\\\n        .keyval_not_none('place_id', result.place_id)\\\n        .keyval_not_none('parent_place_id', result.parent_place_id)\n\n    if result.osm_object is not None:\n        out.keyval('osm_type', result.osm_object[0])\\\n           .keyval('osm_id', result.osm_object[1])\n\n    out.keyval('category', result.category[0])\\\n       .keyval('type', result.category[1])\\\n       .keyval('admin_level', result.admin_level)\\\n       .keyval('localname', result.locale_name or '')\\\n       .keyval('names', result.names or {})\\\n       .keyval('addresstags', result.address or {})\\\n       .keyval_not_none('housenumber', result.housenumber)\\\n       .keyval_not_none('calculated_postcode', result.postcode)\\\n       .keyval_not_none('country_code', result.country_code)\\\n       .keyval_not_none('indexed_date', result.indexed_date, lambda v: v.isoformat())\\\n       .keyval_not_none('importance', result.importance)\\\n       .keyval('calculated_importance', result.calculated_importance())\\\n       .keyval('extratags', _add_admin_level(result) or {})\\\n       .keyval_not_none('calculated_wikipedia', result.wikipedia)\\\n       .keyval('rank_address', result.rank_address)\\\n       .keyval('rank_search', result.rank_search)\\\n       .keyval('isarea', 'Polygon' in (geom or result.geometry.get('type') or ''))\\\n       .key('centroid').raw(centroid).next()\\\n       .key('geometry').raw(geom or centroid).next()\n\n    if options.get('icon_base_url', None):\n        icon = ICONS.get(result.category)\n        if icon:\n            out.keyval('icon', f\"{options['icon_base_url']}/{icon}.p.20.png\")\n\n    if result.address_rows is not None:\n        _add_address_rows(out, 'address', result.address_rows, locales)\n\n    if result.linked_rows:\n        _add_address_rows(out, 'linked_places', result.linked_rows, locales)\n\n    if result.name_keywords is not None or result.address_keywords is not None:\n        out.key('keywords').start_object()\n\n        for sec, klist in (('name', result.name_keywords), ('address', result.address_keywords)):\n            out.key(sec).start_array()\n            for word in (klist or []):\n                out.start_object()\\\n                     .keyval('id', word.word_id)\\\n                     .keyval('token', word.word_token)\\\n                   .end_object().next()\n            out.end_array().next()\n\n        out.end_object().next()\n\n    if result.parented_rows is not None:\n        if options.get('group_hierarchy', False):\n            _add_parent_rows_grouped(out, result.parented_rows, locales)\n        else:\n            _add_address_rows(out, 'hierarchy', result.parented_rows, locales)\n\n    if options.get('entrances', False):\n        format_json.write_entrances(out, result.entrances)\n\n    out.end_object()\n\n    return out()\n\n\n@dispatch.format_func(ReverseResults, 'xml')\ndef _format_reverse_xml(results: ReverseResults, options: Mapping[str, Any]) -> str:\n    return format_xml.format_base_xml(results,\n                                      options, True, 'reversegeocode',\n                                      {'querystring': options.get('query', '')})\n\n\n@dispatch.format_func(ReverseResults, 'geojson')\ndef _format_reverse_geojson(results: ReverseResults,\n                            options: Mapping[str, Any]) -> str:\n    return format_json.format_base_geojson(results, options, True)\n\n\n@dispatch.format_func(ReverseResults, 'geocodejson')\ndef _format_reverse_geocodejson(results: ReverseResults,\n                                options: Mapping[str, Any]) -> str:\n    return format_json.format_base_geocodejson(results, options, True)\n\n\n@dispatch.format_func(ReverseResults, 'json')\ndef _format_reverse_json(results: ReverseResults,\n                         options: Mapping[str, Any]) -> str:\n    return format_json.format_base_json(results, options, True,\n                                        class_label='class')\n\n\n@dispatch.format_func(ReverseResults, 'jsonv2')\ndef _format_reverse_jsonv2(results: ReverseResults,\n                           options: Mapping[str, Any]) -> str:\n    return format_json.format_base_json(results, options, True,\n                                        class_label='category')\n\n\n@dispatch.format_func(SearchResults, 'xml')\ndef _format_search_xml(results: SearchResults, options: Mapping[str, Any]) -> str:\n    extra = {'querystring': options.get('query', '')}\n    for attr in ('more_url', 'exclude_place_ids', 'viewbox'):\n        if options.get(attr):\n            extra[attr] = options[attr]\n    return format_xml.format_base_xml(results, options, False, 'searchresults',\n                                      extra)\n\n\n@dispatch.format_func(SearchResults, 'geojson')\ndef _format_search_geojson(results: SearchResults,\n                           options: Mapping[str, Any]) -> str:\n    return format_json.format_base_geojson(results, options, False)\n\n\n@dispatch.format_func(SearchResults, 'geocodejson')\ndef _format_search_geocodejson(results: SearchResults,\n                               options: Mapping[str, Any]) -> str:\n    return format_json.format_base_geocodejson(results, options, False)\n\n\n@dispatch.format_func(SearchResults, 'json')\ndef _format_search_json(results: SearchResults,\n                        options: Mapping[str, Any]) -> str:\n    return format_json.format_base_json(results, options, False,\n                                        class_label='class')\n\n\n@dispatch.format_func(SearchResults, 'jsonv2')\ndef _format_search_jsonv2(results: SearchResults,\n                          options: Mapping[str, Any]) -> str:\n    return format_json.format_base_json(results, options, False,\n                                        class_label='category')\n\n\n@dispatch.format_func(RawDataList, 'json')\ndef _format_raw_data_json(results: RawDataList,  _: Mapping[str, Any]) -> str:\n    out = JsonWriter()\n    out.start_array()\n    for res in results:\n        out.start_object()\n        for k, v in res.items():\n            if isinstance(v, dt.datetime):\n                out.keyval(k, v.isoformat(sep=' ', timespec='seconds'))\n            else:\n                out.keyval(k, v)\n        out.end_object().next()\n\n    out.end_array()\n\n    return out()\n"
  },
  {
    "path": "src/nominatim_api/v1/format_json.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nHelper functions for output of results in json formats.\n\"\"\"\nfrom typing import Mapping, Any, Optional, Tuple, Union, List\n\nfrom ..utils.json_writer import JsonWriter\nfrom ..results import AddressLines, ReverseResults, SearchResults\nfrom . import classtypes as cl\nfrom .helpers import _add_admin_level\nfrom ..types import EntranceDetails\n\n\ndef _write_osm_id(out: JsonWriter, osm_object: Optional[Tuple[str, int]]) -> None:\n    if osm_object is not None:\n        out.keyval_not_none('osm_type', cl.OSM_TYPE_NAME.get(osm_object[0], None))\\\n           .keyval('osm_id', osm_object[1])\n\n\ndef _write_typed_address(out: JsonWriter, address: Optional[AddressLines],\n                         country_code: Optional[str]) -> None:\n    parts = {}\n    for line in (address or []):\n        if line.isaddress:\n            if line.local_name:\n                label = cl.get_label_tag(line.category, line.extratags,\n                                         line.rank_address, country_code)\n                if label not in parts:\n                    parts[label] = line.local_name\n            if line.names and 'ISO3166-2' in line.names and line.admin_level:\n                parts[f\"ISO3166-2-lvl{line.admin_level}\"] = line.names['ISO3166-2']\n\n    for k, v in parts.items():\n        out.keyval(k, v)\n\n    if country_code:\n        out.keyval('country_code', country_code)\n\n\ndef _write_geocodejson_address(out: JsonWriter,\n                               address: Optional[AddressLines],\n                               obj_place_id: Optional[int],\n                               country_code: Optional[str]) -> None:\n    extra = {}\n    for line in (address or []):\n        if line.isaddress and line.local_name:\n            if line.category[1] in ('postcode', 'postal_code'):\n                out.keyval('postcode', line.local_name)\n            elif line.category[1] == 'house_number':\n                out.keyval('housenumber', line.local_name)\n            elif ((obj_place_id is None or obj_place_id != line.place_id)\n                  and line.rank_address >= 4 and line.rank_address < 28):\n                rank_name = GEOCODEJSON_RANKS[line.rank_address]\n                if rank_name not in extra:\n                    extra[rank_name] = line.local_name\n\n    for k, v in extra.items():\n        out.keyval(k, v)\n\n    if country_code:\n        out.keyval('country_code', country_code)\n\n\ndef write_entrances(out: JsonWriter, entrances: Optional[List[EntranceDetails]]) -> None:\n    if entrances is None:\n        out.keyval('entrances', None)\n        return\n\n    out.key('entrances')\\\n       .start_array()\n\n    for entrance in entrances:\n        out.start_object()\\\n           .keyval('osm_id', entrance.osm_id)\\\n           .keyval('type', entrance.type)\\\n           .keyval('lat', f\"{entrance.location.lat:0.7f}\")\\\n           .keyval('lon', f\"{entrance.location.lon:0.7f}\")\n\n        if entrance.extratags:\n            out.keyval('extratags', entrance.extratags)\n        out.end_object().next()\n\n    out.end_array().next()\n\n\ndef format_base_json(results: Union[ReverseResults, SearchResults],\n                     options: Mapping[str, Any], simple: bool,\n                     class_label: str) -> str:\n    \"\"\" Return the result list as a simple json string in custom Nominatim format.\n    \"\"\"\n    out = JsonWriter()\n\n    if simple:\n        if not results:\n            return '{\"error\":\"Unable to geocode\"}'\n    else:\n        out.start_array()\n\n    for result in results:\n        out.start_object()\\\n             .keyval_not_none('place_id', result.place_id)\\\n             .keyval('licence', cl.OSM_ATTRIBUTION)\\\n\n        _write_osm_id(out, result.osm_object)\n\n        # lat and lon must be string values\n        out.keyval('lat', f\"{result.centroid.lat:0.7f}\")\\\n           .keyval('lon', f\"{result.centroid.lon:0.7f}\")\\\n           .keyval(class_label, result.category[0])\\\n           .keyval('type', result.category[1])\\\n           .keyval('place_rank', result.rank_search)\\\n           .keyval('importance', result.calculated_importance())\\\n           .keyval('addresstype', cl.get_label_tag(result.category, result.extratags,\n                                                   result.rank_address,\n                                                   result.country_code))\\\n           .keyval('name', result.locale_name or '')\\\n           .keyval('display_name', result.display_name or '')\n\n        if options.get('icon_base_url', None):\n            icon = cl.ICONS.get(result.category)\n            if icon:\n                out.keyval('icon', f\"{options['icon_base_url']}/{icon}.p.20.png\")\n\n        if options.get('addressdetails', False):\n            out.key('address').start_object()\n            _write_typed_address(out, result.address_rows, result.country_code)\n            out.end_object().next()\n\n        if options.get('entrances', False):\n            write_entrances(out, result.entrances)\n\n        if options.get('extratags', False):\n            out.keyval('extratags', _add_admin_level(result))\n\n        if options.get('namedetails', False):\n            out.keyval('namedetails', result.names)\n\n        # must be string values\n        bbox = cl.bbox_from_result(result)\n        out.key('boundingbox').start_array()\\\n           .value(f\"{bbox.minlat:0.7f}\").next()\\\n           .value(f\"{bbox.maxlat:0.7f}\").next()\\\n           .value(f\"{bbox.minlon:0.7f}\").next()\\\n           .value(f\"{bbox.maxlon:0.7f}\").next()\\\n           .end_array().next()\n\n        if result.geometry:\n            for key in ('text', 'kml'):\n                out.keyval_not_none('geo' + key, result.geometry.get(key))\n            if 'geojson' in result.geometry:\n                out.key('geojson').raw(result.geometry['geojson']).next()\n            out.keyval_not_none('svg', result.geometry.get('svg'))\n\n        out.end_object()\n\n        if simple:\n            return out()\n\n        out.next()\n\n    out.end_array()\n\n    return out()\n\n\ndef format_base_geojson(results: Union[ReverseResults, SearchResults],\n                        options: Mapping[str, Any],\n                        simple: bool) -> str:\n    \"\"\" Return the result list as a geojson string.\n    \"\"\"\n    if not results and simple:\n        return '{\"error\":\"Unable to geocode\"}'\n\n    out = JsonWriter()\n\n    out.start_object()\\\n       .keyval('type', 'FeatureCollection')\\\n       .keyval('licence', cl.OSM_ATTRIBUTION)\\\n       .key('features').start_array()\n\n    for result in results:\n        out.start_object()\\\n             .keyval('type', 'Feature')\\\n             .key('properties').start_object()\n\n        out.keyval_not_none('place_id', result.place_id)\n\n        _write_osm_id(out, result.osm_object)\n\n        out.keyval('place_rank', result.rank_search)\\\n           .keyval('category', result.category[0])\\\n           .keyval('type', result.category[1])\\\n           .keyval('importance', result.calculated_importance())\\\n           .keyval('addresstype', cl.get_label_tag(result.category, result.extratags,\n                                                   result.rank_address,\n                                                   result.country_code))\\\n           .keyval('name', result.locale_name or '')\\\n           .keyval('display_name', result.display_name or '')\n\n        if options.get('addressdetails', False):\n            out.key('address').start_object()\n            _write_typed_address(out, result.address_rows, result.country_code)\n            out.end_object().next()\n\n        if options.get('entrances', False):\n            write_entrances(out, result.entrances)\n\n        if options.get('extratags', False):\n            out.keyval('extratags', _add_admin_level(result))\n\n        if options.get('namedetails', False):\n            out.keyval('namedetails', result.names)\n\n        out.end_object().next()  # properties\n\n        out.key('bbox').start_array()\n        for coord in cl.bbox_from_result(result).coords:\n            out.float(coord, 7).next()\n        out.end_array().next()\n\n        out.key('geometry').raw(result.geometry.get('geojson')\n                                or result.centroid.to_geojson()).next()\n\n        out.end_object().next()\n\n    out.end_array().next().end_object()\n\n    return out()\n\n\ndef format_base_geocodejson(results: Union[ReverseResults, SearchResults],\n                            options: Mapping[str, Any], simple: bool) -> str:\n    \"\"\" Return the result list as a geocodejson string.\n    \"\"\"\n    if not results and simple:\n        return '{\"error\":\"Unable to geocode\"}'\n\n    out = JsonWriter()\n\n    out.start_object()\\\n       .keyval('type', 'FeatureCollection')\\\n       .key('geocoding').start_object()\\\n                        .keyval('version', '0.1.0')\\\n                        .keyval('attribution', cl.OSM_ATTRIBUTION)\\\n                        .keyval('licence', 'ODbL')\\\n                        .keyval_not_none('query', options.get('query'))\\\n                        .end_object().next()\\\n       .key('features').start_array()\n\n    for result in results:\n        out.start_object()\\\n             .keyval('type', 'Feature')\\\n             .key('properties').start_object()\\\n                               .key('geocoding').start_object()\n\n        out.keyval_not_none('place_id', result.place_id)\n\n        _write_osm_id(out, result.osm_object)\n\n        out.keyval('osm_key', result.category[0])\\\n           .keyval('osm_value', result.category[1])\\\n           .keyval('type', GEOCODEJSON_RANKS[max(3, min(28, result.rank_address))])\\\n           .keyval_not_none('accuracy', getattr(result, 'distance', None), transform=int)\\\n           .keyval('label', result.display_name or '')\\\n           .keyval_not_none('name', result.locale_name or None)\\\n\n        if options.get('addressdetails', False):\n            _write_geocodejson_address(out, result.address_rows, result.place_id,\n                                       result.country_code)\n\n            out.key('admin').start_object()\n            if result.address_rows:\n                for line in result.address_rows:\n                    if line.isaddress and (line.admin_level or 15) < 15 and line.local_name \\\n                       and line.category[0] == 'boundary' and line.category[1] == 'administrative':\n                        out.keyval(f\"level{line.admin_level}\", line.local_name)\n            out.end_object().next()\n\n        if options.get('entrances', False):\n            write_entrances(out, result.entrances)\n\n        if options.get('extratags', False):\n            out.keyval('extra', _add_admin_level(result))\n\n        out.end_object().next().end_object().next()\n\n        out.key('geometry').raw(result.geometry.get('geojson')\n                                or result.centroid.to_geojson()).next()\n\n        out.end_object().next()\n\n    out.end_array().next().end_object()\n\n    return out()\n\n\nGEOCODEJSON_RANKS = {\n    3: 'locality',\n    4: 'country',\n    5: 'state', 6: 'state', 7: 'state', 8: 'state', 9: 'state',\n    10: 'county', 11: 'county', 12: 'county',\n    13: 'city', 14: 'city', 15: 'city', 16: 'city',\n    17: 'district', 18: 'district', 19: 'district', 20: 'district', 21: 'district',\n    22: 'locality', 23: 'locality', 24: 'locality',\n    25: 'street', 26: 'street', 27: 'street', 28: 'house'}\n"
  },
  {
    "path": "src/nominatim_api/v1/format_xml.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nHelper functions for output of results in XML format.\n\"\"\"\nfrom typing import Mapping, Any, Optional, Union\nimport datetime as dt\nimport xml.etree.ElementTree as ET\n\nfrom ..results import AddressLines, ReverseResult, ReverseResults, \\\n                      SearchResult, SearchResults\nfrom . import classtypes as cl\nfrom .helpers import _add_admin_level\nfrom ..types import EntranceDetails\n\n\ndef _write_xml_address(root: ET.Element, address: AddressLines,\n                       country_code: Optional[str]) -> None:\n    parts = {}\n    for line in address:\n        if line.isaddress:\n            if line.local_name:\n                label = cl.get_label_tag(line.category, line.extratags,\n                                         line.rank_address, country_code)\n                if label not in parts:\n                    parts[label] = line.local_name\n            if line.names and 'ISO3166-2' in line.names and line.admin_level:\n                parts[f\"ISO3166-2-lvl{line.admin_level}\"] = line.names['ISO3166-2']\n\n    for k, v in parts.items():\n        ET.SubElement(root, k).text = v\n\n    if country_code:\n        ET.SubElement(root, 'country_code').text = country_code\n\n\ndef _create_base_entry(result: Union[ReverseResult, SearchResult],\n                       root: ET.Element, simple: bool) -> ET.Element:\n    place = ET.SubElement(root, 'result' if simple else 'place')\n    if result.place_id is not None:\n        place.set('place_id', str(result.place_id))\n    if result.osm_object:\n        osm_type = cl.OSM_TYPE_NAME.get(result.osm_object[0], None)\n        if osm_type is not None:\n            place.set('osm_type', osm_type)\n        place.set('osm_id', str(result.osm_object[1]))\n    if result.names and 'ref' in result.names:\n        place.set('ref', result.names['ref'])\n    elif result.locale_name:\n        # bug reproduced from PHP\n        place.set('ref', result.locale_name)\n    place.set('lat', f\"{result.centroid.lat:.7f}\")\n    place.set('lon', f\"{result.centroid.lon:.7f}\")\n\n    bbox = cl.bbox_from_result(result)\n    place.set('boundingbox',\n              f\"{bbox.minlat:.7f},{bbox.maxlat:.7f},{bbox.minlon:.7f},{bbox.maxlon:.7f}\")\n\n    place.set('place_rank', str(result.rank_search))\n    place.set('address_rank', str(result.rank_address))\n\n    if result.geometry:\n        for key in ('text', 'svg'):\n            if key in result.geometry:\n                place.set('geo' + key, result.geometry[key])\n        if 'kml' in result.geometry:\n            ET.SubElement(root if simple else place, 'geokml')\\\n              .append(ET.fromstring(result.geometry['kml']))\n        if 'geojson' in result.geometry:\n            place.set('geojson', result.geometry['geojson'])\n\n    if simple:\n        place.text = result.display_name or ''\n    else:\n        place.set('display_name', result.display_name or '')\n        place.set('class', result.category[0])\n        place.set('type', result.category[1])\n        place.set('importance', str(result.calculated_importance()))\n\n    return place\n\n\ndef _create_entrance(root: ET.Element, entrance: EntranceDetails) -> None:\n    entrance_node = ET.SubElement(root, 'entrance', attrib={\n        \"osm_id\": str(entrance.osm_id),\n        \"type\": entrance.type,\n        \"lat\": f\"{entrance.location.lat:0.7f}\",\n        \"lon\": f\"{entrance.location.lon:0.7f}\",\n        })\n    if entrance.extratags:\n        for k, v in entrance.extratags.items():\n            ET.SubElement(entrance_node, 'tag', attrib={'key': k, 'value': v})\n\n\ndef format_base_xml(results: Union[ReverseResults, SearchResults],\n                    options: Mapping[str, Any],\n                    simple: bool, xml_root_tag: str,\n                    xml_extra_info: Mapping[str, str]) -> str:\n    \"\"\" Format the result into an XML response. With 'simple' exactly one\n        result will be output, otherwise a list.\n    \"\"\"\n    root = ET.Element(xml_root_tag)\n    root.set('timestamp', dt.datetime.now(dt.timezone.utc).strftime('%a, %d %b %Y %H:%M:%S +00:00'))\n    root.set('attribution', cl.OSM_ATTRIBUTION)\n    for k, v in xml_extra_info.items():\n        root.set(k, v)\n\n    if simple and not results:\n        ET.SubElement(root, 'error').text = 'Unable to geocode'\n\n    for result in results:\n        place = _create_base_entry(result, root, simple)\n\n        if not simple and options.get('icon_base_url', None):\n            icon = cl.ICONS.get(result.category)\n            if icon:\n                place.set('icon', icon)\n\n        if options.get('addressdetails', False) and result.address_rows:\n            _write_xml_address(ET.SubElement(root, 'addressparts') if simple else place,\n                               result.address_rows, result.country_code)\n\n        if options.get('extratags', False):\n            eroot = ET.SubElement(root if simple else place, 'extratags')\n            tags = _add_admin_level(result)\n            if tags:\n                for k, v in tags.items():\n                    ET.SubElement(eroot, 'tag', attrib={'key': k, 'value': v})\n\n        if options.get('namedetails', False):\n            eroot = ET.SubElement(root if simple else place, 'namedetails')\n            if result.names:\n                for k, v in result.names.items():\n                    ET.SubElement(eroot, 'name', attrib={'desc': k}).text = v\n\n        if options.get('entrances', False):\n            eroot = ET.SubElement(root if simple else place, 'entrances')\n            if result.entrances:\n                for entrance in result.entrances:\n                    _create_entrance(eroot, entrance)\n\n    return '<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\\n' + ET.tostring(root, encoding='unicode')\n"
  },
  {
    "path": "src/nominatim_api/v1/helpers.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nHelper function for parsing parameters and and outputting data\nspecifically for the v1 version of the API.\n\"\"\"\nfrom typing import Tuple, Optional, Any, Dict, Iterable\nfrom itertools import chain\nimport re\n\nfrom ..results import SearchResults, SourceTable, BaseResult\nfrom ..types import SearchDetails, GeometryFormat\n\n\ndef _add_admin_level(result: BaseResult) -> Optional[Dict[str, str]]:\n    \"\"\" Inject admin_level into extratags for boundary=administrative results.\n    \"\"\"\n    tags = result.extratags\n    if result.category == ('boundary', 'administrative') and result.admin_level < 15:\n        tags = dict(tags) if tags else {}\n        tags['admin_level'] = str(result.admin_level)\n    return tags\n\n\nREVERSE_MAX_RANKS = [2, 2, 2,   # 0-2   Continent/Sea\n                     4, 4,      # 3-4   Country\n                     8,         # 5     State\n                     10, 10,    # 6-7   Region\n                     12, 12,    # 8-9   County\n                     16, 17,    # 10-11 City\n                     18,        # 12    Town\n                     19,        # 13    Village/Suburb\n                     22,        # 14    Hamlet/Neighbourhood\n                     25,        # 15    Localities\n                     26,        # 16    Major Streets\n                     27,        # 17    Minor Streets\n                     30         # 18    Building\n                     ]\n\n\ndef zoom_to_rank(zoom: int) -> int:\n    \"\"\" Convert a zoom parameter into a rank according to the v1 API spec.\n    \"\"\"\n    return REVERSE_MAX_RANKS[max(0, min(18, zoom))]\n\n\nFEATURE_TYPE_TO_RANK: Dict[Optional[str], Tuple[int, int]] = {\n    'country': (4, 4),\n    'state': (8, 8),\n    'city': (14, 16),\n    'settlement': (8, 20)\n}\n\n\ndef feature_type_to_rank(feature_type: Optional[str]) -> Tuple[int, int]:\n    \"\"\" Convert a feature type parameter to a tuple of\n        feature type name, minimum rank and maximum rank.\n    \"\"\"\n    return FEATURE_TYPE_TO_RANK.get(feature_type, (0, 30))\n\n\ndef extend_query_parts(queryparts: Dict[str, Any], details: Dict[str, Any],\n                       feature_type: Optional[str],\n                       namedetails: bool, extratags: bool,\n                       excluded: Iterable[str]) -> None:\n    \"\"\" Add parameters from details dictionary to the query parts\n        dictionary which is suitable as URL parameter dictionary.\n    \"\"\"\n    parsed = SearchDetails.from_kwargs(details)\n    if parsed.geometry_output != GeometryFormat.NONE:\n        if GeometryFormat.GEOJSON & parsed.geometry_output:\n            queryparts['polygon_geojson'] = '1'\n        if GeometryFormat.KML & parsed.geometry_output:\n            queryparts['polygon_kml'] = '1'\n        if GeometryFormat.SVG & parsed.geometry_output:\n            queryparts['polygon_svg'] = '1'\n        if GeometryFormat.TEXT & parsed.geometry_output:\n            queryparts['polygon_text'] = '1'\n    if parsed.address_details:\n        queryparts['addressdetails'] = '1'\n    if parsed.entrances:\n        queryparts['entrances'] = '1'\n    if namedetails:\n        queryparts['namedetails'] = '1'\n    if extratags:\n        queryparts['extratags'] = '1'\n    if parsed.geometry_simplification > 0.0:\n        queryparts['polygon_threshold'] = f\"{parsed.geometry_simplification:.6g}\"\n    if parsed.max_results != 10:\n        queryparts['limit'] = str(parsed.max_results)\n    if parsed.countries:\n        queryparts['countrycodes'] = ','.join(parsed.countries)\n    queryparts['exclude_place_ids'] = \\\n        ','.join(chain(excluded,\n                       (str(e) for e in parsed.excluded)))\n    if parsed.viewbox:\n        queryparts['viewbox'] = ','.join(f\"{c:.7g}\" for c in parsed.viewbox.coords)\n    if parsed.bounded_viewbox:\n        queryparts['bounded'] = '1'\n    if not details['dedupe']:\n        queryparts['dedupe'] = '0'\n    if feature_type in FEATURE_TYPE_TO_RANK:\n        queryparts['featureType'] = feature_type\n\n\ndef deduplicate_results(results: SearchResults, max_results: int) -> SearchResults:\n    \"\"\" Remove results that look like duplicates.\n\n        Two results are considered the same if they have the same OSM ID\n        or if they have the same category, display name and rank.\n    \"\"\"\n    osm_ids_done = set()\n    classification_done = set()\n    deduped = SearchResults()\n    for result in results:\n        if result.source_table == SourceTable.PLACEX:\n            classification = (result.osm_object[0] if result.osm_object else None,\n                              result.category,\n                              result.display_name,\n                              result.rank_address)\n            if result.osm_object not in osm_ids_done \\\n               and classification not in classification_done:\n                deduped.append(result)\n            osm_ids_done.add(result.osm_object)\n            classification_done.add(classification)\n        else:\n            deduped.append(result)\n        if len(deduped) >= max_results:\n            break\n\n    return deduped\n\n\ndef _deg(axis: str) -> str:\n    return f\"(?P<{axis}_deg>\\\\d+\\\\.\\\\d+)°?\"\n\n\ndef _deg_min(axis: str) -> str:\n    return f\"(?P<{axis}_deg>\\\\d+)[°\\\\s]+(?P<{axis}_min>[\\\\d.]+)[′']*\"\n\n\ndef _deg_min_sec(axis: str) -> str:\n    return f\"(?P<{axis}_deg>\\\\d+)[°\\\\s]+(?P<{axis}_min>\\\\d+)[′'\\\\s]+(?P<{axis}_sec>[\\\\d.]+)[\\\"″]*\"\n\n\nCOORD_REGEX = [re.compile(r'(?:(?P<pre>.*?)\\s+)??' + r + r'(?:\\s+(?P<post>.*))?') for r in (\n    r\"(?P<ns>[NS])\\s*\" + _deg('lat') + r\"[\\s,]+\" + r\"(?P<ew>[EW])\\s*\" + _deg('lon'),\n    _deg('lat') + r\"\\s*(?P<ns>[NS])[\\s,]+\" + _deg('lon') + r\"\\s*(?P<ew>[EW])\",\n    r\"(?P<ns>[NS])\\s*\" + _deg_min('lat') + r\"[\\s,]+\" + r\"(?P<ew>[EW])\\s*\" + _deg_min('lon'),\n    _deg_min('lat') + r\"\\s*(?P<ns>[NS])[\\s,]+\" + _deg_min('lon') + r\"\\s*(?P<ew>[EW])\",\n    r\"(?P<ns>[NS])\\s*\" + _deg_min_sec('lat') + r\"[\\s,]+\" + r\"(?P<ew>[EW])\\s*\" + _deg_min_sec('lon'),\n    _deg_min_sec('lat') + r\"\\s*(?P<ns>[NS])[\\s,]+\" + _deg_min_sec('lon') + r\"\\s*(?P<ew>[EW])\",\n    r\"\\[?(?P<lat_deg>[+-]?\\d+\\.\\d+)[\\s,]+(?P<lon_deg>[+-]?\\d+\\.\\d+)\\]?\"\n)]\n\n\ndef extract_coords_from_query(query: str) -> Tuple[str, Optional[float], Optional[float]]:\n    \"\"\" Look for something that is formatted like a coordinate at the\n        beginning or end of the query. If found, extract the coordinate and\n        return the remaining query (or the empty string if the query\n        consisted of nothing but a coordinate).\n\n        Only the first match will be returned.\n    \"\"\"\n    for regex in COORD_REGEX:\n        match = regex.fullmatch(query)\n        if match is None:\n            continue\n        groups = match.groupdict()\n        if not groups['pre'] or not groups['post']:\n            x = float(groups['lon_deg']) \\\n                + float(groups.get('lon_min', 0.0)) / 60.0 \\\n                + float(groups.get('lon_sec', 0.0)) / 3600.0\n            if groups.get('ew') == 'W':\n                x = -x\n            y = float(groups['lat_deg']) \\\n                + float(groups.get('lat_min', 0.0)) / 60.0 \\\n                + float(groups.get('lat_sec', 0.0)) / 3600.0\n            if groups.get('ns') == 'S':\n                y = -y\n            return groups['pre'] or groups['post'] or '', x, y\n\n    return query, None, None\n\n\nCATEGORY_REGEX = re.compile(r'(?P<pre>.*?)\\[(?P<cls>[a-zA-Z_]+)=(?P<typ>[a-zA-Z_]+)\\](?P<post>.*)')\n\n\ndef extract_category_from_query(query: str) -> Tuple[str, Optional[str], Optional[str]]:\n    \"\"\" Extract a hidden category specification of the form '[key=value]' from\n        the query. If found, extract key and value  and\n        return the remaining query (or the empty string if the query\n        consisted of nothing but a category).\n\n        Only the first match will be returned.\n    \"\"\"\n    match = CATEGORY_REGEX.search(query)\n    if match is not None:\n        return (match.group('pre').strip() + ' ' + match.group('post').strip()).strip(), \\\n               match.group('cls'), match.group('typ')\n\n    return query, None, None\n"
  },
  {
    "path": "src/nominatim_api/v1/server_glue.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nGeneric part of the server implementation of the v1 API.\nCombine with the scaffolding provided for the various Python ASGI frameworks.\n\"\"\"\nfrom typing import Optional, Any, Type, Dict, cast, Sequence, Tuple\nfrom functools import reduce\nimport dataclasses\nfrom urllib.parse import urlencode\nimport asyncio\n\nimport sqlalchemy as sa\n\nfrom ..errors import UsageError\nfrom .. import logging as loglib\nfrom ..core import NominatimAPIAsync\nfrom .format import RawDataList\nfrom ..types import DataLayer, GeometryFormat, PlaceRef, PlaceID, OsmID, Point\nfrom ..status import StatusResult\nfrom ..results import DetailedResult, ReverseResults, SearchResult, SearchResults\nfrom ..localization import Locales\nfrom . import helpers\nfrom ..server import content_types as ct\nfrom ..server.asgi_adaptor import ASGIAdaptor, EndpointFunc\nfrom ..sql.async_core_library import PGCORE_ERROR\n\n\ndef build_response(adaptor: ASGIAdaptor, output: str, status: int = 200,\n                   num_results: int = 0) -> Any:\n    \"\"\" Create a response from the given output. Wraps a JSONP function\n        around the response, if necessary.\n    \"\"\"\n    if adaptor.content_type == ct.CONTENT_JSON and status == 200:\n        jsonp = adaptor.get('json_callback')\n        if jsonp is not None:\n            if any(not part.isidentifier() for part in jsonp.split('.')):\n                adaptor.raise_error('Invalid json_callback value')\n            output = f\"{jsonp}({output})\"\n            adaptor.content_type = 'application/javascript; charset=utf-8'\n\n    return adaptor.create_response(status, output, num_results)\n\n\ndef get_accepted_languages(adaptor: ASGIAdaptor) -> str:\n    \"\"\" Return the accepted languages.\n    \"\"\"\n    return adaptor.get('accept-language')\\\n        or adaptor.get_header('accept-language')\\\n        or adaptor.config().DEFAULT_LANGUAGE\n\n\ndef setup_debugging(adaptor: ASGIAdaptor) -> bool:\n    \"\"\" Set up collection of debug information if requested.\n\n        Return True when debugging was requested.\n    \"\"\"\n    if adaptor.get_bool('debug', False):\n        loglib.set_log_output('html')\n        adaptor.content_type = ct.CONTENT_HTML\n        return True\n\n    return False\n\n\ndef get_layers(adaptor: ASGIAdaptor) -> Optional[DataLayer]:\n    \"\"\" Return a parsed version of the layer parameter.\n    \"\"\"\n    param = adaptor.get('layer', None)\n    if param is None:\n        return None\n\n    return cast(DataLayer,\n                reduce(DataLayer.__or__,\n                       (getattr(DataLayer, s.upper()) for s in param.split(','))))\n\n\ndef parse_format(adaptor: ASGIAdaptor, result_type: Type[Any], default: str) -> str:\n    \"\"\" Get and check the 'format' parameter and prepare the formatter.\n        `result_type` is the type of result to be returned by the function\n        and `default` the format value to assume when no parameter is present.\n    \"\"\"\n    fmt = adaptor.get('format', default=default)\n    assert fmt is not None\n\n    formatting = adaptor.formatting()\n\n    if not formatting.supports_format(result_type, fmt):\n        adaptor.raise_error(\"Parameter 'format' must be one of: \" +\n                            ', '.join(formatting.list_formats(result_type)))\n\n    adaptor.content_type = formatting.get_content_type(fmt)\n    return fmt\n\n\ndef parse_geometry_details(adaptor: ASGIAdaptor, fmt: str) -> Dict[str, Any]:\n    \"\"\" Create details structure from the supplied geometry parameters.\n    \"\"\"\n    numgeoms = 0\n    output = GeometryFormat.NONE\n    if adaptor.get_bool('polygon_geojson', False):\n        output |= GeometryFormat.GEOJSON\n        numgeoms += 1\n    if fmt not in ('geojson', 'geocodejson'):\n        if adaptor.get_bool('polygon_text', False):\n            output |= GeometryFormat.TEXT\n            numgeoms += 1\n        if adaptor.get_bool('polygon_kml', False):\n            output |= GeometryFormat.KML\n            numgeoms += 1\n        if adaptor.get_bool('polygon_svg', False):\n            output |= GeometryFormat.SVG\n            numgeoms += 1\n\n    if numgeoms > adaptor.config().get_int('POLYGON_OUTPUT_MAX_TYPES'):\n        adaptor.raise_error('Too many polygon output options selected.')\n\n    return {'address_details': True,\n            'geometry_simplification': adaptor.get_float('polygon_threshold', 0.0),\n            'geometry_output': output\n            }\n\n\ndef has_search_name(conn: sa.engine.Connection) -> bool:\n    \"\"\" Check if the search_name table exists in the database.\n    \"\"\"\n    return sa.inspect(conn).has_table('search_name')\n\n\nasync def status_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any:\n    \"\"\" Server glue for /status endpoint. See API docs for details.\n    \"\"\"\n    result = await api.status()\n\n    fmt = parse_format(params, StatusResult, 'text')\n\n    if fmt == 'text' and result.status:\n        status_code = 500\n    else:\n        status_code = 200\n\n    return build_response(params, params.formatting().format_result(result, fmt, {}),\n                          status=status_code)\n\n\nasync def details_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any:\n    \"\"\" Server glue for /details endpoint. See API docs for details.\n    \"\"\"\n    fmt = parse_format(params, DetailedResult, 'json')\n    place_id = params.get_int('place_id', 0)\n    place: PlaceRef\n    if place_id:\n        place = PlaceID(place_id)\n    else:\n        osmtype = params.get('osmtype')\n        if osmtype is None:\n            params.raise_error(\"Missing ID parameter 'place_id' or 'osmtype'.\")\n        place = OsmID(osmtype, params.get_int('osmid'), params.get('class'))\n\n    debug = setup_debugging(params)\n\n    result = await api.details(place,\n                               address_details=params.get_bool('addressdetails', False),\n                               entrances=params.get_bool('entrances', False),\n                               linked_places=params.get_bool('linkedplaces', True),\n                               parented_places=params.get_bool('hierarchy', False),\n                               keywords=params.get_bool('keywords', False),\n                               geometry_output=(GeometryFormat.GEOJSON\n                                                if params.get_bool('polygon_geojson', False)\n                                                else GeometryFormat.NONE),\n                               query_stats=params.query_stats()\n                               )\n\n    if debug:\n        return build_response(params, loglib.get_and_disable())\n\n    if result is None:\n        params.raise_error('No place with that OSM ID found.', status=404)\n\n    locales = Locales.from_accept_languages(get_accepted_languages(params),\n                                            params.config().OUTPUT_NAMES)\n    locales.localize_results([result])\n\n    output = params.formatting().format_result(\n        result, fmt,\n        {'locales': locales,\n         'group_hierarchy': params.get_bool('group_hierarchy', False),\n         'icon_base_url': params.config().MAPICON_URL,\n         'entrances': params.get_bool('entrances', False),\n         })\n\n    return build_response(params, output, num_results=1)\n\n\nasync def reverse_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any:\n    \"\"\" Server glue for /reverse endpoint. See API docs for details.\n    \"\"\"\n    fmt = parse_format(params, ReverseResults, 'xml')\n    debug = setup_debugging(params)\n    coord = Point(params.get_float('lon'), params.get_float('lat'))\n\n    details = parse_geometry_details(params, fmt)\n    details['max_rank'] = helpers.zoom_to_rank(params.get_int('zoom', 18))\n    details['layers'] = get_layers(params)\n    details['query_stats'] = params.query_stats()\n    details['entrances'] = params.get_bool('entrances', False)\n\n    result = await api.reverse(coord, **details)\n\n    if debug:\n        return build_response(params, loglib.get_and_disable(), num_results=1 if result else 0)\n\n    if fmt == 'xml':\n        queryparts = {'lat': str(coord.lat), 'lon': str(coord.lon), 'format': 'xml'}\n        zoom = params.get('zoom', None)\n        if zoom:\n            queryparts['zoom'] = zoom\n        query = urlencode(queryparts)\n    else:\n        query = ''\n\n    if result:\n        Locales.from_accept_languages(get_accepted_languages(params),\n                                      params.config().OUTPUT_NAMES).localize_results([result])\n\n    fmt_options = {'query': query,\n                   'extratags': params.get_bool('extratags', False),\n                   'namedetails': params.get_bool('namedetails', False),\n                   'entrances': params.get_bool('entrances', False),\n                   'addressdetails': params.get_bool('addressdetails', True)}\n\n    output = params.formatting().format_result(ReverseResults([result] if result else []),\n                                               fmt, fmt_options)\n\n    return build_response(params, output, num_results=1 if result else 0)\n\n\nasync def lookup_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any:\n    \"\"\" Server glue for /lookup endpoint. See API docs for details.\n    \"\"\"\n    fmt = parse_format(params, SearchResults, 'xml')\n    debug = setup_debugging(params)\n    details = parse_geometry_details(params, fmt)\n    details['query_stats'] = params.query_stats()\n    details['entrances'] = params.get_bool('entrances', False)\n\n    places = []\n    for oid in (params.get('osm_ids') or '').split(','):\n        oid = oid.strip()\n        if len(oid) > 1 and oid[0] in 'RNWrnw' and oid[1:].isdigit():\n            places.append(OsmID(oid[0].upper(), int(oid[1:])))\n\n    if len(places) > params.config().get_int('LOOKUP_MAX_COUNT'):\n        params.raise_error('Too many object IDs.')\n\n    if places:\n        results = await api.lookup(places, **details)\n    else:\n        results = SearchResults()\n\n    if debug:\n        return build_response(params, loglib.get_and_disable(), num_results=len(results))\n\n    Locales.from_accept_languages(get_accepted_languages(params),\n                                  params.config().OUTPUT_NAMES).localize_results(results)\n\n    fmt_options = {'extratags': params.get_bool('extratags', False),\n                   'namedetails': params.get_bool('namedetails', False),\n                   'entrances': params.get_bool('entrances', False),\n                   'addressdetails': params.get_bool('addressdetails', True)}\n\n    output = params.formatting().format_result(results, fmt, fmt_options)\n\n    return build_response(params, output, num_results=len(results))\n\n\nasync def _unstructured_search(query: str, api: NominatimAPIAsync,\n                               details: Dict[str, Any]) -> SearchResults:\n    if not query:\n        return SearchResults()\n\n    # Extract special format for coordinates from query.\n    query, x, y = helpers.extract_coords_from_query(query)\n    if x is not None:\n        assert y is not None\n        details['near'] = Point(x, y)\n        details['near_radius'] = 0.1\n\n    # If no query is left, revert to reverse search.\n    if x is not None and not query:\n        result = await api.reverse(details['near'], **details)\n        if not result:\n            return SearchResults()\n\n        return SearchResults(\n                  [SearchResult(**{f.name: getattr(result, f.name)\n                                   for f in dataclasses.fields(SearchResult)\n                                   if hasattr(result, f.name)})])\n\n    query, cls, typ = helpers.extract_category_from_query(query)\n    if cls is not None:\n        assert typ is not None\n        return await api.search_category([(cls, typ)], near_query=query, **details)\n\n    return await api.search(query, **details)\n\n\nasync def search_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any:\n    \"\"\" Server glue for /search endpoint. See API docs for details.\n    \"\"\"\n    fmt = parse_format(params, SearchResults, 'jsonv2')\n    debug = setup_debugging(params)\n    details = parse_geometry_details(params, fmt)\n\n    details['query_stats'] = params.query_stats()\n    details['countries'] = params.get('countrycodes', None)\n    details['entrances'] = params.get_bool('entrances', False)\n    details['excluded'] = params.get('exclude_place_ids', None)\n    details['viewbox'] = params.get('viewbox', None) or params.get('viewboxlbrt', None)\n    details['bounded_viewbox'] = params.get_bool('bounded', False)\n    details['dedupe'] = params.get_bool('dedupe', True)\n\n    max_results = max(1, min(50, params.get_int('limit', 10)))\n    details['max_results'] = (max_results + min(10, max_results)\n                              if details['dedupe'] else max_results)\n\n    details['min_rank'], details['max_rank'] = \\\n        helpers.feature_type_to_rank(params.get('featureType', ''))\n    if params.get('featureType', None) is not None:\n        details['layers'] = DataLayer.ADDRESS\n    else:\n        details['layers'] = get_layers(params)\n    details['locales'] = Locales.from_accept_languages(get_accepted_languages(params),\n                                                       params.config().OUTPUT_NAMES)\n\n    # unstructured query parameters\n    query = params.get('q', None)\n    # structured query parameters\n    queryparts = {}\n    for key in ('amenity', 'street', 'city', 'county', 'state', 'postalcode', 'country'):\n        details[key] = params.get(key, None)\n        if details[key]:\n            queryparts[key] = details[key]\n\n    try:\n        if query is not None:\n            if queryparts:\n                params.raise_error(\"Structured query parameters\"\n                                   \"(amenity, street, city, county, state, postalcode, country)\"\n                                   \" cannot be used together with 'q' parameter.\")\n            queryparts['q'] = query\n            results = await _unstructured_search(query, api, details)\n        else:\n            query = ', '.join(queryparts.values())\n\n            results = await api.search_address(**details)\n    except UsageError as err:\n        params.raise_error(str(err))\n\n    details['locales'].localize_results(results)\n\n    if details['dedupe'] and len(results) > 1:\n        results = helpers.deduplicate_results(results, max_results)\n\n    if debug:\n        return build_response(params, loglib.get_and_disable(), num_results=len(results))\n\n    if fmt == 'xml':\n        helpers.extend_query_parts(queryparts, details,\n                                   params.get('featureType', ''),\n                                   params.get_bool('namedetails', False),\n                                   params.get_bool('extratags', False),\n                                   (f\"{r.osm_object[0]}{r.osm_object[1]}\"\n                                    if r.osm_object\n                                    else str(r.place_id)\n                                    for r in results\n                                    if r.osm_object or r.place_id))\n        queryparts['format'] = fmt\n\n        moreurl = params.base_uri() + '/search?' + urlencode(queryparts)\n    else:\n        moreurl = ''\n\n    fmt_options = {'query': query, 'more_url': moreurl,\n                   'exclude_place_ids': queryparts.get('exclude_place_ids'),\n                   'viewbox': queryparts.get('viewbox'),\n                   'extratags': params.get_bool('extratags', False),\n                   'namedetails': params.get_bool('namedetails', False),\n                   'entrances': params.get_bool('entrances', False),\n                   'addressdetails': params.get_bool('addressdetails', False)}\n\n    output = params.formatting().format_result(results, fmt, fmt_options)\n\n    return build_response(params, output, num_results=len(results))\n\n\nasync def deletable_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any:\n    \"\"\" Server glue for /deletable endpoint.\n        This is a special endpoint that shows polygons that have been\n        deleted or are broken in the OSM data but are kept in the\n        Nominatim database to minimize disruption.\n    \"\"\"\n    fmt = parse_format(params, RawDataList, 'json')\n\n    results = RawDataList()\n    async with api.begin() as conn:\n        for osm_type in ('N', 'W', 'R'):\n            sql = sa.text(\"\"\" SELECT p.place_id, country_code,\n                                     name->'name' as name, i.*\n                              FROM placex p, import_polygon_delete i\n                              WHERE i.osm_type = :osm_type\n                                    AND p.osm_id = i.osm_id AND p.osm_type = :osm_type\n                                    AND p.class = i.class AND p.type = i.type\n                          \"\"\")\n            results.extend(r._asdict() for r in await conn.execute(sql, {'osm_type': osm_type}))\n\n    return build_response(params, params.formatting().format_result(results, fmt, {}))\n\n\nasync def polygons_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any:\n    \"\"\" Server glue for /polygons endpoint.\n        This is a special endpoint that shows polygons that have changed\n        their size but are kept in the Nominatim database with their\n        old area to minimize disruption.\n    \"\"\"\n    fmt = parse_format(params, RawDataList, 'json')\n    sql_params: Dict[str, Any] = {\n        'days': params.get_int('days', -1),\n        'cls': params.get('class')\n    }\n    reduced = params.get_bool('reduced', False)\n\n    async with api.begin() as conn:\n        sql = sa.select(sa.text(\"\"\"osm_type, osm_id, class, type,\n                                   name->'name' as name,\n                                   country_code, errormessage, updated\"\"\"))\\\n                .select_from(sa.text('import_polygon_error'))\n        if sql_params['days'] > 0:\n            sql = sql.where(sa.text(\"updated > 'now'::timestamp - make_interval(days => :days)\"))\n        if reduced:\n            sql = sql.where(sa.text(\"errormessage like 'Area reduced%'\"))\n        if sql_params['cls'] is not None:\n            sql = sql.where(sa.text(\"class = :cls\"))\n\n        sql = sql.order_by(sa.literal_column('updated').desc()).limit(1000)\n\n        results = RawDataList(r._asdict() for r in await conn.execute(sql, sql_params))\n\n    return build_response(params, params.formatting().format_result(results, fmt, {}))\n\n\nasync def search_unavailable_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -> Any:\n    \"\"\" Server glue for /search endpoint in reverse-only mode.\n        Returns 404 when search functionality is not available.\n    \"\"\"\n    params.raise_error('Search not available (reverse-only mode)', 404)\n\n\nclass LazySearchEndpoint:\n    \"\"\"\n    Lazy-loading search endpoint that replaces itself after first successful check.\n\n    - Falcon: EndpointWrapper stores this instance in wrapper.func\n      On first request, replace wrapper.func directly with real endpoint\n\n    - Starlette: _wrap_endpoint wraps this instance in a callback\n      store a delegate function and call it on subsequent requests\n    \"\"\"\n    def __init__(self, api: NominatimAPIAsync, real_endpoint: EndpointFunc):\n        self.api = api\n        self.real_endpoint = real_endpoint\n        self._lock = asyncio.Lock()\n        self._wrapper: Any = None  # Store reference to Falcon's EndpointWrapper\n        self._delegate: Optional[EndpointFunc] = None\n\n    def set_wrapper(self, wrapper: Any) -> None:\n        self._wrapper = wrapper\n\n    async def __call__(self, api: NominatimAPIAsync, params: ASGIAdaptor) -> Any:\n        if self._delegate is None:\n            async with self._lock:\n                # Double-check after acquiring lock (thread safety)\n                if self._delegate is None:\n                    try:\n                        async with api.begin() as conn:\n                            has_table = await conn.connection.run_sync(\n                                has_search_name)\n\n                        if has_table:\n                            # For Starlette\n                            self._delegate = self.real_endpoint\n                            # For Falcon\n                            if self._wrapper is not None:\n                                self._wrapper.func = self.real_endpoint\n                        else:\n                            self._delegate = search_unavailable_endpoint\n                            if self._wrapper is not None:\n                                self._wrapper.func = search_unavailable_endpoint\n\n                    except (PGCORE_ERROR, sa.exc.OperationalError, OSError):\n                        # No _delegate set, so retry on next request\n                        params.raise_error('Search temporarily unavailable', 503)\n\n        return await self._delegate(api, params)\n\n\nasync def get_routes(api: NominatimAPIAsync) -> Sequence[Tuple[str, EndpointFunc]]:\n    routes = [\n        ('status', status_endpoint),\n        ('details', details_endpoint),\n        ('reverse', reverse_endpoint),\n        ('lookup', lookup_endpoint),\n        ('deletable', deletable_endpoint),\n        ('polygons', polygons_endpoint),\n    ]\n\n    try:\n        async with api.begin() as conn:\n            if await conn.connection.run_sync(has_search_name):\n                routes.append(('search', search_endpoint))\n            else:\n                routes.append(('search', search_unavailable_endpoint))\n    except (PGCORE_ERROR, sa.exc.OperationalError, OSError):\n        routes.append(('search', LazySearchEndpoint(api, search_endpoint)))\n\n    return routes\n"
  },
  {
    "path": "src/nominatim_api/version.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nVersion information for the Nominatim API.\n\"\"\"\n\nNOMINATIM_API_VERSION = '5.3.0'\n"
  },
  {
    "path": "src/nominatim_db/__init__.py",
    "content": ""
  },
  {
    "path": "src/nominatim_db/cli.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nCommand-line interface to the Nominatim functions for import, update,\ndatabase administration and querying.\n\"\"\"\nfrom typing import Optional, List, Mapping\nimport importlib\nimport logging\nimport sys\nimport argparse\nimport asyncio\nfrom pathlib import Path\n\nfrom .config import Configuration\nfrom .errors import UsageError\nfrom . import clicmd\nfrom . import version\nfrom .clicmd.args import NominatimArgs, Subcommand\n\nLOG = logging.getLogger()\n\n\nclass CommandlineParser:\n    \"\"\" Wraps some of the common functions for parsing the command line\n        and setting up subcommands.\n    \"\"\"\n    def __init__(self, prog: str, description: Optional[str]):\n        self.parser = argparse.ArgumentParser(\n            prog=prog,\n            description=description,\n            formatter_class=argparse.RawDescriptionHelpFormatter)\n\n        self.subs = self.parser.add_subparsers(title='available commands',\n                                               dest='subcommand')\n\n        # Global arguments that only work if no sub-command given\n        self.parser.add_argument('--version', action='store_true',\n                                 help='Print Nominatim version and exit')\n\n        # Arguments added to every sub-command\n        self.default_args = argparse.ArgumentParser(add_help=False)\n        group = self.default_args.add_argument_group('Default arguments')\n        group.add_argument('-h', '--help', action='help',\n                           help='Show this help message and exit')\n        group.add_argument('-q', '--quiet', action='store_const', const=0,\n                           dest='verbose', default=1,\n                           help='Print only error messages')\n        group.add_argument('-v', '--verbose', action='count', default=1,\n                           help='Increase verboseness of output')\n        group.add_argument('--project-dir', metavar='DIR', default='.',\n                           help='Base directory of the Nominatim installation (default:.)')\n        group.add_argument('-j', '--threads', metavar='NUM', type=int,\n                           help='Number of parallel threads to use')\n\n    def nominatim_version_text(self) -> str:\n        \"\"\" Program name and version number as string\n        \"\"\"\n        text = f'Nominatim version {version.NOMINATIM_VERSION!s}'\n        if version.GIT_COMMIT_HASH is not None:\n            text += f' ({version.GIT_COMMIT_HASH})'\n        return text\n\n    def add_subcommand(self, name: str, cmd: Subcommand) -> None:\n        \"\"\" Add a subcommand to the parser. The subcommand must be a class\n            with a function add_args() that adds the parameters for the\n            subcommand and a run() function that executes the command.\n        \"\"\"\n        assert cmd.__doc__ is not None\n\n        parser = self.subs.add_parser(name, parents=[self.default_args],\n                                      help=cmd.__doc__.split('\\n', 1)[0],\n                                      description=cmd.__doc__,\n                                      formatter_class=argparse.RawDescriptionHelpFormatter,\n                                      add_help=False)\n        parser.set_defaults(command=cmd)\n        cmd.add_args(parser)\n\n    def run(self, cli_args: Optional[List[str]],\n            environ: Optional[Mapping[str, str]]) -> int:\n        \"\"\" Parse the command line arguments of the program and execute the\n            appropriate subcommand.\n        \"\"\"\n        args = NominatimArgs()\n        try:\n            self.parser.parse_args(args=cli_args, namespace=args)\n        except SystemExit:\n            return 1\n\n        if args.version:\n            print(self.nominatim_version_text())\n            return 0\n\n        if args.subcommand is None:\n            self.parser.print_help()\n            return 1\n\n        args.project_dir = Path(args.project_dir).resolve()\n\n        if cli_args is None:\n            logging.basicConfig(stream=sys.stderr,\n                                format='%(asctime)s: %(message)s',\n                                datefmt='%Y-%m-%d %H:%M:%S',\n                                level=max(4 - args.verbose, 1) * 10)\n\n        args.config = Configuration(args.project_dir, environ=environ)\n\n        log = logging.getLogger()\n        log.warning('Using project directory: %s', str(args.project_dir))\n\n        try:\n            return args.command.run(args)\n        except UsageError as exception:\n            if log.isEnabledFor(logging.DEBUG):\n                raise  # use Python's exception printing\n            log.fatal('FATAL: %s', exception)\n\n        # If we get here, then execution has failed in some way.\n        return 1\n\n\n# Subcommand classes\n#\n# Each class needs to implement two functions: add_args() adds the CLI parameters\n# for the subfunction, run() executes the subcommand.\n#\n# The class documentation doubles as the help text for the command. The\n# first line is also used in the summary when calling the program without\n# a subcommand.\n#\n# No need to document the functions each time.\nclass AdminServe:\n    \"\"\"\\\n    Start a simple web server for serving the API.\n\n    This command starts a built-in webserver to serve the website\n    from the current project directory. This webserver is only suitable\n    for testing and development. Do not use it in production setups!\n\n    There are two different webserver implementations for Python available:\n    falcon (the default) and starlette. You need to make sure the\n    appropriate Python packages as well as the uvicorn package are\n    installed to use this function.\n\n    By the default, the webserver can be accessed at: http://127.0.0.1:8088\n    \"\"\"\n\n    def add_args(self, parser: argparse.ArgumentParser) -> None:\n        group = parser.add_argument_group('Server arguments')\n        group.add_argument('--server', default='127.0.0.1:8088',\n                           help='The address the server will listen to.')\n        group.add_argument('--engine', default='falcon',\n                           choices=('falcon', 'starlette'),\n                           help='Webserver framework to run. (default: falcon)')\n\n    def run(self, args: NominatimArgs) -> int:\n        asyncio.run(self.run_uvicorn(args))\n\n        return 0\n\n    async def run_uvicorn(self, args: NominatimArgs) -> None:\n        import uvicorn\n\n        server_info = args.server.split(':', 1)\n        host = server_info[0]\n        if len(server_info) > 1:\n            if not server_info[1].isdigit():\n                raise UsageError('Invalid format for --server parameter. Use <host>:<port>')\n            port = int(server_info[1])\n        else:\n            port = 8088\n\n        server_module = importlib.import_module(f'nominatim_api.server.{args.engine}.server')\n\n        app = server_module.get_application(args.project_dir)\n\n        config = uvicorn.Config(app, host=host, port=port)\n        server = uvicorn.Server(config)\n        await server.serve()\n\n\ndef get_set_parser() -> CommandlineParser:\n    \"\"\"\\\n    Initializes the parser and adds various subcommands for\n    nominatim cli.\n    \"\"\"\n    parser = CommandlineParser('nominatim', nominatim.__doc__)\n\n    parser.add_subcommand('import', clicmd.SetupAll())\n    parser.add_subcommand('freeze', clicmd.SetupFreeze())\n    parser.add_subcommand('replication', clicmd.UpdateReplication())\n\n    parser.add_subcommand('special-phrases', clicmd.ImportSpecialPhrases())\n\n    parser.add_subcommand('add-data', clicmd.UpdateAddData())\n    parser.add_subcommand('index', clicmd.UpdateIndex())\n    parser.add_subcommand('refresh', clicmd.UpdateRefresh())\n\n    parser.add_subcommand('admin', clicmd.AdminFuncs())\n\n    try:\n        exportcmd = importlib.import_module('nominatim_db.clicmd.export')\n        apicmd = importlib.import_module('nominatim_db.clicmd.api')\n        convertcmd = importlib.import_module('nominatim_db.clicmd.convert')\n\n        parser.add_subcommand('export', exportcmd.QueryExport())\n        parser.add_subcommand('convert', convertcmd.ConvertDB())\n        parser.add_subcommand('serve', AdminServe())\n\n        parser.add_subcommand('search', apicmd.APISearch())\n        parser.add_subcommand('reverse', apicmd.APIReverse())\n        parser.add_subcommand('lookup', apicmd.APILookup())\n        parser.add_subcommand('details', apicmd.APIDetails())\n        parser.add_subcommand('status', apicmd.APIStatus())\n    except ModuleNotFoundError as ex:\n        if not ex.name or 'nominatim_api' not in ex.name:\n            raise ex\n\n        parser.parser.epilog = \\\n            f'\\n\\nNominatim API package not found (was looking for module: {ex.name}).'\\\n            '\\nThe following commands are not available:'\\\n            '\\n    export, convert, serve, search, reverse, lookup, details, status'\\\n            \"\\n\\nRun 'pip install nominatim-api' to install the package.\"\n\n    return parser\n\n\ndef nominatim(cli_args: Optional[List[str]] = None,\n              environ: Optional[Mapping[str, str]] = None) -> int:\n    \"\"\"\\\n    Command-line tools for importing, updating, administrating and\n    querying the Nominatim database.\n\n    'cli_args' is a list of parameters for the command to run. If not given,\n    sys.args will be used.\n\n    'environ' is the dictionary of environment variables containing the\n    Nominatim configuration. When None, the os.environ is inherited.\n    \"\"\"\n    return get_set_parser().run(cli_args=cli_args, environ=environ)\n"
  },
  {
    "path": "src/nominatim_db/clicmd/__init__.py",
    "content": "# SPDX-License-Identifier: GPL-2.0-only\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2023 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nSubcommand definitions for the command-line tool.\n\"\"\"\n\nfrom .setup import SetupAll as SetupAll\nfrom .replication import UpdateReplication as UpdateReplication\nfrom .index import UpdateIndex as UpdateIndex\nfrom .refresh import UpdateRefresh as UpdateRefresh\nfrom .add_data import UpdateAddData as UpdateAddData\nfrom .admin import AdminFuncs as AdminFuncs\nfrom .freeze import SetupFreeze as SetupFreeze\nfrom .special_phrases import ImportSpecialPhrases as ImportSpecialPhrases\n"
  },
  {
    "path": "src/nominatim_db/clicmd/add_data.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImplementation of the 'add-data' subcommand.\n\"\"\"\nfrom typing import cast\nimport argparse\nimport logging\nimport asyncio\n\nimport psutil\n\nfrom .args import NominatimArgs\nfrom ..db.connection import connect\nfrom ..tools.freeze import is_frozen\n\n\nLOG = logging.getLogger()\n\n\nclass UpdateAddData:\n    \"\"\"\\\n    Add additional data from a file or an online source.\n\n    This command allows to add or update the search data in the database.\n    The data can come either from an OSM file or single OSM objects can\n    directly be downloaded from the OSM API. This function only loads the\n    data into the database. Afterwards it still needs to be integrated\n    in the search index. Use the `nominatim index` command for that.\n\n    The command can also be used to add external non-OSM data to the\n    database. At the moment the only supported format is TIGER housenumber\n    data. See the online documentation at\n    https://nominatim.org/release-docs/latest/customize/Tiger/\n    for more information.\n    \"\"\"\n\n    def add_args(self, parser: argparse.ArgumentParser) -> None:\n        group_name = parser.add_argument_group('Source')\n        group1 = group_name.add_mutually_exclusive_group(required=True)\n        group1.add_argument('--file', metavar='FILE',\n                            help='Import data from an OSM file or diff file')\n        group1.add_argument('--diff', metavar='FILE',\n                            help='Import data from an OSM diff file (deprecated: use --file)')\n        group1.add_argument('--node', metavar='ID', type=int,\n                            help='Import a single node from the API')\n        group1.add_argument('--way', metavar='ID', type=int,\n                            help='Import a single way from the API')\n        group1.add_argument('--relation', metavar='ID', type=int,\n                            help='Import a single relation from the API')\n        group1.add_argument('--tiger-data', metavar='DIR',\n                            help='Add housenumbers from the US TIGER census database')\n        group2 = parser.add_argument_group('Extra arguments')\n        group2.add_argument('--use-main-api', action='store_true',\n                            help='Use OSM API instead of Overpass to download objects')\n        group2.add_argument('--osm2pgsql-cache', metavar='SIZE', type=int,\n                            help='Size of cache to be used by osm2pgsql (in MB)')\n        group2.add_argument('--socket-timeout', dest='socket_timeout', type=int, default=60,\n                            help='Set timeout for file downloads')\n\n    def run(self, args: NominatimArgs) -> int:\n        from ..tools import add_osm_data\n\n        if args.tiger_data:\n            return asyncio.run(self._add_tiger_data(args))\n\n        with connect(args.config.get_libpq_dsn()) as conn:\n            if is_frozen(conn):\n                print('Database is marked frozen. New data can\\'t be added.')\n                return 1\n\n        osm2pgsql_params = args.osm2pgsql_options(default_cache=1000, default_threads=1)\n        if args.file or args.diff:\n            return add_osm_data.add_data_from_file(args.config.get_libpq_dsn(),\n                                                   cast(str, args.file or args.diff),\n                                                   osm2pgsql_params)\n\n        if args.node:\n            return add_osm_data.add_osm_object(args.config.get_libpq_dsn(),\n                                               'node', args.node,\n                                               args.use_main_api,\n                                               osm2pgsql_params)\n\n        if args.way:\n            return add_osm_data.add_osm_object(args.config.get_libpq_dsn(),\n                                               'way', args.way,\n                                               args.use_main_api,\n                                               osm2pgsql_params)\n\n        if args.relation:\n            return add_osm_data.add_osm_object(args.config.get_libpq_dsn(),\n                                               'relation', args.relation,\n                                               args.use_main_api,\n                                               osm2pgsql_params)\n\n        return 0\n\n    async def _add_tiger_data(self, args: NominatimArgs) -> int:\n        from ..tokenizer import factory as tokenizer_factory\n        from ..tools import tiger_data\n\n        assert args.tiger_data\n\n        tokenizer = tokenizer_factory.get_tokenizer_for_db(args.config)\n        return await tiger_data.add_tiger_data(args.tiger_data,\n                                               args.config,\n                                               args.threads or psutil.cpu_count() or 1,\n                                               tokenizer)\n"
  },
  {
    "path": "src/nominatim_db/clicmd/admin.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImplementation of the 'admin' subcommand.\n\"\"\"\nimport logging\nimport argparse\nimport random\n\nfrom ..errors import UsageError\nfrom ..db.connection import connect, table_exists\nfrom .args import NominatimArgs\n\n\nLOG = logging.getLogger()\n\n\nclass AdminFuncs:\n    \"\"\"\\\n    Analyse and maintain the database.\n    \"\"\"\n\n    def add_args(self, parser: argparse.ArgumentParser) -> None:\n        group = parser.add_argument_group('Admin tasks')\n        objs = group.add_mutually_exclusive_group(required=True)\n        objs.add_argument('--warm', action='store_true',\n                          help='Warm database caches for search and reverse queries')\n        objs.add_argument('--check-database', action='store_true',\n                          help='Check that the database is complete and operational')\n        objs.add_argument('--migrate', action='store_true',\n                          help='Migrate the database to a new software version')\n        objs.add_argument('--analyse-indexing', action='store_true',\n                          help='Print performance analysis of the indexing process')\n        objs.add_argument('--collect-os-info', action=\"store_true\",\n                          help=\"Generate a report about the host system information\")\n        objs.add_argument('--clean-deleted', action='store', metavar='AGE',\n                          help='Clean up deleted relations')\n        group = parser.add_argument_group('Arguments for cache warming')\n        group.add_argument('--search-only', action='store_const', dest='target',\n                           const='search',\n                           help=\"Only pre-warm tables for search queries\")\n        group.add_argument('--reverse-only', action='store_const', dest='target',\n                           const='reverse',\n                           help=\"Only pre-warm tables for reverse queries\")\n        group = parser.add_argument_group('Arguments for index anaysis')\n        mgroup = group.add_mutually_exclusive_group()\n        mgroup.add_argument('--osm-id', type=str,\n                            help='Analyse indexing of the given OSM object')\n        mgroup.add_argument('--place-id', type=int,\n                            help='Analyse indexing of the given Nominatim object')\n\n    def run(self, args: NominatimArgs) -> int:\n        if args.warm:\n            return self._warm(args)\n\n        if args.check_database:\n            LOG.warning('Checking database')\n            from ..tools import check_database\n            return check_database.check_database(args.config)\n\n        if args.analyse_indexing:\n            LOG.warning('Analysing performance of indexing function')\n            from ..tools import admin\n            admin.analyse_indexing(args.config, osm_id=args.osm_id, place_id=args.place_id)\n            return 0\n\n        if args.migrate:\n            LOG.warning('Checking for necessary database migrations')\n            from ..tools import migration\n            return migration.migrate(args.config, args)\n\n        if args.collect_os_info:\n            LOG.warning(\"Reporting System Information\")\n            from ..tools import collect_os_info\n            collect_os_info.report_system_information(args.config)\n            return 0\n\n        if args.clean_deleted:\n            LOG.warning('Cleaning up deleted relations')\n            from ..tools import admin\n            admin.clean_deleted_relations(args.config, age=args.clean_deleted)\n            return 0\n\n        return 1\n\n    def _warm(self, args: NominatimArgs) -> int:\n        try:\n            import nominatim_api as napi\n        except ModuleNotFoundError as exp:\n            raise UsageError(\"Warming requires nominatim API. \"\n                             \"Install with 'pip install nominatim-api'.\") from exp\n        LOG.warning('Warming database caches')\n\n        api = napi.NominatimAPI(args.project_dir)\n\n        try:\n            if args.target != 'search':\n                for _ in range(1000):\n                    api.reverse((random.uniform(-90, 90), random.uniform(-180, 180)),\n                                address_details=True)\n\n            if args.target != 'reverse':\n                from ..tokenizer import factory as tokenizer_factory\n\n                tokenizer = tokenizer_factory.get_tokenizer_for_db(args.config)\n                with connect(args.config.get_libpq_dsn()) as conn:\n                    if table_exists(conn, 'search_name'):\n                        words = tokenizer.most_frequent_words(conn, 1000)\n                    else:\n                        words = []\n\n                for word in words:\n                    api.search(word)\n        finally:\n            api.close()\n\n        return 0\n"
  },
  {
    "path": "src/nominatim_db/clicmd/api.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nSubcommand definitions for API calls from the command line.\n\"\"\"\nfrom typing import Dict, Any, Optional, Type, Mapping\nimport argparse\nimport logging\nimport json\nimport sys\nimport pprint\nfrom functools import reduce\n\nimport nominatim_api as napi\nfrom nominatim_api.v1.helpers import zoom_to_rank, deduplicate_results\nfrom nominatim_api.server.content_types import CONTENT_JSON\nimport nominatim_api.logging as loglib\nfrom ..config import Configuration\nfrom ..errors import UsageError\nfrom .args import NominatimArgs\n\n\nLOG = logging.getLogger()\n\n\nSTRUCTURED_QUERY = (\n    ('amenity', 'name and/or type of POI'),\n    ('street', 'housenumber and street'),\n    ('city', 'city, town or village'),\n    ('county', 'county'),\n    ('state', 'state'),\n    ('country', 'country'),\n    ('postalcode', 'postcode')\n)\n\n\nEXTRADATA_PARAMS = (\n    ('addressdetails', 'Include a breakdown of the address into elements'),\n    ('extratags', (\"Include additional information if available \"\n                   \"(e.g. wikipedia link, opening hours)\")),\n    ('entrances', 'Include a list of tagged entrance nodes'),\n    ('namedetails', 'Include a list of alternative names')\n)\n\n\ndef _add_list_format(parser: argparse.ArgumentParser) -> None:\n    group = parser.add_argument_group('Other options')\n    group.add_argument('--list-formats', action='store_true',\n                       help='List supported output formats and exit.')\n\n\ndef _add_api_output_arguments(parser: argparse.ArgumentParser) -> None:\n    group = parser.add_argument_group('Output formatting')\n    group.add_argument('--format', type=str, default='jsonv2',\n                       help='Format of result (use --list-format to see supported formats)')\n    for name, desc in EXTRADATA_PARAMS:\n        group.add_argument('--' + name, action='store_true', help=desc)\n\n    group.add_argument('--lang', '--accept-language', metavar='LANGS',\n                       help='Preferred language order for presenting search results')\n    group.add_argument('--polygon-output',\n                       choices=['geojson', 'kml', 'svg', 'text'],\n                       help='Output geometry of results as a GeoJSON, KML, SVG or WKT')\n    group.add_argument('--polygon-threshold', type=float, default=0.0,\n                       metavar='TOLERANCE',\n                       help=(\"Simplify output geometry.\"\n                             \"Parameter is difference tolerance in degrees.\"))\n\n\ndef _get_geometry_output(args: NominatimArgs) -> napi.GeometryFormat:\n    \"\"\" Get the requested geometry output format in a API-compatible\n        format.\n    \"\"\"\n    if not args.polygon_output:\n        return napi.GeometryFormat.NONE\n    if args.polygon_output == 'geojson':\n        return napi.GeometryFormat.GEOJSON\n    if args.polygon_output == 'kml':\n        return napi.GeometryFormat.KML\n    if args.polygon_output == 'svg':\n        return napi.GeometryFormat.SVG\n    if args.polygon_output == 'text':\n        return napi.GeometryFormat.TEXT\n\n    try:\n        return napi.GeometryFormat[args.polygon_output.upper()]\n    except KeyError as exp:\n        raise UsageError(f\"Unknown polygon output format '{args.polygon_output}'.\") from exp\n\n\ndef _get_locales(args: NominatimArgs, config: Configuration) -> napi.Locales:\n    \"\"\" Get the locales from the language parameter.\n    \"\"\"\n    language = args.lang or config.DEFAULT_LANGUAGE\n    output_names = config.OUTPUT_NAMES\n\n    if language:\n        return napi.Locales.from_accept_languages(language, output_names)\n\n    return napi.Locales()\n\n\ndef _get_layers(args: NominatimArgs, default: Optional[napi.DataLayer]) -> Optional[napi.DataLayer]:\n    \"\"\" Get the list of selected layers as a DataLayer enum.\n    \"\"\"\n    if not args.layers:\n        return default\n\n    return reduce(napi.DataLayer.__or__,\n                  (napi.DataLayer[s.upper()] for s in args.layers))\n\n\ndef _list_formats(formatter: napi.FormatDispatcher, rtype: Type[Any]) -> int:\n    for fmt in formatter.list_formats(rtype):\n        print(fmt)\n    print('debug')\n    print('raw')\n\n    return 0\n\n\ndef _print_output(formatter: napi.FormatDispatcher, result: Any,\n                  fmt: str, options: Mapping[str, Any]) -> None:\n\n    if fmt == 'raw':\n        pprint.pprint(result)\n    else:\n        output = formatter.format_result(result, fmt, options)\n        if formatter.get_content_type(fmt) == CONTENT_JSON:\n            # reformat the result, so it is pretty-printed\n            try:\n                json.dump(json.loads(output), sys.stdout, indent=4, ensure_ascii=False)\n            except json.decoder.JSONDecodeError as err:\n                # Catch the error here, so that data can be debugged,\n                # when people are developing custom result formatters.\n                LOG.fatal(\"Parsing json failed: %s\\nUnformatted output:\\n%s\", err, output)\n        else:\n            sys.stdout.write(output)\n        sys.stdout.write('\\n')\n\n\nclass APISearch:\n    \"\"\"\\\n    Execute a search query.\n\n    This command works exactly the same as if calling the /search endpoint on\n    the web API. See the online documentation for more details on the\n    various parameters:\n    https://nominatim.org/release-docs/latest/api/Search/\n    \"\"\"\n\n    def add_args(self, parser: argparse.ArgumentParser) -> None:\n        group = parser.add_argument_group('Query arguments')\n        group.add_argument('--query',\n                           help='Free-form query string')\n        for name, desc in STRUCTURED_QUERY:\n            group.add_argument('--' + name, help='Structured query: ' + desc)\n\n        _add_api_output_arguments(parser)\n\n        group = parser.add_argument_group('Result limitation')\n        group.add_argument('--countrycodes', metavar='CC,..',\n                           help='Limit search results to one or more countries')\n        group.add_argument('--exclude_place_ids', metavar='ID,..',\n                           help='List of search object to be excluded')\n        group.add_argument('--limit', type=int, default=10,\n                           help='Limit the number of returned results')\n        group.add_argument('--viewbox', metavar='X1,Y1,X2,Y2',\n                           help='Preferred area to find search results')\n        group.add_argument('--bounded', action='store_true',\n                           help='Strictly restrict results to viewbox area')\n        group.add_argument('--layer', metavar='LAYER',\n                           choices=[n.name.lower() for n in napi.DataLayer if n.name],\n                           action='append', required=False, dest='layers',\n                           help='Restrict results to one or more layers (may be repeated)')\n        group.add_argument('--no-dedupe', action='store_false', dest='dedupe',\n                           help='Do not remove duplicates from the result list')\n        _add_list_format(parser)\n\n    def run(self, args: NominatimArgs) -> int:\n        formatter = napi.load_format_dispatcher('v1', args.project_dir)\n\n        if args.list_formats:\n            return _list_formats(formatter, napi.SearchResults)\n\n        if args.format in ('debug', 'raw'):\n            loglib.set_log_output('text')\n        elif not formatter.supports_format(napi.SearchResults, args.format):\n            raise UsageError(f\"Unsupported format '{args.format}'. \"\n                             'Use --list-formats to see supported formats.')\n\n        layers = _get_layers(args, None)\n\n        try:\n            with napi.NominatimAPI(args.project_dir) as api:\n                params: Dict[str, Any] = {'max_results': args.limit + min(args.limit, 10),\n                                          'address_details': True,  # needed for display name\n                                          'geometry_output': _get_geometry_output(args),\n                                          'geometry_simplification': args.polygon_threshold,\n                                          'countries': args.countrycodes,\n                                          'excluded': args.exclude_place_ids,\n                                          'viewbox': args.viewbox,\n                                          'bounded_viewbox': args.bounded,\n                                          'layers': layers,\n                                          'entrances': args.entrances,\n                                          }\n\n                if args.query:\n                    results = api.search(args.query, **params)\n                else:\n                    results = api.search_address(amenity=args.amenity,\n                                                 street=args.street,\n                                                 city=args.city,\n                                                 county=args.county,\n                                                 state=args.state,\n                                                 postalcode=args.postalcode,\n                                                 country=args.country,\n                                                 **params)\n        except napi.UsageError as ex:\n            raise UsageError(ex) from ex\n\n        locales = _get_locales(args, api.config)\n        locales.localize_results(results)\n\n        if args.dedupe and len(results) > 1:\n            results = deduplicate_results(results, args.limit)\n\n        if args.format == 'debug':\n            print(loglib.get_and_disable())\n            return 0\n\n        _print_output(formatter, results, args.format,\n                      {'extratags': args.extratags,\n                       'namedetails': args.namedetails,\n                       'entrances': args.entrances,\n                       'addressdetails': args.addressdetails})\n        return 0\n\n\nclass APIReverse:\n    \"\"\"\\\n    Execute API reverse query.\n\n    This command works exactly the same as if calling the /reverse endpoint on\n    the web API. See the online documentation for more details on the\n    various parameters:\n    https://nominatim.org/release-docs/latest/api/Reverse/\n    \"\"\"\n\n    def add_args(self, parser: argparse.ArgumentParser) -> None:\n        group = parser.add_argument_group('Query arguments')\n        group.add_argument('--lat', type=float,\n                           help='Latitude of coordinate to look up (in WGS84)')\n        group.add_argument('--lon', type=float,\n                           help='Longitude of coordinate to look up (in WGS84)')\n        group.add_argument('--zoom', type=int,\n                           help='Level of detail required for the address')\n        group.add_argument('--layer', metavar='LAYER',\n                           choices=[n.name.lower() for n in napi.DataLayer if n.name],\n                           action='append', required=False, dest='layers',\n                           help='Restrict results to one or more layers (may be repeated)')\n\n        _add_api_output_arguments(parser)\n        _add_list_format(parser)\n\n    def run(self, args: NominatimArgs) -> int:\n        formatter = napi.load_format_dispatcher('v1', args.project_dir)\n\n        if args.list_formats:\n            return _list_formats(formatter, napi.ReverseResults)\n\n        if args.format in ('debug', 'raw'):\n            loglib.set_log_output('text')\n        elif not formatter.supports_format(napi.ReverseResults, args.format):\n            raise UsageError(f\"Unsupported format '{args.format}'. \"\n                             'Use --list-formats to see supported formats.')\n\n        if args.lat is None or args.lon is None:\n            raise UsageError(\"lat' and 'lon' parameters are required.\")\n\n        layers = _get_layers(args, napi.DataLayer.ADDRESS | napi.DataLayer.POI)\n\n        try:\n            with napi.NominatimAPI(args.project_dir) as api:\n                result = api.reverse(napi.Point(args.lon, args.lat),\n                                     max_rank=zoom_to_rank(args.zoom or 18),\n                                     layers=layers,\n                                     address_details=True,  # needed for display name\n                                     geometry_output=_get_geometry_output(args),\n                                     geometry_simplification=args.polygon_threshold)\n        except napi.UsageError as ex:\n            raise UsageError(ex) from ex\n\n        if result is not None:\n            locales = _get_locales(args, api.config)\n            locales.localize_results([result])\n\n        if args.format == 'debug':\n            print(loglib.get_and_disable())\n            return 0\n\n        if result:\n            _print_output(formatter, napi.ReverseResults([result]), args.format,\n                          {'extratags': args.extratags,\n                           'namedetails': args.namedetails,\n                           'entrances': args.entrances,\n                           'addressdetails': args.addressdetails})\n\n            return 0\n\n        LOG.error(\"Unable to geocode.\")\n        return 42\n\n\nclass APILookup:\n    \"\"\"\\\n    Execute API lookup query.\n\n    This command works exactly the same as if calling the /lookup endpoint on\n    the web API. See the online documentation for more details on the\n    various parameters:\n    https://nominatim.org/release-docs/latest/api/Lookup/\n    \"\"\"\n\n    def add_args(self, parser: argparse.ArgumentParser) -> None:\n        group = parser.add_argument_group('Query arguments')\n        group.add_argument('--id', metavar='OSMID',\n                           action='append', dest='ids',\n                           help='OSM id to lookup in format <NRW><id> (may be repeated)')\n\n        _add_api_output_arguments(parser)\n        _add_list_format(parser)\n\n    def run(self, args: NominatimArgs) -> int:\n        formatter = napi.load_format_dispatcher('v1', args.project_dir)\n\n        if args.list_formats:\n            return _list_formats(formatter, napi.ReverseResults)\n\n        if args.format in ('debug', 'raw'):\n            loglib.set_log_output('text')\n        elif not formatter.supports_format(napi.ReverseResults, args.format):\n            raise UsageError(f\"Unsupported format '{args.format}'. \"\n                             'Use --list-formats to see supported formats.')\n\n        if args.ids is None:\n            raise UsageError(\"'id' parameter required.\")\n\n        places = [napi.OsmID(o[0], int(o[1:])) for o in args.ids]\n\n        try:\n            with napi.NominatimAPI(args.project_dir) as api:\n                results = api.lookup(places,\n                                     address_details=True,  # needed for display name\n                                     geometry_output=_get_geometry_output(args),\n                                     geometry_simplification=args.polygon_threshold or 0.0)\n        except napi.UsageError as ex:\n            raise UsageError(ex) from ex\n\n        locales = _get_locales(args, api.config)\n        locales.localize_results(results)\n\n        if args.format == 'debug':\n            print(loglib.get_and_disable())\n            return 0\n\n        _print_output(formatter, results, args.format,\n                      {'extratags': args.extratags,\n                       'namedetails': args.namedetails,\n                       'entrances': args.entrances,\n                       'addressdetails': args.addressdetails})\n        return 0\n\n\nclass APIDetails:\n    \"\"\"\\\n    Execute API details query.\n\n    This command works exactly the same as if calling the /details endpoint on\n    the web API. See the online documentation for more details on the\n    various parameters:\n    https://nominatim.org/release-docs/latest/api/Details/\n    \"\"\"\n\n    def add_args(self, parser: argparse.ArgumentParser) -> None:\n        group = parser.add_argument_group('Query arguments')\n        group.add_argument('--node', '-n', type=int,\n                           help=\"Look up the OSM node with the given ID.\")\n        group.add_argument('--way', '-w', type=int,\n                           help=\"Look up the OSM way with the given ID.\")\n        group.add_argument('--relation', '-r', type=int,\n                           help=\"Look up the OSM relation with the given ID.\")\n        group.add_argument('--place_id', '-p', type=int,\n                           help='Database internal identifier of the OSM object to look up')\n        group.add_argument('--class', dest='object_class',\n                           help=(\"Class type to disambiguated multiple entries \"\n                                 \"of the same object.\"))\n\n        group = parser.add_argument_group('Output arguments')\n        group.add_argument('--format', type=str, default='json',\n                           help='Format of result (use --list-formats to see supported formats)')\n        group.add_argument('--addressdetails', action='store_true',\n                           help='Include a breakdown of the address into elements')\n        group.add_argument('--keywords', action='store_true',\n                           help='Include a list of name keywords and address keywords')\n        group.add_argument('--linkedplaces', action='store_true',\n                           help='Include a details of places that are linked with this one')\n        group.add_argument('--entrances', action='store_true',\n                           help='Include a list of tagged entrance nodes')\n        group.add_argument('--hierarchy', action='store_true',\n                           help='Include details of places lower in the address hierarchy')\n        group.add_argument('--group_hierarchy', action='store_true',\n                           help='Group the places by type')\n        group.add_argument('--polygon_geojson', action='store_true',\n                           help='Include geometry of result')\n        group.add_argument('--lang', '--accept-language', metavar='LANGS',\n                           help='Preferred language order for presenting search results')\n        _add_list_format(parser)\n\n    def run(self, args: NominatimArgs) -> int:\n        formatter = napi.load_format_dispatcher('v1', args.project_dir)\n\n        if args.list_formats:\n            return _list_formats(formatter, napi.DetailedResult)\n\n        if args.format in ('debug', 'raw'):\n            loglib.set_log_output('text')\n        elif not formatter.supports_format(napi.DetailedResult, args.format):\n            raise UsageError(f\"Unsupported format '{args.format}'. \"\n                             'Use --list-formats to see supported formats.')\n\n        place: napi.PlaceRef\n        if args.node:\n            place = napi.OsmID('N', args.node, args.object_class)\n        elif args.way:\n            place = napi.OsmID('W', args.way, args.object_class)\n        elif args.relation:\n            place = napi.OsmID('R', args.relation, args.object_class)\n        elif args.place_id is not None:\n            place = napi.PlaceID(args.place_id)\n        else:\n            raise UsageError('One of the arguments --node/-n --way/-w '\n                             '--relation/-r --place_id/-p is required/')\n\n        try:\n            with napi.NominatimAPI(args.project_dir) as api:\n                result = api.details(place,\n                                     address_details=args.addressdetails,\n                                     entrances=args.entrances,\n                                     linked_places=args.linkedplaces,\n                                     parented_places=args.hierarchy,\n                                     keywords=args.keywords,\n                                     geometry_output=(napi.GeometryFormat.GEOJSON\n                                                      if args.polygon_geojson\n                                                      else napi.GeometryFormat.NONE))\n        except napi.UsageError as ex:\n            raise UsageError(ex) from ex\n\n        if result is not None:\n            locales = _get_locales(args, api.config)\n            locales.localize_results([result])\n\n        if args.format == 'debug':\n            print(loglib.get_and_disable())\n            return 0\n\n        if result:\n            _print_output(formatter, result, args.format or 'json',\n                          {'group_hierarchy': args.group_hierarchy})\n            return 0\n\n        LOG.error(\"Object not found in database.\")\n        return 42\n\n\nclass APIStatus:\n    \"\"\"\n    Execute API status query.\n\n    This command works exactly the same as if calling the /status endpoint on\n    the web API. See the online documentation for more details on the\n    various parameters:\n    https://nominatim.org/release-docs/latest/api/Status/\n    \"\"\"\n\n    def add_args(self, parser: argparse.ArgumentParser) -> None:\n        group = parser.add_argument_group('API parameters')\n        group.add_argument('--format', type=str, default='text',\n                           help='Format of result (use --list-formats to see supported formats)')\n        _add_list_format(parser)\n\n    def run(self, args: NominatimArgs) -> int:\n        formatter = napi.load_format_dispatcher('v1', args.project_dir)\n\n        if args.list_formats:\n            return _list_formats(formatter, napi.StatusResult)\n\n        if args.format in ('debug', 'raw'):\n            loglib.set_log_output('text')\n        elif not formatter.supports_format(napi.StatusResult, args.format):\n            raise UsageError(f\"Unsupported format '{args.format}'. \"\n                             'Use --list-formats to see supported formats.')\n\n        try:\n            with napi.NominatimAPI(args.project_dir) as api:\n                status = api.status()\n        except napi.UsageError as ex:\n            raise UsageError(ex) from ex\n\n        if args.format == 'debug':\n            print(loglib.get_and_disable())\n            return 0\n\n        _print_output(formatter, status, args.format, {})\n\n        return 0\n"
  },
  {
    "path": "src/nominatim_db/clicmd/args.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nProvides custom functions over command-line arguments.\n\"\"\"\nfrom typing import Optional, List, Dict, Any, Sequence, Tuple\nimport argparse\nimport logging\nfrom pathlib import Path\n\nfrom ..errors import UsageError\nfrom ..config import Configuration\nfrom ..typing import Protocol\n\n\nLOG = logging.getLogger()\n\n\nclass Subcommand(Protocol):\n    \"\"\"\n    Interface to be implemented by classes implementing a CLI subcommand.\n    \"\"\"\n\n    def add_args(self, parser: argparse.ArgumentParser) -> None:\n        \"\"\"\n        Fill the given parser for the subcommand with the appropriate\n        parameters.\n        \"\"\"\n\n    def run(self, args: 'NominatimArgs') -> int:\n        \"\"\"\n        Run the subcommand with the given parsed arguments.\n        \"\"\"\n\n\nclass NominatimArgs:\n    \"\"\" Customized namespace class for the nominatim command line tool\n        to receive the command-line arguments.\n    \"\"\"\n    # Basic environment set by root program.\n    config: Configuration\n    project_dir: Path\n\n    # Global switches\n    version: bool\n    subcommand: Optional[str]\n    command: Subcommand\n\n    # Shared parameters\n    osm2pgsql_cache: Optional[int]\n    socket_timeout: int\n\n    # Arguments added to all subcommands.\n    verbose: int\n    threads: Optional[int]\n\n    # Arguments to 'add-data'\n    file: Optional[str]\n    diff: Optional[str]\n    node: Optional[int]\n    way: Optional[int]\n    relation: Optional[int]\n    tiger_data: Optional[str]\n    use_main_api: bool\n\n    # Arguments to 'admin'\n    warm: bool\n    check_database: bool\n    migrate: bool\n    collect_os_info: bool\n    clean_deleted: str\n    analyse_indexing: bool\n    target: Optional[str]\n    osm_id: Optional[str]\n    place_id: Optional[int]\n\n    # Arguments to 'import'\n    osm_file: List[str]\n    continue_at: Optional[str]\n    reverse_only: bool\n    no_partitions: bool\n    no_updates: bool\n    offline: bool\n    ignore_errors: bool\n    index_noanalyse: bool\n    prepare_database: bool\n\n    # Arguments to 'index'\n    boundaries_only: bool\n    no_boundaries: bool\n    minrank: int\n    maxrank: int\n\n    # Arguments to 'export'\n    output_type: str\n    output_format: str\n    output_all_postcodes: bool\n    language: Optional[str]\n    restrict_to_country: Optional[str]\n\n    # Arguments to 'convert'\n    output: Path\n\n    # Arguments to 'refresh'\n    postcodes: bool\n    word_tokens: bool\n    word_counts: bool\n    address_levels: bool\n    functions: bool\n    wiki_data: bool\n    secondary_importance: bool\n    importance: bool\n    website: bool\n    diffs: bool\n    enable_debug_statements: bool\n    data_object: Sequence[Tuple[str, int]]\n    data_area: Sequence[Tuple[str, int]]\n    ro_access: bool\n    postcode_force_reimport: bool\n\n    # Arguments to 'replication'\n    init: bool\n    update_functions: bool\n    check_for_updates: bool\n    once: bool\n    catch_up: bool\n    do_index: bool\n\n    # Arguments to 'serve'\n    server: str\n    engine: str\n\n    # Arguments to 'special-phrases\n    import_from_wiki: bool\n    import_from_csv: Optional[str]\n    no_replace: bool\n    min: int\n\n    # Arguments to all query functions\n    format: str\n    list_formats: bool\n    addressdetails: bool\n    entrances: bool\n    extratags: bool\n    namedetails: bool\n    lang: Optional[str]\n    polygon_output: Optional[str]\n    polygon_threshold: Optional[float]\n\n    # Arguments to 'search'\n    query: Optional[str]\n    amenity: Optional[str]\n    street: Optional[str]\n    city: Optional[str]\n    county: Optional[str]\n    state: Optional[str]\n    country: Optional[str]\n    postalcode: Optional[str]\n    countrycodes: Optional[str]\n    exclude_place_ids: Optional[str]\n    limit: int\n    viewbox: Optional[str]\n    bounded: bool\n    dedupe: bool\n\n    # Arguments to 'reverse'\n    lat: float\n    lon: float\n    zoom: Optional[int]\n    layers: Optional[Sequence[str]]\n\n    # Arguments to 'lookup'\n    ids: Sequence[str]\n\n    # Arguments to 'details'\n    object_class: Optional[str]\n    linkedplaces: bool\n    hierarchy: bool\n    keywords: bool\n    polygon_geojson: bool\n    group_hierarchy: bool\n\n    def osm2pgsql_options(self, default_cache: int,\n                          default_threads: int) -> Dict[str, Any]:\n        \"\"\" Return the standard osm2pgsql options that can be derived\n            from the command line arguments. The resulting dict can be\n            further customized and then used in `run_osm2pgsql()`.\n        \"\"\"\n        return dict(osm2pgsql=self.config.OSM2PGSQL_BINARY,\n                    osm2pgsql_cache=self.osm2pgsql_cache or default_cache,\n                    osm2pgsql_style=self.config.get_import_style_file(),\n                    osm2pgsql_style_path=self.config.lib_dir.lua,\n                    threads=self.threads or default_threads,\n                    dsn=self.config.get_libpq_dsn(),\n                    flatnode_file=str(self.config.get_path('FLATNODE_FILE') or ''),\n                    tablespaces=dict(slim_data=self.config.TABLESPACE_OSM_DATA,\n                                     slim_index=self.config.TABLESPACE_OSM_INDEX,\n                                     main_data=self.config.TABLESPACE_PLACE_DATA,\n                                     main_index=self.config.TABLESPACE_PLACE_INDEX\n                                     )\n                    )\n\n    def get_osm_file_list(self) -> Optional[List[Path]]:\n        \"\"\" Return the --osm-file argument as a list of Paths or None\n            if no argument was given. The function also checks if the files\n            exist and raises a UsageError if one cannot be found.\n        \"\"\"\n        if not self.osm_file:\n            return None\n\n        files = [Path(f) for f in self.osm_file]\n        for fname in files:\n            if not fname.is_file():\n                LOG.fatal(\"OSM file '%s' does not exist.\", fname)\n                raise UsageError('Cannot access file.')\n\n        return files\n"
  },
  {
    "path": "src/nominatim_db/clicmd/convert.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImplementation of the 'convert' subcommand.\n\"\"\"\nfrom typing import Set, Any, Union, Optional, Sequence\nimport argparse\nimport asyncio\nfrom pathlib import Path\n\nfrom ..errors import UsageError\nfrom .args import NominatimArgs\n\n\nclass WithAction(argparse.Action):\n    \"\"\" Special action that saves a list of flags, given on the command-line\n        as `--with-foo` or `--without-foo`.\n    \"\"\"\n    def __init__(self, option_strings: Sequence[str], dest: Any,\n                 default: bool = True, **kwargs: Any) -> None:\n        if 'nargs' in kwargs:\n            raise ValueError(\"nargs not allowed.\")\n        if option_strings is None:\n            raise ValueError(\"Positional parameter not allowed.\")\n\n        self.dest_set = kwargs.pop('dest_set')\n        full_option_strings = []\n        for opt in option_strings:\n            if not opt.startswith('--'):\n                raise ValueError(\"short-form options not allowed\")\n            if default:\n                self.dest_set.add(opt[2:])\n            full_option_strings.append(f\"--with-{opt[2:]}\")\n            full_option_strings.append(f\"--without-{opt[2:]}\")\n\n        super().__init__(full_option_strings, argparse.SUPPRESS, nargs=0, **kwargs)\n\n    def __call__(self, parser: argparse.ArgumentParser, namespace: argparse.Namespace,\n                 values: Union[str, Sequence[Any], None],\n                 option_string: Optional[str] = None) -> None:\n        assert option_string\n        if option_string.startswith('--with-'):\n            self.dest_set.add(option_string[7:])\n        if option_string.startswith('--without-'):\n            self.dest_set.discard(option_string[10:])\n\n\nclass ConvertDB:\n    \"\"\" Convert an existing database into a different format. (EXPERIMENTAL)\n\n        Dump a read-only version of the database in a different format.\n        At the moment only a SQLite database suitable for reverse lookup\n        can be created.\n    \"\"\"\n\n    def __init__(self) -> None:\n        self.options: Set[str] = set()\n\n    def add_args(self, parser: argparse.ArgumentParser) -> None:\n        parser.add_argument('--format', default='sqlite',\n                            choices=('sqlite', ),\n                            help='Format of the output database (must be sqlite currently)')\n        parser.add_argument('--output', '-o', required=True, type=Path,\n                            help='File to write the database to.')\n        group = parser.add_argument_group('Switches to define database layout'\n                                          '(currently no effect)')\n        group.add_argument('--reverse', action=WithAction, dest_set=self.options, default=True,\n                           help='Enable/disable support for reverse and lookup API'\n                                ' (default: enabled)')\n        group.add_argument('--search', action=WithAction, dest_set=self.options, default=True,\n                           help='Enable/disable support for search API (default: disabled)')\n        group.add_argument('--details', action=WithAction, dest_set=self.options, default=True,\n                           help='Enable/disable support for details API (default: enabled)')\n\n    def run(self, args: NominatimArgs) -> int:\n        if args.output.exists():\n            raise UsageError(f\"File '{args.output}' already exists. Refusing to overwrite.\")\n\n        if args.format == 'sqlite':\n            from ..tools import convert_sqlite\n\n            asyncio.run(convert_sqlite.convert(args.project_dir, args.output, self.options))\n            return 0\n\n        return 1\n"
  },
  {
    "path": "src/nominatim_db/clicmd/export.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImplementation of the 'export' subcommand.\n\"\"\"\nfrom typing import Optional, List, cast\nimport logging\nimport argparse\nimport asyncio\nimport csv\nimport sys\n\nimport nominatim_api as napi\nfrom nominatim_api.results import create_from_placex_row, ReverseResult, add_result_details\nfrom nominatim_api.types import LookupDetails\n\nimport sqlalchemy as sa\n\nfrom ..errors import UsageError\nfrom .args import NominatimArgs\n\n\nLOG = logging.getLogger()\n\n\nRANK_RANGE_MAP = {\n  'country': (4, 4),\n  'state': (5, 9),\n  'county': (10, 12),\n  'city': (13, 16),\n  'suburb': (17, 21),\n  'street': (26, 26),\n  'path': (27, 27)\n}\n\n\nRANK_TO_OUTPUT_MAP = {\n    4: 'country',\n    5: 'state', 6: 'state', 7: 'state', 8: 'state', 9: 'state',\n    10: 'county', 11: 'county', 12: 'county',\n    13: 'city', 14: 'city', 15: 'city', 16: 'city',\n    17: 'suburb', 18: 'suburb', 19: 'suburb', 20: 'suburb', 21: 'suburb',\n    26: 'street', 27: 'path'}\n\n\nclass QueryExport:\n    \"\"\"\\\n    Export places as CSV file from the database.\n\n\n    \"\"\"\n\n    def add_args(self, parser: argparse.ArgumentParser) -> None:\n        group = parser.add_argument_group('Output arguments')\n        group.add_argument('--output-type', default='street',\n                           choices=('country', 'state', 'county',\n                                    'city', 'suburb', 'street', 'path'),\n                           help='Type of places to output (default: street)')\n        group.add_argument('--output-format',\n                           default='street;suburb;city;county;state;country',\n                           help=(\"Semicolon-separated list of address types \"\n                                 \"(see --output-type). Additionally accepts:\"\n                                 \"placeid,postcode\"))\n        group.add_argument('--language',\n                           help=(\"Preferred language for output \"\n                                 \"(use local name, if omitted)\"))\n        group = parser.add_argument_group('Filter arguments')\n        group.add_argument('--restrict-to-country', metavar='COUNTRY_CODE',\n                           help='Export only objects within country')\n        group.add_argument('--restrict-to-osm-node', metavar='ID', type=int,\n                           dest='node',\n                           help='Export only children of this OSM node')\n        group.add_argument('--restrict-to-osm-way', metavar='ID', type=int,\n                           dest='way',\n                           help='Export only children of this OSM way')\n        group.add_argument('--restrict-to-osm-relation', metavar='ID', type=int,\n                           dest='relation',\n                           help='Export only children of this OSM relation')\n\n    def run(self, args: NominatimArgs) -> int:\n        return asyncio.run(export(args))\n\n\nasync def export(args: NominatimArgs) -> int:\n    \"\"\" The actual export as a asynchronous function.\n    \"\"\"\n\n    api = napi.NominatimAPIAsync(args.project_dir)\n\n    try:\n        output_range = RANK_RANGE_MAP[args.output_type]\n\n        writer = init_csv_writer(args.output_format)\n\n        async with api.begin() as conn, api.begin() as detail_conn:\n            t = conn.t.placex\n\n            sql = sa.select(t.c.place_id, t.c.parent_place_id,\n                            t.c.osm_type, t.c.osm_id, t.c.name,\n                            t.c.class_, t.c.type, t.c.admin_level,\n                            t.c.address, t.c.extratags,\n                            t.c.housenumber, t.c.postcode, t.c.country_code,\n                            t.c.importance, t.c.wikipedia, t.c.indexed_date,\n                            t.c.rank_address, t.c.rank_search,\n                            t.c.centroid)\\\n                    .where(t.c.linked_place_id == None)\\\n                    .where(t.c.rank_address.between(*output_range))\n\n            parent_place_id = await get_parent_id(conn, args.node, args.way, args.relation)\n            if parent_place_id:\n                taddr = conn.t.addressline\n\n                sql = sql.join(taddr, taddr.c.place_id == t.c.place_id)\\\n                         .where(taddr.c.address_place_id == parent_place_id)\\\n                         .where(taddr.c.isaddress)\n\n            if args.restrict_to_country:\n                sql = sql.where(t.c.country_code == args.restrict_to_country.lower())\n\n            results = []\n            for row in await conn.execute(sql):\n                result = create_from_placex_row(row, ReverseResult)\n                if result is not None:\n                    results.append(result)\n\n                if len(results) == 1000:\n                    await dump_results(detail_conn, results, writer, args.language)\n                    results = []\n\n            if results:\n                await dump_results(detail_conn, results, writer, args.language)\n    finally:\n        await api.close()\n\n    return 0\n\n\ndef init_csv_writer(output_format: str) -> 'csv.DictWriter[str]':\n    fields = output_format.split(';')\n    writer = csv.DictWriter(sys.stdout, fieldnames=fields, extrasaction='ignore')\n    writer.writeheader()\n\n    return writer\n\n\nasync def dump_results(conn: napi.SearchConnection,\n                       results: List[ReverseResult],\n                       writer: 'csv.DictWriter[str]',\n                       lang: Optional[str]) -> None:\n    await add_result_details(conn, results,\n                             LookupDetails(address_details=True))\n\n    locale = napi.Locales([lang] if lang else None, conn.config.OUTPUT_NAMES)\n    locale.localize_results(results)\n\n    for result in results:\n        data = {'placeid': result.place_id,\n                'postcode': result.postcode}\n\n        for line in (result.address_rows or []):\n            if line.isaddress and line.local_name:\n                if line.category[1] == 'postcode':\n                    data['postcode'] = line.local_name\n                elif line.rank_address in RANK_TO_OUTPUT_MAP:\n                    data[RANK_TO_OUTPUT_MAP[line.rank_address]] = line.local_name\n\n        writer.writerow(data)\n\n\nasync def get_parent_id(conn: napi.SearchConnection, node_id: Optional[int],\n                        way_id: Optional[int],\n                        relation_id: Optional[int]) -> Optional[int]:\n    \"\"\" Get the place ID for the given OSM object.\n    \"\"\"\n    if node_id is not None:\n        osm_type, osm_id = 'N', node_id\n    elif way_id is not None:\n        osm_type, osm_id = 'W', way_id\n    elif relation_id is not None:\n        osm_type, osm_id = 'R', relation_id\n    else:\n        return None\n\n    t = conn.t.placex\n    sql = sa.select(t.c.place_id).limit(1)\\\n            .where(t.c.osm_type == osm_type)\\\n            .where(t.c.osm_id == osm_id)\\\n            .where(t.c.rank_address > 0)\\\n            .order_by(t.c.rank_address)\n\n    for result in await conn.execute(sql):\n        return cast(int, result[0])\n\n    raise UsageError(f'Cannot find a place {osm_type}{osm_id}.')\n"
  },
  {
    "path": "src/nominatim_db/clicmd/freeze.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImplementation of the 'freeze' subcommand.\n\"\"\"\nimport argparse\n\nfrom ..db.connection import connect\nfrom .args import NominatimArgs\n\n\nclass SetupFreeze:\n    \"\"\"\\\n    Make database read-only.\n\n    About half of data in the Nominatim database is kept only to be able to\n    keep the data up-to-date with new changes made in OpenStreetMap. This\n    command drops all this data and only keeps the part needed for geocoding\n    itself.\n\n    This command has the same effect as the `--no-updates` option for imports.\n    \"\"\"\n\n    def add_args(self, parser: argparse.ArgumentParser) -> None:\n        pass  # No options\n\n    def run(self, args: NominatimArgs) -> int:\n        from ..tools import freeze\n\n        with connect(args.config.get_libpq_dsn()) as conn:\n            freeze.drop_update_tables(conn)\n        freeze.drop_flatnode_file(args.config.get_path('FLATNODE_FILE'))\n\n        return 0\n"
  },
  {
    "path": "src/nominatim_db/clicmd/index.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImplementation of the 'index' subcommand.\n\"\"\"\nimport argparse\nimport asyncio\n\nimport psutil\n\nfrom ..db import status\nfrom ..db.connection import connect\nfrom .args import NominatimArgs\n\n\nclass UpdateIndex:\n    \"\"\"\\\n    Reindex all new and modified data.\n\n    Indexing is the process of computing the address and search terms for\n    the places in the database. Every time data is added or changed, indexing\n    needs to be run. Imports and replication updates automatically take care\n    of indexing. For other cases, this function allows to run indexing manually.\n    \"\"\"\n\n    def add_args(self, parser: argparse.ArgumentParser) -> None:\n        group = parser.add_argument_group('Filter arguments')\n        group.add_argument('--boundaries-only', action='store_true',\n                           help=\"\"\"Index only administrative boundaries.\"\"\")\n        group.add_argument('--no-boundaries', action='store_true',\n                           help=\"\"\"Index everything except administrative boundaries.\"\"\")\n        group.add_argument('--minrank', '-r', type=int, metavar='RANK', default=0,\n                           help='Minimum/starting rank')\n        group.add_argument('--maxrank', '-R', type=int, metavar='RANK', default=30,\n                           help='Maximum/finishing rank')\n\n    def run(self, args: NominatimArgs) -> int:\n        asyncio.run(self._do_index(args))\n\n        if not args.no_boundaries and not args.boundaries_only \\\n           and args.minrank == 0 and args.maxrank == 30:\n            with connect(args.config.get_libpq_dsn()) as conn:\n                status.set_indexed(conn, True)\n\n        return 0\n\n    async def _do_index(self, args: NominatimArgs) -> None:\n        from ..tokenizer import factory as tokenizer_factory\n\n        tokenizer = tokenizer_factory.get_tokenizer_for_db(args.config)\n        from ..indexer.indexer import Indexer\n\n        indexer = Indexer(args.config.get_libpq_dsn(), tokenizer,\n                          args.threads or psutil.cpu_count() or 1)\n\n        has_pending = True  # run at least once\n        while has_pending:\n            if not args.no_boundaries:\n                await indexer.index_boundaries(args.minrank, args.maxrank)\n            if not args.boundaries_only:\n                await indexer.index_by_rank(args.minrank, args.maxrank)\n                await indexer.index_postcodes()\n            has_pending = indexer.has_pending(args.minrank, args.maxrank)\n"
  },
  {
    "path": "src/nominatim_db/clicmd/refresh.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImplementation of 'refresh' subcommand.\n\"\"\"\nfrom typing import Tuple, Optional\nimport argparse\nimport logging\nfrom pathlib import Path\nimport asyncio\n\nfrom ..config import Configuration\nfrom ..db.connection import connect, table_exists\nfrom ..tokenizer.base import AbstractTokenizer\nfrom .args import NominatimArgs\n\n\nLOG = logging.getLogger()\n\n\ndef _parse_osm_object(obj: str) -> Tuple[str, int]:\n    \"\"\" Parse the given argument into a tuple of OSM type and ID.\n        Raises an ArgumentError if the format is not recognized.\n    \"\"\"\n    if len(obj) < 2 or obj[0].lower() not in 'nrw' or not obj[1:].isdigit():\n        raise argparse.ArgumentTypeError(\"Cannot parse OSM ID. Expect format: [N|W|R]<id>.\")\n\n    return (obj[0].upper(), int(obj[1:]))\n\n\nclass UpdateRefresh:\n    \"\"\"\\\n    Recompute auxiliary data used by the indexing process.\n\n    This sub-commands updates various static data and functions in the database.\n    It usually needs to be run after changing various aspects of the\n    configuration. The configuration documentation will mention the exact\n    command to use in such case.\n\n    Warning: the 'update' command must not be run in parallel with other update\n             commands like 'replication' or 'add-data'.\n    \"\"\"\n    def __init__(self) -> None:\n        self.tokenizer: Optional[AbstractTokenizer] = None\n\n    def add_args(self, parser: argparse.ArgumentParser) -> None:\n        group = parser.add_argument_group('Data arguments')\n        group.add_argument('--postcodes', action='store_true',\n                           help='Update postcode centroid table')\n        group.add_argument('--word-tokens', action='store_true',\n                           help='Clean up search terms')\n        group.add_argument('--word-counts', action='store_true',\n                           help='Compute frequency of full-word search terms')\n        group.add_argument('--address-levels', action='store_true',\n                           help='Reimport address level configuration')\n        group.add_argument('--functions', action='store_true',\n                           help='Update the PL/pgSQL functions in the database')\n        group.add_argument('--wiki-data', action='store_true',\n                           help='Update Wikipedia/data importance numbers')\n        group.add_argument('--secondary-importance', action='store_true',\n                           help='Update secondary importance raster data')\n        group.add_argument('--importance', action='store_true',\n                           help='Recompute place importances (expensive!)')\n        group.add_argument('--ro-access', action='store_true',\n                           help='Grant read-only access to web user for all tables')\n        group.add_argument('--website', action='store_true',\n                           help='DEPRECATED. This function has no function anymore'\n                                ' and will be removed in a future version.')\n        group.add_argument('--data-object', action='append',\n                           type=_parse_osm_object, metavar='OBJECT',\n                           help='Mark the given OSM object as requiring an update'\n                                ' (format: [NWR]<id>)')\n        group.add_argument('--data-area', action='append',\n                           type=_parse_osm_object, metavar='OBJECT',\n                           help='Mark the area around the given OSM object as requiring an update'\n                                ' (format: [NWR]<id>)')\n\n        group = parser.add_argument_group('Arguments for function refresh')\n        group.add_argument('--no-diff-updates', action='store_false', dest='diffs',\n                           help='Do not enable code for propagating updates')\n        group.add_argument('--enable-debug-statements', action='store_true',\n                           help='Enable debug warning statements in functions')\n        group = parser.add_argument_group('Arguments for postcode refresh')\n        group.add_argument('--force-reimport', action='store_true',\n                           dest='postcode_force_reimport',\n                           help='Recompute the postcodes from scratch instead of updating')\n\n    def run(self, args: NominatimArgs) -> int:\n        from ..tools import refresh, postcodes\n        from ..indexer.indexer import Indexer\n\n        need_function_refresh = args.functions\n\n        if args.postcodes:\n            if postcodes.can_compute(args.config.get_libpq_dsn()):\n                LOG.warning(\"Update postcodes centroid\")\n                tokenizer = self._get_tokenizer(args.config)\n                postcodes.update_postcodes(args.config.get_libpq_dsn(),\n                                           args.project_dir, tokenizer,\n                                           force_reimport=args.postcode_force_reimport)\n                indexer = Indexer(args.config.get_libpq_dsn(), tokenizer,\n                                  args.threads or 1)\n                asyncio.run(indexer.index_postcodes())\n            else:\n                LOG.error(\"The place table doesn't exist. \"\n                          \"Postcode updates on a frozen database is not possible.\")\n\n        if args.word_tokens:\n            LOG.warning('Updating word tokens')\n            tokenizer = self._get_tokenizer(args.config)\n            tokenizer.update_word_tokens()\n\n        if args.word_counts:\n            LOG.warning('Recompute word statistics')\n            self._get_tokenizer(args.config).update_statistics(args.config,\n                                                               threads=args.threads or 1)\n\n        if args.address_levels:\n            LOG.warning('Updating address levels')\n            with connect(args.config.get_libpq_dsn()) as conn:\n                refresh.load_address_levels_from_config(conn, args.config)\n\n        # Attention: must come BEFORE functions\n        if args.secondary_importance:\n            with connect(args.config.get_libpq_dsn()) as conn:\n                # If the table did not exist before, then the importance code\n                # needs to be enabled.\n                if not table_exists(conn, 'secondary_importance'):\n                    args.functions = True\n\n            LOG.warning('Import secondary importance raster data from %s', args.project_dir)\n            if refresh.import_secondary_importance(args.config.get_libpq_dsn(),\n                                                   args.project_dir) > 0:\n                LOG.fatal('FATAL: Cannot update secondary importance raster data')\n                return 1\n            need_function_refresh = True\n\n        if args.wiki_data:\n            data_path = Path(args.config.WIKIPEDIA_DATA_PATH\n                             or args.project_dir)\n            LOG.warning('Import wikipedia article importance from %s', data_path)\n            if refresh.import_wikipedia_articles(args.config.get_libpq_dsn(),\n                                                 data_path) > 0:\n                LOG.fatal('FATAL: Wikipedia importance file not found in %s', data_path)\n                return 1\n            need_function_refresh = True\n\n        if need_function_refresh:\n            LOG.warning('Create functions')\n            with connect(args.config.get_libpq_dsn()) as conn:\n                refresh.create_functions(conn, args.config,\n                                         args.diffs, args.enable_debug_statements)\n                self._get_tokenizer(args.config).update_sql_functions(args.config)\n\n        # Attention: importance MUST come after wiki data import and after functions.\n        if args.importance:\n            LOG.warning('Update importance values for database')\n            with connect(args.config.get_libpq_dsn()) as conn:\n                refresh.recompute_importance(conn)\n\n        if args.website:\n            LOG.error('WARNING: Website setup is no longer required. '\n                      'This function will be removed in future version of Nominatim.')\n\n        if args.ro_access:\n            from ..tools import admin\n            LOG.warning('Grant read-only access to web user')\n            admin.grant_ro_access(args.config.get_libpq_dsn(), args.config)\n\n        if args.data_object or args.data_area:\n            with connect(args.config.get_libpq_dsn()) as conn:\n                for obj in args.data_object or []:\n                    refresh.invalidate_osm_object(*obj, conn, recursive=False)\n                for obj in args.data_area or []:\n                    refresh.invalidate_osm_object(*obj, conn, recursive=True)\n                conn.commit()\n\n        return 0\n\n    def _get_tokenizer(self, config: Configuration) -> AbstractTokenizer:\n        if self.tokenizer is None:\n            from ..tokenizer import factory as tokenizer_factory\n\n            self.tokenizer = tokenizer_factory.get_tokenizer_for_db(config)\n\n        return self.tokenizer\n"
  },
  {
    "path": "src/nominatim_db/clicmd/replication.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImplementation of the 'replication' sub-command.\n\"\"\"\nfrom typing import Optional\nimport argparse\nimport datetime as dt\nimport logging\nimport socket\nimport time\nimport asyncio\n\nfrom ..db import status\nfrom ..db.connection import connect\nfrom ..errors import UsageError\nfrom .args import NominatimArgs\n\nLOG = logging.getLogger()\n\n\nclass UpdateReplication:\n    \"\"\"\\\n    Update the database using an online replication service.\n\n    An OSM replication service is an online service that provides regular\n    updates (OSM diff files) for the planet or update they provide. The OSMF\n    provides the primary replication service for the full planet at\n    https://planet.osm.org/replication/ but there are other providers of\n    extracts of OSM data who provide such a service as well.\n\n    This sub-command allows to set up such a replication service and download\n    and import updates at regular intervals. You need to call '--init' once to\n    set up the process or whenever you change the replication configuration\n    parameters. Without any arguments, the sub-command will go into a loop and\n    continuously apply updates as they become available. Giving `--once` just\n    downloads and imports the next batch of updates.\n    \"\"\"\n\n    def add_args(self, parser: argparse.ArgumentParser) -> None:\n        group = parser.add_argument_group('Arguments for initialisation')\n        group.add_argument('--init', action='store_true',\n                           help='Initialise the update process')\n        group.add_argument('--no-update-functions', dest='update_functions',\n                           action='store_false',\n                           help=\"Do not update the trigger function to \"\n                                \"support differential updates (EXPERT)\")\n        group = parser.add_argument_group('Arguments for updates')\n        group.add_argument('--check-for-updates', action='store_true',\n                           help='Check if new updates are available and exit')\n        group.add_argument('--once', action='store_true',\n                           help=\"Download and apply updates only once. When \"\n                                \"not set, updates are continuously applied\")\n        group.add_argument('--catch-up', action='store_true',\n                           help=\"Download and apply updates until no new \"\n                                \"data is available on the server\")\n        group.add_argument('--no-index', action='store_false', dest='do_index',\n                           help=(\"Do not index the new data. Only usable \"\n                                 \"together with --once\"))\n        group.add_argument('--osm2pgsql-cache', metavar='SIZE', type=int,\n                           help='Size of cache to be used by osm2pgsql (in MB)')\n        group = parser.add_argument_group('Download parameters')\n        group.add_argument('--socket-timeout', dest='socket_timeout', type=int, default=60,\n                           help='Set timeout for file downloads')\n\n    def _init_replication(self, args: NominatimArgs) -> int:\n        from ..tools import replication, refresh\n\n        LOG.warning(\"Initialising replication updates\")\n        with connect(args.config.get_libpq_dsn()) as conn:\n            replication.init_replication(conn, base_url=args.config.REPLICATION_URL,\n                                         socket_timeout=args.socket_timeout)\n            if args.update_functions:\n                LOG.warning(\"Create functions\")\n                refresh.create_functions(conn, args.config, True, False)\n        return 0\n\n    def _check_for_updates(self, args: NominatimArgs) -> int:\n        from ..tools import replication\n\n        with connect(args.config.get_libpq_dsn()) as conn:\n            return replication.check_for_updates(conn, base_url=args.config.REPLICATION_URL,\n                                                 socket_timeout=args.socket_timeout)\n\n    def _report_update(self, batchdate: dt.datetime,\n                       start_import: dt.datetime,\n                       start_index: Optional[dt.datetime]) -> None:\n        def round_time(delta: dt.timedelta) -> dt.timedelta:\n            return dt.timedelta(seconds=int(delta.total_seconds()))\n\n        end = dt.datetime.now(dt.timezone.utc)\n        LOG.warning(\"Update completed. Import: %s. %sTotal: %s. Remaining backlog: %s.\",\n                    round_time((start_index or end) - start_import),\n                    f\"Indexing: {round_time(end - start_index)} \" if start_index else '',\n                    round_time(end - start_import),\n                    round_time(end - batchdate))\n\n    def _compute_update_interval(self, args: NominatimArgs) -> int:\n        if args.catch_up:\n            return 0\n\n        update_interval = args.config.get_int('REPLICATION_UPDATE_INTERVAL')\n        # Sanity check to not overwhelm the Geofabrik servers.\n        if 'download.geofabrik.de' in args.config.REPLICATION_URL\\\n           and update_interval < 86400:\n            LOG.fatal(\"Update interval too low for download.geofabrik.de.\\n\"\n                      \"Please check install documentation \"\n                      \"(https://nominatim.org/release-docs/latest/admin/Update/#\"\n                      \"setting-up-the-update-process).\")\n            raise UsageError(\"Invalid replication update interval setting.\")\n\n        return update_interval\n\n    async def _update(self, args: NominatimArgs) -> None:\n        from ..tools import replication\n        from ..indexer.indexer import Indexer\n        from ..tokenizer import factory as tokenizer_factory\n\n        update_interval = self._compute_update_interval(args)\n\n        params = args.osm2pgsql_options(default_cache=2000, default_threads=1)\n        params.update(base_url=args.config.REPLICATION_URL,\n                      update_interval=update_interval,\n                      import_file=args.project_dir / 'osmosischange.osc',\n                      max_diff_size=args.config.get_int('REPLICATION_MAX_DIFF'),\n                      indexed_only=not args.once)\n\n        if not args.once:\n            if not args.do_index:\n                LOG.fatal(\"Indexing cannot be disabled when running updates continuously.\")\n                raise UsageError(\"Bad argument '--no-index'.\")\n        recheck_interval = args.config.get_int('REPLICATION_RECHECK_INTERVAL')\n\n        tokenizer = tokenizer_factory.get_tokenizer_for_db(args.config)\n        indexer = Indexer(args.config.get_libpq_dsn(), tokenizer, args.threads or 1)\n\n        dsn = args.config.get_libpq_dsn()\n\n        while True:\n            start = dt.datetime.now(dt.timezone.utc)\n            state = replication.update(dsn, params, socket_timeout=args.socket_timeout)\n\n            with connect(dsn) as conn:\n                if state is not replication.UpdateState.NO_CHANGES:\n                    status.log_status(conn, start, 'import')\n                batchdate, _, _ = status.get_status(conn)\n                conn.commit()\n\n            if state is not replication.UpdateState.NO_CHANGES and args.do_index:\n                index_start = dt.datetime.now(dt.timezone.utc)\n                await indexer.index_full(analyse=False)\n\n                with connect(dsn) as conn:\n                    status.set_indexed(conn, True)\n                    status.log_status(conn, index_start, 'index')\n                    conn.commit()\n            else:\n                index_start = None\n\n            if state is replication.UpdateState.NO_CHANGES and \\\n               args.catch_up or update_interval > 40*60:\n                await indexer.index_full(analyse=False)\n\n            if LOG.isEnabledFor(logging.WARNING):\n                assert batchdate is not None\n                self._report_update(batchdate, start, index_start)\n\n            if args.once or (args.catch_up and state is replication.UpdateState.NO_CHANGES):\n                break\n\n            if state is replication.UpdateState.NO_CHANGES:\n                LOG.warning(\"No new changes. Sleeping for %d sec.\", recheck_interval)\n                time.sleep(recheck_interval)\n\n    def run(self, args: NominatimArgs) -> int:\n        socket.setdefaulttimeout(args.socket_timeout)\n\n        if args.init:\n            return self._init_replication(args)\n\n        if args.check_for_updates:\n            return self._check_for_updates(args)\n\n        asyncio.run(self._update(args))\n        return 0\n"
  },
  {
    "path": "src/nominatim_db/clicmd/setup.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nImplementation of the 'import' subcommand.\n\"\"\"\nfrom typing import Optional\nimport argparse\nimport logging\nfrom pathlib import Path\nimport asyncio\n\nimport psutil\n\nfrom ..errors import UsageError\nfrom ..config import Configuration\nfrom ..db.connection import connect\nfrom ..db import status, properties\nfrom ..tokenizer.base import AbstractTokenizer\nfrom ..version import NOMINATIM_VERSION\nfrom .args import NominatimArgs\n\nimport time\n\nLOG = logging.getLogger()\n\n\nclass SetupAll:\n    \"\"\"\\\n    Create a new Nominatim database from an OSM file.\n\n    This sub-command sets up a new Nominatim database from scratch starting\n    with creating a new database in Postgresql. The user running this command\n    needs superuser rights on the database.\n    \"\"\"\n\n    def add_args(self, parser: argparse.ArgumentParser) -> None:\n        group1 = parser.add_argument_group('Required arguments')\n        group1.add_argument('--osm-file', metavar='FILE', action='append',\n                            help='OSM file to be imported'\n                                 ' (repeat for importing multiple files)',\n                            default=None)\n        group1.add_argument('--continue', dest='continue_at',\n                            choices=['import-from-file', 'load-data', 'indexing', 'db-postprocess'],\n                            help='Continue an import that was interrupted',\n                            default=None)\n        group2 = parser.add_argument_group('Optional arguments')\n        group2.add_argument('--osm2pgsql-cache', metavar='SIZE', type=int,\n                            help='Size of cache to be used by osm2pgsql (in MB)')\n        group2.add_argument('--reverse-only', action='store_true',\n                            help='Do not create tables and indexes for searching')\n        group2.add_argument('--no-partitions', action='store_true',\n                            help=\"Do not partition search indices \"\n                                 \"(speeds up import of single country extracts)\")\n        group2.add_argument('--no-updates', action='store_true',\n                            help=\"Do not keep tables that are only needed for \"\n                                 \"updating the database later\")\n        group2.add_argument('--offline', action='store_true',\n                            help=\"Do not attempt to load any additional data from the internet\")\n        group3 = parser.add_argument_group('Expert options')\n        group3.add_argument('--ignore-errors', action='store_true',\n                            help='Continue import even when errors in SQL are present')\n        group3.add_argument('--index-noanalyse', action='store_true',\n                            help='Do not perform analyse operations during index (expert only)')\n        group3.add_argument('--prepare-database', action='store_true',\n                            help='Create the database but do not import any data')\n\n    def run(self, args: NominatimArgs) -> int:\n        if args.osm_file is None and args.continue_at is None and not args.prepare_database:\n            raise UsageError(\"No input files (use --osm-file).\")\n\n        if args.osm_file is not None and args.continue_at not in ('import-from-file', None):\n            raise UsageError(f\"Cannot use --continue {args.continue_at} and --osm-file together.\")\n\n        if args.continue_at is not None and args.prepare_database:\n            raise UsageError(\n                \"Cannot use --continue and --prepare-database together.\"\n            )\n\n        return asyncio.run(self.async_run(args))\n\n    async def async_run(self, args: NominatimArgs) -> int:\n        from ..data import country_info\n        from ..tools import database_import, postcodes, freeze\n        from ..indexer.indexer import Indexer\n\n        start_time = time.time()\n\n        num_threads = args.threads or psutil.cpu_count() or 1\n        country_info.setup_country_config(args.config)\n\n        if args.prepare_database or args.continue_at is None:\n            LOG.warning('Creating database')\n            database_import.setup_database_skeleton(args.config.get_libpq_dsn(),\n                                                    rouser=args.config.DATABASE_WEBUSER)\n            if args.prepare_database:\n                return 0\n\n        if args.continue_at in (None, 'import-from-file'):\n            self._base_import(args)\n\n        if args.continue_at in ('import-from-file', 'load-data', None):\n            LOG.warning('Initialise tables')\n            with connect(args.config.get_libpq_dsn()) as conn:\n                database_import.truncate_data_tables(conn)\n\n            LOG.warning('Load data into placex table')\n            await database_import.load_data(args.config.get_libpq_dsn(), num_threads)\n\n        LOG.warning(\"Setting up tokenizer\")\n        tokenizer = self._get_tokenizer(args.continue_at, args.config)\n\n        if args.continue_at in ('import-from-file', 'load-data', None):\n            LOG.warning('Calculate postcodes')\n            postcodes.update_postcodes(args.config.get_libpq_dsn(),\n                                       args.project_dir, tokenizer)\n\n        if args.continue_at in ('import-from-file', 'load-data', 'indexing', None):\n            LOG.warning('Indexing places')\n            indexer = Indexer(args.config.get_libpq_dsn(), tokenizer, num_threads)\n            await indexer.index_full(analyse=not args.index_noanalyse)\n\n        LOG.warning('Post-process tables')\n        with connect(args.config.get_libpq_dsn()) as conn:\n            conn.autocommit = True\n            await database_import.create_search_indices(conn, args.config,\n                                                        drop=args.no_updates,\n                                                        threads=num_threads)\n            LOG.warning('Create search index for default country names.')\n            conn.autocommit = False\n            country_info.create_country_names(conn, tokenizer,\n                                              args.config.get_str_list('LANGUAGES'))\n            if args.no_updates:\n                conn.autocommit = True\n                freeze.drop_update_tables(conn)\n        tokenizer.finalize_import(args.config)\n\n        LOG.warning('Recompute word counts')\n        tokenizer.update_statistics(args.config, threads=num_threads)\n\n        end_time = time.time()\n        elapsed = end_time - start_time\n        LOG.warning(f'Import completed successfully in {elapsed:.2f} seconds.')\n\n        self._finalize_database(args.config.get_libpq_dsn(), args.offline)\n\n        return 0\n\n    def _base_import(self, args: NominatimArgs) -> None:\n        from ..tools import database_import, refresh\n        from ..data import country_info\n\n        files = args.get_osm_file_list()\n        if not files:\n            raise UsageError(\"No input files (use --osm-file).\")\n\n        if args.continue_at in ('import-from-file', None):\n            # Check if the correct plugins are installed\n            database_import.check_existing_database_plugins(args.config.get_libpq_dsn())\n            LOG.warning('Setting up country tables')\n            country_info.setup_country_tables(args.config.get_libpq_dsn(),\n                                              args.config.lib_dir.data,\n                                              args.no_partitions)\n\n            LOG.warning('Importing OSM data file')\n            database_import.import_osm_data(files,\n                                            args.osm2pgsql_options(0, 1),\n                                            drop=args.no_updates,\n                                            ignore_errors=args.ignore_errors)\n\n            LOG.warning('Importing wikipedia importance data')\n            data_path = Path(args.config.WIKIPEDIA_DATA_PATH or args.project_dir)\n            if refresh.import_wikipedia_articles(args.config.get_libpq_dsn(),\n                                                 data_path) > 0:\n                LOG.error('Wikipedia importance dump file not found. '\n                          'Calculating importance values of locations will not '\n                          'use Wikipedia importance data.')\n\n            LOG.warning('Importing secondary importance raster data')\n            if refresh.import_secondary_importance(args.config.get_libpq_dsn(),\n                                                   args.project_dir) != 0:\n                LOG.error('Secondary importance file not imported. '\n                          'Falling back to default ranking.')\n\n            self._setup_tables(args.config, args.reverse_only)\n\n    def _setup_tables(self, config: Configuration, reverse_only: bool) -> None:\n        \"\"\" Set up the basic database layout: tables, indexes and functions.\n        \"\"\"\n        from ..tools import database_import, refresh\n\n        with connect(config.get_libpq_dsn()) as conn:\n            conn.autocommit = True\n            LOG.warning('Create functions (1st pass)')\n            refresh.create_functions(conn, config, False, False)\n            LOG.warning('Create tables')\n            database_import.create_tables(conn, config, reverse_only=reverse_only)\n            refresh.load_address_levels_from_config(conn, config)\n            LOG.warning('Create functions (2nd pass)')\n            refresh.create_functions(conn, config, False, False)\n            LOG.warning('Create table triggers')\n            database_import.create_table_triggers(conn, config)\n            LOG.warning('Create partition tables')\n            database_import.create_partition_tables(conn, config)\n            LOG.warning('Create functions (3rd pass)')\n            refresh.create_functions(conn, config, False, False)\n\n    def _get_tokenizer(self, continue_at: Optional[str],\n                       config: Configuration) -> AbstractTokenizer:\n        \"\"\" Set up a new tokenizer or load an already initialised one.\n        \"\"\"\n        from ..tokenizer import factory as tokenizer_factory\n\n        if continue_at in ('import-from-file', 'load-data', None):\n            # (re)initialise the tokenizer data\n            return tokenizer_factory.create_tokenizer(config)\n\n        # just load the tokenizer\n        return tokenizer_factory.get_tokenizer_for_db(config)\n\n    def _finalize_database(self, dsn: str, offline: bool) -> None:\n        \"\"\" Determine the database date and set the status accordingly.\n        \"\"\"\n        with connect(dsn) as conn:\n            properties.set_property(conn, 'database_version', str(NOMINATIM_VERSION))\n\n            try:\n                dbdate = status.compute_database_date(conn, offline)\n                status.set_status(conn, dbdate)\n                LOG.info('Database is at %s.', dbdate)\n            except Exception as exc:\n                LOG.error('Cannot determine date of database: %s', exc)\n"
  },
  {
    "path": "src/nominatim_db/clicmd/special_phrases.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\n    Implementation of the 'special-phrases' command.\n\"\"\"\nimport argparse\nimport logging\nfrom pathlib import Path\n\nfrom ..errors import UsageError\nfrom ..db.connection import connect\nfrom ..tools.special_phrases.sp_importer import SPImporter, SpecialPhraseLoader\nfrom ..tools.special_phrases.sp_wiki_loader import SPWikiLoader\nfrom ..tools.special_phrases.sp_csv_loader import SPCsvLoader\nfrom .args import NominatimArgs\n\n\nLOG = logging.getLogger()\n\n\nclass ImportSpecialPhrases:\n    \"\"\"\\\n    Import special phrases.\n\n    Special phrases are search terms that narrow down the type of object\n    that should be searched. For example, you might want to search for\n    'Hotels in Barcelona'. The OSM wiki has a selection of special phrases\n    in many languages, which can be imported with this command.\n\n    You can also provide your own phrases in a CSV file. The file needs to have\n    the following five columns:\n     * phrase - the term expected for searching\n     * class - the OSM tag key of the object type\n     * type - the OSM tag value of the object type\n     * operator - the kind of search to be done (one of: in, near, name, -)\n     * plural - whether the term is a plural or not (Y/N)\n\n    An example file can be found in the Nominatim sources at\n    'test/testdb/full_en_phrases_test.csv'.\n\n    The import can be further configured to ignore specific key/value pairs.\n    This is particularly useful when importing phrases from the wiki. The\n    default configuration excludes some very common tags like building=yes.\n    The configuration can be customized by putting a file `phrase-settings.json`\n    with custom rules into the project directory or by using the `--config`\n    option to point to another configuration file.\n    \"\"\"\n\n    def add_args(self, parser: argparse.ArgumentParser) -> None:\n        group = parser.add_argument_group('Input arguments')\n        group.add_argument('--import-from-wiki', action='store_true',\n                           help='Import special phrases from the OSM wiki to the database')\n        group.add_argument('--import-from-csv', metavar='FILE',\n                           help='Import special phrases from a CSV file')\n        group.add_argument('--no-replace', action='store_true',\n                           help='Keep the old phrases and only add the new ones')\n        group.add_argument('--min', type=int, default=0,\n                           help='Restrict special phrases by minimum occurance')\n\n    def run(self, args: NominatimArgs) -> int:\n\n        if args.import_from_wiki:\n            self.start_import(args, SPWikiLoader(args.config))\n\n        if args.import_from_csv:\n            if not Path(args.import_from_csv).is_file():\n                LOG.fatal(\"CSV file '%s' does not exist.\", args.import_from_csv)\n                raise UsageError('Cannot access file.')\n\n            self.start_import(args, SPCsvLoader(args.import_from_csv))\n\n        return 0\n\n    def start_import(self, args: NominatimArgs, loader: SpecialPhraseLoader) -> None:\n        \"\"\"\n            Create the SPImporter object containing the right\n            sp loader and then start the import of special phrases.\n        \"\"\"\n        from ..tokenizer import factory as tokenizer_factory\n\n        tokenizer = tokenizer_factory.get_tokenizer_for_db(args.config)\n        should_replace = not args.no_replace\n        min = args.min\n\n        with connect(args.config.get_libpq_dsn()) as db_connection:\n            SPImporter(\n                args.config, db_connection, loader\n            ).import_phrases(tokenizer, should_replace, min)\n"
  },
  {
    "path": "src/nominatim_db/config.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nNominatim configuration accessor.\n\"\"\"\nfrom typing import Union, Dict, Any, List, Mapping, Optional\nimport importlib.util\nimport logging\nimport os\nimport sys\nimport re\nfrom pathlib import Path\nimport json\nimport yaml\n\nfrom dotenv import dotenv_values\n\nfrom psycopg.conninfo import conninfo_to_dict\n\nfrom .typing import StrPath\nfrom .errors import UsageError\nfrom . import paths\n\nLOG = logging.getLogger()\nCONFIG_CACHE: Dict[str, Any] = {}\n\n\ndef flatten_config_list(content: Any, section: str = '') -> List[Any]:\n    \"\"\" Flatten YAML configuration lists that contain include sections\n        which are lists themselves.\n    \"\"\"\n    if not content:\n        return []\n\n    if not isinstance(content, list):\n        raise UsageError(f\"List expected in section '{section}'.\")\n\n    output = []\n    for ele in content:\n        if isinstance(ele, list):\n            output.extend(flatten_config_list(ele, section))\n        else:\n            output.append(ele)\n\n    return output\n\n\nclass Configuration:\n    \"\"\" This class wraps access to the configuration settings\n        for the Nominatim instance in use.\n\n        All Nominatim configuration options are prefixed with 'NOMINATIM_' to\n        avoid conflicts with other environment variables. All settings can\n        be accessed as properties of the class under the same name as the\n        setting but with the `NOMINATIM_` prefix removed. In addition, there\n        are accessor functions that convert the setting values to types\n        other than string.\n    \"\"\"\n\n    def __init__(self, project_dir: Optional[Union[Path, str]],\n                 environ: Optional[Mapping[str, str]] = None) -> None:\n        self.environ = os.environ if environ is None else environ\n        self.config_dir = paths.CONFIG_DIR\n        self._config = dotenv_values(str(self.config_dir / 'env.defaults'))\n        if project_dir is not None:\n            self.project_dir: Optional[Path] = Path(project_dir).resolve()\n            if (self.project_dir / '.env').is_file():\n                self._config.update(dotenv_values(str(self.project_dir / '.env')))\n        else:\n            self.project_dir = None\n\n        class _LibDirs:\n            sql = paths.SQLLIB_DIR\n            lua = paths.LUALIB_DIR\n            data = paths.DATA_DIR\n\n        self.lib_dir = _LibDirs()\n        self._private_plugins: Dict[str, object] = {}\n\n        if re.fullmatch(r'[\\w-]+', self.DATABASE_WEBUSER) is None:\n            raise UsageError(\"Misconfigured DATABASE_WEBUSER. \"\n                             \"Only alphnumberic characters, - and _ are allowed.\")\n\n    def set_libdirs(self, **kwargs: StrPath) -> None:\n        \"\"\" Set paths to library functions and data.\n        \"\"\"\n        for key, value in kwargs.items():\n            setattr(self.lib_dir, key, None if value is None else Path(value))\n\n    def __getattr__(self, name: str) -> str:\n        name = 'NOMINATIM_' + name\n\n        if name in self.environ:\n            return self.environ[name]\n\n        return self._config[name] or ''\n\n    def get_bool(self, name: str) -> bool:\n        \"\"\" Return the given configuration parameter as a boolean.\n\n            Parameters:\n              name: Name of the configuration parameter with the NOMINATIM_\n                prefix removed.\n\n            Returns:\n              `True` for values of '1', 'yes' and 'true', `False` otherwise.\n        \"\"\"\n        return getattr(self, name).lower() in ('1', 'yes', 'true')\n\n    def get_int(self, name: str) -> int:\n        \"\"\" Return the given configuration parameter as an int.\n\n            Parameters:\n              name: Name of the configuration parameter with the NOMINATIM_\n                prefix removed.\n\n            Returns:\n              The configuration value converted to int.\n\n            Raises:\n              ValueError: when the value is not a number.\n        \"\"\"\n        try:\n            return int(getattr(self, name))\n        except ValueError as exp:\n            LOG.fatal(\"Invalid setting NOMINATIM_%s. Needs to be a number.\", name)\n            raise UsageError(\"Configuration error.\") from exp\n\n    def get_str_list(self, name: str) -> Optional[List[str]]:\n        \"\"\" Return the given configuration parameter as a list of strings.\n            The values are assumed to be given as a comma-sparated list and\n            will be stripped before returning them.\n\n            Parameters:\n              name: Name of the configuration parameter with the NOMINATIM_\n                prefix removed.\n\n            Returns:\n              (List[str]): The comma-split parameter as a list. The\n                elements are stripped of leading and final spaces before\n                being returned.\n              (None): The configuration parameter was unset or empty.\n        \"\"\"\n        raw = getattr(self, name)\n\n        return [v.strip() for v in raw.split(',')] if raw else None\n\n    def get_path(self, name: str) -> Optional[Path]:\n        \"\"\" Return the given configuration parameter as a Path.\n\n            Parameters:\n              name: Name of the configuration parameter with the NOMINATIM_\n                prefix removed.\n\n            Returns:\n              (Path): A Path object of the parameter value.\n                  If a relative path is configured, then the function converts this\n                  into an absolute path with the project directory as root path.\n              (None): The configuration parameter was unset or empty.\n        \"\"\"\n        value = getattr(self, name)\n        if not value:\n            return None\n\n        cfgpath = Path(value)\n\n        if not cfgpath.is_absolute():\n            assert self.project_dir is not None\n            cfgpath = self.project_dir / cfgpath\n\n        return cfgpath.resolve()\n\n    def get_libpq_dsn(self) -> str:\n        \"\"\" Get configured database DSN converted into the key/value format\n            understood by libpq and psycopg.\n        \"\"\"\n        dsn = self.DATABASE_DSN\n\n        def quote_param(param: str) -> str:\n            key, val = param.split('=')\n            val = val.replace('\\\\', '\\\\\\\\').replace(\"'\", \"\\\\'\")\n            if ' ' in val:\n                val = \"'\" + val + \"'\"\n            return key + '=' + val\n\n        if dsn.startswith('pgsql:'):\n            # Old PHP DSN format. Convert before returning.\n            return ' '.join([quote_param(p) for p in dsn[6:].split(';')])\n\n        return dsn\n\n    def get_database_params(self) -> Mapping[str, Union[str, int, None]]:\n        \"\"\" Get the configured parameters for the database connection\n            as a mapping.\n        \"\"\"\n        dsn = self.DATABASE_DSN\n\n        if dsn.startswith('pgsql:'):\n            return dict((p.split('=', 1) for p in dsn[6:].split(';')))\n\n        return conninfo_to_dict(dsn)  # type: ignore\n\n    def get_import_style_file(self) -> Path:\n        \"\"\" Return the import style file as a path object. Translates the\n            name of the standard styles automatically into a file in the\n            config style.\n        \"\"\"\n        style = getattr(self, 'IMPORT_STYLE')\n\n        if style in ('admin', 'street', 'address', 'full', 'extratags'):\n            return self.lib_dir.lua / f'import-{style}.lua'\n\n        return self.find_config_file('', 'IMPORT_STYLE')\n\n    def get_os_env(self) -> Dict[str, str]:\n        \"\"\" Return a copy of the OS environment with the Nominatim configuration\n            merged in.\n        \"\"\"\n        env = {k: v for k, v in self._config.items() if v is not None}\n        env.update(self.environ)\n\n        return env\n\n    def load_sub_configuration(self, filename: StrPath,\n                               config: Optional[str] = None) -> Any:\n        \"\"\" Load additional configuration from a file. `filename` is the name\n            of the configuration file. The file is first searched in the\n            project directory and then in the global settings directory.\n\n            If `config` is set, then the name of the configuration file can\n            be additionally given through a .env configuration option. When\n            the option is set, then the file will be exclusively loaded as set:\n            if the name is an absolute path, the file name is taken as is,\n            if the name is relative, it is taken to be relative to the\n            project directory.\n\n            The format of the file is determined from the filename suffix.\n            Currently only files with extension '.yaml' are supported.\n\n            YAML files support a special '!include' construct. When the\n            directive is given, the value is taken to be a filename, the file\n            is loaded using this function and added at the position in the\n            configuration tree.\n        \"\"\"\n        configfile = self.find_config_file(filename, config)\n\n        if str(configfile) in CONFIG_CACHE:\n            return CONFIG_CACHE[str(configfile)]\n\n        if configfile.suffix in ('.yaml', '.yml'):\n            result = self._load_from_yaml(configfile)\n        elif configfile.suffix == '.json':\n            with configfile.open('r', encoding='utf-8') as cfg:\n                result = json.load(cfg)\n        else:\n            raise UsageError(f\"Config file '{configfile}' has unknown format.\")\n\n        CONFIG_CACHE[str(configfile)] = result\n        return result\n\n    def load_plugin_module(self, module_name: str, internal_path: str) -> Any:\n        \"\"\" Load a Python module as a plugin.\n\n            The module_name may have three variants:\n\n            * A name without any '.' is assumed to be an internal module\n              and will be searched relative to `internal_path`.\n            * If the name ends in `.py`, module_name is assumed to be a\n              file name relative to the project directory.\n            * Any other name is assumed to be an absolute module name.\n\n            In either of the variants the module name must start with a letter.\n        \"\"\"\n        if not module_name or not module_name[0].isidentifier():\n            raise UsageError(f'Invalid module name {module_name}')\n\n        if '.' not in module_name:\n            module_name = module_name.replace('-', '_')\n            full_module = f'{internal_path}.{module_name}'\n            return sys.modules.get(full_module) or importlib.import_module(full_module)\n\n        if module_name.endswith('.py'):\n            if self.project_dir is None or not (self.project_dir / module_name).exists():\n                raise UsageError(f\"Cannot find module '{module_name}' in project directory.\")\n\n            if module_name in self._private_plugins:\n                return self._private_plugins[module_name]\n\n            file_path = str(self.project_dir / module_name)\n            spec = importlib.util.spec_from_file_location(module_name, file_path)\n            if spec:\n                module = importlib.util.module_from_spec(spec)\n                # Do not add to global modules because there is no standard\n                # module name that Python can resolve.\n                self._private_plugins[module_name] = module\n                assert spec.loader is not None\n                spec.loader.exec_module(module)\n\n                return module\n\n        return sys.modules.get(module_name) or importlib.import_module(module_name)\n\n    def find_config_file(self, filename: StrPath,\n                         config: Optional[str] = None) -> Path:\n        \"\"\" Resolve the location of a configuration file given a filename and\n            an optional configuration option with the file name.\n            Raises a UsageError when the file cannot be found or is not\n            a regular file.\n        \"\"\"\n        if config is not None:\n            cfg_value = getattr(self, config)\n            if cfg_value:\n                cfg_filename = Path(cfg_value)\n\n                if cfg_filename.is_absolute():\n                    cfg_filename = cfg_filename.resolve()\n\n                    if not cfg_filename.is_file():\n                        LOG.fatal(\"Cannot find config file '%s'.\", cfg_filename)\n                        raise UsageError(\"Config file not found.\")\n\n                    return cfg_filename\n\n                filename = cfg_filename\n\n        search_paths = [self.project_dir, self.config_dir]\n        for path in search_paths:\n            if path is not None and (path / filename).is_file():\n                return path / filename\n\n        LOG.fatal(\"Configuration file '%s' not found.\\nDirectories searched: %s\",\n                  filename, search_paths)\n        raise UsageError(\"Config file not found.\")\n\n    def _load_from_yaml(self, cfgfile: Path) -> Any:\n        \"\"\" Load a YAML configuration file. This installs a special handler that\n            allows to include other YAML files using the '!include' operator.\n        \"\"\"\n        yaml.add_constructor('!include', self._yaml_include_representer,\n                             Loader=yaml.SafeLoader)\n        return yaml.safe_load(cfgfile.read_text(encoding='utf-8'))\n\n    def _yaml_include_representer(self, loader: Any, node: yaml.Node) -> Any:\n        \"\"\" Handler for the '!include' operator in YAML files.\n\n            When the filename is relative, then the file is first searched in the\n            project directory and then in the global settings directory.\n        \"\"\"\n        fname = loader.construct_scalar(node)\n\n        if Path(fname).is_absolute():\n            configfile = Path(fname)\n        else:\n            configfile = self.find_config_file(loader.construct_scalar(node))\n\n        if configfile.suffix != '.yaml':\n            LOG.fatal(\"Format error while reading '%s': only YAML format supported.\",\n                      configfile)\n            raise UsageError(\"Cannot handle config file format.\")\n\n        return yaml.safe_load(configfile.read_text(encoding='utf-8'))\n"
  },
  {
    "path": "src/nominatim_db/data/__init__.py",
    "content": ""
  },
  {
    "path": "src/nominatim_db/data/country_info.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nFunctions for importing and managing static country information.\n\"\"\"\nfrom typing import Dict, Any, Iterable, Tuple, Optional, Container, overload\nfrom pathlib import Path\n\nfrom ..db import utils as db_utils\nfrom ..db.connection import connect, Connection, register_hstore\nfrom ..errors import UsageError\nfrom ..config import Configuration\nfrom ..tokenizer.base import AbstractTokenizer\n\n\ndef _flatten_name_list(names: Any) -> Dict[str, str]:\n    if names is None:\n        return {}\n\n    if not isinstance(names, dict):\n        raise UsageError(\"Expected key-value list for names in country_settings.py\")\n\n    flat = {}\n    for prefix, remain in names.items():\n        if isinstance(remain, str):\n            flat[prefix] = remain\n        elif not isinstance(remain, dict):\n            raise UsageError(\"Entries in names must be key-value lists.\")\n        else:\n            for suffix, name in remain.items():\n                if suffix == 'default':\n                    flat[prefix] = name\n                else:\n                    flat[f'{prefix}:{suffix}'] = name\n\n    return flat\n\n\nclass _CountryInfo:\n    \"\"\" Caches country-specific properties from the configuration file.\n    \"\"\"\n\n    def __init__(self) -> None:\n        self._info: Dict[str, Dict[str, Any]] = {}\n\n    def load(self, config: Configuration) -> None:\n        \"\"\" Load the country properties from the configuration files,\n            if they are not loaded yet.\n        \"\"\"\n        if not self._info:\n            self._info = config.load_sub_configuration('country_settings.yaml')\n            for prop in self._info.values():\n                # Convert languages into a list for simpler handling.\n                if 'languages' not in prop:\n                    prop['languages'] = []\n                elif not isinstance(prop['languages'], list):\n                    prop['languages'] = [x.strip()\n                                         for x in prop['languages'].split(',')]\n                prop['names'] = _flatten_name_list(prop.get('names'))\n\n    def items(self) -> Iterable[Tuple[str, Dict[str, Any]]]:\n        \"\"\" Return tuples of (country_code, property dict) as iterable.\n        \"\"\"\n        return self._info.items()\n\n    def get(self, country_code: str) -> Dict[str, Any]:\n        \"\"\" Get country information for the country with the given country code.\n        \"\"\"\n        return self._info.get(country_code, {})\n\n\n_COUNTRY_INFO = _CountryInfo()\n\n\ndef setup_country_config(config: Configuration) -> None:\n    \"\"\" Load country properties from the configuration file.\n        Needs to be called before using any other functions in this\n        file.\n    \"\"\"\n    _COUNTRY_INFO.load(config)\n\n\n@overload\ndef iterate() -> Iterable[Tuple[str, Dict[str, Any]]]:\n    ...\n\n\n@overload\ndef iterate(prop: str) -> Iterable[Tuple[str, Any]]:\n    ...\n\n\ndef iterate(prop: Optional[str] = None) -> Iterable[Tuple[str, Dict[str, Any]]]:\n    \"\"\" Iterate over country code and properties.\n\n        When `prop` is None, all countries are returned with their complete\n        set of properties.\n\n        If `prop` is given, then only countries are returned where the\n        given property is set. The second item of the tuple contains only\n        the content of the given property.\n    \"\"\"\n    if prop is None:\n        return _COUNTRY_INFO.items()\n\n    return ((c, p[prop]) for c, p in _COUNTRY_INFO.items() if prop in p)\n\n\ndef setup_country_tables(dsn: str, sql_dir: Path, ignore_partitions: bool = False) -> None:\n    \"\"\" Create and populate the tables with basic static data that provides\n        the background for geocoding. Data is assumed to not yet exist.\n    \"\"\"\n    db_utils.execute_file(dsn, sql_dir / 'country_osm_grid.sql.gz')\n\n    params = []\n    for ccode, props in _COUNTRY_INFO.items():\n        if ccode is not None and props is not None:\n            if ignore_partitions:\n                partition = 0\n            else:\n                partition = props.get('partition', 0)\n            lang = props['languages'][0] if len(\n                props['languages']) == 1 else None\n\n            params.append((ccode, props['names'], lang, partition))\n    with connect(dsn) as conn:\n        register_hstore(conn)\n        with conn.cursor() as cur:\n            cur.execute(\n                \"\"\" CREATE TABLE public.country_name (\n                        country_code character varying(2),\n                        name public.hstore,\n                        derived_name public.hstore,\n                        country_default_language_code text,\n                        partition integer\n                    ); \"\"\")\n            cur.executemany(\n                \"\"\" INSERT INTO public.country_name\n                    (country_code, name, country_default_language_code, partition)\n                    VALUES (%s, %s, %s, %s)\n                \"\"\", params)\n        conn.commit()\n\n\ndef create_country_names(conn: Connection, tokenizer: AbstractTokenizer,\n                         languages: Optional[Container[str]] = None) -> None:\n    \"\"\" Add default country names to search index. `languages` is a comma-\n        separated list of language codes as used in OSM. If `languages` is not\n        empty then only name translations for the given languages are added\n        to the index.\n    \"\"\"\n    def _include_key(key: str) -> bool:\n        return ':' not in key or not languages or \\\n               key[key.index(':') + 1:] in languages\n\n    register_hstore(conn)\n    with conn.cursor() as cur:\n        cur.execute(\"\"\"SELECT country_code, name FROM country_name\n                       WHERE country_code is not null\"\"\")\n\n        with tokenizer.name_analyzer() as analyzer:\n            for code, name in cur:\n                names = {'countrycode': code}\n\n                # country names (only in languages as provided)\n                if name:\n                    names.update({k: v for k, v in name.items() if _include_key(k)})\n\n                analyzer.add_country_names(code, names)\n\n    conn.commit()\n"
  },
  {
    "path": "src/nominatim_db/data/place_info.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nWrapper around place information the indexer gets from the database and hands to\nthe tokenizer.\n\"\"\"\nfrom typing import Optional, Mapping, Any, Tuple, cast\n\n\nclass PlaceInfo:\n    \"\"\" This data class contains all information the tokenizer can access\n        about a place.\n    \"\"\"\n\n    def __init__(self, info: Mapping[str, Any]) -> None:\n        self._info = info\n\n    @property\n    def name(self) -> Optional[Mapping[str, str]]:\n        \"\"\" A dictionary with the names of the place. Keys and values represent\n            the full key and value of the corresponding OSM tag. Which tags\n            are saved as names is determined by the import style.\n            The property may be None if the place has no names.\n        \"\"\"\n        return self._info.get('name')\n\n    @property\n    def address(self) -> Optional[Mapping[str, str]]:\n        \"\"\" A dictionary with the address elements of the place. They key\n            usually corresponds to the suffix part of the key of an OSM\n            'addr:*' or 'isin:*' tag. There are also some special keys like\n            `country` or `country_code` which merge OSM keys that contain\n            the same information. See [Import Styles][1] for details.\n\n            The property may be None if the place has no address information.\n\n            [1]: ../customize/Import-Styles.md\n        \"\"\"\n        return self._info.get('address')\n\n    @property\n    def country_code(self) -> Optional[str]:\n        \"\"\" The country code of the country the place is in. Guaranteed\n            to be a two-letter lower-case string. If the place is not inside\n            any country, the property is set to None.\n        \"\"\"\n        return self._info.get('country_code')\n\n    @property\n    def rank_address(self) -> int:\n        \"\"\" The [rank address][1] before any rank correction is applied.\n\n            [1]: ../customize/Ranking.md#address-rank\n        \"\"\"\n        return cast(int, self._info.get('rank_address', 0))\n\n    @property\n    def centroid(self) -> Optional[Tuple[float, float]]:\n        \"\"\" A center point of the place in WGS84. May be None when the\n            geometry of the place is unknown.\n        \"\"\"\n        x, y = self._info.get('centroid_x'), self._info.get('centroid_y')\n        return None if x is None or y is None else (x, y)\n\n    def is_a(self, key: str, value: str) -> bool:\n        \"\"\" Set to True when the place's primary tag corresponds to the given\n            key and value.\n        \"\"\"\n        return self._info.get('class') == key and self._info.get('type') == value\n\n    def is_country(self) -> bool:\n        \"\"\" Set to True when the place is a valid country boundary.\n        \"\"\"\n        return self.rank_address == 4 \\\n            and self.is_a('boundary', 'administrative') \\\n            and self.country_code is not None\n"
  },
  {
    "path": "src/nominatim_db/data/place_name.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nData class for a single name of a place.\n\"\"\"\nfrom typing import Optional, Dict, Mapping\n\n\nclass PlaceName:\n    \"\"\" Each name and address part of a place is encapsulated in an object of\n        this class. It saves not only the name proper but also describes the\n        kind of name with two properties:\n\n        * `kind` describes the name of the OSM key used without any suffixes\n          (i.e. the part after the colon removed)\n        * `suffix` contains the suffix of the OSM tag, if any. The suffix\n          is the part of the key after the first colon.\n\n        In addition to that, a name may have arbitrary additional attributes.\n        How attributes are used, depends on the sanitizers and token analysers.\n        The exception is the 'analyzer' attribute. This attribute determines\n        which token analysis module will be used to finalize the treatment of\n        names.\n    \"\"\"\n\n    def __init__(self, name: str, kind: str, suffix: Optional[str]):\n        self.name = name\n        self.kind = kind\n        self.suffix = suffix\n        self.attr: Dict[str, str] = {}\n\n    def __repr__(self) -> str:\n        return f\"PlaceName(name={self.name!r},kind={self.kind!r},suffix={self.suffix!r})\"\n\n    def clone(self, name: Optional[str] = None,\n              kind: Optional[str] = None,\n              suffix: Optional[str] = None,\n              attr: Optional[Mapping[str, str]] = None) -> 'PlaceName':\n        \"\"\" Create a deep copy of the place name, optionally with the\n            given parameters replaced. In the attribute list only the given\n            keys are updated. The list is not replaced completely.\n            In particular, the function cannot to be used to remove an\n            attribute from a place name.\n        \"\"\"\n        newobj = PlaceName(name or self.name,\n                           kind or self.kind,\n                           suffix or self.suffix)\n\n        newobj.attr.update(self.attr)\n        if attr:\n            newobj.attr.update(attr)\n\n        return newobj\n\n    def set_attr(self, key: str, value: str) -> None:\n        \"\"\" Add the given property to the name. If the property was already\n            set, then the value is overwritten.\n        \"\"\"\n        self.attr[key] = value\n\n    def get_attr(self, key: str, default: Optional[str] = None) -> Optional[str]:\n        \"\"\" Return the given property or the value of 'default' if it\n            is not set.\n        \"\"\"\n        return self.attr.get(key, default)\n\n    def has_attr(self, key: str) -> bool:\n        \"\"\" Check if the given attribute is set.\n        \"\"\"\n        return key in self.attr\n"
  },
  {
    "path": "src/nominatim_db/data/postcode_format.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nFunctions for formatting postcodes according to their country-specific\nformat.\n\"\"\"\nfrom typing import Any, Mapping, Optional, Set, Match\nimport re\n\nfrom ..errors import UsageError\nfrom . import country_info\n\n\nclass CountryPostcodeMatcher:\n    \"\"\" Matches and formats a postcode according to a format definition\n        of the given country.\n    \"\"\"\n    def __init__(self, country_code: str, config: Mapping[str, Any]) -> None:\n        if 'pattern' not in config:\n            raise UsageError(\"Field 'pattern' required for 'postcode' \"\n                             f\"for country '{country_code}'\")\n\n        pc_pattern = config['pattern'].replace('d', '[0-9]').replace('l', '[A-Z]')\n\n        self.norm_pattern = re.compile(f'\\\\s*(?:{country_code.upper()}[ -]?)?({pc_pattern})\\\\s*')\n        self.pattern = re.compile(pc_pattern)\n\n        # We want to exclude 0000, 00-000, 000 00 etc\n        self.zero_pattern = re.compile(r'^[0\\- ]+$')\n\n        self.output = config.get('output', r'\\g<0>')\n\n    def match(self, postcode: str) -> Optional[Match[str]]:\n        \"\"\" Match the given postcode against the postcode pattern for this\n            matcher. Returns a `re.Match` object if the match was successful\n            and None otherwise.\n        \"\"\"\n        # Upper-case, strip spaces and leading country code.\n        normalized = self.norm_pattern.fullmatch(postcode.upper())\n\n        if normalized:\n            match = self.pattern.fullmatch(normalized.group(1))\n            if match and self.zero_pattern.match(match.string):\n                return None\n            return match\n\n        return None\n\n    def normalize(self, match: Match[str]) -> str:\n        \"\"\" Return the default format of the postcode for the given match.\n            `match` must be a `re.Match` object previously returned by\n            `match()`\n        \"\"\"\n        return match.expand(self.output)\n\n\nclass PostcodeFormatter:\n    \"\"\" Container for different postcode formats of the world and\n        access functions.\n    \"\"\"\n    def __init__(self) -> None:\n        # Objects without a country code can't have a postcode per definition.\n        self.country_without_postcode: Set[Optional[str]] = {None}\n        self.country_matcher = {}\n        self.default_matcher = CountryPostcodeMatcher('', {'pattern': '.*'})\n        self.postcode_extent: dict[Optional[str], int] = {}\n\n        for ccode, prop in country_info.iterate('postcode'):\n            if prop is False:\n                self.country_without_postcode.add(ccode)\n            elif isinstance(prop, dict):\n                self.country_matcher[ccode] = CountryPostcodeMatcher(ccode, prop)\n                if 'extent' in prop:\n                    self.postcode_extent[ccode] = int(prop['extent'])\n            else:\n                raise UsageError(f\"Invalid entry 'postcode' for country '{ccode}'\")\n\n    def set_default_pattern(self, pattern: str) -> None:\n        \"\"\" Set the postcode match pattern to use, when a country does not\n            have a specific pattern.\n        \"\"\"\n        self.default_matcher = CountryPostcodeMatcher('', {'pattern': pattern})\n\n    def get_matcher(self, country_code: Optional[str]) -> Optional[CountryPostcodeMatcher]:\n        \"\"\" Return the CountryPostcodeMatcher for the given country.\n            Returns None if the country doesn't have a postcode and the\n            default matcher if there is no specific matcher configured for\n            the country.\n        \"\"\"\n        if country_code in self.country_without_postcode:\n            return None\n\n        assert country_code is not None\n\n        return self.country_matcher.get(country_code, self.default_matcher)\n\n    def match(self, country_code: Optional[str], postcode: str) -> Optional[Match[str]]:\n        \"\"\" Match the given postcode against the postcode pattern for this\n            matcher. Returns a `re.Match` object if the country has a pattern\n            and the match was successful or None if the match failed.\n        \"\"\"\n        if country_code in self.country_without_postcode:\n            return None\n\n        assert country_code is not None\n\n        return self.country_matcher.get(country_code, self.default_matcher).match(postcode)\n\n    def normalize(self, country_code: str, match: Match[str]) -> str:\n        \"\"\" Return the default format of the postcode for the given match.\n            `match` must be a `re.Match` object previously returned by\n            `match()`\n        \"\"\"\n        return self.country_matcher.get(country_code, self.default_matcher).normalize(match)\n\n    def get_postcode_extent(self, country_code: Optional[str]) -> int:\n        \"\"\" Return the extent (in m) to use for the given country. If no\n            specific extent is set, then the default of 5km will be returned.\n        \"\"\"\n        return self.postcode_extent.get(country_code, 5000)\n"
  },
  {
    "path": "src/nominatim_db/db/__init__.py",
    "content": ""
  },
  {
    "path": "src/nominatim_db/db/connection.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nSpecialised connection and cursor functions.\n\"\"\"\nfrom typing import Optional, Any, Dict, Tuple\nimport logging\nimport os\n\nimport psycopg\nimport psycopg.types.hstore\nfrom psycopg import sql as pysql\n\nfrom ..typing import SysEnv\nfrom ..errors import UsageError\n\nLOG = logging.getLogger()\n\nCursor = psycopg.Cursor[Any]\nConnection = psycopg.Connection[Any]\n\n\ndef execute_scalar(conn: Connection, sql: psycopg.abc.Query, args: Any = None) -> Any:\n    \"\"\" Execute query that returns a single value. The value is returned.\n        If the query yields more than one row, a ValueError is raised.\n    \"\"\"\n    with conn.cursor(row_factory=psycopg.rows.tuple_row) as cur:\n        cur.execute(sql, args)\n\n        if cur.rowcount != 1:\n            raise RuntimeError(\"Query did not return a single row.\")\n\n        result = cur.fetchone()\n\n    assert result is not None\n    return result[0]\n\n\ndef table_exists(conn: Connection, table: str) -> bool:\n    \"\"\" Check that a table with the given name exists in the database.\n    \"\"\"\n    num = execute_scalar(\n        conn,\n        \"\"\"SELECT count(*) FROM pg_tables\n           WHERE tablename = %s and schemaname = 'public'\"\"\", (table, ))\n    return num == 1 if isinstance(num, int) else False\n\n\ndef table_has_column(conn: Connection, table: str, column: str) -> bool:\n    \"\"\" Check if the table 'table' exists and has a column with name 'column'.\n    \"\"\"\n    has_column = execute_scalar(conn,\n                                \"\"\"SELECT count(*) FROM information_schema.columns\n                                   WHERE table_name = %s and column_name = %s\"\"\",\n                                (table, column))\n    return has_column > 0 if isinstance(has_column, int) else False\n\n\ndef index_exists(conn: Connection, index: str, table: Optional[str] = None) -> bool:\n    \"\"\" Check that an index with the given name exists in the database.\n        If table is not None then the index must relate to the given\n        table.\n    \"\"\"\n    with conn.cursor() as cur:\n        cur.execute(\"\"\"SELECT tablename FROM pg_indexes\n                       WHERE indexname = %s and schemaname = 'public'\"\"\", (index, ))\n        if cur.rowcount == 0:\n            return False\n\n        if table is not None:\n            row = cur.fetchone()\n            if row is None or not isinstance(row[0], str):\n                return False\n            return row[0] == table\n\n    return True\n\n\ndef drop_tables(conn: Connection, *names: str,\n                if_exists: bool = True, cascade: bool = False) -> None:\n    \"\"\" Drop one or more tables with the given names.\n        Set `if_exists` to False if a non-existent table should raise\n        an exception instead of just being ignored. `cascade` will cause\n        depended objects to be dropped as well.\n        The caller needs to take care of committing the change.\n    \"\"\"\n    sql = pysql.SQL('DROP TABLE%s{}%s' % (\n                        ' IF EXISTS ' if if_exists else ' ',\n                        ' CASCADE' if cascade else ''))\n\n    with conn.cursor() as cur:\n        for name in names:\n            cur.execute(sql.format(pysql.Identifier(name)))\n\n\ndef server_version_tuple(conn: Connection) -> Tuple[int, int]:\n    \"\"\" Return the server version as a tuple of (major, minor).\n        Converts correctly for pre-10 and post-10 PostgreSQL versions.\n    \"\"\"\n    version = conn.info.server_version\n    major, minor = divmod(version, 10000)\n    if major < 10:\n        minor //= 100\n    return major, minor\n\n\ndef postgis_version_tuple(conn: Connection) -> Tuple[int, int]:\n    \"\"\" Return the postgis version installed in the database as a\n        tuple of (major, minor). Assumes that the PostGIS extension\n        has been installed already.\n    \"\"\"\n    version = execute_scalar(conn, 'SELECT postgis_lib_version()')\n\n    version_parts = version.split('.')\n    if len(version_parts) < 2:\n        raise UsageError(f\"Error fetching Postgis version. Bad format: {version}\")\n\n    return (int(version_parts[0]), int(version_parts[1]))\n\n\ndef register_hstore(conn: Connection) -> None:\n    \"\"\" Register the hstore type with psycopg for the connection.\n    \"\"\"\n    info = psycopg.types.TypeInfo.fetch(conn, \"hstore\")\n    if info is None:\n        raise RuntimeError('Hstore extension is requested but not installed.')\n    psycopg.types.hstore.register_hstore(info, conn)\n\n\ndef connect(dsn: str, **kwargs: Any) -> Connection:\n    \"\"\" Open a connection to the database using the specialised connection\n        factory. The returned object may be used in conjunction with 'with'.\n        When used outside a context manager, use the `connection` attribute\n        to get the connection.\n    \"\"\"\n    try:\n        return psycopg.connect(dsn, row_factory=psycopg.rows.namedtuple_row, **kwargs)\n    except psycopg.OperationalError as err:\n        raise UsageError(f\"Cannot connect to database: {err}\") from err\n\n\n# Translation from PG connection string parameters to PG environment variables.\n# Derived from https://www.postgresql.org/docs/current/libpq-envars.html.\n_PG_CONNECTION_STRINGS = {\n    'host': 'PGHOST',\n    'hostaddr': 'PGHOSTADDR',\n    'port': 'PGPORT',\n    'dbname': 'PGDATABASE',\n    'user': 'PGUSER',\n    'password': 'PGPASSWORD',\n    'passfile': 'PGPASSFILE',\n    'channel_binding': 'PGCHANNELBINDING',\n    'service': 'PGSERVICE',\n    'options': 'PGOPTIONS',\n    'application_name': 'PGAPPNAME',\n    'sslmode': 'PGSSLMODE',\n    'requiressl': 'PGREQUIRESSL',\n    'sslcompression': 'PGSSLCOMPRESSION',\n    'sslcert': 'PGSSLCERT',\n    'sslkey': 'PGSSLKEY',\n    'sslrootcert': 'PGSSLROOTCERT',\n    'sslcrl': 'PGSSLCRL',\n    'requirepeer': 'PGREQUIREPEER',\n    'ssl_min_protocol_version': 'PGSSLMINPROTOCOLVERSION',\n    'ssl_max_protocol_version': 'PGSSLMAXPROTOCOLVERSION',\n    'gssencmode': 'PGGSSENCMODE',\n    'krbsrvname': 'PGKRBSRVNAME',\n    'gsslib': 'PGGSSLIB',\n    'connect_timeout': 'PGCONNECT_TIMEOUT',\n    'target_session_attrs': 'PGTARGETSESSIONATTRS',\n}\n\n\ndef get_pg_env(dsn: str,\n               base_env: Optional[SysEnv] = None) -> Dict[str, str]:\n    \"\"\" Return a copy of `base_env` with the environment variables for\n        PostgreSQL set up from the given database connection string.\n        If `base_env` is None, then the OS environment is used as a base\n        environment.\n    \"\"\"\n    env = dict(base_env if base_env is not None else os.environ)\n\n    for param, value in psycopg.conninfo.conninfo_to_dict(dsn).items():\n        if param in _PG_CONNECTION_STRINGS:\n            env[_PG_CONNECTION_STRINGS[param]] = str(value)\n        else:\n            LOG.error(\"Unknown connection parameter '%s' ignored.\", param)\n\n    return env\n\n\nasync def run_async_query(dsn: str, query: psycopg.abc.Query) -> None:\n    \"\"\" Open a connection to the database and run a single query\n        asynchronously.\n    \"\"\"\n    async with await psycopg.AsyncConnection.connect(dsn) as aconn:\n        await aconn.execute(query)\n"
  },
  {
    "path": "src/nominatim_db/db/properties.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nQuery and access functions for the in-database property table.\n\"\"\"\nfrom typing import Optional, cast\n\nfrom .connection import Connection, table_exists\n\n\ndef set_property(conn: Connection, name: str, value: str) -> None:\n    \"\"\" Add or replace the property with the given name.\n    \"\"\"\n    with conn.cursor() as cur:\n        cur.execute('SELECT value FROM nominatim_properties WHERE property = %s',\n                    (name, ))\n\n        if cur.rowcount == 0:\n            sql = 'INSERT INTO nominatim_properties (value, property) VALUES (%s, %s)'\n        else:\n            sql = 'UPDATE nominatim_properties SET value = %s WHERE property = %s'\n\n        cur.execute(sql, (value, name))\n    conn.commit()\n\n\ndef get_property(conn: Connection, name: str) -> Optional[str]:\n    \"\"\" Return the current value of the given property or None if the property\n        is not set.\n    \"\"\"\n    if not table_exists(conn, 'nominatim_properties'):\n        return None\n\n    with conn.cursor() as cur:\n        cur.execute('SELECT value FROM nominatim_properties WHERE property = %s',\n                    (name, ))\n\n        if cur.rowcount == 0:\n            return None\n\n        result = cur.fetchone()\n        assert result is not None\n\n        return cast(Optional[str], result[0])\n"
  },
  {
    "path": "src/nominatim_db/db/query_pool.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nA connection pool that executes incoming queries in parallel.\n\"\"\"\nfrom typing import Any, Tuple, Optional\nimport asyncio\nimport logging\nimport time\n\nimport psycopg\n\nLOG = logging.getLogger()\n\nQueueItem = Optional[Tuple[psycopg.abc.Query, Any]]\n\n\nclass QueryPool:\n    \"\"\" Pool to run SQL queries in parallel asynchronous execution.\n\n        All queries are run in autocommit mode. If parallel execution leads\n        to a deadlock, then the query is repeated.\n        The results of the queries is discarded.\n    \"\"\"\n    def __init__(self, dsn: str, pool_size: int = 1, **conn_args: Any) -> None:\n        self.is_cancelled = False\n        self.wait_time = 0.0\n        self.query_queue: 'asyncio.Queue[QueueItem]' = asyncio.Queue(maxsize=2 * pool_size)\n\n        self.pool = [asyncio.create_task(self._worker_loop_cancellable(dsn, **conn_args))\n                     for _ in range(pool_size)]\n\n    async def put_query(self, query: psycopg.abc.Query, params: Any) -> None:\n        \"\"\" Schedule a query for execution.\n        \"\"\"\n        if self.is_cancelled:\n            self.clear_queue()\n            await self.finish()\n            return\n\n        tstart = time.time()\n        await self.query_queue.put((query, params))\n        self.wait_time += time.time() - tstart\n        await asyncio.sleep(0)\n\n        if self.is_cancelled:\n            self.clear_queue()\n            await self.finish()\n\n    async def finish(self) -> None:\n        \"\"\" Wait for all queries to finish and close the pool.\n        \"\"\"\n        for _ in self.pool:\n            await self.query_queue.put(None)\n\n        tstart = time.time()\n        await asyncio.wait(self.pool)\n        self.wait_time += time.time() - tstart\n\n        for task in self.pool:\n            excp = task.exception()\n            if excp is not None:\n                raise excp\n\n    def clear_queue(self) -> None:\n        \"\"\" Drop all items silently that might still be queued.\n        \"\"\"\n        try:\n            while True:\n                self.query_queue.get_nowait()\n        except asyncio.QueueEmpty:\n            pass  # expected\n\n    async def _worker_loop_cancellable(self, dsn: str, **conn_args: Any) -> None:\n        try:\n            await self._worker_loop(dsn, **conn_args)\n        except Exception as e:\n            # Make sure the exception is forwarded to the main function\n            self.is_cancelled = True\n            # clear the queue here to ensure that any put() that may be blocked returns\n            self.clear_queue()\n            raise e\n\n    async def _worker_loop(self, dsn: str, **conn_args: Any) -> None:\n        conn_args['autocommit'] = True\n        aconn = await psycopg.AsyncConnection.connect(dsn, **conn_args)\n        async with aconn:\n            async with aconn.cursor() as cur:\n                item = await self.query_queue.get()\n                while item is not None:\n                    try:\n                        if item[1] is None:\n                            await cur.execute(item[0])\n                        else:\n                            await cur.execute(item[0], item[1])\n\n                        item = await self.query_queue.get()\n                    except psycopg.errors.DeadlockDetected:\n                        assert item is not None\n                        LOG.info(\"Deadlock detected (sql = %s, params = %s), retry.\",\n                                 str(item[0]), str(item[1]))\n                        # item is still valid here, causing a retry\n\n    async def __aenter__(self) -> 'QueryPool':\n        return self\n\n    async def __aexit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None:\n        await self.finish()\n"
  },
  {
    "path": "src/nominatim_db/db/sql_preprocessor.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nPreprocessing of SQL files.\n\"\"\"\nfrom typing import Set, Dict, Any, cast\nimport re\n\nimport jinja2\n\nfrom .connection import Connection\nfrom ..config import Configuration\nfrom ..db.query_pool import QueryPool\n\n\ndef _get_partitions(conn: Connection) -> Set[int]:\n    \"\"\" Get the set of partitions currently in use.\n    \"\"\"\n    with conn.cursor() as cur:\n        cur.execute('SELECT DISTINCT partition FROM country_name')\n        partitions = set([0])\n        for row in cur:\n            partitions.add(row[0])\n\n    return partitions\n\n\ndef _get_tables(conn: Connection) -> Set[str]:\n    \"\"\" Return the set of tables currently in use.\n    \"\"\"\n    with conn.cursor() as cur:\n        cur.execute(\"SELECT tablename FROM pg_tables WHERE schemaname = 'public'\")\n\n        # paranoia check: make sure we don't get table names that cause\n        # an SQL injection later\n        return {row[0] for row in list(cur) if re.fullmatch(r'\\w+', row[0])}\n\n\ndef _get_middle_db_format(conn: Connection, tables: Set[str]) -> str:\n    \"\"\" Returns the version of the slim middle tables.\n    \"\"\"\n    if 'osm2pgsql_properties' not in tables:\n        return '1'\n\n    with conn.cursor() as cur:\n        cur.execute(\"SELECT value FROM osm2pgsql_properties WHERE property = 'db_format'\")\n        row = cur.fetchone()\n\n        return cast(str, row[0]) if row is not None else '1'\n\n\ndef _setup_tablespace_sql(config: Configuration) -> Dict[str, str]:\n    \"\"\" Returns a dict with tablespace expressions for the different tablespace\n        kinds depending on whether a tablespace is configured or not.\n    \"\"\"\n    out = {}\n    for subset in ('ADDRESS', 'SEARCH', 'AUX'):\n        for kind in ('DATA', 'INDEX'):\n            tspace = getattr(config, f'TABLESPACE_{subset}_{kind}')\n            if tspace:\n                tspace = f'TABLESPACE \"{tspace}\"'\n            out[f'{subset.lower()}_{kind.lower()}'] = tspace\n\n    return out\n\n\ndef _setup_postgresql_features(conn: Connection) -> Dict[str, Any]:\n    \"\"\" Set up a dictionary with various optional Postgresql/Postgis features that\n        depend on the database version.\n    \"\"\"\n    return {}\n\n\nclass SQLPreprocessor:\n    \"\"\" A environment for preprocessing SQL files from the\n        lib-sql directory.\n\n        The preprocessor provides a number of default filters and variables.\n        The variables may be overwritten when rendering an SQL file.\n\n        The preprocessing is currently based on the jinja2 templating library\n        and follows its syntax.\n    \"\"\"\n\n    def __init__(self, conn: Connection, config: Configuration) -> None:\n        self.env = jinja2.Environment(autoescape=False,\n                                      loader=jinja2.FileSystemLoader(str(config.lib_dir.sql)))\n\n        db_info: Dict[str, Any] = {}\n        db_info['partitions'] = _get_partitions(conn)\n        db_info['tables'] = _get_tables(conn)\n        db_info['reverse_only'] = 'search_name' not in db_info['tables']\n        db_info['tablespace'] = _setup_tablespace_sql(config)\n        db_info['middle_db_format'] = _get_middle_db_format(conn, db_info['tables'])\n\n        self.env.globals['config'] = config\n        self.env.globals['db'] = db_info\n        self.env.globals['postgres'] = _setup_postgresql_features(conn)\n\n    def run_string(self, conn: Connection, template: str, **kwargs: Any) -> None:\n        \"\"\" Execute the given SQL template string on the connection.\n            The keyword arguments may supply additional parameters\n            for preprocessing.\n        \"\"\"\n        sql = self.env.from_string(template).render(**kwargs)\n\n        with conn.cursor() as cur:\n            cur.execute(sql)\n        conn.commit()\n\n    def run_sql_file(self, conn: Connection, name: str, **kwargs: Any) -> None:\n        \"\"\" Execute the given SQL file on the connection. The keyword arguments\n            may supply additional parameters for preprocessing.\n        \"\"\"\n        sql = self.env.get_template(name).render(**kwargs)\n\n        with conn.cursor() as cur:\n            cur.execute(sql)\n        conn.commit()\n\n    async def run_parallel_sql_file(self, dsn: str, name: str, num_threads: int = 1,\n                                    **kwargs: Any) -> None:\n        \"\"\" Execute the given SQL files using parallel asynchronous connections.\n            The keyword arguments may supply additional parameters for\n            preprocessing.\n\n            After preprocessing the SQL code is cut at lines containing only\n            '---'. Each chunk is sent to one of the `num_threads` workers.\n        \"\"\"\n        sql = self.env.get_template(name).render(**kwargs)\n\n        parts = sql.split('\\n---\\n')\n\n        async with QueryPool(dsn, num_threads) as pool:\n            for part in parts:\n                await pool.put_query(part, None)\n"
  },
  {
    "path": "src/nominatim_db/db/status.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nAccess and helper functions for the status and status log table.\n\"\"\"\nfrom typing import Optional, Tuple\nimport datetime as dt\nimport logging\nimport re\n\nfrom .connection import Connection, table_exists, execute_scalar\nfrom ..utils.url_utils import get_url\nfrom ..errors import UsageError\n\nLOG = logging.getLogger()\nISODATE_FORMAT = '%Y-%m-%dT%H:%M:%S'\n\n\ndef compute_database_date(conn: Connection, offline: bool = False) -> dt.datetime:\n    \"\"\" Determine the date of the database from the newest object in the\n        data base.\n    \"\"\"\n    # If there is a date from osm2pgsql available, use that.\n    if table_exists(conn, 'osm2pgsql_properties'):\n        with conn.cursor() as cur:\n            cur.execute(\"\"\" SELECT value FROM osm2pgsql_properties\n                            WHERE property = 'current_timestamp' \"\"\")\n            row = cur.fetchone()\n            if row is not None:\n                return dt.datetime.strptime(row[0], \"%Y-%m-%dT%H:%M:%SZ\")\\\n                                  .replace(tzinfo=dt.timezone.utc)\n\n    if offline:\n        raise UsageError(\"Cannot determine database date from data in offline mode.\")\n\n    # Else, find the node with the highest ID in the database\n    if table_exists(conn, 'place'):\n        osmid = execute_scalar(conn, \"SELECT max(osm_id) FROM place WHERE osm_type='N'\")\n    else:\n        osmid = execute_scalar(conn, \"SELECT max(osm_id) FROM placex WHERE osm_type='N'\")\n\n    if osmid is None:\n        LOG.fatal(\"No data found in the database.\")\n        raise UsageError(\"No data found in the database.\")\n\n    LOG.info(\"Using node id %d for timestamp lookup\", osmid)\n    # Get the node from the API to find the timestamp when it was created.\n    node_url = f'https://www.openstreetmap.org/api/0.6/node/{osmid}/1'\n    data = get_url(node_url)\n\n    match = re.search(r'timestamp=\"((\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2}))Z\"', data)\n\n    if match is None:\n        LOG.fatal(\"The node data downloaded from the API does not contain valid data.\\n\"\n                  \"URL used: %s\", node_url)\n        raise UsageError(\"Bad API data.\")\n\n    LOG.debug(\"Found timestamp %s\", match.group(1))\n\n    return dt.datetime.strptime(match.group(1), ISODATE_FORMAT).replace(tzinfo=dt.timezone.utc)\n\n\ndef set_status(conn: Connection, date: Optional[dt.datetime],\n               seq: Optional[int] = None, indexed: bool = True) -> None:\n    \"\"\" Replace the current status with the given status. If date is `None`\n        then only sequence and indexed will be updated as given. Otherwise\n        the whole status is replaced.\n        The change will be committed to the database.\n    \"\"\"\n    assert date is None or date.tzinfo == dt.timezone.utc\n    with conn.cursor() as cur:\n        if date is None:\n            cur.execute(\"UPDATE import_status set sequence_id = %s, indexed = %s\",\n                        (seq, indexed))\n        else:\n            cur.execute(\"TRUNCATE TABLE import_status\")\n            cur.execute(\"\"\"INSERT INTO import_status (lastimportdate, sequence_id, indexed)\n                           VALUES (%s, %s, %s)\"\"\", (date, seq, indexed))\n\n    conn.commit()\n\n\ndef get_status(conn: Connection) -> Tuple[Optional[dt.datetime], Optional[int], Optional[bool]]:\n    \"\"\" Return the current status as a triple of (date, sequence, indexed).\n        If status has not been set up yet, a triple of None is returned.\n    \"\"\"\n    with conn.cursor() as cur:\n        cur.execute(\"SELECT * FROM import_status LIMIT 1\")\n        if cur.rowcount < 1:\n            return None, None, None\n\n        row = cur.fetchone()\n        assert row\n        return row.lastimportdate, row.sequence_id, row.indexed\n\n\ndef set_indexed(conn: Connection, state: bool) -> None:\n    \"\"\" Set the indexed flag in the status table to the given state.\n    \"\"\"\n    with conn.cursor() as cur:\n        cur.execute(\"UPDATE import_status SET indexed = %s\", (state, ))\n    conn.commit()\n\n\ndef log_status(conn: Connection, start: dt.datetime,\n               event: str, batchsize: Optional[int] = None) -> None:\n    \"\"\" Write a new status line to the `import_osmosis_log` table.\n    \"\"\"\n    with conn.cursor() as cur:\n        cur.execute(\"\"\"INSERT INTO import_osmosis_log\n                       (batchend, batchseq, batchsize, starttime, endtime, event)\n                       SELECT lastimportdate, sequence_id, %s, %s, now(), %s FROM import_status\"\"\",\n                    (batchsize, start, event))\n    conn.commit()\n"
  },
  {
    "path": "src/nominatim_db/db/utils.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nHelper functions for handling DB accesses.\n\"\"\"\nfrom typing import IO, Optional, Union\nimport subprocess\nimport logging\nimport gzip\nfrom pathlib import Path\n\nfrom .connection import get_pg_env\nfrom ..errors import UsageError\n\nLOG = logging.getLogger()\n\n\ndef _pipe_to_proc(proc: 'subprocess.Popen[bytes]',\n                  fdesc: Union[IO[bytes], gzip.GzipFile]) -> int:\n    assert proc.stdin is not None\n    chunk = fdesc.read(2048)\n    while chunk and proc.poll() is None:\n        try:\n            proc.stdin.write(chunk)\n        except BrokenPipeError as exc:\n            raise UsageError(\"Failed to execute SQL file.\") from exc\n        chunk = fdesc.read(2048)\n\n    return len(chunk)\n\n\ndef execute_file(dsn: str, fname: Path,\n                 ignore_errors: bool = False,\n                 pre_code: Optional[str] = None,\n                 post_code: Optional[str] = None) -> None:\n    \"\"\" Read an SQL file and run its contents against the given database\n        using psql. Use `pre_code` and `post_code` to run extra commands\n        before or after executing the file. The commands are run within the\n        same session, so they may be used to wrap the file execution in a\n        transaction.\n    \"\"\"\n    cmd = ['psql']\n    if not ignore_errors:\n        cmd.extend(('-v', 'ON_ERROR_STOP=1'))\n    if not LOG.isEnabledFor(logging.INFO):\n        cmd.append('--quiet')\n\n    with subprocess.Popen(cmd, env=get_pg_env(dsn), stdin=subprocess.PIPE) as proc:\n        assert proc.stdin is not None\n        try:\n            if not LOG.isEnabledFor(logging.INFO):\n                proc.stdin.write('set client_min_messages to WARNING;'.encode('utf-8'))\n\n            if pre_code:\n                proc.stdin.write((pre_code + ';').encode('utf-8'))\n\n            if fname.suffix == '.gz':\n                with gzip.open(str(fname), 'rb') as fdesc:\n                    remain = _pipe_to_proc(proc, fdesc)\n            else:\n                with fname.open('rb') as fdesc:\n                    remain = _pipe_to_proc(proc, fdesc)\n\n            if remain == 0 and post_code:\n                proc.stdin.write((';' + post_code).encode('utf-8'))\n        finally:\n            proc.stdin.close()\n            ret = proc.wait()\n\n    if ret != 0 or remain > 0:\n        raise UsageError(\"Failed to execute SQL file.\")\n"
  },
  {
    "path": "src/nominatim_db/errors.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nCustom exception and error classes for Nominatim.\n\"\"\"\n\n\nclass UsageError(Exception):\n    \"\"\" An error raised because of bad user input. This error will usually\n        not cause a stack trace to be printed unless debugging is enabled.\n    \"\"\"\n"
  },
  {
    "path": "src/nominatim_db/indexer/__init__.py",
    "content": ""
  },
  {
    "path": "src/nominatim_db/indexer/indexer.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nMain work horse for indexing (computing addresses) the database.\n\"\"\"\nfrom typing import cast, List, Any, Optional\nimport logging\nimport time\n\nimport psycopg\n\nfrom ..db.connection import connect, execute_scalar\nfrom ..db.query_pool import QueryPool\nfrom ..tokenizer.base import AbstractTokenizer\nfrom .progress import ProgressLogger\nfrom . import runners\n\nLOG = logging.getLogger()\n\n\nclass Indexer:\n    \"\"\" Main indexing routine.\n    \"\"\"\n\n    def __init__(self, dsn: str, tokenizer: AbstractTokenizer, num_threads: int):\n        self.dsn = dsn\n        self.tokenizer = tokenizer\n        self.num_threads = num_threads\n\n    def has_pending(self, minrank: int = 0, maxrank: int = 30) -> bool:\n        \"\"\" Check if any data still needs indexing.\n            This function must only be used after the import has finished.\n            Otherwise it will be very expensive.\n        \"\"\"\n        with connect(self.dsn) as conn:\n            with conn.cursor() as cur:\n                cur.execute(\"\"\" SELECT 'a'\n                                  FROM placex\n                                 WHERE rank_address BETWEEN %s AND %s\n                                   AND indexed_status > 0\n                                 LIMIT 1\"\"\",\n                            (minrank, maxrank))\n                return cur.rowcount > 0\n\n    async def index_full(self, analyse: bool = True) -> None:\n        \"\"\" Index the complete database. This will first index boundaries\n            followed by all other objects. When `analyse` is True, then the\n            database will be analysed at the appropriate places to\n            ensure that database statistics are updated.\n        \"\"\"\n        with connect(self.dsn) as conn:\n            conn.autocommit = True\n\n            def _analyze() -> None:\n                if analyse:\n                    with conn.cursor() as cur:\n                        cur.execute('ANALYZE')\n\n            while True:\n                if await self.index_by_rank(1, 4) > 0:\n                    _analyze()\n\n                if await self.index_boundaries() > 100:\n                    _analyze()\n\n                if await self.index_by_rank(5, 25) > 100:\n                    _analyze()\n\n                if await self.index_by_rank(26, 30) > 1000:\n                    _analyze()\n\n                # Special case: rank zero depends on the previously-indexed [1..30] ranks\n                await self.index_by_rank(0, 0)\n\n                if await self.index_postcodes() > 100:\n                    _analyze()\n\n                if not self.has_pending():\n                    break\n\n    async def index_boundaries(self, minrank: int = 0, maxrank: int = 30) -> int:\n        \"\"\" Index only administrative boundaries within the given rank range.\n        \"\"\"\n        total = 0\n        LOG.warning(\"Starting indexing boundaries using %s threads\",\n                    self.num_threads)\n\n        minrank = max(minrank, 4)\n        maxrank = min(maxrank, 25)\n\n        # Precompute number of rows to process for all rows\n        with connect(self.dsn) as conn:\n            hstore_info = psycopg.types.TypeInfo.fetch(conn, \"hstore\")\n            if hstore_info is None:\n                raise RuntimeError('Hstore extension is requested but not installed.')\n            psycopg.types.hstore.register_hstore(hstore_info)\n\n            with conn.cursor() as cur:\n                cur = conn.execute(\"\"\" SELECT rank_search, count(*)\n                                       FROM placex\n                                       WHERE rank_search between %s and %s\n                                             AND class = 'boundary' and type = 'administrative'\n                                             AND indexed_status > 0\n                                       GROUP BY rank_search\"\"\",\n                                   (minrank, maxrank))\n                total_tuples = {row.rank_search: row.count for row in cur}\n\n        with self.tokenizer.name_analyzer() as analyzer:\n            for rank in range(minrank, maxrank + 1):\n                total += await self._index(runners.BoundaryRunner(rank, analyzer),\n                                           total_tuples=total_tuples.get(rank, 0))\n\n        return total\n\n    async def index_by_rank(self, minrank: int, maxrank: int) -> int:\n        \"\"\" Index all entries of placex in the given rank range (inclusive)\n            in order of their address rank.\n\n            When rank 30 is requested then also interpolations and\n            places with address rank 0 will be indexed.\n        \"\"\"\n        total = 0\n        maxrank = min(maxrank, 30)\n        LOG.warning(\"Starting indexing rank (%i to %i) using %i threads\",\n                    minrank, maxrank, self.num_threads)\n\n        # Precompute number of rows to process for all rows\n        with connect(self.dsn) as conn:\n            hstore_info = psycopg.types.TypeInfo.fetch(conn, \"hstore\")\n            if hstore_info is None:\n                raise RuntimeError('Hstore extension is requested but not installed.')\n            psycopg.types.hstore.register_hstore(hstore_info)\n\n            with conn.cursor() as cur:\n                cur = conn.execute(\"\"\" SELECT rank_address, count(*)\n                                       FROM placex\n                                       WHERE rank_address between %s and %s\n                                             AND indexed_status > 0\n                                       GROUP BY rank_address\"\"\",\n                                   (minrank, maxrank))\n                total_tuples = {row.rank_address: row.count for row in cur}\n\n        with self.tokenizer.name_analyzer() as analyzer:\n            for rank in range(max(1, minrank), maxrank + 1):\n                if rank >= 30:\n                    batch = 20\n                elif rank >= 26:\n                    batch = 5\n                else:\n                    batch = 1\n                total += await self._index(runners.RankRunner(rank, analyzer),\n                                           batch=batch, total_tuples=total_tuples.get(rank, 0))\n\n            # Special case: rank zero depends on ranks [1..30]\n            if minrank == 0:\n                total += await self._index(runners.RankRunner(0, analyzer))\n\n            if maxrank == 30:\n                total += await self._index(runners.InterpolationRunner(analyzer), batch=20)\n\n        return total\n\n    async def index_postcodes(self) -> int:\n        \"\"\"Index the entries of the location_postcodes table.\n        \"\"\"\n        LOG.warning(\"Starting indexing postcodes using %s threads\", self.num_threads)\n\n        return await self._index(runners.PostcodeRunner(), batch=20)\n\n    def update_status_table(self) -> None:\n        \"\"\" Update the status in the status table to 'indexed'.\n        \"\"\"\n        with connect(self.dsn) as conn:\n            with conn.cursor() as cur:\n                cur.execute('UPDATE import_status SET indexed = true')\n\n            conn.commit()\n\n    async def _index(self, runner: runners.Runner, batch: int = 1,\n                     total_tuples: Optional[int] = None) -> int:\n        \"\"\" Index a single rank or table. `runner` describes the SQL to use\n            for indexing. `batch` describes the number of objects that\n            should be processed with a single SQL statement.\n\n            `total_tuples` may contain the total number of rows to process.\n            When not supplied, the value will be computed using the\n            appropriate runner function.\n        \"\"\"\n        LOG.warning(\"Starting %s (using batch size %s)\", runner.name(), batch)\n\n        if total_tuples is None:\n            total_tuples = self._prepare_indexing(runner)\n\n        progress = ProgressLogger(runner.name(), total_tuples)\n\n        if total_tuples > 0:\n            async with await psycopg.AsyncConnection.connect(\n                                 self.dsn, row_factory=psycopg.rows.dict_row) as aconn, \\\n                       QueryPool(self.dsn, self.num_threads, autocommit=True) as pool:\n                fetcher_time = 0.0\n                tstart = time.time()\n                async with aconn.cursor(name='places') as cur:\n                    query = runner.index_places_query(batch)\n                    params: List[Any] = []\n                    num_places = 0\n                    async for place in cur.stream(runner.sql_get_objects()):\n                        fetcher_time += time.time() - tstart\n\n                        params.extend(runner.index_places_params(place))\n                        num_places += 1\n\n                        if num_places >= batch:\n                            LOG.debug(\"Processing places: %s\", str(params))\n                            await pool.put_query(query, params)\n                            progress.add(num_places)\n                            params = []\n                            num_places = 0\n\n                        tstart = time.time()\n\n                if num_places > 0:\n                    await pool.put_query(runner.index_places_query(num_places), params)\n\n            LOG.info(\"Wait time: fetcher: %.2fs,  pool: %.2fs\",\n                     fetcher_time, pool.wait_time)\n\n        return progress.done()\n\n    def _prepare_indexing(self, runner: runners.Runner) -> int:\n        with connect(self.dsn) as conn:\n            hstore_info = psycopg.types.TypeInfo.fetch(conn, \"hstore\")\n            if hstore_info is None:\n                raise RuntimeError('Hstore extension is requested but not installed.')\n            psycopg.types.hstore.register_hstore(hstore_info)\n\n            total_tuples = execute_scalar(conn, runner.sql_count_objects())\n            LOG.debug(\"Total number of rows: %i\", total_tuples)\n        return cast(int, total_tuples)\n"
  },
  {
    "path": "src/nominatim_db/indexer/progress.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nHelpers for progress logging.\n\"\"\"\nimport logging\nfrom datetime import datetime\n\nLOG = logging.getLogger()\n\nINITIAL_PROGRESS = 10\n\n\nclass ProgressLogger:\n    \"\"\" Tracks and prints progress for the indexing process.\n        `name` is the name of the indexing step being tracked.\n        `total` sets up the total number of items that need processing.\n        `log_interval` denotes the interval in seconds at which progress\n        should be reported.\n    \"\"\"\n\n    def __init__(self, name: str, total: int, log_interval: int = 1) -> None:\n        self.name = name\n        self.total_places = total\n        self.done_places = 0\n        self.rank_start_time = datetime.now()\n        self.log_interval = log_interval\n        self.next_info = INITIAL_PROGRESS if LOG.isEnabledFor(logging.WARNING) else total + 1\n\n    def add(self, num: int = 1) -> None:\n        \"\"\" Mark `num` places as processed. Print a log message if the\n            logging is at least info and the log interval has passed.\n        \"\"\"\n        self.done_places += num\n\n        if self.done_places < self.next_info:\n            return\n\n        now = datetime.now()\n        done_time = (now - self.rank_start_time).total_seconds()\n\n        if done_time < 2:\n            self.next_info = self.done_places + INITIAL_PROGRESS\n            return\n\n        places_per_sec = self.done_places / done_time\n        eta = (self.total_places - self.done_places) / places_per_sec\n\n        LOG.warning(\"Done %d in %.0f @ %.3f per second - %s ETA (seconds): %.2f\",\n                    self.done_places, done_time,\n                    places_per_sec, self.name, eta)\n\n        self.next_info += int(places_per_sec) * self.log_interval\n\n    def done(self) -> int:\n        \"\"\" Print final statistics about the progress.\n        \"\"\"\n        rank_end_time = datetime.now()\n\n        if rank_end_time == self.rank_start_time:\n            diff_seconds = 0.0\n            places_per_sec = float(self.done_places)\n        else:\n            diff_seconds = (rank_end_time - self.rank_start_time).total_seconds()\n            places_per_sec = self.done_places / diff_seconds\n\n        LOG.warning(\"Done %d/%d in %.0f @ %.3f per second - FINISHED %s\\n\",\n                    self.done_places, self.total_places, diff_seconds,\n                    places_per_sec, self.name)\n\n        return self.done_places\n"
  },
  {
    "path": "src/nominatim_db/indexer/runners.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nMix-ins that provide the actual commands for the indexer for various indexing\ntasks.\n\"\"\"\nfrom typing import Any, Sequence\n\nfrom psycopg import sql as pysql\nfrom psycopg.abc import Query\nfrom psycopg.rows import DictRow\nfrom psycopg.types.json import Json\n\nfrom ..typing import Protocol\nfrom ..data.place_info import PlaceInfo\nfrom ..tokenizer.base import AbstractAnalyzer\n\n\ndef _mk_valuelist(template: str, num: int) -> pysql.Composed:\n    return pysql.SQL(',').join([pysql.SQL(template)] * num)\n\n\ndef _analyze_place(place: DictRow, analyzer: AbstractAnalyzer) -> Json:\n    return Json(analyzer.process_place(PlaceInfo(place)))\n\n\nclass Runner(Protocol):\n    def name(self) -> str: ...\n    def sql_count_objects(self) -> Query: ...\n    def sql_get_objects(self) -> Query: ...\n    def index_places_query(self, batch_size: int) -> Query: ...\n    def index_places_params(self, place: DictRow) -> Sequence[Any]: ...\n\n\nSELECT_SQL = pysql.SQL(\"\"\"SELECT place_id, extra.*\n                          FROM (SELECT * FROM placex {}) as px,\n                          LATERAL placex_indexing_prepare(px) as extra \"\"\")\nUPDATE_LINE = \"(%s, %s::hstore, %s::hstore, %s::int, %s::jsonb)\"\n\n\nclass AbstractPlacexRunner:\n    \"\"\" Returns SQL commands for indexing of the placex table.\n    \"\"\"\n\n    def __init__(self, rank: int, analyzer: AbstractAnalyzer) -> None:\n        self.rank = rank\n        self.analyzer = analyzer\n\n    def index_places_query(self, batch_size: int) -> Query:\n        return pysql.SQL(\n            \"\"\" UPDATE placex\n                SET indexed_status = 0, address = v.addr, token_info = v.ti,\n                    name = v.name, linked_place_id = v.linked_place_id\n                FROM (VALUES {}) as v(id, name, addr, linked_place_id, ti)\n                WHERE place_id = v.id\n            \"\"\").format(_mk_valuelist(UPDATE_LINE, batch_size))\n\n    def index_places_params(self, place: DictRow) -> Sequence[Any]:\n        return (place['place_id'],\n                place['name'],\n                place['address'],\n                place['linked_place_id'],\n                _analyze_place(place, self.analyzer))\n\n\nclass RankRunner(AbstractPlacexRunner):\n    \"\"\" Returns SQL commands for indexing one rank within the placex table.\n    \"\"\"\n\n    def name(self) -> str:\n        return f\"rank {self.rank}\"\n\n    def sql_count_objects(self) -> pysql.Composed:\n        return pysql.SQL(\"\"\"SELECT count(*) FROM placex\n                            WHERE rank_address = {} and indexed_status > 0\n                         \"\"\").format(pysql.Literal(self.rank))\n\n    def sql_get_objects(self) -> pysql.Composed:\n        return SELECT_SQL.format(pysql.SQL(\n                \"\"\"WHERE placex.indexed_status > 0 and placex.rank_address = {}\n                   ORDER BY placex.geometry_sector\n                \"\"\").format(pysql.Literal(self.rank)))\n\n\nclass BoundaryRunner(AbstractPlacexRunner):\n    \"\"\" Returns SQL commands for indexing the administrative boundaries\n        of a certain rank.\n    \"\"\"\n\n    def name(self) -> str:\n        return f\"boundaries rank {self.rank}\"\n\n    def sql_count_objects(self) -> Query:\n        return pysql.SQL(\"\"\"SELECT count(*) FROM placex\n                            WHERE indexed_status > 0\n                              AND rank_search = {}\n                              AND class = 'boundary' and type = 'administrative'\n                         \"\"\").format(pysql.Literal(self.rank))\n\n    def sql_get_objects(self) -> Query:\n        return SELECT_SQL.format(pysql.SQL(\n                \"\"\"WHERE placex.indexed_status > 0 and placex.rank_search = {}\n                         and placex.class = 'boundary' and placex.type = 'administrative'\n                   ORDER BY placex.partition, placex.admin_level\n                \"\"\").format(pysql.Literal(self.rank)))\n\n\nclass InterpolationRunner:\n    \"\"\" Returns SQL commands for indexing the address interpolation table\n        location_property_osmline.\n    \"\"\"\n\n    def __init__(self, analyzer: AbstractAnalyzer) -> None:\n        self.analyzer = analyzer\n\n    def name(self) -> str:\n        return \"interpolation lines (location_property_osmline)\"\n\n    def sql_count_objects(self) -> Query:\n        return \"\"\"SELECT count(*) FROM location_property_osmline\n                  WHERE indexed_status > 0\"\"\"\n\n    def sql_get_objects(self) -> Query:\n        return \"\"\"SELECT place_id, get_interpolation_address(address, osm_id) as address\n                  FROM location_property_osmline\n                  WHERE indexed_status > 0\n                  ORDER BY geometry_sector\"\"\"\n\n    def index_places_query(self, batch_size: int) -> Query:\n        return pysql.SQL(\"\"\"UPDATE location_property_osmline\n                            SET indexed_status = 0, address = v.addr, token_info = v.ti\n                            FROM (VALUES {}) as v(id, addr, ti)\n                            WHERE place_id = v.id\n                         \"\"\").format(_mk_valuelist(\"(%s, %s::hstore, %s::jsonb)\", batch_size))\n\n    def index_places_params(self, place: DictRow) -> Sequence[Any]:\n        return (place['place_id'], place['address'],\n                _analyze_place(place, self.analyzer))\n\n\nclass PostcodeRunner(Runner):\n    \"\"\" Provides the SQL commands for indexing the location_postcodes table.\n    \"\"\"\n\n    def name(self) -> str:\n        return \"postcodes (location_postcodes)\"\n\n    def sql_count_objects(self) -> Query:\n        return 'SELECT count(*) FROM location_postcodes WHERE indexed_status > 0'\n\n    def sql_get_objects(self) -> Query:\n        return \"\"\"SELECT place_id FROM location_postcodes\n                  WHERE indexed_status > 0\n                  ORDER BY country_code, postcode\"\"\"\n\n    def index_places_query(self, batch_size: int) -> Query:\n        return pysql.SQL(\"\"\"UPDATE location_postcodes SET indexed_status = 0\n                                    WHERE place_id IN ({})\"\"\")\\\n                    .format(pysql.SQL(',').join((pysql.Placeholder() for _ in range(batch_size))))\n\n    def index_places_params(self, place: DictRow) -> Sequence[Any]:\n        return (place['place_id'], )\n"
  },
  {
    "path": "src/nominatim_db/paths.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nPath settings for extra data used by Nominatim.\n\"\"\"\nfrom pathlib import Path\n\nSQLLIB_DIR = (Path(__file__) / '..' / '..' / '..' / 'lib-sql').resolve()\nLUALIB_DIR = (Path(__file__) / '..' / '..' / '..' / 'lib-lua').resolve()\nDATA_DIR = (Path(__file__) / '..' / '..' / '..' / 'data').resolve()\nCONFIG_DIR = (Path(__file__) / '..' / '..' / '..' / 'settings').resolve()\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/__init__.py",
    "content": ""
  },
  {
    "path": "src/nominatim_db/tokenizer/base.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nAbstract class definitions for tokenizers. These base classes are here\nmainly for documentation purposes.\n\"\"\"\nfrom abc import ABC, abstractmethod\nfrom typing import List, Tuple, Dict, Any, Optional, Iterable\n\nfrom ..typing import Protocol\nfrom ..config import Configuration\nfrom ..db.connection import Connection\nfrom ..data.place_info import PlaceInfo\n\n\nclass AbstractAnalyzer(ABC):\n    \"\"\" The analyzer provides the functions for analysing names and building\n        the token database.\n\n        Analyzers are instantiated on a per-thread base. Access to global data\n        structures must be synchronised accordingly.\n    \"\"\"\n\n    def __enter__(self) -> 'AbstractAnalyzer':\n        return self\n\n    def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None:\n        self.close()\n\n    @abstractmethod\n    def close(self) -> None:\n        \"\"\" Free all resources used by the analyzer.\n        \"\"\"\n\n    @abstractmethod\n    def get_word_token_info(self, words: List[str]) -> List[Tuple[str, str, Optional[int]]]:\n        \"\"\" Return token information for the given list of words.\n\n            The function is used for testing and debugging only\n            and does not need to be particularly efficient.\n\n            Arguments:\n                words: A list of words to look up the tokens for.\n                       If a word starts with # it is assumed to be a full name\n                       otherwise is a partial term.\n\n            Returns:\n                The function returns the list of all tuples that could be\n                    found for the given words. Each list entry is a tuple of\n                    (original word, word token, word id).\n        \"\"\"\n\n    @abstractmethod\n    def normalize_postcode(self, postcode: str) -> str:\n        \"\"\" Convert the postcode to its standardized form.\n\n            This function must yield exactly the same result as the SQL function\n            `token_normalized_postcode()`.\n\n            Arguments:\n                postcode: The postcode to be normalized.\n\n            Returns:\n                The given postcode after normalization.\n        \"\"\"\n\n    @abstractmethod\n    def update_postcodes_from_db(self) -> None:\n        \"\"\" Update the tokenizer's postcode tokens from the current content\n            of the `location_postcodes` table.\n        \"\"\"\n\n    @abstractmethod\n    def update_special_phrases(self,\n                               phrases: Iterable[Tuple[str, str, str, str]],\n                               should_replace: bool) -> None:\n        \"\"\" Update the tokenizer's special phrase tokens from the given\n            list of special phrases.\n\n            Arguments:\n                phrases: The new list of special phrases. Each entry is\n                         a tuple of (phrase, class, type, operator).\n                should_replace: If true, replace the current list of phrases.\n                                When false, just add the given phrases to the\n                                ones that already exist.\n        \"\"\"\n\n    @abstractmethod\n    def add_country_names(self, country_code: str, names: Dict[str, str]) -> None:\n        \"\"\" Add the given names to the tokenizer's list of country tokens.\n\n            Arguments:\n                country_code: two-letter country code for the country the names\n                              refer to.\n                names: Dictionary of name type to name.\n        \"\"\"\n\n    @abstractmethod\n    def process_place(self, place: PlaceInfo) -> Any:\n        \"\"\" Extract tokens for the given place and compute the\n            information to be handed to the PL/pgSQL processor for building\n            the search index.\n\n            Arguments:\n                place: Place information retrieved from the database.\n\n            Returns:\n                A JSON-serialisable structure that will be handed into\n                    the database via the `token_info` field.\n        \"\"\"\n\n\nclass AbstractTokenizer(ABC):\n    \"\"\" The tokenizer instance is the central instance of the tokenizer in\n        the system. There will only be a single instance of the tokenizer\n        active at any time.\n    \"\"\"\n\n    @abstractmethod\n    def init_new_db(self, config: Configuration, init_db: bool = True) -> None:\n        \"\"\" Set up a new tokenizer for the database.\n\n            The function should copy all necessary data into the project\n            directory or save it in the property table to make sure that\n            the tokenizer remains stable over updates.\n\n            Arguments:\n              config: Read-only object with configuration options.\n\n              init_db: When set to False, then initialisation of database\n                tables should be skipped. This option is only required for\n                migration purposes and can be safely ignored by custom\n                tokenizers.\n        \"\"\"\n\n    @abstractmethod\n    def init_from_project(self, config: Configuration) -> None:\n        \"\"\" Initialise the tokenizer from an existing database setup.\n\n            The function should load all previously saved configuration from\n            the project directory and/or the property table.\n\n            Arguments:\n              config: Read-only object with configuration options.\n        \"\"\"\n\n    @abstractmethod\n    def finalize_import(self, config: Configuration) -> None:\n        \"\"\" This function is called at the very end of an import when all\n            data has been imported and indexed. The tokenizer may create\n            at this point any additional indexes and data structures needed\n            during query time.\n\n            Arguments:\n              config: Read-only object with configuration options.\n        \"\"\"\n\n    @abstractmethod\n    def update_sql_functions(self, config: Configuration) -> None:\n        \"\"\" Update the SQL part of the tokenizer. This function is called\n            automatically on migrations or may be called explicitly by the\n            user through the `nominatim refresh --functions` command.\n\n            The tokenizer must only update the code of the tokenizer. The\n            data structures or data itself must not be changed by this function.\n\n            Arguments:\n              config: Read-only object with configuration options.\n        \"\"\"\n\n    @abstractmethod\n    def check_database(self, config: Configuration) -> Optional[str]:\n        \"\"\" Check that the database is set up correctly and ready for being\n            queried.\n\n            Arguments:\n              config: Read-only object with configuration options.\n\n            Returns:\n              If an issue was found, return an error message with the\n                  description of the issue as well as hints for the user on\n                  how to resolve the issue. If everything is okay, return `None`.\n        \"\"\"\n\n    @abstractmethod\n    def update_statistics(self, config: Configuration, threads: int = 1) -> None:\n        \"\"\" Recompute any tokenizer statistics necessary for efficient lookup.\n            This function is meant to be called from time to time by the user\n            to improve performance. However, the tokenizer must not depend on\n            it to be called in order to work.\n        \"\"\"\n\n    @abstractmethod\n    def update_word_tokens(self) -> None:\n        \"\"\" Do house-keeping on the tokenizers internal data structures.\n            Remove unused word tokens, resort data etc.\n        \"\"\"\n\n    @abstractmethod\n    def name_analyzer(self) -> AbstractAnalyzer:\n        \"\"\" Create a new analyzer for tokenizing names and queries\n            using this tokinzer. Analyzers are context managers and should\n            be used accordingly:\n\n            ```\n            with tokenizer.name_analyzer() as analyzer:\n                analyser.tokenize()\n            ```\n\n            When used outside the with construct, the caller must ensure to\n            call the close() function before destructing the analyzer.\n        \"\"\"\n\n    @abstractmethod\n    def most_frequent_words(self, conn: Connection, num: int) -> List[str]:\n        \"\"\" Return a list of the most frequent full words in the database.\n\n            Arguments:\n              conn: Open connection to the database which may be used to\n                    retrieve the words.\n              num: Maximum number of words to return.\n        \"\"\"\n\n\nclass TokenizerModule(Protocol):\n    \"\"\" Interface that must be exported by modules that implement their\n        own tokenizer.\n    \"\"\"\n\n    def create(self, dsn: str) -> AbstractTokenizer:\n        \"\"\" Factory for new tokenizers.\n        \"\"\"\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/factory.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nFunctions for creating a tokenizer or initialising the right one for an\nexisting database.\n\nA tokenizer is something that is bound to the lifetime of a database. It\ncan be chosen and configured before the initial import but then needs to\nbe used consistently when querying and updating the database.\n\nThis module provides the functions to create and configure a new tokenizer\nas well as instantiating the appropriate tokenizer for updating an existing\ndatabase.\n\"\"\"\nfrom typing import Optional\nimport logging\nimport importlib\nfrom pathlib import Path\n\nfrom ..errors import UsageError\nfrom ..db import properties\nfrom ..db.connection import connect\nfrom ..config import Configuration\nfrom ..tokenizer.base import AbstractTokenizer, TokenizerModule\n\nLOG = logging.getLogger()\n\n\ndef _import_tokenizer(name: str) -> TokenizerModule:\n    \"\"\" Load the tokenizer.py module from project directory.\n    \"\"\"\n    src_file = Path(__file__).parent / (name + '_tokenizer.py')\n    if not src_file.is_file():\n        LOG.fatal(\"No tokenizer named '%s' available. \"\n                  \"Check the setting of NOMINATIM_TOKENIZER.\", name)\n        raise UsageError('Tokenizer not found')\n\n    return importlib.import_module('nominatim_db.tokenizer.' + name + '_tokenizer')\n\n\ndef create_tokenizer(config: Configuration, init_db: bool = True,\n                     module_name: Optional[str] = None) -> AbstractTokenizer:\n    \"\"\" Create a new tokenizer as defined by the given configuration.\n\n        The tokenizer data and code is copied into the 'tokenizer' directory\n        of the project directory and the tokenizer loaded from its new location.\n    \"\"\"\n    if module_name is None:\n        module_name = config.TOKENIZER\n\n    # Import and initialize the tokenizer.\n    tokenizer_module = _import_tokenizer(module_name)\n\n    tokenizer = tokenizer_module.create(config.get_libpq_dsn())\n    tokenizer.init_new_db(config, init_db=init_db)\n\n    with connect(config.get_libpq_dsn()) as conn:\n        properties.set_property(conn, 'tokenizer', module_name)\n\n    return tokenizer\n\n\ndef get_tokenizer_for_db(config: Configuration) -> AbstractTokenizer:\n    \"\"\" Instantiate a tokenizer for an existing database.\n\n        The function looks up the appropriate tokenizer in the database\n        and initialises it.\n    \"\"\"\n    with connect(config.get_libpq_dsn()) as conn:\n        name = properties.get_property(conn, 'tokenizer')\n\n    if name is None:\n        LOG.fatal(\"Tokenizer was not set up properly. Database property missing.\")\n        raise UsageError('Cannot initialize tokenizer.')\n\n    tokenizer_module = _import_tokenizer(name)\n\n    tokenizer = tokenizer_module.create(config.get_libpq_dsn())\n    tokenizer.init_from_project(config)\n\n    return tokenizer\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/icu_rule_loader.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nHelper class to create ICU rules from a configuration file.\n\"\"\"\nfrom typing import Mapping, Any, Dict, Optional\nimport io\nimport json\nimport logging\n\nfrom icu import Transliterator\n\nfrom ..config import flatten_config_list, Configuration\nfrom ..db.properties import set_property, get_property\nfrom ..db.connection import Connection\nfrom ..errors import UsageError\nfrom .place_sanitizer import PlaceSanitizer\nfrom .icu_token_analysis import ICUTokenAnalysis\nfrom .token_analysis.base import AnalysisModule, Analyzer\nfrom ..data import country_info\n\nLOG = logging.getLogger()\n\nDBCFG_IMPORT_NORM_RULES = \"tokenizer_import_normalisation\"\nDBCFG_IMPORT_TRANS_RULES = \"tokenizer_import_transliteration\"\nDBCFG_IMPORT_ANALYSIS_RULES = \"tokenizer_import_analysis_rules\"\n\n\ndef _get_section(rules: Mapping[str, Any], section: str) -> Any:\n    \"\"\" Get the section named 'section' from the rules. If the section does\n        not exist, raise a usage error with a meaningful message.\n    \"\"\"\n    if section not in rules:\n        LOG.fatal(\"Section '%s' not found in tokenizer config.\", section)\n        raise UsageError(\"Syntax error in tokenizer configuration file.\")\n\n    return rules[section]\n\n\nclass ICURuleLoader:\n    \"\"\" Compiler for ICU rules from a tokenizer configuration file.\n    \"\"\"\n\n    def __init__(self, config: Configuration) -> None:\n        self.config = config\n        rules = config.load_sub_configuration('icu_tokenizer.yaml',\n                                              config='TOKENIZER_CONFIG')\n\n        # Make sure country information is available to analyzers and sanitizers.\n        country_info.setup_country_config(config)\n\n        self.normalization_rules = self._cfg_to_icu_rules(rules, 'normalization')\n        self.transliteration_rules = self._cfg_to_icu_rules(rules, 'transliteration')\n        self.analysis_rules = _get_section(rules, 'token-analysis')\n        self._setup_analysis()\n\n        # Load optional sanitizer rule set.\n        self.sanitizer_rules = rules.get('sanitizers', [])\n\n    def load_config_from_db(self, conn: Connection) -> None:\n        \"\"\" Get previously saved parts of the configuration from the\n            database.\n        \"\"\"\n        rules = get_property(conn, DBCFG_IMPORT_NORM_RULES)\n        if rules is not None:\n            self.normalization_rules = rules\n\n        rules = get_property(conn, DBCFG_IMPORT_TRANS_RULES)\n        if rules is not None:\n            self.transliteration_rules = rules\n\n        rules = get_property(conn, DBCFG_IMPORT_ANALYSIS_RULES)\n        if rules:\n            self.analysis_rules = json.loads(rules)\n        else:\n            self.analysis_rules = []\n        self._setup_analysis()\n\n    def save_config_to_db(self, conn: Connection) -> None:\n        \"\"\" Save the part of the configuration that cannot be changed into\n            the database.\n        \"\"\"\n        set_property(conn, DBCFG_IMPORT_NORM_RULES, self.normalization_rules)\n        set_property(conn, DBCFG_IMPORT_TRANS_RULES, self.transliteration_rules)\n        set_property(conn, DBCFG_IMPORT_ANALYSIS_RULES, json.dumps(self.analysis_rules))\n\n    def make_sanitizer(self) -> PlaceSanitizer:\n        \"\"\" Create a place sanitizer from the configured rules.\n        \"\"\"\n        return PlaceSanitizer(self.sanitizer_rules, self.config)\n\n    def make_token_analysis(self) -> ICUTokenAnalysis:\n        \"\"\" Create a token analyser from the reviouly loaded rules.\n        \"\"\"\n        return ICUTokenAnalysis(self.normalization_rules,\n                                self.transliteration_rules, self.analysis)\n\n    def get_search_rules(self) -> str:\n        \"\"\" Return the ICU rules to be used during search.\n            The rules combine normalization and transliteration.\n        \"\"\"\n        # First apply the normalization rules.\n        rules = io.StringIO()\n        rules.write(self.normalization_rules)\n\n        # Then add transliteration.\n        rules.write(self.transliteration_rules)\n        return rules.getvalue()\n\n    def get_normalization_rules(self) -> str:\n        \"\"\" Return rules for normalisation of a term.\n        \"\"\"\n        return self.normalization_rules\n\n    def get_transliteration_rules(self) -> str:\n        \"\"\" Return the rules for converting a string into its asciii representation.\n        \"\"\"\n        return self.transliteration_rules\n\n    def _setup_analysis(self) -> None:\n        \"\"\" Process the rules used for creating the various token analyzers.\n        \"\"\"\n        self.analysis: Dict[Optional[str], TokenAnalyzerRule] = {}\n\n        if not isinstance(self.analysis_rules, list):\n            raise UsageError(\"Configuration section 'token-analysis' must be a list.\")\n\n        norm = Transliterator.createFromRules(\"rule_loader_normalization\",\n                                              self.normalization_rules)\n        trans = Transliterator.createFromRules(\"rule_loader_transliteration\",\n                                               self.transliteration_rules)\n\n        for section in self.analysis_rules:\n            name = section.get('id', None)\n            if name in self.analysis:\n                if name is None:\n                    LOG.fatal(\"ICU tokenizer configuration has two default token analyzers.\")\n                else:\n                    LOG.fatal(\"ICU tokenizer configuration has two token \"\n                              \"analyzers with id '%s'.\", name)\n                raise UsageError(\"Syntax error in ICU tokenizer config.\")\n            self.analysis[name] = TokenAnalyzerRule(section, norm, trans,\n                                                    self.config)\n\n    @staticmethod\n    def _cfg_to_icu_rules(rules: Mapping[str, Any], section: str) -> str:\n        \"\"\" Load an ICU ruleset from the given section. If the section is a\n            simple string, it is interpreted as a file name and the rules are\n            loaded verbatim from the given file. The filename is expected to be\n            relative to the tokenizer rule file. If the section is a list then\n            each line is assumed to be a rule. All rules are concatenated and returned.\n        \"\"\"\n        content = _get_section(rules, section)\n\n        if content is None:\n            return ''\n\n        return ';'.join(flatten_config_list(content, section)) + ';'\n\n\nclass TokenAnalyzerRule:\n    \"\"\" Factory for a single analysis module. The class saves the configuration\n        and creates a new token analyzer on request.\n    \"\"\"\n\n    def __init__(self, rules: Mapping[str, Any],\n                 normalizer: Any, transliterator: Any,\n                 config: Configuration) -> None:\n        analyzer_name = _get_section(rules, 'analyzer')\n        if not analyzer_name or not isinstance(analyzer_name, str):\n            raise UsageError(\"'analyzer' parameter needs to be simple string\")\n\n        self._analysis_mod: AnalysisModule = \\\n            config.load_plugin_module(analyzer_name, 'nominatim_db.tokenizer.token_analysis')\n\n        self.config = self._analysis_mod.configure(rules, normalizer,\n                                                   transliterator)\n\n    def create(self, normalizer: Any, transliterator: Any) -> Analyzer:\n        \"\"\" Create a new analyser instance for the given rule.\n        \"\"\"\n        return self._analysis_mod.create(normalizer, transliterator, self.config)\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/icu_token_analysis.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nContainer class collecting all components required to transform an OSM name\ninto a Nominatim token.\n\"\"\"\nfrom typing import Mapping, Optional, TYPE_CHECKING\nfrom icu import Transliterator\n\nfrom .token_analysis.base import Analyzer\n\nif TYPE_CHECKING:\n    from typing import Any  # noqa\n    from .icu_rule_loader import TokenAnalyzerRule\n\n\nclass ICUTokenAnalysis:\n    \"\"\" Container class collecting the transliterators and token analysis\n        modules for a single Analyser instance.\n    \"\"\"\n\n    def __init__(self, norm_rules: str, trans_rules: str,\n                 analysis_rules: Mapping[Optional[str], 'TokenAnalyzerRule']):\n        # additional break signs are not relevant during name analysis\n        norm_rules += \";[[:Space:][-:]]+ > ' ';\"\n        self.normalizer = Transliterator.createFromRules(\"icu_normalization\",\n                                                         norm_rules)\n        trans_rules += \";[:Space:]+ > ' '\"\n        self.to_ascii = Transliterator.createFromRules(\"icu_to_ascii\",\n                                                       trans_rules)\n        self.search = Transliterator.createFromRules(\"icu_search\",\n                                                     norm_rules + trans_rules)\n\n        self.analysis = {name: arules.create(self.normalizer, self.to_ascii)\n                         for name, arules in analysis_rules.items()}\n\n    def get_analyzer(self, name: Optional[str]) -> Analyzer:\n        \"\"\" Return the given named analyzer. If no analyzer with that\n            name exists, return the default analyzer.\n        \"\"\"\n        return self.analysis.get(name) or self.analysis[None]\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/icu_tokenizer.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTokenizer implementing normalisation as used before Nominatim 4 but using\nlibICU instead of the PostgreSQL module.\n\"\"\"\nfrom typing import Optional, Sequence, List, Tuple, Mapping, Any, cast, \\\n                   Dict, Set, Iterable\nimport itertools\nimport logging\n\nfrom psycopg.types.json import Jsonb\nfrom psycopg import sql as pysql\n\nfrom ..db.connection import connect, Connection, Cursor, \\\n                            drop_tables, table_exists, execute_scalar\nfrom ..config import Configuration\nfrom ..db.sql_preprocessor import SQLPreprocessor\nfrom ..data.place_info import PlaceInfo\nfrom ..data.place_name import PlaceName\nfrom .icu_rule_loader import ICURuleLoader\nfrom .place_sanitizer import PlaceSanitizer\nfrom .icu_token_analysis import ICUTokenAnalysis\nfrom .base import AbstractAnalyzer, AbstractTokenizer\n\nDBCFG_TERM_NORMALIZATION = \"tokenizer_term_normalization\"\n\nLOG = logging.getLogger()\n\nWORD_TYPES = (('country_names', 'C'),\n              ('postcodes', 'P'),\n              ('full_word', 'W'),\n              ('housenumbers', 'H'))\n\n\ndef create(dsn: str) -> 'ICUTokenizer':\n    \"\"\" Create a new instance of the tokenizer provided by this module.\n    \"\"\"\n    return ICUTokenizer(dsn)\n\n\nclass ICUTokenizer(AbstractTokenizer):\n    \"\"\" This tokenizer uses libICU to convert names and queries to ASCII.\n        Otherwise it uses the same algorithms and data structures as the\n        normalization routines in Nominatim 3.\n    \"\"\"\n\n    def __init__(self, dsn: str) -> None:\n        self.dsn = dsn\n        self.loader: Optional[ICURuleLoader] = None\n\n    def init_new_db(self, config: Configuration, init_db: bool = True) -> None:\n        \"\"\" Set up a new tokenizer for the database.\n\n            This copies all necessary data in the project directory to make\n            sure the tokenizer remains stable even over updates.\n        \"\"\"\n        self.loader = ICURuleLoader(config)\n\n        self._save_config()\n\n        if init_db:\n            self.update_sql_functions(config)\n            self._setup_db_tables(config)\n            self._create_base_indices(config, 'word')\n\n    def init_from_project(self, config: Configuration) -> None:\n        \"\"\" Initialise the tokenizer from the project directory.\n        \"\"\"\n        self.loader = ICURuleLoader(config)\n\n        with connect(self.dsn) as conn:\n            self.loader.load_config_from_db(conn)\n\n    def finalize_import(self, config: Configuration) -> None:\n        \"\"\" Do any required postprocessing to make the tokenizer data ready\n            for use.\n        \"\"\"\n        self._create_lookup_indices(config, 'word')\n\n    def update_sql_functions(self, config: Configuration) -> None:\n        \"\"\" Reimport the SQL functions for this tokenizer.\n        \"\"\"\n        with connect(self.dsn) as conn:\n            sqlp = SQLPreprocessor(conn, config)\n            sqlp.run_sql_file(conn, 'tokenizer/icu_tokenizer.sql')\n\n    def check_database(self, config: Configuration) -> None:\n        \"\"\" Check that the tokenizer is set up correctly.\n        \"\"\"\n        # Will throw an error if there is an issue.\n        self.init_from_project(config)\n\n    def update_statistics(self, config: Configuration, threads: int = 2) -> None:\n        \"\"\" Recompute frequencies for all name words.\n        \"\"\"\n        with connect(self.dsn) as conn:\n            if not table_exists(conn, 'search_name'):\n                return\n\n            with conn.cursor() as cur:\n                cur.execute('ANALYSE search_name')\n                if threads > 1:\n                    cur.execute(pysql.SQL('SET max_parallel_workers_per_gather TO {}')\n                                     .format(pysql.Literal(min(threads, 6),)))\n\n                LOG.info('Computing word frequencies')\n                drop_tables(conn, 'word_frequencies')\n                cur.execute(\"\"\"\n                  CREATE TEMP TABLE word_frequencies AS\n                  WITH word_freq AS MATERIALIZED (\n                           SELECT unnest(name_vector) as id, count(*)\n                                 FROM search_name GROUP BY id),\n                       addr_freq AS MATERIALIZED (\n                           SELECT unnest(nameaddress_vector) as id, count(*)\n                                 FROM search_name GROUP BY id)\n                  SELECT coalesce(a.id, w.id) as id,\n                         (CASE WHEN w.count is null or w.count <= 1 THEN '{}'::JSONB\n                              ELSE jsonb_build_object('count', w.count) END\n                          ||\n                          CASE WHEN a.count is null or a.count <= 1 THEN '{}'::JSONB\n                              ELSE jsonb_build_object('addr_count', a.count) END) as info\n                  FROM word_freq w FULL JOIN addr_freq a ON a.id = w.id;\n                  \"\"\")\n                cur.execute('CREATE UNIQUE INDEX ON word_frequencies(id) INCLUDE(info)')\n                cur.execute('ANALYSE word_frequencies')\n                LOG.info('Update word table with recomputed frequencies')\n                drop_tables(conn, 'tmp_word')\n                cur.execute(\"\"\"CREATE TABLE tmp_word AS\n                                SELECT word_id, word_token, type, word,\n                                       coalesce(word.info, '{}'::jsonb)\n                                       - 'count' - 'addr_count' ||\n                                       coalesce(wf.info, '{}'::jsonb)\n                                       as info\n                                FROM word LEFT JOIN word_frequencies wf\n                                     ON word.word_id = wf.id\n                            \"\"\")\n                drop_tables(conn, 'word_frequencies')\n\n            with conn.cursor() as cur:\n                cur.execute('SET max_parallel_workers_per_gather TO 0')\n\n            sqlp = SQLPreprocessor(conn, config)\n            sqlp.run_string(conn,\n                            'GRANT SELECT ON tmp_word TO \"{{config.DATABASE_WEBUSER}}\"')\n            conn.commit()\n        self._create_base_indices(config, 'tmp_word')\n        self._create_lookup_indices(config, 'tmp_word')\n        self._move_temporary_word_table('tmp_word')\n\n    def _cleanup_housenumbers(self) -> None:\n        \"\"\" Remove unused house numbers.\n        \"\"\"\n        with connect(self.dsn) as conn:\n            if not table_exists(conn, 'search_name'):\n                return\n            with conn.cursor(name=\"hnr_counter\") as cur:\n                cur.execute(\"\"\"SELECT DISTINCT word_id, coalesce(info->>'lookup', word_token)\n                               FROM word\n                               WHERE type = 'H'\n                                 AND NOT EXISTS(SELECT * FROM search_name\n                                                WHERE ARRAY[word.word_id] && name_vector)\n                                 AND (char_length(coalesce(word, word_token)) > 6\n                                      OR coalesce(word, word_token) not similar to '\\\\d+')\n                            \"\"\")\n                candidates = {token: wid for wid, token in cur}\n            with conn.cursor(name=\"hnr_counter\") as cur:\n                cur.execute(\"\"\"SELECT housenumber FROM placex\n                               WHERE housenumber is not null\n                                     AND (char_length(housenumber) > 6\n                                          OR housenumber not similar to '\\\\d+')\n                            \"\"\")\n                for row in cur:\n                    for hnr in row[0].split(';'):\n                        candidates.pop(hnr, None)\n            LOG.info(\"There are %s outdated housenumbers.\", len(candidates))\n            LOG.debug(\"Outdated housenumbers: %s\", candidates.keys())\n            if candidates:\n                with conn.cursor() as cur:\n                    cur.execute(\"\"\"DELETE FROM word WHERE word_id = any(%s)\"\"\",\n                                (list(candidates.values()), ))\n                conn.commit()\n\n    def update_word_tokens(self) -> None:\n        \"\"\" Remove unused tokens.\n        \"\"\"\n        LOG.warning(\"Cleaning up housenumber tokens.\")\n        self._cleanup_housenumbers()\n        LOG.warning(\"Tokenizer house-keeping done.\")\n\n    def name_analyzer(self) -> 'ICUNameAnalyzer':\n        \"\"\" Create a new analyzer for tokenizing names and queries\n            using this tokinzer. Analyzers are context managers and should\n            be used accordingly:\n\n            ```\n            with tokenizer.name_analyzer() as analyzer:\n                analyser.tokenize()\n            ```\n\n            When used outside the with construct, the caller must ensure to\n            call the close() function before destructing the analyzer.\n\n            Analyzers are not thread-safe. You need to instantiate one per thread.\n        \"\"\"\n        assert self.loader is not None\n        return ICUNameAnalyzer(self.dsn, self.loader.make_sanitizer(),\n                               self.loader.make_token_analysis())\n\n    def most_frequent_words(self, conn: Connection, num: int) -> List[str]:\n        \"\"\" Return a list of the `num` most frequent full words\n            in the database.\n        \"\"\"\n        with conn.cursor() as cur:\n            cur.execute(\"\"\"SELECT word, sum((info->>'count')::int) as count\n                             FROM word WHERE type = 'W'\n                             GROUP BY word\n                             ORDER BY count DESC LIMIT %s\"\"\", (num,))\n            return list(s[0].split('@')[0] for s in cur)\n\n    def _save_config(self) -> None:\n        \"\"\" Save the configuration that needs to remain stable for the given\n            database as database properties.\n        \"\"\"\n        assert self.loader is not None\n        with connect(self.dsn) as conn:\n            self.loader.save_config_to_db(conn)\n\n    def _setup_db_tables(self, config: Configuration) -> None:\n        \"\"\" Set up the word table and fill it with pre-computed word\n            frequencies.\n        \"\"\"\n        with connect(self.dsn) as conn:\n            drop_tables(conn, 'word')\n            sqlp = SQLPreprocessor(conn, config)\n            sqlp.run_string(conn, \"\"\"\n                CREATE TABLE word (\n                      word_id INTEGER,\n                      word_token text NOT NULL,\n                      type text NOT NULL,\n                      word text,\n                      info jsonb\n                    ) {{db.tablespace.search_data}};\n                GRANT SELECT ON word TO \"{{config.DATABASE_WEBUSER}}\";\n\n                DROP SEQUENCE IF EXISTS seq_word;\n                CREATE SEQUENCE seq_word start 1;\n                GRANT SELECT ON seq_word to \"{{config.DATABASE_WEBUSER}}\";\n            \"\"\")\n            conn.commit()\n\n    def _create_base_indices(self, config: Configuration, table_name: str) -> None:\n        \"\"\" Set up the word table and fill it with pre-computed word\n            frequencies.\n        \"\"\"\n        with connect(self.dsn) as conn:\n            sqlp = SQLPreprocessor(conn, config)\n            sqlp.run_string(conn,\n                            \"\"\"CREATE INDEX idx_{{table_name}}_word_token ON {{table_name}}\n                               USING BTREE (word_token) {{db.tablespace.search_index}}\"\"\",\n                            table_name=table_name)\n            for name, ctype in WORD_TYPES:\n                sqlp.run_string(conn,\n                                \"\"\"CREATE INDEX idx_{{table_name}}_{{idx_name}} ON {{table_name}}\n                                   USING BTREE (word) {{db.tablespace.address_index}}\n                                   WHERE type = '{{column_type}}'\n                                \"\"\",\n                                table_name=table_name, idx_name=name,\n                                column_type=ctype)\n            conn.commit()\n\n    def _create_lookup_indices(self, config: Configuration, table_name: str) -> None:\n        \"\"\" Create additional indexes used when running the API.\n        \"\"\"\n        with connect(self.dsn) as conn:\n            sqlp = SQLPreprocessor(conn, config)\n            # Index required for details lookup.\n            sqlp.run_string(\n                conn,\n                \"\"\"\n                CREATE INDEX IF NOT EXISTS idx_{{table_name}}_word_id\n                  ON {{table_name}} USING BTREE (word_id) {{db.tablespace.search_index}}\n                \"\"\",\n                table_name=table_name)\n            conn.commit()\n\n    def _move_temporary_word_table(self, old: str) -> None:\n        \"\"\" Rename all tables and indexes used by the tokenizer.\n        \"\"\"\n        with connect(self.dsn) as conn:\n            drop_tables(conn, 'word')\n            with conn.cursor() as cur:\n                cur.execute(pysql.SQL(\"ALTER TABLE {} RENAME TO word\")\n                                 .format(pysql.Identifier(old)))\n                for idx in ['word_token', 'word_id'] + [n[0] for n in WORD_TYPES]:\n                    cur.execute(pysql.SQL(\"ALTER INDEX {} RENAME TO {}\")\n                                     .format(pysql.Identifier(f\"idx_{old}_{idx}\"),\n                                             pysql.Identifier(f\"idx_word_{idx}\")))\n            conn.commit()\n\n\nclass ICUNameAnalyzer(AbstractAnalyzer):\n    \"\"\" The ICU analyzer uses the ICU library for splitting names.\n\n        Each instance opens a connection to the database to request the\n        normalization.\n    \"\"\"\n\n    def __init__(self, dsn: str, sanitizer: PlaceSanitizer,\n                 token_analysis: ICUTokenAnalysis) -> None:\n        self.conn: Optional[Connection] = connect(dsn)\n        self.conn.autocommit = True\n        self.sanitizer = sanitizer\n        self.token_analysis = token_analysis\n\n        self._cache = _TokenCache()\n\n    def close(self) -> None:\n        \"\"\" Free all resources used by the analyzer.\n        \"\"\"\n        if self.conn:\n            self.conn.close()\n            self.conn = None\n\n    def _search_normalized(self, name: str) -> str:\n        \"\"\" Return the search token transliteration of the given name.\n        \"\"\"\n        return cast(str, self.token_analysis.search.transliterate(name)).strip()\n\n    def _normalized(self, name: str) -> str:\n        \"\"\" Return the normalized version of the given name with all\n            non-relevant information removed.\n        \"\"\"\n        return cast(str, self.token_analysis.normalizer.transliterate(name)).strip()\n\n    def get_word_token_info(self, words: Sequence[str]) -> List[Tuple[str, str, Optional[int]]]:\n        \"\"\" Return token information for the given list of words.\n            If a word starts with # it is assumed to be a full name\n            otherwise is a partial name.\n\n            The function returns a list of tuples with\n            (original word, word token, word id).\n\n            The function is used for testing and debugging only\n            and not necessarily efficient.\n        \"\"\"\n        assert self.conn is not None\n        full_tokens = {}\n        partial_tokens = {}\n        for word in words:\n            if word.startswith('#'):\n                full_tokens[word] = self._search_normalized(word[1:])\n            else:\n                partial_tokens[word] = self._search_normalized(word)\n\n        with self.conn.cursor() as cur:\n            cur.execute(\"\"\"SELECT word_token, word_id\n                            FROM word WHERE word_token = ANY(%s) and type = 'W'\n                        \"\"\", (list(full_tokens.values()),))\n            full_ids = {r[0]: cast(int, r[1]) for r in cur}\n            cur.execute(\"\"\"SELECT word_token, word_id\n                            FROM word WHERE word_token = ANY(%s) and type = 'w'\"\"\",\n                        (list(partial_tokens.values()),))\n            part_ids = {r[0]: cast(int, r[1]) for r in cur}\n\n        return [(k, v, full_ids.get(v, None)) for k, v in full_tokens.items()] \\\n            + [(k, v, part_ids.get(v, None)) for k, v in partial_tokens.items()]\n\n    def normalize_postcode(self, postcode: str) -> str:\n        \"\"\" Convert the postcode to a standardized form.\n\n            This function must yield exactly the same result as the SQL function\n            'token_normalized_postcode()'.\n        \"\"\"\n        return postcode.strip().upper()\n\n    def update_postcodes_from_db(self) -> None:\n        \"\"\" Postcode update.\n\n            Removes all postcodes from the word table because they are not\n            needed. Postcodes are recognised by pattern.\n        \"\"\"\n        assert self.conn is not None\n\n        with self.conn.cursor() as cur:\n            cur.execute(\"DELETE FROM word WHERE type = 'P'\")\n\n    def update_special_phrases(self, phrases: Iterable[Tuple[str, str, str, str]],\n                               should_replace: bool) -> None:\n        \"\"\" Replace the search index for special phrases with the new phrases.\n            If `should_replace` is True, then the previous set of will be\n            completely replaced. Otherwise the phrases are added to the\n            already existing ones.\n        \"\"\"\n        assert self.conn is not None\n        norm_phrases = set(((self._normalized(p[0]), p[1], p[2], p[3])\n                            for p in phrases))\n\n        with self.conn.cursor() as cur:\n            # Get the old phrases.\n            existing_phrases = set()\n            cur.execute(\"SELECT word, info FROM word WHERE type = 'S'\")\n            for word, info in cur:\n                existing_phrases.add((word, info['class'], info['type'],\n                                      info.get('op') or '-'))\n\n            added = self._add_special_phrases(cur, norm_phrases, existing_phrases)\n            if should_replace:\n                deleted = self._remove_special_phrases(cur, norm_phrases,\n                                                       existing_phrases)\n            else:\n                deleted = 0\n\n        LOG.info(\"Total phrases: %s. Added: %s. Deleted: %s\",\n                 len(norm_phrases), added, deleted)\n\n    def _add_special_phrases(self, cursor: Cursor,\n                             new_phrases: Set[Tuple[str, str, str, str]],\n                             existing_phrases: Set[Tuple[str, str, str, str]]) -> int:\n        \"\"\" Add all phrases to the database that are not yet there.\n        \"\"\"\n        to_add = new_phrases - existing_phrases\n\n        added = 0\n        with cursor.copy('COPY word(word_token, type, word, info) FROM STDIN') as copy:\n            for word, cls, typ, oper in to_add:\n                term = self._search_normalized(word)\n                if term:\n                    copy.write_row((term, 'S', word,\n                                    Jsonb({'class': cls, 'type': typ,\n                                           'op': oper if oper in ('in', 'near') else None})))\n                    added += 1\n\n        return added\n\n    def _remove_special_phrases(self, cursor: Cursor,\n                                new_phrases: Set[Tuple[str, str, str, str]],\n                                existing_phrases: Set[Tuple[str, str, str, str]]) -> int:\n        \"\"\" Remove all phrases from the database that are no longer in the\n            new phrase list.\n        \"\"\"\n        to_delete = existing_phrases - new_phrases\n\n        if to_delete:\n            cursor.executemany(\n                \"\"\" DELETE FROM word\n                      WHERE type = 'S' and word = %s\n                            and info->>'class' = %s and info->>'type' = %s\n                            and %s = coalesce(info->>'op', '-')\n                \"\"\", to_delete)\n\n        return len(to_delete)\n\n    def add_country_names(self, country_code: str, names: Mapping[str, str]) -> None:\n        \"\"\" Add default names for the given country to the search index.\n        \"\"\"\n        # Make sure any name preprocessing for country names applies.\n        info = PlaceInfo({'name': names, 'country_code': country_code,\n                          'rank_address': 4, 'class': 'boundary',\n                          'type': 'administrative'})\n        self._add_country_full_names(country_code,\n                                     self.sanitizer.process_names(info)[0],\n                                     internal=True)\n\n    def _add_country_full_names(self, country_code: str, names: Sequence[PlaceName],\n                                internal: bool = False) -> None:\n        \"\"\" Add names for the given country from an already sanitized\n            name list.\n        \"\"\"\n        assert self.conn is not None\n        word_tokens = set()\n        for name in names:\n            norm_name = self._normalized(name.name)\n            token_name = self._search_normalized(name.name)\n            if norm_name and token_name:\n                word_tokens.add((token_name, norm_name))\n\n        with self.conn.cursor() as cur:\n            # Get existing names\n            cur.execute(\"\"\"SELECT word_token,\n                                  word as lookup,\n                                  coalesce(info ? 'internal', false) as is_internal\n                             FROM word\n                             WHERE type = 'C' and info->>'cc' = %s\"\"\",\n                        (country_code, ))\n            # internal/external names\n            existing_tokens: Dict[bool, Set[Tuple[str, str]]] = {True: set(), False: set()}\n            for word in cur:\n                existing_tokens[word[2]].add((word[0], word[1]))\n\n            # Delete names that no longer exist.\n            gone_tokens = existing_tokens[internal] - word_tokens\n            if internal:\n                gone_tokens.update(existing_tokens[False] & word_tokens)\n            if gone_tokens:\n                cur.execute(\"\"\"DELETE FROM word\n                               USING jsonb_array_elements(%s) as data\n                               WHERE type = 'C' and info->>'cc' = %s\n                                     and word_token = data->>0 and word = data->>1\"\"\",\n                            (Jsonb(list(gone_tokens)), country_code))\n\n            # Only add those names that are not yet in the list.\n            new_tokens = word_tokens - existing_tokens[True]\n            if not internal:\n                new_tokens -= existing_tokens[False]\n            if new_tokens:\n                if internal:\n                    sql = \"\"\"INSERT INTO word (word_token, type, word, info)\n                               (SELECT data->>0, 'C', data->>1,\n                                       jsonb_build_object('internal', 'yes', 'cc', %s::text)\n                                  FROM jsonb_array_elements(%s) as data)\n                           \"\"\"\n                else:\n                    sql = \"\"\"INSERT INTO word (word_token, type, word, info)\n                                   (SELECT data->>0, 'C', data->>1,\n                                           jsonb_build_object('cc', %s::text)\n                                    FROM  jsonb_array_elements(%s) as data)\n                          \"\"\"\n                cur.execute(sql, (country_code, Jsonb(list(new_tokens))))\n\n    def process_place(self, place: PlaceInfo) -> Mapping[str, Any]:\n        \"\"\" Determine tokenizer information about the given place.\n\n            Returns a JSON-serializable structure that will be handed into\n            the database via the token_info field.\n        \"\"\"\n        token_info = _TokenInfo()\n\n        names, address = self.sanitizer.process_names(place)\n\n        if names:\n            token_info.set_names(*self._compute_name_tokens(names))\n\n            if place.is_country():\n                assert place.country_code is not None\n                self._add_country_full_names(place.country_code, names)\n\n        if address:\n            self._process_place_address(token_info, address)\n\n        return token_info.to_dict()\n\n    def _process_place_address(self, token_info: '_TokenInfo',\n                               address: Sequence[PlaceName]) -> None:\n        for item in address:\n            if item.kind == 'postcode':\n                token_info.set_postcode(self._add_postcode(item))\n            elif item.kind == 'housenumber':\n                token_info.add_housenumber(*self._compute_housenumber_token(item))\n            elif item.kind == 'street':\n                token_info.add_street(self._retrieve_full_tokens(item.name))\n            elif item.kind == 'place':\n                if not item.suffix:\n                    token_info.add_place(itertools.chain(*self._compute_name_tokens([item])))\n            elif (not item.kind.startswith('_') and not item.suffix and\n                  item.kind not in ('country', 'full', 'inclusion')):\n                token_info.add_address_term(item.kind,\n                                            itertools.chain(*self._compute_name_tokens([item])))\n\n    def _compute_housenumber_token(self, hnr: PlaceName) -> Tuple[Optional[int], Optional[str]]:\n        \"\"\" Normalize the housenumber and return the word token and the\n            canonical form.\n        \"\"\"\n        assert self.conn is not None\n        analyzer = self.token_analysis.analysis.get('@housenumber')\n        result: Tuple[Optional[int], Optional[str]] = (None, None)\n\n        if analyzer is None:\n            # When no custom analyzer is set, simply normalize and transliterate\n            norm_name = self._search_normalized(hnr.name)\n            if norm_name:\n                result = self._cache.housenumbers.get(norm_name, result)\n                if result[0] is None:\n                    hid = execute_scalar(self.conn, \"SELECT getorcreate_hnr_id(%s)\", (norm_name, ))\n\n                    result = hid, norm_name\n                    self._cache.housenumbers[norm_name] = result\n        else:\n            # Otherwise use the analyzer to determine the canonical name.\n            # Per convention we use the first variant as the 'lookup name', the\n            # name that gets saved in the housenumber field of the place.\n            word_id = analyzer.get_canonical_id(hnr)\n            if word_id:\n                result = self._cache.housenumbers.get(word_id, result)\n                if result[0] is None:\n                    varout = analyzer.compute_variants(word_id)\n                    if isinstance(varout, tuple):\n                        variants = varout[0]\n                    else:\n                        variants = varout\n                    if variants:\n                        hid = execute_scalar(self.conn, \"SELECT create_analyzed_hnr_id(%s, %s)\",\n                                             (word_id, variants))\n                        result = hid, variants[0]\n                        self._cache.housenumbers[word_id] = result\n\n        return result\n\n    def _retrieve_full_tokens(self, name: str) -> List[int]:\n        \"\"\" Get the full name token for the given name, if it exists.\n            The name is only retrieved for the standard analyser.\n        \"\"\"\n        assert self.conn is not None\n        norm_name = self._search_normalized(name)\n\n        # return cached if possible\n        if norm_name in self._cache.fulls:\n            return self._cache.fulls[norm_name]\n\n        with self.conn.cursor() as cur:\n            cur.execute(\"SELECT word_id FROM word WHERE word_token = %s and type = 'W'\",\n                        (norm_name, ))\n            full = [row[0] for row in cur]\n\n        self._cache.fulls[norm_name] = full\n\n        return full\n\n    def _compute_name_tokens(self, names: Sequence[PlaceName]) -> Tuple[Set[int], Set[int]]:\n        \"\"\" Computes the full name and partial name tokens for the given\n            dictionary of names.\n        \"\"\"\n        assert self.conn is not None\n        full_tokens: Set[int] = set()\n        partial_tokens: Set[int] = set()\n\n        for name in names:\n            analyzer_id = name.get_attr('analyzer')\n            analyzer = self.token_analysis.get_analyzer(analyzer_id)\n            word_id = analyzer.get_canonical_id(name)\n            if analyzer_id is None:\n                token_id = word_id\n            else:\n                token_id = f'{word_id}@{analyzer_id}'\n\n            full, part = self._cache.names.get(token_id, (None, None))\n            if full is None:\n                varset = analyzer.compute_variants(word_id)\n                if isinstance(varset, tuple):\n                    variants, lookups = varset\n                else:\n                    variants, lookups = varset, None\n                if not variants:\n                    continue\n\n                with self.conn.cursor() as cur:\n                    cur.execute(\"SELECT * FROM getorcreate_full_word(%s, %s, %s)\",\n                                (token_id, variants, lookups))\n                    full, part = cast(Tuple[int, List[int]], cur.fetchone())\n\n                self._cache.names[token_id] = (full, part)\n\n            assert part is not None\n\n            full_tokens.add(full)\n            partial_tokens.update(part)\n\n        return full_tokens, partial_tokens\n\n    def _add_postcode(self, item: PlaceName) -> Optional[str]:\n        \"\"\" Make sure the normalized postcode is present in the word table.\n        \"\"\"\n        assert self.conn is not None\n        analyzer = self.token_analysis.analysis.get('@postcode')\n\n        if analyzer is None:\n            return item.name.strip().upper()\n        else:\n            return analyzer.get_canonical_id(item)\n\n\nclass _TokenInfo:\n    \"\"\" Collect token information to be sent back to the database.\n    \"\"\"\n    def __init__(self) -> None:\n        self.names: Optional[str] = None\n        self.housenumbers: Set[str] = set()\n        self.housenumber_tokens: Set[int] = set()\n        self.street_tokens: Optional[Set[int]] = None\n        self.place_tokens: Set[int] = set()\n        self.address_tokens: Dict[str, str] = {}\n        self.postcode: Optional[str] = None\n\n    def _mk_array(self, tokens: Iterable[Any]) -> str:\n        return f\"{{{','.join((str(s) for s in tokens))}}}\"\n\n    def to_dict(self) -> Dict[str, Any]:\n        \"\"\" Return the token information in database importable format.\n        \"\"\"\n        out: Dict[str, Any] = {}\n\n        if self.names:\n            out['names'] = self.names\n\n        if self.housenumbers:\n            out['hnr'] = ';'.join(self.housenumbers)\n            out['hnr_tokens'] = self._mk_array(self.housenumber_tokens)\n\n        if self.street_tokens is not None:\n            out['street'] = self._mk_array(self.street_tokens)\n\n        if self.place_tokens:\n            out['place'] = self._mk_array(self.place_tokens)\n\n        if self.address_tokens:\n            out['addr'] = self.address_tokens\n\n        if self.postcode:\n            out['postcode'] = self.postcode\n\n        return out\n\n    def set_names(self, fulls: Iterable[int], partials: Iterable[int]) -> None:\n        \"\"\" Adds token information for the normalised names.\n        \"\"\"\n        self.names = self._mk_array(itertools.chain(fulls, partials))\n\n    def add_housenumber(self, token: Optional[int], hnr: Optional[str]) -> None:\n        \"\"\" Extract housenumber information from a list of normalised\n            housenumbers.\n        \"\"\"\n        if token:\n            assert hnr is not None\n            self.housenumbers.add(hnr)\n            self.housenumber_tokens.add(token)\n\n    def add_street(self, tokens: Iterable[int]) -> None:\n        \"\"\" Add addr:street match terms.\n        \"\"\"\n        if self.street_tokens is None:\n            self.street_tokens = set()\n        self.street_tokens.update(tokens)\n\n    def add_place(self, tokens: Iterable[int]) -> None:\n        \"\"\" Add addr:place search and match terms.\n        \"\"\"\n        self.place_tokens.update(tokens)\n\n    def add_address_term(self, key: str, partials: Iterable[int]) -> None:\n        \"\"\" Add additional address terms.\n        \"\"\"\n        array = self._mk_array(partials)\n        if len(array) > 2:\n            self.address_tokens[key] = array\n\n    def set_postcode(self, postcode: Optional[str]) -> None:\n        \"\"\" Set the postcode to the given one.\n        \"\"\"\n        self.postcode = postcode\n\n\nclass _TokenCache:\n    \"\"\" Cache for token information to avoid repeated database queries.\n\n        This cache is not thread-safe and needs to be instantiated per\n        analyzer.\n    \"\"\"\n    def __init__(self) -> None:\n        self.names: Dict[str, Tuple[int, List[int]]] = {}\n        self.partials: Dict[str, int] = {}\n        self.fulls: Dict[str, List[int]] = {}\n        self.housenumbers: Dict[str, Tuple[Optional[int], Optional[str]]] = {}\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/place_sanitizer.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nHandler for cleaning name and address tags in place information before it\nis handed to the token analysis.\n\"\"\"\nfrom typing import Optional, List, Mapping, Sequence, Callable, Any, Tuple\n\nfrom ..errors import UsageError\nfrom ..config import Configuration\nfrom .sanitizers.config import SanitizerConfig\nfrom .sanitizers.base import SanitizerHandler, ProcessInfo\nfrom ..data.place_name import PlaceName\nfrom ..data.place_info import PlaceInfo\n\n\nclass PlaceSanitizer:\n    \"\"\" Controller class which applies sanitizer functions on the place\n        names and address before they are used by the token analysers.\n    \"\"\"\n\n    def __init__(self, rules: Optional[Sequence[Mapping[str, Any]]],\n                 config: Configuration) -> None:\n        self.handlers: List[Callable[[ProcessInfo], None]] = []\n\n        if rules:\n            for func in rules:\n                if 'step' not in func:\n                    raise UsageError(\"Sanitizer rule is missing the 'step' attribute.\")\n                if not isinstance(func['step'], str):\n                    raise UsageError(\"'step' attribute must be a simple string.\")\n\n                module: SanitizerHandler = \\\n                    config.load_plugin_module(func['step'], 'nominatim_db.tokenizer.sanitizers')\n\n                self.handlers.append(module.create(SanitizerConfig(func)))\n\n    def process_names(self, place: PlaceInfo) -> Tuple[List[PlaceName], List[PlaceName]]:\n        \"\"\" Extract a sanitized list of names and address parts from the\n            given place. The function returns a tuple\n            (list of names, list of address names)\n        \"\"\"\n        obj = ProcessInfo(place)\n\n        for func in self.handlers:\n            func(obj)\n\n        return obj.names, obj.address\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/sanitizers/__init__.py",
    "content": ""
  },
  {
    "path": "src/nominatim_db/tokenizer/sanitizers/base.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nCommon data types and protocols for sanitizers.\n\"\"\"\nfrom typing import Optional, List, Mapping, Callable\n\nfrom ...typing import Protocol, Final\nfrom ...data.place_info import PlaceInfo\nfrom ...data.place_name import PlaceName\nfrom .config import SanitizerConfig\n\n\nclass ProcessInfo:\n    \"\"\" Container class for information handed into to handler functions.\n        The 'names' and 'address' members are mutable. A handler must change\n        them by either modifying the lists place or replacing the old content\n        with a new list.\n    \"\"\"\n\n    def __init__(self, place: PlaceInfo):\n        self.place: Final = place\n        self.names = self._convert_name_dict(place.name)\n        self.address = self._convert_name_dict(place.address)\n\n    @staticmethod\n    def _convert_name_dict(names: Optional[Mapping[str, str]]) -> List[PlaceName]:\n        \"\"\" Convert a dictionary of names into a list of PlaceNames.\n            The dictionary key is split into the primary part of the key\n            and the suffix (the part after an optional colon).\n        \"\"\"\n        out = []\n\n        if names:\n            for key, value in names.items():\n                parts = key.split(':', 1)\n                out.append(PlaceName(value.strip(),\n                                     parts[0].strip(),\n                                     parts[1].strip() if len(parts) > 1 else None))\n\n        return out\n\n\nclass SanitizerHandler(Protocol):\n    \"\"\" Protocol for sanitizer modules.\n    \"\"\"\n\n    def create(self, config: SanitizerConfig) -> Callable[[ProcessInfo], None]:\n        \"\"\"\n        Create a function for sanitizing a place.\n\n        Arguments:\n            config: A dictionary with the additional configuration options\n                    specified in the tokenizer configuration\n\n        Return:\n            The result must be a callable that takes a place description\n            and transforms name and address as required.\n        \"\"\"\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/sanitizers/clean_housenumbers.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nSanitizer that preprocesses address tags for house numbers. The sanitizer\nallows to\n\n* define which tags are to be considered house numbers (see 'filter-kind')\n* split house number lists into individual numbers (see 'delimiters')\n* expand interpolated house numbers\n\nArguments:\n    delimiters: Define the set of characters to be used for\n                splitting a list of house numbers into parts. (default: ',;')\n    filter-kind: Define the address tags that are considered to be a\n                 house number. Either takes a single string or a list of strings,\n                 where each string is a regular expression. An address item\n                 is considered a house number if the 'kind' fully matches any\n                 of the given regular expressions. (default: 'housenumber')\n    convert-to-name: Define house numbers that should be treated as a name\n                     instead of a house number. Either takes a single string\n                     or a list of strings, where each string is a regular\n                     expression that must match the full house number value.\n    expand-interpolations: When true, expand house number ranges to separate numbers\n                           when an 'interpolation' is present. (default: true)\n\n\"\"\"\nfrom typing import Callable, Iterator, Iterable, Union\nimport re\n\nfrom ...data.place_name import PlaceName\nfrom .base import ProcessInfo\nfrom .config import SanitizerConfig\n\nRANGE_REGEX = re.compile(r'\\d+-\\d+')\n\n\nclass _HousenumberSanitizer:\n\n    def __init__(self, config: SanitizerConfig) -> None:\n        self.filter_kind = config.get_filter('filter-kind', ['housenumber'])\n        self.split_regexp = config.get_delimiter()\n\n        self.filter_name = config.get_filter('convert-to-name', 'FAIL_ALL')\n        self.expand_interpolations = config.get_bool('expand-interpolations', True)\n\n    def __call__(self, obj: ProcessInfo) -> None:\n        if not obj.address:\n            return\n\n        itype: Union[int, str, None] = None\n        if self.expand_interpolations:\n            itype = next((i.name for i in obj.address if i.kind == 'interpolation'), None)\n            if itype is not None:\n                if itype == 'all':\n                    itype = 1\n                elif len(itype) == 1 and itype.isdigit():\n                    itype = int(itype)\n                elif itype not in ('odd', 'even'):\n                    itype = None\n\n        new_address: list[PlaceName] = []\n        for item in obj.address:\n            if self.filter_kind(item.kind):\n                if itype is not None and RANGE_REGEX.fullmatch(item.name):\n                    hnrs = self._expand_range(itype, item.name)\n                    if hnrs:\n                        new_address.extend(item.clone(kind='housenumber', name=str(hnr))\n                                           for hnr in hnrs)\n                        continue\n\n                if self.filter_name(item.name):\n                    obj.names.append(item.clone(kind='housenumber'))\n                else:\n                    new_address.extend(item.clone(kind='housenumber', name=n)\n                                       for n in self.sanitize(item.name))\n            elif item.kind != 'interpolation':\n                # Ignore interpolation, otherwise don't touch other address items.\n                new_address.append(item)\n\n        obj.address = new_address\n\n    def sanitize(self, value: str) -> Iterator[str]:\n        \"\"\" Extract housenumbers in a regularized format from an OSM value.\n\n            The function works as a generator that yields all valid housenumbers\n            that can be created from the value.\n        \"\"\"\n        for hnr in self.split_regexp.split(value):\n            if hnr:\n                yield from self._regularize(hnr)\n\n    def _regularize(self, hnr: str) -> Iterator[str]:\n        yield hnr\n\n    def _expand_range(self, itype: Union[str, int], hnr: str) -> Iterable[int]:\n        first, last = (int(i) for i in hnr.split('-'))\n\n        if isinstance(itype, int):\n            step = itype\n        else:\n            step = 2\n            if (itype == 'even' and first % 2 == 1)\\\n               or (itype == 'odd' and first % 2 == 0):\n                first += 1\n\n        if (last + 1 - first) / step < 10:\n            return range(first, last + 1, step)\n\n        return []\n\n\ndef create(config: SanitizerConfig) -> Callable[[ProcessInfo], None]:\n    \"\"\" Create a housenumber processing function.\n    \"\"\"\n\n    return _HousenumberSanitizer(config)\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/sanitizers/clean_postcodes.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nSanitizer that filters postcodes by their officially allowed pattern.\n\nArguments:\n    convert-to-address: If set to 'yes' (the default), then postcodes that do\n                        not conform with their country-specific pattern are\n                        converted to an address component. That means that\n                        the postcode does not take part when computing the\n                        postcode centroids of a country but is still searchable.\n                        When set to 'no', non-conforming postcodes are not\n                        searchable either.\n    default-pattern:    Pattern to use, when there is none available for the\n                        country in question. Warning: will not be used for\n                        objects that have no country assigned. These are always\n                        assumed to have no postcode.\n\"\"\"\nfrom typing import Callable, Optional, Tuple\n\nfrom ...data.postcode_format import PostcodeFormatter\nfrom .base import ProcessInfo\nfrom .config import SanitizerConfig\n\n\nclass _PostcodeSanitizer:\n\n    def __init__(self, config: SanitizerConfig) -> None:\n        self.convert_to_address = config.get_bool('convert-to-address', True)\n        self.matcher = PostcodeFormatter()\n\n        default_pattern = config.get('default-pattern')\n        if default_pattern is not None and isinstance(default_pattern, str):\n            self.matcher.set_default_pattern(default_pattern)\n\n    def __call__(self, obj: ProcessInfo) -> None:\n        if not obj.address:\n            return\n\n        postcodes = ((i, o) for i, o in enumerate(obj.address) if o.kind == 'postcode')\n\n        for pos, postcode in postcodes:\n            formatted = self.scan(postcode.name, obj.place.country_code)\n\n            if formatted is None:\n                if self.convert_to_address:\n                    postcode.kind = 'unofficial_postcode'\n                else:\n                    obj.address.pop(pos)\n            else:\n                postcode.name = formatted[0]\n                postcode.set_attr('variant', formatted[1])\n\n    def scan(self, postcode: str, country: Optional[str]) -> Optional[Tuple[str, str]]:\n        \"\"\" Check the postcode for correct formatting and return the\n            normalized version. Returns None if the postcode does not\n            correspond to the official format of the given country.\n        \"\"\"\n        match = self.matcher.match(country, postcode)\n        if match is None:\n            return None\n\n        assert country is not None\n\n        return self.matcher.normalize(country, match), \\\n            ' '.join(filter(lambda p: p is not None, match.groups()))\n\n\ndef create(config: SanitizerConfig) -> Callable[[ProcessInfo], None]:\n    \"\"\" Create a function that filters postcodes by their officially allowed pattern.\n    \"\"\"\n\n    return _PostcodeSanitizer(config)\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/sanitizers/clean_tiger_tags.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nSanitizer that preprocesses tags from the TIGER import.\n\nIt makes the following changes:\n\n* remove state reference from tiger:county\n\"\"\"\nfrom typing import Callable\nimport re\n\nfrom .base import ProcessInfo\nfrom .config import SanitizerConfig\n\nCOUNTY_MATCH = re.compile('(.*), [A-Z][A-Z]')\n\n\ndef _clean_tiger_county(obj: ProcessInfo) -> None:\n    \"\"\" Remove the state reference from tiger:county tags.\n\n        This transforms a name like 'Hamilton, AL' into 'Hamilton'.\n        If no state reference is detected at the end, the name is left as is.\n    \"\"\"\n    if not obj.address:\n        return\n\n    for item in obj.address:\n        if item.kind == 'tiger' and item.suffix == 'county':\n            m = COUNTY_MATCH.fullmatch(item.name)\n            if m:\n                item.name = m[1]\n            # Switch kind and suffix, the split left them reversed.\n            item.kind = 'county'\n            item.suffix = 'tiger'\n\n            return\n\n\ndef create(_: SanitizerConfig) -> Callable[[ProcessInfo], None]:\n    \"\"\" Create a function that preprocesses tags from the TIGER import.\n    \"\"\"\n    return _clean_tiger_county\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/sanitizers/config.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nConfiguration for Sanitizers.\n\"\"\"\nfrom typing import Sequence, Union, Optional, Pattern, Callable, Any, TYPE_CHECKING\nfrom collections import UserDict\nimport re\n\nfrom ...errors import UsageError\n\n# working around missing generics in Python < 3.8\n# See https://github.com/python/typing/issues/60#issuecomment-869757075\nif TYPE_CHECKING:\n    _BaseUserDict = UserDict[str, Any]\nelse:\n    _BaseUserDict = UserDict\n\n\nclass SanitizerConfig(_BaseUserDict):\n    \"\"\" The `SanitizerConfig` class is a read-only dictionary\n        with configuration options for the sanitizer.\n        In addition to the usual dictionary functions, the class provides\n        accessors to standard sanitizer options that are used by many of the\n        sanitizers.\n    \"\"\"\n\n    def get_string_list(self, param: str, default: Sequence[str] = tuple()) -> Sequence[str]:\n        \"\"\" Extract a configuration parameter as a string list.\n\n            Arguments:\n                param: Name of the configuration parameter.\n                default: Takes a tuple or list of strings which will\n                         be returned if the parameter is missing in the\n                         sanitizer configuration.\n                         Note that if this default parameter is not\n                         provided then an empty list is returned.\n\n            Returns:\n                If the parameter value is a simple string, it is returned as a\n                    one-item list. If the parameter value does not exist, the given\n                    default is returned. If the parameter value is a list, it is\n                    checked to contain only strings before being returned.\n        \"\"\"\n        values = self.data.get(param, None)\n\n        if values is None:\n            return list(default)\n\n        if isinstance(values, str):\n            return [values] if values else []\n\n        if not isinstance(values, (list, tuple)):\n            raise UsageError(f\"Parameter '{param}' must be string or list of strings.\")\n\n        if any(not isinstance(value, str) for value in values):\n            raise UsageError(f\"Parameter '{param}' must be string or list of strings.\")\n\n        return values\n\n    def get_bool(self, param: str, default: Optional[bool] = None) -> bool:\n        \"\"\" Extract a configuration parameter as a boolean.\n\n            Arguments:\n                param: Name of the configuration parameter. The parameter must\n                       contain one of the yaml boolean values or an\n                       UsageError will be raised.\n                default: Value to return, when the parameter is missing.\n                         When set to `None`, the parameter must be defined.\n\n            Returns:\n                Boolean value of the given parameter.\n        \"\"\"\n        value = self.data.get(param, default)\n\n        if not isinstance(value, bool):\n            raise UsageError(f\"Parameter '{param}' must be a boolean value ('yes' or 'no').\")\n\n        return value\n\n    def get_delimiter(self, default: str = ',;') -> Pattern[str]:\n        \"\"\" Return the 'delimiters' parameter in the configuration as a\n            compiled regular expression that can be used to split strings on\n            these delimiters.\n\n            Arguments:\n                default: Delimiters to be used when 'delimiters' parameter\n                         is not explicitly configured.\n\n            Returns:\n                A regular expression pattern which can be used to\n                    split a string. The regular expression makes sure that the\n                    resulting names are stripped and that repeated delimiters\n                    are ignored. It may still create empty fields on occasion. The\n                    code needs to filter those.\n        \"\"\"\n        delimiter_set = set(self.data.get('delimiters', default))\n        if not delimiter_set:\n            raise UsageError(\"Empty 'delimiter' parameter not allowed for sanitizer.\")\n\n        return re.compile('\\\\s*[{}]+\\\\s*'.format(''.join('\\\\' + d for d in delimiter_set)))\n\n    def get_filter(self, param: str, default: Union[str, Sequence[str]] = 'PASS_ALL'\n                   ) -> Callable[[str], bool]:\n        \"\"\" Returns a filter function for the given parameter of the sanitizer\n            configuration.\n\n            The value provided for the parameter in sanitizer configuration\n            should be a string or list of strings, where each string is a regular\n            expression. These regular expressions will later be used by the\n            filter function to filter strings.\n\n            Arguments:\n                param: The parameter for which the filter function\n                       will be created.\n                default: Defines the behaviour of filter function if\n                         parameter is missing in the sanitizer configuration.\n                         Takes a string(PASS_ALL or FAIL_ALL) or a list of strings.\n                         Any other value of string or an empty list is not allowed,\n                         and will raise a ValueError. If the value is PASS_ALL, the filter\n                         function will let all strings to pass, if the value is FAIL_ALL,\n                         filter function will let no strings to pass.\n                         If value provided is a list of strings each string\n                         is treated as a regular expression. In this case these regular\n                         expressions will be used by the filter function.\n                         By default allow filter function to let all strings pass.\n\n            Returns:\n                A filter function that takes a target string as the argument and\n                    returns True if it fully matches any of the regular expressions\n                    otherwise returns False.\n        \"\"\"\n        filters = self.get_string_list(param) or default\n\n        if filters == 'PASS_ALL':\n            return lambda _: True\n        if filters == 'FAIL_ALL':\n            return lambda _: False\n\n        if filters and isinstance(filters, (list, tuple)):\n            regexes = [re.compile(regex) for regex in filters]\n            return lambda target: any(regex.fullmatch(target) for regex in regexes)\n\n        raise ValueError(\"Default parameter must be a non-empty list or a string value \\\n                          ('PASS_ALL' or 'FAIL_ALL').\")\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/sanitizers/delete_tags.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\r\n#\r\n# This file is part of Nominatim. (https://nominatim.org)\r\n#\r\n# Copyright (C) 2024 by the Nominatim developer community.\r\n# For a full list of authors see the git log.\r\n\"\"\"\r\nSanitizer which prevents certain tags from getting into the search index.\r\nIt remove tags which matches all properties given below.\r\n\r\n\r\nArguments:\r\n    type: Define which type of tags should be considered for removal.\r\n          There are two types of tags 'name' and 'address' tags.\r\n          Takes a string 'name' or 'address'. (default: 'name')\r\n\r\n    filter-kind: Define which 'kind' of tags should be removed.\r\n                 Takes a string or list of strings where each\r\n                 string is a regular expression. A tag is considered\r\n                 to be a candidate for removal if its 'kind' property\r\n                 fully matches any of the given regular expressions.\r\n                 Note that by default all 'kind' of tags are considered.\r\n\r\n    suffix: Define the 'suffix' property of the tags which should be\r\n            removed. Takes a string or list of strings where each\r\n            string is a regular expression. A tag is considered to be a\r\n            candidate for removal if its 'suffix' property fully\r\n            matches any of the given regular expressions. Note that by\r\n            default tags with any suffix value are considered including\r\n            those which don't have a suffix at all.\r\n\r\n    name: Define the 'name' property corresponding to the 'kind' property\r\n          of the tag. Takes a string or list of strings where each string\r\n          is a regular expression. A tag is considered to be a candidate\r\n          for removal if its name fully matches any of the given regular\r\n          expressions. Note that by default tags with any 'name' are\r\n          considered.\r\n\r\n    country_code: Define the country code of places whose tags should be\r\n                  considered for removed. Takes a string or list of strings\r\n                  where each string is a two-letter lower-case country code.\r\n                  Note that by default tags of places with any country code\r\n                  are considered including those which don't have a country\r\n                  code at all.\r\n\r\n    rank_address: Define the address rank of places whose tags should be\r\n                  considered for removal. Takes a string or list of strings\r\n                  where each string is a number or range of number or the\r\n                  form <from>-<to>.\r\n                  Note that default is '0-30', which means that tags of all\r\n                  places are considered.\r\n                  See https://nominatim.org/release-docs/latest/customize/Ranking/#address-rank\r\n                  to learn more about address rank.\r\n\r\n\r\n\"\"\"\r\nfrom typing import Callable, List, Tuple, Sequence\r\n\r\nfrom ...data.place_name import PlaceName\r\nfrom .base import ProcessInfo\r\nfrom .config import SanitizerConfig\r\n\r\n\r\nclass _TagSanitizer:\r\n\r\n    def __init__(self, config: SanitizerConfig) -> None:\r\n        self.type = config.get('type', 'name')\r\n        self.filter_kind = config.get_filter('filter-kind')\r\n        self.country_codes = config.get_string_list('country_code', [])\r\n        self.filter_suffix = config.get_filter('suffix')\r\n        self.filter_name = config.get_filter('name')\r\n        self.allowed_ranks = self._set_allowed_ranks(\r\n            config.get_string_list(\"rank_address\", [\"0-30\"])\r\n        )\r\n\r\n        self.has_country_code = config.get('country_code', None) is not None\r\n\r\n    def __call__(self, obj: ProcessInfo) -> None:\r\n        tags = obj.names if self.type == 'name' else obj.address\r\n\r\n        if not tags \\\r\n           or not self.allowed_ranks[obj.place.rank_address] \\\r\n           or self.has_country_code \\\r\n           and obj.place.country_code not in self.country_codes:\r\n            return\r\n\r\n        filtered_tags: List[PlaceName] = []\r\n\r\n        for tag in tags:\r\n\r\n            if not self.filter_kind(tag.kind) \\\r\n               or not self.filter_suffix(tag.suffix or '') \\\r\n               or not self.filter_name(tag.name):\r\n                filtered_tags.append(tag)\r\n\r\n        if self.type == 'name':\r\n            obj.names = filtered_tags\r\n        else:\r\n            obj.address = filtered_tags\r\n\r\n    def _set_allowed_ranks(self, ranks: Sequence[str]) -> Tuple[bool, ...]:\r\n        \"\"\" Returns a tuple of 31 boolean values corresponding to the\r\n            address ranks 0-30. Value at index 'i' is True if rank 'i'\r\n            is present in the ranks or lies in the range of any of the\r\n            ranks provided in the sanitizer configuration, otherwise\r\n            the value is False.\r\n        \"\"\"\r\n        allowed_ranks = [False] * 31\r\n\r\n        for rank in ranks:\r\n            intvl = [int(x) for x in rank.split('-')]\r\n\r\n            start, end = intvl[0], intvl[0] if len(intvl) == 1 else intvl[1]\r\n\r\n            for i in range(start, end + 1):\r\n                allowed_ranks[i] = True\r\n\r\n        return tuple(allowed_ranks)\r\n\r\n\r\ndef create(config: SanitizerConfig) -> Callable[[ProcessInfo], None]:\r\n    \"\"\" Create a function to process removal of certain tags.\r\n    \"\"\"\r\n\r\n    return _TagSanitizer(config)\r\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/sanitizers/split_name_list.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nSanitizer that splits lists of names into their components.\n\nArguments:\n    delimiters: Define the set of characters to be used for\n                splitting the list. (default: ',;')\n\"\"\"\nfrom typing import Callable\n\nfrom .base import ProcessInfo\nfrom .config import SanitizerConfig\n\n\ndef create(config: SanitizerConfig) -> Callable[[ProcessInfo], None]:\n    \"\"\" Create a name processing function that splits name values with\n        multiple values into their components.\n    \"\"\"\n    regexp = config.get_delimiter()\n\n    def _process(obj: ProcessInfo) -> None:\n        if not obj.names:\n            return\n\n        new_names = []\n        for name in obj.names:\n            split_names = regexp.split(name.name)\n            if len(split_names) == 1:\n                new_names.append(name)\n            else:\n                new_names.extend(name.clone(name=n) for n in split_names if n)\n\n        obj.names = new_names\n\n    return _process\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/sanitizers/strip_brace_terms.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nThis sanitizer creates additional name variants for names that have\naddendums in brackets (e.g. \"Halle (Saale)\"). The additional variant contains\nonly the main name part with the bracket part removed.\n\"\"\"\nfrom typing import Callable\n\nfrom .base import ProcessInfo\nfrom .config import SanitizerConfig\n\n\ndef create(_: SanitizerConfig) -> Callable[[ProcessInfo], None]:\n    \"\"\" Create a name processing function that creates additional name variants\n        for bracket addendums.\n    \"\"\"\n    def _process(obj: ProcessInfo) -> None:\n        \"\"\" Add variants for names that have a bracket extension.\n        \"\"\"\n        if obj.names:\n            new_names = []\n            for name in (n for n in obj.names if '(' in n.name):\n                if ')' in name.name and not name.name.endswith(')'):\n                    continue\n                new_name = name.name.split('(')[0].strip()\n                if new_name:\n                    new_names.append(name.clone(name=new_name))\n\n            obj.names.extend(new_names)\n\n    return _process\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/sanitizers/tag_analyzer_by_language.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nThis sanitizer sets the `analyzer` property depending on the\nlanguage of the tag. The language is taken from the suffix of the name.\nIf a name already has an analyzer tagged, then this is kept.\n\nArguments:\n\n    filter-kind: Restrict the names the sanitizer should be applied to\n                 the given tags. The parameter expects a list of\n                 regular expressions which are matched against 'kind'.\n                 Note that a match against the full string is expected.\n    whitelist: Restrict the set of languages that should be tagged.\n               Expects a list of acceptable suffixes. When unset,\n               all 2- and 3-letter lower-case codes are accepted.\n    use-defaults:  Configure what happens when the name has no suffix.\n                   When set to 'all', a variant is created for\n                   each of the default languages in the country\n                   the feature is in. When set to 'mono', a variant is\n                   only created, when exactly one language is spoken\n                   in the country. The default is to do nothing with\n                   the default languages of a country.\n    mode: Define how the variants are created and may be 'replace' or\n          'append'. When set to 'append' the original name (without\n          any analyzer tagged) is retained. (default: replace)\n\n\"\"\"\nfrom typing import Callable, Dict, Optional, List\n\nfrom ...data import country_info\nfrom .base import ProcessInfo\nfrom .config import SanitizerConfig\n\n\nclass _AnalyzerByLanguage:\n    \"\"\" Processor for tagging the language of names in a place.\n    \"\"\"\n\n    def __init__(self, config: SanitizerConfig) -> None:\n        self.filter_kind = config.get_filter('filter-kind')\n        self.replace = config.get('mode', 'replace') != 'append'\n        self.whitelist = config.get('whitelist')\n\n        self._compute_default_languages(config.get('use-defaults', 'no'))\n\n    def _compute_default_languages(self, use_defaults: str) -> None:\n        self.deflangs: Dict[Optional[str], List[str]] = {}\n\n        if use_defaults in ('mono', 'all'):\n            for ccode, clangs in country_info.iterate('languages'):\n                if len(clangs) == 1 or use_defaults == 'all':\n                    if self.whitelist:\n                        self.deflangs[ccode] = [cl for cl in clangs if cl in self.whitelist]\n                    else:\n                        self.deflangs[ccode] = clangs\n\n    def _suffix_matches(self, suffix: str) -> bool:\n        if self.whitelist is None:\n            return len(suffix) in (2, 3) and suffix.islower()\n\n        return suffix in self.whitelist\n\n    def __call__(self, obj: ProcessInfo) -> None:\n        if not obj.names:\n            return\n\n        more_names = []\n\n        for name in (n for n in obj.names\n                     if not n.has_attr('analyzer') and self.filter_kind(n.kind)):\n            if name.suffix:\n                langs = [name.suffix] if self._suffix_matches(name.suffix) else None\n            else:\n                langs = self.deflangs.get(obj.place.country_code)\n\n            if langs:\n                if self.replace:\n                    name.set_attr('analyzer', langs[0])\n                else:\n                    more_names.append(name.clone(attr={'analyzer': langs[0]}))\n\n                more_names.extend(name.clone(attr={'analyzer': lg}) for lg in langs[1:])\n\n        obj.names.extend(more_names)\n\n\ndef create(config: SanitizerConfig) -> Callable[[ProcessInfo], None]:\n    \"\"\" Create a function that sets the analyzer property depending on the\n        language of the tag.\n    \"\"\"\n    return _AnalyzerByLanguage(config)\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/sanitizers/tag_japanese.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nThis sanitizer maps OSM data to Japanese block addresses.\nIt replaces blocknumber and housenumber with housenumber,\nand quarter and neighbourhood with place.\n\"\"\"\n\n\nfrom typing import Callable\nfrom typing import List, Optional\n\nfrom .base import ProcessInfo\nfrom .config import SanitizerConfig\nfrom ...data.place_name import PlaceName\n\n\ndef create(_: SanitizerConfig) -> Callable[[ProcessInfo], None]:\n    \"\"\"Set up the sanitizer\n    \"\"\"\n    return tag_japanese\n\n\ndef reconbine_housenumber(\n    new_address: List[PlaceName],\n    tmp_housenumber: Optional[str],\n    tmp_blocknumber: Optional[str]\n) -> List[PlaceName]:\n    \"\"\" Recombine the tag of housenumber by using housenumber and blocknumber\n    \"\"\"\n    if tmp_blocknumber and tmp_housenumber:\n        new_address.append(\n            PlaceName(\n                kind='housenumber',\n                name=f'{tmp_blocknumber}-{tmp_housenumber}',\n                suffix=''\n            )\n        )\n    elif tmp_blocknumber:\n        new_address.append(\n            PlaceName(\n                kind='housenumber',\n                name=tmp_blocknumber,\n                suffix=''\n            )\n        )\n    elif tmp_housenumber:\n        new_address.append(\n            PlaceName(\n                kind='housenumber',\n                name=tmp_housenumber,\n                suffix=''\n            )\n        )\n    return new_address\n\n\ndef reconbine_place(\n    new_address: List[PlaceName],\n    tmp_neighbourhood: Optional[str],\n    tmp_quarter: Optional[str]\n) -> List[PlaceName]:\n    \"\"\" Recombine the tag of place by using neighbourhood and quarter\n    \"\"\"\n    if tmp_neighbourhood and tmp_quarter:\n        new_address.append(\n            PlaceName(\n                kind='place',\n                name=f'{tmp_quarter}{tmp_neighbourhood}',\n                suffix=''\n            )\n        )\n    elif tmp_neighbourhood:\n        new_address.append(\n            PlaceName(\n                kind='place',\n                name=tmp_neighbourhood,\n                suffix=''\n            )\n        )\n    elif tmp_quarter:\n        new_address.append(\n            PlaceName(\n                kind='place',\n                name=tmp_quarter,\n                suffix=''\n            )\n        )\n    return new_address\n\n\ndef tag_japanese(obj: ProcessInfo) -> None:\n    \"\"\"Recombine kind of address\n    \"\"\"\n    if obj.place.country_code != 'jp':\n        return\n    tmp_housenumber = None\n    tmp_blocknumber = None\n    tmp_neighbourhood = None\n    tmp_quarter = None\n\n    new_address = []\n    for item in obj.address:\n        if item.kind == 'housenumber':\n            tmp_housenumber = item.name\n        elif item.kind == 'block_number':\n            tmp_blocknumber = item.name\n        elif item.kind == 'neighbourhood':\n            tmp_neighbourhood = item.name\n        elif item.kind == 'quarter':\n            tmp_quarter = item.name\n        else:\n            new_address.append(item)\n\n    new_address = reconbine_housenumber(new_address, tmp_housenumber, tmp_blocknumber)\n    new_address = reconbine_place(new_address, tmp_neighbourhood, tmp_quarter)\n\n    obj.address = [item for item in new_address if item.name is not None]\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/token_analysis/__init__.py",
    "content": ""
  },
  {
    "path": "src/nominatim_db/tokenizer/token_analysis/base.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nCommon data types and protocols for analysers.\n\"\"\"\nfrom typing import Mapping, List, Any, Union, Tuple\n\nfrom ...typing import Protocol\nfrom ...data.place_name import PlaceName\n\n\nclass Analyzer(Protocol):\n    \"\"\" The `create()` function of an analysis module needs to return an\n        object that implements the following functions.\n    \"\"\"\n\n    def get_canonical_id(self, name: PlaceName) -> str:\n        \"\"\" Return the canonical form of the given name. The canonical ID must\n            be unique (the same ID must always yield the same variants) and\n            must be a form from which the variants can be derived.\n\n            Arguments:\n                name: Extended place name description as prepared by\n                      the sanitizers.\n\n            Returns:\n                ID string with a canonical form of the name. The string may\n                    be empty, when the analyzer cannot analyze the name at all,\n                    for example because the character set in use does not match.\n        \"\"\"\n\n    def compute_variants(self, canonical_id: str) -> Union[List[str], Tuple[List[str], List[str]]]:\n        \"\"\" Compute the transliterated spelling variants for the given\n            canonical ID.\n\n            Arguments:\n                canonical_id: ID string previously computed with\n                              `get_canonical_id()`.\n\n            Returns:\n                A list of possible spelling variants. All strings must have\n                    been transformed with the global normalizer and\n                    transliterator ICU rules. Otherwise they cannot be matched\n                    against the input by the query frontend.\n                    The list may be empty, when there are no useful\n                    spelling variants. This may happen when an analyzer only\n                    usually outputs additional variants to the canonical spelling\n                    and there are no such variants.\n        \"\"\"\n\n\nclass AnalysisModule(Protocol):\n    \"\"\" The setup of the token analysis is split into two parts:\n        configuration and analyser factory. A token analysis module must\n        therefore implement the two functions here described.\n    \"\"\"\n\n    def configure(self, rules: Mapping[str, Any],\n                  normalizer: Any, transliterator: Any) -> Any:\n        \"\"\" Prepare the configuration of the analysis module.\n            This function should prepare all data that can be shared\n            between instances of this analyser.\n\n            Arguments:\n                rules: A dictionary with the additional configuration options\n                       as specified in the tokenizer configuration.\n                normalizer: an ICU Transliterator with the compiled\n                            global normalization rules.\n                transliterator: an ICU Transliterator with the compiled\n                                global transliteration rules.\n\n            Returns:\n                A data object with configuration data. This will be handed\n                    as is into the `create()` function and may be\n                    used freely by the analysis module as needed.\n        \"\"\"\n\n    def create(self, normalizer: Any, transliterator: Any, config: Any) -> Analyzer:\n        \"\"\" Create a new instance of the analyser.\n            A separate instance of the analyser is created for each thread\n            when used in multi-threading context.\n\n            Arguments:\n                normalizer: an ICU Transliterator with the compiled normalization\n                            rules.\n                transliterator: an ICU Transliterator with the compiled\n                                transliteration rules.\n                config: The object that was returned by the call to configure().\n\n            Returns:\n                A new analyzer instance. This must be an object that implements\n                    the Analyzer protocol.\n        \"\"\"\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/token_analysis/config_variants.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nParser for configuration for variants.\n\"\"\"\nfrom typing import Any, Iterator, Tuple, List, Optional, Set, NamedTuple\nfrom collections import defaultdict\nimport itertools\nimport re\n\nfrom ...config import flatten_config_list\nfrom ...errors import UsageError\n\n\nclass ICUVariant(NamedTuple):\n    \"\"\" A single replacement rule for variant creation.\n    \"\"\"\n    source: str\n    replacement: str\n\n\ndef get_variant_config(in_rules: Any,\n                       normalizer: Any) -> Tuple[List[Tuple[str, List[str]]], str]:\n    \"\"\" Convert the variant definition from the configuration into\n        replacement sets.\n\n        Returns a tuple containing the replacement set and the list of characters\n        used in the replacements.\n    \"\"\"\n    immediate = defaultdict(list)\n    chars: Set[str] = set()\n\n    if in_rules:\n        vset: Set[ICUVariant] = set()\n        rules = flatten_config_list(in_rules, 'variants')\n\n        vmaker = _VariantMaker(normalizer)\n\n        for section in rules:\n            for rule in (section.get('words') or []):\n                vset.update(vmaker.compute(rule))\n\n        # Intermediate reorder by source. Also compute required character set.\n        for variant in vset:\n            if variant.source[-1] == ' ' and variant.replacement[-1] == ' ':\n                replstr = variant.replacement[:-1]\n            else:\n                replstr = variant.replacement\n            immediate[variant.source].append(replstr)\n            chars.update(variant.source)\n\n    return list(immediate.items()), ''.join(chars)\n\n\nclass _VariantMaker:\n    \"\"\" Generator for all necessary ICUVariants from a single variant rule.\n\n        All text in rules is normalized to make sure the variants match later.\n    \"\"\"\n\n    def __init__(self, normalizer: Any) -> None:\n        self.norm = normalizer\n\n    def compute(self, rule: Any) -> Iterator[ICUVariant]:\n        \"\"\" Generator for all ICUVariant tuples from a single variant rule.\n        \"\"\"\n        parts = re.split(r'(\\|)?([=-])>', rule)\n        if len(parts) != 4:\n            raise UsageError(f\"Syntax error in variant rule: {rule}\")\n\n        decompose = parts[1] is None\n        src_terms = [self._parse_variant_word(t) for t in parts[0].split(',')]\n        repl_terms = (self.norm.transliterate(t).strip() for t in parts[3].split(','))\n\n        # If the source should be kept, add a 1:1 replacement\n        if parts[2] == '-':\n            for src in src_terms:\n                if src:\n                    for froms, tos in _create_variants(*src, src[0], decompose):\n                        yield ICUVariant(froms, tos)\n\n        for src, repl in itertools.product(src_terms, repl_terms):\n            if src and repl:\n                for froms, tos in _create_variants(*src, repl, decompose):\n                    yield ICUVariant(froms, tos)\n\n    def _parse_variant_word(self, name: str) -> Optional[Tuple[str, str, str]]:\n        name = name.strip()\n        match = re.fullmatch(r'([~^]?)([^~$^]*)([~$]?)', name)\n        if match is None or (match.group(1) == '~' and match.group(3) == '~'):\n            raise UsageError(f\"Invalid variant word descriptor '{name}'\")\n        norm_name = self.norm.transliterate(match.group(2)).strip()\n        if not norm_name:\n            return None\n\n        return norm_name, match.group(1), match.group(3)\n\n\n_FLAG_MATCH = {'^': '^ ',\n               '$': ' ^',\n               '': ' '}\n\n\ndef _create_variants(src: str, preflag: str, postflag: str,\n                     repl: str, decompose: bool) -> Iterator[Tuple[str, str]]:\n    if preflag == '~':\n        postfix = _FLAG_MATCH[postflag]\n        # suffix decomposition\n        src = src + postfix\n        repl = repl + postfix\n\n        yield src, repl\n        yield ' ' + src, ' ' + repl\n\n        if decompose:\n            yield src, ' ' + repl\n            yield ' ' + src, repl\n    elif postflag == '~':\n        # prefix decomposition\n        prefix = _FLAG_MATCH[preflag]\n        src = prefix + src\n        repl = prefix + repl\n\n        yield src, repl\n        yield src + ' ', repl + ' '\n\n        if decompose:\n            yield src, repl + ' '\n            yield src + ' ', repl\n    else:\n        prefix = _FLAG_MATCH[preflag]\n        postfix = _FLAG_MATCH[postflag]\n\n        yield prefix + src + postfix, prefix + repl + postfix\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/token_analysis/generic.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nGeneric processor for names that creates abbreviation variants.\n\"\"\"\nfrom typing import Mapping, Dict, Any, Iterable, Optional, List, cast, Tuple\nimport itertools\n\nfrom ...errors import UsageError\nfrom ...data.place_name import PlaceName\nfrom .config_variants import get_variant_config\nfrom .generic_mutation import MutationVariantGenerator\nfrom .simple_trie import SimpleTrie\n\n# Configuration section\n\n\ndef configure(rules: Mapping[str, Any], normalizer: Any, _: Any) -> Dict[str, Any]:\n    \"\"\" Extract and preprocess the configuration for this module.\n    \"\"\"\n    config: Dict[str, Any] = {}\n\n    config['replacements'], _ = get_variant_config(rules.get('variants'), normalizer)\n    config['variant_only'] = rules.get('mode', '') == 'variant-only'\n\n    # parse mutation rules\n    config['mutations'] = []\n    for rule in rules.get('mutations', []):\n        if 'pattern' not in rule:\n            raise UsageError(\"Missing field 'pattern' in mutation configuration.\")\n        if not isinstance(rule['pattern'], str):\n            raise UsageError(\"Field 'pattern' in mutation configuration \"\n                             \"must be a simple text field.\")\n        if 'replacements' not in rule:\n            raise UsageError(\"Missing field 'replacements' in mutation configuration.\")\n        if not isinstance(rule['replacements'], list):\n            raise UsageError(\"Field 'replacements' in mutation configuration \"\n                             \"must be a list of texts.\")\n\n        config['mutations'].append((rule['pattern'], rule['replacements']))\n\n    return config\n\n\n# Analysis section\n\ndef create(normalizer: Any, transliterator: Any,\n           config: Mapping[str, Any]) -> 'GenericTokenAnalysis':\n    \"\"\" Create a new token analysis instance for this module.\n    \"\"\"\n    return GenericTokenAnalysis(normalizer, transliterator, config)\n\n\nclass GenericTokenAnalysis:\n    \"\"\" Collects the different transformation rules for normalisation of names\n        and provides the functions to apply the transformations.\n    \"\"\"\n\n    def __init__(self, norm: Any, to_ascii: Any, config: Mapping[str, Any]) -> None:\n        self.norm = norm\n        self.to_ascii = to_ascii\n        self.variant_only = config['variant_only']\n\n        # Set up datrie\n        self.replacements: Optional[SimpleTrie[List[str]]] = \\\n            SimpleTrie(config['replacements']) if config['replacements'] else None\n\n        # set up mutation rules\n        self.mutations = [MutationVariantGenerator(*cfg) for cfg in config['mutations']]\n\n    def get_canonical_id(self, name: PlaceName) -> str:\n        \"\"\" Return the normalized form of the name. This is the standard form\n            from which possible variants for the name can be derived.\n        \"\"\"\n        return cast(str, self.norm.transliterate(name.name)).strip()\n\n    def compute_variants(self, norm_name: str) -> Tuple[List[str], List[str]]:\n        \"\"\" Compute the spelling variants for the given normalized name\n            and transliterate the result.\n        \"\"\"\n        variants = self._generate_word_variants(norm_name)\n\n        for mutation in self.mutations:\n            variants = mutation.generate(variants)\n\n        varset = set(map(str.strip, variants))\n        if self.variant_only:\n            varset.discard(norm_name)\n\n        trans = []\n        norm = []\n\n        for var in varset:\n            t = self.to_ascii.transliterate(var).strip()\n            if t:\n                trans.append(t)\n                norm.append(var)\n\n        return trans, norm\n\n    def _generate_word_variants(self, norm_name: str) -> Iterable[str]:\n        baseform = '^ ' + norm_name + ' ^'\n        baselen = len(baseform)\n        partials = ['']\n\n        startpos = 0\n        if self.replacements is not None:\n            pos = 0\n            force_space = False\n            while pos < baselen:\n                frm = pos\n                repl, pos = self.replacements.longest_prefix(baseform, pos)\n                if repl is not None:\n                    done = baseform[startpos:frm]\n                    partials = [v + done + r\n                                for v, r in itertools.product(partials, repl)\n                                if not force_space or r.startswith(' ')]\n                    if len(partials) > 128:\n                        # If too many variants are produced, they are unlikely\n                        # to be helpful. Only use the original term.\n                        startpos = 0\n                        break\n                    if baseform[pos - 1] == ' ':\n                        pos -= 1\n                        force_space = True\n                    startpos = pos\n                else:\n                    pos += 1\n                    force_space = False\n\n        # No variants detected? Fast return.\n        if startpos == 0:\n            return (norm_name, )\n\n        if startpos < baselen:\n            return (part[1:] + baseform[startpos:-1] for part in partials)\n\n        return (part[1:-1] for part in partials)\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/token_analysis/generic_mutation.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nCreator for mutation variants for the generic token analysis.\n\"\"\"\nfrom typing import Sequence, Iterable, Iterator, Tuple\nimport itertools\nimport logging\nimport re\n\nfrom ...errors import UsageError\n\nLOG = logging.getLogger()\n\n\ndef _zigzag(outer: Iterable[str], inner: Iterable[str]) -> Iterator[str]:\n    return itertools.chain.from_iterable(itertools.zip_longest(outer, inner, fillvalue=''))\n\n\nclass MutationVariantGenerator:\n    \"\"\" Generates name variants by applying a regular expression to the name\n        and replacing it with one or more variants. When the regular expression\n        matches more than once, each occurrence is replaced with all replacement\n        patterns.\n    \"\"\"\n\n    def __init__(self, pattern: str, replacements: Sequence[str]):\n        self.pattern = re.compile(pattern)\n        self.replacements = replacements\n\n        if self.pattern.groups > 0:\n            LOG.fatal(\"The mutation pattern %s contains a capturing group. \"\n                      \"This is not allowed.\", pattern)\n            raise UsageError(\"Bad mutation pattern in configuration.\")\n\n    def generate(self, names: Iterable[str]) -> Iterator[str]:\n        \"\"\" Generator function for the name variants. 'names' is an iterable\n            over a set of names for which the variants are to be generated.\n        \"\"\"\n        for name in names:\n            parts = self.pattern.split(name)\n            if len(parts) == 1:\n                yield name\n            else:\n                for seps in self._fillers(len(parts)):\n                    yield ''.join(_zigzag(parts, seps))\n\n    def _fillers(self, num_parts: int) -> Iterator[Tuple[str, ...]]:\n        \"\"\" Returns a generator for strings to join the given number of string\n            parts in all possible combinations.\n        \"\"\"\n        return itertools.product(self.replacements, repeat=num_parts - 1)\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/token_analysis/housenumbers.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nSpecialized processor for housenumbers. Analyses common housenumber patterns\nand creates variants for them.\n\"\"\"\nfrom typing import Any, List, cast\nimport re\n\nfrom ...data.place_name import PlaceName\nfrom .generic_mutation import MutationVariantGenerator\n\nRE_NON_DIGIT = re.compile('[^0-9]')\nRE_DIGIT_ALPHA = re.compile(r'(\\d)\\s*([^\\d\\s␣])')\nRE_ALPHA_DIGIT = re.compile(r'([^\\s\\d␣])\\s*(\\d)')\nRE_NAMED_PART = re.compile(r'[a-z]{4}')\n\n# Configuration section\n\n\ndef configure(*_: Any) -> None:\n    \"\"\" All behaviour is currently hard-coded.\n    \"\"\"\n    return None\n\n# Analysis section\n\n\ndef create(normalizer: Any, transliterator: Any, config: None) -> 'HousenumberTokenAnalysis':\n    \"\"\" Create a new token analysis instance for this module.\n    \"\"\"\n    return HousenumberTokenAnalysis(normalizer, transliterator)\n\n\nclass HousenumberTokenAnalysis:\n    \"\"\" Detects common housenumber patterns and normalizes them.\n    \"\"\"\n    def __init__(self, norm: Any, trans: Any) -> None:\n        self.norm = norm\n        self.trans = trans\n\n        self.mutator = MutationVariantGenerator('␣', (' ', ''))\n\n    def get_canonical_id(self, name: PlaceName) -> str:\n        \"\"\" Return the normalized form of the housenumber.\n        \"\"\"\n        # shortcut for number-only numbers, which make up 90% of the data.\n        if RE_NON_DIGIT.search(name.name) is None:\n            return name.name\n\n        norm = cast(str, self.trans.transliterate(self.norm.transliterate(name.name)))\n        # If there is a significant non-numeric part, use as is.\n        if RE_NAMED_PART.search(norm) is None:\n            # Otherwise add optional spaces between digits and letters.\n            (norm_opt, cnt1) = RE_DIGIT_ALPHA.subn(r'\\1␣\\2', norm)\n            (norm_opt, cnt2) = RE_ALPHA_DIGIT.subn(r'\\1␣\\2', norm_opt)\n            # Avoid creating too many variants per number.\n            if cnt1 + cnt2 <= 4:\n                return norm_opt\n\n        return norm\n\n    def compute_variants(self, norm_name: str) -> List[str]:\n        \"\"\" Compute the spelling variants for the given normalized housenumber.\n\n            Generates variants for optional spaces (marked with '␣').\n        \"\"\"\n        return list(self.mutator.generate([norm_name]))\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/token_analysis/postcodes.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nSpecialized processor for postcodes. Supports a 'lookup' variant of the\ntoken, which produces variants with optional spaces.\n\"\"\"\nfrom typing import Any, List\n\nfrom ...data.place_name import PlaceName\nfrom .generic_mutation import MutationVariantGenerator\n\n# Configuration section\n\n\ndef configure(*_: Any) -> None:\n    \"\"\" All behaviour is currently hard-coded.\n    \"\"\"\n    return None\n\n# Analysis section\n\n\ndef create(normalizer: Any, transliterator: Any, config: None) -> 'PostcodeTokenAnalysis':\n    \"\"\" Create a new token analysis instance for this module.\n    \"\"\"\n    return PostcodeTokenAnalysis(normalizer, transliterator)\n\n\nclass PostcodeTokenAnalysis:\n    \"\"\" Special normalization and variant generation for postcodes.\n\n        This analyser must not be used with anything but postcodes as\n        it follows some special rules: the canonial ID is the form that\n        is used for the output. `compute_variants` then needs to ensure that\n        the generated variants once more follow the standard normalization\n        and transliteration, so that postcodes are correctly recognised by\n        the search algorithm.\n    \"\"\"\n    def __init__(self, norm: Any, trans: Any) -> None:\n        self.norm = norm\n        self.trans = trans\n\n        self.mutator = MutationVariantGenerator(' ', (' ', ''))\n\n    def get_canonical_id(self, name: PlaceName) -> str:\n        \"\"\" Return the standard form of the postcode.\n        \"\"\"\n        return name.name.strip().upper()\n\n    def compute_variants(self, norm_name: str) -> List[str]:\n        \"\"\" Compute the spelling variants for the given normalized postcode.\n\n            Takes the canonical form of the postcode, normalizes it using the\n            standard rules and then creates variants of the result where\n            all spaces are optional.\n        \"\"\"\n        # Postcodes follow their own transliteration rules.\n        # Make sure at this point, that the terms are normalized in a way\n        # that they are searchable with the standard transliteration rules.\n        return [self.trans.transliterate(term) for term in\n                self.mutator.generate([self.norm.transliterate(norm_name)]) if term]\n"
  },
  {
    "path": "src/nominatim_db/tokenizer/token_analysis/simple_trie.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nSimple dict-based implementation of a trie structure.\n\"\"\"\nfrom typing import TypeVar, Generic, Tuple, Optional, List, Dict\nfrom collections import defaultdict\n\nT = TypeVar('T')\n\n\nclass SimpleTrie(Generic[T]):\n    \"\"\" A simple read-only trie structure.\n        This structure supports examply one lookup operation,\n        which is longest-prefix lookup.\n    \"\"\"\n\n    def __init__(self, data: Optional[List[Tuple[str, T]]] = None) -> None:\n        self._tree: Dict[str, 'SimpleTrie[T]'] = defaultdict(SimpleTrie[T])\n        self._value: Optional[T] = None\n        self._prefix = ''\n\n        if data:\n            for key, value in data:\n                self._add(key, 0, value)\n\n            self._make_compact()\n\n    def _add(self, word: str, pos: int, value: T) -> None:\n        \"\"\" (Internal) Add a sub-word to the trie.\n            The word is added from index 'pos'. If the sub-word to add\n            is empty, then the trie saves the given value.\n        \"\"\"\n        if pos < len(word):\n            self._tree[word[pos]]._add(word, pos + 1, value)\n        else:\n            self._value = value\n\n    def _make_compact(self) -> None:\n        \"\"\" (Internal) Compress tree where there is exactly one subtree\n            and no value.\n\n            Compression works recursively starting at the leaf.\n        \"\"\"\n        for t in self._tree.values():\n            t._make_compact()\n\n        if len(self._tree) == 1 and self._value is None:\n            assert not self._prefix\n            for k, v in self._tree.items():\n                self._prefix = k + v._prefix\n                self._tree = v._tree\n                self._value = v._value\n\n    def longest_prefix(self, word: str, start: int = 0) -> Tuple[Optional[T], int]:\n        \"\"\" Return the longest prefix match for the given word starting at\n            the position 'start'.\n\n            The function returns a tuple with the value for the longest match and\n            the position of the word after the match. If no match was found at\n            all, the function returns (None, start).\n        \"\"\"\n        cur = self\n        pos = start\n        result: Tuple[Optional[T], int] = None, start\n\n        while True:\n            if cur._prefix:\n                if not word.startswith(cur._prefix, pos):\n                    return result\n                pos += len(cur._prefix)\n\n            if cur._value:\n                result = cur._value, pos\n\n            if pos >= len(word) or word[pos] not in cur._tree:\n                return result\n\n            cur = cur._tree[word[pos]]\n            pos += 1\n"
  },
  {
    "path": "src/nominatim_db/tools/__init__.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nModule with functions for importing, updating Nominatim databases\nas well as general maintenance helpers.\n\"\"\"\n"
  },
  {
    "path": "src/nominatim_db/tools/add_osm_data.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nFunction to add additional OSM data from a file or the API into the database.\n\"\"\"\nfrom typing import Any, MutableMapping\nfrom pathlib import Path\nimport logging\nimport urllib\n\nfrom ..db.connection import connect\nfrom ..utils.url_utils import get_url\nfrom .exec_utils import run_osm2pgsql\n\nLOG = logging.getLogger()\n\n\ndef _run_osm2pgsql(dsn: str, options: MutableMapping[str, Any]) -> None:\n    run_osm2pgsql(options)\n\n    # Handle deletions\n    with connect(dsn) as conn:\n        with conn.cursor() as cur:\n            cur.execute('SELECT flush_deleted_places()')\n        conn.commit()\n\n\ndef add_data_from_file(dsn: str, fname: str, options: MutableMapping[str, Any]) -> int:\n    \"\"\" Adds data from a OSM file to the database. The file may be a normal\n        OSM file or a diff file in all formats supported by libosmium.\n    \"\"\"\n    options['import_file'] = Path(fname)\n    options['append'] = True\n    _run_osm2pgsql(dsn, options)\n\n    # No status update. We don't know where the file came from.\n    return 0\n\n\ndef add_osm_object(dsn: str, osm_type: str, osm_id: int, use_main_api: bool,\n                   options: MutableMapping[str, Any]) -> int:\n    \"\"\" Add or update a single OSM object from the latest version of the\n        API.\n    \"\"\"\n    if use_main_api:\n        base_url = f'https://www.openstreetmap.org/api/0.6/{osm_type}/{osm_id}'\n        if osm_type in ('way', 'relation'):\n            base_url += '/full'\n    else:\n        # use Overpass API\n        if osm_type == 'node':\n            data = f'node({osm_id});out meta;'\n        elif osm_type == 'way':\n            data = f'(way({osm_id});>;);out meta;'\n        else:\n            data = f'(rel(id:{osm_id});>;);out meta;'\n        base_url = 'https://overpass-api.de/api/interpreter?' \\\n                   + urllib.parse.urlencode({'data': data})\n\n    options['append'] = True\n    options['import_data'] = get_url(base_url).encode('utf-8')\n\n    _run_osm2pgsql(dsn, options)\n\n    return 0\n"
  },
  {
    "path": "src/nominatim_db/tools/admin.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nFunctions for database analysis and maintenance.\n\"\"\"\nfrom typing import Optional, Tuple, Any, cast\nimport logging\n\nimport psycopg\nfrom psycopg.types.json import Json\n\nfrom ..typing import DictCursorResult\nfrom ..config import Configuration\nfrom ..db.connection import connect, Cursor, register_hstore\nfrom ..db.sql_preprocessor import SQLPreprocessor\nfrom ..errors import UsageError\nfrom ..tokenizer import factory as tokenizer_factory\nfrom ..data.place_info import PlaceInfo\n\nLOG = logging.getLogger()\n\n\ndef _get_place_info(cursor: Cursor, osm_id: Optional[str],\n                    place_id: Optional[int]) -> DictCursorResult:\n    sql = \"\"\"SELECT place_id, extra.*\n             FROM placex, LATERAL placex_indexing_prepare(placex) as extra\n          \"\"\"\n\n    values: Tuple[Any, ...]\n    if osm_id:\n        osm_type = osm_id[0].upper()\n        if osm_type not in 'NWR' or not osm_id[1:].isdigit():\n            LOG.fatal('OSM ID must be of form <N|W|R><id>. Got: %s', osm_id)\n            raise UsageError(\"OSM ID parameter badly formatted\")\n\n        sql += ' WHERE placex.osm_type = %s AND placex.osm_id = %s'\n        values = (osm_type, int(osm_id[1:]))\n    elif place_id is not None:\n        sql += ' WHERE placex.place_id = %s'\n        values = (place_id, )\n    else:\n        LOG.fatal(\"No OSM object given to index.\")\n        raise UsageError(\"OSM object not found\")\n\n    cursor.execute(sql + ' LIMIT 1', values)\n\n    if cursor.rowcount < 1:\n        LOG.fatal(\"OSM object %s not found in database.\", osm_id)\n        raise UsageError(\"OSM object not found\")\n\n    return cast(DictCursorResult, cursor.fetchone())\n\n\ndef analyse_indexing(config: Configuration, osm_id: Optional[str] = None,\n                     place_id: Optional[int] = None) -> None:\n    \"\"\" Analyse indexing of a single Nominatim object.\n    \"\"\"\n    with connect(config.get_libpq_dsn()) as conn:\n        register_hstore(conn)\n        with conn.cursor(row_factory=psycopg.rows.dict_row) as cur:\n            place = _get_place_info(cur, osm_id, place_id)\n\n            cur.execute(\"update placex set indexed_status = 2 where place_id = %s\",\n                        (place['place_id'], ))\n\n            cur.execute(\"\"\"SET auto_explain.log_min_duration = '0';\n                           SET auto_explain.log_analyze = 'true';\n                           SET auto_explain.log_nested_statements = 'true';\n                           LOAD 'auto_explain';\n                           SET client_min_messages = LOG;\n                           SET log_min_messages = FATAL\"\"\")\n\n            tokenizer = tokenizer_factory.get_tokenizer_for_db(config)\n\n            # Enable printing of messages.\n            conn.add_notice_handler(lambda diag: print(diag.message_primary))\n\n            with tokenizer.name_analyzer() as analyzer:\n                cur.execute(\"\"\"UPDATE placex\n                               SET indexed_status = 0, address = %s, token_info = %s,\n                               name = %s, linked_place_id = %s\n                               WHERE place_id = %s\"\"\",\n                            (place['address'],\n                             Json(analyzer.process_place(PlaceInfo(place))),\n                             place['name'], place['linked_place_id'], place['place_id']))\n\n        # we do not want to keep the results\n        conn.rollback()\n\n\ndef clean_deleted_relations(config: Configuration, age: str) -> None:\n    \"\"\" Clean deleted relations older than a given age\n    \"\"\"\n    with connect(config.get_libpq_dsn()) as conn:\n        with conn.cursor() as cur:\n            try:\n                cur.execute(\"\"\"SELECT place_force_delete(p.place_id)\n                            FROM import_polygon_delete d, placex p\n                            WHERE p.osm_type = d.osm_type AND p.osm_id = d.osm_id\n                            AND age(p.indexed_date) > %s::interval\"\"\",\n                            (age, ))\n            except psycopg.DataError as exc:\n                raise UsageError('Invalid PostgreSQL time interval format') from exc\n        conn.commit()\n\n\ndef grant_ro_access(dsn: str, config: Configuration) -> None:\n    \"\"\" Grant read-only access to the web user for all Nominatim tables.\n        This can be used to grant access to a different user after import.\n    \"\"\"\n    with connect(dsn) as conn:\n        sql = SQLPreprocessor(conn, config)\n        sql.run_sql_file(conn, 'grants.sql')\n"
  },
  {
    "path": "src/nominatim_db/tools/check_database.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nCollection of functions that check if the database is complete and functional.\n\"\"\"\nfrom typing import Callable, Optional, Any, Union, Tuple, Mapping, List\nfrom enum import Enum\nfrom textwrap import dedent\n\nfrom ..config import Configuration\nfrom ..db.connection import connect, Connection, \\\n                            index_exists, table_exists, execute_scalar\nfrom ..db import properties\nfrom ..errors import UsageError\nfrom ..tokenizer import factory as tokenizer_factory\nfrom . import freeze\nfrom ..version import NOMINATIM_VERSION, parse_version\n\nCHECKLIST = []\n\n\nclass CheckState(Enum):\n    \"\"\" Possible states of a check. FATAL stops check execution entirely.\n    \"\"\"\n    OK = 0\n    FAIL = 1\n    FATAL = 2\n    NOT_APPLICABLE = 3\n    WARN = 4\n\n\nCheckResult = Union[CheckState, Tuple[CheckState, Mapping[str, Any]]]\nCheckFunc = Callable[[Connection, Configuration], CheckResult]\n\n\ndef _check(hint: Optional[str] = None) -> Callable[[CheckFunc], CheckFunc]:\n    \"\"\" Decorator for checks. It adds the function to the list of\n        checks to execute and adds the code for printing progress messages.\n    \"\"\"\n    def decorator(func: CheckFunc) -> CheckFunc:\n        title = (func.__doc__ or '').split('\\n', 1)[0].strip()\n\n        def run_check(conn: Connection, config: Configuration) -> CheckState:\n            print(title, end=' ... ')\n            ret = func(conn, config)\n            if isinstance(ret, tuple):\n                ret, params = ret\n            else:\n                params = {}\n            if ret == CheckState.OK:\n                print('\\033[92mOK\\033[0m')\n            elif ret == CheckState.WARN:\n                print('\\033[93mWARNING\\033[0m')\n                if hint:\n                    print('')\n                    print(dedent(hint.format(**params)))\n            elif ret == CheckState.NOT_APPLICABLE:\n                print('not applicable')\n            else:\n                print('\\x1B[31mFailed\\033[0m')\n                if hint:\n                    print(dedent(hint.format(**params)))\n            return ret\n\n        CHECKLIST.append(run_check)\n        return run_check\n\n    return decorator\n\n\nclass _BadConnection:\n\n    def __init__(self, msg: str) -> None:\n        self.msg = msg\n\n    def close(self) -> None:\n        \"\"\" Dummy function to provide the implementation.\n        \"\"\"\n\n\ndef check_database(config: Configuration) -> int:\n    \"\"\" Run a number of checks on the database and return the status.\n    \"\"\"\n    try:\n        conn = connect(config.get_libpq_dsn())\n    except UsageError as err:\n        conn = _BadConnection(str(err))  # type: ignore[assignment]\n\n    overall_result = 0\n    for check in CHECKLIST:\n        ret = check(conn, config)\n        if ret == CheckState.FATAL:\n            conn.close()\n            return 1\n        if ret in (CheckState.FATAL, CheckState.FAIL):\n            overall_result = 1\n\n    conn.close()\n    return overall_result\n\n\ndef _get_indexes(conn: Connection) -> List[str]:\n    indexes = ['idx_place_addressline_address_place_id',\n               'idx_placex_rank_search',\n               'idx_placex_rank_address',\n               'idx_placex_parent_place_id',\n               'idx_placex_geometry_reverse_lookupplacenode',\n               'idx_placex_geometry_reverse_lookuppolygon',\n               'idx_placex_geometry_placenode',\n               'idx_osmline_parent_place_id',\n               'idx_osmline_parent_osm_id',\n               'idx_location_postcodes_id',\n               'idx_location_postcodes_postcode'\n               ]\n\n    # These won't exist if --reverse-only import was used\n    if table_exists(conn, 'search_name'):\n        indexes.extend(('idx_search_name_nameaddress_vector',\n                        'idx_search_name_name_vector',\n                        'idx_search_name_centroid',\n                        'idx_placex_housenumber',\n                        'idx_osmline_parent_osm_id_with_hnr'))\n\n    # These won't exist if --no-updates import was used\n    if table_exists(conn, 'place'):\n        indexes.extend(('idx_location_area_country_place_id',\n                        'idx_place_osm_unique',\n                        'idx_placex_rank_address_sector',\n                        'idx_placex_rank_boundaries_sector'))\n\n    return indexes\n\n\n# CHECK FUNCTIONS\n#\n# Functions are executed in the order they appear here.\n\n@_check(hint=\"\"\"\\\n             {error}\n\n             Hints:\n             * Is the database server started?\n             * Check the NOMINATIM_DATABASE_DSN variable in your local .env\n             * Try connecting to the database with the same settings\n\n             Project directory: {config.project_dir}\n             Current setting of NOMINATIM_DATABASE_DSN: {config.DATABASE_DSN}\n             \"\"\")\ndef check_connection(conn: Any, config: Configuration) -> CheckResult:\n    \"\"\" Checking database connection\n    \"\"\"\n    if isinstance(conn, _BadConnection):\n        return CheckState.FATAL, dict(error=conn.msg, config=config)\n\n    return CheckState.OK\n\n\n@_check(hint=\"\"\"\\\n             Database version ({db_version}) doesn't match Nominatim version ({nom_version})\n\n             Hints:\n             {instruction}\n\n             Project directory: {config.project_dir}\n             Current setting of NOMINATIM_DATABASE_DSN: {config.DATABASE_DSN}\n             \"\"\")\ndef check_database_version(conn: Connection, config: Configuration) -> CheckResult:\n    \"\"\" Checking database_version matches Nominatim software version\n    \"\"\"\n\n    db_version_str = None\n    if not table_exists(conn, 'nominatim_properties'):\n        instruction = 'Are you connecting to the correct database?'\n    else:\n        db_version_str = properties.get_property(conn, 'database_version')\n\n        if db_version_str is None:\n            instruction = 'Database version not found. Did the import finish?'\n        else:\n            db_version = parse_version(db_version_str)\n\n            if db_version == NOMINATIM_VERSION:\n                return CheckState.OK\n\n            instruction = (\n                \"Run migrations: 'nominatim admin --migrate'\"\n                if db_version < NOMINATIM_VERSION\n                else 'You need to upgrade the Nominatim software.'\n            ) + ' Check the Migration chapter of the Administration Guide.'\n\n    return CheckState.FATAL, dict(db_version=db_version_str,\n                                  nom_version=NOMINATIM_VERSION,\n                                  instruction=instruction,\n                                  config=config)\n\n\n@_check(hint=\"\"\"\\\n             placex table not found\n\n             Hints:\n             * Are you connecting to the correct database?\n             * Did the import process finish without errors?\n\n             Project directory: {config.project_dir}\n             Current setting of NOMINATIM_DATABASE_DSN: {config.DATABASE_DSN}\n             \"\"\")\ndef check_placex_table(conn: Connection, config: Configuration) -> CheckResult:\n    \"\"\" Checking for placex table\n    \"\"\"\n    if table_exists(conn, 'placex'):\n        return CheckState.OK\n\n    return CheckState.FATAL, dict(config=config)\n\n\n@_check(hint=\"\"\"placex table has no data. Did the import finish successfully?\"\"\")\ndef check_placex_size(conn: Connection, _: Configuration) -> CheckResult:\n    \"\"\" Checking for placex content\n    \"\"\"\n    cnt = execute_scalar(conn, 'SELECT count(*) FROM (SELECT * FROM placex LIMIT 100) x')\n\n    return CheckState.OK if cnt > 0 else CheckState.FATAL\n\n\n@_check(hint=\"\"\"{msg}\"\"\")\ndef check_tokenizer(_: Connection, config: Configuration) -> CheckResult:\n    \"\"\" Checking that tokenizer works\n    \"\"\"\n    try:\n        tokenizer = tokenizer_factory.get_tokenizer_for_db(config)\n    except UsageError:\n        return CheckState.FAIL, dict(msg=\"\"\"\\\n            Cannot load tokenizer. Did the import finish successfully?\"\"\")\n\n    result = tokenizer.check_database(config)\n\n    if result is None:\n        return CheckState.OK\n\n    return CheckState.FAIL, dict(msg=result)\n\n\n@_check(hint=\"\"\"\\\n             Wikipedia/Wikidata importance tables missing.\n             Quality of search results may be degraded. Reverse geocoding is unaffected.\n             See https://nominatim.org/release-docs/latest/admin/Import/#wikipediawikidata-rankings\n             \"\"\")\ndef check_existance_wikipedia(conn: Connection, _: Configuration) -> CheckResult:\n    \"\"\" Checking for wikipedia/wikidata data\n    \"\"\"\n    if not table_exists(conn, 'search_name') or not table_exists(conn, 'place'):\n        return CheckState.NOT_APPLICABLE\n\n    if table_exists(conn, 'wikimedia_importance'):\n        cnt = execute_scalar(conn, 'SELECT count(*) FROM wikimedia_importance')\n    else:\n        cnt = execute_scalar(conn, 'SELECT count(*) FROM wikipedia_article')\n\n    return CheckState.WARN if cnt == 0 else CheckState.OK\n\n\n@_check(hint=\"\"\"\\\n             The indexing didn't finish. {count} entries are not yet indexed.\n\n             To index the remaining entries, run:   {index_cmd}\n             \"\"\")\ndef check_indexing(conn: Connection, _: Configuration) -> CheckResult:\n    \"\"\" Checking indexing status\n    \"\"\"\n    cnt = execute_scalar(conn, 'SELECT count(*) FROM placex WHERE indexed_status > 0')\n\n    if cnt == 0:\n        return CheckState.OK\n\n    if freeze.is_frozen(conn):\n        index_cmd = \"\"\"\\\n            Database is marked frozen, it cannot be updated.\n            Low counts of unindexed places are fine.\"\"\"\n        return CheckState.WARN, dict(count=cnt, index_cmd=index_cmd)\n\n    if index_exists(conn, 'idx_placex_rank_search'):\n        # Likely just an interrupted update.\n        index_cmd = 'nominatim index'\n    else:\n        # Looks like the import process got interrupted.\n        index_cmd = 'nominatim import --continue indexing'\n\n    return CheckState.FAIL, dict(count=cnt, index_cmd=index_cmd)\n\n\n@_check(hint=\"\"\"\\\n             The following indexes are missing:\n               {indexes}\n\n             Rerun the index creation with:   nominatim import --continue db-postprocess\n             \"\"\")\ndef check_database_indexes(conn: Connection, _: Configuration) -> CheckResult:\n    \"\"\" Checking that database indexes are complete\n    \"\"\"\n    missing = []\n    for index in _get_indexes(conn):\n        if not index_exists(conn, index):\n            missing.append(index)\n\n    if missing:\n        return CheckState.FAIL, dict(indexes='\\n  '.join(missing))\n\n    return CheckState.OK\n\n\n@_check(hint=\"\"\"\\\n             At least one index is invalid. That can happen, e.g. when index creation was\n             disrupted and later restarted. You should delete the affected indices\n             and recreate them.\n\n             Invalid indexes:\n               {indexes}\n             \"\"\")\ndef check_database_index_valid(conn: Connection, _: Configuration) -> CheckResult:\n    \"\"\" Checking that all database indexes are valid\n    \"\"\"\n    with conn.cursor() as cur:\n        cur.execute(\"\"\" SELECT relname FROM pg_class, pg_index\n                        WHERE pg_index.indisvalid = false\n                        AND pg_index.indexrelid = pg_class.oid\"\"\")\n\n        broken = [c[0] for c in cur]\n\n    if broken:\n        return CheckState.FAIL, dict(indexes='\\n  '.join(broken))\n\n    return CheckState.OK\n\n\n@_check(hint=\"\"\"\\\n             {error}\n             Run TIGER import again:   nominatim add-data --tiger-data <DIR>\n             \"\"\")\ndef check_tiger_table(conn: Connection, config: Configuration) -> CheckResult:\n    \"\"\" Checking TIGER external data table.\n    \"\"\"\n    if not config.get_bool('USE_US_TIGER_DATA'):\n        return CheckState.NOT_APPLICABLE\n\n    if not table_exists(conn, 'location_property_tiger'):\n        return CheckState.FAIL, dict(error='TIGER data table not found.')\n\n    if execute_scalar(conn, 'SELECT count(*) FROM location_property_tiger') == 0:\n        return CheckState.FAIL, dict(error='TIGER data table is empty.')\n\n    return CheckState.OK\n"
  },
  {
    "path": "src/nominatim_db/tools/collect_os_info.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nCollection of host system information including software versions, memory,\nstorage, and database configuration.\n\"\"\"\nimport os\nimport subprocess\nimport sys\nfrom pathlib import Path\nfrom typing import List, Optional, Union\n\nimport psutil\n\nfrom ..config import Configuration\nfrom ..db.connection import connect, server_version_tuple, execute_scalar\nfrom ..version import NOMINATIM_VERSION\n\n\ndef friendly_memory_string(mem: float) -> str:\n    \"\"\"Create a user friendly string for the amount of memory specified as mem\"\"\"\n    mem_magnitude = (\"bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\")\n    mag = 0\n    # determine order of magnitude\n    while mem > 1000:\n        mem /= 1000\n        mag += 1\n\n    return f\"{mem:.1f} {mem_magnitude[mag]}\"\n\n\ndef run_command(cmd: Union[str, List[str]]) -> str:\n    \"\"\"Runs a command using the shell and returns the output from stdout\"\"\"\n    try:\n        if sys.version_info < (3, 7):\n            cap_out = subprocess.run(cmd, stdout=subprocess.PIPE, check=False)\n        else:\n            cap_out = subprocess.run(cmd, capture_output=True, check=False)\n        return cap_out.stdout.decode(\"utf-8\")\n    except FileNotFoundError:\n        # non-Linux system should end up here\n        return f\"Unknown (unable to find the '{cmd}' command)\"\n\n\ndef os_name_info() -> str:\n    \"\"\"Obtain Operating System Name (and possibly the version)\"\"\"\n    os_info = None\n    # man page os-release(5) details meaning of the fields\n    if Path(\"/etc/os-release\").is_file():\n        os_info = from_file_find_line_portion(\n            \"/etc/os-release\", \"PRETTY_NAME\", \"=\")\n    # alternative location\n    elif Path(\"/usr/lib/os-release\").is_file():\n        os_info = from_file_find_line_portion(\n            \"/usr/lib/os-release\", \"PRETTY_NAME\", \"=\"\n        )\n\n    # fallback on Python's os name\n    if os_info is None or os_info == \"\":\n        os_info = os.name\n\n    # if the above is insufficient, take a look at neofetch's approach to OS detection\n    return os_info\n\n\n# Note: Intended to be used on informational files like /proc\ndef from_file_find_line_portion(\n    filename: str, start: str, sep: str, fieldnum: int = 1\n) -> Optional[str]:\n    \"\"\"open filename, finds the line starting with the 'start' string.\n    Splits the line using separator and returns a \"fieldnum\" from the split.\"\"\"\n    with open(filename, encoding='utf8') as file:\n        result = \"\"\n        for line in file:\n            if line.startswith(start):\n                result = line.split(sep)[fieldnum].strip()\n        return result\n\n\ndef get_postgresql_config(version: int) -> str:\n    \"\"\"Retrieve postgres configuration file\"\"\"\n    try:\n        with open(f\"/etc/postgresql/{version}/main/postgresql.conf\", encoding='utf8') as file:\n            db_config = file.read()\n            file.close()\n            return db_config\n    except IOError:\n        return f\"**Could not read '/etc/postgresql/{version}/main/postgresql.conf'**\"\n\n\ndef report_system_information(config: Configuration) -> None:\n    \"\"\"Generate a report about the host system including software versions, memory,\n    storage, and database configuration.\"\"\"\n\n    with connect(config.get_libpq_dsn(), dbname='postgres') as conn:\n        postgresql_ver: str = '.'.join(map(str, server_version_tuple(conn)))\n\n        with conn.cursor() as cur:\n            cur.execute(\"SELECT datname FROM pg_catalog.pg_database WHERE datname=%s\",\n                        (config.get_database_params()['dbname'], ))\n            nominatim_db_exists = cur.rowcount > 0\n\n    if nominatim_db_exists:\n        with connect(config.get_libpq_dsn()) as conn:\n            postgis_ver: str = execute_scalar(conn, 'SELECT postgis_lib_version()')\n    else:\n        postgis_ver = \"Unable to connect to database\"\n\n    postgresql_config: str = get_postgresql_config(int(float(postgresql_ver)))\n\n    # Note: psutil.disk_partitions() is similar to run_command(\"lsblk\")\n\n    # Note: run_command(\"systemd-detect-virt\") only works on Linux, on other OSes\n    # should give a message: \"Unknown (unable to find the 'systemd-detect-virt' command)\"\n\n    # Generates the Markdown report.\n\n    report = f\"\"\"\n    **Instructions**\n    Use this information in your issue report at https://github.com/osm-search/Nominatim/issues\n    Redirect the output to a file:\n    $ ./collect_os_info.py > report.md\n\n\n    **Software Environment:**\n    - Python version: {sys.version}\n    - Nominatim version: {NOMINATIM_VERSION!s}\n    - PostgreSQL version: {postgresql_ver}\n    - PostGIS version: {postgis_ver}\n    - OS: {os_name_info()}\n\n\n    **Hardware Configuration:**\n    - RAM: {friendly_memory_string(psutil.virtual_memory().total)}\n    - number of CPUs: {psutil.cpu_count(logical=False)}\n    - bare metal/AWS/other cloud service (per systemd-detect-virt(1)):\n        {run_command(\"systemd-detect-virt\")}\n    - type and size of disks:\n    **`df -h` - df - report file system disk space usage: **\n    ```\n    {run_command([\"df\", \"-h\"])}\n    ```\n\n    **lsblk - list block devices: **\n    ```\n    {run_command(\"lsblk\")}\n    ```\n\n\n    **Postgresql Configuration:**\n    ```\n    {postgresql_config}\n    ```\n    **Notes**\n    Please add any notes about anything above anything above that is incorrect.\n\"\"\"\n    print(report)\n"
  },
  {
    "path": "src/nominatim_db/tools/convert_sqlite.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nExporting a Nominatim database to SQlite.\n\"\"\"\nfrom typing import Set, Any, Optional, Union\nimport datetime as dt\nimport logging\nfrom pathlib import Path\n\nimport sqlalchemy as sa\n\nimport nominatim_api as napi\nfrom nominatim_api.search.query_analyzer_factory import make_query_analyzer\nfrom nominatim_api.typing import SaSelect, SaRow\nfrom nominatim_api.sql.sqlalchemy_types import Geometry, IntArray\n\nLOG = logging.getLogger()\n\n\nasync def convert(project_dir: Optional[Union[str, Path]],\n                  outfile: Path, options: Set[str]) -> None:\n    \"\"\" Export an existing database to sqlite. The resulting database\n        will be usable against the Python frontend of Nominatim.\n    \"\"\"\n    api = napi.NominatimAPIAsync(project_dir)\n\n    try:\n        outapi = napi.NominatimAPIAsync(project_dir,\n                                        {'NOMINATIM_DATABASE_DSN': f\"sqlite:dbname={outfile}\",\n                                         'NOMINATIM_DATABASE_RW': '1'})\n\n        try:\n            async with api.begin() as src, outapi.begin() as dest:\n                writer = SqliteWriter(src, dest, options)\n                await writer.write()\n        finally:\n            await outapi.close()\n    finally:\n        await api.close()\n\n\nclass SqliteWriter:\n    \"\"\" Worker class which creates a new SQLite database.\n    \"\"\"\n\n    def __init__(self, src: napi.SearchConnection,\n                 dest: napi.SearchConnection, options: Set[str]) -> None:\n        self.src = src\n        self.dest = dest\n        self.options = options\n\n    async def write(self) -> None:\n        \"\"\" Create the database structure and copy the data from\n            the source database to the destination.\n        \"\"\"\n        LOG.warning('Setting up spatialite')\n        await self.dest.execute(sa.select(sa.func.InitSpatialMetaData(True, 'WGS84')))\n\n        await self.create_tables()\n        await self.copy_data()\n        if 'search' in self.options:\n            await self.create_word_table()\n        await self.create_indexes()\n\n    async def create_tables(self) -> None:\n        \"\"\" Set up the database tables.\n        \"\"\"\n        LOG.warning('Setting up tables')\n        if 'search' not in self.options:\n            self.dest.t.meta.remove(self.dest.t.search_name)\n        else:\n            await self.create_class_tables()\n\n        await self.dest.connection.run_sync(self.dest.t.meta.create_all)\n\n        # Convert all Geometry columns to Spatialite geometries\n        for table in self.dest.t.meta.sorted_tables:\n            for col in table.c:\n                if isinstance(col.type, Geometry):\n                    await self.dest.execute(sa.select(\n                        sa.func.RecoverGeometryColumn(table.name, col.name, 4326,\n                                                      col.type.subtype.upper(), 'XY')))\n\n    async def create_class_tables(self) -> None:\n        \"\"\" Set up the table that serve class/type-specific geometries.\n        \"\"\"\n        sql = sa.text(\"\"\"SELECT tablename FROM pg_tables\n                         WHERE tablename LIKE 'place_classtype_%'\"\"\")\n        for res in await self.src.execute(sql):\n            for db in (self.src, self.dest):\n                sa.Table(res[0], db.t.meta,\n                         sa.Column('place_id', sa.BigInteger),\n                         sa.Column('centroid', Geometry))\n\n    async def create_word_table(self) -> None:\n        \"\"\" Create the word table.\n            This table needs the property information to determine the\n            correct format. Therefore needs to be done after all other\n            data has been copied.\n        \"\"\"\n        await make_query_analyzer(self.src)\n        await make_query_analyzer(self.dest)\n        src = self.src.t.meta.tables['word']\n        dest = self.dest.t.meta.tables['word']\n\n        await self.dest.connection.run_sync(dest.create)\n\n        LOG.warning(\"Copying word table\")\n        async_result = await self.src.connection.stream(sa.select(src))\n\n        async for partition in async_result.partitions(10000):\n            data = [{k: getattr(r, k) for k in r._fields} for r in partition]\n            await self.dest.execute(dest.insert(), data)\n\n        await self.dest.connection.run_sync(sa.Index('idx_word_woken', dest.c.word_token).create)\n\n    async def copy_data(self) -> None:\n        \"\"\" Copy data for all registered tables.\n        \"\"\"\n        def _getfield(row: SaRow, key: str) -> Any:\n            value = getattr(row, key)\n            if isinstance(value, dt.datetime):\n                if value.tzinfo is not None:\n                    value = value.astimezone(dt.timezone.utc)\n            return value\n\n        for table in self.dest.t.meta.sorted_tables:\n            LOG.warning(\"Copying '%s'\", table.name)\n            async_result = await self.src.connection.stream(self.select_from(table.name))\n\n            async for partition in async_result.partitions(10000):\n                data = [{('class_' if k == 'class' else k): _getfield(r, k)\n                         for k in r._fields}\n                        for r in partition]\n                await self.dest.execute(table.insert(), data)\n\n        # Set up a minimal copy of pg_tables used to look up the class tables later.\n        pg_tables = sa.Table('pg_tables', self.dest.t.meta,\n                             sa.Column('schemaname', sa.Text, default='public'),\n                             sa.Column('tablename', sa.Text))\n        await self.dest.connection.run_sync(pg_tables.create)\n        data = [{'tablename': t} for t in self.dest.t.meta.tables]\n        await self.dest.execute(pg_tables.insert().values(data))\n\n    async def create_indexes(self) -> None:\n        \"\"\" Add indexes necessary for the frontend.\n        \"\"\"\n        # reverse place node lookup needs an extra table to simulate a\n        # partial index with adaptive buffering.\n        await self.dest.execute(sa.text(\n            \"\"\" CREATE TABLE placex_place_node_areas AS\n                  SELECT place_id, ST_Expand(geometry,\n                                             14.0 * exp(-0.2 * rank_search) - 0.03) as geometry\n                  FROM placex\n                  WHERE rank_address between 5 and 25\n                        and osm_type = 'N'\n                        and linked_place_id is NULL \"\"\"))\n        await self.dest.execute(sa.select(\n            sa.func.RecoverGeometryColumn('placex_place_node_areas', 'geometry',\n                                          4326, 'GEOMETRY', 'XY')))\n        await self.dest.execute(sa.select(sa.func.CreateSpatialIndex(\n                                             'placex_place_node_areas', 'geometry')))\n\n        # Remaining indexes.\n        await self.create_spatial_index('country_grid', 'geometry')\n        await self.create_spatial_index('placex', 'geometry')\n        await self.create_spatial_index('osmline', 'linegeo')\n        await self.create_spatial_index('tiger', 'linegeo')\n        await self.create_index('placex', 'place_id')\n        await self.create_index('placex', 'parent_place_id')\n        await self.create_index('placex', 'rank_address')\n        await self.create_index('addressline', 'place_id')\n        await self.create_index('postcode', 'place_id')\n        await self.create_index('osmline', 'place_id')\n        await self.create_index('tiger', 'place_id')\n\n        if 'search' in self.options:\n            await self.create_spatial_index('postcode', 'geometry')\n            await self.create_spatial_index('search_name', 'centroid')\n            await self.create_index('search_name', 'place_id')\n            await self.create_index('osmline', 'parent_place_id')\n            await self.create_index('tiger', 'parent_place_id')\n            await self.create_search_index()\n\n            for t in self.dest.t.meta.tables:\n                if t.startswith('place_classtype_'):\n                    await self.dest.execute(sa.select(\n                      sa.func.CreateSpatialIndex(t, 'centroid')))\n\n    async def create_spatial_index(self, table: str, column: str) -> None:\n        \"\"\" Create a spatial index on the given table and column.\n        \"\"\"\n        await self.dest.execute(sa.select(\n                  sa.func.CreateSpatialIndex(getattr(self.dest.t, table).name, column)))\n\n    async def create_index(self, table_name: str, column: str) -> None:\n        \"\"\" Create a simple index on the given table and column.\n        \"\"\"\n        table = getattr(self.dest.t, table_name)\n        await self.dest.connection.run_sync(\n            sa.Index(f\"idx_{table}_{column}\", getattr(table.c, column)).create)\n\n    async def create_search_index(self) -> None:\n        \"\"\" Create the tables and indexes needed for word lookup.\n        \"\"\"\n        LOG.warning(\"Creating reverse search table\")\n        rsn = sa.Table('reverse_search_name', self.dest.t.meta,\n                       sa.Column('word', sa.Integer()),\n                       sa.Column('column', sa.Text()),\n                       sa.Column('places', IntArray))\n        await self.dest.connection.run_sync(rsn.create)\n\n        tsrc = self.src.t.search_name\n        for column in ('name_vector', 'nameaddress_vector'):\n            sql = sa.select(sa.func.unnest(getattr(tsrc.c, column)).label('word'),\n                            sa.func.ArrayAgg(tsrc.c.place_id).label('places'))\\\n                    .group_by('word')\n\n            async_result = await self.src.connection.stream(sql)\n            async for partition in async_result.partitions(100):\n                data = []\n                for row in partition:\n                    row.places.sort()\n                    data.append({'word': row.word,\n                                 'column': column,\n                                 'places': row.places})\n                await self.dest.execute(rsn.insert(), data)\n\n        await self.dest.connection.run_sync(\n            sa.Index('idx_reverse_search_name_word', rsn.c.word).create)\n\n    def select_from(self, table: str) -> SaSelect:\n        \"\"\" Create the SQL statement to select the source columns and rows.\n        \"\"\"\n        columns = self.src.t.meta.tables[table].c\n\n        if table == 'placex':\n            # SQLite struggles with Geometries that are larger than 5MB,\n            # so simplify those.\n            return sa.select(*(c for c in columns if not isinstance(c.type, Geometry)),\n                             sa.func.ST_AsText(columns.centroid).label('centroid'),\n                             sa.func.ST_AsText(\n                               sa.case((sa.func.ST_MemSize(columns.geometry) < 5000000,\n                                        columns.geometry),\n                                       else_=sa.func.ST_SimplifyPreserveTopology(\n                                                columns.geometry, 0.0001)\n                                       )).label('geometry'))\n\n        sql = sa.select(*(sa.func.ST_AsText(c).label(c.name)\n                        if isinstance(c.type, Geometry) else c for c in columns))\n\n        return sql\n"
  },
  {
    "path": "src/nominatim_db/tools/database_import.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nFunctions for setting up and importing a new Nominatim database.\n\"\"\"\nfrom typing import Tuple, Optional, Union, Sequence, MutableMapping, Any\nimport logging\nimport os\nimport subprocess\nimport asyncio\nfrom pathlib import Path\n\nimport psutil\nimport psycopg\nfrom psycopg import sql as pysql\n\nfrom ..errors import UsageError\nfrom ..config import Configuration\nfrom ..db.connection import connect, get_pg_env, Connection, server_version_tuple, \\\n                            postgis_version_tuple, drop_tables, table_exists, execute_scalar\nfrom ..db.sql_preprocessor import SQLPreprocessor\nfrom ..db.query_pool import QueryPool\nfrom .exec_utils import run_osm2pgsql\nfrom ..version import POSTGRESQL_REQUIRED_VERSION, POSTGIS_REQUIRED_VERSION\n\nLOG = logging.getLogger()\n\n\ndef _require_version(module: str, actual: Tuple[int, int], expected: Tuple[int, int]) -> None:\n    \"\"\" Compares the version for the given module and raises an exception\n        if the actual version is too old.\n    \"\"\"\n    if actual < expected:\n        LOG.fatal('Minimum supported version of %s is %d.%d. '\n                  'Found version %d.%d.',\n                  module, expected[0], expected[1], actual[0], actual[1])\n        raise UsageError(f'{module} is too old.')\n\n\ndef _require_loaded(extension_name: str, conn: Connection) -> None:\n    \"\"\" Check that the given extension is loaded. \"\"\"\n    with conn.cursor() as cur:\n        cur.execute('SELECT * FROM pg_extension WHERE extname = %s', (extension_name, ))\n        if cur.rowcount <= 0:\n            LOG.fatal('Required module %s is not loaded.', extension_name)\n            raise UsageError(f'{extension_name} is not loaded.')\n\n\ndef check_existing_database_plugins(dsn: str) -> None:\n    \"\"\" Check that the database has the required plugins installed.\"\"\"\n    with connect(dsn) as conn:\n        _require_version('PostgreSQL server',\n                         server_version_tuple(conn),\n                         POSTGRESQL_REQUIRED_VERSION)\n        _require_version('PostGIS',\n                         postgis_version_tuple(conn),\n                         POSTGIS_REQUIRED_VERSION)\n        _require_loaded('hstore', conn)\n\n\ndef setup_database_skeleton(dsn: str, rouser: Optional[str] = None) -> None:\n    \"\"\" Create a new database for Nominatim and populate it with the\n        essential extensions.\n\n        The function fails when the database already exists or Postgresql or\n        PostGIS versions are too old.\n\n        Uses `createdb` to create the database.\n\n        If 'rouser' is given, then the function also checks that the user\n        with that given name exists.\n\n        Requires superuser rights by the caller.\n    \"\"\"\n    proc = subprocess.run(['createdb'], env=get_pg_env(dsn), check=False)\n\n    if proc.returncode != 0:\n        raise UsageError('Creating new database failed.')\n\n    with connect(dsn) as conn:\n        _require_version('PostgreSQL server',\n                         server_version_tuple(conn),\n                         POSTGRESQL_REQUIRED_VERSION)\n\n        if rouser is not None:\n            cnt = execute_scalar(conn, 'SELECT count(*) FROM pg_user where usename = %s',\n                                 (rouser, ))\n            if cnt == 0:\n                LOG.fatal(\"Web user '%s' does not exist. Create it with:\\n\"\n                          \"\\n      createuser %s\", rouser, rouser)\n                raise UsageError('Missing read-only user.')\n\n        # Create extensions.\n        with conn.cursor() as cur:\n            cur.execute('CREATE EXTENSION IF NOT EXISTS hstore')\n            cur.execute('CREATE EXTENSION IF NOT EXISTS postgis')\n            cur.execute('CREATE EXTENSION IF NOT EXISTS postgis_raster')\n\n        conn.commit()\n\n        _require_version('PostGIS',\n                         postgis_version_tuple(conn),\n                         POSTGIS_REQUIRED_VERSION)\n\n\ndef import_osm_data(osm_files: Union[Path, Sequence[Path]],\n                    options: MutableMapping[str, Any],\n                    drop: bool = False, ignore_errors: bool = False) -> None:\n    \"\"\" Import the given OSM files. 'options' contains the list of\n        default settings for osm2pgsql.\n    \"\"\"\n    options['import_file'] = osm_files\n    options['append'] = False\n    options['threads'] = 1\n\n    if not options['flatnode_file'] and options['osm2pgsql_cache'] == 0:\n        # Make some educated guesses about cache size based on the size\n        # of the import file and the available memory.\n        mem = psutil.virtual_memory()\n        fsize = 0\n        if isinstance(osm_files, list):\n            for fname in osm_files:\n                fsize += os.stat(str(fname)).st_size\n        else:\n            fsize = os.stat(str(osm_files)).st_size\n        options['osm2pgsql_cache'] = int(min((mem.available + getattr(mem, 'cached', 0)) * 0.75,\n                                             fsize * 2) / 1024 / 1024) + 1\n\n    run_osm2pgsql(options)\n\n    with connect(options['dsn']) as conn:\n        if not ignore_errors:\n            with conn.cursor() as cur:\n                cur.execute('SELECT true FROM place LIMIT 1')\n                if cur.rowcount == 0:\n                    raise UsageError('No data imported by osm2pgsql.')\n\n        if drop:\n            drop_tables(conn, 'planet_osm_nodes')\n            conn.commit()\n\n    if drop and options['flatnode_file']:\n        Path(options['flatnode_file']).unlink()\n\n\ndef create_tables(conn: Connection, config: Configuration, reverse_only: bool = False) -> None:\n    \"\"\" Create the set of basic tables.\n        When `reverse_only` is True, then the main table for searching will\n        be skipped and only reverse search is possible.\n    \"\"\"\n    SQLPreprocessor(conn, config).run_sql_file(conn, 'tables.sql',\n                                               create_reverse_only=reverse_only)\n\n    # reinitiate the preprocessor to get all the newly created tables\n    SQLPreprocessor(conn, config).run_sql_file(conn, 'grants.sql')\n\n\ndef create_table_triggers(conn: Connection, config: Configuration) -> None:\n    \"\"\" Create the triggers for the tables. The trigger functions must already\n        have been imported with refresh.create_functions().\n    \"\"\"\n    sql = SQLPreprocessor(conn, config)\n    sql.run_sql_file(conn, 'table-triggers.sql')\n\n\ndef create_partition_tables(conn: Connection, config: Configuration) -> None:\n    \"\"\" Create tables that have explicit partitioning.\n    \"\"\"\n    sql = SQLPreprocessor(conn, config)\n    sql.run_sql_file(conn, 'partition-tables.src.sql')\n\n\ndef truncate_data_tables(conn: Connection) -> None:\n    \"\"\" Truncate all data tables to prepare for a fresh load.\n    \"\"\"\n    with conn.cursor() as cur:\n        cur.execute('TRUNCATE placex')\n        cur.execute('TRUNCATE place_addressline')\n        cur.execute('TRUNCATE location_area')\n        cur.execute('TRUNCATE location_area_country')\n        cur.execute('TRUNCATE location_property_tiger')\n        cur.execute('TRUNCATE location_property_osmline')\n        cur.execute('TRUNCATE location_postcodes')\n        if table_exists(conn, 'search_name'):\n            cur.execute('TRUNCATE search_name')\n        cur.execute('DROP SEQUENCE IF EXISTS seq_place')\n        cur.execute('CREATE SEQUENCE seq_place start 100000')\n\n        cur.execute(\"\"\"SELECT tablename FROM pg_tables\n                       WHERE tablename LIKE 'location_road_%'\"\"\")\n\n        for table in [r[0] for r in list(cur)]:\n            cur.execute(pysql.SQL('TRUNCATE {}').format(pysql.Identifier(table)))\n\n    conn.commit()\n\n\n_COPY_COLUMNS = pysql.SQL(',').join(map(pysql.Identifier,\n                                        ('osm_type', 'osm_id', 'class', 'type',\n                                         'name', 'admin_level', 'address',\n                                         'extratags', 'geometry')))\n\n\nasync def load_data(dsn: str, threads: int) -> None:\n    \"\"\" Copy data into the word and placex table.\n    \"\"\"\n    placex_threads = max(1, threads - 1)\n\n    progress = asyncio.create_task(_progress_print())\n\n    async with QueryPool(dsn, placex_threads + 1) as pool:\n        # Copy data from place to placex in <threads - 1> chunks.\n        for imod in range(placex_threads):\n            await pool.put_query(\n                pysql.SQL(\"\"\"INSERT INTO placex ({columns})\n                               SELECT {columns} FROM place\n                                WHERE osm_id % {total} = {mod}\n                          \"\"\").format(columns=_COPY_COLUMNS,\n                                      total=pysql.Literal(placex_threads),\n                                      mod=pysql.Literal(imod)), None)\n\n        # Interpolations need to be copied separately\n        await pool.put_query(\"\"\"\n                INSERT INTO location_property_osmline (osm_id, type, address, linegeo)\n                  SELECT osm_id, type, address, geometry\n                  FROM place_interpolation\n                \"\"\", None)\n\n    progress.cancel()\n\n    async with await psycopg.AsyncConnection.connect(dsn) as aconn:\n        await aconn.execute('ANALYSE')\n\n\nasync def _progress_print() -> None:\n    while True:\n        try:\n            await asyncio.sleep(1)\n        except asyncio.CancelledError:\n            print('', flush=True)\n            break\n        print('.', end='', flush=True)\n\n\nasync def create_search_indices(conn: Connection, config: Configuration,\n                                drop: bool = False, threads: int = 1) -> None:\n    \"\"\" Create tables that have explicit partitioning.\n    \"\"\"\n\n    # If index creation failed and left an index invalid, they need to be\n    # cleaned out first, so that the script recreates them.\n    with conn.cursor() as cur:\n        cur.execute(\"\"\"SELECT relname FROM pg_class, pg_index\n                       WHERE pg_index.indisvalid = false\n                             AND pg_index.indexrelid = pg_class.oid\"\"\")\n        bad_indices = [row[0] for row in list(cur)]\n        for idx in bad_indices:\n            LOG.info(\"Drop invalid index %s.\", idx)\n            cur.execute(pysql.SQL('DROP INDEX {}').format(pysql.Identifier(idx)))\n    conn.commit()\n\n    sql = SQLPreprocessor(conn, config)\n\n    await sql.run_parallel_sql_file(config.get_libpq_dsn(),\n                                    'indices.sql', min(8, threads), drop=drop)\n"
  },
  {
    "path": "src/nominatim_db/tools/exec_utils.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nHelper functions for executing external programs.\n\"\"\"\nfrom typing import Any, Mapping, List, Optional\nimport logging\nimport os\nimport re\nimport subprocess\nimport shutil\n\nfrom ..db.connection import get_pg_env\nfrom ..errors import UsageError\nfrom ..version import OSM2PGSQL_REQUIRED_VERSION\n\nLOG = logging.getLogger()\n\n\ndef run_osm2pgsql(options: Mapping[str, Any]) -> None:\n    \"\"\" Run osm2pgsql with the given options.\n    \"\"\"\n    _check_osm2pgsql_version(options['osm2pgsql'])\n\n    env = get_pg_env(options['dsn'])\n\n    cmd = [_find_osm2pgsql_cmd(options['osm2pgsql']),\n           '--append' if options['append'] else '--create',\n           '--slim',\n           '--log-progress', 'true',\n           '--number-processes', '1' if options['append'] else str(options['threads']),\n           '--cache', str(options['osm2pgsql_cache']),\n           '--style', str(options['osm2pgsql_style'])\n           ]\n\n    env['LUA_PATH'] = ';'.join((str(options['osm2pgsql_style_path'] / '?.lua'),\n                                os.environ.get('LUA_PATH', ';')))\n    env['THEMEPARK_PATH'] = str(options['osm2pgsql_style_path'] / 'themes')\n    if 'THEMEPARK_PATH' in os.environ:\n        env['THEMEPARK_PATH'] += ':' + os.environ['THEMEPARK_PATH']\n    cmd.extend(('--output', 'flex'))\n\n    for flavour in ('data', 'index'):\n        if options['tablespaces'][f\"main_{flavour}\"]:\n            env[f\"NOMINATIM_TABLESPACE_PLACE_{flavour.upper()}\"] = \\\n                options['tablespaces'][f\"main_{flavour}\"]\n\n    if options['flatnode_file']:\n        cmd.extend(('--flat-nodes', options['flatnode_file']))\n\n    cmd.extend(_mk_tablespace_options('slim', options))\n\n    if options.get('disable_jit', False):\n        env['PGOPTIONS'] = '-c jit=off -c max_parallel_workers_per_gather=0'\n\n    if 'import_data' in options:\n        cmd.extend(('-r', 'xml', '-'))\n    elif isinstance(options['import_file'], list):\n        for fname in options['import_file']:\n            cmd.append(str(fname))\n    else:\n        cmd.append(str(options['import_file']))\n\n    subprocess.run(cmd, cwd=options.get('cwd', '.'),\n                   input=options.get('import_data'),\n                   env=env, check=True)\n\n\ndef _mk_tablespace_options(ttype: str, options: Mapping[str, Any]) -> List[str]:\n    cmds: List[str] = []\n    for flavour in ('data', 'index'):\n        if options['tablespaces'][f\"{ttype}_{flavour}\"]:\n            cmds.extend((f\"--tablespace-{ttype}-{flavour}\",\n                         options['tablespaces'][f\"{ttype}_{flavour}\"]))\n\n    return cmds\n\n\ndef _find_osm2pgsql_cmd(cmdline: Optional[str]) -> str:\n    if cmdline:\n        return cmdline\n\n    in_path = shutil.which('osm2pgsql')\n    if in_path is None:\n        raise UsageError('osm2pgsql executable not found. Please install osm2pgsql first.')\n\n    return str(in_path)\n\n\ndef _check_osm2pgsql_version(cmdline: Optional[str]) -> None:\n    cmd = [_find_osm2pgsql_cmd(cmdline), '--version']\n\n    result = subprocess.run(cmd, capture_output=True, check=True)\n\n    if not result.stderr:\n        raise UsageError(\"osm2pgsql does not print version information.\")\n\n    verinfo = result.stderr.decode('UTF-8')\n\n    match = re.search(r'osm2pgsql version (\\d+)\\.(\\d+)', verinfo)\n    if match is None:\n        raise UsageError(f\"No version information found in output: {verinfo}\")\n\n    if (int(match[1]), int(match[2])) < OSM2PGSQL_REQUIRED_VERSION:\n        raise UsageError(f\"osm2pgsql is too old. Found version {match[1]}.{match[2]}. \"\n                         f\"Need at least version {'.'.join(map(str, OSM2PGSQL_REQUIRED_VERSION))}.\")\n"
  },
  {
    "path": "src/nominatim_db/tools/freeze.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nFunctions for removing unnecessary data from the database.\n\"\"\"\nfrom typing import Optional\nfrom pathlib import Path\n\nfrom psycopg import sql as pysql\n\nfrom ..db.connection import Connection, drop_tables, table_exists\n\nUPDATE_TABLES = [\n    'address_levels',\n    'gb_postcode',\n    'import_osmosis_log',\n    'location_area%',\n    'location_road%',\n    'place',\n    'place_associated_street',\n    'place_entrance',\n    'place_postcode',\n    'planet_osm_%',\n    'search_name_%',\n    'us_postcode',\n    'wikipedia_%'\n]\n\n\ndef drop_update_tables(conn: Connection) -> None:\n    \"\"\" Drop all tables only necessary for updating the database from\n        OSM replication data.\n    \"\"\"\n    parts = (pysql.SQL(\"(tablename LIKE {})\").format(pysql.Literal(t)) for t in UPDATE_TABLES)\n\n    with conn.cursor() as cur:\n        cur.execute(pysql.SQL(\"SELECT tablename FROM pg_tables WHERE \")\n                    + pysql.SQL(' or ').join(parts))\n        tables = [r[0] for r in cur]\n\n    drop_tables(conn, *tables, cascade=True)\n    conn.commit()\n\n\ndef drop_flatnode_file(fpath: Optional[Path]) -> None:\n    \"\"\" Remove the flatnode file if it exists.\n    \"\"\"\n    if fpath and fpath.exists():\n        fpath.unlink()\n\n\ndef is_frozen(conn: Connection) -> bool:\n    \"\"\" Returns true if database is in a frozen state\n    \"\"\"\n    return table_exists(conn, 'place') is False\n"
  },
  {
    "path": "src/nominatim_db/tools/migration.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nFunctions for database migration to newer software versions.\n\"\"\"\nfrom typing import List, Tuple, Callable, Any\nimport logging\n\nfrom ..errors import UsageError\nfrom ..config import Configuration\nfrom ..db import properties\nfrom ..db.connection import connect, Connection, \\\n                            table_exists, register_hstore, table_has_column\nfrom ..db.sql_preprocessor import SQLPreprocessor\nfrom ..version import NominatimVersion, NOMINATIM_VERSION, parse_version\nfrom ..tokenizer import factory as tokenizer_factory\nfrom ..data.country_info import create_country_names, setup_country_config\nfrom .freeze import is_frozen\nfrom . import refresh\n\nLOG = logging.getLogger()\n\n_MIGRATION_FUNCTIONS: List[Tuple[NominatimVersion, Callable[..., None]]] = []\n\n\ndef migrate(config: Configuration, paths: Any) -> int:\n    \"\"\" Check for the current database version and execute migrations,\n        if necessary.\n    \"\"\"\n    with connect(config.get_libpq_dsn()) as conn:\n        register_hstore(conn)\n        if table_exists(conn, 'nominatim_properties'):\n            db_version_str = properties.get_property(conn, 'database_version')\n        else:\n            db_version_str = None\n\n        if db_version_str is not None:\n            db_version = parse_version(db_version_str)\n        else:\n            db_version = None\n\n        if db_version is None or db_version < (4, 3, 0, 0):\n            LOG.fatal('Your database version is older than 4.3. '\n                      'Direct migration is not possible.\\n'\n                      'You should strongly consider a reimport. If that is not possible\\n'\n                      'please upgrade to 4.3 first and then to the newest version.')\n            raise UsageError('Migration not possible.')\n\n        if db_version == NOMINATIM_VERSION:\n            LOG.warning(\"Database already at latest version (%s)\", db_version_str)\n            return 0\n\n        LOG.info(\"Detected database version: %s\", db_version_str)\n\n        for version, func in _MIGRATION_FUNCTIONS:\n            if db_version < version:\n                title = func.__doc__ or ''\n                LOG.warning(\"Running: %s (%s)\", title.split('\\n', 1)[0], version)\n                kwargs = dict(conn=conn, config=config, paths=paths)\n                func(**kwargs)\n                conn.commit()\n\n        LOG.warning('Updating SQL functions.')\n        refresh.create_functions(conn, config)\n        tokenizer = tokenizer_factory.get_tokenizer_for_db(config)\n        tokenizer.update_sql_functions(config)\n\n        properties.set_property(conn, 'database_version', str(NOMINATIM_VERSION))\n\n        conn.commit()\n\n    return 0\n\n\ndef _migration(major: int, minor: int, patch: int = 0,\n               dbpatch: int = 0) -> Callable[[Callable[..., None]], Callable[..., None]]:\n    \"\"\" Decorator for a single migration step. The parameters describe the\n        version after which the migration is applicable, i.e before changing\n        from the given version to the next, the migration is required.\n\n        All migrations are run in the order in which they are defined in this\n        file. Do not run global SQL scripts for migrations as you cannot be sure\n        that these scripts do the same in later versions.\n\n        Functions will always be reimported in full at the end of the migration\n        process, so the migration functions may leave a temporary state behind\n        there.\n    \"\"\"\n    def decorator(func: Callable[..., None]) -> Callable[..., None]:\n        version = NominatimVersion(major, minor, patch, dbpatch)\n        _MIGRATION_FUNCTIONS.append((version, func))\n        return func\n\n    return decorator\n\n\n@_migration(4, 4, 99, 0)\ndef create_postcode_area_lookup_index(conn: Connection, **_: Any) -> None:\n    \"\"\" Create index needed for looking up postcode areas from postocde points.\n    \"\"\"\n    with conn.cursor() as cur:\n        cur.execute(\"\"\"CREATE INDEX IF NOT EXISTS idx_placex_postcode_areas\n                       ON placex USING BTREE (country_code, postcode)\n                       WHERE osm_type = 'R' AND class = 'boundary' AND type = 'postal_code'\n                    \"\"\")\n\n\n@_migration(4, 4, 99, 1)\ndef create_postcode_parent_index(conn: Connection, **_: Any) -> None:\n    \"\"\" Create index needed for updating postcodes when a parent changes.\n    \"\"\"\n    if table_exists(conn, 'planet_osm_ways'):\n        with conn.cursor() as cur:\n            cur.execute(\"\"\"CREATE INDEX IF NOT EXISTS\n                             idx_location_postcode_parent_place_id\n                             ON location_postcode USING BTREE (parent_place_id)\"\"\")\n\n\n@_migration(5, 1, 99, 0)\ndef create_placex_entrance_table(conn: Connection, config: Configuration, **_: Any) -> None:\n    \"\"\" Add the placex_entrance table to store linked-up entrance nodes\n    \"\"\"\n    if not table_exists(conn, 'placex_entrance'):\n        sqlp = SQLPreprocessor(conn, config)\n        sqlp.run_string(conn, \"\"\"\n            -- Table to store location of entrance nodes\n            CREATE TABLE placex_entrance (\n              place_id BIGINT NOT NULL,\n              osm_id BIGINT NOT NULL,\n              type TEXT NOT NULL,\n              location GEOMETRY(Point, 4326) NOT NULL,\n              extratags HSTORE\n              );\n            CREATE UNIQUE INDEX idx_placex_entrance_place_id_osm_id ON placex_entrance\n              USING BTREE (place_id, osm_id) {{db.tablespace.search_index}};\n            GRANT SELECT ON placex_entrance TO \"{{config.DATABASE_WEBUSER}}\" ;\n              \"\"\")\n\n\n@_migration(5, 1, 99, 1)\ndef create_place_entrance_table(conn: Connection, config: Configuration, **_: Any) -> None:\n    \"\"\" Add the place_entrance table to store incoming entrance nodes\n    \"\"\"\n    if not table_exists(conn, 'place_entrance'):\n        with conn.cursor() as cur:\n            cur.execute(\"\"\"\n            -- Table to store location of entrance nodes\n            CREATE TABLE place_entrance (\n              osm_id BIGINT NOT NULL,\n              type TEXT NOT NULL,\n              extratags HSTORE,\n              geometry GEOMETRY(Point, 4326) NOT NULL\n              );\n            CREATE UNIQUE INDEX place_entrance_osm_id_idx ON place_entrance\n              USING BTREE (osm_id);\n              \"\"\")\n\n\n@_migration(5, 2, 99, 0)\ndef convert_country_tokens(conn: Connection, config: Configuration, **_: Any) -> None:\n    \"\"\" Convert country word tokens\n\n        Country tokens now save the country in the info field instead of the\n        word. This migration removes all country tokens from the word table\n        and reimports the default country name. This means that custom names\n        are lost. If you need them back, invalidate the OSM objects containing\n        the names by setting indexed_status to 2 and then reindex the database.\n    \"\"\"\n    tokenizer = tokenizer_factory.get_tokenizer_for_db(config)\n    # There is only one tokenizer at the time of migration, so we make\n    # some assumptions here about the structure of the database. This will\n    # fail if somebody has written a custom tokenizer.\n    with conn.cursor() as cur:\n        cur.execute(\"DELETE FROM word WHERE type = 'C'\")\n    conn.commit()\n\n    setup_country_config(config)\n    create_country_names(conn, tokenizer, config.get_str_list('LANGUAGES'))\n\n\n@_migration(5, 2, 99, 1)\ndef create_place_postcode_table(conn: Connection, config: Configuration, **_: Any) -> None:\n    \"\"\" Restructure postcode tables\n    \"\"\"\n    sqlp = SQLPreprocessor(conn, config)\n    mutable = not is_frozen(conn)\n    has_place_table = table_exists(conn, 'place_postcode')\n    has_postcode_table = table_exists(conn, 'location_postcodes')\n    if mutable and not has_place_table:\n        with conn.cursor() as cur:\n            cur.execute(\n                \"\"\"\n                CREATE TABLE place_postcode (\n                    osm_type CHAR(1) NOT NULL,\n                    osm_id BIGINT NOT NULL,\n                    postcode TEXT NOT NULL,\n                    country_code TEXT,\n                    centroid GEOMETRY(Point, 4326) NOT NULL,\n                    geometry GEOMETRY(Geometry, 4326)\n                )\n                \"\"\")\n            # Move postcode points into the new table\n            cur.execute(\"ALTER TABLE place DISABLE TRIGGER ALL\")\n            cur.execute(\n                \"\"\"\n                WITH deleted AS (\n                  DELETE FROM place\n                  WHERE (class = 'place' AND type = 'postcode')\n                        OR (osm_type = 'R'\n                            AND class = 'boundary' AND type = 'postal_code')\n                  RETURNING osm_type, osm_id, address->'postcode' as postcode,\n                            ST_Centroid(geometry) as centroid,\n                            (CASE WHEN class = 'place' THEN NULL ELSE geometry END) as geometry)\n                INSERT INTO place_postcode (osm_type, osm_id, postcode, centroid, geometry)\n                    (SELECT * FROM deleted\n                     WHERE deleted.postcode is not NULL AND deleted.centroid is not NULL)\n                \"\"\")\n            cur.execute(\n                \"\"\"\n                CREATE INDEX place_postcode_osm_id_idx ON place_postcode\n                  USING BTREE (osm_type, osm_id)\n                \"\"\")\n            cur.execute(\n                \"\"\"\n                CREATE INDEX place_postcode_postcode_idx ON place_postcode\n                  USING BTREE (postcode)\n                \"\"\")\n            cur.execute(\"ALTER TABLE place ENABLE TRIGGER ALL\")\n    if not has_postcode_table:\n        sqlp.run_sql_file(conn, 'functions/postcode_triggers.sql')\n        with conn.cursor() as cur:\n            # create a new location_postcode table which will replace the\n            # old one atomically in the end\n            cur.execute(\n                \"\"\"\n                CREATE TABLE location_postcodes (\n                    place_id BIGINT,\n                    osm_id BIGINT,\n                    rank_search SMALLINT,\n                    parent_place_id BIGINT,\n                    indexed_status SMALLINT,\n                    indexed_date TIMESTAMP,\n                    country_code VARCHAR(2),\n                    postcode TEXT,\n                    centroid Geometry(Point, 4326),\n                    geometry Geometry(Geometry, 4326) NOT NULL\n                )\n                \"\"\")\n            sqlp.run_string(conn,\n                            'GRANT SELECT ON location_postcodes TO \"{{config.DATABASE_WEBUSER}}\"')\n            # remove postcodes from the various auxiliary tables\n            cur.execute(\n                \"\"\"\n                DELETE FROM place_addressline\n                  WHERE address_place_id = ANY(\n                    SELECT place_id FROM placex\n                      WHERE osm_type = 'R'\n                            AND class = 'boundary' AND type = 'postal_code')\n                \"\"\")\n            if mutable:\n                cur.execute(\n                    \"\"\"\n                    SELECT deleteLocationArea(partition, place_id, rank_search),\n                           deleteSearchName(partition, place_id)\n                      FROM placex\n                      WHERE osm_type = 'R' AND class = 'boundary' AND type = 'postal_code'\n                    \"\"\")\n            if table_exists(conn, 'search_name'):\n                cur.execute(\n                    \"\"\"\n                    DELETE FROM search_name\n                      WHERE place_id = ANY(\n                        SELECT place_id FROM placex\n                          WHERE osm_type = 'R'\n                                AND class = 'boundary' AND type = 'postal_code')\n                    \"\"\")\n            # move postcode areas from placex to location_postcodes\n            # avoiding automatic invalidation\n            cur.execute(\"ALTER TABLE placex DISABLE TRIGGER ALL\")\n            cur.execute(\n                \"\"\"\n                WITH deleted AS (\n                    DELETE FROM placex\n                      WHERE osm_type = 'R'\n                            AND class = 'boundary' AND type = 'postal_code'\n                      RETURNING place_id, osm_id, rank_search, parent_place_id,\n                                indexed_status, indexed_date,\n                                country_code, postcode, centroid, geometry)\n                INSERT INTO location_postcodes (SELECT * from deleted)\n                \"\"\")\n            cur.execute(\"ALTER TABLE placex ENABLE TRIGGER ALL\")\n            # remove any old postcode centroid that would overlap with areas\n            cur.execute(\n                \"\"\"\n                DELETE FROM location_postcode o USING location_postcodes n\n                   WHERE o.country_code = n.country_code\n                         AND o.postcode = n.postcode\n                \"\"\")\n            # copy over old postcodes\n            cur.execute(\n                \"\"\"\n                INSERT INTO location_postcodes\n                    (SELECT place_id, NULL, rank_search, parent_place_id,\n                            indexed_status, indexed_date, country_code,\n                            postcode, geometry,\n                            ST_Expand(geometry, 0.05)\n                     FROM location_postcode)\n                \"\"\")\n            # add indexes and triggers\n            cur.execute(\"\"\"CREATE INDEX idx_location_postcodes_geometry\n                           ON location_postcodes USING GIST(geometry)\"\"\")\n            cur.execute(\"\"\"CREATE INDEX idx_location_postcodes_id\n                           ON location_postcodes USING BTREE(place_id)\"\"\")\n            cur.execute(\"\"\"CREATE INDEX idx_location_postcodes_osmid\n                           ON location_postcodes USING BTREE(osm_id)\"\"\")\n            cur.execute(\"\"\"CREATE INDEX idx_location_postcodes_postcode\n                           ON location_postcodes USING BTREE(postcode, country_code)\"\"\")\n            cur.execute(\"\"\"CREATE INDEX idx_location_postcodes_parent_place_id\n                           ON location_postcodes USING BTREE(parent_place_id)\"\"\")\n            cur.execute(\"\"\"CREATE TRIGGER location_postcodes_before_update\n                           BEFORE UPDATE ON location_postcodes\n                           FOR EACH ROW EXECUTE PROCEDURE postcodes_update()\"\"\")\n            cur.execute(\"\"\"CREATE TRIGGER location_postcodes_before_delete\n                           BEFORE DELETE ON location_postcodes\n                           FOR EACH ROW EXECUTE PROCEDURE postcodes_delete()\"\"\")\n            cur.execute(\"\"\"CREATE TRIGGER location_postcodes_before_insert\n                           BEFORE INSERT ON location_postcodes\n                           FOR EACH ROW EXECUTE PROCEDURE postcodes_insert()\"\"\")\n        sqlp.run_string(\n            conn,\n            \"\"\"\n            CREATE INDEX IF NOT EXISTS idx_placex_geometry_reverse_lookupPolygon_nopostcode\n            ON placex USING gist (geometry) {{db.tablespace.search_index}}\n            WHERE St_GeometryType(geometry) in ('ST_Polygon', 'ST_MultiPolygon')\n            AND rank_address between 4 and 25\n            AND name is not null AND linked_place_id is null;\n\n            CREATE INDEX IF NOT EXISTS idx_placex_geometry_reverse_lookupPlaceNode_nopostcode\n              ON placex USING gist (ST_Buffer(geometry, reverse_place_diameter(rank_search)))\n              {{db.tablespace.search_index}}\n              WHERE rank_address between 4 and 25\n                AND name is not null AND linked_place_id is null AND osm_type = 'N';\n\n            CREATE INDEX idx_placex_geometry_placenode_nopostcode ON placex\n              USING SPGIST (geometry) {{db.tablespace.address_index}}\n              WHERE osm_type = 'N' and rank_search < 26 and class = 'place';\n            ANALYSE;\n            \"\"\")\n\n\n@_migration(5, 2, 99, 3)\ndef create_place_interpolation_table(conn: Connection, config: Configuration, **_: Any) -> None:\n    \"\"\" Create place_interpolation table\n    \"\"\"\n    sqlp = SQLPreprocessor(conn, config)\n    mutable = not is_frozen(conn)\n    has_place_table = table_exists(conn, 'place_interpolation')\n\n    if mutable and not has_place_table:\n        # create tables\n        conn.execute(\"\"\"\n            CREATE TABLE place_interpolation (\n              osm_id BIGINT NOT NULL,\n              type TEXT NOT NULL,\n              address HSTORE,\n              nodes BIGINT[] NOT NULL,\n              geometry GEOMETRY(LineString, 4326)\n            );\n\n            CREATE TABLE IF NOT EXISTS place_interpolation_to_be_deleted (\n              osm_id BIGINT NOT NULL\n            );\n            \"\"\")\n        # copy data over\n        conn.execute(\"\"\"\n            ALTER TABLE place DISABLE TRIGGER ALL;\n\n            WITH deleted AS (\n              DELETE FROM place\n                WHERE class='place' and type = 'houses'\n                RETURNING osm_type, osm_id,\n                          address->'interpolation' as itype,\n                          address - 'interpolation'::TEXT as address,\n                          geometry)\n            INSERT INTO place_interpolation (osm_id, type, address, nodes, geometry)\n              (SELECT d.osm_id, d.itype, d.address, p.nodes, d.geometry\n                 FROM deleted d, planet_osm_ways p\n                 WHERE osm_type = 'W'\n                       AND d.osm_id = p.id\n                       AND itype is not null\n                       AND ST_GeometryType(geometry) = 'ST_LineString');\n\n            ALTER TABLE place ENABLE TRIGGER ALL;\n            \"\"\")\n\n        # create indices\n        conn.execute(\"\"\"\n            CREATE INDEX place_interpolation_nodes_idx ON place_interpolation\n              USING gin(nodes);\n            CREATE INDEX place_interpolation_osm_id_idx ON place_interpolation\n              USING btree(osm_id);\n            \"\"\")\n        # create triggers\n        sqlp.run_sql_file(conn, 'functions/interpolation.sql')\n        conn.execute(\"\"\"\n            CREATE TRIGGER place_interpolation_before_insert BEFORE INSERT ON place_interpolation\n              FOR EACH ROW EXECUTE PROCEDURE place_interpolation_insert();\n            CREATE TRIGGER place_interpolation_before_delete BEFORE DELETE ON place_interpolation\n              FOR EACH ROW EXECUTE PROCEDURE place_interpolation_delete();\n            \"\"\")\n        # mutate location_property_osmline table\n        conn.execute(\"\"\"\n            ALTER TABLE location_property_osmline ADD COLUMN type TEXT;\n\n            UPDATE location_property_osmline\n              SET type = coalesce(address->'interpolation', 'all'),\n                  address = address - 'interpolation'::TEXT;\n            \"\"\")\n\n\n@_migration(5, 2, 99, 4)\ndef backfill_importance(conn: Connection, **_: Any) -> None:\n    \"\"\" Backfill missing importance values.\n    \"\"\"\n    conn.execute(\"\"\"UPDATE placex\n                    SET importance = 0.40001 - (rank_search::float / 75)\n                    WHERE importance is NULL OR importance <= 0\n                 \"\"\")\n    if table_exists(conn, 'search_name')\\\n       and table_has_column(conn, 'search_name', 'search_rank'):\n        conn.execute(\"\"\"UPDATE search_name\n                        SET importance = 0.40001 - (search_rank::float / 75)\n                        WHERE importance is NULL OR importance <= 0\n                     \"\"\")\n        conn.execute(\"ALTER TABLE search_name DROP COLUMN search_rank\")\n\n\n@_migration(5, 2, 99, 5)\ndef create_place_associated_street_table(conn: Connection, **_: Any) -> None:\n    \"\"\" Create place_associated_street table for associatedStreet relations\n    \"\"\"\n    if table_exists(conn, 'place_associated_street'):\n        return\n\n    with conn.cursor() as cur:\n        cur.execute(\"\"\"\n            CREATE TABLE place_associated_street (\n              relation_id BIGINT NOT NULL,\n              member_type TEXT NOT NULL,\n              member_id   BIGINT NOT NULL,\n              member_role TEXT NOT NULL\n            )\n        \"\"\")\n\n        # Check the osm2pgsql middle table format using the properties table.\n        db_format = '1'\n        if table_exists(conn, 'osm2pgsql_properties'):\n            cur.execute(\"\"\"\n                SELECT value FROM osm2pgsql_properties\n                WHERE property = 'db_format'\n            \"\"\")\n            row = cur.fetchone()\n            if row is not None:\n                db_format = row[0]\n\n        # Populate from planet_osm_rels if the JSONB members format is in use.\n        if db_format != '1':\n            cur.execute(\"\"\"\n                INSERT INTO place_associated_street\n                       (relation_id, member_type, member_id, member_role)\n                SELECT id,\n                       UPPER(x.type),\n                       x.ref,\n                       x.role\n                  FROM planet_osm_rels,\n                       LATERAL jsonb_to_recordset(members)\n                         AS x(ref bigint, role text, type text)\n                 WHERE tags->>'type' = 'associatedStreet'\n                   AND x.role IN ('street', 'house')\n            \"\"\")\n        else:\n            LOG.warning(\n                '\\n'\n                'WARNING: Your database uses an old osm2pgsql middle table format.\\n'\n                'The place_associated_street table has been created but is empty.\\n'\n                'A full reimport is strongly recommended.\\n'\n            )\n\n        cur.execute(\"\"\"\n            CREATE INDEX place_associated_street_member_idx\n              ON place_associated_street USING BTREE (member_type, member_id);\n            CREATE INDEX place_associated_street_relation_id_idx\n              ON place_associated_street USING BTREE (relation_id);\n        \"\"\")\n\n\n@_migration(5, 3, 99, 0)\ndef create_associated_street_triggers(conn: Connection, config: Configuration, **_: Any) -> None:\n    \"\"\" Create triggers for tables on associated street tables.\n    \"\"\"\n    SQLPreprocessor(conn, config).run_sql_file(conn, 'functions/associated_street_triggers.sql')\n    with conn.cursor() as cur:\n        cur.execute(\"\"\"CREATE OR REPLACE TRIGGER place_associated_street_update\n                       AFTER INSERT OR DELETE ON place_associated_street\n                       FOR EACH ROW EXECUTE FUNCTION invalidate_associated_street_members()\"\"\")\n"
  },
  {
    "path": "src/nominatim_db/tools/postcodes.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nFunctions for importing, updating and otherwise maintaining the table\nof artificial postcode centroids.\n\"\"\"\nfrom typing import Optional, Tuple, Dict, TextIO\nfrom collections import defaultdict\nfrom pathlib import Path\nimport csv\nimport gzip\nimport logging\nfrom math import isfinite\n\nfrom psycopg import sql as pysql\n\nfrom ..db.connection import connect, Connection, table_exists\nfrom ..utils.centroid import PointsCentroid\nfrom ..data.postcode_format import PostcodeFormatter, CountryPostcodeMatcher\nfrom ..tokenizer.base import AbstractAnalyzer, AbstractTokenizer\n\nLOG = logging.getLogger()\n\n\ndef _to_float(numstr: str, max_value: float) -> float:\n    \"\"\" Convert the number in string into a float. The number is expected\n        to be in the range of [-max_value, max_value]. Otherwise rises a\n        ValueError.\n    \"\"\"\n    num = float(numstr)\n    if not isfinite(num) or num <= -max_value or num >= max_value:\n        raise ValueError()\n\n    return num\n\n\ndef _extent_to_rank(extent: int) -> int:\n    \"\"\" Guess a suitable search rank from the extent of a postcode.\n    \"\"\"\n    if extent <= 100:\n        return 25\n    if extent <= 3000:\n        return 23\n    return 21\n\n\nclass _PostcodeCollector:\n    \"\"\" Collector for postcodes of a single country.\n    \"\"\"\n\n    def __init__(self, country: str, matcher: Optional[CountryPostcodeMatcher],\n                 default_extent: int, exclude: set[str] = set()):\n        self.country = country\n        self.matcher = matcher\n        self.extent = default_extent\n        self.exclude = exclude\n        self.collected: Dict[str, PointsCentroid] = defaultdict(PointsCentroid)\n        self.normalization_cache: Optional[Tuple[str, Optional[str]]] = None\n\n    def add(self, postcode: str, x: float, y: float) -> None:\n        \"\"\" Add the given postcode to the collection cache. If the postcode\n            already existed, it is overwritten with the new centroid.\n        \"\"\"\n        if self.matcher is not None:\n            normalized: Optional[str]\n            if self.normalization_cache and self.normalization_cache[0] == postcode:\n                normalized = self.normalization_cache[1]\n            else:\n                match = self.matcher.match(postcode)\n                normalized = self.matcher.normalize(match) if match else None\n                self.normalization_cache = (postcode, normalized)\n\n            if normalized and normalized not in self.exclude:\n                self.collected[normalized] += (x, y)\n\n    def commit(self, conn: Connection, analyzer: AbstractAnalyzer,\n               project_dir: Optional[Path], is_initial: bool) -> None:\n        \"\"\" Update postcodes for the country from the postcodes selected so far.\n\n            When 'project_dir' is set, then any postcode files found in this\n            directory are taken into account as well.\n        \"\"\"\n        if project_dir is not None:\n            self._update_from_external(analyzer, project_dir)\n\n        if is_initial:\n            to_delete = []\n        else:\n            with conn.cursor() as cur:\n                cur.execute(\"\"\"SELECT postcode FROM location_postcodes\n                               WHERE country_code = %s AND osm_id is null\"\"\",\n                            (self.country, ))\n                to_delete = [row[0] for row in cur if row[0] not in self.collected]\n\n        to_add = [dict(zip(('pc', 'x', 'y'), (k, *v.centroid())))\n                  for k, v in self.collected.items()]\n        self.collected = defaultdict(PointsCentroid)\n\n        LOG.info(\"Processing country '%s' (%s added, %s deleted).\",\n                 self.country, len(to_add), len(to_delete))\n\n        with conn.cursor() as cur:\n            if to_add:\n                columns = ['country_code',\n                           'rank_search',\n                           'postcode',\n                           'centroid',\n                           'geometry']\n                values = [pysql.Literal(self.country),\n                          pysql.Literal(_extent_to_rank(self.extent)),\n                          pysql.Placeholder('pc'),\n                          pysql.SQL('ST_SetSRID(ST_MakePoint(%(x)s, %(y)s), 4326)'),\n                          pysql.SQL(\"\"\"expand_by_meters(\n                                           ST_SetSRID(ST_MakePoint(%(x)s, %(y)s), 4326), {})\"\"\")\n                               .format(pysql.Literal(self.extent))]\n                if is_initial:\n                    columns.extend(('place_id', 'indexed_status'))\n                    values.extend((pysql.SQL(\"nextval('seq_place')\"), pysql.Literal(1)))\n\n                cur.executemany(pysql.SQL(\"INSERT INTO location_postcodes ({}) VALUES ({})\")\n                                     .format(pysql.SQL(',')\n                                                  .join(pysql.Identifier(c) for c in columns),\n                                             pysql.SQL(',').join(values)),\n                                to_add)\n            if to_delete:\n                cur.execute(\"\"\"DELETE FROM location_postcodes\n                               WHERE country_code = %s and postcode = any(%s)\n                                     AND osm_id is null\n                            \"\"\", (self.country, to_delete))\n\n    def _update_from_external(self, analyzer: AbstractAnalyzer, project_dir: Path) -> None:\n        \"\"\" Look for an external postcode file for the active country in\n            the project directory and add missing postcodes when found.\n        \"\"\"\n        csvfile = self._open_external(project_dir)\n        if csvfile is None:\n            return\n\n        try:\n            reader = csv.DictReader(csvfile)\n            for row in reader:\n                if 'postcode' not in row or 'lat' not in row or 'lon' not in row:\n                    LOG.warning(\"Bad format for external postcode file for country '%s'.\"\n                                \" Ignored.\", self.country)\n                    return\n                postcode = analyzer.normalize_postcode(row['postcode'])\n                if postcode not in self.collected:\n                    try:\n                        # Do float conversation separately, it might throw\n                        centroid = (_to_float(row['lon'], 180),\n                                    _to_float(row['lat'], 90))\n                        self.collected[postcode] += centroid\n                    except ValueError:\n                        LOG.warning(\"Bad coordinates %s, %s in '%s' country postcode file.\",\n                                    row['lat'], row['lon'], self.country)\n\n        finally:\n            csvfile.close()\n\n    def _open_external(self, project_dir: Path) -> Optional[TextIO]:\n        fname = project_dir / f'{self.country}_postcodes.csv'\n\n        if fname.is_file():\n            LOG.info(\"Using external postcode file '%s'.\", fname)\n            return open(fname, 'r', encoding='utf-8')\n\n        fname = project_dir / f'{self.country}_postcodes.csv.gz'\n\n        if fname.is_file():\n            LOG.info(\"Using external postcode file '%s'.\", fname)\n            return gzip.open(fname, 'rt', encoding='utf-8')\n\n        return None\n\n\ndef update_postcodes(dsn: str, project_dir: Optional[Path],\n                     tokenizer: AbstractTokenizer, force_reimport: bool = False) -> None:\n    \"\"\" Update the table of postcodes from the input tables\n        placex and place_postcode.\n    \"\"\"\n    matcher = PostcodeFormatter()\n    with tokenizer.name_analyzer() as analyzer:\n        with connect(dsn) as conn:\n            # Backfill country_code column where required\n            conn.execute(\"\"\"UPDATE place_postcode\n                              SET country_code = get_country_code(centroid)\n                              WHERE country_code is null\n                         \"\"\")\n            if force_reimport:\n                conn.execute(\"TRUNCATE location_postcodes\")\n                is_initial = True\n            else:\n                is_initial = _is_postcode_table_empty(conn)\n            if is_initial:\n                conn.execute(\"\"\"ALTER TABLE location_postcodes\n                                DISABLE TRIGGER location_postcodes_before_insert\"\"\")\n            # Now update first postcode areas\n            _update_postcode_areas(conn, analyzer, matcher, is_initial)\n            # Then fill with estimated postcode centroids from other info\n            _update_guessed_postcode(conn, analyzer, matcher, project_dir, is_initial)\n            if is_initial:\n                conn.execute(\"\"\"ALTER TABLE location_postcodes\n                                ENABLE TRIGGER location_postcodes_before_insert\"\"\")\n            conn.commit()\n\n        analyzer.update_postcodes_from_db()\n\n\ndef _is_postcode_table_empty(conn: Connection) -> bool:\n    \"\"\" Check if there are any entries in the location_postcodes table yet.\n    \"\"\"\n    with conn.cursor() as cur:\n        cur.execute(\"SELECT place_id FROM location_postcodes LIMIT 1\")\n        return cur.fetchone() is None\n\n\ndef _insert_postcode_areas(conn: Connection, country_code: str,\n                           extent: int, pcs: list[dict[str, str]],\n                           is_initial: bool) -> None:\n    if pcs:\n        with conn.cursor() as cur:\n            columns = ['osm_id', 'country_code',\n                       'rank_search', 'postcode',\n                       'centroid', 'geometry']\n            values = [pysql.Identifier('osm_id'), pysql.Identifier('country_code'),\n                      pysql.Literal(_extent_to_rank(extent)), pysql.Placeholder('out'),\n                      pysql.Identifier('centroid'), pysql.Identifier('geometry')]\n            if is_initial:\n                columns.extend(('place_id', 'indexed_status'))\n                values.extend((pysql.SQL(\"nextval('seq_place')\"), pysql.Literal(1)))\n\n            cur.executemany(\n                pysql.SQL(\n                    \"\"\" INSERT INTO location_postcodes ({})\n                            SELECT {} FROM place_postcode\n                            WHERE osm_type = 'R'\n                                  and country_code = {} and postcode = %(in)s\n                                  and geometry is not null\n                    \"\"\").format(pysql.SQL(',')\n                                     .join(pysql.Identifier(c) for c in columns),\n                                pysql.SQL(',').join(values),\n                                pysql.Literal(country_code)),\n                pcs)\n\n\ndef _update_postcode_areas(conn: Connection, analyzer: AbstractAnalyzer,\n                           matcher: PostcodeFormatter, is_initial: bool) -> None:\n    \"\"\" Update the postcode areas made from postcode boundaries.\n    \"\"\"\n    # first delete all areas that have gone\n    if not is_initial:\n        conn.execute(\"\"\" DELETE FROM location_postcodes pc\n                         WHERE pc.osm_id is not null\n                           AND NOT EXISTS(\n                                  SELECT * FROM place_postcode pp\n                                  WHERE pp.osm_type = 'R' and pp.osm_id = pc.osm_id\n                                        and geometry is not null)\n                    \"\"\")\n    # now insert all in country batches, triggers will ensure proper updates\n    with conn.cursor() as cur:\n        cur.execute(\"\"\" SELECT country_code, postcode FROM place_postcode\n                        WHERE geometry is not null and osm_type = 'R'\n                        ORDER BY country_code\n                    \"\"\")\n        country_code = None\n        fmt = None\n        pcs = []\n        for cc, postcode in cur:\n            if country_code is None:\n                country_code = cc\n                fmt = matcher.get_matcher(country_code)\n            elif country_code != cc:\n                _insert_postcode_areas(conn, country_code,\n                                       matcher.get_postcode_extent(country_code), pcs,\n                                       is_initial)\n                country_code = cc\n                fmt = matcher.get_matcher(country_code)\n                pcs = []\n\n            if fmt is not None:\n                if (m := fmt.match(postcode)):\n                    pcs.append({'out': fmt.normalize(m), 'in': postcode})\n\n        if country_code is not None and pcs:\n            _insert_postcode_areas(conn, country_code,\n                                   matcher.get_postcode_extent(country_code), pcs,\n                                   is_initial)\n\n\ndef _update_guessed_postcode(conn: Connection, analyzer: AbstractAnalyzer,\n                             matcher: PostcodeFormatter, project_dir: Optional[Path],\n                             is_initial: bool) -> None:\n    \"\"\" Computes artificial postcode centroids from the placex table,\n        potentially enhances it with external data and then updates the\n        postcodes in the table 'location_postcodes'.\n    \"\"\"\n    # First get the list of countries that currently have postcodes.\n    # (Doing this before starting to insert, so it is fast on import.)\n    if is_initial:\n        todo_countries: set[str] = set()\n    else:\n        with conn.cursor() as cur:\n            cur.execute(\"\"\"SELECT DISTINCT country_code FROM location_postcodes\n                            WHERE osm_id is null\"\"\")\n            todo_countries = {row[0] for row in cur}\n\n    # Next, get the list of postcodes that are already covered by areas.\n    area_pcs = defaultdict(set)\n    with conn.cursor() as cur:\n        cur.execute(\"\"\"SELECT country_code, postcode\n                       FROM location_postcodes WHERE osm_id is not null\n                       ORDER BY country_code\"\"\")\n        for cc, pc in cur:\n            area_pcs[cc].add(pc)\n\n    # Create a temporary table which contains coverage of the postcode areas.\n    with conn.cursor() as cur:\n        cur.execute(\"DROP TABLE IF EXISTS _global_postcode_area\")\n        cur.execute(\"\"\"CREATE TABLE _global_postcode_area AS\n                       (SELECT ST_SubDivide(ST_SimplifyPreserveTopology(\n                                              ST_Union(geometry), 0.00001), 128) as geometry\n                        FROM place_postcode WHERE geometry is not null)\n                    \"\"\")\n        cur.execute(\"CREATE INDEX ON _global_postcode_area USING gist(geometry)\")\n\n    # Recompute the list of valid postcodes from placex.\n    with conn.cursor(name=\"placex_postcodes\") as cur:\n        cur.execute(\"\"\"\n            SELECT country_code, postcode, ST_X(centroid), ST_Y(centroid)\n              FROM (\n                (SELECT country_code, address->'postcode' as postcode, centroid\n                  FROM placex WHERE address ? 'postcode')\n                UNION\n                (SELECT country_code, postcode, centroid\n                 FROM place_postcode WHERE geometry is null)\n              ) x\n              WHERE not postcode like '%,%' and not postcode like '%;%'\n                    AND NOT EXISTS(SELECT * FROM _global_postcode_area g\n                                   WHERE ST_Intersects(x.centroid, g.geometry))\n              ORDER BY country_code\"\"\")\n\n        collector = None\n\n        for country, postcode, x, y in cur:\n            if collector is None or country != collector.country:\n                if collector is not None:\n                    collector.commit(conn, analyzer, project_dir, is_initial)\n                collector = _PostcodeCollector(country, matcher.get_matcher(country),\n                                               matcher.get_postcode_extent(country),\n                                               exclude=area_pcs[country])\n                todo_countries.discard(country)\n            collector.add(postcode, x, y)\n\n        if collector is not None:\n            collector.commit(conn, analyzer, project_dir, is_initial)\n\n    # Now handle any countries that are only in the postcode table.\n    for country in todo_countries:\n        fmt = matcher.get_matcher(country)\n        ext = matcher.get_postcode_extent(country)\n        _PostcodeCollector(country, fmt, ext,\n                           exclude=area_pcs[country]).commit(conn, analyzer, project_dir, False)\n\n    conn.execute(\"DROP TABLE IF EXISTS _global_postcode_area\")\n\n\ndef can_compute(dsn: str) -> bool:\n    \"\"\" Check that the necessary tables exist so that postcodes can be computed.\n    \"\"\"\n    with connect(dsn) as conn:\n        return table_exists(conn, 'place_postcode')\n"
  },
  {
    "path": "src/nominatim_db/tools/refresh.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nFunctions for bringing auxiliary data in the database up-to-date.\n\"\"\"\nfrom typing import MutableSequence, Tuple, Any, Mapping, Sequence, List\nimport csv\nimport gzip\nimport logging\nfrom pathlib import Path\n\nfrom psycopg import sql as pysql\n\nfrom ..config import Configuration\nfrom ..db.connection import Connection, connect, drop_tables\nfrom ..db.utils import execute_file\nfrom ..db.sql_preprocessor import SQLPreprocessor\n\nLOG = logging.getLogger()\n\nOSM_TYPE = {'N': 'node', 'W': 'way', 'R': 'relation'}\n\n\ndef _add_address_level_rows_from_entry(rows: MutableSequence[Tuple[Any, ...]],\n                                       entry: Mapping[str, Any]) -> None:\n    \"\"\" Converts a single entry from the JSON format for address rank\n        descriptions into a flat format suitable for inserting into a\n        PostgreSQL table and adds these lines to `rows`.\n    \"\"\"\n    countries = entry.get('countries') or (None, )\n    for key, values in entry['tags'].items():\n        for value, ranks in values.items():\n            if isinstance(ranks, list):\n                rank_search, rank_address = ranks\n            else:\n                rank_search = rank_address = ranks\n            if not value:\n                value = None\n            for country in countries:\n                rows.append((country, key, value, rank_search, rank_address))\n\n\ndef load_address_levels(conn: Connection, table: str, levels: Sequence[Mapping[str, Any]]) -> None:\n    \"\"\" Replace the `address_levels` table with the contents of `levels'.\n\n        A new table is created any previously existing table is dropped.\n        The table has the following columns:\n            country, class, type, rank_search, rank_address\n    \"\"\"\n    rows: List[Tuple[Any, ...]] = []\n    for entry in levels:\n        _add_address_level_rows_from_entry(rows, entry)\n\n    drop_tables(conn, table)\n\n    with conn.cursor() as cur:\n        cur.execute(pysql.SQL(\"\"\"CREATE TABLE {} (\n                                        country_code varchar(2),\n                                        class TEXT,\n                                        type TEXT,\n                                        rank_search SMALLINT,\n                                        rank_address SMALLINT)\n                              \"\"\").format(pysql.Identifier(table)))\n\n        cur.executemany(pysql.SQL(\"INSERT INTO {} VALUES (%s, %s, %s, %s, %s)\")\n                             .format(pysql.Identifier(table)), rows)\n\n        cur.execute(pysql.SQL('CREATE UNIQUE INDEX ON {} (country_code, class, type)')\n                    .format(pysql.Identifier(table)))\n\n    conn.commit()\n\n\ndef load_address_levels_from_config(conn: Connection, config: Configuration) -> None:\n    \"\"\" Replace the `address_levels` table with the content as\n        defined in the given configuration. Uses the parameter\n        NOMINATIM_ADDRESS_LEVEL_CONFIG to determine the location of the\n        configuration file.\n    \"\"\"\n    cfg = config.load_sub_configuration('', config='ADDRESS_LEVEL_CONFIG')\n    load_address_levels(conn, 'address_levels', cfg)\n\n\ndef create_functions(conn: Connection, config: Configuration,\n                     enable_diff_updates: bool = True,\n                     enable_debug: bool = False) -> None:\n    \"\"\" (Re)create the PL/pgSQL functions.\n    \"\"\"\n    sql = SQLPreprocessor(conn, config)\n\n    sql.run_sql_file(conn, 'functions.sql',\n                     disable_diff_updates=not enable_diff_updates,\n                     debug=enable_debug)\n\n\ndef import_wikipedia_articles(dsn: str, data_path: Path, ignore_errors: bool = False) -> int:\n    \"\"\" Replaces the wikipedia importance tables with new data.\n        The import is run in a single transaction so that the new data\n        is replace seamlessly.\n\n        Returns 0 if all was well and 1 if the importance file could not\n        be found. Throws an exception if there was an error reading the file.\n    \"\"\"\n    if import_importance_csv(dsn, data_path / 'wikimedia-importance.csv.gz') == 0 \\\n       or import_importance_sql(dsn, data_path / 'wikimedia-importance.sql.gz',\n                                ignore_errors) == 0:\n        return 0\n\n    return 1\n\n\ndef import_importance_csv(dsn: str, data_file: Path) -> int:\n    \"\"\" Replace wikipedia importance table with data from a\n        single CSV file.\n\n        The file must be a gzipped CSV and have the following columns:\n        language, title, importance, wikidata_id\n\n        Other columns may be present but will be ignored.\n    \"\"\"\n    if not data_file.exists():\n        return 1\n\n    # Only import the first occurrence of a wikidata ID.\n    # This keeps indexes and table small.\n    wd_done = set()\n\n    with connect(dsn) as conn:\n        drop_tables(conn, 'wikipedia_article', 'wikipedia_redirect', 'wikimedia_importance')\n        with conn.cursor() as cur:\n            cur.execute(\"\"\"CREATE TABLE wikimedia_importance (\n                             language TEXT NOT NULL,\n                             title TEXT NOT NULL,\n                             importance double precision NOT NULL,\n                             wikidata TEXT\n                           ) \"\"\")\n\n            copy_cmd = \"\"\"COPY wikimedia_importance(language, title, importance, wikidata)\n                          FROM STDIN\"\"\"\n            with gzip.open(\n                    str(data_file), 'rt', encoding='utf-8') as fd, \\\n                    cur.copy(copy_cmd) as copy:\n                for row in csv.DictReader(fd, delimiter='\\t', quotechar='|'):\n                    wd_id = int(row['wikidata_id'][1:])\n                    copy.write_row((row['language'],\n                                    row['title'],\n                                    row['importance'],\n                                    None if wd_id in wd_done else row['wikidata_id']))\n                    wd_done.add(wd_id)\n\n            cur.execute(\"\"\"CREATE INDEX IF NOT EXISTS idx_wikimedia_importance_title\n                           ON wikimedia_importance (title)\"\"\")\n            cur.execute(\"\"\"CREATE INDEX IF NOT EXISTS idx_wikimedia_importance_wikidata\n                           ON wikimedia_importance (wikidata)\n                           WHERE wikidata is not null\"\"\")\n\n        conn.commit()\n\n    return 0\n\n\ndef import_importance_sql(dsn: str, data_file: Path, ignore_errors: bool) -> int:\n    \"\"\" Replace wikipedia importance table with data from an SQL file.\n    \"\"\"\n    if not data_file.exists():\n        return 1\n\n    pre_code = \"\"\"BEGIN;\n                  DROP TABLE IF EXISTS \"wikipedia_article\";\n                  DROP TABLE IF EXISTS \"wikipedia_redirect\";\n                  DROP TABLE IF EXISTS \"wikipedia_importance\";\n               \"\"\"\n    post_code = \"COMMIT\"\n    execute_file(dsn, data_file, ignore_errors=ignore_errors,\n                 pre_code=pre_code, post_code=post_code)\n\n    return 0\n\n\ndef import_secondary_importance(dsn: str, data_path: Path, ignore_errors: bool = False) -> int:\n    \"\"\" Replaces the secondary importance raster data table with new data.\n\n        Returns 0 if all was well and 1 if the raster SQL file could not\n        be found. Throws an exception if there was an error reading the file.\n    \"\"\"\n    datafile = data_path / 'secondary_importance.sql.gz'\n    if not datafile.exists():\n        return 1\n\n    execute_file(dsn, datafile, ignore_errors=ignore_errors)\n\n    return 0\n\n\ndef recompute_importance(conn: Connection) -> None:\n    \"\"\" Recompute wikipedia links and importance for all entries in placex.\n        This is a long-running operations that must not be executed in\n        parallel with updates.\n    \"\"\"\n    with conn.cursor() as cur:\n        cur.execute('ALTER TABLE placex DISABLE TRIGGER ALL')\n        cur.execute(\"\"\"\n            UPDATE placex SET (wikipedia, importance) =\n               (SELECT wikipedia, importance\n                FROM compute_importance(extratags, country_code, rank_search, centroid))\n            \"\"\")\n        cur.execute(\"\"\"\n            UPDATE placex s SET wikipedia = d.wikipedia, importance = d.importance\n             FROM placex d\n             WHERE s.place_id = d.linked_place_id and d.wikipedia is not null\n                   and (s.wikipedia is null or s.importance < d.importance);\n            \"\"\")\n        cur.execute(\"\"\"\n            UPDATE search_name s SET importance = p.importance\n             FROM placex p\n             WHERE s.place_id = p.place_id AND s.importance != p.importance\n            \"\"\")\n\n        cur.execute('ALTER TABLE placex ENABLE TRIGGER ALL')\n    conn.commit()\n\n\ndef invalidate_osm_object(osm_type: str, osm_id: int, conn: Connection,\n                          recursive: bool = True) -> None:\n    \"\"\" Mark the given OSM object for reindexing. When 'recursive' is set\n        to True (the default), then all dependent objects are marked for\n        reindexing as well.\n\n        'osm_type' must be on of 'N' (node), 'W' (way) or 'R' (relation).\n        If the given object does not exist, then nothing happens.\n    \"\"\"\n    assert osm_type in ('N', 'R', 'W')\n\n    LOG.warning(\"Invalidating OSM %s %s%s.\",\n                OSM_TYPE[osm_type], osm_id,\n                ' and its dependent places' if recursive else '')\n\n    with conn.cursor() as cur:\n        if recursive:\n            sql = \"\"\"SELECT place_force_update(place_id)\n                     FROM placex WHERE osm_type = %s and osm_id = %s\"\"\"\n        else:\n            sql = \"\"\"UPDATE placex SET indexed_status = 2\n                     WHERE osm_type = %s and osm_id = %s\"\"\"\n\n        cur.execute(sql, (osm_type, osm_id))\n"
  },
  {
    "path": "src/nominatim_db/tools/replication.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nFunctions for updating a database from a replication source.\n\"\"\"\nfrom typing import ContextManager, MutableMapping, Any, Generator, cast, Iterator\nfrom contextlib import contextmanager\nimport datetime as dt\nfrom enum import Enum\nimport logging\nimport time\nimport types\nimport urllib.request as urlrequest\n\nfrom ..errors import UsageError\nfrom ..db import status\nfrom ..db.connection import Connection, connect\nfrom .exec_utils import run_osm2pgsql\n\ntry:\n    from osmium.replication.server import ReplicationServer\n    from osmium import WriteHandler\n    from osmium import version as pyo_version\n    import requests\nexcept ModuleNotFoundError as exc:\n    logging.getLogger().critical(\"pyosmium not installed. Replication functions not available.\\n\"\n                                 \"To install pyosmium via pip: pip install osmium\")\n    raise UsageError(\"replication tools not available\") from exc\n\nLOG = logging.getLogger()\n\n\ndef init_replication(conn: Connection, base_url: str,\n                     socket_timeout: int = 60) -> None:\n    \"\"\" Set up replication for the server at the given base URL.\n    \"\"\"\n    LOG.info(\"Using replication source: %s\", base_url)\n    date = status.compute_database_date(conn)\n\n    # margin of error to make sure we get all data\n    date -= dt.timedelta(hours=3)\n\n    with _make_replication_server(base_url, socket_timeout) as repl:\n        seq = repl.timestamp_to_sequence(date)\n\n    if seq is None:\n        LOG.fatal(\"Cannot reach the configured replication service '%s'.\\n\"\n                  \"Does the URL point to a directory containing OSM update data?\",\n                  base_url)\n        raise UsageError(\"Failed to reach replication service\")\n\n    status.set_status(conn, date=date, seq=seq)\n\n    LOG.warning(\"Updates initialised at sequence %s (%s)\", seq, date)\n\n\ndef check_for_updates(conn: Connection, base_url: str,\n                      socket_timeout: int = 60) -> int:\n    \"\"\" Check if new data is available from the replication service at the\n        given base URL.\n    \"\"\"\n    _, seq, _ = status.get_status(conn)\n\n    if seq is None:\n        LOG.error(\"Replication not set up. \"\n                  \"Please run 'nominatim replication --init' first.\")\n        return 254\n\n    with _make_replication_server(base_url, socket_timeout) as repl:\n        state = repl.get_state_info()\n\n    if state is None:\n        LOG.error(\"Cannot get state for URL %s.\", base_url)\n        return 253\n\n    if state.sequence <= seq:\n        LOG.warning(\"Database is up to date.\")\n        return 2\n\n    LOG.warning(\"New data available (%i => %i).\", seq, state.sequence)\n    return 0\n\n\nclass UpdateState(Enum):\n    \"\"\" Possible states after an update has run.\n    \"\"\"\n\n    UP_TO_DATE = 0\n    MORE_PENDING = 2\n    NO_CHANGES = 3\n\n\ndef update(dsn: str, options: MutableMapping[str, Any],\n           socket_timeout: int = 60) -> UpdateState:\n    \"\"\" Update database from the next batch of data. Returns the state of\n        updates according to `UpdateState`.\n    \"\"\"\n    with connect(dsn) as conn:\n        startdate, startseq, indexed = status.get_status(conn)\n        conn.commit()\n\n    if startseq is None:\n        LOG.error(\"Replication not set up. \"\n                  \"Please run 'nominatim replication --init' first.\")\n        raise UsageError(\"Replication not set up.\")\n\n    assert startdate is not None\n\n    if not indexed and options['indexed_only']:\n        LOG.info(\"Skipping update. There is data that needs indexing.\")\n        return UpdateState.MORE_PENDING\n\n    last_since_update = dt.datetime.now(dt.timezone.utc) - startdate\n    update_interval = dt.timedelta(seconds=options['update_interval'])\n    if last_since_update < update_interval:\n        duration = (update_interval - last_since_update).seconds\n        LOG.warning(\"Sleeping for %s sec before next update.\", duration)\n        time.sleep(duration)\n\n    if options['import_file'].exists():\n        options['import_file'].unlink()\n\n    # Read updates into file.\n    with _make_replication_server(options['base_url'], socket_timeout) as repl:\n        outhandler = WriteHandler(str(options['import_file']))\n        endseq = repl.apply_diffs(outhandler, startseq + 1,\n                                  max_size=options['max_diff_size'] * 1024)\n        outhandler.close()\n\n        if endseq is None:\n            return UpdateState.NO_CHANGES\n\n        with connect(dsn) as conn:\n            run_osm2pgsql_updates(conn, options)\n\n            # Write the current status to the file\n            endstate = repl.get_state_info(endseq)\n            status.set_status(conn, endstate.timestamp if endstate else None,\n                              seq=endseq, indexed=False)\n            conn.commit()\n\n    return UpdateState.UP_TO_DATE\n\n\ndef run_osm2pgsql_updates(conn: Connection, options: MutableMapping[str, Any]) -> None:\n    \"\"\" Run osm2pgsql in append mode.\n    \"\"\"\n    # Remove any stale deletion marks.\n    with conn.cursor() as cur:\n        cur.execute('TRUNCATE place_to_be_deleted')\n    conn.commit()\n\n    # Consume updates with osm2pgsql.\n    options['append'] = True\n    options['disable_jit'] = True\n    run_osm2pgsql(options)\n\n    # Handle deletions\n    with conn.cursor() as cur:\n        cur.execute('SELECT flush_deleted_places()')\n    conn.commit()\n\n\ndef _make_replication_server(url: str, timeout: int) -> ContextManager[ReplicationServer]:\n    \"\"\" Returns a ReplicationServer in form of a context manager.\n\n        Creates a light wrapper around older versions of pyosmium that did\n        not support the context manager interface.\n    \"\"\"\n    if hasattr(ReplicationServer, '__enter__'):\n        # Patches the open_url function for pyosmium >= 3.2\n        # where the socket timeout is no longer respected.\n        def patched_open_url(self: ReplicationServer, url: urlrequest.Request) -> Any:\n            \"\"\" Download a resource from the given URL and return a byte sequence\n                of the content.\n            \"\"\"\n            headers = {\"User-Agent\": f\"Nominatim (pyosmium/{pyo_version.pyosmium_release})\"}\n\n            if self.session is not None:\n                return self.session.get(url.get_full_url(),\n                                        headers=headers, timeout=timeout or None,\n                                        stream=True)\n\n            @contextmanager\n            def _get_url_with_session() -> Iterator[requests.Response]:\n                with requests.Session() as session:\n                    request = session.get(url.get_full_url(),\n                                          headers=headers, timeout=timeout or None,\n                                          stream=True)\n                    yield request\n\n            return _get_url_with_session()\n\n        repl = ReplicationServer(url)\n        setattr(repl, 'open_url', types.MethodType(patched_open_url, repl))\n\n        return cast(ContextManager[ReplicationServer], repl)\n\n    @contextmanager\n    def get_cm() -> Generator[ReplicationServer, None, None]:\n        yield ReplicationServer(url)\n\n    return get_cm()\n"
  },
  {
    "path": "src/nominatim_db/tools/special_phrases/__init__.py",
    "content": ""
  },
  {
    "path": "src/nominatim_db/tools/special_phrases/importer_statistics.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\n    Contains the class which handles statistics for the\n    import of special phrases.\n\"\"\"\nimport logging\nLOG = logging.getLogger()\n\n\nclass SpecialPhrasesImporterStatistics():\n    \"\"\"\n        Class handling statistics of the import\n        process of special phrases.\n    \"\"\"\n    def __init__(self) -> None:\n        self._intialize_values()\n\n    def _intialize_values(self) -> None:\n        \"\"\"\n            Set all counts for the global\n            import to 0.\n        \"\"\"\n        self.tables_created = 0\n        self.tables_deleted = 0\n        self.tables_ignored = 0\n        self.invalids = 0\n\n    def notify_one_phrase_invalid(self) -> None:\n        \"\"\"\n            Add +1 to the count of invalid entries\n            fetched from the wiki.\n        \"\"\"\n        self.invalids += 1\n\n    def notify_one_table_created(self) -> None:\n        \"\"\"\n            Add +1 to the count of created tables.\n        \"\"\"\n        self.tables_created += 1\n\n    def notify_one_table_deleted(self) -> None:\n        \"\"\"\n            Add +1 to the count of deleted tables.\n        \"\"\"\n        self.tables_deleted += 1\n\n    def notify_one_table_ignored(self) -> None:\n        \"\"\"\n            Add +1 to the count of ignored tables.\n        \"\"\"\n        self.tables_ignored += 1\n\n    def notify_import_done(self) -> None:\n        \"\"\"\n            Print stats for the whole import process\n            and reset all values.\n        \"\"\"\n        LOG.info('====================================================================')\n        LOG.info('Final statistics of the import:')\n        LOG.info('- %s phrases were invalid.', self.invalids)\n        if self.invalids > 0:\n            LOG.info('  Those invalid phrases have been skipped.')\n        LOG.info('- %s tables were ignored as they already exist on the database',\n                 self.tables_ignored)\n        LOG.info('- %s tables were created', self.tables_created)\n        LOG.info('- %s tables were deleted from the database', self.tables_deleted)\n        if self.tables_deleted > 0:\n            LOG.info('  They were deleted as they are not valid anymore.')\n\n        if self.invalids > 0:\n            LOG.warning('%s phrases were invalid and have been skipped during the whole process.',\n                        self.invalids)\n\n        self._intialize_values()\n"
  },
  {
    "path": "src/nominatim_db/tools/special_phrases/sp_csv_loader.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\n    Module containing the SPCsvLoader class.\n\n    The class allows to load phrases from a csv file.\n\"\"\"\nfrom typing import Iterable\nimport csv\nimport os\n\nfrom ...errors import UsageError\nfrom .special_phrase import SpecialPhrase\n\n\nclass SPCsvLoader:\n    \"\"\"\n        Handles loading of special phrases from external csv file.\n    \"\"\"\n    def __init__(self, csv_path: str) -> None:\n        self.csv_path = csv_path\n\n    def generate_phrases(self) -> Iterable[SpecialPhrase]:\n        \"\"\" Open and parse the given csv file.\n            Create the corresponding SpecialPhrases.\n        \"\"\"\n        self._check_csv_validity()\n\n        with open(self.csv_path, encoding='utf-8') as fd:\n            reader = csv.DictReader(fd, delimiter=',')\n            for row in reader:\n                yield SpecialPhrase(row['phrase'], row['class'], row['type'], row['operator'])\n\n    def _check_csv_validity(self) -> None:\n        \"\"\"\n            Check that the csv file has the right extension.\n        \"\"\"\n        _, extension = os.path.splitext(self.csv_path)\n\n        if extension != '.csv':\n            raise UsageError(f'The file {self.csv_path} is not a csv file.')\n"
  },
  {
    "path": "src/nominatim_db/tools/special_phrases/sp_importer.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\n    Module containing the class handling the import\n    of the special phrases.\n\n    Phrases are analyzed and imported into the database.\n\n    The phrases already present in the database which are not\n    valids anymore are removed.\n\"\"\"\nfrom typing import Iterable, Tuple, Mapping, Sequence, Optional, Set\nimport logging\nimport re\nfrom psycopg.sql import Identifier, SQL\n\nfrom ...typing import Protocol\nfrom ...config import Configuration\nfrom ...db.connection import Connection, drop_tables, index_exists\nfrom .importer_statistics import SpecialPhrasesImporterStatistics\nfrom .special_phrase import SpecialPhrase\nfrom ...tokenizer.base import AbstractTokenizer\n\nLOG = logging.getLogger()\n\n\ndef _classtype_table(phrase_class: str, phrase_type: str) -> str:\n    \"\"\" Return the name of the table for the given class and type.\n    \"\"\"\n    return f'place_classtype_{phrase_class}_{phrase_type}'\n\n\nclass SpecialPhraseLoader(Protocol):\n    \"\"\" Protocol for classes implementing a loader for special phrases.\n    \"\"\"\n\n    def generate_phrases(self) -> Iterable[SpecialPhrase]:\n        \"\"\" Generates all special phrase terms this loader can produce.\n        \"\"\"\n\n\nclass SPImporter():\n    \"\"\"\n        Class handling the process of special phrases importation into the database.\n\n        Take a sp loader which load the phrases from an external source.\n    \"\"\"\n    def __init__(self, config: Configuration, conn: Connection,\n                 sp_loader: SpecialPhraseLoader) -> None:\n        self.config = config\n        self.db_connection = conn\n        self.sp_loader = sp_loader\n        self.statistics_handler = SpecialPhrasesImporterStatistics()\n        self.black_list, self.white_list = self._load_white_and_black_lists()\n        self.sanity_check_pattern = re.compile(r'^\\w+$')\n        # This set will contain all existing phrases to be added.\n        # It contains tuples with the following format: (label, class, type, operator)\n        self.word_phrases: Set[Tuple[str, str, str, str]] = set()\n        # This set will contain all existing place_classtype tables which doesn't match any\n        # special phrases class/type on the wiki.\n        self.table_phrases_to_delete: Set[str] = set()\n\n    def get_classtype_pairs(self, min: int = 0) -> Set[Tuple[str, str]]:\n        \"\"\"\n            Returns list of allowed special phrases from the database,\n            restricting to a list of combinations of classes and types\n            which occur equal to or more than a specified amount of times.\n\n            Default value for this is 0, which allows everything in database.\n        \"\"\"\n        db_combinations = set()\n\n        query = f\"\"\"\n        SELECT class AS CLS, type AS typ\n        FROM placex\n        GROUP BY class, type\n        HAVING COUNT(*) >= {min}\n        \"\"\"\n\n        with self.db_connection.cursor() as db_cursor:\n            db_cursor.execute(SQL(query))\n            for row in db_cursor:\n                db_combinations.add((row[0], row[1]))\n\n        return db_combinations\n\n    def import_phrases(self, tokenizer: AbstractTokenizer, should_replace: bool,\n                       min: int = 0) -> None:\n        \"\"\"\n            Iterate through all SpecialPhrases extracted from the\n            loader and import them into the database.\n\n            If should_replace is set to True only the loaded phrases\n            will be kept into the database. All other phrases already\n            in the database will be removed.\n        \"\"\"\n        LOG.warning('Special phrases importation starting')\n        self._fetch_existing_place_classtype_tables()\n\n        # Store pairs of class/type for further processing\n        class_type_pairs = set()\n\n        for phrase in self.sp_loader.generate_phrases():\n            result = self._process_phrase(phrase)\n            if result:\n                class_type_pairs.add(result)\n\n        self._create_classtype_table_and_indexes(class_type_pairs, min)\n        if should_replace:\n            self._remove_non_existent_tables_from_db()\n\n        self.db_connection.commit()\n\n        with tokenizer.name_analyzer() as analyzer:\n            analyzer.update_special_phrases(self.word_phrases, should_replace)\n\n        LOG.warning('Import done.')\n        self.statistics_handler.notify_import_done()\n\n    def _fetch_existing_place_classtype_tables(self) -> None:\n        \"\"\"\n            Fetch existing place_classtype tables.\n            Fill the table_phrases_to_delete set of the class.\n        \"\"\"\n        query = \"\"\"\n            SELECT table_name\n            FROM information_schema.tables\n            WHERE table_schema='public'\n            AND table_name like 'place_classtype_%';\n        \"\"\"\n        with self.db_connection.cursor() as db_cursor:\n            db_cursor.execute(SQL(query))\n            for row in db_cursor:\n                self.table_phrases_to_delete.add(row[0])\n\n    def _load_white_and_black_lists(self) \\\n            -> Tuple[Mapping[str, Sequence[str]], Mapping[str, Sequence[str]]]:\n        \"\"\"\n            Load white and black lists from phrases-settings.json.\n        \"\"\"\n        settings = self.config.load_sub_configuration('phrase-settings.json')\n\n        return settings['blackList'], settings['whiteList']\n\n    def _check_sanity(self, phrase: SpecialPhrase) -> bool:\n        \"\"\"\n            Check sanity of given inputs in case somebody added garbage in the wiki.\n            If a bad class/type is detected the system will exit with an error.\n        \"\"\"\n        class_matchs = self.sanity_check_pattern.findall(phrase.p_class)\n        type_matchs = self.sanity_check_pattern.findall(phrase.p_type)\n\n        if not class_matchs or not type_matchs:\n            LOG.warning(\"Bad class/type: %s=%s. It will not be imported\",\n                        phrase.p_class, phrase.p_type)\n            return False\n        return True\n\n    def _process_phrase(self, phrase: SpecialPhrase) -> Optional[Tuple[str, str]]:\n        \"\"\"\n            Processes the given phrase by checking black and white list\n            and sanity.\n            Return the class/type pair corresponding to the phrase.\n        \"\"\"\n\n        # blacklisting: disallow certain class/type combinations\n        if phrase.p_class in self.black_list.keys() \\\n           and phrase.p_type in self.black_list[phrase.p_class]:\n            return None\n\n        # whitelisting: if class is in whitelist, allow only tags in the list\n        if phrase.p_class in self.white_list.keys() \\\n           and phrase.p_type not in self.white_list[phrase.p_class]:\n            return None\n\n        # sanity check, in case somebody added garbage in the wiki\n        if not self._check_sanity(phrase):\n            self.statistics_handler.notify_one_phrase_invalid()\n            return None\n\n        self.word_phrases.add((phrase.p_label, phrase.p_class,\n                               phrase.p_type, phrase.p_operator))\n\n        return (phrase.p_class, phrase.p_type)\n\n    def _create_classtype_table_and_indexes(self,\n                                            class_type_pairs: Iterable[Tuple[str, str]],\n                                            min: int = 0) -> None:\n        \"\"\"\n            Create table place_classtype for each given pair.\n            Also create indexes on place_id and centroid.\n        \"\"\"\n        LOG.warning('Create tables and indexes...')\n\n        sql_tablespace = self.config.TABLESPACE_AUX_DATA\n        if sql_tablespace:\n            sql_tablespace = ' TABLESPACE ' + sql_tablespace\n\n        with self.db_connection.cursor() as db_cursor:\n            db_cursor.execute(\"CREATE INDEX idx_placex_classtype ON placex (class, type)\")\n\n        if min:\n            allowed_special_phrases = self.get_classtype_pairs(min)\n\n        for pair in class_type_pairs:\n            phrase_class = pair[0]\n            phrase_type = pair[1]\n\n            # Will only filter if min is not 0\n            if min and (phrase_class, phrase_type) not in allowed_special_phrases:\n                LOG.warning(\"Skipping phrase %s=%s: not in allowed special phrases\",\n                            phrase_class, phrase_type)\n                continue\n\n            table_name = _classtype_table(phrase_class, phrase_type)\n\n            if table_name in self.table_phrases_to_delete:\n                self.statistics_handler.notify_one_table_ignored()\n                # Remove this table from the ones to delete as it match a\n                # class/type still existing on the special phrases of the wiki.\n                self.table_phrases_to_delete.remove(table_name)\n                # So don't need to create the table and indexes.\n                continue\n\n            # Table creation\n            self._create_place_classtype_table(sql_tablespace, phrase_class, phrase_type)\n\n            # Indexes creation\n            self._create_place_classtype_indexes(sql_tablespace, phrase_class, phrase_type)\n\n            # Grant access on read to the web user.\n            self._grant_access_to_webuser(phrase_class, phrase_type)\n\n            self.statistics_handler.notify_one_table_created()\n\n        with self.db_connection.cursor() as db_cursor:\n            db_cursor.execute(\"DROP INDEX idx_placex_classtype\")\n\n    def _create_place_classtype_table(self, sql_tablespace: str,\n                                      phrase_class: str, phrase_type: str) -> None:\n        \"\"\"\n            Create table place_classtype of the given phrase_class/phrase_type\n            if doesn't exit.\n        \"\"\"\n        table_name = _classtype_table(phrase_class, phrase_type)\n        with self.db_connection.cursor() as cur:\n            cur.execute(SQL(\"\"\"CREATE TABLE IF NOT EXISTS {} {} AS\n                                 SELECT place_id AS place_id,\n                                        st_centroid(geometry) AS centroid\n                                 FROM placex\n                                 WHERE class = %s AND type = %s\n                             \"\"\").format(Identifier(table_name), SQL(sql_tablespace)),\n                        (phrase_class, phrase_type))\n\n    def _create_place_classtype_indexes(self, sql_tablespace: str,\n                                        phrase_class: str, phrase_type: str) -> None:\n        \"\"\"\n            Create indexes on centroid and place_id for the place_classtype table.\n        \"\"\"\n        index_prefix = f'idx_place_classtype_{phrase_class}_{phrase_type}_'\n        base_table = _classtype_table(phrase_class, phrase_type)\n        # Index on centroid\n        if not index_exists(self.db_connection, index_prefix + 'centroid'):\n            with self.db_connection.cursor() as db_cursor:\n                db_cursor.execute(SQL(\"CREATE INDEX {} ON {} USING GIST (centroid) {}\")\n                                  .format(Identifier(index_prefix + 'centroid'),\n                                          Identifier(base_table),\n                                          SQL(sql_tablespace)))\n\n        # Index on place_id\n        if not index_exists(self.db_connection, index_prefix + 'place_id'):\n            with self.db_connection.cursor() as db_cursor:\n                db_cursor.execute(SQL(\"CREATE INDEX {} ON {} USING btree(place_id) {}\")\n                                  .format(Identifier(index_prefix + 'place_id'),\n                                          Identifier(base_table),\n                                          SQL(sql_tablespace)))\n\n    def _grant_access_to_webuser(self, phrase_class: str, phrase_type: str) -> None:\n        \"\"\"\n            Grant access on read to the table place_classtype for the webuser.\n        \"\"\"\n        table_name = _classtype_table(phrase_class, phrase_type)\n        with self.db_connection.cursor() as db_cursor:\n            db_cursor.execute(SQL(\"\"\"GRANT SELECT ON {} TO {}\"\"\")\n                              .format(Identifier(table_name),\n                                      Identifier(self.config.DATABASE_WEBUSER)))\n\n    def _remove_non_existent_tables_from_db(self) -> None:\n        \"\"\"\n            Remove special phrases which doesn't exist on the wiki anymore.\n            Delete the place_classtype tables.\n        \"\"\"\n        LOG.warning('Cleaning database...')\n\n        # Delete place_classtype tables corresponding to class/type which\n        # are not on the wiki anymore.\n        drop_tables(self.db_connection, *self.table_phrases_to_delete)\n        for _ in self.table_phrases_to_delete:\n            self.statistics_handler.notify_one_table_deleted()\n"
  },
  {
    "path": "src/nominatim_db/tools/special_phrases/sp_wiki_loader.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\n    Module containing the SPWikiLoader class.\n\"\"\"\nfrom typing import Iterable\nimport re\nimport logging\n\nimport mwparserfromhell\n\nfrom ...config import Configuration\nfrom ...utils.url_utils import get_url\nfrom .special_phrase import SpecialPhrase\n\nLOG = logging.getLogger()\n\n\ndef _get_wiki_content(lang: str) -> str:\n    \"\"\"\n        Request and return the wiki page's content\n        corresponding to special phrases for a given lang.\n        Requested URL Example :\n            https://wiki.openstreetmap.org/wiki/Special:Export/Nominatim/Special_Phrases/EN\n    \"\"\"\n    url = 'https://wiki.openstreetmap.org/wiki/Special:Export/Nominatim/Special_Phrases/' \\\n          + lang.upper()\n    return get_url(url)\n\n\nclass SPWikiLoader:\n    \"\"\"\n        Handles loading of special phrases from the wiki.\n    \"\"\"\n    def __init__(self, config: Configuration) -> None:\n        self.config = config\n        # Hack around a bug where building=yes was imported with quotes into the wiki\n        self.type_fix_pattern = re.compile(r'\\\"|&quot;')\n\n        self.languages = self.config.get_str_list('LANGUAGES') or \\\n            ['af', 'ar', 'br', 'ca', 'cs', 'de', 'en', 'es',\n             'et', 'eu', 'fa', 'fi', 'fr', 'gl', 'hr', 'hu',\n             'ia', 'is', 'it', 'ja', 'mk', 'nl', 'no', 'pl',\n             'ps', 'pt', 'ru', 'sk', 'sl', 'sv', 'uk', 'vi',\n             'lv', 'tr']\n\n    def generate_phrases(self) -> Iterable[SpecialPhrase]:\n        \"\"\" Download the wiki pages for the configured languages\n            and extract the phrases from the page.\n        \"\"\"\n        for lang in self.languages:\n            LOG.warning('Importing phrases for lang: %s...', lang)\n            loaded_xml = _get_wiki_content(lang)\n\n            wikicode = mwparserfromhell.parse(loaded_xml)\n\n            for table in wikicode.filter_tags(matches=lambda t: t.tag == 'table'):\n                for row in table.contents.filter_tags(matches=lambda t: t.tag == 'tr'):\n                    cells = list(row.contents.filter_tags(matches=lambda t: t.tag == 'td'))\n\n                    if len(cells) < 5:\n                        continue\n\n                    label = cells[0].contents.strip_code().strip()\n                    cls = cells[1].contents.strip_code().strip()\n                    typ = cells[2].contents.strip_code().strip()\n                    operator = cells[3].contents.strip_code().strip()\n\n                    yield SpecialPhrase(label,\n                                        cls,\n                                        self.type_fix_pattern.sub('', typ),\n                                        operator)\n"
  },
  {
    "path": "src/nominatim_db/tools/special_phrases/special_phrase.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\n    Module containing the class SpecialPhrase.\n\n    This class is a model used to transfer a special phrase through\n    the process of load and importation.\n\"\"\"\nfrom typing import Any\n\n\nclass SpecialPhrase:\n    \"\"\"\n        Model representing a special phrase.\n    \"\"\"\n    def __init__(self, p_label: str, p_class: str, p_type: str, p_operator: str) -> None:\n        self.p_label = p_label.strip()\n        self.p_class = p_class.strip()\n        self.p_type = p_type.strip()\n        # Needed if some operator in the wiki are not written in english\n        p_operator = p_operator.strip().lower()\n        self.p_operator = '-' if p_operator not in ('near', 'in') else p_operator\n\n    def __eq__(self, other: Any) -> bool:\n        if not isinstance(other, SpecialPhrase):\n            return False\n\n        return self.p_label == other.p_label \\\n            and self.p_class == other.p_class \\\n            and self.p_type == other.p_type \\\n            and self.p_operator == other.p_operator\n\n    def __hash__(self) -> int:\n        return hash((self.p_label, self.p_class, self.p_type, self.p_operator))\n"
  },
  {
    "path": "src/nominatim_db/tools/tiger_data.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nFunctions for importing tiger data and handling tarbar and directory files\n\"\"\"\nfrom typing import Any, TextIO, List, Union, cast, Iterator, Dict\nimport csv\nimport io\nimport logging\nimport os\nimport tarfile\n\nfrom psycopg.types.json import Json\n\nfrom ..config import Configuration\nfrom ..db.connection import connect, table_exists\nfrom ..db.sql_preprocessor import SQLPreprocessor\nfrom ..errors import UsageError\nfrom ..db.query_pool import QueryPool\nfrom ..data.place_info import PlaceInfo\nfrom ..tokenizer.base import AbstractTokenizer\n\nLOG = logging.getLogger()\n\n\nclass TigerInput:\n    \"\"\" Context manager that goes through Tiger input files which may\n        either be in a directory or gzipped together in a tar file.\n    \"\"\"\n\n    def __init__(self, data_dir: str) -> None:\n        self.tar_handle = None\n        self.files: List[Union[str, tarfile.TarInfo]] = []\n\n        if data_dir.endswith('.tar.gz'):\n            try:\n                self.tar_handle = tarfile.open(data_dir)\n            except tarfile.ReadError as err:\n                LOG.fatal(\"Cannot open '%s'. Is this a tar file?\", data_dir)\n                raise UsageError(\"Cannot open Tiger data file.\") from err\n\n            self.files = [i for i in self.tar_handle.getmembers() if i.name.endswith('.csv')]\n            LOG.warning(\"Found %d CSV files in tarfile with path %s\", len(self.files), data_dir)\n        else:\n            files = os.listdir(data_dir)\n            self.files = [os.path.join(data_dir, i) for i in files if i.endswith('.csv')]\n            LOG.warning(\"Found %d CSV files in path %s\", len(self.files), data_dir)\n\n        if not self.files:\n            LOG.warning(\"Tiger data import selected but no files found at %s\", data_dir)\n\n    def __enter__(self) -> 'TigerInput':\n        return self\n\n    def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:\n        if self.tar_handle:\n            self.tar_handle.close()\n            self.tar_handle = None\n\n    def __bool__(self) -> bool:\n        return bool(self.files)\n\n    def get_file(self, fname: Union[str, tarfile.TarInfo]) -> TextIO:\n        \"\"\" Return a file handle to the next file to be processed.\n            Raises an IndexError if there is no file left.\n        \"\"\"\n        if self.tar_handle is not None:\n            extracted = self.tar_handle.extractfile(fname)\n            assert extracted is not None\n            return io.TextIOWrapper(extracted, encoding='utf-8')\n\n        return open(cast(str, fname), encoding='utf-8')\n\n    def __iter__(self) -> Iterator[Dict[str, Any]]:\n        \"\"\" Iterate over the lines in each file.\n        \"\"\"\n        for fname in self.files:\n            fd = self.get_file(fname)\n            yield from csv.DictReader(fd, delimiter=';')\n\n\nasync def add_tiger_data(data_dir: str, config: Configuration, threads: int,\n                         tokenizer: AbstractTokenizer) -> int:\n    \"\"\" Import tiger data from directory or tar file `data dir`.\n    \"\"\"\n    dsn = config.get_libpq_dsn()\n\n    with TigerInput(data_dir) as tar:\n        if not tar:\n            return 1\n\n        with connect(dsn) as conn:\n            sql = SQLPreprocessor(conn, config)\n\n            if not table_exists(conn, 'search_name'):\n                raise UsageError(\n                    \"Cannot perform tiger import: required tables are missing. \"\n                    \"See https://github.com/osm-search/Nominatim/issues/2463 for details.\"\n                )\n\n            sql.run_sql_file(conn, 'tiger_import_start.sql')\n\n        # Reading files and then for each file line handling\n        # sql_query in <threads - 1> chunks.\n        place_threads = max(1, threads - 1)\n\n        async with QueryPool(dsn, place_threads, autocommit=True) as pool:\n            with tokenizer.name_analyzer() as analyzer:\n                for lineno, row in enumerate(tar, 1):\n                    try:\n                        address = dict(street=row['street'], postcode=row['postcode'])\n                        args = ('SRID=4326;' + row['geometry'],\n                                int(row['from']), int(row['to']), row['interpolation'],\n                                Json(analyzer.process_place(PlaceInfo({'address': address}))),\n                                analyzer.normalize_postcode(row['postcode']))\n                    except ValueError:\n                        continue\n\n                    await pool.put_query(\n                        \"\"\"SELECT tiger_line_import(%s::GEOMETRY, %s::INT,\n                                                    %s::INT, %s::TEXT, %s::JSONB, %s::TEXT)\"\"\",\n                        args)\n\n                    if not lineno % 1000:\n                        print('.', end='', flush=True)\n\n        print('', flush=True)\n\n    LOG.warning(\"Creating indexes on Tiger data\")\n    with connect(dsn) as conn:\n        sql = SQLPreprocessor(conn, config)\n        sql.run_sql_file(conn, 'tiger_import_finish.sql')\n\n    return 0\n"
  },
  {
    "path": "src/nominatim_db/typing.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nType definitions for typing annotations.\n\nComplex type definitions are moved here, to keep the source files readable.\n\"\"\"\nfrom typing import Any, Union, Mapping, TypeVar, Sequence, TYPE_CHECKING\n\n\nif TYPE_CHECKING:\n    import os\n\nStrPath = Union[str, 'os.PathLike[str]']\n\nSysEnv = Mapping[str, str]\n\n# psycopg-related types\n\nT_ResultKey = TypeVar('T_ResultKey', int, str)\n\n\nclass DictCursorResult(Mapping[str, Any]):\n    def __getitem__(self, x: Union[int, str]) -> Any: ...\n\n\nDictCursorResults = Sequence[DictCursorResult]\n\n# The following typing features require typing_extensions to work\n# on all supported Python versions.\n# Only require this for type checking but not for normal operations.\n\nif TYPE_CHECKING:\n    from typing_extensions import (Protocol as Protocol,\n                                   Final as Final,\n                                   TypedDict as TypedDict)\nelse:\n    Protocol = object\n    Final = 'Final'\n    TypedDict = dict\n"
  },
  {
    "path": "src/nominatim_db/utils/__init__.py",
    "content": ""
  },
  {
    "path": "src/nominatim_db/utils/centroid.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nFunctions for computation of centroids.\n\"\"\"\nfrom typing import Tuple, Any\nfrom collections.abc import Collection\n\n\nclass PointsCentroid:\n    \"\"\" Centroid computation from single points using an online algorithm.\n        More points may be added at any time.\n\n        Coordinates are internally treated as a 7-digit fixed-point float\n        (i.e. in OSM style).\n    \"\"\"\n\n    def __init__(self) -> None:\n        self.sum_x = 0\n        self.sum_y = 0\n        self.count = 0\n\n    def centroid(self) -> Tuple[float, float]:\n        \"\"\" Return the centroid of all points collected so far.\n        \"\"\"\n        if self.count == 0:\n            raise ValueError(\"No points available for centroid.\")\n\n        return (self.sum_x / self.count / 10_000_000,\n                self.sum_y / self.count / 10_000_000)\n\n    def __len__(self) -> int:\n        return self.count\n\n    def __iadd__(self, other: Any) -> 'PointsCentroid':\n        if isinstance(other, Collection) and len(other) == 2:\n            if all(isinstance(p, (float, int)) for p in other):\n                x, y = other\n                self.sum_x += int(x * 10_000_000)\n                self.sum_y += int(y * 10_000_000)\n                self.count += 1\n                return self\n\n        raise ValueError(\"Can only add 2-element tuples to centroid.\")\n"
  },
  {
    "path": "src/nominatim_db/utils/url_utils.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2024 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nHelper functions for accessing URL.\n\"\"\"\nfrom typing import IO  # noqa\nimport logging\nimport urllib.request as urlrequest\n\nfrom ..version import NOMINATIM_VERSION\n\nLOG = logging.getLogger()\n\n\ndef get_url(url: str) -> str:\n    \"\"\" Get the contents from the given URL and return it as a UTF-8 string.\n\n        This version makes sure that an appropriate user agent is sent.\n    \"\"\"\n    headers = {\"User-Agent\": f\"Nominatim/{NOMINATIM_VERSION!s}\"}\n\n    try:\n        request = urlrequest.Request(url, headers=headers)\n        with urlrequest.urlopen(request) as response:  # type: IO[bytes]\n            return response.read().decode('utf-8')\n    except Exception:\n        LOG.fatal('Failed to load URL: %s', url)\n        raise\n"
  },
  {
    "path": "src/nominatim_db/version.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nVersion information for Nominatim.\n\"\"\"\nfrom typing import NamedTuple, Optional\n\n\nclass NominatimVersion(NamedTuple):\n    \"\"\" Version information for Nominatim. We follow semantic versioning.\n\n        Major, minor and patch_level refer to the last released version.\n        The database patch level tracks important changes between releases\n        and must always be increased when there is a change to the database or code\n        that requires a migration.\n\n        When adding a migration on the development branch, raise the patch level\n        to 99 to make sure that the migration is applied when updating from a\n        patch release to the next minor version. Patch releases usually shouldn't\n        have migrations in them. When they are needed, then make sure that the\n        migration can be reapplied and set the migration version to the appropriate\n        patch level when cherry-picking the commit with the migration.\n    \"\"\"\n\n    major: int\n    minor: int\n    patch_level: int\n    db_patch_level: int\n\n    def __str__(self) -> str:\n        if self.db_patch_level is None:\n            return f\"{self.major}.{self.minor}.{self.patch_level}\"\n\n        return f\"{self.major}.{self.minor}.{self.patch_level}-{self.db_patch_level}\"\n\n    def release_version(self) -> str:\n        \"\"\" Return the release version in semantic versioning format.\n\n            The release version does not include the database patch version.\n        \"\"\"\n        return f\"{self.major}.{self.minor}.{self.patch_level}\"\n\n\ndef parse_version(version: str) -> NominatimVersion:\n    \"\"\" Parse a version string into a version consisting of a tuple of\n        four ints: major, minor, patch level, database patch level\n\n        This is the reverse operation of `version_str()`.\n    \"\"\"\n    parts = version.split('.')\n    return NominatimVersion(*[int(x) for x in parts[:2] + parts[2].split('-')])\n\n\nNOMINATIM_VERSION = parse_version('5.3.99-0')\n\nPOSTGRESQL_REQUIRED_VERSION = (12, 0)\nPOSTGIS_REQUIRED_VERSION = (3, 0)\nOSM2PGSQL_REQUIRED_VERSION = (1, 8)\n\n# Cmake sets a variable @GIT_HASH@ by executing 'git --log'. It is not run\n# on every execution of 'make'.\n# cmake/tool-installed.tmpl is used to build the binary 'nominatim'. Inside\n# there is a call to set the variable value below.\nGIT_COMMIT_HASH: Optional[str] = None\n"
  },
  {
    "path": "test/bdd/conftest.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nFixtures for BDD test steps\n\"\"\"\nimport sys\nimport json\nimport re\nfrom pathlib import Path\n\nimport psycopg\nfrom psycopg import sql as pysql\n\n# always test against the source\nSRC_DIR = (Path(__file__) / '..' / '..' / '..').resolve()\nsys.path.insert(0, str(SRC_DIR / 'src'))\n\nimport pytest\nfrom pytest_bdd.parsers import re as step_parse\nfrom pytest_bdd import given, when, then, scenario\nfrom pytest_bdd.feature import get_features\n\npytest.register_assert_rewrite('utils')\n\nfrom utils.api_runner import APIRunner\nfrom utils.api_result import APIResult\nfrom utils.checks import ResultAttr, COMPARATOR_TERMS\nfrom utils.geometry_alias import ALIASES\nfrom utils.grid import Grid\nfrom utils.db import DBManager\n\nfrom nominatim_db.config import Configuration\nfrom nominatim_db.data.country_info import setup_country_config\n\n\ndef _strlist(inp):\n    return [s.strip() for s in inp.split(',')]\n\n\ndef _pretty_json(inp):\n    return json.dumps(inp, indent=2)\n\n\ndef pytest_addoption(parser, pluginmanager):\n    parser.addoption('--nominatim-purge', dest='NOMINATIM_PURGE', action='store_true',\n                     help='Force recreation of test databases from scratch.')\n    parser.addoption('--nominatim-keep-db', dest='NOMINATIM_KEEP_DB', action='store_true',\n                     help='Do not drop the database after tests are finished.')\n    parser.addoption('--nominatim-api-engine', dest='NOMINATIM_API_ENGINE',\n                     default='falcon',\n                     help='Chose the API engine to use when sending requests.')\n    parser.addoption('--nominatim-tokenizer', dest='NOMINATIM_TOKENIZER',\n                     metavar='TOKENIZER',\n                     help='Use the specified tokenizer for importing data into '\n                          'a Nominatim database.')\n\n    parser.addini('nominatim_test_db', default='test_nominatim',\n                  help='Name of the database used for running a single test.')\n    parser.addini('nominatim_api_test_db', default='test_api_nominatim',\n                  help='Name of the database for storing API test data.')\n    parser.addini('nominatim_template_db', default='test_template_nominatim',\n                  help='Name of database used as a template for test databases.')\n\n\n@pytest.fixture\ndef datatable():\n    \"\"\" Default fixture for datatables, so that their presence can be optional.\n    \"\"\"\n    return None\n\n\n@pytest.fixture\ndef node_grid():\n    \"\"\" Default fixture for node grids. Nothing set.\n    \"\"\"\n    return Grid([[]], None, None)\n\n\n@pytest.fixture(scope='session', autouse=True)\ndef setup_country_info():\n    setup_country_config(Configuration(None))\n\n\n@pytest.fixture(scope='session')\ndef template_db(pytestconfig):\n    \"\"\" Create a template database containing the extensions and base data\n        needed by Nominatim. Using the template instead of doing the full\n        setup can speed up the tests.\n\n        The template database will only be created if it does not exist yet\n        or a purge has been explicitly requested.\n    \"\"\"\n    dbm = DBManager(purge=pytestconfig.option.NOMINATIM_PURGE)\n\n    template_db = pytestconfig.getini('nominatim_template_db')\n\n    template_config = Configuration(\n        None, environ={'NOMINATIM_DATABASE_DSN': f\"pgsql:dbname={template_db}\"})\n\n    dbm.setup_template_db(template_config)\n\n    return template_db\n\n\n@pytest.fixture\ndef def_config(pytestconfig):\n    dbname = pytestconfig.getini('nominatim_test_db')\n\n    return Configuration(None,\n                         environ={'NOMINATIM_DATABASE_DSN': f\"pgsql:dbname={dbname}\"})\n\n\n@pytest.fixture\ndef db(template_db, pytestconfig):\n    \"\"\" Set up an empty database for use with osm2pgsql.\n    \"\"\"\n    dbm = DBManager(purge=pytestconfig.option.NOMINATIM_PURGE)\n\n    dbname = pytestconfig.getini('nominatim_test_db')\n\n    dbm.create_db_from_template(dbname, template_db)\n\n    yield dbname\n\n    if not pytestconfig.option.NOMINATIM_KEEP_DB:\n        dbm.drop_db(dbname)\n\n\n@pytest.fixture\ndef db_conn(db, def_config):\n    with psycopg.connect(def_config.get_libpq_dsn()) as conn:\n        info = psycopg.types.TypeInfo.fetch(conn, \"hstore\")\n        psycopg.types.hstore.register_hstore(info, conn)\n        yield conn\n\n\n@when(step_parse(r'reverse geocoding (?P<lat>[\\d.-]*),(?P<lon>[\\d.-]*)'),\n      target_fixture='nominatim_result')\ndef reverse_geocode_via_api(test_config_env, pytestconfig, datatable, lat, lon):\n    runner = APIRunner(test_config_env, pytestconfig.option.NOMINATIM_API_ENGINE)\n    api_response = runner.run_step('reverse',\n                                   {'lat': float(lat), 'lon': float(lon)},\n                                   datatable, 'jsonv2', {})\n\n    assert api_response.status == 200\n    assert api_response.headers['content-type'] == 'application/json; charset=utf-8'\n\n    result = APIResult('json', 'reverse', api_response.body)\n    assert result.is_simple()\n\n    assert isinstance(result.result['lat'], str)\n    assert isinstance(result.result['lon'], str)\n    result.result['centroid'] = f\"POINT({result.result['lon']} {result.result['lat']})\"\n\n    return result\n\n\n@when(step_parse(r'reverse geocoding at node (?P<node>[\\d]+)'),\n      target_fixture='nominatim_result')\ndef reverse_geocode_via_api_and_grid(test_config_env, pytestconfig, node_grid, datatable, node):\n    coords = node_grid.get(node)\n    if coords is None:\n        raise ValueError('Unknown node id')\n\n    return reverse_geocode_via_api(test_config_env, pytestconfig, datatable, coords[1], coords[0])\n\n\n@when(step_parse(r'geocoding(?: \"(?P<query>.*)\")?'),\n      target_fixture='nominatim_result')\ndef forward_geocode_via_api(test_config_env, pytestconfig, datatable, query):\n    runner = APIRunner(test_config_env, pytestconfig.option.NOMINATIM_API_ENGINE)\n\n    params = {'addressdetails': '1'}\n    if query:\n        params['q'] = query\n\n    api_response = runner.run_step('search', params, datatable, 'jsonv2', {})\n\n    assert api_response.status == 200\n    assert api_response.headers['content-type'] == 'application/json; charset=utf-8'\n\n    result = APIResult('json', 'search', api_response.body)\n    assert not result.is_simple()\n\n    for res in result.result:\n        assert isinstance(res['lat'], str)\n        assert isinstance(res['lon'], str)\n        res['centroid'] = f\"POINT({res['lon']} {res['lat']})\"\n\n    return result\n\n\n@then(step_parse(r'(?P<op>[a-z ]+) (?P<num>\\d+) results? (?:are|is) returned'),\n      converters={'num': int})\ndef check_number_of_results(nominatim_result, op, num):\n    assert not nominatim_result.is_simple()\n    assert COMPARATOR_TERMS[op](num, len(nominatim_result))\n\n\n@then(step_parse('the result metadata contains'))\ndef check_metadata_for_fields(nominatim_result, datatable):\n    if datatable[0] == ['param', 'value']:\n        pairs = datatable[1:]\n    else:\n        pairs = zip(datatable[0], datatable[1])\n\n    for k, v in pairs:\n        assert ResultAttr(nominatim_result.meta, k) == v\n\n\n@then(step_parse('the result metadata has no attributes (?P<attributes>.*)'),\n      converters={'attributes': _strlist})\ndef check_metadata_for_field_presence(nominatim_result, attributes):\n    assert all(a not in nominatim_result.meta for a in attributes), \\\n        f\"Unexpectedly have one of the attributes '{attributes}' in\\n\" \\\n        f\"{_pretty_json(nominatim_result.meta)}\"\n\n\n@then(step_parse(r'the result contains(?: in field (?P<field>\\S+))?'))\ndef check_result_for_fields(nominatim_result, datatable, node_grid, field):\n    assert nominatim_result.is_simple()\n\n    if datatable[0] == ['param', 'value']:\n        pairs = datatable[1:]\n    else:\n        pairs = zip(datatable[0], datatable[1])\n\n    prefix = field + '+' if field else ''\n\n    for k, v in pairs:\n        assert ResultAttr(nominatim_result.result, prefix + k, grid=node_grid) == v\n\n\n@then(step_parse('the result has attributes (?P<attributes>.*)'),\n      converters={'attributes': _strlist})\ndef check_result_for_field_presence(nominatim_result, attributes):\n    assert nominatim_result.is_simple()\n    assert all(a in nominatim_result.result for a in attributes)\n\n\n@then(step_parse('the result has no attributes (?P<attributes>.*)'),\n      converters={'attributes': _strlist})\ndef check_result_for_field_absence(nominatim_result, attributes):\n    assert nominatim_result.is_simple()\n    assert all(a not in nominatim_result.result for a in attributes)\n\n\n@then(step_parse(\n    r'the result contains array field (?P<field>\\S+) where element (?P<num>\\d+) contains'),\n      converters={'num': int})\ndef check_result_array_field_for_attributes(nominatim_result, datatable, field, num):\n    assert nominatim_result.is_simple()\n\n    if datatable[0] == ['param', 'value']:\n        pairs = datatable[1:]\n    else:\n        pairs = zip(datatable[0], datatable[1])\n\n    prefix = f\"{field}+{num}+\"\n\n    for k, v in pairs:\n        assert ResultAttr(nominatim_result.result, prefix + k) == v\n\n\n@then(step_parse('the result set contains(?P<exact> exactly)?'))\ndef check_result_list_match(nominatim_result, datatable, exact):\n    assert not nominatim_result.is_simple()\n\n    result_set = set(range(len(nominatim_result.result)))\n\n    for row in datatable[1:]:\n        for idx in result_set:\n            for key, value in zip(datatable[0], row):\n                if ResultAttr(nominatim_result.result[idx], key) != value:\n                    break\n            else:\n                # found a match\n                result_set.remove(idx)\n                break\n        else:\n            assert False, f\"Missing data row {row}. Full response:\\n{nominatim_result}\"\n\n    if exact:\n        assert not [nominatim_result.result[i] for i in result_set]\n\n\n@then(step_parse('all results have attributes (?P<attributes>.*)'),\n      converters={'attributes': _strlist})\ndef check_all_results_for_field_presence(nominatim_result, attributes):\n    assert not nominatim_result.is_simple()\n    assert len(nominatim_result) > 0\n    for res in nominatim_result.result:\n        assert all(a in res for a in attributes), \\\n            f\"Missing one of the attributes '{attributes}' in\\n{_pretty_json(res)}\"\n\n\n@then(step_parse('all results have no attributes (?P<attributes>.*)'),\n      converters={'attributes': _strlist})\ndef check_all_result_for_field_absence(nominatim_result, attributes):\n    assert not nominatim_result.is_simple()\n    assert len(nominatim_result) > 0\n    for res in nominatim_result.result:\n        assert all(a not in res for a in attributes), \\\n            f\"Unexpectedly have one of the attributes '{attributes}' in\\n{_pretty_json(res)}\"\n\n\n@then(step_parse(r'all results contain(?: in field (?P<field>\\S+))?'))\ndef check_all_results_contain(nominatim_result, datatable, node_grid, field):\n    assert not nominatim_result.is_simple()\n    assert len(nominatim_result) > 0\n\n    if datatable[0] == ['param', 'value']:\n        pairs = datatable[1:]\n    else:\n        pairs = zip(datatable[0], datatable[1])\n\n    prefix = field + '+' if field else ''\n\n    for k, v in pairs:\n        for r in nominatim_result.result:\n            assert ResultAttr(r, prefix + k, grid=node_grid) == v\n\n\n@then(step_parse(r'result (?P<num>\\d+) contains(?: in field (?P<field>\\S+))?'),\n      converters={'num': int})\ndef check_specific_result_for_fields(nominatim_result, datatable, num, field):\n    assert not nominatim_result.is_simple()\n    assert len(nominatim_result) > num\n\n    if datatable[0] == ['param', 'value']:\n        pairs = datatable[1:]\n    else:\n        pairs = zip(datatable[0], datatable[1])\n\n    prefix = field + '+' if field else ''\n\n    for k, v in pairs:\n        assert ResultAttr(nominatim_result.result[num], prefix + k) == v\n\n\n@given(step_parse(r'the (?P<step>[0-9.]+ )?grid(?: with origin (?P<origin>.*))?'),\n       target_fixture='node_grid')\ndef set_node_grid(datatable, step, origin):\n    if step is not None:\n        step = float(step)\n\n    if origin:\n        if ',' in origin:\n            coords = origin.split(',')\n            if len(coords) != 2:\n                raise RuntimeError('Grid origin expects origin with x,y coordinates.')\n            origin = list(map(float, coords))\n        elif origin in ALIASES:\n            origin = ALIASES[origin]\n        else:\n            raise RuntimeError('Grid origin must be either coordinate or alias.')\n\n    return Grid(datatable, step, origin)\n\n\n@then(step_parse('(?P<table>placex?) has no entry for '\n                 r'(?P<osm_type>[NRW])(?P<osm_id>\\d+)(?::(?P<osm_class>\\S+))?'),\n      converters={'osm_id': int})\ndef check_place_missing_lines(db_conn, table, osm_type, osm_id, osm_class):\n    sql = pysql.SQL(\"\"\"SELECT count(*) FROM {}\n                       WHERE osm_type = %s and osm_id = %s\"\"\").format(pysql.Identifier(table))\n    params = [osm_type, int(osm_id)]\n    if osm_class:\n        sql += pysql.SQL(' AND class = %s')\n        params.append(osm_class)\n\n    with db_conn.cursor() as cur:\n        assert cur.execute(sql, params).fetchone()[0] == 0\n\n\nif pytest.version_tuple >= (8, 0, 0):\n    def pytest_pycollect_makemodule(module_path, parent):\n        return BddTestCollector.from_parent(parent, path=module_path)\n\n\nclass BddTestCollector(pytest.Module):\n\n    def __init__(self, **kwargs):\n        super().__init__(**kwargs)\n\n    def collect(self):\n        for item in super().collect():\n            yield item\n\n        if hasattr(self.obj, 'PYTEST_BDD_SCENARIOS'):\n            for path in self.obj.PYTEST_BDD_SCENARIOS:\n                for feature in get_features([str(Path(self.path.parent, path).resolve())]):\n                    yield FeatureFile.from_parent(self,\n                                                  name=str(Path(path, feature.rel_filename)),\n                                                  path=Path(feature.filename),\n                                                  feature=feature)\n\n\n# borrowed from pytest-bdd: src/pytest_bdd/scenario.py\ndef make_python_name(string: str) -> str:\n    \"\"\"Make python attribute name out of a given string.\"\"\"\n    string = re.sub(r\"\\W\", \"\", string.replace(\" \", \"_\"))\n    return re.sub(r\"^\\d+_*\", \"\", string).lower()\n\n\nclass FeatureFile(pytest.File):\n    class obj:\n        pass\n\n    def __init__(self, feature, **kwargs):\n        self.feature = feature\n        super().__init__(**kwargs)\n\n    def collect(self):\n        for sname, sobject in self.feature.scenarios.items():\n            class_name = f\"L{sobject.line_number}\"\n            test_name = \"test_\" + make_python_name(sname)\n\n            @scenario(self.feature.filename, sname)\n            def _test():\n                pass\n\n            tclass = type(class_name, (),\n                          {test_name: staticmethod(_test)})\n            setattr(self.obj, class_name, tclass)\n\n            yield pytest.Class.from_parent(self, name=class_name, obj=tclass)\n"
  },
  {
    "path": "test/bdd/features/api/details/language.feature",
    "content": "Feature: Localization of search results\n\n    Scenario: default language\n        When sending v1/details\n          | osmtype | osmid   |\n          | R       | 1155955 |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | localname |\n          | Liechtenstein |\n\n    Scenario: accept-language first\n        When sending v1/details\n          | osmtype | osmid   | accept-language |\n          | R       | 1155955 | zh,de |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | localname |\n          | 列支敦士登 |\n\n    Scenario: accept-language missing\n        When sending v1/details\n          | osmtype | osmid   | accept-language |\n          | R       | 1155955 | xx,fr,en,de |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | localname |\n          | Liechtenstein |\n\n    Scenario: http accept language header first\n        Given the HTTP header\n          | accept-language |\n          | fo;q=0.8,en-ca;q=0.5,en;q=0.3 |\n        When sending v1/details\n          | osmtype | osmid   |\n          | R       | 1155955 |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | localname |\n          | Liktinstein |\n\n    Scenario: http accept language header and accept-language\n        Given the HTTP header\n          | accept-language |\n          | fr-ca,fr;q=0.8,en-ca;q=0.5,en;q=0.3 |\n        When sending v1/details\n          | osmtype | osmid   | accept-language |\n          | R       | 1155955 | fo,en |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | localname |\n          | Liktinstein |\n\n    Scenario: http accept language header fallback\n        Given the HTTP header\n          | accept-language |\n          | fo-ca,en-ca;q=0.5 |\n        When sending v1/details\n          | osmtype | osmid   |\n          | R       | 1155955 |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | localname |\n          | Liktinstein |\n\n    Scenario: http accept language header fallback (upper case)\n        Given the HTTP header\n          | accept-language |\n          | fo-FR;q=0.8,en-ca;q=0.5 |\n        When sending v1/details\n          | osmtype | osmid   |\n          | R       | 1155955 |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | localname |\n          | Liktinstein |\n"
  },
  {
    "path": "test/bdd/features/api/details/params.feature",
    "content": "Feature: Object details\n    Testing different parameter options for details API.\n\n    Scenario: Basic details\n        When sending v1/details\n          | osmtype | osmid |\n          | W       | 297699560 |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result has attributes geometry\n        And the result has no attributes keywords,address,linked_places,parentof\n        And the result contains\n            | geometry+type  |\n            | Point |\n\n    Scenario: Basic details with pretty printing\n        When sending v1/details\n          | osmtype | osmid     | pretty |\n          | W       | 297699560 | 1      |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result has attributes geometry\n        And the result has no attributes keywords,address,linked_places,parentof\n\n    Scenario: Details with addressdetails\n        When sending v1/details\n          | osmtype | osmid     | addressdetails |\n          | W       | 297699560 | 1              |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result has attributes address\n\n    Scenario: Details with entrances\n        When sending v1/details\n          | osmtype | osmid     | entrances |\n          | W       | 429210603 | 1         |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains array field entrances where element 0 contains\n          | osm_id     | type | lat        | lon       |\n          | 6580031131 | yes  | 47.2489382 | 9.5284033 |\n\n    Scenario: Details with linkedplaces\n        When sending v1/details\n          | osmtype | osmid  | linkedplaces |\n          | R       | 123924 | 1            |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result has attributes linked_places\n\n    Scenario: Details with hierarchy\n        When sending v1/details\n          | osmtype | osmid     | hierarchy |\n          | W       | 297699560 | 1         |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result has attributes hierarchy\n\n    Scenario: Details with grouped hierarchy\n        When sending v1/details\n          | osmtype | osmid     | hierarchy | group_hierarchy |\n          | W       | 297699560 | 1         | 1               |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result has attributes hierarchy\n\n    Scenario Outline: Details with keywords\n        When sending v1/details\n            | osmtype | osmid | keywords |\n            | <type>  | <id>  | 1 |\n        Then a HTTP 200 is returned\n        Then the result is valid json\n        And the result has attributes keywords\n\n    Examples:\n      | type | id |\n      | W    | 297699560 |\n      | W    | 243055645 |\n      | W    | 243055716 |\n      | W    | 43327921  |\n\n    # ticket #1343\n    Scenario: Details of a country with keywords\n        When sending v1/details\n            | osmtype | osmid   | keywords |\n            | R       | 1155955 | 1 |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result has attributes keywords\n\n    Scenario Outline: Details with full geometry\n        When sending v1/details\n            | osmtype | osmid | polygon_geojson |\n            | <type>  | <id>  | 1 |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result has attributes geometry\n        And the result contains\n            | geometry+type |\n            | <geometry> |\n\n    Examples:\n            | type | id        | geometry   |\n            | W    | 297699560 | LineString |\n            | W    | 243055645 | Polygon    |\n            | W    | 243055716 | Polygon    |\n            | W    | 43327921  | LineString |\n\n\n"
  },
  {
    "path": "test/bdd/features/api/details/simple.feature",
    "content": "Feature: Object details\n    Check details page for correctness\n\n    Scenario Outline: Details request with OSM id\n        When sending v1/details\n          | osmtype | osmid |\n          | <type>  | <id>  |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n            | osm_type | osm_id |\n            | <type>   | <id> |\n\n    Examples:\n     | type | id |\n     | N    | 5484325405 |\n     | W    | 43327921 |\n     | R    | 123924 |\n\n    Scenario Outline: Details request with different class types for the same OSM id\n        When sending v1/details\n          | osmtype | osmid     | class   |\n          | N       | 300209696 | <class> |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | osm_type | osm_id    | category |\n          | N        | 300209696 | <class>  |\n\n    Examples:\n     | class |\n     | tourism |\n     | mountain_pass |\n\n    Scenario: Details request without osmtype\n        When sending v1/details\n          | osmid |\n          | <id>  |\n        Then a HTTP 400 is returned\n        And the result is valid json\n\n    Scenario: Details request with unknown OSM id\n        When sending v1/details\n          | osmtype | osmid |\n          | R       | 1     |\n        Then a HTTP 404 is returned\n        And the result is valid json\n\n    Scenario: Details request with unknown class\n        When sending v1/details\n          | osmtype | osmid     | class   |\n          | N       | 300209696 | highway |\n        Then a HTTP 404 is returned\n        And the result is valid json\n\n    Scenario: Details for interpolation way return the interpolation\n        When sending v1/details\n          | osmtype | osmid |\n          | W       | 1     |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | category | type   | osm_type | osm_id | admin_level |\n          | place    | houses | W        | 1      | 15          |\n\n\n    @skip\n    Scenario: Details for interpolation way return the interpolation\n        When sending details query for 112871\n        Then the result is valid json\n        And the result contains\n            | category | type   | admin_level |\n            | place    | houses | 15          |\n        And result has not attributes osm_type,osm_id\n\n\n    @skip\n    Scenario: Details for postcode\n        When sending details query for 112820\n        Then the result is valid json\n        And the result contains\n            | category | type     | admin_level |\n            | place    | postcode | 15          |\n        And result has not attributes osm_type,osm_id\n\n\n    Scenario Outline: Details debug output returns no errors\n        When sending v1/details\n          | osmtype | osmid | debug |\n          | <type>  | <id>  | 1     |\n        Then a HTTP 200 is returned\n        And the result is valid html\n\n    Examples:\n     | type | id |\n     | N    | 5484325405 |\n     | W    | 43327921 |\n     | R    | 123924 |\n\n"
  },
  {
    "path": "test/bdd/features/api/lookup/simple.feature",
    "content": "Feature: Tests for finding places by osm_type and osm_id\n    Simple tests for response format.\n\n    Scenario Outline: Address lookup for existing object\n        When sending v1/lookup with format <format>\n          | osm_ids |\n          | N5484325405,W43327921,,R123924,X99,N0 |\n        Then a HTTP 200 is returned\n        And the result is valid <outformat>\n        And exactly 3 results are returned\n\n    Examples:\n        | format      | outformat   |\n        | xml         | xml         |\n        | json        | json        |\n        | jsonv2      | json        |\n        | geojson     | geojson     |\n        | geocodejson | geocodejson |\n\n    Scenario: Address lookup for non-existing or invalid object\n        When sending v1/lookup\n          | osm_ids |\n          | X99,,N0,nN158845944,ABC,,W9 |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And exactly 0 results are returned\n\n    Scenario Outline: Boundingbox is returned\n        When sending v1/lookup with format <format>\n          | osm_ids |\n          | N5484325405,W43327921 |\n        Then the result is valid <outformat>\n        And the result set contains exactly\n          | object      | boundingbox!in_box |\n          | N5484325405 | 47.135,47.14,9.52,9.525 |\n          | W43327921   | 47.07,47.08,9.50,9.52   |\n\n    Examples:\n        | format      | outformat   |\n        | xml         | xml         |\n        | json        | json        |\n        | jsonv2      | json        |\n        | geojson     | geojson     |\n\n    Scenario Outline: Lookup with entrances\n        When sending v1/lookup with format <format>\n          | osm_ids    | entrances |\n          | W429210603 | 1         |\n        Then a HTTP 200 is returned\n        And the result is valid <outformat>\n        And result 0 contains in field entrances+0\n          | osm_id     | type | lat        | lon       |\n          | 6580031131 | yes  | 47.2489382 | 9.5284033 |\n\n        Examples:\n          | format | outformat |\n          | json   | json |\n          | jsonv2 | json |\n          | geojson | geojson |\n\n    Scenario: Linked places return information from the linkee\n        When sending v1/lookup with format geocodejson\n          | osm_ids |\n          | N1932181216 |\n        Then the result is valid geocodejson\n        And exactly 1 result is returned\n        And all results contain\n          | name  |\n          | Vaduz |\n\n    Scenario Outline: Force error by providing too many ids\n        When sending v1/lookup with format <format>\n          | osm_ids |\n          | N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11,N12,N13,N14,N15,N16,N17,N18,N19,N20,N21,N22,N23,N24,N25,N26,N27,N28,N29,N30,N31,N32,N33,N34,N35,N36,N37,N38,N39,N40,N41,N42,N43,N44,N45,N46,N47,N48,N49,N50,N51 |\n        Then a HTTP 400 is returned\n        And the result is valid <outformat>\n        And the result contains\n          | error+code | error+message |\n          | 400        | Too many object IDs. |\n\n    Examples:\n        | format      | outformat   |\n        | xml         | xml         |\n        | json        | json        |\n        | jsonv2      | json        |\n        | geojson     | json        |\n        | geocodejson | json        |\n"
  },
  {
    "path": "test/bdd/features/api/reverse/geometry.feature",
    "content": "Feature: Geometries for reverse geocoding\n    Tests for returning geometries with reverse\n\n    Scenario: Reverse - polygons are returned fully by default\n        When sending v1/reverse\n          | lat      | lon     | polygon_text |\n          | 47.13803 | 9.52264 | 1            |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result contains\n          | geotext!fm |\n          | POLYGON\\(\\(9.5225302 47.138066, ?9.5225348 47.1379282, ?9.5226142 47.1379294, ?9.5226143 47.1379257, ?9.522615 47.137917, ?9.5226225 47.1379098, ?9.5226334 47.1379052, ?9.5226461 47.1379037, ?9.5226588 47.1379056, ?9.5226693 47.1379107, ?9.5226762 47.1379181, ?9.5226762 47.1379268, ?9.5226761 47.1379308, ?9.5227366 47.1379317, ?9.5227352 47.1379753, ?9.5227608 47.1379757, ?9.5227595 47.1380148, ?9.5227355 47.1380145, ?9.5227337 47.1380692, ?9.5225302 47.138066\\)\\) |\n\n\n    Scenario: Reverse - polygons can be slightly simplified\n        When sending v1/reverse\n          | lat      | lon     | polygon_text | polygon_threshold |\n          | 47.13803 | 9.52264 | 1            | 0.00001            |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result contains\n          | geotext!fm |\n          | POLYGON\\(\\(9.5225302 47.138066, ?9.5225348 47.1379282, ?9.5226142 47.1379294, ?9.5226225 47.1379098, ?9.5226588 47.1379056, ?9.5226761 47.1379308, ?9.5227366 47.1379317, ?9.5227352 47.1379753, ?9.5227608 47.1379757, ?9.5227595 47.1380148, ?9.5227355 47.1380145, ?9.5227337 47.1380692, ?9.5225302 47.138066\\)\\) |\n\n\n    Scenario: Reverse - polygons can be much simplified\n        When sending v1/reverse\n          | lat      | lon     | polygon_text | polygon_threshold |\n          | 47.13803 | 9.52264 | 1            | 0.9               |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result contains\n          | geotext!fm |\n          | POLYGON\\(\\([0-9. ]+, ?[0-9. ]+, ?[0-9. ]+, ?[0-9. ]+(, ?[0-9. ]+)?\\)\\) |\n\n\n    Scenario: Reverse - for polygons return the centroid as center point\n        When sending v1/reverse\n          | lat      | lon     |\n          | 47.13836 | 9.52304 |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result contains\n          | lon       | lat        |\n          | 9.5227108 | 47.1381805 |\n\n\n    Scenario: Reverse - for streets return the closest point as center point\n        When sending v1/reverse\n          | lat      | lon     |\n          | 47.13368 | 9.52942 |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result contains\n          | lon       | lat        |\n          | 9.5294315 | 47.1336817 |\n"
  },
  {
    "path": "test/bdd/features/api/reverse/language.feature",
    "content": "Feature: Localization of reverse search results\n\n    Scenario: Reverse - default language\n        When sending v1/reverse with format jsonv2\n          | lat   | lon  |\n          | 47.14 | 9.55 |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | address+country |\n          | Liechtenstein |\n\n    Scenario: Reverse - accept-language parameter\n        When sending v1/reverse with format jsonv2\n          | lat   | lon  | accept-language |\n          | 47.14 | 9.55 | ja,en |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | address+country |\n          | リヒテンシュタイン |\n\n    Scenario: Reverse - HTTP accept language header\n        Given the HTTP header\n          | accept-language |\n          | fo-ca,fo;q=0.8,en-ca;q=0.5,en;q=0.3 |\n        When sending v1/reverse with format jsonv2\n          | lat   | lon  |\n          | 47.14 | 9.55 |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | address+country |\n          | Liktinstein |\n\n    Scenario: Reverse - accept-language parameter and HTTP header\n        Given the HTTP header\n          | accept-language |\n          | fo-ca,fo;q=0.8,en-ca;q=0.5,en;q=0.3 |\n        When sending v1/reverse with format jsonv2\n          | lat   | lon  | accept-language |\n          | 47.14 | 9.55 | en |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | address+country |\n          | Liechtenstein |\n"
  },
  {
    "path": "test/bdd/features/api/reverse/layers.feature",
    "content": "Feature: Layer parameter in reverse geocoding\n    Testing correct function of layer selection while reverse geocoding\n\n    Scenario: POIs are selected by default\n        When reverse geocoding 47.14077,9.52414\n        Then the result contains\n          | category | type      |\n          | tourism  | viewpoint |\n\n    Scenario Outline: Same address level POI with different layers\n        When reverse geocoding 47.14077,9.52414\n          | layer   |\n          | <layer> |\n        Then the result contains\n          | category   |\n          | <category> |\n\n        Examples:\n          | layer           | category |\n          | address         | highway  |\n          | poi,address     | tourism  |\n          | address,poi     | tourism  |\n          | natural         | waterway |\n          | address,natural | highway  |\n          | natural,poi     | tourism  |\n\n     Scenario Outline: POIs are not selected without housenumber for address layer\n        When reverse geocoding 47.13816,9.52168\n          | layer   |\n          | <layer> |\n        Then the result contains\n          | category   | type   |\n          | <category> | <type> |\n\n        Examples:\n          | layer       | category | type     |\n          | address,poi | highway  | bus_stop |\n          | address     | amenity  | parking  |\n\n     Scenario: Between natural and low-zoom address prefer natural\n         When reverse geocoding 47.13636,9.52094\n           | layer           | zoom |\n           | natural,address | 15   |\n         Then the result contains\n           | category |\n           | waterway |\n\n    Scenario Outline: Search for mountain peaks begins at level 12\n        When reverse geocoding 47.08293,9.57109\n          | layer   | zoom   |\n          | natural | <zoom> |\n        Then the result contains\n          | category   | type   |\n          | <category> | <type> |\n\n        Examples:\n          | zoom | category | type  |\n          | 12   | natural  | peak  |\n          | 13   | waterway | river |\n\n     Scenario Outline: Reverse search with manmade layers\n        When reverse geocoding 32.46904,-86.44439\n          | layer   |\n          | <layer> |\n        Then the result contains\n          | category   | type   |\n          | <category> | <type> |\n\n        Examples:\n          | layer           | category | type        |\n          | manmade         | leisure  | park        |\n          | address         | highway  | residential |\n          | poi             | leisure  | pitch       |\n          | natural         | waterway | river       |\n          | natural,manmade | leisure  | park        |\n"
  },
  {
    "path": "test/bdd/features/api/reverse/queries.feature",
    "content": "Feature: Reverse geocoding\n    Testing the reverse function\n\n    Scenario: Reverse - Unknown countries fall back to default country grid\n        When reverse geocoding 45.174,-103.072\n        Then the result contains\n          | category | type    | display_name |\n          | place    | country | United States |\n\n    Scenario: Reverse - No TIGER house number for zoom < 18\n        When reverse geocoding 32.4752389363,-86.4810198619\n          | zoom |\n          | 17 |\n        Then the result contains\n          | osm_type | category |\n          | way      | highway  |\n        And the result contains in field address\n          | road                | postcode | country_code |\n          | Upper Kingston Road | 36067    | us |\n\n    Scenario: Reverse - Address with non-numerical house number\n        When reverse geocoding 47.107465,9.52838521614\n        Then the result contains in field address\n          | house_number | road |\n          | 39A/B        | Dorfstrasse |\n\n    Scenario: Reverse - Address with numerical house number\n        When reverse geocoding 47.168440329479594,9.511551699184338\n        Then the result contains in field address\n          | house_number | road |\n          | 6            | Schmedgässle |\n\n    Scenario Outline: Reverse - Zoom levels below 5 result in country\n        When reverse geocoding 47.16,9.51\n         | zoom |\n         | <zoom> |\n        Then the result contains\n         | display_name |\n         | Liechtenstein |\n\n        Examples:\n             | zoom |\n             | 0    |\n             | 1    |\n             | 2    |\n             | 3    |\n             | 4    |\n\n    Scenario: Reverse - When on a street, the closest interpolation is shown\n        When reverse geocoding 47.118457166193245,9.570678289621355\n         | zoom |\n         | 18 |\n        Then the result contains\n         | display_name |\n         | 1021, Grosssteg, Sücka, Triesenberg, Oberland, 9497, Liechtenstein |\n\n    # github 2214\n    Scenario: Reverse - Interpolations do not override house numbers when they are closer\n        When reverse geocoding 47.11778,9.57255\n         | zoom |\n         | 18 |\n        Then the result contains\n         | display_name |\n         | 5, Grosssteg, Steg, Triesenberg, Oberland, 9497, Liechtenstein |\n\n    Scenario: Reverse - Interpolations do not override house numbers when they are closer (2)\n        When reverse geocoding 47.11834,9.57167\n         | zoom |\n         | 18 |\n        Then the result contains\n         | display_name |\n         | 3, Grosssteg, Sücka, Triesenberg, Oberland, 9497, Liechtenstein |\n\n    Scenario: Reverse - When on a street with zoom 18, the closest housenumber is returned\n        When reverse geocoding 47.11755503977281,9.572722250405036\n         | zoom |\n         | 18 |\n        Then the result contains in field address\n         | house_number |\n         | 7 |\n\n    Scenario: Reverse - inherited address is shown by default\n        When reverse geocoding 47.0629071,9.4879694\n        Then the result contains\n         | osm_type | category | display_name |\n         | node     | office   | foo.li, 64, Hampfländer, Mäls, Balzers, Oberland, 9496, Liechtenstein |\n\n    Scenario: Reverse - inherited address is not shown with address layer\n        When reverse geocoding 47.0629071,9.4879694\n         | layer |\n         | address |\n        Then the result contains\n         | osm_type | category | display_name |\n         | way      | building | 64, Hampfländer, Mäls, Balzers, Oberland, 9496, Liechtenstein |\n"
  },
  {
    "path": "test/bdd/features/api/reverse/v1_geocodejson.feature",
    "content": "Feature: Geocodejson for Reverse API\n    Testing correctness of geocodejson output (API version v1).\n\n    Scenario Outline: Reverse geocodejson - Simple with no results\n        When sending v1/reverse with format geocodejson\n          | lat   | lon   |\n          | <lat> | <lon> |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | error |\n          | Unable to geocode |\n\n        Examples:\n          | lat  | lon |\n          | 0.0  | 0.0 |\n          | 91.3 | 0.4    |\n          | -700 | 0.4    |\n          | 0.2  | 324.44 |\n          | 0.2  | -180.4 |\n\n    Scenario Outline: Reverse geocodejson - Simple OSM result\n        When sending v1/reverse with format geocodejson\n          | lat    | lon   | addressdetails |\n          | 47.066 | 9.504 | <has_address>  |\n        Then a HTTP 200 is returned\n        And the result is valid geocodejson with 1 result\n        And the result metadata contains\n          | version | licence | attribution!fm |\n          | 0.1.0   | ODbL    | Data © OpenStreetMap contributors, ODbL 1.0. https?://osm.org/copyright |\n        And all results have <attributes> country,postcode,county,city,district,street,housenumber,admin\n        And all results contain\n          | param               | value |\n          | osm_type            | node |\n          | osm_id              | 6522627624 |\n          | osm_key             | shop |\n          | osm_value           | bakery |\n          | type                | house |\n          | name                | Dorfbäckerei Herrmann |\n          | label               | Dorfbäckerei Herrmann, 29, Gnetsch, Mäls, Balzers, Oberland, 9496, Liechtenstein |\n          | geojson+type        | Point |\n          | geojson+coordinates | [9.5036065, 47.0660892] |\n\n        Examples:\n          | has_address | attributes     |\n          | 1           | attributes     |\n          | 0           | no attributes |\n\n    Scenario: Reverse geocodejson - City housenumber-level address with street\n        When sending v1/reverse with format geocodejson\n          | lat        | lon        |\n          | 47.1068011 | 9.52810091 |\n        Then a HTTP 200 is returned\n        And the result is valid geocodejson with 1 result\n        And all results contain\n          | housenumber | street    | postcode | city    | country |\n          | 8           | Im Winkel | 9495     | Triesen | Liechtenstein |\n         And all results contain\n          | admin+level6 | admin+level8 |\n          | Oberland     | Triesen      |\n\n    Scenario: Reverse geocodejson - Town street-level address with street\n        When sending v1/reverse with format geocodejson\n          | lat    | lon   | zoom |\n          | 47.066 | 9.504 | 16 |\n        Then a HTTP 200 is returned\n        And the result is valid geocodejson with 1 result\n        And all results contain\n          | name    | city    | postcode | country |\n          | Gnetsch | Balzers | 9496     | Liechtenstein |\n\n    Scenario: Reverse geocodejson - Poi street-level address with footway\n        When sending v1/reverse with format geocodejson\n          | lat      | lon     |\n          | 47.06515 | 9.50083 |\n        Then a HTTP 200 is returned\n        And the result is valid geocodejson with 1 result\n        And all results contain\n          | street  | city    | postcode | country |\n          | Burgweg | Balzers | 9496     | Liechtenstein |\n\n    Scenario: Reverse geocodejson - City address with suburb\n        When sending v1/reverse with format geocodejson\n          | lat       | lon      |\n          | 47.146861 | 9.511771 |\n        Then a HTTP 200 is returned\n        And the result is valid geocodejson with 1 result\n        And all results contain\n          | housenumber | street   | district | city  | postcode | country |\n          | 5           | Lochgass | Ebenholz | Vaduz | 9490     | Liechtenstein |\n\n    Scenario: Reverse geocodejson - Tiger address\n        When sending v1/reverse with format geocodejson\n          | lat           | lon            |\n          | 32.4752389363 | -86.4810198619 |\n        Then a HTTP 200 is returned\n        And the result is valid geocodejson with 1 result\n        And all results contain\n         | osm_type | osm_id    | osm_key | osm_value | type  |\n         | way      | 396009653 | place   | house     | house |\n        And all results contain\n         | housenumber | street              | city       | county         | postcode | country       |\n         | 707         | Upper Kingston Road | Prattville | Autauga County | 36067    | United States |\n\n    Scenario: Reverse geocodejson - Interpolation address\n        When sending v1/reverse with format geocodejson\n          | lat       | lon        |\n          | 47.118533 | 9.57056562 |\n        Then a HTTP 200 is returned\n        And the result is valid geocodejson with 1 result\n        And all results contain\n          | osm_type | osm_id | osm_key | osm_value | type  |\n          | way      | 1      | place   | house     | house |\n        And all results contain\n          | label |\n          | 1019, Grosssteg, Sücka, Triesenberg, Oberland, 9497, Liechtenstein |\n        And all results have no attributes name\n\n    Scenario: Reverse geocodejson - Line geometry output is supported\n        When sending v1/reverse with format geocodejson\n          | lat      | lon     | polygon_geojson |\n          | 47.06597 | 9.50467 | 1  |\n        Then a HTTP 200 is returned\n        And the result is valid geocodejson with 1 result\n        And all results contain\n          | geojson+type |\n          | LineString   |\n\n    Scenario Outline: Reverse geocodejson - Only geojson polygons are supported\n        When sending v1/reverse with format geocodejson\n          | lat      | lon     | <param> |\n          | 47.06597 | 9.50467 | 1       |\n        Then a HTTP 200 is returned\n        And the result is valid geocodejson with 1 result\n        And all results contain\n          | geojson+type |\n          | Point        |\n\n        Examples:\n          | param |\n          | polygon_text |\n          | polygon_svg  |\n          | polygon_kml  |\n"
  },
  {
    "path": "test/bdd/features/api/reverse/v1_geojson.feature",
    "content": "Feature: Geojson for Reverse API\n    Testing correctness of geojson output (API version v1).\n\n    Scenario Outline: Reverse geojson - Simple with no results\n        When sending v1/reverse with format geojson\n          | lat   | lon   |\n          | <lat> | <lon> |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | error |\n          | Unable to geocode |\n\n        Examples:\n          | lat  | lon |\n          | 0.0  | 0.0 |\n          | 91.3 | 0.4    |\n          | -700 | 0.4    |\n          | 0.2  | 324.44 |\n          | 0.2  | -180.4 |\n\n    Scenario Outline: Reverse geojson - Simple OSM result\n        When sending v1/reverse with format geojson\n          | lat    | lon   | addressdetails |\n          | 47.066 | 9.504 | <has_address>  |\n        Then a HTTP 200 is returned\n        And the result is valid geojson with 1 result\n        And the result metadata contains\n          | licence!fm |\n          | Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright |\n        And all results have attributes place_id, importance\n        And all results have <attributes> address\n        And all results contain\n          | param               | value |\n          | osm_type            | node |\n          | osm_id              | 6522627624 |\n          | place_rank          | 30 |\n          | category            | shop |\n          | type                | bakery |\n          | addresstype         | shop |\n          | name                | Dorfbäckerei Herrmann |\n          | display_name        | Dorfbäckerei Herrmann, 29, Gnetsch, Mäls, Balzers, Oberland, 9496, Liechtenstein |\n          | boundingbox         | [47.0660392, 47.0661392, 9.5035565, 9.5036565] |\n          | geojson+type        | Point |\n          | geojson+coordinates | [9.5036065, 47.0660892] |\n\n        Examples:\n          | has_address | attributes    |\n          | 1           | attributes    |\n          | 0           | no attributes |\n\n    Scenario: Reverse geojson - Tiger address\n        When sending v1/reverse with format geojson\n          | lat           | lon            |\n          | 32.4752389363 | -86.4810198619 |\n        Then a HTTP 200 is returned\n        And the result is valid geojson with 1 result\n        And all results contain\n          | osm_type | osm_id    | category | type  | addresstype  | place_rank |\n          | way      | 396009653 | place    | house | place        | 30         |\n\n    Scenario: Reverse geojson - Interpolation address\n        When sending v1/reverse with format geojson\n          | lat       | lon        |\n          | 47.118533 | 9.57056562 |\n        Then a HTTP 200 is returned\n        And the result is valid geojson with 1 result\n        And all results contain\n          | osm_type | osm_id | place_rank | category | type    | addresstype |\n          | way      | 1      | 30         | place    | house   | place       |\n        And all results contain\n          | boundingbox!in_box |\n          | 47.118494, 47.118596, 9.570495, 9.570597 |\n        And all results contain\n          | display_name |\n          | 1019, Grosssteg, Sücka, Triesenberg, Oberland, 9497, Liechtenstein |\n\n    Scenario: Reverse geojson - Line geometry output is supported\n        When sending v1/reverse with format geojson\n          | lat      | lon     | polygon_geojson |\n          | 47.06597 | 9.50467 | 1               |\n        Then a HTTP 200 is returned\n        And the result is valid geojson with 1 result\n        And all results contain\n          | geojson+type |\n          | LineString   |\n\n    Scenario Outline: Reverse geojson - Only geojson polygons are supported\n        When sending v1/reverse with format geojson\n          | lat      | lon     | <param> |\n          | 47.06597 | 9.50467 | 1       |\n        Then a HTTP 200 is returned\n        And the result is valid geojson with 1 result\n        And all results contain\n          | geojson+type |\n          | Point |\n\n        Examples:\n          | param |\n          | polygon_text |\n          | polygon_svg  |\n          | polygon_kml  |\n"
  },
  {
    "path": "test/bdd/features/api/reverse/v1_json.feature",
    "content": "Feature: Json output for Reverse API\n    Testing correctness of json and jsonv2 output (API version v1).\n\n    Scenario Outline: Reverse json - Simple with no results\n        When sending v1/reverse with format json\n          | lat   | lon   |\n          | <lat> | <lon> |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | error |\n          | Unable to geocode |\n        When sending v1/reverse with format jsonv2\n          | lat   | lon   |\n          | <lat> | <lon> |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | error |\n          | Unable to geocode |\n\n        Examples:\n          | lat  | lon |\n          | 0.0  | 0.0 |\n          | 91.3 | 0.4    |\n          | -700 | 0.4    |\n          | 0.2  | 324.44 |\n          | 0.2  | -180.4 |\n\n    Scenario Outline: Reverse json - OSM result with and without addresses\n        When sending v1/reverse with format json\n          | lat    | lon   | addressdetails |\n          | 47.066 | 9.504 | <has_address>  |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result has <attributes> address\n        When sending v1/reverse with format jsonv2\n          | lat    | lon   | addressdetails |\n          | 47.066 | 9.504 | <has_address>  |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result has <attributes> address\n\n        Examples:\n          | has_address | attributes    |\n          | 1           | attributes    |\n          | 0           | no attributes |\n\n    Scenario Outline: Reverse json - Simple OSM result\n        When sending v1/reverse with format <format>\n          | lat    | lon   |\n          | 47.066 | 9.504 |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result has attributes place_id\n        And the result contains\n          | licence!fm |\n          | Data © OpenStreetMap contributors, ODbL 1.0. https?://osm.org/copyright |\n        And the result contains\n          | osm_type | osm_id     |\n          | node     | 6522627624 |\n        And the result contains\n          | lon       | lat        | boundingbox!in_box |\n          | 9.5036065 | 47.0660892 | 47.0660391, 47.0661393, 9.5035564, 9.5036566 |\n        And the result contains\n          | display_name |\n          | Dorfbäckerei Herrmann, 29, Gnetsch, Mäls, Balzers, Oberland, 9496, Liechtenstein |\n        And the result has no attributes namedetails,extratags\n\n        Examples:\n          | format |\n          | json   |\n          | jsonv2 |\n\n    Scenario: Reverse json - Extra attributes of jsonv2 result\n        When sending v1/reverse with format jsonv2\n          | lat    | lon   |\n          | 47.066 | 9.504 |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result has attributes importance\n        And the result contains\n          | category | type   | name                  | place_rank | addresstype |\n          | shop     | bakery | Dorfbäckerei Herrmann | 30         | shop        |\n\n    Scenario: Reverse json - Tiger address\n        When sending v1/reverse with format jsonv2\n          | lat           | lon            |\n          | 32.4752389363 | -86.4810198619 |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | osm_type | osm_id    | category | type  | addresstype  |\n          | way      | 396009653 | place    | house | place        |\n\n    Scenario Outline: Reverse json - Interpolation address\n        When sending v1/reverse with format <format>\n          | lat       | lon        |\n          | 47.118533 | 9.57056562 |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | osm_type | osm_id |\n          | way      | 1      |\n        And the result contains\n          | lon       | lat        | boundingbox!in_box |\n          | 9.5705467 | 47.1185454 | 47.118494, 47.118596, 9.570495, 9.570597 |\n        And the result contains\n          | display_name |\n          | 1019, Grosssteg, Sücka, Triesenberg, Oberland, 9497, Liechtenstein |\n\n        Examples:\n          | format |\n          | json   |\n          | jsonv2 |\n\n    Scenario Outline: Reverse json - Output of geojson\n        When sending v1/reverse with format <format>\n          | lat      | lon     | polygon_geojson |\n          | 47.06597 | 9.50467 | 1               |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | geojson+type | geojson+coordinates |\n          | LineString   | [[9.5039353, 47.0657546], [9.5040437, 47.0657781], [9.5040808, 47.065787], [9.5054298, 47.0661407]] |\n\n       Examples:\n          | format |\n          | json   |\n          | jsonv2 |\n\n    Scenario Outline: Reverse json - Output of WKT\n        When sending v1/reverse with format <format>\n          | lat      | lon     | polygon_text |\n          | 47.06597 | 9.50467 | 1            |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | geotext!wkt |\n          | 9.5039353 47.0657546, 9.5040437 47.0657781, 9.5040808 47.065787, 9.5054298 47.0661407 |\n\n       Examples:\n          | format |\n          | json   |\n          | jsonv2 |\n\n    Scenario Outline: Reverse json - Output of SVG\n       When sending v1/reverse with format <format>\n          | lat      | lon     | polygon_svg |\n          | 47.06597 | 9.50467 | 1           |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | svg |\n          | M 9.5039353 -47.0657546 L 9.5040437 -47.0657781 9.5040808 -47.065787 9.5054298 -47.0661407 |\n\n       Examples:\n          | format |\n          | json   |\n          | jsonv2 |\n\n    Scenario Outline: Reverse json - Output of KML\n        When sending v1/reverse with format <format>\n          | lat      | lon     | polygon_kml |\n          | 47.06597 | 9.50467 | 1           |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | geokml!fm |\n          | <LineString><coordinates>9.5039\\d*,47.0657\\d* 9.5040\\d*,47.0657\\d* 9.5040\\d*,47.065\\d* 9.5054\\d*,47.0661\\d*</coordinates></LineString> |\n\n       Examples:\n          | format |\n          | json   |\n          | jsonv2 |\n"
  },
  {
    "path": "test/bdd/features/api/reverse/v1_params.feature",
    "content": "Feature: v1/reverse Parameter Tests\n    Tests for parameter inputs for the v1 reverse endpoint.\n    This file contains mostly bad parameter input. Valid parameters\n    are tested in the format tests.\n\n    Scenario: Bad format\n        When sending v1/reverse\n          | lat         | lon           | format |\n          | 47.14122383 | 9.52169581334 | sdf |\n        Then a HTTP 400 is returned\n\n    Scenario: Missing lon parameter\n        When sending v1/reverse\n          | lat   |\n          | 52.52 |\n        Then a HTTP 400 is returned\n\n    Scenario: Missing lat parameter\n        When sending v1/reverse\n          | lon |\n          | 52.52 |\n        Then a HTTP 400 is returned\n\n    Scenario Outline: Bad format for lat or lon\n        When sending v1/reverse\n          | lat   | lon   |\n          | <lat> | <lon> |\n        Then a HTTP 400 is returned\n\n        Examples:\n          | lat      | lon |\n          | 48.9660  | 8,4482 |\n          | 48,9660  | 8.4482 |\n          | 48,9660  | 8,4482 |\n          | 48.966.0 | 8.4482 |\n          | 48.966   | 8.448.2 |\n          | Nan      | 8.448  |\n          | 48.966   | Nan    |\n          | Inf      | 5.6    |\n          | 5.6      | -Inf   |\n          | <script></script> | 3.4 |\n          | 3.4 | <script></script> |\n          | -45.3    | ;      |\n          | gkjd     | 50     |\n\n    Scenario: Non-numerical zoom levels return an error\n        When sending v1/reverse\n          | lat         | lon           | zoom |\n          | 47.14122383 | 9.52169581334 | adfe |\n        Then a HTTP 400 is returned\n\n    Scenario Outline: Truthy values for boolean parameters\n        When sending v1/reverse\n          | lat         | lon           | addressdetails |\n          | 47.14122383 | 9.52169581334 | <value> |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result has attributes address\n\n        When sending v1/reverse\n          | lat         | lon           | extratags |\n          | 47.14122383 | 9.52169581334 | <value> |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result has attributes extratags\n\n        When sending v1/reverse\n          | lat         | lon           | namedetails |\n          | 47.14122383 | 9.52169581334 | <value> |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result has attributes namedetails\n\n        Examples:\n          | value |\n          | yes   |\n          | no    |\n          | -1    |\n          | 100   |\n          | false |\n          | 00    |\n\n    Scenario: Only one geometry can be requested\n        When sending v1/reverse\n          | lat         | lon           | polygon_text | polygon_svg |\n          | 47.14122383 | 9.52169581334 | 1            | 1           |\n        Then a HTTP 400 is returned\n\n    Scenario Outline: Illegal jsonp are not allowed\n        When sending v1/reverse with format json\n          | lat         | lon           | json_callback |\n          | 47.14122383 | 9.52169581334 | <data> |\n        Then a HTTP 400 is returned\n\n        Examples:\n          | data |\n          | 1asd |\n          | bar(foo) |\n          | XXX['bad'] |\n          | foo; evil |\n\n    Scenario Outline: Reverse debug mode produces valid HTML\n        When sending v1/reverse\n          | lat   | lon   | debug |\n          | <lat> | <lon> | 1 |\n        Then a HTTP 200 is returned\n        And the result is valid html\n\n        Examples:\n          | lat      | lon     |\n          | 0.0      | 0.0     |\n          | 47.06645 | 9.56601 |\n          | 47.14081 | 9.52267 |\n\n    Scenario Outline: Full address display for city housenumber-level address with street\n        When sending v1/reverse with format <format>\n          | lat        | lon        |\n          | 47.1068011 | 9.52810091 |\n        Then a HTTP 200 is returned\n        And the result is valid <outformat>\n        And the result contains in field address\n          | param          | value     |\n          | house_number   | 8         |\n          | road           | Im Winkel |\n          | neighbourhood  | Oberdorf  |\n          | village        | Triesen   |\n          | ISO3166-2-lvl8 | LI-09     |\n          | county         | Oberland  |\n          | postcode       | 9495      |\n          | country        | Liechtenstein |\n          | country_code   | li        |\n\n        Examples:\n          | format  | outformat |\n          | json    | json |\n          | jsonv2  | json |\n          | xml     | xml |\n\n    Scenario Outline: Results with name details\n        When sending v1/reverse with format <format>\n          | lat      | lon     | zoom | namedetails |\n          | 47.14052 | 9.52202 | 14   | 1           |\n        Then a HTTP 200 is returned\n        And the result is valid <outformat>\n        And the result contains in field namedetails\n          | name     |\n          | Ebenholz |\n\n        Examples:\n          | format  | outformat |\n          | json    | json |\n          | jsonv2  | json |\n          | xml     | xml |\n\n    Scenario Outline: Results with extratags\n        When sending v1/reverse with format <format>\n          | lat      | lon     | zoom | extratags |\n          | 47.14052 | 9.52202 | 14   | 1         |\n        Then a HTTP 200 is returned\n        And the result is valid <outformat>\n        And the result contains in field extratags\n          | wikidata |\n          | Q4529531 |\n\n        Examples:\n          | format | outformat |\n          | json   | json |\n          | jsonv2 | json |\n          | xml    | xml |\n\n    Scenario Outline: Reverse with entrances\n        When sending v1/reverse with format <format>\n          | lat               | lon              | entrances | zoom |\n          | 47.24942041089678 | 9.52854573737568 | 1         | 18   |\n        Then a HTTP 200 is returned\n        And the result is valid <outformat>\n        And the result contains array field entrances where element 0 contains\n          | osm_id     | type | lat        | lon       |\n          | 6580031131 | yes  | 47.2489382 | 9.5284033 |\n\n        Examples:\n          | format | outformat |\n          | json   | json |\n          | jsonv2 | json |\n"
  },
  {
    "path": "test/bdd/features/api/reverse/v1_xml.feature",
    "content": "Feature: XML output for Reverse API\n    Testing correctness of xml output (API version v1).\n\n    Scenario Outline: Reverse XML - Simple reverse-geocoding with no results\n        When sending v1/reverse\n          | lat   | lon   |\n          | <lat> | <lon> |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result has no attributes osm_type, address, extratags\n        And the result contains\n          | error |\n          | Unable to geocode |\n\n        Examples:\n         | lat      | lon |\n         | 0.0      | 0.0 |\n         | 91.3     | 0.4    |\n         | -700     | 0.4    |\n         | 0.2      | 324.44 |\n         | 0.2      | -180.4 |\n\n    Scenario Outline: Reverse XML - OSM result with and without addresses\n        When sending v1/reverse with format xml\n          | lat    | lon   | addressdetails |\n          | 47.066 | 9.504 | <has_address>  |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result has attributes place_id\n        And the result has <attributes> address\n        And the result contains\n          | osm_type | osm_id     | place_rank | address_rank |\n          | node     | 6522627624 | 30         | 30           |\n        And the result contains\n          | lon       | lat        | boundingbox |\n          | 9.5036065 | 47.0660892 | 47.0660392,47.0661392,9.5035565,9.5036565 |\n        And the result contains\n          | ref                   | display_name |\n          | Dorfbäckerei Herrmann | Dorfbäckerei Herrmann, 29, Gnetsch, Mäls, Balzers, Oberland, 9496, Liechtenstein |\n\n        Examples:\n          | has_address | attributes     |\n          | 1           | attributes     |\n          | 0           | no attributes |\n\n    Scenario: Reverse XML - Tiger address\n        When sending v1/reverse with format xml\n          | lat           | lon            |\n          | 32.4752389363 | -86.4810198619 |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result contains\n          | osm_type | osm_id    | place_rank  | address_rank |\n          | way      | 396009653 | 30          | 30           |\n        And the result contains\n          | lon         | lat        | boundingbox |\n          | -86.4808553 | 32.4753580 | 32.4753080,32.4754080,-86.4809053,-86.4808053 |\n        And the result contains\n          | display_name |\n          | 707, Upper Kingston Road, Upper Kingston, Prattville, Autauga County, 36067, United States |\n\n    Scenario: Reverse XML - Interpolation address\n        When sending v1/reverse with format xml\n          | lat       | lon        |\n          | 47.118533 | 9.57056562 |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result contains\n          | osm_type | osm_id | place_rank | address_rank |\n          | way      | 1      | 30         | 30           |\n        And the result contains\n          | lon       | lat        | boundingbox |\n          | 9.5705467 | 47.1185454 | 47.1184954,47.1185954,9.5704967,9.5705967 |\n        And the result contains\n          | display_name |\n          | 1019, Grosssteg, Sücka, Triesenberg, Oberland, 9497, Liechtenstein |\n\n    Scenario: Reverse XML - Output of geojson\n        When sending v1/reverse with format xml\n          | lat      | lon     | polygon_geojson |\n          | 47.06597 | 9.50467 | 1               |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result contains\n          | geojson |\n          | {\"type\":\"LineString\",\"coordinates\":[[9.5039353,47.0657546],[9.5040437,47.0657781],[9.5040808,47.065787],[9.5054298,47.0661407]]}  |\n\n    Scenario: Reverse XML - Output of WKT\n        When sending v1/reverse with format xml\n          | lat      | lon     | polygon_text |\n          | 47.06597 | 9.50467 | 1            |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result contains\n          | geotext!wkt |\n          | 9.5039353 47.0657546, 9.5040437 47.0657781, 9.5040808 47.065787, 9.5054298 47.0661407 |\n\n    Scenario: Reverse XML - Output of SVG\n        When sending v1/reverse with format xml\n          | lat      | lon     | polygon_svg |\n          | 47.06597 | 9.50467 | 1           |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result contains\n          | geosvg |\n          | M 9.5039353 -47.0657546 L 9.5040437 -47.0657781 9.5040808 -47.065787 9.5054298 -47.0661407 |\n\n    Scenario: Reverse XML - Output of KML\n       When sending v1/reverse with format xml\n          | lat      | lon     | polygon_kml |\n          | 47.06597 | 9.50467 | 1           |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n       And the result contains\n          | geokml!fm |\n          | <geokml><LineString><coordinates>9.5039\\d*,47.0657\\d* 9.5040\\d*,47.0657\\d* 9.5040\\d*,47.065\\d* 9.5054\\d*,47.0661\\d*</coordinates></LineString></geokml> |\n"
  },
  {
    "path": "test/bdd/features/api/search/language.feature",
    "content": "Feature: Localization of search results\n\n    Scenario: Search - default language\n        When sending v1/search\n          | q |\n          | Liechtenstein |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And result 0 contains\n          | display_name |\n          | Liechtenstein |\n\n    Scenario: Search - accept-language first\n        When sending v1/search\n          | q             | accept-language |\n          | Liechtenstein | zh,de |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And result 0 contains\n          | display_name |\n          | 列支敦士登 |\n\n    Scenario: Search - accept-language missing\n        When sending v1/search\n          | q             | accept-language |\n          | Liechtenstein | xx,fr,en,de |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And result 0 contains\n          | display_name |\n          | Liechtenstein |\n\n    Scenario: Search - http accept language header first\n        Given the HTTP header\n          | accept-language |\n          | fo;q=0.8,en-ca;q=0.5,en;q=0.3 |\n        When sending v1/search\n          | q |\n          | Liechtenstein |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And result 0 contains\n          | display_name |\n          | Liktinstein |\n\n    Scenario: Search - http accept language header and accept-language\n        Given the HTTP header\n          | accept-language |\n          | fr-ca,fr;q=0.8,en-ca;q=0.5,en;q=0.3 |\n        When sending v1/search\n          | q | accept-language |\n          | Liechtenstein | fo,en |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And result 0 contains\n          | display_name |\n          | Liktinstein |\n\n    Scenario: Search - http accept language header fallback\n        Given the HTTP header\n          | accept-language |\n          | fo-ca,en-ca;q=0.5 |\n        When sending v1/search\n          | q |\n          | Liechtenstein |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And result 0 contains\n          | display_name |\n          | Liktinstein |\n\n    Scenario: Search - http accept language header fallback (upper case)\n        Given the HTTP header\n          | accept-language |\n          | fo-FR;q=0.8,en-ca;q=0.5 |\n        When sending v1/search\n          | q |\n          | Liechtenstein |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And result 0 contains\n          | display_name |\n          | Liktinstein |\n"
  },
  {
    "path": "test/bdd/features/api/search/params.feature",
    "content": "Feature: Search queries\n    Testing different queries and parameters\n\n    Scenario: Simple XML search\n        When sending v1/search with format xml\n          | q |\n          | Schaan |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And all results have attributes place_id,osm_type,osm_id\n        And all results have attributes place_rank,boundingbox\n        And all results have attributes lat,lon,display_name\n        And all results have attributes class,type,importance\n        And all results have no attributes address\n        And all results contain\n          | boundingbox!in_box |\n          | 46.5,47.5,9,10 |\n\n    Scenario Outline: Simple JSON search\n        When sending v1/search with format <format>\n          | q |\n          | Vaduz |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And all results have attributes place_id,licence,<cname>,type\n        And all results have attributes osm_type,osm_id,boundingbox\n        And all results have attributes lat,lon,display_name,importance\n        And all results have no attributes address\n        And all results contain\n          | boundingbox!in_box |\n          | 46.5,47.5,9,10 |\n\n        Examples:\n          | format | cname    |\n          | json   | class    |\n          | jsonv2 | category |\n\n    Scenario: Unknown formats returns a user error\n        When sending v1/search with format x45\n          | q |\n          | Vaduz |\n        Then a HTTP 400 is returned\n\n    Scenario Outline: Search with addressdetails\n        When sending v1/search with format <format>\n          | q       | addressdetails |\n          | Triesen | 1 |\n        Then a HTTP 200 is returned\n        And the result is valid <outformat>\n        And result 0 contains in field address\n          | param        | value |\n          | village      | Triesen |\n          | county       | Oberland |\n          | postcode     | 9495 |\n          | country      | Liechtenstein |\n          | country_code | li |\n          | ISO3166-2-lvl8 | LI-09 |\n\n        Examples:\n          | format | outformat |\n          | json   | json |\n          | jsonv2 | json |\n          | geojson | geojson |\n          | xml    | xml |\n\n    Scenario Outline: Search with entrances\n        When sending v1/search with format <format>\n          | q                            | entrances |\n          | Saint Joseph Catholic Church | 1 |\n        Then a HTTP 200 is returned\n        And the result is valid <outformat>\n\n        Examples:\n          | format | outformat |\n          | json   | json |\n          | jsonv2 | json |\n          | geojson | geojson |\n          | xml    | xml |\n\n    Scenario: Coordinate search with addressdetails\n        When geocoding \"47.12400621,9.6047552\"\n          | accept-language |\n          | en |\n        Then all results contain\n          | display_name |\n          | Guschg, Valorschstrasse, Balzers, Oberland, 9497, Liechtenstein |\n\n    Scenario: Address details with unknown class types\n        When geocoding \"Kloster St. Elisabeth\"\n        Then result 0 contains\n          | category | type      | address+amenity |\n          | amenity  | monastery | Kloster St. Elisabeth |\n\n    Scenario: Disabling deduplication\n        When geocoding \"Malbunstr, Schaan\"\n        Then exactly 1 result is returned\n        When geocoding \"Malbunstr, Schaan\"\n          | dedupe |\n          | 0 |\n        Then exactly 4 results are returned\n\n    Scenario: Search with bounded viewbox in right area\n        When geocoding \"post\"\n          | bounded | viewbox |\n          | 1       |  9,47,10,48 |\n        Then result 0 contains\n          | address+town |\n          | Vaduz |\n        When geocoding \"post\"\n          | bounded | viewbox |\n          | 1       |  9.49712,47.17122,9.52605,47.16242 |\n        Then result 0 contains\n          | address+town |\n          | Schaan |\n\n    Scenario: Country search with bounded viewbox remain in the area\n        When geocoding\n          | bounded | viewbox                           | country |\n          | 1       | 9.49712,47.17122,9.52605,47.16242 | de |\n        Then exactly 0 results are returned\n\n    Scenario: Search with bounded viewboxlbrt in right area\n        When geocoding \"bar\"\n          | bounded | viewboxlbrt |\n          | 1       | 9.49712,47.16242,9.52605,47.17122 |\n        Then all results contain\n          | address+town |\n          | Schaan |\n\n    Scenario: No POI search with unbounded viewbox\n        When geocoding \"restaurant\"\n          | viewbox |\n          | 9.93027,53.61634,10.10073,53.54500 |\n        Then all results contain\n          | display_name!fm |\n          | .*[Rr]estaurant.* |\n\n    Scenario: bounded search remains within viewbox, even with no results\n         When geocoding \"[restaurant]\"\n           | bounded | viewbox |\n           | 1       | 43.5403125,-5.6563282,43.54285,-5.662003 |\n        Then exactly 0 results are returned\n\n    Scenario: bounded search remains within viewbox with results\n        When geocoding \"restaurant\"\n         | bounded | viewbox |\n         | 1       | 9.49712,47.17122,9.52605,47.16242 |\n        Then all results contain\n         | boundingbox!in_box |\n         | 47.16242,47.17122,9.49712,9.52605 |\n\n    Scenario: Prefer results within viewbox\n        When geocoding \"Gässle\"\n          | accept-language | viewbox |\n          | en              | 9.52413,47.10759,9.53140,47.10539 |\n        Then result 0 contains\n          | address+village |\n          | Triesen |\n        When geocoding \"Gässle\"\n          | accept-language | viewbox |\n          | en              | 9.45949,47.08421,9.54094,47.05466 |\n        Then result 0 contains\n          | address+town |\n          | Balzers |\n\n    Scenario: viewboxes cannot be points\n        When sending v1/search\n          | q   | viewbox |\n          | foo | 1.01,34.6,1.01,34.6 |\n        Then a HTTP 400 is returned\n\n    Scenario Outline: viewbox must have four coordinate numbers\n        When sending v1/search\n          | q   | viewbox |\n          | foo | <viewbox> |\n        Then a HTTP 400 is returned\n\n    Examples:\n        | viewbox |\n        | 34      |\n        | 0.003,-84.4 |\n        | 5.2,4.5542,12.4 |\n        | 23.1,-6,0.11,44.2,9.1 |\n\n    Scenario Outline: viewboxlbrt must have four coordinate numbers\n        When sending v1/search\n          | q   | viewboxlbrt |\n          | foo | <viewbox> |\n        Then a HTTP 400 is returned\n\n    Examples:\n        | viewbox |\n        | 34      |\n        | 0.003,-84.4 |\n        | 5.2,4.5542,12.4 |\n        | 23.1,-6,0.11,44.2,9.1 |\n\n    Scenario: Overly large limit number for search results\n        When geocoding \"restaurant\"\n          | limit |\n          | 1000 |\n        Then exactly 35 results are returned\n\n    Scenario: Limit number of non-duplicated search results\n        When geocoding \"landstr\"\n          | dedupe |\n          | 0      |\n        Then exactly 10 results are returned\n        When geocoding \"landstr\"\n          | limit | dedupe |\n          | 4     | 0      |\n        Then exactly 4 results are returned\n\n    Scenario: Limit parameter must be a number\n        When sending v1/search\n          | q           | limit |\n          | Blue Laguna | );    |\n        Then a HTTP 400 is returned\n\n    Scenario: Restrict to feature type country\n        When geocoding \"fürstentum\"\n          | featureType |\n          | country |\n        Then all results contain\n          | place_rank |\n          | 4 |\n\n    Scenario: Restrict to feature type state\n        When geocoding \"Wangerberg\"\n        Then more than 0 results are returned\n        When geocoding \"Wangerberg\"\n          | featureType |\n          | state |\n        Then exactly 0 results are returned\n\n    Scenario: Restrict to feature type city\n        When geocoding \"vaduz\"\n          | featureType |\n          | state |\n        Then exactly 0 results are returned\n        When geocoding \"vaduz\"\n          | featureType |\n          | city |\n        Then more than 0 results are returned\n        Then all results contain\n          | place_rank |\n          | 16 |\n\n    Scenario: Restrict to feature type settlement\n        When geocoding \"Malbun\"\n        Then result 1 contains\n          | category |\n          | landuse |\n        When geocoding \"Malbun\"\n          | featureType |\n          | settlement |\n        Then all results contain\n          | category | type |\n          | place    | village |\n\n    Scenario: Exclude a specific place using an OSM ID\n        When geocoding \"Malbun\"\n        Then result 0 contains\n          | category | type |\n          | place | village |\n        When geocoding \"Malbun\"\n          | exclude_place_ids |\n          | N347290636 |\n        Then result 0 contains\n          | category | \n          | landuse | \n\n    Scenario Outline: Search with polygon threshold (json)\n        When sending v1/search with format json\n          | q           | polygon_geojson | polygon_threshold |\n          | Triesenberg | 1               | <th> |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And more than 0 results are returned\n        And all results have attributes geojson\n\n        Examples:\n          | th |\n          | -1 |\n          | 0.0 |\n          | 0.5 |\n          | 999 |\n\n    Scenario Outline: Search with polygon threshold (xml)\n        When sending v1/search with format xml\n          | q           | polygon_geojson | polygon_threshold |\n          | Triesenberg | 1               | <th> |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And more than 0 results are returned\n        And all results have attributes geojson\n\n        Examples:\n          | th |\n          | -1 |\n          | 0.0 |\n          | 0.5 |\n          | 999 |\n\n    Scenario Outline: Search with invalid polygon threshold (xml)\n        When sending v1/search with format xml\n          | q           | polygon_geojson | polygon_threshold |\n          | Triesenberg | 1               | <th> |\n        Then a HTTP 400 is returned\n\n        Examples:\n          | th |\n          | x |\n          | ;; |\n          | 1m |\n\n    Scenario Outline: Search with extratags\n        When sending v1/search with format <format>\n          | q       | extratags |\n          | Landstr | 1 |\n        Then a HTTP 200 is returned\n        And the result is valid <outformat>\n        And more than 0 results are returned\n        Then all results have attributes extratags\n\n        Examples:\n          | format | outformat |\n          | xml    | xml |\n          | json   | json |\n          | jsonv2 | json |\n          | geojson | geojson |\n\n    Scenario Outline: Search boundary=administrative with extratags=1 returns admin_level\n        When sending v1/search with format <format>\n          | q           | featureType | extratags |\n          | Triesenberg | city        | 1         |\n        Then a HTTP 200 is returned\n        And the result is valid <outformat>\n        And more than 0 results are returned\n        And result 0 contains\n          | <cname>  | <tname>        |\n          | boundary | administrative |\n        And result 0 contains in field <ename>\n          | param       | value |\n          | admin_level | 8     |\n\n        Examples:\n          | format      | outformat   | cname    | tname     | ename     |\n          | xml         | xml         | class    | type      | extratags |\n          | json        | json        | class    | type      | extratags |\n          | jsonv2      | json        | category | type      | extratags |\n          | geojson     | geojson     | category | type      | extratags |\n          | geocodejson | geocodejson | osm_key  | osm_value | extra     |\n\n    Scenario Outline: Search with namedetails\n        When sending v1/search with format <format>\n          | q       | namedetails |\n          | Landstr | 1 |\n        Then a HTTP 200 is returned\n        And the result is valid <outformat>\n        And more than 0 results are returned\n        Then all results have attributes namedetails\n\n        Examples:\n          | format | outformat |\n          | xml    | xml |\n          | json   | json |\n          | jsonv2 | json |\n          | geojson | geojson |\n\n    Scenario Outline: Search result with contains formatted geometry\n        When sending v1/search with format <format>\n          | q           | <param> |\n          | Triesenberg | 1 |\n        Then a HTTP 200 is returned\n        And the result is valid <outformat>\n        And more than 0 results are returned\n        And all results have attributes <response_attribute>\n\n        Examples:\n          | format   | outformat | param        | response_attribute |\n          | xml      | xml       | polygon_text | geotext |\n          | json     | json      | polygon_text | geotext |\n          | jsonv2   | json      | polygon_text | geotext |\n          | xml      | xml       |  polygon_svg | geosvg |\n          | json     | json      |  polygon_svg | svg |\n          | jsonv2   | json      |  polygon_svg | svg |\n          | xml      | xml       | polygon_kml  | geokml |\n          | json     | json      | polygon_kml  | geokml |\n          | jsonv2   | json      | polygon_kml  | geokml |\n          | xml      | xml       | polygon_geojson | geojson |\n          | json     | json      | polygon_geojson | geojson |\n          | jsonv2   | json      | polygon_geojson | geojson |\n          | geojson  | geojson   | polygon_geojson | geojson |\n\n    Scenario Outline: Search result in geojson format contains no non-geojson geometry\n        When sending v1/search with format geojson\n          | q           | <param> |\n          | Triesenberg | 1 |\n        Then a HTTP 200 is returned\n        And the result is valid geojson\n        And more than 0 results are returned\n        And all results have no attributes <response_attribute>\n\n        Examples:\n          | param        | response_attribute |\n          | polygon_text | geotext            |\n          | polygon_svg  | svg                |\n          | polygon_kml  | geokml             |\n"
  },
  {
    "path": "test/bdd/features/api/search/postcode.feature",
    "content": "Feature: Searches with postcodes\n    Various searches involving postcodes\n\n    Scenario: US 5+4 ZIP codes are shortened to 5 ZIP codes if not found\n        When geocoding \"36067-1111, us\"\n        Then all results contain in field address\n            | postcode |\n            | 36067    |\n        And all results contain\n            | type     |\n            | postcode |\n\n    Scenario: Postcode search with address\n        When geocoding \"9486, mauren\"\n        Then result 0 contains\n            | type     |\n            | postcode |\n\n    Scenario: Postcode search with country\n        When geocoding \"9486, li\"\n        Then all results contain in field address\n            | country_code |\n            | li           |\n\n    Scenario: Postcode search with country code restriction\n        When geocoding \"9490\"\n            | countrycodes |\n            | li |\n        Then all results contain in field address\n            | country_code |\n            | li           |\n\n    Scenario: Postcode search with bounded viewbox restriction\n        When geocoding \"9486\"\n          | bounded | viewbox |\n          | 1       | 9.55,47.20,9.58,47.22 |\n        Then all results contain in field address\n            | postcode |\n            | 9486     |\n        When geocoding \"9486\"\n          | bounded | viewbox                 |\n          | 1       | 5.00,20.00,6.00,21.00 |\n        Then exactly 0 result is returned\n\n    Scenario: Postcode search with structured query\n        When geocoding \"\"\n            | postalcode | country |\n            | 9490       | li |\n        Then all results contain in field address\n            | country_code | postcode |\n            | li           | 9490     |\n"
  },
  {
    "path": "test/bdd/features/api/search/queries.feature",
    "content": "Feature: Search queries\n    Generic search result correctness\n\n    Scenario: Search for natural object\n        When geocoding \"Samina\"\n          | accept-language |\n          | en |\n        Then result 0 contains\n          | category | type  | display_name    |\n          | waterway | river | Samina, Austria |\n\n    Scenario: House number search for non-street address\n        When geocoding \"6 Silum, Liechtenstein\"\n          | accept-language |\n          | en |\n        Then result 0 contains in field address\n          | param        | value |\n          | house_number | 6 |\n          | village      | Silum |\n          | town         | Triesenberg |\n          | county       | Oberland |\n          | postcode     | 9497 |\n          | country      | Liechtenstein |\n          | country_code | li |\n          | ISO3166-2-lvl8  | LI-10 |\n\n    Scenario: Search for house number interpolation\n        When geocoding \"Grosssteg 1023, Triesenberg\"\n          | accept-language |\n          | de |\n        Then result 0 contains in field address\n          | param         | value |\n          | house_number  | 1023 |\n          | road          | Grosssteg |\n          | village       | Sücka |\n          | postcode      | 9497 |\n          | town          | Triesenberg |\n          | country       | Liechtenstein |\n          | country_code  | li |\n\n    Scenario: With missing housenumber search falls back to road\n        When geocoding \"Bündaweg 555\"\n        Then result 0 contains in field address\n          | param         | value |\n          | road          | Bündaweg |\n          | village       | Silum |\n          | postcode      | 9497 |\n          | county        | Oberland |\n          | town          | Triesenberg |\n          | country       | Liechtenstein |\n          | country_code  | li |\n          | ISO3166-2-lvl8  | LI-10 |\n        And all results have no attributes address+house_number\n\n    Scenario Outline: Housenumber 0 can be found\n        When sending v1/search with format <format>\n          | q              | addressdetails |\n          | Gnalpstrasse 0 | 1 |\n        Then a HTTP 200 is returned\n        And the result is valid <outformat>\n        And all results contain\n          | display_name!fm | address+house_number |\n          | 0,.*            | 0 |\n\n    Examples:\n        | format      | outformat |\n        | xml         | xml       |\n        | json        | json      |\n        | jsonv2      | json      |\n        | geojson     | geojson   |\n\n    Scenario: TIGER house number\n        When geocoding \"697 Upper Kingston Road\"\n        Then all results contain\n         | osm_type | display_name!fm | address+house_number |\n         | way      | 697,.*          | 697 |\n\n    Scenario: Search with class-type feature\n        When geocoding \"bars in ebenholz\"\n        Then all results contain\n          | place_rank |\n          | 30 |\n\n    Scenario: Search with specific amenity\n        When geocoding \"[restaurant] Vaduz\"\n        Then all results contain\n          | category | type       | address+country |\n          | amenity  | restaurant | Liechtenstein |\n\n    Scenario: Search with specific amenity also work in country\n        When geocoding \"restaurants in liechtenstein\"\n        Then all results contain\n          | category | type       | address+country |\n          | amenity  | restaurant | Liechtenstein |\n\n    Scenario: Search with key-value amenity\n        When geocoding \"[club=scout] Vaduz\"\n        Then all results contain\n          | category | type |\n          | club     | scout |\n\n    Scenario: POI search near given coordinate\n        When geocoding \"restaurant near 47.16712,9.51100\"\n        Then all results contain\n          | category | type |\n          | amenity  | restaurant |\n\n    Scenario: Arbitrary key/value search near given coordinate\n        When geocoding \"[leisure=firepit]   47.150° N 9.5340493° E\"\n        Then all results contain\n          | category | type |\n          | leisure  | firepit |\n\n    Scenario: POI search in a bounded viewbox\n        When geocoding \"restaurants\"\n          | viewbox                           | bounded |\n          | 9.50830,47.15253,9.52043,47.14866 | 1 |\n        Then all results contain\n          | category | type       |\n          | amenity  | restaurant |\n\n    Scenario Outline: Key/value search near given coordinate can be restricted to country\n        When geocoding \"[natural=peak] 47.06512,9.53965\"\n          | countrycodes |\n          | <cc> |\n        Then all results contain\n          | address+country_code |\n          | <cc> |\n\n        Examples:\n            | cc |\n            | li |\n            | ch |\n\n    Scenario: Name search near given coordinate\n        When geocoding \"sporry\"\n        Then result 0 contains\n          | address+town |\n          | Vaduz |\n        When geocoding \"sporry, 47.10791,9.52676\"\n        Then result 0 contains\n          | address+village |\n          | Triesen |\n\n    Scenario: Name search near given coordinate without result\n        When geocoding \"sporry, N 47 15 7 W 9 61 26\"\n        Then exactly 0 results are returned\n\n    Scenario: Arbitrary key/value search near a road\n        When geocoding \"[amenity=drinking_water] Wissfläckaweg\"\n        Then all results contain\n          | category | type |\n          | amenity  | drinking_water |\n\n    Scenario: Ignore other country codes in structured search with country\n        When geocoding\n            | countrycodes | country |\n            | li           | de      |\n        Then exactly 0 results are returned\n\n    Scenario: Ignore country searches when query is restricted to countries\n        When geocoding \"fr\"\n        Then all results contain\n            | name |\n            | France |\n        When geocoding \"fr\"\n            | countrycodes |\n            | li  |\n        Then exactly 0 results are returned\n\n    Scenario: Country searches only return results for the given country\n        When geocoding \"Ans Trail\"\n            | countrycodes |\n            | li |\n        Then all results contain\n            | address+country_code |\n            | li |\n\n    # https://trac.openstreetmap.org/ticket/5094\n    Scenario: housenumbers are ordered by complete match first\n        When geocoding \"Austrasse 11, Vaduz\"\n        Then result 0 contains\n          | address+house_number |\n          | 11 |\n\n    Scenario Outline: Coordinate searches with white spaces\n        When geocoding \"<data>\"\n        Then the result set contains exactly\n          | category |\n          | water    |\n\n        Examples:\n          | data |\n          | sporry weiher, N 47.10791° E 9.52676° |\n          | sporry weiher,\tN 47.10791° E 9.52676° |\n          | \tsporry weiher\t, \tN 47.10791° E 9.52676° |\n          | sporry weiher, N 47.10791° \t\tE 9.52676° |\n          | sporry weiher\u000b, N 47.10791° E\t9.52676° |\n\n    Scenario: Searches with white spaces\n        When geocoding \"52\tBodastr\u000b,\fTriesenberg\"\n        Then all results contain\n          | category | type |\n          | highway  | residential |\n\n\n    # github #1949\n    Scenario: Addressdetails always return the place type\n       When geocoding \"Vaduz\"\n       Then result 0 contains\n         | address+town |\n         | Vaduz |\n"
  },
  {
    "path": "test/bdd/features/api/search/simple.feature",
    "content": "Feature: Simple Tests\n    Simple tests for internal server errors and response format.\n\n    Scenario Outline: Garbage Searches\n        When sending v1/search\n          | q |\n          | <query> |\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And exactly 0 results are returned\n\n    Examples:\n     | query |\n     | New York, New York |\n     | 12, Main Street, Houston |\n     | München |\n     | 東京都 |\n     | hotels in sdfewf |\n     | xywxkrf |\n     | gh; foo() |\n     | %#$@*&l;der#$! |\n     | 234.23.14.5 |\n     | aussenstelle universitat lichtenstein wachterhaus aussenstelle universitat lichtenstein wachterhaus aussenstelle universitat lichtenstein wachterhaus aussenstelle universitat lichtenstein wachterhaus |\n     | . |\n\n    Scenario: Empty XML search\n        When sending v1/search with format xml\n          | q        |\n          | xnznxvcx |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        Then the result metadata contains\n          | param       | value |\n          | querystring | xnznxvcx |\n          | more_url!fm | .*q=xnznxvcx.*format=xml |\n\n    Scenario: Empty XML search with special XML characters\n        When sending v1/search with format xml\n          | q |\n          | xfdghn&zxn\"xvbyx<vxx>cssdex |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        Then the result metadata contains\n          | param       | value |\n          | querystring | xfdghn&zxn\"xvbyx<vxx>cssdex |\n          | more_url!fm | .*q=xfdghn%26zxn%22xvbyx%3Cvxx%3Ecssdex.*format=xml |\n\n    Scenario: Empty XML search with viewbox\n        When sending v1/search with format xml\n          | q        | viewbox |\n          | xnznxvcx | 12,33,77,45.13 |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result metadata contains\n          | param        | value |\n          | querystring | xnznxvcx |\n          | viewbox     | 12,33,77,45.13 |\n\n    Scenario: Empty XML search with viewboxlbrt\n        When sending v1/search with format xml\n          | q        | viewboxlbrt |\n          | xnznxvcx | 12,34.13,77,45 |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result metadata contains\n          | param       | value |\n          | querystring | xnznxvcx |\n          | viewbox     | 12,34.13,77,45 |\n\n    Scenario: Empty XML search with viewboxlbrt and viewbox\n        When sending v1/search with format xml\n          | q   | viewbox        | viewboxblrt |\n          | pub | 12,33,77,45.13 | 1,2,3,4 |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result metadata contains\n          | param       | value |\n          | querystring | pub |\n          | viewbox     | 12,33,77,45.13 |\n\n    Scenario: Empty XML search with excluded place ids\n        When sending v1/search with format xml\n          | q              | exclude_place_ids |\n          | jghrleoxsbwjer | 123,n456,W789 |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result metadata contains\n          | param             | value |\n          | exclude_place_ids | 123,N456,W789 |\n\n    Scenario: Empty XML search with bad excluded place ids\n        When sending v1/search with format xml\n          | q              | exclude_place_ids |\n          | jghrleoxsbwjer | , |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result metadata has no attributes exclude_place_ids\n\n    Scenario: Search with invalid excluded place ids\n        When sending v1/search with format json\n          | q     | exclude_place_ids |\n          | Tokyo | <ids> |\n        Then a HTTP 400 is returned\n        And the result is valid json\n        And the result contains\n          | error+code | error+message |\n          | 400        | Invalid exclude ID: <bad_id> |\n\n        Examples:\n          | ids | bad_id |\n          | abc | abc |\n          | X123 | X123 |\n          | N:100 | N:100 |\n          | -123 | -123 |\n          | 123,abc,456 | abc |\n\n    Scenario Outline: Wrapping of illegal jsonp search requests\n        When sending v1/search with format json\n          | q     | json_callback |\n          | Tokyo | <data> |\n        Then a HTTP 400 is returned\n        And the result is valid json\n        And the result contains\n          | error+code | error+message |\n          | 400        | Invalid json_callback value |\n\n        Examples:\n          | data |\n          | 1asd |\n          | bar(foo) |\n          | XXX['bad'] |\n          | foo; evil |\n          | 234 |\n\n    Scenario: Ignore jsonp parameter for anything but json\n        When sending v1/search with format xml\n          | q     | json_callback |\n          | Tokyo | 234 |\n        Then a HTTP 200 is returned\n        Then the result is valid xml\n\n    Scenario Outline: Empty search for json like\n        When sending v1/search with format <format>\n          | q |\n          | YHlERzzx |\n        Then a HTTP 200 is returned\n        And the result is valid <outformat>\n        And exactly 0 results are returned\n\n        Examples:\n          | format | outformat |\n          | json   | json |\n          | jsonv2 | json |\n          | geojson | geojson |\n          | geocodejson | geocodejson |\n\n    Scenario: Search for non-existing coordinates\n        When geocoding \"-21.0,-33.0\"\n        Then exactly 0 results are returned\n\n    Scenario: Country code selection is retained in more URL (#596)\n        When sending v1/search with format xml\n          | q     | countrycodes |\n          | Vaduz | pl,1,,invalid,undefined,%3Cb%3E,bo,, |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result metadata contains\n          | more_url!fm |\n          | .*&countrycodes=pl%2Cbo&.* |\n\n    Scenario Outline: Search debug output does not return errors\n        When sending v1/search\n          | q       | debug |\n          | <query> | 1     |\n        Then a HTTP 200 is returned\n        And the result is valid html\n\n        Examples:\n          | query |\n          | Liechtenstein |\n          | Triesen |\n          | Pfarrkirche |\n          | Landstr 27 Steinort, Triesenberg, 9495 |\n          | 9497 |\n          | restaurant in triesen |\n"
  },
  {
    "path": "test/bdd/features/api/search/structured.feature",
    "content": "Feature: Structured search queries\n    Testing correctness of results with\n    structured queries\n\n    Scenario: Structured search for country only\n        When geocoding\n          | country |\n          | Liechtenstein |\n        Then all results contain in field address\n          | country_code | country       |\n          | li           | Liechtenstein |\n\n    Scenario: Structured search for postcode only\n        When geocoding\n          | postalcode |\n          | 9495 |\n        Then all results contain\n          | type!fm         | address+postcode |\n          | ^post(al_)?code | 9495             |\n\n    Scenario: Structured search for street, postcode and country\n        When sending v1/search with format xml\n          | street          | postalcode | country        |\n          | Old Palace Road | GU2 7UP    | United Kingdom |\n        Then a HTTP 200 is returned\n        And the result is valid xml\n        And the result metadata contains\n          | querystring |\n          | Old Palace Road, GU2 7UP, United Kingdom |\n\n    Scenario: Structured search for street with housenumber, city and postcode\n        When geocoding\n          | street             | city  | postalcode |\n          | 19 Am schrägen Weg | Vaduz | 9490       |\n        Then all results contain in field address\n          | house_number | road |\n          | 19           | Am Schrägen Weg |\n\n    Scenario: Structured search for street with housenumber, city and bad postcode\n        When geocoding\n          | street             | city  | postalcode |\n          | 19 Am schrägen Weg | Vaduz | 9491       |\n        Then all results contain in field address\n          | house_number | road |\n          | 19           | Am Schrägen Weg |\n\n    Scenario: Structured search for amenity, city\n        When geocoding\n          | city  | amenity |\n          | Vaduz | bar  |\n        Then all results contain\n          | address+country | category | type!fm |\n          | Liechtenstein   | amenity  | (pub)\\|(bar)\\|(restaurant) |\n\n    #176\n    Scenario: Structured search restricts rank\n        When geocoding\n          | city |\n          | Steg |\n        Then all results contain\n          | addresstype |\n          | village |\n\n    #3651\n    Scenario: Structured search with surrounding extra characters\n        When geocoding\n          | street               | city  | postalcode |\n          | \"19 Am schrägen Weg\" | \"Vaduz\" | \"9491\"  |\n        Then all results contain in field address\n          | house_number | road |\n          | 19           | Am Schrägen Weg |\n\n"
  },
  {
    "path": "test/bdd/features/api/search/v1_geocodejson.feature",
    "content": "Feature: Search API geocodejson output\n    Testing correctness of geocodejson output.\n\n    Scenario: Search geocodejson - City housenumber-level address with street\n        When sending v1/search with format geocodejson\n          | q                    | addressdetails |\n          | Im Winkel 8, Triesen | 1 |\n        Then a HTTP 200 is returned\n        And the result is valid geocodejson\n        And all results contain\n          | housenumber | street    | postcode | city    | country |\n          | 8           | Im Winkel | 9495     | Triesen | Liechtenstein |\n\n    Scenario: Search geocodejson - Town street-level address with street\n        When sending v1/search with format geocodejson\n          | q                | addressdetails |\n          | Gnetsch, Balzers | 1 |\n        Then a HTTP 200 is returned\n        And the result is valid geocodejson\n        And all results contain\n          | name    | city    | postcode | country |\n          | Gnetsch | Balzers | 9496     | Liechtenstein |\n\n    Scenario: Search geocodejson - Town street-level address with footway\n        When sending v1/search with format geocodejson\n          | q                     | addressdetails |\n          | 6000 jahre geschichte | 1 |\n        Then a HTTP 200 is returned\n        And the result is valid geocodejson\n        And all results contain\n          | street  | city    | postcode | country |\n          | Burgweg | Balzers | 9496     | Liechtenstein |\n\n    Scenario: Search geocodejson - City address with suburb\n        When sending v1/search with format geocodejson\n          | q                           | addressdetails |\n          | Lochgass 5, Ebenholz, Vaduz | 1 |\n        Then a HTTP 200 is returned\n        And the result is valid geocodejson\n        And all results contain\n          | housenumber | street   | district | city  | postcode | country |\n          | 5           | Lochgass | Ebenholz | Vaduz | 9490     | Liechtenstein |\n"
  },
  {
    "path": "test/bdd/features/api/status/failures.feature",
    "content": "Feature: Status queries against unknown database\n    Testing status query\n\n    Background:\n        Given an unknown database\n\n    Scenario: Failed status as text\n        When sending v1/status\n        Then a HTTP 500 is returned\n        And the page content equals \"ERROR: Database connection failed\"\n\n    Scenario: Failed status as json\n        When sending v1/status with format json\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | status!:d | message |\n          | 700       | Database connection failed |\n        And the result has no attributes data_updated\n"
  },
  {
    "path": "test/bdd/features/api/status/simple.feature",
    "content": "Feature: Status queries\n    Testing status query\n\n    Scenario: Status as text\n        When sending v1/status\n        Then a HTTP 200 is returned\n        And the page content equals \"OK\"\n\n    Scenario: Status as json\n        When sending v1/status with format json\n        Then a HTTP 200 is returned\n        And the result is valid json\n        And the result contains\n          | status!:d | message | data_updated!fm |\n          | 0         | OK      | ....-..-..T..:..:...00:00 |\n"
  },
  {
    "path": "test/bdd/features/db/import/addressing.feature",
    "content": "Feature: Address computation\n    Tests for filling of place_addressline\n\n    Scenario: place nodes are added to the address when they are close enough\n        Given the 0.002 grid\n            | 2 |  |  |  |  |  | 1 |  | 3 |\n        And the places\n            | osm | class | type     | name      | geometry |\n            | N1  | place | square   | Square    | 1 |\n            | N2  | place | hamlet   | West Farm | 2 |\n            | N3  | place | hamlet   | East Farm | 3 |\n        When importing\n        Then place_addressline contains exactly\n            | object | address | fromarea |\n            | N1     | N3      | False |\n        When geocoding \"Square\"\n        Then the result set contains\n           | object | display_name      |\n           | N1     | Square, East Farm |\n\n    Scenario: given two place nodes, the closer one wins for the address\n        Given the grid\n            | 2 |  |  | 1 |  | 3 |\n        And the named places\n            | osm | class | type     | geometry |\n            | N1  | place | square   | 1 |\n            | N2  | place | hamlet   | 2 |\n            | N3  | place | hamlet   | 3 |\n        When importing\n        Then place_addressline contains\n            | object | address | fromarea | isaddress |\n            | N1     | N3      | False    | True |\n            | N1     | N2      | False    | False |\n\n    Scenario: boundaries around the place are added to the address\n        Given the grid\n            | 1 |    | 4 | | 7 | 10 |\n            | 2 |    | 5 | | 8 | 11 |\n            |   |    |   | |   |    |\n            |   |    |   | |   |    |\n            |   |    | 6 | | 9 |    |\n            |   | 99 |   | |   |    |\n            | 3 |    |   | |   | 12 |\n        And the named places\n            | osm | class    | type           | admin | geometry |\n            | R1  | boundary | administrative | 3     | (1,2,3,12,11,10,7,8,9,6,5,4,1) |\n            | R2  | boundary | administrative | 4     | (2,3,12,11,8,9,6,5,2) |\n            | N1  | place    | square         | 15    | 99 |\n        When importing\n        Then place_addressline contains\n            | object | address | isaddress |\n            | N1     | R1      | True |\n            | N1     | R2      | True |\n\n    Scenario: with boundaries of same rank the one with the closer centroid is preferred\n        Given the grid\n            | 1 |   |   | 3 |  | 5 |\n            |   | 9 |   |   |  |   |\n            | 2 |   |   | 4 |  | 6 |\n        And the named places\n            | osm | class    | type           | admin | geometry |\n            | R1  | boundary | administrative | 8     | (1,2,4,3,1) |\n            | R2  | boundary | administrative | 8     | (1,2,6,5,1) |\n            | N1  | place    | square         | 15    | 9 |\n        When importing\n        Then place_addressline contains\n            | object | address | isaddress |\n            | N1     | R1      | True |\n            | N1     | R2      | False |\n\n    Scenario: boundary areas are preferred over place nodes in the address\n        Given the grid\n            | 1 |   |   |   | 10 |   | 3 |\n            |   | 5 |   |   |    |   |   |\n            |   | 6 |   |   |    |   |   |\n            | 2 |   |   |   | 11 |   | 4 |\n        And the named places\n            | osm | class    | type           | admin | geometry |\n            | N1  | place    | square         | 15    | 5 |\n            | N2  | place    | city           | 15    | 6 |\n            | R1  | place    | city           | 8     | (1,2,4,3,1) |\n            | R2  | boundary | administrative | 9     | (1,10,11,2,1) |\n        When importing\n        Then place_addressline contains\n            | object | address | isaddress | cached_rank_address |\n            | N1     | R1      | True      | 16                  |\n            | N1     | R2      | True      | 18                  |\n            | N1     | N2      | False     | 18                  |\n\n    Scenario: place nodes outside a smaller ranked area are ignored\n        Given the grid\n            | 1 |   | 2 |   |\n            |   | 7 |   | 9 |\n            | 4 |   | 3 |   |\n        And the named places\n            | osm | class    | type    | admin | geometry |\n            | N1  | place    | square  | 15    | 7 |\n            | N2  | place    | city    | 15    | 9 |\n            | R1  | place    | city    | 8     | (1,2,3,4,1) |\n        When importing\n        Then place_addressline contains exactly\n            | object | address | isaddress | cached_rank_address |\n            | N1     | R1      | True      | 16                  |\n\n\n    Scenario: place nodes close enough to smaller ranked place nodes are included\n        Given the 0.002 grid\n            | 2 |   | 3 | 1 |\n        And the named places\n            | osm | class | type     | geometry |\n            | N1  | place | square   | 1 |\n            | N2  | place | hamlet   | 2 |\n            | N3  | place | quarter  | 3 |\n        When importing\n        Then place_addressline contains\n            | object | address | fromarea | isaddress |\n            | N1     | N2      | False    | True      |\n            | N1     | N3      | False    | True      |\n\n\n    Scenario: place nodes too far away from a smaller ranked place nodes are marked non-address\n        Given the 0.002 grid\n            | 2 |  |  | 1 |  | 3 |\n        And the named places\n            | osm | class | type     | geometry |\n            | N1  | place | square   | 1 |\n            | N2  | place | hamlet   | 2 |\n            | N3  | place | quarter  | 3 |\n        When importing\n        Then place_addressline contains\n            | object | address | fromarea | isaddress |\n            | N1     | N2      | False    | True      |\n            | N1     | N3      | False    | False     |\n\n\n    # github #121\n    Scenario: Roads crossing boundaries should contain both states\n        Given the grid\n            | 1 |   |   | 2 |   | 3 |\n            |   | 7 |   |   | 8 |   |\n            | 4 |   |   | 5 |   | 6 |\n        And the named places\n            | osm | class   | type | geometry |\n            | W1  | highway | road | 7, 8     |\n        And the named places\n            | osm | class    | type           | admin | geometry      |\n            | W10 | boundary | administrative | 5     | (1, 2, 5, 4, 1) |\n            | W11 | boundary | administrative | 5     | (2, 3, 6, 5, 2) |\n        When importing\n        Then place_addressline contains\n            | object | address | cached_rank_address |\n            | W1     | W10     | 10                  |\n            | W1     | W11     | 10                  |\n\n\n    Scenario: Roads following a boundary should contain both states\n        Given the grid\n            | 1 |   |   | 2 |   | 3 |\n            |   |   | 8 | 7 |   |   |\n            | 4 |   |   | 5 |   | 6 |\n        And the named places\n            | osm | class   | type | geometry |\n            | W1  | highway | road | 2, 7, 8  |\n        And the named places\n            | osm | class    | type           | admin | geometry      |\n            | W10 | boundary | administrative | 5     | (1, 2, 5, 4, 1) |\n            | W11 | boundary | administrative | 5     | (2, 3, 6, 5, 2) |\n        When importing\n        Then place_addressline contains\n            | object | address | cached_rank_address |\n            | W1     | W10     | 10                  |\n            | W1     | W11     | 10                  |\n\n    Scenario: Roads should not contain boundaries they touch in a end point\n        Given the grid\n            | 1 |   |   | 2 |   | 3 |\n            |   | 7 |   | 8 |   |   |\n            | 4 |   |   | 5 |   | 6 |\n        And the named places\n            | osm | class   | type | geometry |\n            | W1  | highway | road | 7, 8     |\n        And the named places\n            | osm | class    | type           | admin | geometry      |\n            | W10 | boundary | administrative | 5     | (1, 2, 8, 5, 4, 1) |\n            | W11 | boundary | administrative | 5     | (2, 3, 6, 5, 8, 2) |\n        When importing\n        Then place_addressline contains exactly\n            | object | address | cached_rank_address |\n            | W1     | W10     | 10                  |\n\n    Scenario: Roads should not contain boundaries they touch in a middle point\n        Given the grid\n            | 1 |   |   | 2 |   | 3 |\n            |   | 7 |   | 8 |   |   |\n            | 4 |   | 9 | 5 |   | 6 |\n        And the named places\n            | osm | class   | type | geometry |\n            | W1  | highway | road | 7, 8, 9     |\n        And the named places\n            | osm | class    | type           | admin | geometry      |\n            | W10 | boundary | administrative | 5     | (1, 2, 8, 5, 4, 1) |\n            | W11 | boundary | administrative | 5     | (2, 3, 6, 5, 8, 2) |\n        When importing\n        Then place_addressline contains exactly\n            | object | address | cached_rank_address |\n            | W1     | W10     | 10                  |\n\n    Scenario: Locality points should contain all boundaries they touch\n        Given the 0.001 grid\n            | 1 |   |   | 2 |   | 3 |\n            |   |   |   | 8 |   |   |\n            | 4 |   |   | 5 |   | 6 |\n        And the named places\n            | osm | class | type     | geometry |\n            | N1  | place | locality | 8        |\n        And the named places\n            | osm | class    | type           | admin | geometry      |\n            | W10 | boundary | administrative | 5     | (1, 2, 8, 5, 4, 1) |\n            | W11 | boundary | administrative | 5     | (2, 3, 6, 5, 8, 2) |\n        When importing\n        Then place_addressline contains\n            | object | address | cached_rank_address |\n            | N1     | W10     | 10                  |\n            | N1     | W11     | 10                  |\n\n    Scenario: Areas should not contain boundaries they touch\n        Given the grid\n            | 1 |   |   | 2 |   | 3 |\n            |   |   |   |   |   |   |\n            | 4 |   |   | 5 |   | 6 |\n        And the named places\n            | osm | class    | type           | geometry      |\n            | W1  | landuse  | industrial     | (1, 2, 5, 4, 1) |\n        And the named places\n            | osm | class    | type           | admin | geometry      |\n            | W10 | boundary | administrative | 5     | (2, 3, 6, 5, 2) |\n        When importing\n        Then place_addressline contains exactly\n            | object | address |\n\n    Scenario: buildings with only addr:postcodes do not appear in the address of a way\n        Given the grid with origin DE\n            | 1 |   |   |   |   | 8 |   | 6 |   | 2 |\n            |   |   |   |   |   |   |   |   |   |   |\n            |   |13 |   |   |   |   |   |   |   |   |\n            | 20|   |   | 21|   |   |   |   |   |   |\n            |   |   |   |   |   |   |   |   |   |   |\n            |   |   |   |   |   | 9 |   |   |   |   |\n            | 4 |   |   |   |   |   |   | 7 |   | 3 |\n        And the named places\n            | osm | class    | type           | admin | addr+postcode | geometry   |\n            | R1  | boundary | administrative | 6     | 10000         | (1,2,3,4,1)|\n            | R34 | boundary | administrative | 8     | 11200         | (1,6,7,4,1)|\n            | R4  | boundary | administrative | 10    | 11230         | (1,8,9,4,1)|\n        And the named places\n            | osm | class    | type           | geometry |\n            | W93 | highway  | residential    | 20,21    |\n        And the postcodes\n            | osm |  postcode | centroid |\n            | W22 |  11234    | 13 |\n        When importing\n        Then place_addressline contains exactly\n            | object | address  |\n            | R4     | R1       |\n            | R4     | R34      |\n            | R34    | R1       |\n            | W93    | R1       |\n            | W93    | R34      |\n            | W93    | R4       |\n\n    Scenario: squares do not appear in the address of a street\n        Given the grid\n            |   | 1 |   | 2 |   |\n            | 8 |   |   |   | 9 |\n            |   | 4 |   | 3 |   |\n        And the named places\n            | osm | class    | type           | geometry |\n            | W1  | highway  | residential    | 8, 9     |\n            | W2  | place    | square         | (1, 2, 3 ,4, 1) |\n        When importing\n        Then place_addressline contains exactly\n            | object | address |\n\n    Scenario: addr:* tags are honored even when a street is far away from the place\n        Given the grid\n            | 1 |   | 2 |   |   | 5 |\n            |   |   |   | 8 | 9 |   |\n            | 4 |   | 3 |   |   | 6 |\n        And the places\n            | osm | class    | type           | admin | name  | geometry    |\n            | R1  | boundary | administrative | 8     | Left  | (1,2,3,4,1) |\n            | R2  | boundary | administrative | 8     | Right | (2,3,6,5,2) |\n        And the places\n            | osm | class   | type    | addr+city | geometry |\n            | W1  | highway | primary | Left      | 8,9      |\n            | W2  | highway | primary | Right     | 8,9      |\n        When importing\n        Then place_addressline contains exactly\n           | object | address | isaddress |\n           | W1     | R1      | True      |\n           | W1     | R2      | False     |\n           | W2     | R2      | True      |\n\n\n    Scenario: addr:* tags are honored even when a POI is far away from the place\n        Given the grid\n            | 1 |   | 2 |   |   | 5 |\n            |   |   |   | 8 | 9 |   |\n            | 4 |   | 3 |   |   | 6 |\n        And the places\n            | osm | class    | type           | admin | name  | geometry    |\n            | R1  | boundary | administrative | 8     | Left  | (1,2,3,4,1) |\n            | R2  | boundary | administrative | 8     | Right | (2,3,6,5,2) |\n        And the places\n            | osm | class   | type    | name      | addr+city | geometry |\n            | W1  | highway | primary | Wonderway | Right     | 8,9      |\n            | N1  | amenity | cafe    | Bolder    | Left      | 9        |\n        When importing\n        Then place_addressline contains exactly\n           | object | address | isaddress |\n           | W1     | R2      | True      |\n           | N1     | R1      | True      |\n        When geocoding \"Bolder\"\n        Then the result set contains\n           | object | display_name            |\n           | N1     | Bolder, Wonderway, Left |\n\n    Scenario: addr:* tags do not produce addresslines when the parent has the address part\n        Given the grid\n            | 1 |   |   | 5 |\n            |   | 8 | 9 |   |\n            | 4 |   |   | 6 |\n        And the places\n            | osm | class    | type           | admin | name  | geometry    |\n            | R1  | boundary | administrative | 8     | Outer | (1,5,6,4,1) |\n        And the places\n            | osm | class   | type    | name      | addr+city | geometry |\n            | W1  | highway | primary | Wonderway | Outer     | 8,9      |\n            | N1  | amenity | cafe    | Bolder    | Outer     | 9        |\n        When importing\n        Then place_addressline contains exactly\n           | object | address | isaddress |\n           | W1     | R1      | True      |\n        When geocoding \"Bolder\"\n        Then the result set contains\n           | object | display_name             |\n           | N1     | Bolder, Wonderway, Outer |\n\n    Scenario: addr:* tags on outside do not produce addresslines when the parent has the address part\n        Given the grid\n            | 1 |   | 2 |   |   | 5 |\n            |   |   |   | 8 | 9 |   |\n            | 4 |   | 3 |   |   | 6 |\n        And the places\n            | osm | class    | type           | admin | name  | geometry    |\n            | R1  | boundary | administrative | 8     | Left  | (1,2,3,4,1) |\n            | R2  | boundary | administrative | 8     | Right | (2,3,6,5,2) |\n        And the places\n            | osm | class   | type    | name      | addr+city | geometry |\n            | W1  | highway | primary | Wonderway | Left      | 8,9      |\n            | N1  | amenity | cafe    | Bolder    | Left      | 9        |\n        When importing\n        Then place_addressline contains exactly\n           | object | address | isaddress |\n           | W1     | R1      | True      |\n           | W1     | R2      | False     |\n        When geocoding \"Bolder\"\n        Then the result set contains\n           | object | display_name            |\n           | N1     | Bolder, Wonderway, Left |\n\n    Scenario: POIs can correct address parts on the fly\n        Given the grid\n            | 1 |   |   |   |  2 |   | 5 |\n            |   |   |   | 9 |    | 8 |   |\n            | 4 |   |   |   |  3 |   | 6 |\n        And the places\n            | osm | class    | type           | admin | name  | geometry    |\n            | R1  | boundary | administrative | 8     | Left  | (1,2,3,4,1) |\n            | R2  | boundary | administrative | 8     | Right | (2,3,6,5,2) |\n        And the places\n            | osm | class   | type    | name      | geometry |\n            | W1  | highway | primary | Wonderway | 2,3      |\n            | N1  | amenity | cafe    | Bolder    | 9        |\n            | N2  | amenity | cafe    | Leftside  | 8        |\n        When importing\n        Then place_addressline contains exactly\n           | object | address | isaddress |\n           | W1     | R1      | False     |\n           | W1     | R2      | True      |\n        When geocoding \"Bolder\"\n        Then the result set contains\n           | object | display_name            |\n           | N1     | Bolder, Wonderway, Left |\n        When geocoding \"Leftside\"\n        Then the result set contains\n           | object | display_name               |\n           | N2     | Leftside, Wonderway, Right |\n\n\n    Scenario: POIs can correct address parts on the fly (with partial unmatching address)\n        Given the grid\n            | 1 |   |   |   |  2 |   | 5 |\n            |   |   |   | 9 |    | 8 |   |\n            |   | 10| 11|   |    | 12|   |\n            | 4 |   |   |   |  3 |   | 6 |\n        And the places\n            | osm | class    | type           | admin | name  | geometry    |\n            | R1  | boundary | administrative | 8     | Left  | (1,2,3,4,1) |\n            | R2  | boundary | administrative | 8     | Right | (2,3,6,5,2) |\n        And the places\n            | osm | class   | type    | name      | geometry |\n            | W1  | highway | primary | Wonderway | 10,11,12 |\n        And the places\n            | osm | class   | type    | name      | addr+suburb | geometry |\n            | N1  | amenity | cafe    | Bolder    | Boring      | 9        |\n            | N2  | amenity | cafe    | Leftside  | Boring      | 8        |\n        When importing\n        Then place_addressline contains exactly\n           | object | address | isaddress |\n           | W1     | R1      | True      |\n           | W1     | R2      | False     |\n        When geocoding \"Bolder\"\n        Then the result set contains\n           | object | display_name            |\n           | N1     | Bolder, Wonderway, Left |\n        When geocoding \"Leftside\"\n        Then the result set contains\n           | object | display_name               |\n           | N2     | Leftside, Wonderway, Right |\n\n\n\n    Scenario: POIs can correct address parts on the fly (with partial matching address)\n        Given the grid\n            | 1 |   |   |   |  2 |   | 5 |\n            |   |   |   | 9 |    | 8 |   |\n            |   | 10| 11|   |    | 12|   |\n            | 4 |   |   |   |  3 |   | 6 |\n        And the places\n            | osm | class    | type           | admin | name  | geometry    |\n            | R1  | boundary | administrative | 8     | Left  | (1,2,3,4,1) |\n            | R2  | boundary | administrative | 8     | Right | (2,3,6,5,2) |\n        And the places\n            | osm | class   | type    | name      | geometry |\n            | W1  | highway | primary | Wonderway | 10,11,12 |\n        And the places\n            | osm | class   | type    | name      | addr+state | geometry |\n            | N1  | amenity | cafe    | Bolder    | Left       | 9        |\n            | N2  | amenity | cafe    | Leftside  | Left       | 8        |\n        When importing\n        Then place_addressline contains exactly\n           | object | address | isaddress |\n           | W1     | R1      | True      |\n           | W1     | R2      | False     |\n        When geocoding \"Bolder\"\n        Then the result set contains\n           | object | display_name            |\n           | N1     | Bolder, Wonderway, Left |\n        When geocoding \"Leftside\"\n        Then the result set contains\n           | object | display_name               |\n           | N2     | Leftside, Wonderway, Left |\n\n\n    Scenario: addr:* tags always match the closer area\n        Given the grid\n            | 1 |   |   |   |  2 |   | 5 |\n            |   |   |   |   |    |   |   |\n            | 4 |   |   |   |  3 |   | 6 |\n            |   | 10| 11|   |    |   |   |\n        And the places\n            | osm | class    | type           | admin | name  | geometry    |\n            | R1  | boundary | administrative | 8     | Left  | (1,2,3,4,1) |\n            | R2  | boundary | administrative | 8     | Left  | (2,3,6,5,2) |\n        And the places\n            | osm | class   | type    | name      | addr+city | geometry |\n            | W1  | highway | primary | Wonderway | Left      | 10,11    |\n        When importing\n        Then place_addressline contains exactly\n            | object | address |\n            | W1     | R1      |\n\n    Scenario: Full name is prefered for unlisted addr:place tags\n        Given the grid\n            |   | 1 | 2 |   |\n            | 8 |   |   | 9 |\n        And the places\n            | osm | class | type | name    | geometry |\n            | W10 | place | city | Away    | (8,1,2,9,8) |\n        And the places\n            | osm | class   | type        | name          | addr+city | geometry |\n            | W1  | highway | residential | Royal Terrace | Gardens   | 8,9      |\n        And the places\n            | osm | class | type  | housenr | addr+place            | geometry | extra+foo |\n            | N1  | place | house | 1       | Royal Terrace Gardens | 1        | bar |\n        And the places\n            | osm | class | type  | housenr | addr+street   | geometry |\n            | N2  | place | house | 2       | Royal Terrace | 2        |\n        When importing\n        When geocoding \"1, Royal Terrace Gardens\"\n        Then result 0 contains\n            | object |\n            | N1  |\n"
  },
  {
    "path": "test/bdd/features/db/import/country.feature",
    "content": "Feature: Country handling\n    Tests for import and use of country information\n\n    Scenario: Country names from OSM country relations are added\n        Given the places\n            | osm  | class    | type           | admin | name+name:xy | country | geometry |\n            | R1   | boundary | administrative | 2     | Loudou       | de      | (9 52, 9 53, 10 52, 9 52) |\n        Given the places\n            | osm  | class    | type          | name  | geometry   |\n            | N1   | place    | town          | Wenig | country:de |\n        When importing\n        When geocoding \"Wenig, Loudou\"\n        Then the result set contains\n            | object | display_name |\n            | N1     | Wenig, Deutschland |\n        When geocoding \"Wenig\"\n            | accept-language |\n            | xy,en |\n        Then the result set contains\n            | object | display_name |\n            | N1     | Wenig, Loudou |\n\n    Scenario: OSM country relations outside expected boundaries are ignored for naming\n        Given the grid\n            | 1 |  | 2 |\n            | 4 |  | 3 |\n        Given the places\n            | osm  | class    | type           | admin | name+name:xy | country | geometry |\n            | R1   | boundary | administrative | 2     | Loudou       | de      | (1,2,3,4,1) |\n        Given the places\n            | osm  | class    | type          | name  | geometry   |\n            | N1   | place    | town          | Wenig | country:de |\n        When importing\n        When geocoding \"Wenig\"\n            | accept-language |\n            | xy,en |\n        Then the result set contains\n            | object | display_name |\n            | N1     | Wenig, Germany |\n\n    Scenario: Pre-defined country names are used\n        Given the grid with origin CH\n            | 1 |\n        Given the places\n            | osm  | class    | type          | name  | geometry   |\n            | N1   | place    | town          | Ingb  | 1          |\n        When importing\n        And geocoding \"Ingb\"\n            | accept-language |\n            | en,de |\n        Then the result set contains\n            | object | display_name |\n            | N1     | Ingb, Switzerland |\n\n    Scenario: For overlapping countries, pre-defined countries are tie-breakers\n        Given the grid with origin US\n            | 1 |   | 2 |   | 5 |\n            |   | 9 |   | 8 |   |\n            | 4 |   | 3 |   | 6 |\n        Given the named places\n            | osm  | class    | type           | admin | country | geometry |\n            | R1   | boundary | administrative | 2     | de      | (1,5,6,4,1) |\n            | R2   | boundary | administrative | 2     | us      | (1,2,3,4,1) |\n        And the named places\n            | osm  | class    | type  | geometry   |\n            | N1   | place    | town  | 9 |\n            | N2   | place    | town  | 8 |\n        When importing\n        Then placex contains\n            | object | country_code |\n            | N1     | us           |\n            | N2     | de           |\n\n    Scenario: For overlapping countries outside pre-define countries prefer smaller partition\n        Given the grid with origin US\n            | 1 |   | 2 |   | 5 |\n            |   | 9 |   | 8 |   |\n            | 4 |   | 3 |   | 6 |\n        Given the named places\n            | osm  | class    | type           | admin | country | geometry |\n            | R1   | boundary | administrative | 2     | ch      | (1,5,6,4,1) |\n            | R2   | boundary | administrative | 2     | de      | (1,2,3,4,1) |\n        And the named places\n            | osm  | class    | type  | geometry   |\n            | N1   | place    | town  | 9 |\n            | N2   | place    | town  | 8 |\n        When importing\n        Then placex contains\n            | object | country_code |\n            | N1     | de           |\n            | N2     | ch           |\n"
  },
  {
    "path": "test/bdd/features/db/import/entrances.feature",
    "content": "Feature: Entrance nodes are recorded\n    Test that imported entrance nodes are saved\n\n    Scenario: A building with two entrances\n        Given the grid\n          | 1 | 2 |\n          | 4 | 3 |\n        Given the places\n          | osm | class    | type  | geometry    | extratags           |\n          | W1  | building | yes   | (1,2,3,4,1) |                     |\n        And the entrances\n          | osm | type  | geometry    | extratags           |\n          | N1  | main  | 1           | 'wheelchair': 'yes' |\n          | N2  | yes   | 3           |                     |\n        And the ways\n          | id | nodes     |\n          | 1  | 1,2,3,4,1 |\n        When importing\n        Then placex contains exactly\n         | object | place_id |\n         | W1     | 1        |\n        Then placex_entrance contains exactly\n         | place_id | osm_id | type | location!wkt | extratags             |\n         | 1        | 1      | main | 1            | {'wheelchair': 'yes'} |\n         | 1        | 2      | yes  | 3            | {}                    |\n"
  },
  {
    "path": "test/bdd/features/db/import/interpolation.feature",
    "content": "Feature: Import of address interpolations\n    Tests that interpolated addresses are added correctly\n\n    Scenario: Simple even interpolation line with two points and no street nearby\n        Given the grid with origin 1,1\n          | 1 |  | 9 |  | 2 |\n        Given the places\n          | osm | class | type   | housenr |\n          | N1  | place | house  | 2       |\n          | N2  | place | house  | 6       |\n        And the interpolations\n          | osm | type | geometry | nodes |\n          | W1  | even | 1,2      | 1,2   |\n        When importing\n        Then W1 expands to no interpolation\n\n    Scenario: Simple even interpolation line with two points\n        Given the grid with origin 1,1\n          | 1 |  | 9 |  | 2 |\n          | 4 |  |   |  | 5 |\n        Given the places\n          | osm | class | type   | housenr |\n          | N1  | place | house  | 2       |\n          | N2  | place | house  | 6       |\n        And the interpolations\n          | osm | type | geometry | nodes |\n          | W1  | even | 1,2      | 1,2   |\n        And the named places\n          | osm | class   | type        | geometry |\n          | W10 | highway | residential | 4,5      |\n        When importing\n        Then W1 expands to interpolation\n          | start | end | geometry |\n          | 4     | 4   | 9 |\n\n    Scenario: Backwards even two point interpolation line\n        Given the grid with origin 1,1\n          | 1 | 8 | 9 | 2 |\n          | 4 |   |   | 5 |\n        Given the places\n          | osm | class | type   | housenr |\n          | N1  | place | house  | 2       |\n          | N2  | place | house  | 8       |\n        And the interpolations\n          | osm | type | geometry | nodes |\n          | W1  | even | 2,1      | 2,1   |\n        And the named places\n          | osm | class   | type        | geometry |\n          | W10 | highway | residential | 4,5      |\n        When importing\n        Then W1 expands to interpolation\n          | start | end | geometry |\n          | 4     | 6   | 8,9      |\n\n    Scenario: Simple odd two point interpolation\n        Given the grid with origin 1,1\n          | 1 | 8 |  |  | 9 | 2 |\n          | 4 |   |  |  | 5 |   |\n        Given the places\n          | osm | class | type   | housenr |\n          | N1  | place | house  | 1       |\n          | N2  | place | house  | 11      |\n        And the interpolations\n          | osm | type | geometry | nodes |\n          | W1  | odd  | 1,2      | 1,2   |\n        And the named places\n          | osm | class   | type        | geometry |\n          | W10 | highway | residential | 4,5      |\n        When importing\n        Then W1 expands to interpolation\n          | start | end | geometry |\n          | 3     | 9   | 8,9      |\n\n    Scenario: Simple all two point interpolation\n        Given the grid with origin 1,1\n          | 1 | 8 | 9 | 2 |\n          | 4 |   |   | 5 |\n        Given the places\n          | osm | class | type   | housenr |\n          | N1  | place | house  | 1       |\n          | N2  | place | house  | 4       |\n        And the interpolations\n          | osm | type | geometry | nodes |\n          | W1  | all  | 1,2      | 1,2 |\n        And the named places\n          | osm | class   | type        | geometry |\n          | W10 | highway | residential | 4,5      |\n        When importing\n        Then W1 expands to interpolation\n          | start | end | geometry |\n          | 2     | 3   | 8,9 |\n\n    Scenario: Even two point interpolation line with intermediate empty node\n        Given the grid\n          | 1 | 8 |  | 3 | 9 | 2 |\n          | 4 |   |  |   | 5 |   |\n        Given the places\n          | osm | class | type   | housenr |\n          | N1  | place | house  | 2       |\n          | N2  | place | house  | 12      |\n        And the interpolations\n          | osm | type | geometry | nodes |\n          | W1  | even | 1,3,2    | 1,3,2 |\n        And the named places\n          | osm | class   | type        | geometry |\n          | W10 | highway | residential | 4,5      |\n        When importing\n        Then W1 expands to interpolation\n          | start | end | geometry |\n          | 4     | 10  | 8,3,9 |\n\n    Scenario: Even two point interpolation line with intermediate duplicated empty node\n        Given the grid\n          | 4 |   |   |   | 5 |\n          | 1 | 8 | 3 | 9 | 2 |\n        Given the places\n          | osm | class | type   | housenr |\n          | N1  | place | house  | 2       |\n          | N2  | place | house  | 10      |\n        And the interpolations\n          | osm | type | geometry | nodes |\n          | W1  | even | 1,3,2    | 1,3,3,2 |\n        And the named places\n          | osm | class   | type        | geometry |\n          | W10 | highway | residential | 4,5      |\n        When importing\n        Then W1 expands to interpolation\n          | start | end | geometry |\n          | 4     | 8   | 8,3,9 |\n\n    Scenario: Simple even three point interpolation line\n        Given the grid\n          | 4 |   |  |   |   |   | 5 |\n          | 1 | 8 |  | 9 | 3 | 7 | 2 |\n        Given the places\n          | osm | class | type   | housenr |\n          | N1  | place | house  | 2       |\n          | N2  | place | house  | 14      |\n          | N3  | place | house  | 10      |\n        And the interpolations\n          | osm | type | geometry | nodes |\n          | W1  | even | 1,3,2    | 1,3,2 |\n        And the named places\n          | osm | class   | type        | geometry |\n          | W10 | highway | residential | 4,5      |\n        When importing\n        Then W1 expands to interpolation\n          | start | end | geometry |\n          | 4     |  8  | 8,9 |\n          | 12    | 12  | 7 |\n\n    Scenario: Simple even four point interpolation line\n        Given the grid\n          | 1 | 10 |   | 11 | 3 |\n          |   |    |   |    | 12|\n          |   |    | 4 | 13 | 2 |\n        Given the places\n          | osm | class | type  | housenr |\n          | N1  | place | house | 2       |\n          | N2  | place | house | 14      |\n          | N3  | place | house | 10      |\n          | N4  | place | house | 18      |\n        And the interpolations\n          | osm | type | geometry | nodes |\n          | W1  | even | 1,3,2,4  | 1,3,2,4 |\n        And the named places\n          | osm | class   | type        | geometry |\n          | W10 | highway | residential | 1,3,2,4  |\n        When importing\n        Then W1 expands to interpolation\n          | start | end | geometry |\n          | 4     | 8   | 10,11    |\n          | 12    | 12  | 12       |\n          | 16    | 16  | 13       |\n\n    Scenario: Reverse simple even three point interpolation line\n        Given the grid\n          | 1 | 8  |  | 9 | 3 | 7 | 2 |\n          | 4 |    |  |   |   |   | 5 |\n        Given the places\n          | osm | class | type  | housenr |\n          | N1  | place | house | 2       |\n          | N2  | place | house | 14      |\n          | N3  | place | house | 10      |\n        And the interpolations\n          | osm | type | geometry | nodes |\n          | W1  | even | 2,3,1    | 2,3,1 |\n        And the named places\n          | osm | class   | type        | geometry |\n          | W10 | highway | residential | 4,5      |\n        When importing\n        Then W1 expands to interpolation\n          | start | end | geometry |\n          | 4     |  8  | 8,9      |\n          | 12    | 12  | 7        |\n\n    Scenario: Even three point interpolation line with odd center point\n        Given the grid\n          | 1 |  | 10 |  | 11 | 3 | 2 |\n          | 4 |  |    |  |    |   | 5 |\n        Given the places\n          | osm | class | type  | housenr |\n          | N1  | place | house | 2       |\n          | N2  | place | house | 8       |\n          | N3  | place | house | 7       |\n        And the interpolations\n          | osm | type | geometry | nodes |\n          | W1  | even | 1,3,2    | 1,3,2 |\n        And the named places\n          | osm | class   | type        | geometry |\n          | W10 | highway | residential | 4,5      |\n        When importing\n        Then W1 expands to interpolation\n          | start | end | geometry |\n          | 4     | 6   | 10,11 |\n\n    Scenario: Interpolation line with self-intersecting way\n        Given the grid\n          | 1  | 9 | 2 |\n          |    |   | 8 |\n          |    |   | 3 |\n        Given the places\n          | osm | class | type  | housenr |\n          | N1  | place | house | 2       |\n          | N2  | place | house | 6       |\n          | N3  | place | house | 10      |\n        And the interpolations\n          | osm | type | geometry | nodes |\n          | W1  | even | 1,2,3,2  | 1,2,3,2 |\n        And the named places\n          | osm | class   | type        | geometry |\n          | W10 | highway | residential | 1,2,3    |\n        When importing\n        Then W1 expands to interpolation\n          | start | end | geometry |\n          | 4     | 4   | 9        |\n          | 8     | 8   | 8        |\n          | 8     | 8   | 8        |\n\n    Scenario: Interpolation line with self-intersecting way II\n        Given the grid\n          | 1  | 9 | 2 |\n          |    |   | 3 |\n        Given the places\n          | osm | class | type  | housenr |\n          | N1  | place | house | 2       |\n          | N2  | place | house | 6       |\n        And the interpolations\n          | osm | type | geometry | nodes |\n          | W1  | even | 1,2,3,2  | 1,2,3,2 |\n        And the named places\n          | osm | class   | type        | geometry |\n          | W10 | highway | residential | 1,2,3    |\n        When importing\n        Then W1 expands to interpolation\n          | start | end | geometry |\n          | 4     | 4   | 9        |\n\n    Scenario: addr:street on interpolation way\n        Given the grid\n          |    | 1 |  | 2 |    |\n          | 10 |   |  |   | 11 |\n          | 20 |   |  |   | 21 |\n        And the places\n          | osm | class | type  | housenr | geometry |\n          | N1  | place | house | 2       | 1        |\n          | N2  | place | house | 6       | 2        |\n          | N3  | place | house | 12      | 1        |\n          | N4  | place | house | 16      | 2        |\n        And the interpolations\n          | osm | type | street       | nodes | geometry | nodes |\n          | W10 | even |              | 1,2   | 1,2      | 1,2   |\n          | W11 | even | Cloud Street | 3,4   | 1,2      | 3,4   |\n        And the places\n          | osm | class   | type     | name         | geometry |\n          | W2  | highway | tertiary | Sun Way      | 10,11    |\n          | W3  | highway | tertiary | Cloud Street | 20,21    |\n        When importing\n        Then placex contains\n          | object | parent_place_id |\n          | N1     | W2 |\n          | N2     | W2 |\n          | N3     | W3 |\n          | N4     | W3 |\n        Then W10 expands to interpolation\n          | parent_place_id | start | end |\n          | W2              | 4     | 4 |\n        Then W11 expands to interpolation\n          | parent_place_id | start | end |\n          | W3              | 14    | 14 |\n        When geocoding \"16 Cloud Street\"\n        Then result 0 contains\n         | object |\n         | N4  |\n        When geocoding \"14 Cloud Street\"\n        Then result 0 contains\n         | object |\n         | W11 |\n\n    Scenario: addr:street on housenumber way\n        Given the grid\n          |    | 1 |  | 2 |    |\n          | 10 |   |  |   | 11 |\n          | 20 |   |  |   | 21 |\n        And the places\n          | osm | class | type  | housenr | street       | geometry |\n          | N1  | place | house | 2       |              | 1        |\n          | N2  | place | house | 6       |              | 2        |\n          | N3  | place | house | 12      | Cloud Street | 1        |\n          | N4  | place | house | 16      | Cloud Street | 2        |\n        And the interpolations\n          | osm | type | geometry | nodes |\n          | W10 | even | 1,2      | 1,2 |\n          | W11 | even | 1,2      | 3,4 |\n        And the places\n          | osm | class   | type     | name         | geometry |\n          | W2  | highway | tertiary | Sun Way      | 10,11    |\n          | W3  | highway | tertiary | Cloud Street | 20,21    |\n        When importing\n        Then placex contains\n          | object | parent_place_id |\n          | N1     | W2 |\n          | N2     | W2 |\n          | N3     | W3 |\n          | N4     | W3 |\n        Then W10 expands to interpolation\n          | parent_place_id | start | end |\n          | W2              | 4     | 4 |\n        Then W11 expands to interpolation\n          | parent_place_id | start | end |\n          | W3              | 14    | 14 |\n        When geocoding \"16 Cloud Street\"\n        Then result 0 contains\n         | object |\n         | N4  |\n        When geocoding \"14 Cloud Street\"\n        Then result 0 contains\n         | object |\n         | W11 |\n\n    Scenario: Geometry of points and way don't match (github #253)\n        Given the places\n          | osm | class | type        | housenr | geometry |\n          | N1  | place | house       | 10      | 144.9632341 -37.76163 |\n          | N2  | place | house       | 6       | 144.9630541 -37.7628174 |\n          | N3  | shop  | supermarket | 2       | 144.9629794 -37.7630755 |\n        And the interpolations\n          | osm | type | geometry                                                              | nodes |\n          | W1  | even | 144.9632341 -37.76163,144.9630541 -37.7628172,144.9629794 -37.7630755 | 1,2,3 |\n        And the named places\n          | osm | class   | type        | geometry |\n          | W10 | highway | residential | 144.9632341 -37.76163,144.9629794 -37.7630755    |\n        When importing\n        Then W1 expands to interpolation\n          | start | end | geometry |\n          | 4     | 4   | 144.96301672 -37.76294644 |\n          | 8     | 8   | 144.96314407 -37.762223692 |\n\n    Scenario: Place with missing address information\n        Given the grid\n          | 1 |  | 2 |  |  | 3 |\n          | 4 |  |   |  |  | 5 |\n        And the places\n          | osm | class   | type   | housenr |\n          | N1  | place   | house  | 23      |\n          | N2  | amenity | school |         |\n          | N3  | place   | house  | 29      |\n        And the interpolations\n          | osm | type | geometry | nodes |\n          | W1  | odd  | 1,2,3    | 1,2,3 |\n        And the named places\n          | osm | class   | type        | geometry |\n          | W10 | highway | residential | 4,5      |\n        When importing\n        Then W1 expands to interpolation\n          | start | end | geometry |\n          | 25    | 27  | 0.0000166 0,0.00002 0,0.0000333 0 |\n\n    Scenario: Ways without node entries are ignored\n        Given the interpolations\n          | osm | type | geometry     | nodes |\n          | W1  | even | 1 1, 1 1.001 | 34,45 |\n        And the named places\n          | osm | class   | type        | geometry |\n          | W10 | highway | residential | 1 1, 1 1.001 |\n        When importing\n        Then W1 expands to no interpolation\n\n    Scenario: Ways with nodes without housenumbers are ignored\n        Given the grid\n          | 1 |  | 2 |\n          | 4 |  | 5 |\n        Given the places\n          | osm | class | type   |\n          | N1  | place | house  |\n          | N2  | place | house  |\n        Given the interpolations\n          | osm | type | geometry | nodes |\n          | W1  | even | 1,2      | 1,2   |\n        And the named places\n          | osm | class   | type        | geometry |\n          | W10 | highway | residential | 4,5      |\n        When importing\n        Then W1 expands to no interpolation\n\n    Scenario: Two point interpolation starting at 0\n        Given the grid with origin 1,1\n          | 1 | 10 |  |  | 11 | 2 |\n          | 4 |    |  |  |    | 5 |\n        Given the places\n          | osm | class | type   | housenr |\n          | N1  | place | house  | 0       |\n          | N2  | place | house  | 10      |\n        And the interpolations\n          | osm | type | geometry | nodes |\n          | W1  | even | 1,2      | 1,2 |\n        And the places\n          | osm | class   | type        | name        | geometry |\n          | W10 | highway | residential | London Road |4,5      |\n        When importing\n        Then W1 expands to interpolation\n          | start | end | geometry |\n          | 2     | 8   | 10,11 |\n        When reverse geocoding 1,1\n        Then the result contains\n          | object | type  | display_name |\n          | N1     | house | 0, London Road |\n\n    Scenario: Parenting of interpolation with additional tags\n        Given the grid\n          | 1 |   |   |   |   |   |\n          |   |   |   |   |   |   |\n          |   | 8 |   |   | 9 |   |\n          |   |   |   |   |   |   |\n          | 2 |   |   |   |   | 3 |\n        Given the places\n          | osm | class | type  | housenr | addr+street |\n          | N8  | place | house | 10      | Horiz St    |\n          | N9  | place | house | 16      | Horiz St    |\n        And the places\n          | osm | class   | type        | name     | geometry |\n          | W1  | highway | residential | Vert St  | 1,2      |\n          | W2  | highway | residential | Horiz St | 2,3      |\n        And the interpolations\n          | osm | type | addr+inclusion | geometry | nodes |\n          | W10 | even | actual         | 8,9      | 8,9   |\n        When importing\n        Then placex contains\n          | object | parent_place_id |\n          | N8     | W2              |\n          | N9     | W2              |\n        And W10 expands to interpolation\n          | start | end | parent_place_id |\n          | 12    | 14  | W2              |\n\n\n    Scenario Outline: Bad interpolation values are ignored\n        Given the grid with origin 1,1\n          | 1 |  | 9 |  | 2 |\n          | 4 |  |   |  | 5 |\n        Given the places\n          | osm | class | type   | housenr |\n          | N1  | place | house  | 2       |\n          | N2  | place | house  | 6       |\n        And the interpolations\n          | osm | type    | geometry | nodes |\n          | W1  | <value> | 1,2      | 1,2 |\n        And the named places\n          | osm | class   | type        | geometry |\n          | W10 | highway | residential | 4,5      |\n        When importing\n        Then W1 expands to no interpolation\n\n        Examples:\n          | value |\n          | foo   |\n          | x     |\n          | 12-2  |\n\n\n    Scenario: Interpolation line where points have been moved (Github #3022)\n        Given the 0.00001 grid\n         | 1 | | | | | | | | 2 | 3 | 9 | | | | | | | | 4 |\n        Given the places\n          | osm | class | type   | housenr | geometry |\n          | N1  | place | house  | 2       | 1 |\n          | N2  | place | house  | 18      | 3 |\n          | N3  | place | house  | 24      | 9 |\n          | N4  | place | house  | 42      | 4 |\n        And the interpolations\n          | osm | type | geometry | nodes   |\n          | W1  | even | 1,2,3,4  | 1,2,3,4 |\n        And the named places\n          | osm | class   | type        | geometry |\n          | W10 | highway | residential | 1,4      |\n        When importing\n        Then W1 expands to interpolation\n          | start | end |\n          | 4     | 16  |\n          | 20    | 22  |\n          | 26    | 40  |\n\n\n    Scenario: Interpolation line with duplicated points\n        Given the grid\n          | 7 | 10 | 8 | 11 | 9 |\n          | 4 |    |   |    | 5 |\n        Given the places\n          | osm | class | type   | housenr | geometry |\n          | N1  | place | house  | 2       | 7 |\n          | N2  | place | house  | 6       | 8 |\n          | N3  | place | house  | 10      | 8 |\n          | N4  | place | house  | 14      | 9 |\n        And the interpolations\n          | osm | type | geometry | nodes   |\n          | W1  | even | 7,8,8,9  | 1,2,3,4 |\n        And the named places\n          | osm | class   | type        | geometry |\n          | W10 | highway | residential | 4,5      |\n        When importing\n        Then W1 expands to interpolation\n          | start | end | geometry |\n          | 4     | 4   | 10       |\n          | 12    | 12  | 11       |\n\n\n    Scenario: Interpolaton line with broken way geometry (Github #2986)\n        Given the grid\n          | 1 | 8 | 10 | 11 | 9 | 2 | 3 | 4 |\n        Given the places\n          | osm | class | type   | housenr |\n          | N1  | place | house  | 2       |\n          | N2  | place | house  | 8       |\n          | N3  | place | house  | 12      |\n          | N4  | place | house  | 14      |\n        And the interpolations\n          | osm | type | geometry | nodes       |\n          | W1  | even | 8,9      | 1,8,9,2,3,4 |\n        And the named places\n          | osm | class   | type        | geometry |\n          | W10 | highway | residential | 1,4      |\n        When importing\n        Then W1 expands to interpolation\n          | start | end | geometry |\n          | 4     | 6   | 10,11    |\n"
  },
  {
    "path": "test/bdd/features/db/import/linking.feature",
    "content": "Feature: Linking of places\n    Tests for correctly determining linked places\n\n    Scenario: Only address-describing places can be linked\n        Given the grid\n         | 1 |  |   |  | 2 |\n         |   |  | 9 |  |   |\n         | 4 |  |   |  | 3 |\n        And the places\n         | osm  | class   | type   | name  | geometry |\n         | R13  | landuse | forest | Garbo | (1,2,3,4,1) |\n         | N256 | natural | peak   | Garbo | 9 |\n        When importing\n        Then placex contains\n         | object  | linked_place_id |\n         | R13     | - |\n         | N256    | - |\n\n     Scenario: Waterways are linked when in waterway relations\n        Given the grid\n         | 1 |  |   |  | 3 | 4  |  |   |  | 6 |\n         |   |  | 2 |  |   | 10 |  | 5 |  |   |\n         |   |  |   |  |   | 11 |  |   |  |   |\n        And the places\n         | osm | class    | type  | name  | geometry |\n         | W1  | waterway | river | Rhein | 1,2,3    |\n         | W2  | waterway | river | Rhein | 3,4,5    |\n         | R13 | waterway | river | Rhein | 1,2,3,4,5,6 |\n         | R23 | waterway | river | Limmat| 4,10,11  |\n        And the relations\n         | id | members                          | tags+type |\n         | 13 | R23:tributary,W1,W2:main_stream  | waterway |\n        When importing\n        Then placex contains\n         | object | linked_place_id |\n         | W1     | R13 |\n         | W2     | R13 |\n         | R13    | -   |\n         | R23    | -   |\n        When geocoding \"rhein\"\n        Then the result set contains\n         | object |\n         | R13    |\n\n    Scenario: Relations are not linked when in waterway relations\n        Given the grid\n         | 1 |  |   |  | 3 | 4  |  |   |  | 6 |\n         |   |  | 2 |  |   | 10 |  | 5 |  |   |\n         |   |  |   |  |   | 11 |  |   |  |   |\n        And the places\n         | osm | class    | type   | name  | geometry |\n         | W1  | waterway | stream | Rhein | 1,2,3,4 |\n         | W2  | waterway | river  | Rhein | 4,5,6 |\n         | R1  | waterway | river  | Rhein | 1,2,3,4 |\n         | R2  | waterway | river  | Limmat| 4,10,11 |\n        And the relations\n         | id | members                          | tags+type |\n         | 1  | R2                               | waterway  |\n        When importing\n        Then placex contains\n         | object | linked_place_id |\n         | W1     | - |\n         | W2     | - |\n         | R1     | - |\n         | R2     | - |\n        When geocoding \"rhein\"\n        Then result 0 contains\n          | object |\n          | R1  |\n        And result 1 contains\n          | object |\n          | W2  |\n\n\n    Scenario: Empty waterway relations are handled correctly\n        Given the grid\n         | 1 |  |   |  | 3 |\n        And the places\n         | osm | class    | type  | name  | geometry |\n         | R1  | waterway | river | Rhein | 1,3 |\n        And the relations\n         | id | members  | tags+type |\n         | 1  |          | waterway |\n        When importing\n        Then placex contains\n         | object | linked_place_id |\n         | R1     | - |\n\n    Scenario: Waterways are not linked when the way type is not a river feature\n        Given the grid\n         | 1 |   | 2 |\n         |   |   |   |\n         | 3 |   | 4 |\n        And the places\n         | osm | class    | type     | name  | geometry |\n         | W1  | waterway | lock     | Rhein | 3,4 |\n         | R1  | landuse  | meadow   | Rhein | (3,1,2,4,3) |\n        And the relations\n         | id | members      | tags+type |\n         | 1  | W1,W2        | multipolygon |\n        When importing\n        Then placex contains\n         | object | linked_place_id |\n         | W1     | - |\n         | R1     | - |\n\n    Scenario: Side streams are linked only when they have the same name\n        Given the grid\n         |   |  |   |   | 8 |   |   |  |\n         | 1 |  | 2 | 3 |   | 4 | 5 | 6|\n         |   |  |   |   |   | 9 |   |  |\n        And the places\n         | osm | class    | type  | name   | geometry |\n         | W1  | waterway | river | Rhein2 | 2,8,4 |\n         | W2  | waterway | river | Rhein  | 3,9,5 |\n         | R1  | waterway | river | Rhein  | 1,2,3,4,5,6 |\n        And the relations\n         | id | members                           | tags+type |\n         | 1  | W1:side_stream,W2:side_stream,W3  | waterway |\n        When importing\n        Then placex contains\n         | object | linked_place_id |\n         | W1     | -  |\n         | W2     | R1 |\n        When geocoding \"rhein2\"\n        Then the result set contains\n         | object |\n         | W1  |\n\n    # github #573\n    Scenario: Boundaries should only be linked to places\n        Given the 0.05 grid\n         | 1 |   | 2 |\n         |   | 9 |   |\n         | 4 |   | 3 |\n        Given the named places\n         | osm | class    | type           | extra+wikidata | admin | geometry    |\n         | R1  | boundary | administrative | 34             | 8     | (1,2,3,4,1) |\n        And the named places\n         | osm | class    | type           |\n         | N9  | natural  | island         |\n         | N9  | place    | city           |\n        And the relations\n         | id | members  |\n         | 1  | N9:label |\n        When importing\n        Then placex contains\n         | object     | linked_place_id |\n         | N9:natural | -               |\n         | N9:place   | R1              |\n\n    Scenario: Nodes with 'role' label are always linked\n        Given the 0.05 grid\n         | 1 |   | 2 |\n         |   | 9 |   |\n         | 4 |   | 3 |\n        Given the places\n         | osm  | class    | type           | admin | name  | geometry    |\n         | R13  | boundary | administrative | 6     | Garbo | (1,2,3,4,1) |\n         | N2   | place    | hamlet         | 15    | Vario | 9           |\n        And the relations\n         | id | members       | tags+type |\n         | 13 | N2:label      | boundary |\n        When importing\n        Then placex contains\n         | object  | linked_place_id |\n         | N2      | R13 |\n        And placex contains\n         | object | centroid!wkt | name+name | extratags+linked_place |\n         | R13    | 9            | Garbo     | hamlet |\n\n    Scenario: Boundaries with place tags are linked against places with same type\n        Given the 0.01 grid\n         | 1 |   | 2 |\n         |   | 9 |   |\n         | 4 |   | 3 |\n        Given the places\n         | osm  | class    | type           | admin | name   | extra+place | geometry    |\n         | R13  | boundary | administrative | 4     | Berlin | city        | (1,2,3,4,1) |\n        And the places\n         | osm  | class    | type           | name   | geometry |\n         | N2   | place    | city           | Berlin | 9 |\n        When importing\n        Then placex contains\n         | object  | linked_place_id |\n         | N2      | R13             |\n        And placex contains\n         | object | rank_address |\n         | R13    | 16 |\n        When geocoding \"\"\n         | city |\n         | Berlin |\n        Then result 0 contains\n          | object |\n          | R13 |\n        When geocoding \"\"\n         | state |\n         | Berlin |\n        Then result 0 contains\n          | object |\n          | R13 |\n\n\n    Scenario: Boundaries without place tags only link against same admin level\n        Given the 0.05 grid\n         | 1 |   | 2 |\n         |   | 9 |   |\n         | 4 |   | 3 |\n        Given the places\n         | osm  | class    | type           | admin | name   | geometry |\n         | R13  | boundary | administrative | 4     | Berlin | (1,2,3,4,1) |\n        And the places\n         | osm  | class    | type           | name   | geometry |\n         | N2   | place    | city           | Berlin | 9 |\n        When importing\n        Then placex contains\n         | object  | linked_place_id |\n         | N2      | -               |\n        And placex contains\n         | object | rank_address |\n         | R13    | 8 |\n        When geocoding \"\"\n         | state |\n         | Berlin |\n        Then result 0 contains\n          | object |\n          | R13 |\n        When geocoding \"\"\n         | city |\n         | Berlin |\n        Then result 0 contains\n          | object |\n          | N2  |\n\n    # github #1352\n    Scenario: Do not use linked centroid when it is outside the area\n        Given the 0.05 grid\n         | 1 |   | 2 |   |\n         |   |   |   | 9 |\n         | 4 |   | 3 |   |\n        Given the named places\n         | osm  | class    | type           | admin | geometry |\n         | R13  | boundary | administrative | 4     | (1,2,3,4,1) |\n        And the named places\n         | osm  | class    | type           | geometry |\n         | N2   | place    | city           | 9 |\n        And the relations\n         | id | members       | tags+type |\n         | 13 | N2:label      | boundary |\n        When importing\n        Then placex contains\n         | object | linked_place_id |\n         | N2     | R13             |\n        And placex contains\n         | object | centroid!in_box |\n         | R13    | 0,0,0.1,0.1      |\n\n    Scenario: Place nodes can only be linked once\n        Given the 0.02 grid\n         | 1 |   | 2 |   | 5 |\n         |   | 9 |   |   |   |\n         | 4 |   | 3 |   | 6 |\n        Given the named places\n         | osm  | class    | type | extra+wikidata | geometry |\n         | N2   | place    | city | Q1234          | 9        |\n        And the named places\n         | osm  | class    | type           | extra+wikidata | admin | geometry        |\n         | R1   | boundary | administrative | Q1234          | 8     | (1,2,5,6,3,4,1) |\n         | R2   | boundary | administrative | Q1234          | 9     | (1,2,3,4,1)     |\n        When importing\n        Then placex contains\n         | object | linked_place_id |\n         | N2     | R1              |\n        And placex contains\n         | object | extratags!dict                |\n         | R1     | 'linked_place' : 'city', 'wikidata': 'Q1234'  |\n         | R2     | 'wikidata': 'Q1234'                     |\n\n\n    Scenario: Boundaries without names inherit names from linked places\n        Given the 0.05 grid\n         | 1 |   | 2 |\n         |   | 9 |   |\n         | 4 |   | 3 |\n        Given the places\n         | osm | class    | type           | extra+wikidata | admin | geometry    |\n         | R1  | boundary | administrative | 34             | 8     | (1,2,3,4,1) |\n        And the places\n         | osm | class    | type           | name+name  |\n         | N9  | place    | city           | LabelPlace |\n        And the relations\n         | id | members  |\n         | 1  | N9:label |\n        When importing\n        Then placex contains\n         | object     | name+_place_name  |\n         | R1         | LabelPlace |\n\n\n    Scenario: Boundaries and places do not link by name when wikidata mismatches\n        Given the 0.05 grid\n         | 1 |   | 2 |\n         |   | 9 |   |\n         | 4 |   | 3 |\n        Given the places\n         | osm | class    | type           | extra+wikidata | name | admin | geometry    |\n         | R1  | boundary | administrative | Q34            | Foo  | 8     | (1,2,3,4,1) |\n        And the places\n         | osm | class    | type           | extra+wikidata | name |\n         | N9  | place    | city           | Q35            | Foo  |\n        When importing\n        Then placex contains\n         | object     | linked_place_id |\n         | N9         | - |\n\n\n    Scenario: Boundaries and places link by name when wikidata matches\n        Given the 0.05 grid\n         | 1 |   | 2 |\n         |   | 9 |   |\n         | 4 |   | 3 |\n        Given the places\n         | osm | class    | type           | extra+wikidata | name | admin | geometry    |\n         | R1  | boundary | administrative | Q34            | Foo  | 8     | (1,2,3,4,1) |\n        And the places\n         | osm | class    | type           | extra+wikidata | name |\n         | N9  | place    | city           | Q34            | Foo  |\n        When importing\n        Then placex contains\n         | object     | linked_place_id |\n         | N9         | R1 |\n\n\n    @skip\n    Scenario: Linked places expand default language names\n        Given the grid\n            | 1 |   | 2 |\n            |   | 9 |   |\n            | 4 |   | 3 |\n        Given the places\n            | osm | class    | type           | name+name                | geometry    |\n            | N9  | place    | city           | Popayán                  | 9           |\n        Given the places\n            | osm | class    | type           | name+name                | geometry    | admin |\n            | R1  | boundary | administrative | Perímetro Urbano Popayán | (1,2,3,4,1) | 8     |\n        And the relations\n            | id | members  |\n            | 1  | N9:label |\n        When importing\n        Then placex contains\n            | object      | linked_place_id |\n            | N9:place    | R1              |\n            | R1:boundary | -               |\n        Then placex contains\n            | object | name+_place_name | name+_place_name:es |\n            | R1     | Popayán          | Popayán             |\n\n"
  },
  {
    "path": "test/bdd/features/db/import/naming.feature",
    "content": "Feature: Import and search of names\n    Tests all naming related import issues\n\n    Scenario: No copying name tag if only one name\n        Given the places\n          | osm | class | type      | name+name | geometry |\n          | N1  | place | locality  | german    | country:de |\n        When importing\n        Then placex contains\n          | object | country_code | name+name |\n          | N1     | de           | german |\n\n    Scenario: Copying name tag to default language if it does not exist\n        Given the places\n          | osm | class | type      | name+name | name+name:fi | geometry |\n          | N1  | place | locality  | german    | finnish      | country:de |\n        When importing\n        Then placex contains\n          | object | country_code | name+name | name+name:fi | name+name:de |\n          | N1     | de           | german    | finnish      | german       |\n\n    Scenario: Copying default language name tag to name if it does not exist\n        Given the places\n          | osm | class | type     | name+name:de | name+name:fi | geometry |\n          | N1  | place | locality | german       | finnish      | country:de |\n        When importing\n        Then placex contains\n          | object | country_code | name+name | name+name:fi | name+name:de |\n          | N1     | de           | german    | finnish      | german       |\n\n    Scenario: Do not overwrite default language with name tag\n        Given the places\n          | osm | class | type     | name+name | name+name:fi | name+name:de | geometry |\n          | N1  | place | locality | german    | finnish      | local        | country:de |\n        When importing\n        Then placex contains\n          | object | country_code | name+name | name+name:fi | name+name:de |\n          | N1     | de           | german    | finnish      | local        |\n\n    Scenario Outline: Names in any script can be found\n        Given the places\n            | osm | class | type   | name+name   |\n            | N1  | place | hamlet | <name> |\n        When importing\n        And geocoding \"<name>\"\n        Then the result set contains\n            | object |\n            | N1  |\n\n     Examples:\n        | name |\n        | Berlin |\n        | 北京 |\n        | Вологда |\n        | Αθήνα |\n        | القاهرة |\n        | រាជធានីភ្នំពេញ |\n        | 東京都 |\n        | ပုဗ္ဗသီရိ |\n\n\n    Scenario: German umlauts can be found when expanded\n        Given the places\n            | osm | class | type | name+name:de |\n            | N1  | place | city | Münster      |\n            | N2  | place | city | Köln         |\n            | N3  | place | city | Gräfenroda   |\n        When importing\n        When geocoding \"münster\"\n        Then the result set contains\n            | object |\n            | N1  |\n        When geocoding \"muenster\"\n        Then the result set contains\n            | object |\n            | N1  |\n        When geocoding \"munster\"\n        Then the result set contains\n            | object |\n            | N1  |\n        When geocoding \"Köln\"\n        Then the result set contains\n            | object |\n            | N2  |\n        When geocoding \"Koeln\"\n        Then the result set contains\n            | object |\n            | N2  |\n        When geocoding \"Koln\"\n        Then the result set contains\n            | object |\n            | N2  |\n        When geocoding \"gräfenroda\"\n        Then the result set contains\n            | object |\n            | N3  |\n        When geocoding \"graefenroda\"\n        Then the result set contains\n            | object |\n            | N3  |\n        When geocoding \"grafenroda\"\n        Then the result set contains\n            | object |\n            | N3  |\n"
  },
  {
    "path": "test/bdd/features/db/import/parenting.feature",
    "content": "Feature: Parenting of objects\n    Tests that the correct parent is chosen\n\n    Scenario: Address inherits postcode from its street unless it has a postcode\n        Given the grid with origin DE\n         | 10 |   |   |   |   | 11 |\n         |    |   |   |   |   |    |\n         |    | 1 |   | 2 |   |    |\n        And the places\n         | osm | class | type  | housenr |\n         | N1  | place | house | 4       |\n        And the places\n         | osm | class | type  | housenr | postcode |\n         | N2  | place | house | 5       | 99999    |\n        And the places\n         | osm | class   | type        | name  | postcode | geometry |\n         | W1  | highway | residential | galoo | 12345    | 10,11    |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W1 |\n         | N2     | W1 |\n        When geocoding \"4 galoo\"\n        Then result 0 contains\n         | object | display_name |\n         | N1     | 4, galoo, 12345, Deutschland |\n        When geocoding \"5 galoo\"\n        Then result 0 contains\n         | object | display_name |\n         | N2     | 5, galoo, 99999, Deutschland |\n\n    Scenario: Address without tags, closest street\n        Given the grid\n         | 10 |   |   |   |   | 11 |\n         |    | 1 | 2 |   |   |    |\n         |    |   |   | 3 | 4 |    |\n         | 20 |   |   |   |   | 21 |\n        And the places\n         | osm | class | type  |\n         | N1  | place | house |\n         | N2  | place | house |\n         | N3  | place | house |\n         | N4  | place | house |\n        And the named places\n         | osm | class   | type        | geometry |\n         | W1  | highway | residential | 10,11    |\n         | W2  | highway | residential | 20,21    |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W1 |\n         | N2     | W1 |\n         | N3     | W2 |\n         | N4     | W2 |\n\n    Scenario: Address without tags avoids unnamed streets\n        Given the grid\n         | 10 |   |   |   |   | 11 |\n         |    | 1 | 2 |   |   |    |\n         |    |   |   | 3 | 4 |    |\n         | 20 |   |   |   |   | 21 |\n        And the places\n         | osm | class   | type  |\n         | N1  | place   | house |\n         | N2  | place   | house |\n         | N3  | place   | house |\n         | N4  | place   | house |\n        And the places\n         | osm | class   | type        | geometry |\n         | W1  | highway | residential | 10,11    |\n        And the named places\n         | osm | class   | type        | geometry |\n         | W2  | highway | residential | 20,21 |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W2 |\n         | N2     | W2 |\n         | N3     | W2 |\n         | N4     | W2 |\n\n    Scenario: addr:street tag parents to appropriately named street\n        Given the grid\n         | 10 |   |   |   |   | 11 |\n         |    | 1 | 2 |   |   |    |\n         |    |   |   | 3 | 4 |    |\n         | 20 |   |   |   |   | 21 |\n        And the places\n         | osm | class | type  | street|\n         | N1  | place | house | south |\n         | N2  | place | house | north |\n         | N3  | place | house | south |\n         | N4  | place | house | north |\n        And the places\n         | osm | class   | type        | name  | geometry |\n         | W1  | highway | residential | north | 10,11    |\n         | W2  | highway | residential | south | 20,21    |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W2 |\n         | N2     | W1 |\n         | N3     | W2 |\n         | N4     | W1 |\n\n    Scenario: addr:street tag parents to appropriately named street, locale names\n        Given the grid\n         | 10 |   |   |   |   | 11 |\n         |    | 1 | 2 |   |   |    |\n         |    |   |   | 3 | 4 |    |\n         | 20 |   |   |   |   | 21 |\n        And the places\n         | osm | class | type  | street| addr+street:de |\n         | N1  | place | house | south | Süd            |\n         | N2  | place | house | north | Nord           |\n         | N3  | place | house | south | Süd            |\n         | N4  | place | house | north | Nord           |\n        And the places\n         | osm | class   | type        | name  | geometry |\n         | W1  | highway | residential | Nord  | 10,11    |\n         | W2  | highway | residential | Süd   | 20,21    |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W2 |\n         | N2     | W1 |\n         | N3     | W2 |\n         | N4     | W1 |\n\n    Scenario: addr:street tag parents to appropriately named street with abbreviation\n        Given the grid\n         | 10 |   |   |   |   | 11 |\n         |    | 1 | 2 |   |   |    |\n         |    |   |   | 3 | 4 |    |\n         | 20 |   |   |   |   | 21 |\n        And the places\n         | osm | class | type  | street   |\n         | N1  | place | house | south st |\n         | N2  | place | house | north st |\n         | N3  | place | house | south st |\n         | N4  | place | house | north st |\n        And the places\n         | osm | class   | type        | name+name:en | geometry |\n         | W1  | highway | residential | north street | 10,11    |\n         | W2  | highway | residential | south street | 20,21    |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W2 |\n         | N2     | W1 |\n         | N3     | W2 |\n         | N4     | W1 |\n\n    Scenario: addr:street tag parents to next named street\n        Given the grid\n         | 10 |   |   |   |   | 11 |\n         |    | 1 | 2 |   |   |    |\n         |    |   |   | 3 | 4 |    |\n         | 20 |   |   |   |   | 21 |\n        And the places\n         | osm | class | type  | street |\n         | N1  | place | house | abcdef |\n         | N2  | place | house | abcdef |\n         | N3  | place | house | abcdef |\n         | N4  | place | house | abcdef |\n        And the places\n         | osm | class   | type        | name   | geometry |\n         | W1  | highway | residential | abcdef | 10,11    |\n         | W2  | highway | residential | abcdef | 20,21    |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W1 |\n         | N2     | W1 |\n         | N3     | W2 |\n         | N4     | W2 |\n\n    Scenario: addr:street tag without appropriately named street\n        Given the grid\n         | 10 |   |   |   |   | 11 |\n         |    | 1 |   |   |   |    |\n         |    |   |   | 3 |   |    |\n         | 20 |   |   |   |   | 21 |\n        And the places\n         | osm | class | type  | street |\n         | N1  | place | house | abcdef |\n         | N3  | place | house | abcdef |\n        And the places\n         | osm | class   | type        | name  | geometry |\n         | W1  | highway | residential | abcde | 10,11    |\n         | W2  | highway | residential | abcde | 20,21    |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W1 |\n         | N3     | W2 |\n\n    Scenario: addr:place address\n        Given the grid\n         | 10 |   | |   |\n         |    | 1 | | 2 |\n         | 11 |   | |   |\n        And the places\n         | osm | class | type   | addr_place |\n         | N1  | place | house  | myhamlet   |\n        And the places\n         | osm | class   | type        | name     | geometry |\n         | N2  | place   | hamlet      | myhamlet | 2 |\n         | W1  | highway | residential | myhamlet | 10,11 |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | N2 |\n\n    Scenario: addr:street is preferred over addr:place\n        Given the grid\n         | 10 |  |   |   |\n         |    |  | 1 | 2 |\n         | 11 |  |   |   |\n        And the places\n         | osm | class | type   | addr_place | street  |\n         | N1  | place | house  | myhamlet   | mystreet|\n        And the places\n         | osm | class   | type        | name     | geometry |\n         | N2  | place   | hamlet      | myhamlet | 2        |\n         | W1  | highway | residential | mystreet | 10,11    |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W1 |\n\n    Scenario: House members in associatedStreet relation get correct parent\n        Given the grid\n         | 10 |   |   |   |   | 11 |\n         |    | 2 |   | 3 |   |    |\n         |    |   |   |   |   |    |\n         | 12 | 1 |   |   |   |    |\n        And the places\n         | osm | class | type  |\n         | N1  | place | house |\n         | N2  | place | house |\n         | N3  | place | house |\n        And the places\n         | osm | class   | type        | name | geometry |\n         | W1  | highway | residential | foo  | 10,11    |\n         | W2  | highway | service     | bar  | 10,12    |\n        And the relations\n         | id | members                              | tags+type        |\n         | 1  | W1:street,N1:house,N2:house,N3:house | associatedStreet |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W1 |\n         | N2     | W1 |\n         | N3     | W1 |\n\n    Scenario: Avoid unnamed streets in simple associated street relation\n        Given the grid\n         | 10 |   |   |   |   | 11 |\n         |    | 2 |   | 3 |   |    |\n         |    |   |   |   |   |    |\n         | 12 | 1 |   |   |   |    |\n        And the places\n         | osm | class | type  |\n         | N1  | place | house |\n         | N2  | place | house |\n         | N3  | place | house |\n        And the places\n         | osm | class   | type        | geometry |\n         | W2  | highway | residential | 10,12    |\n        And the named places\n         | osm | class   | type        | geometry |\n         | W1  | highway | residential | 10,11    |\n        And the relations\n         | id | members                      | tags+type |\n         | 1  | N1,N2,N3,W2:street,W1:street | associatedStreet |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W1 |\n         | N2     | W1 |\n         | N3     | W1 |\n\n    Scenario: Associated street relation overrides addr:street\n        Given the grid\n         | 10 |    |   |    | 11 |\n         |    |    |   |    |    |\n         |    |    | 1 |    |    |\n         |    | 20 |   | 21 |    |\n        And the places\n         | osm | class | type  | street |\n         | N1  | place | house | bar    |\n        And the places\n         | osm | class   | type        | name | geometry |\n         | W1  | highway | residential | foo  | 10,11    |\n         | W2  | highway | residential | bar  | 20,21    |\n        And the relations\n         | id | members            | tags+type        |\n         | 1  | W1:street,N1:house | associatedStreet |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W1              |\n\n    Scenario: Building without tags, closest street from center point\n        Given the grid\n         | 10 |  |   |   | 11 |\n         |    |  | 1 | 2 |    |\n         | 12 |  | 4 | 3 |    |\n        And the named places\n         | osm | class    | type        | geometry    |\n         | W1  | building | yes         | (1,2,3,4,1) |\n         | W2  | highway  | primary     | 10,11       |\n         | W3  | highway  | residential | 10,12       |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | W1     | W2 |\n\n    Scenario: Building with addr:street tags\n        Given the grid\n         | 10 |  |   |   | 11 |\n         |    |  | 1 | 2 |    |\n         | 12 |  | 4 | 3 |    |\n        And the named places\n         | osm | class    | type | street | geometry |\n         | W1  | building | yes  | foo    | (1,2,3,4,1) |\n        And the places\n         | osm | class    | type        | name | geometry |\n         | W2  | highway  | primary     | bar  | 10,11    |\n         | W3  | highway  | residential | foo  | 10,12    |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | W1     | W3 |\n\n    Scenario: Building with addr:place tags\n        Given the grid\n         | 10 |   |   |   |   |\n         |    | 1 | 2 |   | 9 |\n         | 11 | 4 | 3 |   |   |\n        And the places\n         | osm | class    | type        | name | geometry |\n         | N9  | place    | village     | bar  | 9        |\n         | W2  | highway  | primary     | bar  | 10,11    |\n        And the named places\n         | osm | class    | type | addr_place | geometry    |\n         | W1  | building | yes  | bar        | (1,2,3,4,1) |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | W1     | N9 |\n\n    Scenario: Building in associated street relation\n        Given the grid\n         | 10 |  |   |   | 11 |\n         |    |  | 1 | 2 |    |\n         | 12 |  | 4 | 3 |    |\n        And the named places\n         | osm | class    | type | geometry    |\n         | W1  | building | yes  | (1,2,3,4,1) |\n        And the places\n         | osm | class    | type        | name | geometry |\n         | W2  | highway  | primary     | bar  | 10,11 |\n         | W3  | highway  | residential | foo  | 10,12 |\n        And the relations\n         | id | members            | tags+type |\n         | 1  | W1:house,W3:street | associatedStreet |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | W1     | W3 |\n\n    Scenario: Building in associated street relation overrides addr:street\n        Given the grid\n         | 10 |  |   |   | 11 |\n         |    |  | 1 | 2 |    |\n         | 12 |  | 4 | 3 |    |\n        And the named places\n         | osm | class    | type | street | geometry    |\n         | W1  | building | yes  | foo    | (1,2,3,4,1) |\n        And the places\n         | osm | class    | type        | name | geometry |\n         | W2  | highway  | primary     | bar  | 10,11 |\n         | W3  | highway  | residential | foo  | 10,12 |\n        And the relations\n         | id | members            | tags+type |\n         | 1  | W1:house,W2:street | associatedStreet |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | W1     | W2 |\n\n    Scenario: Wrong member in associated street relation is ignored\n        Given the grid\n         | 10 |   |   |   |   |   |   | 11 |\n         |    | 1 |   | 3 | 4 |   |   |    |\n         |    |   |   | 6 | 5 |   |   |    |\n         And the named places\n         | osm | class | type  | geometry |\n         | N1  | place | house | 11       |\n        And the named places\n         | osm | class    | type | street | geometry    |\n         | W1  | building | yes  | foo    | (3,4,5,6,3) |\n        And the places\n         | osm | class    | type        | name | geometry |\n         | W3  | highway  | residential | foo  | 10,11    |\n        And the relations\n         | id | members                      | tags+type |\n         | 1  | N1:house,W1:street,W3:street | associatedStreet |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W3 |\n\n    Scenario: street member in associatedStreet relation can be a relation\n        Given the grid\n          | 1 |   |   | 2 |\n          | 3 |   |   | 4 |\n          |   |   |   |   |\n          |   | 9 |   |   |\n          | 5 |   |   | 6 |\n        And the places\n          | osm | class | type  | housenr | geometry |\n          | N9  | place | house | 34      | 9        |\n        And the named places\n          | osm | class   | type       | name      | geometry    |\n          | R14 | highway | pedestrian | Right St  | (1,2,4,3,1) |\n          | W14 | highway | pedestrian | Left St   | 5,6         |\n        And the relations\n          | id | members             | tags+type |\n          | 1  | N9:house,R14:street | associatedStreet |\n        When importing\n        Then placex contains\n          | object | parent_place_id |\n          | N9     | R14             |\n\n\n    Scenario: Choose closest street in associatedStreet relation\n        Given the grid\n         | 1  |   |    |  | 3  |\n         | 10 |   | 11 |  | 12 |\n        And the places\n         | osm | class | type  | housenr | geometry |\n         | N1  | place | house | 1       | 1        |\n         | N3  | place | house | 3       | 3        |\n        And the named places\n         | osm  | class    | type        | geometry |\n         | W100 | highway  | residential | 10,11    |\n         | W101 | highway  | residential | 11,12    |\n        And the relations\n         | id | members                                            | tags+type |\n         | 1  | N1:house,N3:house,W100:street,W101:street | associatedStreet |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W100            |\n         | N3     | W101            |\n\n\n    Scenario: POIs in building inherit address\n        Given the grid\n         | 10 |  |   |   |   |   | 11 |\n         |    |  | 5 | 2 | 6 |   |    |\n         |    |  | 3 | 1 |   |   |    |\n         | 12 |  | 8 |   | 7 |   |    |\n        And the named places\n         | osm | class   | type       |\n         | N1  | amenity | bank       |\n         | N2  | shop    | bakery     |\n         | N3  | shop    | supermarket|\n        And the places\n         | osm | class    | type | street | housenr | geometry    |\n         | W1  | building | yes  | foo    | 3       | (5,6,7,8,5) |\n        And the places\n         | osm | class    | type        | name | geometry |\n         | W2  | highway  | primary     | bar  | 10,11    |\n         | W3  | highway  | residential | foo  | 10,12    |\n        When importing\n        Then placex contains\n         | object | parent_place_id | housenumber |\n         | W1     | W3              | 3 |\n         | N1     | W3              | 3 |\n         | N2     | W3              | 3 |\n         | N3     | W3              | 3 |\n        When geocoding \"3, foo\"\n        Then the result set contains\n         | address+house_number |\n         | 3           |\n\n    Scenario: POIs don't inherit from streets\n        Given the grid\n         | 10 |   |   |   | 11 |\n         |    | 5 | 1 | 6 |    |\n         |    | 8 |   | 7 |    |\n        And the named places\n         | osm | class   | type  |\n         | N1  | amenity | bank  |\n        And the places\n         | osm | class    | type | name | street | housenr | geometry    |\n         | W1  | highway  | path | bar  | foo    | 3       | (5,6,7,8,5) |\n        And the places\n         | osm | class    | type        | name | geometry |\n         | W3  | highway  | residential | foo  | 10,11    |\n        When importing\n        Then placex contains\n         | object | parent_place_id | housenumber |\n         | N1     | W1              | None |\n\n    Scenario: POIs with own address do not inherit building address\n        Given the grid\n         | 10 |  |   |   |   |   | 11 |\n         |    |  | 6 | 2 | 7 |   |    |\n         |    |  | 3 | 1 |   | 5 |  4 |\n         | 12 |  | 9 |   | 8 |   |    |\n        And the named places\n         | osm | class   | type       | street |\n         | N1  | amenity | bank       | bar    |\n        And the named places\n         | osm | class   | type       | housenr |\n         | N2  | shop    | bakery     | 4       |\n        And the named places\n         | osm | class   | type       | addr_place  |\n         | N3  | shop    | supermarket| nowhere     |\n        And the places\n         | osm | class | type              | name     |\n         | N4  | place | isolated_dwelling | theplace |\n         | N5  | place | isolated_dwelling | nowhere  |\n        And the places\n         | osm | class    | type | addr_place | housenr | geometry    |\n         | W1  | building | yes  | theplace   | 3       | (6,7,8,9,6) |\n        And the places\n         | osm | class    | type        | name | geometry |\n         | W2  | highway  | primary     | bar  | 10,11    |\n         | W3  | highway  | residential | foo  | 10,12    |\n        When importing\n        Then placex contains\n         | object | parent_place_id | housenumber |\n         | W1     | N4              | 3 |\n         | N1     | W2              | None |\n         | N2     | W2              | 4 |\n         | N3     | N5              | None |\n\n    Scenario: POIs parent a road if they are attached to it\n        Given the grid\n         |    | 10 |    |\n         | 20 | 1  | 21 |\n         |    | 11 |    |\n        And the named places\n         | osm | class   | type     |\n         | N1  | highway | bus_stop |\n        And the places\n         | osm | class   | type         | name     | geometry |\n         | W1  | highway | secondary    | North St | 10,11 |\n         | W2  | highway | unclassified | South St | 20,1,21 |\n        And the ways\n         | id | nodes |\n         | 1  | 10,11 |\n         | 2  | 20,1,21 |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W2 |\n\n    Scenario: POIs do not parent non-roads they are attached to\n        Given the grid\n         | 10 |   | 1 |   |  11 |  | 30 |\n         | 14 |   |   |   |  15 |  |    |\n         | 13 |   | 2 |   |  12 |  | 31 |\n        And the named places\n         | osm | class   | type     | street   |\n         | N1  | highway | bus_stop | North St |\n         | N2  | highway | bus_stop | South St |\n        And the places\n         | osm | class   | type         | name     | geometry |\n         | W1  | landuse | residential  | North St | (14,15,12,2,13,14) |\n         | W2  | waterway| river        | South St | 10,1,11  |\n         | W3  | highway | residential  | foo      | 30,31    |\n        And the ways\n         | id | nodes |\n         | 1  | 10,11,12,2,13,10 |\n         | 2  | 10,1,11 |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W3 |\n         | N2     | W3 |\n\n    Scenario: POIs on building outlines inherit associated street relation\n        Given the grid\n         | 10 |   |   |   | 11 |\n         |    | 5 | 1 | 6 |    |\n         | 12 | 8 |   | 7 |    |\n        And the named places\n         | osm | class    | type  | geometry     |\n         | N1  | place    | house | 1            |\n         | W1  | building | yes   | (5,1,6,7,8,5)|\n        And the places\n         | osm | class    | type        | name | geometry |\n         | W2  | highway  | primary     | bar  | 10,11    |\n         | W3  | highway  | residential | foo  | 10,12    |\n        And the relations\n         | id | members            | tags+type |\n         | 1  | W1:house,W3:street | associatedStreet |\n        And the ways\n         | id | nodes |\n         | 1  | 5,1,6,7,8,5 |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W3 |\n\n    # github #1056\n    Scenario: Full names should be preferably matched for nearest road\n        Given the grid\n            | 1 |   | 2 | 5 |\n            |   |   |   |   |\n            | 3 |   |   | 4 |\n            |   | 10|   |   |\n        And the places\n            | osm | class   | type    | name+name               | geometry |\n            | W1  | highway | residential | Via Cavassico superiore | 1, 2 |\n            | W3  | highway | residential | Via Cavassico superiore | 2, 5 |\n            | W2  | highway | primary | Via Frazione Cavassico  | 3, 4     |\n        And the named places\n            | osm | class   | type    | addr+street             |\n            | N10 | shop    | yes     | Via Cavassico superiore |\n        When importing\n        Then placex contains\n          | object | parent_place_id |\n          | N10    | W1 |\n\n     Scenario: place=square may be parented via addr:place\n        Given the grid\n            |   |   | 9 |   |   |\n            |   | 5 |   | 6 |   |\n            |   | 8 |   | 7 |   |\n        And the places\n            | osm | class    | type    | name+name | geometry        |\n            | W2  | place    | square  | Foo pl    | (5, 6, 7, 8, 5) |\n        And the places\n            | osm | class    | type    | name+name | housenr | addr_place | geometry |\n            | N10 | shop     | grocery | le shop   | 5       | Foo pl     | 9        |\n        When importing\n        Then placex contains\n            | object | rank_address |\n            | W2     | 25           |\n        Then placex contains\n            | object | parent_place_id |\n            | N10    | W2              |\n\n"
  },
  {
    "path": "test/bdd/features/db/import/placex.feature",
    "content": "Feature: Import into placex\n    Tests that data in placex is completed correctly.\n\n    Scenario: No country code tag is available\n        Given the named places\n          | osm | class   | type     | geometry   |\n          | N1  | highway | primary  | country:us |\n        When importing\n        Then placex contains\n          | object | address | country_code |\n          | N1     | -       | us           |\n\n    Scenario: Location overwrites country code tag\n        Given the named places\n          | osm | class   | type     | country | geometry |\n          | N1  | highway | primary  | de      | country:us |\n        When importing\n        Then placex contains\n          | object | addr+country | country_code |\n          | N1     | de           | us           |\n\n    Scenario: Country code tag overwrites location for countries\n        Given the named places\n          | osm | class    | type            | admin | country | geometry |\n          | R1  | boundary | administrative  | 2     | de      | (-100 40, -101 40, -101 41, -100 41, -100 40) |\n        When importing\n        Then placex contains\n          | object | rank_search| addr+country | country_code |\n          | R1     | 4          | de           | de           |\n\n    Scenario: Illegal country code tag for countries is ignored\n        Given the named places\n          | osm | class    | type            | admin | country | geometry |\n          | R1  | boundary | administrative  | 2     | xx      | (-100 40, -101 40, -101 41, -100 41, -100 40) |\n        When importing\n        Then placex contains\n          | object | addr+country | country_code |\n          | R1     | xx           | us           |\n\n    Scenario: admin level is copied over\n        Given the named places\n          | osm | class | type      | admin |\n          | N1  | place | state     | 3     |\n        When importing\n        Then placex contains\n          | object | admin_level |\n          | N1     | 3           |\n\n    Scenario: search and address ranks for boundaries are correctly assigned\n        Given the named places\n          | osm | class    | type |\n          | N1  | boundary | administrative |\n        And the named places\n          | osm | class    | type           | geometry |\n          | W10 | boundary | administrative | 10 10, 11 11 |\n        And the named places\n          | osm | class    | type           | admin | geometry |\n          | R20 | boundary | administrative | 2     | (1 1, 2 2, 1 2, 1 1) |\n          | R21 | boundary | administrative | 32    | (3 3, 4 4, 3 4, 3 3) |\n          | R22 | boundary | nature_park    | 6     | (0 0, 1 0, 0 1, 0 0) |\n          | R23 | boundary | natural_reserve| 10    | (0 0, 1 1, 1 0, 0 0) |\n        And the named places\n          | osm | class | type    | geometry |\n          | R40 | place | country | (1 1, 2 2, 1 2, 1 1) |\n          | R41 | place | state   | (3 3, 4 4, 3 4, 3 3) |\n        When importing\n        Then placex has no entry for N1\n        And placex has no entry for W10\n        And placex contains\n          | object | rank_search | rank_address |\n          | R20    | 4           | 4 |\n          | R21    | 25          | 0 |\n          | R22    | 25          | 0 |\n          | R23    | 25          | 0 |\n          | R40    | 4           | 0 |\n          | R41    | 8           | 0 |\n\n    Scenario: search and address ranks for highways correctly assigned\n        Given the grid\n          | 10 | 1 | 11 |   | 12 |   | 13 |  | 14 | | 15 |   | 16 |\n        And the places\n          | osm | class    | type  |\n          | N1  | highway  | bus_stop |\n        And the places\n          | osm | class    | type         | geometry |\n          | W1  | highway  | primary      | 10,11 |\n          | W2  | highway  | secondary    | 11,12 |\n          | W3  | highway  | tertiary     | 12,13 |\n          | W4  | highway  | residential  | 13,14 |\n          | W5  | highway  | unclassified | 14,15 |\n          | W6  | highway  | something    | 15,16 |\n        When importing\n        Then placex contains\n          | object | rank_search | rank_address |\n          | N1     | 30          | 30 |\n          | W1     | 26          | 26 |\n          | W2     | 26          | 26 |\n          | W3     | 26          | 26 |\n          | W4     | 26          | 26 |\n          | W5     | 26          | 26 |\n          | W6     | 30          | 30 |\n\n    Scenario: rank and inclusion of landuses\n        Given the 0.4 grid\n          | 1 | 2 | | | | | | 5 |\n          | 4 | 3 | | | | | | 6 |\n        Given the named places\n          | osm | class   | type |\n          | N2  | landuse | residential |\n        And the named places\n          | osm | class   | type        | geometry    |\n          | W2  | landuse | residential | 1,2,5       |\n          | W4  | landuse | residential | (1,4,3,1)   |\n          | R2  | landuse | residential | (1,2,3,4,1) |\n          | R3  | landuse | forrest     | (1,5,6,4,1) |\n        When importing\n        Then placex contains\n          | object | rank_search | rank_address |\n          | N2     | 30          | 30 |\n          | W2     | 30          | 30 |\n          | W4     | 24          | 24 |\n          | R2     | 24          | 24 |\n          | R3     | 24          |  0 |\n\n    Scenario: rank and inclusion of naturals\n        Given the 0.4 grid\n          | 1 | 2 | | | | | | 5 |\n          | 4 | 3 | | | | | | 6 |\n       Given the named places\n          | osm | class   | type |\n          | N2  | natural | peak |\n          | N4  | natural | volcano |\n          | N5  | natural | foobar |\n       And the named places\n          | osm | class   | type           | geometry    |\n          | W2  | natural | mountain_range | 1,2,5       |\n          | W3  | natural | foobar         | 2,3         |\n          | R3  | natural | volcano        | (1,2,4,1)   |\n          | R4  | natural | foobar         | (1,2,3,4,1) |\n          | R5  | natural | sea            | (1,2,5,6,3,4,1) |\n          | R6  | natural | sea            | (2,3,4,2)   |\n       When importing\n       Then placex contains\n          | object | rank_search | rank_address |\n          | N2     | 18          | 0 |\n          | N4     | 18          | 0 |\n          | N5     | 22          | 0 |\n          | W2     | 18          | 0 |\n          | R3     | 18          | 0 |\n          | R4     | 22          | 0 |\n          | R5     | 4           | 0 |\n          | R6     | 4           | 0 |\n          | W3     | 22          | 0 |\n\n    Scenario: boundary ways for countries and states are ignored\n        Given the 0.3 grid\n          | 1 | 2 |\n          | 4 | 3 |\n        Given the named places\n          | osm | class    | type           | admin | geometry |\n          | W4  | boundary | administrative | 2     | (1,2,3,4,1) |\n          | R4  | boundary | administrative | 2     | (1,2,3,4,1) |\n          | W5  | boundary | administrative | 3     | (1,2,3,4,1) |\n          | R5  | boundary | administrative | 3     | (1,2,3,4,1) |\n          | W6  | boundary | administrative | 4     | (1,2,3,4,1) |\n          | R6  | boundary | administrative | 4     | (1,2,3,4,1) |\n          | W7  | boundary | administrative | 5     | (1,2,3,4,1) |\n          | R7  | boundary | administrative | 5     | (1,2,3,4,1) |\n       When importing\n       Then placex contains exactly\n           | object |\n           | R4     |\n           | R5     |\n           | R6     |\n           | W7     |\n           | R7     |\n"
  },
  {
    "path": "test/bdd/features/db/import/postcodes.feature",
    "content": "Feature: Import of postcodes\n    Tests for postcode estimation\n\n    Scenario: Postcodes on the object are preferred over those on the address\n        Given the grid with origin FR\n            | 1 |    |    |    | 4 |  | 6 | | 8 |\n            |   | 10 |    | 11 |   |  |   | |   |\n            |   |    | 22 |    |   |  |   | |   |\n            | 2 |    |    |    | 3 |  | 5 | | 7 |\n        And the named places\n            | osm | class    | type           | admin | addr+postcode | geometry    |\n            | R1  | boundary | administrative | 6     | 10000         | (1,8,7,2,1) |\n            | R34 | boundary | administrative | 8     | 11000         | (1,6,5,2,1) |\n            | R4  | boundary | administrative | 10    | 11200         | (1,4,3,2,1) |\n        And the named places\n            | osm | class    | type        | addr+postcode | geometry |\n            | W93 | highway  | residential | 11250         | 10,11    |\n            | N22 | building | yes         | 11254         | 22       |\n        When importing\n        Then placex contains\n            | object | postcode |\n            | N22    | 11254    |\n            | W93    | 11250    |\n            | R4     | 11200    |\n            | R34    | 11000    |\n            | R1     | 10000    |\n\n    Scenario: Postcodes from a road are inherited by an attached building\n        Given the grid with origin DE\n            | 10 |   |   |   | 11 |\n            |    | 1 | 2 |   |    |\n            |    | 4 | 3 |   |    |\n        And the named places\n            | osm | class    | type        | addr+postcode | geometry |\n            | W93 | highway  | residential | 86034         | 10,11    |\n        And the named places\n            | osm | class    | type  | geometry    |\n            | W22 | building | yes   | (1,2,3,4,1) |\n        When importing\n        Then placex contains\n            | object | postcode | parent_place_id |\n            | W22    | 86034    | W93 |\n\n    Scenario: Postcodes from the lowest admin area are inherited by ways\n        Given the grid with origin FR\n            | 1 |    |    |    | 4 |  | 6 | | 8 |\n            |   | 10 |    | 11 |   |  |   | |   |\n            | 2 |    |    |    | 3 |  | 5 | | 7 |\n        And the named places\n            | osm | class    | type           | admin | addr+postcode | geometry |\n            | R1  | boundary | administrative | 6     | 10000         | (1,8,7,2,1) |\n            | R34 | boundary | administrative | 8     | 11000         | (1,6,5,2,1) |\n            | R4  | boundary | administrative | 10    | 11200         | (1,4,3,2,1) |\n        And the named places\n            | osm | class    | type           | geometry |\n            | W93 | highway  | residential    | 10,11    |\n        When importing\n        Then placex contains\n            | object | postcode |\n            | W93    | 11200    |\n\n    Scenario: Postcodes from the lowest admin area with postcode are inherited by ways\n        Given the grid with origin FR\n            | 1 |    |    |    | 4 |  | 6 | | 8 |\n            |   | 10 |    | 11 |   |  |   | |   |\n            | 2 |    |    |    | 3 |  | 5 | | 7 |\n        And the named places\n            | osm | class    | type           | admin | addr+postcode | geometry |\n            | R1  | boundary | administrative | 6     | 10000         | (1,8,7,2,1) |\n            | R34 | boundary | administrative | 8     | 11000         | (1,6,5,2,1) |\n        And the named places\n            | osm | class    | type           | admin | geometry    |\n            | R4  | boundary | administrative | 10    | (1,4,3,2,1) |\n        And the named places\n            | osm | class    | type           | geometry |\n            | W93 | highway  | residential    | 10,11    |\n        When importing\n        Then placex contains\n            | object | postcode | parent_place_id |\n            | W93    | 11000    | R4 |\n\n    Scenario: Postcodes from the lowest admin area are inherited by buildings\n        Given the grid with origin FR\n            | 1 |    |    |    | 4 |  | 6 | | 8 |\n            |   | 10 |    | 11 |   |  |   | |   |\n            |   | 13 |    | 12 |   |  |   | |   |\n            | 2 |    |    |    | 3 |  | 5 | | 7 |\n        And the named places\n            | osm | class    | type           | admin | addr+postcode | geometry |\n            | R1  | boundary | administrative | 6     | 10000         | (1,8,7,2,1) |\n            | R34 | boundary | administrative | 8     | 11000         | (1,6,5,2,1) |\n            | R4  | boundary | administrative | 10    | 11200         | (1,4,3,2,1) |\n        And the named places\n            | osm | class    | type  | geometry |\n            | W22 | building | yes   | (10,11,12,13,10) |\n        When importing\n        Then placex contains\n            | object | postcode |\n            | W22    | 11200    |\n\n    Scenario: Roads get postcodes from nearby named buildings without other info\n        Given the grid with origin US\n            | 10 |   |   |   | 11 |\n            |    | 1 | 2 |   |    |\n            |    | 4 | 3 |   |    |\n        And the named places\n            | osm | class    | type           | geometry |\n            | W93 | highway  | residential    | 10,11    |\n        And the named places\n            | osm | class    | type        | addr+postcode | geometry    |\n            | W22 | building | yes         | 45023         | (1,2,3,4,1) |\n        When importing\n        Then placex contains\n            | object | postcode |\n            | W93    | 45023    |\n\n    Scenario: Road areas get postcodes from nearby named buildings without other info\n        Given the grid with origin US\n            | 10 |   |   |   | 11 |\n            | 13 |   |   |   | 12 |\n            |    | 1 | 2 |   |    |\n            |    | 4 | 3 |   |    |\n        And the named places\n            | osm | class    | type       | geometry         |\n            | W93 | highway  | pedestrian | (10,11,12,13,10) |\n        And the named places\n            | osm | class    | type        | addr+postcode | geometry    |\n            | W22 | building | yes         | 45023         | (1,2,3,4,1) |\n        When importing\n        Then placex contains\n            | object | postcode |\n            | W93    | 45023    |\n\n    Scenario: Roads get postcodes from nearby unnamed buildings without other info\n        Given the grid with origin US\n            | 10 |   |   |   | 11 |\n            |    | 1 |   |   |    |\n        And the named places\n            | osm | class    | type           | geometry |\n            | W93 | highway  | residential    | 10,11    |\n        And the postcodes\n            | osm | postcode | centroid |\n            | W22 | 45023    | 1        |\n        When importing\n        Then placex contains\n            | object | postcode |\n            | W93    | 45023    |\n\n    Scenario: Postcodes from admin boundaries are preferred over estimated postcodes\n        Given the grid with origin FR\n            | 1 |    |    |    | 4 |  | 6 | | 8 |\n            |   | 10 |    | 11 |   |  |   | |   |\n            |   |    | 22 |    |   |  |   | |   |\n            | 2 |    |    |    | 3 |  | 5 | | 7 |\n        And the named places\n            | osm | class    | type           | admin | addr+postcode | geometry |\n            | R1  | boundary | administrative | 6     | 10000         | (1,8,7,2,1) |\n            | R34 | boundary | administrative | 8     | 11000         | (1,6,5,2,1) |\n            | R4  | boundary | administrative | 10    | 11200         | (1,4,3,2,1) |\n        And the named places\n            | osm | class    | type           | geometry |\n            | W93 | highway  | residential    | 10,1     |\n        And the named places\n            | osm | class    | type        | addr+postcode |\n            | N22 | building | yes         | 45023         |\n        When importing\n        Then placex contains\n            | object | postcode |\n            | W93    | 11200    |\n\n    Scenario: Postcodes are added to the postcode\n        Given the places\n           | osm | class | type  | addr+postcode | addr+housenumber | geometry |\n           | N34 | place | house | 01982         | 111              | country:de |\n        When importing\n        Then location_postcodes contains exactly\n           | country_code | postcode | centroid!wkt |\n           | de           | 01982    | country:de |\n\n    Scenario: Postcodes outside all countries are not added to the postcode table\n        Given the places\n            | osm | class | type  | addr+postcode | addr+housenumber | addr+place  | geometry  |\n            | N34 | place | house | 01982         | 111              | Null Island | 0 0.00001 |\n        And the places\n            | osm | class | type   | name        | geometry |\n            | N1  | place | hamlet | Null Island | 0 0      |\n        When importing\n        Then location_postcodes contains exactly\n            | place_id |\n        When geocoding \"111, 01982 Null Island\"\n        Then the result set contains\n            | object | display_name |\n            | N34    | 111, Null Island, 01982 |\n"
  },
  {
    "path": "test/bdd/features/db/import/rank_computation.feature",
    "content": "Feature: Rank assignment\n    Tests for assignment of search and address ranks.\n\n    Scenario: Ranks for place nodes are assigned according to their type\n        Given the named places\n          | osm  | class     | type      | geometry |\n          | N1   | foo       | bar       | 0 0 |\n          | N11  | place     | Continent | 0 0 |\n          | N12  | place     | continent | 0 0 |\n          | N13  | place     | sea       | 0 0 |\n          | N14  | place     | country   | 0 0 |\n          | N15  | place     | state     | 0 0 |\n          | N16  | place     | region    | 0 0 |\n          | N17  | place     | county    | 0 0 |\n          | N18  | place     | city      | 0 0 |\n          | N19  | place     | island    | 0 0 |\n          | N36  | place     | house     | 0 0 |\n        And the named places\n          | osm  | class     | type      | extra+capital | geometry |\n          | N101 | place     | city      | yes           | 0 0 |\n        When importing\n        Then placex contains\n          | object | rank_search | rank_address |\n          | N1     | 30          | 30 |\n          | N11    | 22          | 0 |\n          | N12    | 2           | 0 |\n          | N13    | 2           | 0 |\n          | N14    | 4           | 0 |\n          | N15    | 8           | 0 |\n          | N16    | 18          | 0 |\n          | N17    | 12          | 12 |\n          | N18    | 16          | 16 |\n          | N19    | 17          | 0 |\n          | N101   | 15          | 16 |\n          | N36    | 30          | 30 |\n\n    Scenario: Ranks for boundaries are assigned according to admin level\n        Given the named places\n          | osm | class    | type           | admin | geometry |\n          | R20 | boundary | administrative | 2     | (1 1, 2 2, 1 2, 1 1) |\n          | R21 | boundary | administrative | 32    | (3 3, 4 4, 3 4, 3 3) |\n          | R22 | boundary | administrative | 6     | (0 0, 1 0, 0 1, 0 0) |\n          | R23 | boundary | administrative | 10    | (0 0, 1 1, 1 0, 0 0) |\n        When importing\n        Then placex contains\n          | object | rank_search | rank_address |\n          | R20    | 4           | 4 |\n          | R21    | 25          | 0 |\n          | R22    | 12          | 12 |\n          | R23    | 20          | 20 |\n\n    Scenario: Ranks for addressable boundaries with place assignment go with place address ranks if available\n        Given the named places\n          | osm | class    | type           | admin | extra+place | geometry |\n          | R20 | boundary | administrative | 3     | state       | (1 1, 2 2, 1 2, 1 1) |\n          | R21 | boundary | administrative | 32    | suburb      | (3 3, 4 4, 3 4, 3 3) |\n          | R22 | boundary | administrative | 6     | town        | (0 0, 1 0, 0 1, 0 0) |\n          | R23 | boundary | administrative | 10    | village     | (0 0, 1 1, 1 0, 0 0) |\n        When importing\n        Then placex contains\n          | object | rank_search | rank_address |\n          | R20    | 6           | 6  |\n          | R21    | 25          | 0  |\n          | R22    | 12          | 16 |\n          | R23    | 20          | 16 |\n\n    Scenario: Place address ranks cannot overtake a parent address rank\n        Given the named places\n          | osm | class    | type           | admin | extra+place  | geometry |\n          | R20 | boundary | administrative | 8     | town         | (0 0, 0 2, 2 2, 2 0, 0 0) |\n          | R21 | boundary | administrative | 9     | municipality | (0 0, 0 1, 1 1, 1 0, 0 0) |\n          | R22 | boundary | administrative | 9     | suburb       | (0 0, 0 1, 1 1, 1 0, 0 0) |\n        When importing\n        Then placex contains\n          | object | rank_search | rank_address |\n          | R20    | 16          | 16 |\n          | R21    | 18          | 18 |\n          | R22    | 18          | 20 |\n        Then place_addressline contains\n            | object | address | cached_rank_address |\n            | R21    | R20     | 16                  |\n            | R22    | R20     | 16                  |\n\n    Scenario: Admin levels cannot overtake each other due to place address ranks\n        Given the named places\n          | osm | class    | type           | admin | extra+place  | geometry |\n          | R20 | boundary | administrative | 6     | town         | (0 0, 0 2, 2 2, 2 0, 0 0) |\n          | R21 | boundary | administrative | 8     |              | (0 0, 0 1, 1 1, 1 0, 0 0) |\n          | R22 | boundary | administrative | 8     | suburb       | (0 0, 0 1, 1 1, 1 0, 0 0) |\n        When importing\n        Then placex contains\n          | object | rank_search | rank_address |\n          | R20    | 12          | 16 |\n          | R21    | 16          | 18 |\n          | R22    | 16          | 20 |\n        Then place_addressline contains\n            | object | address | cached_rank_address |\n            | R21    | R20     | 16                  |\n            | R22    | R20     | 16                  |\n\n    Scenario: Admin levels cannot overtake each other due to place address ranks even when slightly misaligned\n        Given the named places\n          | osm | class    | type           | admin | extra+place  | geometry |\n          | R20 | boundary | administrative | 6     | town         | (0 0, 0 2, 2 2, 2 0, 0 0) |\n          | R21 | boundary | administrative | 8     |              | (0 0, -0.0001 1, 1 1, 1 0, 0 0) |\n        When importing\n        Then placex contains\n          | object | rank_search | rank_address |\n          | R20    | 12          | 16 |\n          | R21    | 16          | 18 |\n        Then place_addressline contains\n            | object | address | cached_rank_address |\n            | R21    | R20     | 16                  |\n\n    Scenario: Admin levels must not be larger than 25\n        Given the named places\n          | osm | class    | type           | admin | extra+place | geometry |\n          | R20 | boundary | administrative | 6     | quarter     | (0 0, 0 2, 2 2, 2 0, 0 0) |\n          | R21 | boundary | administrative | 7     |             | (0 0, 0 1, 1 1, 1 0, 0 0) |\n          | R22 | boundary | administrative | 8     |             | (0 0, 0 0.5, 0.5 0.5, 0.5 0, 0 0) |\n        When importing\n        Then placex contains\n          | object | rank_search | rank_address |\n          | R20    | 12          | 22 |\n          | R21    | 14          | 24 |\n          | R22    | 16          | 25 |\n\n    Scenario: admin levels contained in a place area must not overtake address ranks\n        Given the named places\n            | osm | class    | type           | admin | geometry |\n            | R10 | place    | city           | 15    | (0 0, 0 2, 2 0, 0 0) |\n            | R20 | boundary | administrative | 6     | (0 0, 0 1, 1 0, 0 0) |\n        When importing\n        Then placex contains\n            | object | rank_search | rank_address |\n            | R10    | 16          | 16           |\n            | R20    | 12          | 18           |\n\n    Scenario: admin levels overlapping a place area are not demoted\n        Given the named places\n            | osm | class    | type           | admin | geometry |\n            | R10 | place    | city           | 15    | (0 0, 0 2, 2 0, 0 0) |\n            | R20 | boundary | administrative | 6     | (-1 0, 0 1, 1 0, -1 0) |\n        When importing\n        Then placex contains\n            | object | rank_search | rank_address |\n            | R10    | 16          | 16           |\n            | R20    | 12          | 12           |\n\n    Scenario: admin levels with equal area as a place area are not demoted\n        Given the named places\n            | osm | class    | type           | admin | geometry |\n            | R10 | place    | city           | 15    | (0 0, 0 2, 2 0, 0 0) |\n            | R20 | boundary | administrative | 6     | (0 0, 0 2, 2 0, 0 0) |\n        When importing\n        Then placex contains\n            | object | rank_search | rank_address |\n            | R10    | 16          | 16           |\n            | R20    | 12          | 12           |\n\n\n    Scenario: adjacent admin_levels are considered the same object when they have the same wikidata\n        Given the named places\n          | osm | class    | type           | admin | extra+wikidata | geometry |\n          | N20 | place    | square         | 15    | Q123           | 0.1 0.1  |\n          | R23 | boundary | administrative | 10    | Q444           | (0 0, 0 1, 1 1, 1 0, 0 0) |\n          | R21 | boundary | administrative | 9     | Q444           | (0 0, 0 1, 1 1, 1 0, 0 0) |\n          | R22 | boundary | administrative | 8     | Q444           | (0 0, 0 1, 1 1, 1 0, 0 0) |\n        When importing\n        Then placex contains\n          | object | rank_search | rank_address |\n          | R23    | 20          | 0  |\n          | R21    | 18          | 0  |\n          | R22    | 16          | 16 |\n        Then place_addressline contains exactly\n            | object | address | cached_rank_address |\n            | N20    | R22     | 16                  |\n\n    Scenario: adjacent admin_levels are considered different objects when they have different wikidata\n        Given the named places\n          | osm | class    | type           | admin | extra+wikidata | geometry |\n          | N20 | place    | square         | 15    | Q123           | 0.1 0.1  |\n          | R21 | boundary | administrative | 9     | Q4441          | (0 0, 0 1, 1 1, 1 0, 0 0) |\n          | R22 | boundary | administrative | 8     | Q444           | (0 0, 0 1, 1 1, 1 0, 0 0) |\n        When importing\n        Then placex contains\n          | object | rank_search | rank_address |\n          | R21    | 18          | 18 |\n          | R22    | 16          | 16 |\n        Then place_addressline contains\n            | object | address | cached_rank_address |\n            | N20    | R22     | 16                  |\n            | N20    | R21     | 18                  |\n\n    Scenario: Mixes of admin boundaries and place areas I\n        Given the grid\n          | 1 |   | 10 |  |  | 2 |\n          |   | 9 |    |  |  |   |\n          | 20|   | 21 |  |  |   |\n          | 4 |   | 11 |  |  | 3 |\n        And the places\n          | osm | class    | type           | admin | name           | geometry      |\n          | R1  | boundary | administrative | 5     | Greater London | (1,2,3,4,1)   |\n          | R2  | boundary | administrative | 8     | Kensington     | (1,10,11,4,1) |\n        And the places\n          | osm | class    | type           | name           | geometry    |\n          | R10 | place    | city           | London         | (1,2,3,4,1) |\n          | N9  | place    | town           | Fulham         | 9           |\n          | W1  | highway  | residential    | Lots Grove     | 20,21       |\n        When importing\n        Then placex contains\n         | object | rank_search | rank_address |\n         | R1     | 10          | 10           |\n         | R10    | 16          | 16           |\n         | R2     | 16          | 18           |\n         | N9     | 18          | 18           |\n        And place_addressline contains\n         | object | address | isaddress | cached_rank_address |\n         | W1     | R1      | True      | 10                  |\n         | W1     | R10     | True      | 16                  |\n         | W1     | R2      | True      | 18                  |\n         | W1     | N9      | False     | 18                  |\n\n\n    Scenario: Mixes of admin boundaries and place areas II\n        Given the grid\n          | 1 |   | 10 |  | 5 | 2 |\n          |   | 9 |    |  |   |   |\n          | 20|   | 21 |  |   |   |\n          | 4 |   | 11 |  | 6 | 3 |\n        And the places\n          | osm | class    | type           | admin | name           | geometry    |\n          | R1  | boundary | administrative | 5     | Greater London | (1,2,3,4,1) |\n          | R2  | boundary | administrative | 8     | London         | (1,5,6,4,1) |\n        And the places\n          | osm | class    | type           | name           | geometry      |\n          | R10 | place    | city           | Westminster    | (1,10,11,4,1) |\n          | N9  | place    | town           | Fulham         | 9             |\n          | W1  | highway  | residential    | Lots Grove     | 20,21         |\n        When importing\n        Then placex contains\n         | object | rank_search | rank_address |\n         | R1     | 10          | 10           |\n         | R2     | 16          | 16           |\n         | R10    | 16          | 18           |\n         | N9     | 18          | 18           |\n        And place_addressline contains\n         | object | address | isaddress | cached_rank_address |\n         | W1     | R1      | True      | 10                  |\n         | W1     | R10     | True      | 18                  |\n         | W1     | R2      | True      | 16                  |\n         | W1     | N9      | False     | 18                  |\n\n\n    Scenario: POI nodes with place tags\n        Given the places\n          | osm | class   | type       | name | extratags       |\n          | N23 | amenity | playground | AB   | \"place\": \"city\" |\n          | N23 | place   | city       | AB   | \"amenity\": \"playground\" |\n        When importing\n        Then placex contains exactly\n          | object      | rank_search | rank_address |\n          | N23:amenity | 30          | 30           |\n          | N23:place   | 16          | 16           |\n\n    Scenario: Address rank 25 is only used for addr:place\n        Given the grid\n           | 10 | 33 | 34 | 11 |\n        Given the places\n          | osm | class | type    | name |\n          | N10 | place | village | vil  |\n          | N11 | place | farm    | farm |\n        And the places\n          | osm | class   | type        | name | geometry |\n          | W1  | highway | residential | RD   | 33,11    |\n        And the places\n          | osm | class   | type        | name | addr+farm | geometry |\n          | W2  | highway | residential | RD2  | farm       | 34,11    |\n        And the places\n          | osm | class | type  | housenr |\n          | N33 | place | house | 23      |\n        And the places\n          | osm | class | type  | housenr | addr+place |\n          | N34 | place | house | 23      | farm       |\n        When importing\n        Then placex contains\n          | object | parent_place_id |\n          | N11    | N10             |\n          | N33    | W1              |\n          | N34    | N11             |\n        And place_addressline contains\n          | object | address |\n          | W1     | N10     |\n          | W2     | N10     |\n          | W2     | N11     |\n"
  },
  {
    "path": "test/bdd/features/db/import/search_name.feature",
    "content": "Feature: Creation of search terms\n    Tests that search_name table is filled correctly\n\n    Scenario: Semicolon-separated names appear as separate full names\n        Given the places\n         | osm | class   | type | name+alt_name |\n         | N1  | place   | city | New York; Big Apple |\n         | N2  | place   | town | New York Big Apple |\n        When importing\n        And geocoding \"New York Big Apple\"\n        Then result 0 contains\n         | object |\n         | N2     |\n\n    Scenario: Comma-separated names appear as a single full name\n        Given the places\n         | osm | class   | type | name+name |\n         | N1  | place   | city | New York, Big Apple |\n         | N2  | place   | town | New York Big Apple |\n        When importing\n        And geocoding \"New York Big Apple\"\n        Then result 0 contains\n         | object |\n         | N1     |\n\n    Scenario: Name parts before brackets appear as full names\n        Given the places\n         | osm | class   | type | name+name |\n         | N1  | place   | city | Halle (Saale) |\n         | N2  | place   | town | Halle |\n        When importing\n        And geocoding \"Halle\"\n        Then result 0 contains\n         | object |\n         | N1     |\n        When geocoding \"Halle (Saale)\"\n        Then the result set contains\n         | object |\n         | N1 |\n\n    Scenario: Unknown addr: tags can be found for unnamed POIs\n        Given the grid\n         |    | 1 |  |    |\n         | 10 |   |  | 11 |\n        And the places\n         | osm | class   | type        | housenr | addr+city |\n         | N1  | place   | house       | 23      | Walltown  |\n        And the places\n         | osm | class   | type        | name+name   | geometry |\n         | W1  | highway | residential | Rose Street | 10,11    |\n        When importing\n        When geocoding \"23 Rose Street, Walltown\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | 23, Rose Street |\n        When geocoding \"Walltown, Rose Street 23\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | 23, Rose Street |\n        When geocoding \"Rose Street 23, Walltown\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | 23, Rose Street |\n\n    Scenario: Searching for unknown addr: tags also works for multiple words\n        Given the grid\n         |    | 1 |  |    |\n         | 10 |   |  | 11 |\n        And the places\n         | osm | class   | type        | housenr | addr+city        |\n         | N1  | place   | house       | 23      | Little Big Town  |\n        And the places\n         | osm | class   | type        | name+name   | geometry |\n         | W1  | highway | residential | Rose Street | 10,11    |\n        When importing\n        When geocoding \"23 Rose Street, Little Big Town\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | 23, Rose Street |\n        When geocoding \"Rose Street 23, Little Big Town\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | 23, Rose Street |\n        When geocoding \"Little big Town, Rose Street 23\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | 23, Rose Street |\n\n     Scenario: Unnamed POI can be found when it has known addr: tags\n        Given the grid\n         |    | 1 |  |    |\n         | 10 |   |  | 11 |\n        And the places\n         | osm | class   | type        | housenr | addr+city |\n         | N1  | place   | house       | 23      | Walltown  |\n        And the places\n         | osm | class   | type        | name+name   | addr+city | geometry |\n         | W1  | highway | residential | Rose Street | Walltown  | 10,11    |\n        When importing\n        When geocoding \"23 Rose Street, Walltown\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | 23, Rose Street |\n\n    Scenario: Unnamed POIs inherit parent name when unknown addr:place is present\n        Given the grid\n         | 100 |    |   |   |    | 101 |\n         |     |    | 1 |   |    |     |\n         | 103 | 10 |   |   | 11 | 102 |\n        And the places\n         | osm | class   | type        | housenr | addr+place |\n         | N1  | place   | house       | 23      | Walltown   |\n        And the places\n         | osm | class   | type        | name+name    | geometry |\n         | W1  | highway | residential | Rose Street  | 10,11    |\n         | R1  | place   | city        | Strange Town | (100,101,102,103,100) |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | R1              |\n        When geocoding \"23 Rose Street\"\n        Then all results contain\n         | object | display_name |\n         | W1     | Rose Street, Strange Town |\n        When geocoding \"23 Walltown, Strange Town\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | 23, Walltown, Strange Town |\n        When geocoding \"Walltown 23, Strange Town\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | 23, Walltown, Strange Town |\n        When geocoding \"Strange Town, Walltown 23\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | 23, Walltown, Strange Town |\n\n    Scenario: Named POIs can be searched by housenumber when unknown addr:place is present\n        Given the grid\n         | 100 |    |   |   |    | 101 |\n         |     |    | 1 |   |    |     |\n         | 103 | 10 |   |   | 11 | 102 |\n        And the places\n         | osm | class   | type  | name       | housenr | addr+place |\n         | N1  | place   | house | Blue house | 23      | Walltown   |\n        And the places\n         | osm | class   | type        | name+name    | geometry |\n         | W1  | highway | residential | Rose Street  | 10,11 |\n         | R1  | place   | city        | Strange Town | (100,101,102,103,100) |\n        When importing\n        When geocoding \"23 Walltown, Strange Town\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | Blue house, 23, Walltown, Strange Town |\n        When geocoding \"Walltown 23, Strange Town\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | Blue house, 23, Walltown, Strange Town |\n        When geocoding \"Strange Town, Walltown 23\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | Blue house, 23, Walltown, Strange Town |\n        When geocoding \"Strange Town, Walltown 23, Blue house\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | Blue house, 23, Walltown, Strange Town |\n        When geocoding \"Strange Town, Walltown, Blue house\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | Blue house, 23, Walltown, Strange Town |\n\n    Scenario: Named POIs can be found when unknown multi-word addr:place is present\n        Given the grid\n         | 100 |    |   |   |    | 101 |\n         |     |    | 1 |   |    |     |\n         | 103 | 10 |   |   | 11 | 102 |\n        And the places\n         | osm | class   | type  | name       | housenr | addr+place |\n         | N1  | place   | house | Blue house | 23      | Moon sun   |\n        And the places\n         | osm | class   | type        | name+name    | geometry |\n         | W1  | highway | residential | Rose Street  | 10,11    |\n         | R1  | place   | city        | Strange Town | (100,101,102,103,100) |\n        When importing\n        When geocoding \"23 Moon Sun, Strange Town\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | Blue house, 23, Moon sun, Strange Town |\n        When geocoding \"Blue house, Moon Sun, Strange Town\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | Blue house, 23, Moon sun, Strange Town |\n\n    Scenario: Unnamed POIs doesn't inherit parent name when addr:place is present only in parent address\n        Given the grid\n         | 100 |    |   |   |    | 101 |\n         |     |    | 1 |   |    |     |\n         | 103 | 10 |   |   | 11 | 102 |\n        And the places\n         | osm | class   | type        | housenr | addr+place |\n         | N1  | place   | house       | 23      | Walltown   |\n        And the places\n         | osm | class   | type        | name+name    | addr+city | geometry |\n         | W1  | highway | residential | Rose Street  | Walltown  | 10,11    |\n         | R1  | place   | suburb      | Strange Town | Walltown  | (100,101,102,103,100) |\n        When importing\n        When geocoding \"23 Rose Street, Walltown\"\n        Then all results contain\n         | object | display_name |\n         | W1     | Rose Street, Strange Town |\n        When geocoding \"23  Walltown\"\n        Then all results contain\n         | object | display_name |\n         | N1     | 23, Walltown, Strange Town |\n\n    Scenario: Unnamed POIs does inherit parent name when unknown addr:place and addr:street is present\n        Given the grid\n         |    | 1 |  |    |\n         | 10 |   |  | 11 |\n        And the places\n         | osm | class   | type   | housenr | addr+place | addr+street |\n         | N1  | place   | house  | 23      | Walltown   | Lily Street |\n        And the places\n         | osm | class   | type        | name+name   | geometry |\n         | W1  | highway | residential | Rose Street | 10,11    |\n        When importing\n        When geocoding \"23 Rose Street\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | 23, Rose Street |\n        When geocoding \"23 Lily Street\"\n        Then exactly 0 results are returned\n\n    Scenario: An unknown addr:street is ignored\n        Given the grid\n         |    | 1 |  |    |\n         | 10 |   |  | 11 |\n        And the places\n         | osm | class   | type   | housenr |  addr+street |\n         | N1  | place   | house  | 23      |  Lily Street |\n        And the places\n         | osm | class   | type        | name+name   | geometry |\n         | W1  | highway | residential | Rose Street | 10,11    |\n        When importing\n        When geocoding \"23 Rose Street\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | 23, Rose Street |\n        When geocoding \"23 Lily Street\"\n        Then exactly 0 results are returned\n\n    Scenario: Named POIs can be found through unknown address tags\n        Given the grid\n         |    | 1 |  |    |\n         | 10 |   |  | 11 |\n        And the places\n         | osm | class   | type        | name+name  | housenr | addr+city |\n         | N1  | place   | house       | Green Moss | 26      | Walltown  |\n        And the places\n         | osm | class   | type        | name+name   | geometry |\n         | W1  | highway | residential | Rose Street | 10,11    |\n        When importing\n        When geocoding \"Green Moss, Rose Street, Walltown\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | Green Moss, 26, Rose Street |\n        When geocoding \"Green Moss, 26, Rose Street, Walltown\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | Green Moss, 26, Rose Street |\n        When geocoding \"26, Rose Street, Walltown\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | Green Moss, 26, Rose Street |\n        When geocoding \"Rose Street 26, Walltown\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | Green Moss, 26, Rose Street |\n        When geocoding \"Walltown, Rose Street 26\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | Green Moss, 26, Rose Street |\n\n    Scenario: Named POI doesn't inherit parent name when addr:place is present only in parent address\n        Given the grid\n         | 100 |    |   |   |    | 101 |\n         |     |    | 1 |   |    |     |\n         | 103 | 10 |   |   | 11 | 102 |\n        And the places\n         | osm | class   | type        | name+name  | addr+place |\n         | N1  | place   | house       | Green Moss | Walltown   |\n        And the places\n         | osm | class   | type        | name+name    | geometry |\n         | W1  | highway | residential | Rose Street  | 10,11    |\n         | R1  | place   | suburb      | Strange Town | (100,101,102,103,100) |\n        When importing\n        When geocoding \"Green Moss, Rose Street, Walltown\"\n        Then exactly 0 results are returned\n        When geocoding \"Green Moss, Walltown\"\n        Then the result set contains\n         | object | display_name |\n         | N1     | Green Moss, Walltown, Strange Town |\n\n    Scenario: Named POIs inherit address from parent\n        Given the grid\n         |    | 1 |  |    |\n         | 10 |   |  | 11 |\n        And the places\n         | osm | class   | type        | name     | geometry |\n         | N1  | place   | house       | foo      | 1        |\n         | W1  | highway | residential | the road | 10,11    |\n        When importing\n        When geocoding \"foo, the road\"\n        Then all results contain\n         | object |\n         | N1     |\n\n    Scenario: Some addr: tags are added to address\n        Given the grid\n         |    | 2 | 3 |    |\n         | 10 |   |   | 11 |\n        And the places\n         | osm | class   | type        | name     |\n         | N2  | place   | city        | bonn     |\n         | N3  | place   | suburb      | smalltown|\n        And the places\n         | osm | class   | type    | name    | addr+city | addr+municipality | addr+suburb | geometry |\n         | W1  | highway | service | the end | bonn      | New York          | Smalltown   | 10,11    |\n        When importing\n        When geocoding \"the end, new york, bonn, smalltown\"\n        Then all results contain\n         | object |\n         | W1     |\n\n    Scenario: A known addr:* tag is added even if the name is unknown\n        Given the grid\n         | 10 | | | | 11 |\n        And the places\n         | osm | class   | type        | name | addr+city | geometry |\n         | W1  | highway | residential | Road | Nandu     | 10,11    |\n        When importing\n        And geocoding \"Road, Nandu\"\n        Then all results contain\n         | object |\n         | W1     |\n\n    Scenario: a linked place does not show up in search name\n        Given the 0.01 grid\n         | 10 |   | 11 |\n         |    | 2 |    |\n         | 13 |   | 12 |\n        Given the places\n         | osm  | class    | type           | name | admin | geometry |\n         | R13  | boundary | administrative | Roma | 9     | (10,11,12,13,10) |\n        And the places\n         | osm  | class    | type           | name |\n         | N2   | place    | city           | Cite |\n        And the relations\n         | id | members       | tags+type |\n         | 13 | N2:label      | boundary |\n        When importing\n        Then placex contains\n         | object | linked_place_id |\n         | N2     | R13             |\n        When geocoding \"Cite\"\n        Then all results contain\n         | object |\n         | R13 |\n\n    Scenario: a linked waterway does not show up in search name\n        Given the grid\n         | 1 | | 2 | | 3 |\n        And the places\n         | osm | class    | type  | name  | geometry |\n         | W1  | waterway | river | Rhein | 1,2      |\n         | W2  | waterway | river | Rhein | 2,3      |\n         | R13 | waterway | river | Rhein | 1,2,3    |\n        And the relations\n         | id | members            | tags+type |\n         | 13 | W1,W2:main_stream  | waterway |\n        When importing\n        Then placex contains\n         | object | linked_place_id |\n         | W1     | R13 |\n         | W2     | R13 |\n        When geocoding \"Rhein\"\n        Then all results contain\n         | object |\n         | R13 |\n"
  },
  {
    "path": "test/bdd/features/db/query/housenumbers.feature",
    "content": "Feature: Searching of house numbers\n    Test for specialised treeatment of housenumbers\n\n    Background:\n        Given the grid\n         | 1 |   | 2 |   | 3 |\n         |   | 9 |   |   |   |\n         |   |   |   |   | 4 |\n\n\n    Scenario: A simple ascii digit housenumber is found\n        Given the places\n         | osm | class    | type | housenr  | geometry |\n         | N1  | building | yes  | 45       | 9        |\n        And the places\n         | osm | class   | type | name       | geometry |\n         | W10 | highway | path | North Road | 1,2,3    |\n        When importing\n        And geocoding \"45, North Road\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"North Road 45\"\n        Then the result set contains\n         | object |\n         | N1  |\n\n\n    Scenario Outline: Numeral housenumbers in any script are found\n        Given the places\n         | osm | class    | type | housenr  | geometry |\n         | N1  | building | yes  | <number> | 9        |\n        And the places\n         | osm | class   | type | name       | geometry |\n         | W10 | highway | path | North Road | 1,2,3    |\n        When importing\n        And geocoding \"45, North Road\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"North Road ④⑤\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"North Road 𑁪𑁫\"\n        Then the result set contains\n         | object |\n         | N1  |\n\n    Examples:\n        | number |\n        | 45     |\n        | ④⑤     |\n        | 𑁪𑁫     |\n\n\n    Scenario Outline: Each housenumber in a list is found\n        Given the places\n         | osm | class    | type | housenr | geometry |\n         | N1  | building | yes  | <hnrs>  | 9        |\n        And the places\n         | osm | class   | type | name     | geometry |\n         | W10 | highway | path | Multistr | 1,2,3    |\n        When importing\n        When geocoding \"2 Multistr\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"4 Multistr\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"12 Multistr\"\n        Then the result set contains\n         | object |\n         | N1  |\n\n     Examples:\n        | hnrs |\n        | 2;4;12 |\n        | 2,4,12 |\n        | 2, 4, 12 |\n\n\n    Scenario Outline: Housenumber - letter combinations are found\n        Given the places\n         | osm | class    | type | housenr | geometry |\n         | N1  | building | yes  | <hnr>   | 9        |\n        And the places\n         | osm | class   | type | name     | geometry |\n         | W10 | highway | path | Multistr | 1,2,3    |\n        When importing\n        When geocoding \"2A Multistr\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"2 a Multistr\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"2-A Multistr\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"Multistr 2 A\"\n        Then the result set contains\n         | object |\n         | N1  |\n\n    Examples:\n        | hnr |\n        | 2a  |\n        | 2 A |\n        | 2-a |\n        | 2/A |\n\n\n    Scenario Outline: Number - Number combinations as a housenumber are found\n        Given the places\n         | osm | class    | type | housenr | geometry |\n         | N1  | building | yes  | <hnr>   | 9        |\n        And the places\n         | osm | class   | type | name       | geometry |\n         | W10 | highway | path | Chester St | 1,2,3    |\n        When importing\n        When geocoding \"34-10 Chester St\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"34/10 Chester St\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"34 10 Chester St\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"3410 Chester St\"\n        Then the result set contains\n         | object |\n         | W10 |\n\n    Examples:\n        | hnr   |\n        | 34-10 |\n        | 34 10 |\n        | 34/10 |\n\n\n    Scenario Outline: a bis housenumber is found\n        Given the places\n         | osm | class    | type | housenr | geometry |\n         | N1  | building | yes  | <hnr>   | 9        |\n        And the places\n         | osm | class   | type | name       | geometry |\n         | W10 | highway | path | Rue Paris | 1,2,3    |\n        When importing\n        When geocoding \"Rue Paris 45bis\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"Rue Paris 45 BIS\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"Rue Paris 45BIS\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"Rue Paris 45 bis\"\n        Then the result set contains\n         | object |\n         | N1  |\n\n    Examples:\n        | hnr   |\n        | 45bis |\n        | 45BIS |\n        | 45 BIS |\n        | 45 bis |\n\n\n    Scenario Outline: a ter housenumber is found\n        Given the places\n         | osm | class    | type | housenr | geometry |\n         | N1  | building | yes  | <hnr>   | 9        |\n        And the places\n         | osm | class   | type | name       | geometry |\n         | W10 | highway | path | Rue du Berger | 1,2,3    |\n        When importing\n        When geocoding \"Rue du Berger 45ter\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"Rue du Berger 45 TER\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"Rue du Berger 45TER\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"Rue du Berger 45 ter\"\n        Then the result set contains\n         | object |\n         | N1  |\n\n    Examples:\n        | hnr   |\n        | 45ter |\n        | 45TER |\n        | 45 ter |\n        | 45 TER |\n\n\n    Scenario Outline: a number - letter - number combination housenumber is found\n        Given the places\n         | osm | class    | type | housenr | geometry |\n         | N1  | building | yes  | <hnr>   | 9        |\n        And the places\n         | osm | class   | type | name       | geometry |\n         | W10 | highway | path | Herengracht | 1,2,3    |\n        When importing\n        When geocoding \"501-H 1 Herengracht\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"501H-1 Herengracht\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"501H1 Herengracht\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"501-H1 Herengracht\"\n        Then the result set contains\n         | object |\n         | N1  |\n\n    Examples:\n        | hnr |\n        | 501 H1 |\n        | 501H 1 |\n        | 501/H/1 |\n        | 501h1 |\n\n\n    Scenario Outline: Russian housenumbers are found\n        Given the places\n         | osm | class    | type | housenr | geometry |\n         | N1  | building | yes  | <hnr>   | 9        |\n        And the places\n         | osm | class   | type | name       | geometry |\n         | W10 | highway | path | Голубинская улица | 1,2,3    |\n        When importing\n        When geocoding \"Голубинская улица 55к3\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"Голубинская улица 55 k3\"\n        Then the result set contains\n         | object |\n         | N1  |\n        When geocoding \"Голубинская улица 55 к-3\"\n        Then the result set contains\n         | object |\n         | N1  |\n\n    Examples:\n        | hnr |\n        | 55к3 |\n        | 55 к3 |\n\n\n    Scenario: A name mapped as a housenumber is found\n        Given the places\n         | osm | class    | type | housenr | geometry |\n         | N1  | building | yes  | Warring | 9        |\n        And the places\n         | osm | class   | type | name       | geometry |\n         | W10 | highway | path | Chester St | 1,2,3    |\n        When importing\n        When geocoding \"Chester St Warring\"\n        Then the result set contains\n         | object |\n         | N1  |\n\n\n    Scenario: A housenumber with interpolation is found\n        Given the places\n         | osm | class    | type | housenr | addr+interpolation | geometry |\n         | N1  | building | yes  | 1-5     | odd                | 9        |\n        And the places\n         | osm | class   | type | name      | geometry |\n         | W10 | highway | path | Rue Paris | 1,2,3    |\n        When importing\n        When geocoding \"Rue Paris 1\"\n        Then the result set contains\n         | object | address+house_number |\n         | N1     | 1-5 |\n        When geocoding \"Rue Paris 3\"\n        Then the result set contains\n         | object | address+house_number |\n         | N1     | 1-5 |\n        When geocoding \"Rue Paris 5\"\n        Then the result set contains\n         | object | address+house_number |\n         | N1     | 1-5 |\n        When geocoding \"Rue Paris 2\"\n        Then the result set contains\n         | object |\n         | W10  |\n\n    Scenario: A housenumber with bad interpolation is ignored\n        Given the places\n         | osm | class    | type | housenr | addr+interpolation | geometry |\n         | N1  | building | yes  | 1-5     | bad                | 9        |\n        And the places\n         | osm | class   | type | name      | geometry |\n         | W10 | highway | path | Rue Paris | 1,2,3    |\n        When importing\n        When geocoding \"Rue Paris 1-5\"\n        Then the result set contains\n         | object | address+house_number |\n         | N1     | 1-5 |\n        When geocoding \"Rue Paris 3\"\n        Then the result set contains\n         | object |\n         | W10    |\n\n\n    Scenario: A bad housenumber with a good interpolation is just a housenumber\n        Given the places\n         | osm | class    | type | housenr | addr+interpolation | geometry |\n         | N1  | building | yes  | 1-100   | all                | 9        |\n        And the places\n         | osm | class   | type | name      | geometry |\n         | W10 | highway | path | Rue Paris | 1,2,3    |\n        When importing\n        When geocoding \"Rue Paris 1-100\"\n        Then the result set contains\n         | object | address+house_number |\n         | N1     | 1-100 |\n        When geocoding \"Rue Paris 3\"\n        Then the result set contains\n         | object |\n         | W10    |\n"
  },
  {
    "path": "test/bdd/features/db/query/interpolation.feature",
    "content": "Feature: Query of address interpolations\n    Tests that interpolated addresses can be queried correctly\n\n    Background:\n        Given the grid\n          | 1  |  | 2  |  | 3  |\n          | 10 |  | 12 |  | 13 |\n          | 7  |  | 8  |  | 9  |\n\n    Scenario: Find interpolations with single number\n        Given the places\n          | osm | class   | type    | name    | geometry |\n          | W10 | highway | primary | Nickway | 10,12,13 |\n        And the interpolations\n          | osm | type | geometry | nodes |\n          | W1  | odd  | 1,3      | 1,3   |\n        And the places\n          | osm | class | type  | housenr | geometry |\n          | N1  | place | house | 1       | 1        |\n          | N3  | place | house | 5       | 3        |\n        When importing\n        When reverse geocoding at node 2\n        Then the result contains\n          | display_name |\n          | 3, Nickway   |\n        When geocoding \"Nickway 3\"\n        Then all results contain\n          | object | display_name |\n          | W1     | 3, Nickway   |\n\n\n    Scenario: Find interpolations with multiple numbers\n        Given the places\n          | osm | class   | type    | name    | geometry |\n          | W10 | highway | primary | Nickway | 10,12,13 |\n        And the interpolations\n          | osm | type | geometry | nodes |\n          | W1  | even | 1,3      | 1,3   |\n        And the places\n          | osm | class | type  | housenr | geometry |\n          | N1  | place | house | 2       | 1        |\n          | N3  | place | house | 18      | 3        |\n        When importing\n        When reverse geocoding at node 2\n        Then the result contains\n          | display_name | centroid!wkt |\n          | 10, Nickway  | 2 |\n        When geocoding \"Nickway 10\"\n        Then all results contain\n          | object | display_name  | centroid!wkt |\n          | W1     | 10, Nickway   | 2 |\n\n\n    Scenario: Interpolations are found according to their type\n        Given the grid\n         | 10  |  | 11  |\n         | 100 |  | 101 |\n         | 20  |  | 21  |\n        And the places\n         | osm  | class   | type        | name    | geometry |\n         | W100 | highway | residential | Ringstr | 100, 101 |\n        And the interpolations\n         | osm | type | geometry | nodes |\n         | W10 | even | 10, 11   | 10, 11 |\n         | W20 | odd  | 20, 21   | 20, 21 |\n        And the places\n         | osm | class | type  | housenr | geometry |\n         | N10 | place | house | 10      | 10 |\n         | N11 | place | house | 20      | 11 |\n         | N20 | place | house | 11      | 20 |\n         | N21 | place | house | 21      | 21 |\n        When importing\n        When geocoding \"Ringstr 12\"\n        Then the result set contains\n         | object |\n         | W10 |\n        When geocoding \"Ringstr 13\"\n        Then the result set contains\n         | object |\n         | W20 |\n"
  },
  {
    "path": "test/bdd/features/db/query/japanese.feature",
    "content": "Feature: Searches in Japan\n    Test specifically for searches of Japanese addresses and in Japanese language.\n    Scenario: A block house-number is parented to the neighbourhood\n        Given the grid with origin JP\n          | 1 |   |   |   | 2 |\n          |   | 3 |   |   |   |\n          |   |   | 9 |   |   |\n          |   |   |   | 6 |   |\n        And the places\n          | osm | class   | type        | name       | geometry |\n          | W1  | highway | residential | 雉子橋通り | 1,2      |\n        And the places\n          | osm | class   | type       | housenr | addr+block_number | addr+neighbourhood | geometry |\n          | N3  | amenity | restaurant | 2       | 6                 | 2丁目              | 3        |\n        And the places\n          | osm | class | type          | name  | geometry |\n          | N9  | place | neighbourhood | 2丁目 | 9        |\n        And the places\n          | osm | class | type    | name | geometry |\n          | N6  | place | quarter | 加瀬 | 6        |\n        When importing\n        Then placex contains\n          | object | parent_place_id |\n          | N3     | N9              |\n        When geocoding \"2丁目 6-2\"\n        Then all results contain\n          | object |\n          | N3  |\n"
  },
  {
    "path": "test/bdd/features/db/query/linking.feature",
    "content": "Feature: Searching linked places\n    Tests that information from linked places can be searched correctly\n\n    Scenario: Additional names from linked places are searchable\n        Given the 0.1 grid\n         | 10 |   | 11 |\n         |    | 2 |    |\n         | 13 |   | 12 |\n        Given the places\n         | osm  | class    | type           | admin | name  | geometry |\n         | R13  | boundary | administrative | 6     | Garbo | (10,11,12,13,10) |\n        Given the places\n         | osm  | class    | type           | admin | name+name:it |\n         | N2   | place    | hamlet         | 15    | Vario        |\n        And the relations\n         | id | members       | tags+type |\n         | 13 | N2:label      | boundary |\n        When importing\n        Then placex contains\n         | object  | linked_place_id |\n         | N2      | R13 |\n        When geocoding \"Vario\"\n         | namedetails |\n         | 1 |\n        Then all results contain\n         | object | display_name | namedetails!dict |\n         | R13    | Garbo | \"name\": \"Garbo\", \"name:it\": \"Vario\" |\n        When geocoding \"Vario\"\n         | accept-language |\n         | it |\n        Then all results contain\n         | object | display_name |\n         | R13    | Vario |\n\n\n    Scenario: Differing names from linked places are searchable\n        Given the 0.1 grid\n         | 10 |   | 11 |\n         |    | 2 |    |\n         | 13 |   | 12 |\n        Given the places\n         | osm  | class    | type           | admin | name  | geometry |\n         | R13  | boundary | administrative | 6     | Garbo | (10,11,12,13,10) |\n        Given the places\n         | osm  | class    | type           | admin | name  |\n         | N2   | place    | hamlet         | 15    | Vario |\n        And the relations\n         | id | members       | tags+type |\n         | 13 | N2:label      | boundary |\n        When importing\n        Then placex contains\n         | object  | linked_place_id |\n         | N2      | R13 |\n        When geocoding \"Vario\"\n         | namedetails |\n         | 1 |\n        Then all results contain\n         | object | display_name | namedetails!dict |\n         | R13    | Garbo        | \"name\": \"Garbo\", \"_place_name\": \"Vario\" |\n        When geocoding \"Garbo\"\n        Then all results contain\n         | object | display_name |\n         | R13    | Garbo |\n"
  },
  {
    "path": "test/bdd/features/db/query/normalization.feature",
    "content": "Feature: Import and search of names\n    Tests all naming related issues: normalisation,\n    abbreviations, internationalisation, etc.\n\n    Scenario: non-latin scripts can be found\n        Given the places\n          | osm | class | type      | name |\n          | N1  | place | locality  | Речицкий район |\n          | N2  | place | locality  | Refugio de montaña |\n          | N3  | place | locality  | 高槻市|\n          | N4  | place | locality  | الدوحة |\n        When importing\n        When geocoding \"Речицкий район\"\n        Then result 0 contains\n         | object |\n         | N1 |\n        When geocoding \"Refugio de montaña\"\n        Then result 0 contains\n         | object |\n         | N2 |\n        When geocoding \"高槻市\"\n        Then result 0 contains\n         | object |\n         | N3 |\n        When geocoding \"الدوحة\"\n        Then result 0 contains\n         | object |\n         | N4 |\n\n    Scenario: Case-insensitivity of search\n        Given the places\n          | osm | class | type      | name |\n          | N1  | place | locality  | FooBar |\n        When importing\n        Then placex contains\n          | object | class  | type     | name+name |\n          | N1     | place  | locality | FooBar |\n        When geocoding \"FooBar\"\n        Then result 0 contains\n         | object |\n         | N1 |\n        When geocoding \"foobar\"\n        Then result 0 contains\n         | object |\n         | N1 |\n        When geocoding \"fOObar\"\n        Then result 0 contains\n         | object |\n         | N1 |\n        When geocoding \"FOOBAR\"\n        Then result 0 contains\n         | object |\n         | N1 |\n\n    Scenario: Multiple spaces in name\n        Given the places\n          | osm | class | type      | name |\n          | N1  | place | locality  | one two  three |\n        When importing\n        When geocoding \"one two three\"\n        Then result 0 contains\n         | object |\n         | N1 |\n        When geocoding \"one   two three\"\n        Then result 0 contains\n         | object |\n         | N1 |\n        When geocoding \"one two  three\"\n        Then result 0 contains\n         | object |\n         | N1 |\n        When geocoding \"    one two three\"\n        Then result 0 contains\n         | object |\n         | N1 |\n\n    Scenario: Special characters in name\n        Given the places\n          | osm | class | type      | name+name:de |\n          | N1  | place | locality  | Jim-Knopf-Straße |\n          | N2  | place | locality  | Smith/Weston |\n          | N3  | place | locality  | space mountain |\n          | N4  | place | locality  | space |\n          | N5  | place | locality  | mountain |\n        When importing\n        When geocoding \"Jim-Knopf-Str\"\n        Then result 0 contains\n         | object |\n         | N1 |\n        When geocoding \"Jim Knopf-Str\"\n        Then result 0 contains\n         | object |\n         | N1 |\n        When geocoding \"Jim Knopf Str\"\n        Then result 0 contains\n         | object |\n         | N1 |\n        When geocoding \"Jim/Knopf-Str\"\n        Then result 0 contains\n         | object |\n         | N1 |\n        When geocoding \"Jim-Knopfstr\"\n        Then result 0 contains\n         | object |\n         | N1 |\n        When geocoding \"Smith/Weston\"\n        Then result 0 contains\n         | object |\n         | N2 |\n        When geocoding \"Smith Weston\"\n        Then result 0 contains\n         | object |\n         | N2 |\n        When geocoding \"Smith-Weston\"\n        Then result 0 contains\n         | object |\n         | N2 |\n        When geocoding \"space mountain\"\n        Then result 0 contains\n         | object |\n         | N3 |\n        When geocoding \"space-mountain\"\n        Then result 0 contains\n         | object |\n         | N3 |\n        When geocoding \"space/mountain\"\n        Then result 0 contains\n         | object |\n         | N3 |\n        When geocoding \"space\\mountain\"\n        Then result 0 contains\n         | object |\n         | N3 |\n        When geocoding \"space(mountain)\"\n        Then result 0 contains\n         | object |\n         | N3 |\n\n    Scenario: Landuse with name are found\n        Given the grid\n          | 1 | 2 |\n          | 3 |   |\n        Given the places\n          | osm | class    | type        | name     | geometry |\n          | R1  | natural  | meadow      | landuse1 | (1,2,3,1) |\n          | R2  | landuse  | industrial  | landuse2 | (2,3,1,2) |\n        When importing\n        When geocoding \"landuse1\"\n        Then result 0 contains\n         | object |\n         | R1 |\n        When geocoding \"landuse2\"\n        Then result 0 contains\n         | object |\n         | R2 |\n\n    Scenario Outline: Housenumbers with special characters are found\n        Given the grid\n            | 1 |  |   |  | 2 |\n            |   |  | 9 |  |   |\n        And the places\n            | osm | class   | type    | name    | geometry |\n            | W1  | highway | primary | Main St | 1,2      |\n        And the places\n            | osm | class    | type | housenr | geometry |\n            | N1  | building | yes  | <nr>    | 9        |\n        When importing\n        And geocoding \"Main St <nr>\"\n        Then result 0 contains\n         | object | display_name |\n         | N1     | <nr>, Main St |\n\n    Examples:\n        | nr |\n        | 1  |\n        | 3456 |\n        | 1 a |\n        | 56b |\n        | 1 A |\n        | 2號 |\n        | 1Б  |\n        | 1 к1 |\n        | 23-123 |\n\n    Scenario Outline: Housenumbers in lists are found\n        Given the grid\n            | 1 |  |   |  | 2 |\n            |   |  | 9 |  |   |\n        And the places\n            | osm | class   | type    | name    | geometry |\n            | W1  | highway | primary | Main St | 1,2      |\n        And the places\n            | osm | class    | type | housenr   | geometry |\n            | N1  | building | yes  | <nr-list> | 9        |\n        When importing\n        And geocoding \"Main St <nr>\"\n        Then result 0 contains\n         | object | display_name |\n         | N1     | <nr-list>, Main St |\n\n    Examples:\n        | nr-list    | nr |\n        | 1,2,3      | 1  |\n        | 1,2,3      | 2  |\n        | 1, 2, 3    | 3  |\n        | 45 ;67;3   | 45 |\n        | 45 ;67;3   | 67 |\n        | 1a;1k      | 1a |\n        | 1a;1k      | 1k |\n        | 34/678     | 34 |\n        | 34/678     | 678 |\n        | 34/678     | 34/678 |\n"
  },
  {
    "path": "test/bdd/features/db/query/postcodes.feature",
    "content": "Feature: Querying fo postcode variants\n\n    Scenario: Postcodes in Singapore (6-digit postcode)\n        Given the grid with origin SG\n            | 10 |   |   |   | 11 |\n        And the places\n            | osm | class   | type | name   | addr+postcode | geometry |\n            | W1  | highway | path | Lorang | 399174        | 10,11    |\n        When importing\n        When geocoding \"399174\"\n        Then result 0 contains\n            | type     | display_name |\n            | postcode | 399174, Singapore |\n\n\n    Scenario Outline: Postcodes in the Netherlands (mixed postcode with spaces)\n        Given the grid with origin NL\n            | 10 |   |   |   | 11 |\n        And the places\n            | osm | class   | type | name     | addr+postcode | geometry |\n            | W1  | highway | path | De Weide | <postcode>    | 10,11    |\n        When importing\n        When geocoding \"3993 DX\"\n        Then result 0 contains\n            | type     | display_name |\n            | postcode | 3993 DX, Nederland      |\n        When geocoding \"3993dx\"\n        Then result 0 contains\n            | type     | display_name |\n            | postcode | 3993 DX, Nederland      |\n\n        Examples:\n            | postcode |\n            | 3993 DX  |\n            | 3993DX   |\n            | 3993 dx  |\n\n\n    Scenario: Postcodes in Singapore (6-digit postcode)\n        Given the grid with origin SG\n            | 10 |   |   |   | 11 |\n        And the places\n            | osm | class   | type | name   | addr+postcode | geometry |\n            | W1  | highway | path | Lorang | 399174        | 10,11    |\n        When importing\n        When geocoding \"399174\"\n        Then result 0 contains\n            | type     | display_name |\n            | postcode | 399174, Singapore       |\n\n\n    Scenario Outline: Postcodes in Andorra (with country code)\n        Given the grid with origin AD\n            | 10 |   |   |   | 11 |\n        And the places\n            | osm | class   | type | name   | addr+postcode | geometry |\n            | W1  | highway | path | Lorang | <postcode>    | 10,11    |\n        When importing\n        When geocoding \"675\"\n        Then result 0 contains\n            | type     | display_name |\n            | postcode | AD675, Andorra |\n        When geocoding \"AD675\"\n        Then result 0 contains\n            | type     | display_name |\n            | postcode | AD675, Andorra |\n\n        Examples:\n            | postcode |\n            | 675      |\n            | AD 675   |\n            | AD675    |\n\n\n    Scenario: Different postcodes with the same normalization can both be found\n        Given the places\n           | osm | class | type  | addr+postcode | addr+housenumber | geometry |\n           | N34 | place | house | EH4 7EA       | 111              | country:gb |\n           | N35 | place | house | E4 7EA        | 111              | country:gb |\n        When importing\n        Then location_postcodes contains exactly\n           | country_code | postcode | centroid!wkt |\n           | gb           | EH4 7EA  | country:gb |\n           | gb           | E4 7EA   | country:gb |\n        When geocoding \"EH4 7EA\"\n        Then result 0 contains\n           | type     | display_name |\n           | postcode | EH4 7EA, United Kingdom |\n        When geocoding \"E4 7EA\"\n        Then result 0 contains\n           | type     | display_name |\n           | postcode | E4 7EA, United Kingdom |\n"
  },
  {
    "path": "test/bdd/features/db/query/reverse.feature",
    "content": "Feature: Reverse searches\n    Test results of reverse queries\n\n    Scenario: POI in POI area\n        Given the 0.0001 grid with origin 1,1\n          | 1 |   |  |  |  |  |  |  | 2 |\n          |   | 9 |  |  |  |  |  |  |   |\n          | 4 |   |  |  |  |  |  |  | 3 |\n        And the places\n          | osm | class   | type       | geometry    |\n          | W1  | aeroway | terminal   | (1,2,3,4,1) |\n          | N9  | amenity | restaurant | 9           |\n        When importing\n        And reverse geocoding 1.0001,1.0001\n        Then the result contains\n         | object |\n         | N9  |\n        When reverse geocoding 1.0003,1.0001\n        Then the result contains\n         | object |\n         | W1  |\n\n\n    Scenario: Find closest housenumber for street matches\n        Given the 0.0001 grid with origin 1,1\n          |    | 1 |   |    |\n          |    |   | 2 |    |\n          | 10 |   |   | 11 |\n        And the places\n          | osm | class   | type     | name        | geometry |\n          | W1  | highway | service  | Goose Drive | 10,11    |\n          | N2  | tourism | art_work | Beauty      | 2        |\n        And the places\n          | osm | class | type  | housenr | geometry |\n          | N1  | place | house | 23      | 1        |\n        When importing\n        When reverse geocoding 1.0002,1.0002\n        Then the result contains\n          | object |\n          | N1 |\n"
  },
  {
    "path": "test/bdd/features/db/query/search_simple.feature",
    "content": "Feature: Searching of simple objects\n    Testing simple stuff\n\n    Scenario: Search for place node\n        Given the places\n          | osm | class | type    | name+name | geometry   |\n          | N1  | place | village | Foo       | 10.0 -10.0 |\n        When importing\n        And geocoding \"Foo\"\n        Then result 0 contains\n         | object | category | type    | centroid!wkt |\n         | N1     | place    | village | 10 -10   |\n\n    # github #1763\n    Scenario: Correct translation of highways under construction\n        Given the grid\n         | 1 |  |   |  | 2 |\n         |   |  | 9 |  |   |\n        And the places\n         | osm | class   | type         | name      | geometry |\n         | W1  | highway | construction | The build | 1,2      |\n         | N1  | amenity | cafe         | Bean      | 9        |\n        When importing\n        And geocoding \"Bean\"\n        Then result 0 contains in field address\n         | amenity | road |\n         | Bean    | The build |\n\n    Scenario: when missing housenumbers in search don't return a POI\n        Given the places\n         | osm | class   | type       | name        |\n         | N3  | amenity | restaurant | Wood Street |\n        And the places\n         | osm | class   | type       | name        | housenr |\n         | N20 | amenity | restaurant | Red Way     | 34      |\n        When importing\n        And geocoding \"Wood Street 45\"\n        Then exactly 0 results are returned\n        When geocoding \"Red Way 34\"\n        Then exactly 0 results are returned\n\n     Scenario: when the housenumber is missing the street is still returned\n        Given the grid\n         | 1 |  | 2 |\n        Given the places\n         | osm | class   | type        | name        | geometry |\n         | W1  | highway | residential | Wood Street | 1, 2     |\n        When importing\n        And geocoding \"Wood Street\"\n        Then all results contain\n         | object |\n         | W1  |\n\n     Scenario Outline: Special cased american states will be found\n        Given the grid\n         | 1 |    | 2 |\n         |   | 10 |   |\n         | 4 |    | 3 |\n        Given the places\n         | osm  | class    | type           | admin | name    | name+ref | geometry    |\n         | R1   | boundary | administrative | 4     | <state> | <ref>    | (1,2,3,4,1) |\n        Given the places\n         | osm  | class | type  | name   | geometry    |\n         | N2   | place | town  | <city> | 10          |\n         | N3   | place | city  | <city>  | country:ca  |\n        When importing\n        And geocoding \"<city>, <state>\"\n        Then all results contain\n         | object |\n         | N2  |\n        When geocoding \"<city>, <ref>\"\n         | accept-language |\n         | en |\n        Then all results contain\n         | object |\n         | N2  |\n\n     Examples:\n        | city        | state     | ref |\n        | Chicago     | Illinois  | IL  |\n        | Auburn      | Alabama   | AL  |\n        | New Orleans | Louisiana | LA  |\n\n    # github #3210\n    Scenario: Country with alternate-language name does not dominate when locale differs\n        Given the 1.0 grid with origin DE\n         | 1 |    | 2 |\n         |   | 10 |   |\n         | 4 |    | 3 |\n        Given the places\n         | osm  | class    | type           | admin | name+name | name+name:fi | name+name:de | country | geometry    |\n         | R1   | boundary | administrative | 2     | Turgei    | Turgi        | Testland     | de      | (1,2,3,4,1) |\n        Given the places\n         | osm  | class | type    | name+name | geometry |\n         | N10  | place | village | Turgi     | 10       |\n        When importing\n        And geocoding \"Turgi\"\n         | accept-language |\n         | de              |\n        Then result 0 contains\n         | object |\n         | N10    |\n"
  },
  {
    "path": "test/bdd/features/db/update/addressing.feature",
    "content": "Feature: Updates for address computation\n    Tests for correctly updating address assignments on changes.\n\n    Scenario: Address gets updated when an area is extended\n        Given the 0.0001 grid\n            | 1 |   | 2 |   | 3 |   | 4 |\n            |   |   |   | 9 |   |   |   |\n            | 8 |   | 7 |   | 6 |   | 5 |\n        And the places\n            | osm | class    | type           | admin | name | geometry    |\n            | R1  | boundary | administrative | 6     | Fooo | (1,4,5,8,1) |\n            | R2  | boundary | administrative | 8     | Barr | (3,4,5,6,3) |\n        And the named places\n            | osm | class | type   | geometry |\n            | N1  | place | suburb | 9        |\n        When importing\n        Then place_addressline contains exactly\n            | object | address |\n            | N1     | R1      |\n            | R2     | R1      |\n\n        When updating places\n            | osm | class    | type           | admin | name | geometry    |\n            | R2  | boundary | administrative | 8     | Barr | (2,4,5,7,2) |\n        Then place_addressline contains exactly\n            | object | address |\n            | N1     | R1      |\n            | N1     | R2      |\n            | R2     | R1      |\n\n    Scenario: Address gets updated when an area is reduced\n        Given the 0.0001 grid\n            | 1 |   | 2 |   | 3 |   | 4 |\n            |   |   |   | 9 |   |   |   |\n            | 8 |   | 7 |   | 6 |   | 5 |\n        And the places\n            | osm | class    | type           | admin | name | geometry    |\n            | R1  | boundary | administrative | 6     | Fooo | (1,4,5,8,1) |\n            | R2  | boundary | administrative | 8     | Barr | (2,4,5,7,2) |\n        And the named places\n            | osm | class | type   | geometry |\n            | N1  | place | suburb | 9        |\n        When importing\n        Then place_addressline contains exactly\n            | object | address |\n            | N1     | R1      |\n            | N1     | R2      |\n            | R2     | R1      |\n\n        When updating places\n            | osm | class    | type           | admin | name | geometry    |\n            | R2  | boundary | administrative | 8     | Barr | (3,4,5,6,3) |\n        Then place_addressline contains exactly\n            | object | address |\n            | N1     | R1      |\n            | R2     | R1      |\n\n    Scenario: Address gets updated when an area disappears\n        Given the 0.0001 grid\n            | 1 |   | 2 |   | 3 |   | 4 |\n            |   |   |   | 9 |   |   |   |\n            | 8 |   | 7 |   | 6 |   | 5 |\n        And the places\n            | osm | class    | type           | admin | name | geometry    |\n            | R1  | boundary | administrative | 6     | Fooo | (1,4,5,8,1) |\n            | R2  | boundary | administrative | 8     | Barr | (2,4,5,7,2) |\n        And the named places\n            | osm | class | type   | geometry |\n            | N1  | place | suburb | 9        |\n        When importing\n        Then place_addressline contains exactly\n            | object | address |\n            | N1     | R1      |\n            | N1     | R2      |\n            | R2     | R1      |\n\n        When updating places\n            | osm | class    | type           | admin | name | geometry    |\n            | R2  | boundary | administrative | 15    | Barr | (2,4,5,7,2) |\n        Then place_addressline contains exactly\n            | object | address |\n            | N1     | R1      |\n            | R2     | R1      |\n            | R2     | N1      |\n\n    Scenario: Address gets updated when the admin level changes\n        Given the 0.0001 grid\n            | 1 |   | 2 |   | 3 |   | 4 |\n            |   |   |   | 9 |   |   |   |\n            | 8 |   | 7 |   | 6 |   | 5 |\n        And the places\n            | osm | class    | type           | admin | name | geometry    |\n            | R1  | boundary | administrative | 6     | Fooo | (1,4,5,8,1) |\n            | R2  | boundary | administrative | 8     | Barr | (2,4,5,7,2) |\n        And the named places\n            | osm | class | type   | geometry |\n            | N1  | place | suburb | 9        |\n        When importing\n        Then place_addressline contains exactly\n            | object | address | cached_rank_address |\n            | N1     | R1      | 12 |\n            | N1     | R2      | 16 |\n            | R2     | R1      | 12 |\n\n        When updating places\n            | osm | class    | type           | admin | name | geometry    |\n            | R1  | boundary | administrative | 5     | Fooo | (1,4,5,8,1) |\n        Then place_addressline contains exactly\n            | object | address | cached_rank_address |\n            | N1     | R1      | 10 |\n            | N1     | R2      | 16 |\n            | R2     | R1      | 10 |\n"
  },
  {
    "path": "test/bdd/features/db/update/country.feature",
    "content": "Feature: Country handling\n    Tests for update of country information\n\n    Background:\n        Given the 1.0 grid with origin DE\n            | 1 |    | 2 |\n            |   | 10 |   |\n            | 4 |    | 3 |\n\n    Scenario: When country names are changed old ones are no longer searchable\n        Given the places\n            | osm | class    | type           | admin | name+name:xy | country | geometry |\n            | R1  | boundary | administrative | 2     | Loudou       | de      | (1,2,3,4,1) |\n        Given the places\n            | osm | class    | type          | name  |\n            | N10 | place    | town          | Wenig |\n        When importing\n        When geocoding \"Wenig, Loudou\"\n        Then all results contain\n            | object |\n            | N10 |\n        When updating places\n            | osm | class    | type           | admin | name+name:xy | country | geometry |\n            | R1  | boundary | administrative | 2     | Germany      | de      | (1,2,3,4,1) |\n        When geocoding \"Wenig, Loudou\"\n        Then exactly 0 results are returned\n\n    Scenario: When country names are deleted they are no longer searchable\n        Given the places\n            | osm | class    | type           | admin | name+name:xy | country | geometry |\n            | R1  | boundary | administrative | 2     | Loudou       | de      | (1,2,3,4,1) |\n        Given the places\n            | osm | class    | type          | name  |\n            | N10 | place    | town          | Wenig |\n        When importing\n        When geocoding \"Wenig, Loudou\"\n        Then all results contain\n            | object |\n            | N10 |\n        When updating places\n            | osm | class    | type           | admin | name+name:en | country | geometry |\n            | R1  | boundary | administrative | 2     | Germany      | de      | (1,2,3,4,1) |\n        When geocoding \"Wenig, Loudou\"\n        Then exactly 0 results are returned\n        When geocoding \"Wenig\"\n            | accept-language |\n            | xy,en |\n        Then all results contain\n            | object | display_name |\n            | N10    | Wenig, Germany |\n\n\n    Scenario: Default country names are always searchable\n        Given the places\n            | osm | class    | type          | name  |\n            | N10 | place    | town          | Wenig |\n        When importing\n        When geocoding \"Wenig, Germany\"\n        Then all results contain\n            | object |\n            | N10 |\n        When geocoding \"Wenig, de\"\n        Then all results contain\n            | object |\n            | N10 |\n        When updating places\n            | osm  | class    | type           | admin | name+name:en | country | geometry |\n            | R1   | boundary | administrative | 2     | Lilly        | de      | (1,2,3,4,1) |\n        When geocoding \"Wenig, Germany\"\n            | accept-language |\n            | en,de |\n        Then all results contain\n            | object | display_name |\n            | N10 | Wenig, Lilly |\n        When geocoding \"Wenig, de\"\n            | accept-language |\n            | en,de |\n        Then all results contain\n            | object | display_name |\n            | N10    | Wenig, Lilly |\n\n\n    Scenario: When a localised name is deleted, the standard name takes over\n        Given the places\n            | osm | class    | type           | admin | name+name:de | country | geometry |\n            | R1  | boundary | administrative | 2     | Loudou       | de      | (1,2,3,4,1) |\n        Given the places\n            | osm | class    | type          | name  |\n            | N10 | place    | town          | Wenig |\n        When importing\n        When geocoding \"Wenig, Loudou\"\n            | accept-language |\n            | de,en |\n        Then all results contain\n            | object | display_name |\n            | N10 | Wenig, Loudou |\n        When updating places\n            | osm | class    | type           | admin | name+name:en | country | geometry |\n            | R1  | boundary | administrative | 2     | Germany      | de      | (1,2,3,4,1) |\n        When geocoding \"Wenig, Loudou\"\n        Then exactly 0 results are returned\n        When geocoding \"Wenig\"\n            | accept-language |\n            | de,en |\n        Then all results contain\n            | object | display_name |\n            | N10    | Wenig, Deutschland |\n\n"
  },
  {
    "path": "test/bdd/features/db/update/entrances.feature",
    "content": "Feature: Entrance nodes are recorded\n    Test that updated entrance nodes are saved\n\n    Scenario: A building with a newly tagged entrance\n        Given the grid\n          | 1 | 2 |\n          | 4 | 3 |\n        Given the places\n          | osm  | class    | type  | geometry    |\n          | W1   | building | yes   | (1,2,3,4,1) |\n        And the ways\n          | id | nodes         |\n          | 1  | 1, 2, 3, 4, 1 |\n        When importing\n        Then placex contains exactly\n         | object | place_id |\n         | W1     | 1        |\n        Then placex_entrance contains exactly\n         | place_id | osm_id | type | location!wkt | extratags |\n        When updating entrances\n          | osm | type  | geometry    |\n          | N1  | main  | 1           |\n        And updating places\n          | osm  | class    | type  | geometry    |\n          | W1   | building | yes   | (1,2,3,4,1) |\n        Then placex contains exactly\n         | object | place_id |\n         | W1     | 1        |\n        Then placex_entrance contains exactly\n         | place_id | osm_id | type | location!wkt | extratags |\n         | 1        | 1      | main | 1            | -         |\n\n    Scenario: A building with a updated entrance node\n        Given the grid\n          | 1 | 2 |\n          | 4 | 3 |\n        Given the places\n          | osm | class    | type  | geometry    |\n          | N1  | barrier  | gate  | 1           |\n          | W1  | building | yes   | (1,2,3,4,1) |\n        And the ways\n          | id | nodes         |\n          | 1  | 1, 2, 3, 4, 1 |\n        When importing\n        Then placex contains exactly\n         | object | place_id |\n         | N1     | 1        |\n         | W1     | 2        |\n        Then placex_entrance contains exactly\n         | place_id | osm_id | type | location!wkt | extratags |\n        When marking for delete N1\n        And updating entrances\n          | osm | type  | geometry    |\n          | N1  | main  | 1           |\n        And updating places\n          | osm | class    | type  | geometry    |\n          | W1  | building | yes   | (1,2,3,4,1) |\n        Then placex contains exactly\n         | object | place_id |\n         | W1     | 2        |\n        And placex_entrance contains exactly\n         | place_id | osm_id | type | location!wkt | extratags |\n         | 2        | 1      | main | 1            | -         |\n\n    Scenario: A building with a removed entrance\n        Given the grid\n          | 1 | 2 |\n          | 4 | 3 |\n        Given the places\n          | osm | class    | type  | geometry    |\n          | W1  | building | yes   | (1,2,3,4,1) |\n        And the entrances\n          | osm | type  | geometry    |\n          | N1  | main  | 1           |\n        And the ways\n          | id | nodes         |\n          | 1  | 1, 2, 3, 4, 1 |\n        When importing\n        Then placex contains exactly\n         | object | place_id |\n         | W1     | 1        |\n        And placex_entrance contains exactly\n         | place_id | osm_id | type | location!wkt | extratags |\n         | 1        | 1      | main | 1            | -         |\n        When marking for delete N1\n        And updating places\n          | osm | class    | type  | geometry  |\n          | W1  | building | yes   | (1,2,3,4,1) |\n        Then placex contains exactly\n         | object | place_id |\n         | W1     | 1        |\n        And placex_entrance contains exactly\n         | place_id | osm_id | type | location!wkt | extratags |\n\n    Scenario: A building with a removed and remaining entrance\n        Given the grid\n          | 1 | 2 |\n          | 4 | 3 |\n        Given the places\n          | osm | class    | type  | geometry    |\n          | W1  | building | yes   | (1,2,3,4,1) |\n        Given the entrances\n          | osm | type  | geometry    |\n          | N1  | main  | 1           |\n          | N3  | yes   | 3           |\n        And the ways\n          | id | nodes         |\n          | 1  | 1, 2, 3, 4, 1 |\n        When importing\n        Then placex contains exactly\n         | object | place_id |\n         | W1     | 1        |\n        And placex_entrance contains exactly\n         | place_id | osm_id | type | location!wkt | extratags |\n         | 1        | 1      | main | 1            | -         |\n         | 1        | 3      | yes  | 3            | -         |\n        When marking for delete N1\n        And updating places\n          | osm | class    | type  | geometry  |\n          | W1  | building | yes   | (1,2,3,4,1) |\n        Then placex contains exactly\n         | object | place_id |\n         | W1     | 1        |\n        And placex_entrance contains exactly\n         | place_id | osm_id | type | location!wkt | extratags |\n         | 1        | 3      | yes  | 3            | -         |\n"
  },
  {
    "path": "test/bdd/features/db/update/interpolation.feature",
    "content": "Feature: Update of address interpolations\n    Test the interpolated address are updated correctly\n\n    Scenario: new interpolation added to existing street\n      Given the grid\n          | 10 |   |    |   | 11 |\n          |    | 1 | 99 | 2 |    |\n          |    |   |    |   |    |\n          | 20 |   |    |   | 21 |\n      And the places\n          | osm | class   | type         | name         | geometry |\n          | W2  | highway | unclassified | Sun Way      | 10,11    |\n          | W3  | highway | unclassified | Cloud Street | 20,21    |\n      When importing\n      Then W10 expands to no interpolation\n      When updating places\n          | osm | class | type  | housenr |\n          | N1  | place | house | 2       |\n          | N2  | place | house | 6       |\n      And updating interpolations\n          | osm | type | geometry | nodes |\n          | W10 | even | 1,2      | 1,2   |\n      Then placex contains\n          | object | parent_place_id |\n          | N1     | W2 |\n          | N2     | W2 |\n      And W10 expands to interpolation\n          | parent_place_id | start | end | geometry |\n          | W2              | 4     | 4   | 99       |\n\n    Scenario: addr:street added to interpolation\n      Given the grid\n          | 10 |   |    |   | 11 |\n          |    | 1 |    | 2 |    |\n          |    |   |    |   |    |\n          | 20 |   |    |   | 21 |\n      And the places\n          | osm | class | type  | housenr |\n          | N1  | place | house | 2       |\n          | N2  | place | house | 6       |\n      And the interpolations\n          | osm | type | geometry | nodes |\n          | W10 | even | 1,2      | 1,2   |\n      And the places\n          | osm | class   | type         | name         | geometry |\n          | W2  | highway | unclassified | Sun Way      | 10,11    |\n          | W3  | highway | unclassified | Cloud Street | 20,21    |\n      When importing\n      Then placex contains\n          | object | parent_place_id |\n          | N1     | W2 |\n          | N2     | W2 |\n      And W10 expands to interpolation\n          | parent_place_id | start | end |\n          | W2              | 4     | 4   |\n      When updating interpolations\n          | osm | type | street       | nodes | geometry |\n          | W10 | even | Cloud Street | 1,2   | 1,2      |\n      Then placex contains\n          | object | parent_place_id |\n          | N1     | W3 |\n          | N2     | W3 |\n      And W10 expands to interpolation\n          | parent_place_id | start | end |\n          | W3              | 4     | 4   |\n\n    Scenario: addr:street added to housenumbers\n      Given the grid\n          | 10 |   |    |   | 11 |\n          |    | 1 |    | 2 |    |\n          |    |   |    |   |    |\n          | 20 |   |    |   | 21 |\n      And the places\n          | osm | class | type  | housenr |\n          | N1  | place | house | 2       |\n          | N2  | place | house | 6       |\n      And the interpolations\n          | osm | type | geometry | nodes |\n          | W10 | even | 1,2      | 1,2   |\n      And the places\n          | osm | class   | type         | name         | geometry |\n          | W2  | highway | unclassified | Sun Way      | 10,11    |\n          | W3  | highway | unclassified | Cloud Street | 20,21    |\n      When importing\n      Then placex contains\n          | object | parent_place_id |\n          | N1     | W2 |\n          | N2     | W2 |\n      And W10 expands to interpolation\n          | parent_place_id | start | end |\n          | W2              | 4     | 4 |\n      When updating places\n          | osm | class | type  | street      | housenr |\n          | N1  | place | house | Cloud Street| 2       |\n          | N2  | place | house | Cloud Street| 6       |\n      Then placex contains\n          | object | parent_place_id |\n          | N1     | W3 |\n          | N2     | W3 |\n      And W10 expands to interpolation\n          | parent_place_id | start | end |\n          | W3              | 4     | 4   |\n\n    Scenario: interpolation tag removed\n      Given the grid\n          | 10 |   |    |   | 11 |\n          |    | 1 |    | 2 |    |\n          |    |   |    |   |    |\n          | 20 |   |    |   | 21 |\n      And the places\n          | osm | class | type  | housenr |\n          | N1  | place | house | 2       |\n          | N2  | place | house | 6       |\n      And the interpolations\n          | osm | type | geometry | nodes |\n          | W10 | even | 1,2      | 1,2   |\n      And the places\n          | osm | class   | type         | name         | geometry |\n          | W2  | highway | unclassified | Sun Way      | 10,11    |\n          | W3  | highway | unclassified | Cloud Street | 20,21    |\n      When importing\n      Then placex contains\n          | object | parent_place_id |\n          | N1     | W2 |\n          | N2     | W2 |\n      And W10 expands to interpolation\n          | parent_place_id | start | end |\n          | W2              | 4     | 4   |\n      When marking for delete W10\n      Then W10 expands to no interpolation\n      And placex contains\n          | object | parent_place_id |\n          | N1     | W2 |\n          | N2     | W2 |\n\n    Scenario: referenced road added\n      Given the grid\n          | 10 |   |    |   | 11 |\n          |    | 1 |    | 2 |    |\n          |    |   |    |   |    |\n          | 20 |   |    |   | 21 |\n      And the places\n          | osm | class | type  | housenr |\n          | N1  | place | house | 2       |\n          | N2  | place | house | 6       |\n      And the interpolations\n          | osm | type | street      | geometry | nodes |\n          | W10 | even | Cloud Street| 1,2      | 1,2   |\n      And the places\n          | osm | class   | type         | name     | geometry |\n          | W2  | highway | unclassified | Sun Way  | 10,11    |\n      When importing\n      Then placex contains\n          | object | parent_place_id |\n          | N1     | W2 |\n          | N2     | W2 |\n      And W10 expands to interpolation\n          | parent_place_id | start | end |\n          | W2              | 4     | 4 |\n      When updating places\n          | osm | class   | type         | name         | geometry |\n          | W3  | highway | unclassified | Cloud Street | 20,21    |\n      Then placex contains\n          | object | parent_place_id |\n          | N1     | W3 |\n          | N2     | W3 |\n      And W10 expands to interpolation\n          | parent_place_id | start | end |\n          | W3              | 4     | 4   |\n\n    Scenario: referenced road deleted\n      Given the grid\n          | 10 |   |    |   | 11 |\n          |    | 1 |    | 2 |    |\n          |    |   |    |   |    |\n          | 20 |   |    |   | 21 |\n      And the places\n          | osm | class | type  | housenr |\n          | N1  | place | house | 2       |\n          | N2  | place | house | 6       |\n      And the interpolations\n          | osm | type | street      | geometry | nodes |\n          | W10 | even | Cloud Street| 1,2      | 1,2   |\n      And the places\n          | osm | class   | type         | name         | geometry |\n          | W2  | highway | unclassified | Sun Way      | 10,11    |\n          | W3  | highway | unclassified | Cloud Street | 20,21    |\n      When importing\n      Then placex contains\n          | object | parent_place_id |\n          | N1     | W3 |\n          | N2     | W3 |\n      And W10 expands to interpolation\n          | parent_place_id | start | end |\n          | W3              | 4     | 4   |\n      When marking for delete W3\n      Then placex contains\n          | object | parent_place_id |\n          | N1     | W2 |\n          | N2     | W2 |\n      And W10 expands to interpolation\n          | parent_place_id | start | end |\n          | W2              | 4     | 4   |\n\n    Scenario: housenumbers added to interpolation\n      Given the grid\n          | 10 |   |    |   | 11 |\n          |    | 1 |    | 2 |    |\n      And the places\n          | osm | class   | type         | name         | geometry |\n          | W2  | highway | unclassified | Cloud Street | 10,11    |\n      And the interpolations\n          | osm | type | geometry | nodes |\n          | W1  | even | 1,2      | 1,2   |\n      When importing\n      Then W1 expands to no interpolation\n      When updating places\n          | osm | class | type  | housenr |\n          | N1  | place | house | 2       |\n          | N2  | place | house | 6       |\n      And updating interpolations\n          | osm | type | geometry | nodes |\n          | W1  | even | 1,2      | 1,2   |\n      Then W1 expands to interpolation\n          | parent_place_id | start | end |\n          | W2              | 4     | 4   |\n\n    Scenario: housenumber added in middle of interpolation\n      Given the grid\n          | 1 |  |  |   |  | 2 |\n          | 3 |  |  | 4 |  | 5 |\n      And the places\n          | osm | class   | type         | name         | geometry |\n          | W1  | highway | unclassified | Cloud Street | 1, 2     |\n      And the interpolations\n          | osm | type | geometry | nodes |\n          | W2  | even | 3,4,5    | 3,4,5 |\n      And the places\n          | osm | class | type  | housenr |\n          | N3  | place | house | 2       |\n          | N5  | place | house | 10      |\n      When importing\n      Then W2 expands to interpolation\n          | parent_place_id | start | end |\n          | W1              | 4     | 8  |\n      When updating places\n          | osm | class | type  | housenr |\n          | N4  | place | house | 6       |\n      And updating interpolations\n          | osm | type | geometry | nodes |\n          | W2  | even | 3,4,5    | 3,4,5 |\n      Then W2 expands to interpolation\n          | parent_place_id | start | end |\n          | W1              | 4     | 4   |\n          | W1              | 8     | 8   |\n\n    Scenario: housenumber removed in middle of interpolation\n      Given the grid\n          | 1 |  |  |   |  | 2 |\n          | 3 |  |  | 4 |  | 5 |\n      And the places\n          | osm | class   | type         | name         | geometry |\n          | W1  | highway | unclassified | Cloud Street | 1, 2     |\n      And the interpolations\n          | osm | type | geometry | nodes |\n          | W2  | even | 3,4,5    | 3,4,5 |\n      And the places\n          | osm | class | type  | housenr |\n          | N3  | place | house | 2       |\n          | N4  | place | house | 6       |\n          | N5  | place | house | 10      |\n      When importing\n      Then W2 expands to interpolation\n          | parent_place_id | start | end |\n          | W1              | 4     | 4   |\n          | W1              | 8     | 8   |\n      When marking for delete N4\n      And updating interpolations\n          | osm | type | geometry | nodes |\n          | W2  | even | 3,4,5    | 3,4,5 |\n      Then W2 expands to interpolation\n          | parent_place_id | start | end |\n          | W1              | 4     | 8   |\n\n    Scenario: Change the start housenumber\n      Given the grid\n          | 1 |  | 2 |\n          | 3 |  | 4 |\n      And the places\n          | osm | class   | type         | name         | geometry |\n          | W1  | highway | unclassified | Cloud Street | 1, 2     |\n      And the interpolations\n          | osm | type | geometry | nodes |\n          | W2  | even | 3,4      | 3,4   |\n      And the places\n          | osm | class | type  | housenr |\n          | N3  | place | house | 2       |\n          | N4  | place | house | 6       |\n      When importing\n      Then W2 expands to interpolation\n          | parent_place_id | start | end |\n          | W1              | 4     | 4   |\n      When updating places\n          | osm | class | type  | housenr |\n          | N4  | place | house | 8       |\n      And updating interpolations\n          | osm | type | geometry | nodes |\n          | W2  | even | 3,4      | 3,4   |\n      Then W2 expands to interpolation\n          | parent_place_id | start | end |\n          | W1              | 4     | 6   |\n"
  },
  {
    "path": "test/bdd/features/db/update/linked_places.feature",
    "content": "Feature: Updates of linked places\n    Tests that linked places are correctly added and deleted.\n\n    Scenario: Linking is kept when boundary is updated\n        Given the 0.1 grid\n         | 10 |   | 11 |\n         |    | 1 |    |\n         | 13 |   | 12 |\n        Given the places\n            | osm | class | type | name |\n            | N1  | place | city | foo  |\n        And the places\n            | osm | class    | type           | name | admin | geometry |\n            | R1  | boundary | administrative | foo  | 8     | (10,11,12,13,10) |\n        When importing\n        Then placex contains\n         | object | linked_place_id |\n         | N1     | R1 |\n        When updating places\n         | osm | class    | type           | name | name+name:de | admin | geometry |\n         | R1  | boundary | administrative | foo  | Dingens      | 8     | (10,11,12,13,10) |\n        Then placex contains\n         | object | linked_place_id |\n         | N1     | R1 |\n\n\n    Scenario: Add linked place when linking relation is renamed\n        Given the 0.1 grid\n         | 10 |   | 11 |\n         |    | 1 |    |\n         | 13 |   | 12 |\n        Given the places\n            | osm | class | type | name |\n            | N1  | place | city | foo  |\n        And the places\n            | osm | class    | type           | name | admin | geometry |\n            | R1  | boundary | administrative | foo  | 8     | (10,11,12,13,10) |\n        When importing\n        Then placex contains\n         | object | linked_place_id |\n         | N1     | R1 |\n        When geocoding \"foo\"\n         | dups |\n         | 1    |\n        Then all results contain\n         | object |\n         | R1 |\n        When updating places\n         | osm | class    | type           | name   | admin | geometry |\n         | R1  | boundary | administrative | foobar | 8     | (10,11,12,13,10) |\n        Then placex contains\n         | object | linked_place_id |\n         | N1     | - |\n        When geocoding \"foo\"\n         | dups |\n         | 1    |\n        Then all results contain\n         | object |\n         | N1 |\n\n    Scenario: Add linked place when linking relation is removed\n        Given the 0.1 grid\n         | 10 |   | 11 |\n         |    | 1 |    |\n         | 13 |   | 12 |\n        Given the places\n            | osm | class | type | name |\n            | N1  | place | city | foo  |\n        And the places\n            | osm | class    | type           | name | admin | geometry |\n            | R1  | boundary | administrative | foo  | 8     | (10,11,12,13,10) |\n        When importing\n        And geocoding \"foo\"\n         | dups |\n         | 1    |\n        Then all results contain\n         | object |\n         | R1 |\n        When marking for delete R1\n        Then placex contains\n         | object | linked_place_id |\n         | N1     | - |\n        When geocoding \"foo\"\n         | dups |\n         | 1    |\n        Then all results contain\n         | object |\n         | N1 |\n\n    Scenario: Remove linked place when linking relation is added\n        Given the 0.1 grid\n         | 10 |   | 11 |\n         |    | 1 |    |\n         | 13 |   | 12 |\n        Given the places\n            | osm | class | type | name |\n            | N1  | place | city | foo  |\n        When importing\n        And geocoding \"foo\"\n         | dups |\n         | 1    |\n        Then all results contain\n         | object |\n         | N1 |\n        When updating places\n         | osm | class    | type           | name   | admin | geometry |\n         | R1  | boundary | administrative | foo    | 8     | (10,11,12,13,10) |\n        Then placex contains\n         | object | linked_place_id |\n         | N1     | R1 |\n        When geocoding \"foo\"\n         | dups |\n         | 1    |\n        Then all results contain\n         | object |\n         | R1 |\n\n    Scenario: Remove linked place when linking relation is renamed\n        Given the 0.1 grid\n         | 10 |   | 11 |\n         |    | 1 |    |\n         | 13 |   | 12 |\n        Given the places\n            | osm | class | type | name |\n            | N1  | place | city | foo  |\n        And the places\n         | osm | class    | type           | name   | admin | geometry |\n         | R1  | boundary | administrative | foobar | 8     | (10,11,12,13,10) |\n        When importing\n        And geocoding \"foo\"\n         | dups |\n         | 1    |\n        Then all results contain\n         | object |\n         | N1 |\n        When updating places\n         | osm | class    | type           | name   | admin | geometry |\n         | R1  | boundary | administrative | foo    | 8     | (10,11,12,13,10) |\n        Then placex contains\n         | object | linked_place_id |\n         | N1     | R1 |\n        When geocoding \"foo\"\n         | dups |\n         | 1    |\n        Then all results contain\n         | object |\n         | R1 |\n\n    Scenario: Update linking relation when linkee name is updated\n        Given the 0.1 grid\n         | 10 |   | 11 |\n         |    | 3 |    |\n         | 13 |   | 12 |\n        Given the places\n         | osm | class    | type           | name | admin | geometry |\n         | R1  | boundary | administrative | rel  | 8     | (10,11,12,13,10) |\n        And the places\n         | osm | class    | type        | name+name:de |\n         | N3  | place    | city        | greeny       |\n        And the relations\n         | id | members  |\n         | 1  | N3:label |\n        When importing\n        Then placex contains\n         | object | linked_place_id | name+_place_name:de |\n         | R1     | -               | greeny  |\n        And placex contains\n         | object | linked_place_id | name+name:de |\n         | N3     | R1              | greeny  |\n        When updating places\n         | osm | class    | type        | name+name:de |\n         | N3  | place    | city        | newname      |\n        Then placex contains\n         | object | linked_place_id | name+name:de |\n         | N3     | R1              | newname  |\n        And placex contains\n         | object | linked_place_id | name+_place_name:de |\n         | R1     | -               | newname  |\n\n    Scenario: Update linking relation when linkee name is deleted\n        Given the 0.1 grid\n         | 10 |   | 11 |\n         |    | 3 |    |\n         | 13 |   | 12 |\n        Given the places\n         | osm | class    | type           | name | admin | geometry |\n         | R1  | boundary | administrative | rel  | 8     | (10,11,12,13,10) |\n        And the places\n         | osm | class    | type           | name |\n         | N3  | place    | city           | greeny  |\n        And the relations\n         | id | members  |\n         | 1  | N3:label |\n        When importing\n        Then placex contains\n         | object | linked_place_id | name+_place_name | name+name |\n         | R1     | -               | greeny              | rel       |\n        And placex contains\n         | object | linked_place_id | name+name |\n         | N3     | R1              | greeny  |\n        When geocoding \"greeny\"\n        Then all results contain\n          | object |\n          | R1  |\n        When updating places\n         | osm | class    | type        | name+name:de |\n         | N3  | place    | city        | depnt        |\n        Then placex contains\n         | object | linked_place_id | name+name:de |\n         | N3     | R1              | depnt  |\n        And placex contains\n         | object | linked_place_id | name+_place_name:de | name+name |\n         | R1     | -               | depnt               | rel       |\n        When geocoding \"greeny\"\n        Then exactly 0 results are returned\n\n    Scenario: Updating linkee extratags keeps linker's extratags\n        Given the 0.1 grid\n         | 10 |   | 11 |\n         |    | 3 |    |\n         | 13 |   | 12 |\n        Given the named places\n         | osm | class    | type           | extra+wikidata | admin | geometry |\n         | R1  | boundary | administrative | 34             | 8     | (10,11,12,13,10) |\n        And the named places\n         | osm | class    | type           |\n         | N3  | place    | city           |\n        And the relations\n         | id | members  |\n         | 1  | N3:label |\n        When importing\n        Then placex contains\n         | object | extratags!dict |\n         | R1     | 'wikidata' : '34', 'linked_place' : 'city' |\n        When updating places\n         | osm | class    | type        | name    | extra+oneway |\n         | N3  | place    | city        | newname | yes          |\n        Then placex contains\n         | object | extratags!dict |\n         | R1     | 'wikidata' : '34', 'oneway' : 'yes', 'linked_place' : 'city' |\n\n    Scenario: Remove linked_place info when linkee is removed\n        Given the 0.1 grid\n         | 10 |   | 11 |\n         |    | 1 |    |\n         | 13 |   | 12 |\n        Given the places\n            | osm | class | type | name |\n            | N1  | place | city | foo  |\n        And the places\n            | osm | class    | type           | name | admin | geometry |\n            | R1  | boundary | administrative | foo  | 8     | (10,11,12,13,10) |\n        When importing\n        Then placex contains\n            | object | extratags!dict |\n            | R1     | 'linked_place' : 'city' |\n        When marking for delete N1\n        Then placex contains\n            | object | extratags |\n            | R1     | - |\n\n    Scenario: Update linked_place info when linkee type changes\n        Given the 0.1 grid\n         | 10 |   | 11 |\n         |    | 1 |    |\n         | 13 |   | 12 |\n        Given the places\n            | osm | class | type | name |\n            | N1  | place | city | foo  |\n        And the places\n            | osm | class    | type           | name | admin | geometry |\n            | R1  | boundary | administrative | foo  | 8     | (10,11,12,13,10) |\n        When importing\n        Then placex contains\n            | object | extratags!dict |\n            | R1     | 'linked_place' : 'city' |\n        When updating places\n            | osm | class | type | name |\n            | N1  | place | town | foo  |\n        Then placex contains\n            | object | extratags!dict |\n            | R1     | 'linked_place' : 'town' |\n\n\n    Scenario: Keep linking and ranks when place type changes\n        Given the grid\n            | 1 |   |   | 2 |\n            |   |   | 9 |   |\n            | 4 |   |   | 3 |\n        And the places\n            | osm | class    | type           | name | admin | geometry    |\n            | R1  | boundary | administrative | foo  | 8     | (1,2,3,4,1) |\n        And the places\n            | osm | class | type | name | geometry |\n            | N1  | place | city | foo  | 9        |\n        When importing\n        Then placex contains\n            | object | linked_place_id | rank_address |\n            | N1     | R1              | 16           |\n            | R1     | -               | 16           |\n\n        When updating places\n            | osm | class | type | name | geometry |\n            | N1  | place | town | foo  | 9        |\n        Then placex contains\n            | object | linked_place_id | rank_address |\n            | N1     | R1              | 16           |\n            | R1     | -               | 16           |\n\n\n    Scenario: Invalidate surrounding place nodes when place type changes\n        Given the grid\n            | 1 |   |   | 2 |\n            |   | 8 | 9 |   |\n            | 4 |   |   | 3 |\n        And the places\n            | osm | class    | type           | name | admin | geometry    |\n            | R1  | boundary | administrative | foo  | 8     | (1,2,3,4,1) |\n        And the places\n            | osm | class | type | name | geometry |\n            | N1  | place | town | foo  | 9        |\n            | N2  | place | city | bar  | 8        |\n        And the relations\n         | id | members  |\n         | 1  | N1:label |\n        When importing\n        Then placex contains\n            | object | linked_place_id | rank_address |\n            | N1     | R1              | 16           |\n            | R1     | -               | 16           |\n            | N2     | -               | 18           |\n\n        When updating places\n            | osm | class | type   | name | geometry |\n            | N1  | place | suburb | foo  | 9        |\n        Then placex contains\n            | object | linked_place_id | rank_address |\n            | N1     | R1              | 20           |\n            | R1     | -               | 20           |\n            | N2     | -               | 16           |\n"
  },
  {
    "path": "test/bdd/features/db/update/parenting.feature",
    "content": "Feature: Update parenting of objects\n\n    Scenario: POI inside building inherits addr:street change\n        Given the grid\n         | 10 |  |   |  |   |   |   | 11 |\n         |    |  | 5 |  |   | 6 |   |    |\n         |    |  |   |  |   |   |   |    |\n         |    |  |   |  | 1 |   |   |    |\n         | 12 |  | 8 |  |   | 7 |   |    |\n        And the named places\n         | osm | class   | type  |\n         | N1  | amenity | bank  |\n        And the places\n         | osm | class    | type | street  | housenr | geometry |\n         | W1  | building | yes  | nowhere | 3       | (5,6,7,8,5) |\n        And the places\n         | osm | class    | type        | name | geometry |\n         | W2  | highway  | primary     | bar  | 10,11 |\n         | W3  | highway  | residential | foo  | 10,12 |\n        When importing\n        Then placex contains\n         | object | parent_place_id | housenumber |\n         | W1     | W2              | 3 |\n         | N1     | W2              | 3 |\n        When updating places\n         | osm | class    | type | street | addr_place | housenr | geometry    |\n         | W1  | building | yes  | foo    | nowhere    | 3       | (5,6,7,8,5) |\n        And updating places\n         | osm | class   | type | name |\n         | N1  | amenity | bank | well |\n        Then placex contains\n         | object | parent_place_id | housenumber |\n         | W1     | W3              | 3 |\n         | N1     | W3              | 3 |\n\n\n    Scenario: Housenumber is reparented when street gets name matching addr:street\n        Given the grid\n         | 1 |    |   | 2 |\n         |   | 10 |   |   |\n         |   |    |   |   |\n         | 3 |    |   | 4 |\n        And the places\n         | osm | class   | type        | name     | geometry |\n         | W1  | highway | residential | A street | 1,2      |\n         | W2  | highway | residential | B street | 3,4      |\n        And the places\n         | osm | class    | type | housenr | street   | geometry |\n         | N1  | building | yes  | 3       | X street | 10       |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W1              |\n        When updating places\n         | osm | class   | type        | name     | geometry |\n         | W2  | highway | residential | X street | 3,4      |\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W2              |\n\n\n    Scenario: Housenumber is reparented when street looses name matching addr:street\n        Given the grid\n         | 1 |    |   | 2 |\n         |   | 10 |   |   |\n         |   |    |   |   |\n         | 3 |    |   | 4 |\n        And the places\n         | osm | class   | type        | name     | geometry |\n         | W1  | highway | residential | A street | 1,2      |\n         | W2  | highway | residential | X street | 3,4      |\n        And the places\n         | osm | class    | type | housenr | street   | geometry |\n         | N1  | building | yes  | 3       | X street | 10       |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W2              |\n        When updating places\n         | osm | class   | type        | name     | geometry |\n         | W2  | highway | residential | B street | 3,4      |\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W1              |\n\n\n    Scenario: Housenumber is reparented when street gets name matching addr:street\n        Given the grid\n         | 1 |    |   | 2 |\n         |   | 10 |   |   |\n         |   |    |   |   |\n         | 3 |    |   | 4 |\n        And the places\n         | osm | class   | type        | name     | geometry |\n         | W1  | highway | residential | A street | 1,2      |\n         | W2  | highway | residential | B street | 3,4      |\n        And the places\n         | osm | class    | type | housenr | street   | geometry |\n         | N1  | building | yes  | 3       | X street | 10       |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W1              |\n        When updating places\n         | osm | class   | type        | name     | geometry |\n         | W2  | highway | residential | X street | 3,4      |\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W2              |\n\n\n    Scenario: Housenumber is reparented when place is renamed to matching addr:place\n        Given the grid\n         | 1 |    |   | 2 |\n         |   | 10 | 4 |   |\n         |   |    |   |   |\n         |   |    | 5 |   |\n        And the places\n         | osm | class   | type        | name     | geometry |\n         | W1  | highway | residential | A street | 1,2      |\n         | N5  | place   | village     | Bdorf    | 5        |\n         | N4  | place   | village     | Other    | 4        |\n        And the places\n         | osm | class    | type | housenr | addr_place | geometry |\n         | N1  | building | yes  | 3       | Cdorf      | 10       |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | N4              |\n        When updating places\n         | osm | class   | type        | name     | geometry |\n         | N5  | place   | village     | Cdorf    | 5        |\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | N5              |\n\n\n    Scenario: Housenumber is reparented when it looses a matching addr:place\n        Given the grid\n         | 1 |    |   | 2 |\n         |   | 10 | 4 |   |\n         |   |    |   |   |\n         |   |    | 5 |   |\n        And the places\n         | osm | class   | type        | name     | geometry |\n         | W1  | highway | residential | A street | 1,2      |\n         | N5  | place   | village     | Bdorf    | 5        |\n         | N4  | place   | village     | Other    | 4        |\n        And the places\n         | osm | class    | type | housenr | addr_place | geometry |\n         | N1  | building | yes  | 3       | Bdorf      | 10       |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | N5              |\n        When updating places\n         | osm | class   | type        | name     | geometry |\n         | N5  | place   | village     | Cdorf    | 5        |\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | N4              |\n\n\n    Scenario: House re-parented when added to an associatedStreet relation\n        Given the grid\n         | 10 |   |   |   |   | 11 |\n         |    | 1 |   |   |   |    |\n         |    |   |   |   |   |    |\n         | 12 |   |   |   |   |    |\n        And the places\n         | osm | class | type  |\n         | N1  | place | house |\n        And the places\n         | osm | class   | type        | name | geometry |\n         | W1  | highway | residential | foo  | 10,11    |\n         | W2  | highway | residential | bar  | 10,12    |\n        And the relations\n         | id | members   | tags+type        |\n         | 1  | W1:street | associatedStreet |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W1              |\n        When updating relations\n         | id | members             | tags+type        |\n         | 1  | W2:street,N1:house  | associatedStreet |\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W2              |\n\n\n    Scenario: House reverts to nearest street when removed from associatedStreet relation\n        Given the grid\n         | 10 |   |   |   |   | 11 |\n         |    |   |   |   |   |    |\n         |    |   |   |   |   |    |\n         |    |   |   |   |   |    |\n         | 12 | 1 |   |   |   |    |\n        And the places\n         | osm | class | type  |\n         | N1  | place | house |\n        And the places\n         | osm | class   | type        | name | geometry |\n         | W1  | highway | residential | foo  | 10,11    |\n         | W2  | highway | residential | bar  | 10,12    |\n        And the relations\n         | id | members             | tags+type        |\n         | 1  | W1:street,N1:house  | associatedStreet |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W1              |\n        When updating relations\n         | id | members   | tags+type        |\n         | 1  | W1:street | associatedStreet |\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W2              |\n\n\n    Scenario: Houses re-parented when street member of relation changes\n        Given the grid\n         | 10 |   |   |   |   | 11 |\n         |    | 1 |   |   |   |    |\n         |    |   |   |   |   |    |\n         | 12 |   |   |   |   |    |\n        And the places\n         | osm | class | type  |\n         | N1  | place | house |\n        And the places\n         | osm | class   | type        | name | geometry |\n         | W1  | highway | residential | foo  | 10,11    |\n         | W2  | highway | residential | bar  | 10,12    |\n        And the relations\n         | id | members             | tags+type        |\n         | 1  | W1:street,N1:house  | associatedStreet |\n        When importing\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W1              |\n        When updating relations\n         | id | members             | tags+type        |\n         | 1  | W2:street,N1:house  | associatedStreet |\n        Then placex contains\n         | object | parent_place_id |\n         | N1     | W2              |\n\n"
  },
  {
    "path": "test/bdd/features/db/update/postcode.feature",
    "content": "Feature: Update of postcode\n    Tests for updating of data related to postcodes\n\n     Scenario: Updating postcode in postcode boundaries without ref\n        Given the grid with origin FR\n          | 1 |   | 2 |\n          |   | 9 |   |\n          | 4 |   | 3 |\n        Given the postcodes\n          | osm | postcode | centroid | geometry |\n          | R1  | 12345    | 9        | (1,2,3,4,1) |\n        When importing\n        And geocoding \"12345\"\n        Then result 0 contains\n         | object |\n         | R1 |\n        Given the postcodes\n          | osm | postcode | centroid | geometry |\n          | R1  | 54321    | 9        | (1,2,3,4,1) |\n        When refreshing postcodes\n        And geocoding \"12345\"\n        Then exactly 0 results are returned\n        When geocoding \"54321\"\n        Then result 0 contains\n         | object |\n         | R1 |\n\n    Scenario: A new postcode appears in the postcode table\n        Given the places\n           | osm | class | type  | addr+postcode | addr+housenumber | geometry |\n           | N34 | place | house | 01982         | 111              | country:de |\n        When importing\n        Then location_postcodes contains exactly\n           | country_code | postcode | centroid!wkt |\n           | de           | 01982    | country:de |\n        Given the postcodes\n           | osm | postcode | centroid   |\n           | N66 | 99201    | country:fr |\n        When updating places\n           | osm | class | type  | addr+postcode | addr+housenumber | geometry |\n           | N35 | place | house | 4567          | 5                | country:ch |\n        And refreshing postcodes\n        Then location_postcodes contains exactly\n           | country_code | postcode | centroid!wkt |\n           | de           | 01982    | country:de |\n           | ch           | 4567     | country:ch |\n           | fr           | 99201    | country:fr |\n\n     Scenario: When the last postcode is deleted, it is deleted from postcode\n        Given the places\n           | osm | class | type  | addr+postcode | addr+housenumber | geometry |\n           | N34 | place | house | 01982         | 111              | country:de |\n           | N35 | place | house | 4567          | 5                | country:ch |\n        When importing\n        And marking for delete N34\n        And refreshing postcodes\n        Then location_postcodes contains exactly\n           | country_code | postcode | centroid!wkt |\n           | ch           | 4567     | country:ch |\n\n     Scenario: A postcode is not deleted from postcode when it exist in another country\n        Given the places\n           | osm | class | type  | addr+postcode | addr+housenumber | geometry |\n           | N34 | place | house | 01982         | 111              | country:de |\n           | N35 | place | house | 01982         | 5                | country:fr |\n        When importing\n        And marking for delete N34\n        And refreshing postcodes\n        Then location_postcodes contains exactly\n           | country_code | postcode | centroid!wkt|\n           | fr           | 01982    | country:fr |\n\n     Scenario: Updating a postcode is reflected in postcode table\n        Given the places\n           | osm | class | type     | addr+postcode | geometry |\n           | N34 | place | postcode | 01982         | country:de |\n        When importing\n        And updating places\n           | osm | class | type     | addr+postcode |  geometry |\n           | N34 | place | postcode | 20453         | country:de |\n        And refreshing postcodes\n        Then location_postcodes contains exactly\n           | country_code | postcode | centroid!wkt |\n           | de           | 20453    | country:de |\n\n    Scenario: When a parent is deleted, the postcode gets a new parent\n        Given the grid with origin DE\n           | 1 |   | 3 | 4 |\n           |   | 9 |   |   |\n           | 2 |   | 5 | 6 |\n        Given the places\n           | osm | class    | type           | name  | admin | geometry    |\n           | R1  | boundary | administrative | Big   | 6     | (1,4,6,2,1) |\n           | R2  | boundary | administrative | Small | 6     | (1,3,5,2,1) |\n        Given the postcodes\n           | osm | postcode | centroid |\n           | N9  | 12345    | 9        |\n        When importing\n        Then location_postcodes contains exactly\n           | postcode | centroid!wkt | parent_place_id |\n           | 12345    | 9            | R2              |\n        When marking for delete R2\n        Then location_postcodes contains exactly\n           | country_code | postcode | centroid!wkt | parent_place_id |\n           | de           | 12345    | 9            | R1              |\n\n    Scenario: When a postcode area appears, postcode points are shadowed\n        Given the grid with origin DE\n           | 1 |   | 3 |   |\n           |   | 9 |   | 8 |\n           | 2 |   | 5 |   |\n        Given the postcodes\n           | osm | postcode | centroid |\n           | N92 | 44321    | 9        |\n           | N4  | 00245    | 8        |\n        When importing\n        Then location_postcodes contains exactly\n           | country_code | postcode | osm_id | centroid!wkt |\n           | de           | 44321    | -      | 9            |\n           | de           | 00245    | -      | 8            |\n        Given the postcodes\n           | osm | postcode | centroid | geometry    |\n           | R45 | 00245    | 9        | (1,3,5,2,1) |\n        When refreshing postcodes\n        Then location_postcodes contains exactly\n           | country_code | postcode | osm_id | centroid!wkt |\n           | de           | 00245    | 45     | 9            |\n\n    Scenario: When a postcode area disappears, postcode points are unshadowed\n        Given the grid with origin DE\n           | 1 |   | 3 |   |\n           |   | 9 |   | 8 |\n           | 2 |   | 5 |   |\n        Given the postcodes\n           | osm | postcode | centroid | geometry    |\n           | R45 | 00245    | 9        | (1,3,5,2,1) |\n        Given the postcodes\n           | osm | postcode | centroid |\n           | N92 | 44321    | 9        |\n           | N4  | 00245    | 8        |\n        When importing\n        Then location_postcodes contains exactly\n           | country_code | postcode | osm_id | centroid!wkt |\n           | de           | 00245    | 45     | 9            |\n        When marking for delete R45\n        And refreshing postcodes\n        Then location_postcodes contains exactly\n           | country_code | postcode | osm_id | centroid!wkt |\n           | de           | 44321    | -      | 9            |\n           | de           | 00245    | -      | 8            |\n"
  },
  {
    "path": "test/bdd/features/db/update/simple.feature",
    "content": "Feature: Update of simple objects\n    Testing simple updating functionality\n\n    Scenario: Do delete small boundary features\n        Given the 1.0 grid\n          | 1 | 2 |\n          | 4 | 3 |\n        Given the places\n          | osm | class    | type           | admin | geometry |\n          | R1  | boundary | administrative | 3     | (1,2,3,4,1) |\n        When importing\n        Then placex contains\n          | object | rank_search |\n          | R1     | 6 |\n        When marking for delete R1\n        Then placex has no entry for R1\n\n    Scenario: Do not delete large boundary features\n        Given the 2.0 grid\n          | 1 | 2 |\n          | 4 | 3 |\n        Given the places\n          | osm | class    | type           | admin | geometry |\n          | R1  | boundary | administrative | 3     | (1,2,3,4,1) |\n        When importing\n        Then placex contains\n          | object | rank_search |\n          | R1     | 6 |\n        When marking for delete R1\n        Then placex contains\n          | object | rank_search |\n          | R1     | 6 |\n\n    Scenario: Do delete large features of low rank\n        Given the 2.0 grid\n          | 1 | 2 |\n          | 4 | 3 |\n        Given the named places\n          | osm | class    | type        | geometry |\n          | W1  | place    | house       | (1,2,3,4,1) |\n          | R1  | natural  | wood        | (1,2,3,4,1) |\n          | R2  | highway  | residential | (1,2,3,4,1) |\n        When importing\n        Then placex contains\n          | object | rank_address |\n          | R1     | 0 |\n          | R2     | 26 |\n          | W1     | 30 |\n        When marking for delete R1\n        And marking for delete R2\n        And marking for delete W1\n        Then placex has no entry for W1\n        Then placex has no entry for R1\n        Then placex has no entry for R2\n\n    Scenario: type mutation\n        Given the places\n          | osm | class | type | geometry |\n          | N3  | shop  | toys | 1 -1 |\n        When importing\n        Then placex contains\n          | object | class | type | centroid!wkt |\n          | N3     | shop  | toys | 1 -1 |\n        When updating places\n          | osm | class | type    | geometry |\n          | N3  | shop  | grocery | 1 -1 |\n        Then placex contains\n          | object | class | type    | centroid!wkt |\n          | N3     | shop  | grocery | 1 -1 |\n\n    Scenario: remove boundary when changing from polygon to way\n        Given the grid\n          | 1 | 2 |\n          | 3 | 4 |\n        And the places\n          | osm | class    | type           | name | admin | geometry        |\n          | W1  | boundary | administrative | Haha | 5     | (1, 2, 4, 3, 1) |\n        When importing\n        Then placex contains\n          | object |\n          | W1 |\n        When updating places\n          | osm | class    | type           | name | admin | geometry   |\n          | W1  | boundary | administrative | Haha | 5     | 1, 2, 4, 3 |\n        Then placex has no entry for W1\n\n     #895\n     Scenario: update rank when boundary is downgraded from admin to historic\n        Given the grid\n          | 1 | 2 |\n          | 3 | 4 |\n        And the places\n          | osm | class    | type           | name | admin | geometry        |\n          | W1  | boundary | administrative | Haha | 5     | (1, 2, 4, 3, 1) |\n        When importing\n        Then placex contains\n          | object | rank_address |\n          | W1     | 10           |\n        When updating places\n          | osm | class    | type           | name | admin | geometry        |\n          | W1  | boundary | historic       | Haha | 5     | (1, 2, 4, 3, 1) |\n        Then placex contains\n          | object | rank_address |\n          | W1     | 0            |\n"
  },
  {
    "path": "test/bdd/features/osm2pgsql/import/broken.feature",
    "content": "Feature: Import of objects with broken geometries by osm2pgsql\n\n    Scenario: Import way with double nodes\n        When loading osm data\n          \"\"\"\n          n100 x0 y0\n          n101 x0 y0.1\n          n102 x0.1 y0.2\n          w1 Thighway=primary Nn100,n101,n101,n102\n          \"\"\"\n        Then place contains\n          | object | class   | type    | geometry!wkt |\n          | W1     | highway | primary | 0 0, 0 0.1, 0.1 0.2 |\n\n    Scenario: Import of ballon areas\n        Given the grid\n         | 2 |  | 3 |\n         | 1 |  | 4 |\n         | 5 |  |   |\n        When loading osm data\n          \"\"\"\n          n1\n          n2\n          n3\n          n4\n          n5\n          w1 Thighway=unclassified Nn1,n2,n3,n4,n1,n5\n          w2 Thighway=unclassified Nn1,n2,n3,n4,n1\n          w3 Thighway=unclassified Nn1,n2,n3,n4,n3\n          \"\"\"\n        Then place contains\n          | object | geometry!wkt |\n          | W1     | 1,2,3,4,1,5  |\n          | W2     | (1,2,3,4,1)  |\n          | W3     | 1,2,3,4      |\n"
  },
  {
    "path": "test/bdd/features/osm2pgsql/import/custom_style.feature",
    "content": "Feature: Import with custom styles by osm2pgsql\n    Tests for the example customizations given in the documentation.\n\n    Scenario: Custom main tags (set new ones)\n        Given the lua style file\n            \"\"\"\n            local flex = require('import-full')\n\n            flex.set_main_tags{\n                boundary = {administrative = 'named'},\n                highway = {'always', street_lamp = 'named'},\n                landuse = 'fallback'\n            }\n            \"\"\"\n        When loading osm data\n            \"\"\"\n            n10 Tboundary=administrative x0 y0\n            n11 Tboundary=administrative,name=Foo x0 y0\n            n12 Tboundary=electoral x0 y0\n            n13 Thighway=primary x0 y0\n            n14 Thighway=street_lamp x0 y0\n            n15 Thighway=primary,landuse=street x0 y0\n            \"\"\"\n        Then place contains exactly\n            | object | class    | type           |\n            | N11    | boundary | administrative |\n            | N13    | highway  | primary        |\n            | N15    | highway  | primary        |\n\n    Scenario: Custom main tags (modify existing)\n        Given the lua style file\n            \"\"\"\n            local flex = require('import-full')\n\n            flex.modify_main_tags{\n                amenity = {prison = 'delete'},\n                highway = {stop = 'named'},\n                aeroway = 'named'\n            }\n            \"\"\"\n        When loading osm data\n            \"\"\"\n            n10 Tamenity=hotel x0 y0\n            n11 Tamenity=prison x0 y0\n            n12 Thighway=stop x0 y0\n            n13 Thighway=stop,name=BigStop x0 y0\n            n14 Thighway=give_way x0 y0\n            n15 Thighway=bus_stop x0 y0\n            n16 Taeroway=no,name=foo x0 y0\n            n17 Taeroway=taxiway,name=D15 x0 y0\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type     |\n            | N10    | amenity | hotel    |\n            | N13    | highway | stop     |\n            | N15    | highway | bus_stop |\n            | N17    | aeroway | taxiway  |\n\n    Scenario: Prefiltering tags\n        Given the lua style file\n            \"\"\"\n            local flex = require('import-full')\n\n            flex.set_prefilters{\n                delete_keys = {'source', 'source:*'},\n                extra_tags = {amenity = {'yes', 'no'}}\n            }\n            flex.set_main_tags{\n                amenity = 'always',\n                tourism = 'always'\n            }\n            \"\"\"\n        When loading osm data\n            \"\"\"\n            n1 Tamenity=yes x0 y6\n            n2 Tamenity=hospital,source=survey x3 y6\n            n3 Ttourism=hotel,amenity=yes x0 y0\n            n4 Ttourism=hotel,amenity=telephone x0 y0\n            \"\"\"\n        Then place contains exactly\n            | object | class   | extratags!dict   |\n            | N2     | amenity | -                |\n            | N3     | tourism | 'amenity': 'yes' |\n            | N4     | tourism | -                |\n            | N4     | amenity | -                |\n\n    Scenario: Ignore some tags\n        Given the lua style file\n            \"\"\"\n            local flex = require('import-extratags')\n\n            flex.ignore_keys{'ref:*', 'surface'}\n            \"\"\"\n        When loading osm data\n            \"\"\"\n            n100 Thighway=residential,ref=34,ref:bodo=34,surface=gray,extra=1 x0 y0\n            \"\"\"\n        Then place contains exactly\n            | object | name!dict    | extratags!dict |\n            | N100   | 'ref' : '34' | 'extra': '1'   |\n\n\n    Scenario: Add for extratags\n        Given the lua style file\n            \"\"\"\n            local flex = require('import-full')\n\n            flex.add_for_extratags{'ref:*', 'surface'}\n            \"\"\"\n        When loading osm data\n            \"\"\"\n            n100 Thighway=residential,ref=34,ref:bodo=34,surface=gray,extra=1 x0 y0\n            \"\"\"\n        Then place contains exactly\n            | object | name!dict    | extratags!dict  |\n            | N100   | 'ref' : '34' | 'ref:bodo': '34', 'surface': 'gray' |\n\n\n    Scenario: Name tags\n        Given the lua style file\n            \"\"\"\n            local flex = require('flex-base')\n\n            flex.set_main_tags{highway = {traffic_light = 'named'}}\n            flex.set_name_tags{main = {'name', 'name:*'},\n                               extra = {'ref'}\n                              }\n            \"\"\"\n        When loading osm data\n            \"\"\"\n            n1 Thighway=stop,name=Something x0 y0\n            n2 Thighway=traffic_light,ref=453-4 x0 y0\n            n3 Thighway=traffic_light,name=Greens x0 y0\n            n4 Thighway=traffic_light,name=Red,ref=45 x0 y0\n            \"\"\"\n        Then place contains exactly\n            | object | class   | name!dict                  |\n            | N3     | highway | 'name': 'Greens'           |\n            | N4     | highway | 'name': 'Red', 'ref': '45' |\n\n    Scenario: Modify name tags\n        Given the lua style file\n            \"\"\"\n            local flex = require('import-full')\n\n            flex.modify_name_tags{house = {}, extra = {'o'}}\n            \"\"\"\n        When loading osm data\n            \"\"\"\n            n1 Ttourism=hotel,ref=45,o=good\n            n2 Taddr:housename=Old,addr:street=Away\n            \"\"\"\n        Then place contains exactly\n            | object | class   | name!dict   |\n            | N1     | tourism | 'o': 'good' |\n\n    Scenario: Address tags\n        Given the lua style file\n            \"\"\"\n            local flex = require('import-full')\n\n            flex.set_address_tags{\n                main = {'addr:housenumber'},\n                extra = {'addr:*'},\n                postcode = {'postal_code', 'postcode', 'addr:postcode'},\n                country = {'country-code', 'ISO3166-1'}\n            }\n            \"\"\"\n        When loading osm data\n            \"\"\"\n            n1 Ttourism=hotel,addr:street=Foo x0 y0\n            n2 Taddr:housenumber=23,addr:street=Budd,postal_code=5567 x0 y0\n            n3 Taddr:street=None,addr:city=Where x0 y0\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type  | address!dict |\n            | N1     | tourism | hotel | 'street': 'Foo' |\n            | N2     | place   | house | 'housenumber': '23', 'street': 'Budd', 'postcode': '5567' |\n\n    Scenario: Modify address tags\n        Given the lua style file\n            \"\"\"\n            local flex = require('import-full')\n\n            flex.set_address_tags{\n                extra = {'addr:*'},\n            }\n            \"\"\"\n        When loading osm data\n            \"\"\"\n            n2 Taddr:housenumber=23,addr:street=Budd,is_in:city=Faraway,postal_code=5567 x0 y0\n            \"\"\"\n        Then place contains exactly\n            | object | class | type  | address!dict |\n            | N2     | place | house | 'housenumber': '23', 'street': 'Budd', 'postcode': '5567' |\n\n    Scenario: Unused handling (delete)\n        Given the lua style file\n            \"\"\"\n            local flex = require('import-full')\n\n            flex.set_address_tags{\n                main = {'addr:housenumber'},\n                extra = {'addr:*', 'tiger:county'}\n            }\n            flex.set_unused_handling{delete_keys = {'tiger:*'}}\n            \"\"\"\n        When loading osm data\n            \"\"\"\n            n1 Ttourism=hotel,tiger:county=Fargo x0 y0\n            n2 Ttourism=hotel,tiger:xxd=56,else=other x0 y0\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type  | address!dict            | extratags!dict   |\n            | N1     | tourism | hotel | 'tiger:county': 'Fargo' | -                |\n            | N2     | tourism | hotel | -                       | 'else': 'other'  |\n\n    Scenario: Unused handling (extra)\n        Given the lua style file\n            \"\"\"\n            local flex = require('flex-base')\n            flex.set_main_tags{highway = 'always',\n                               wikipedia = 'extra'}\n            flex.add_for_extratags{'wikipedia:*', 'wikidata'}\n            flex.set_unused_handling{extra_keys = {'surface'}}\n            \"\"\"\n        When loading osm data\n            \"\"\"\n            n100 Thighway=path,foo=bar,wikipedia=en:Path x0 y0\n            n234 Thighway=path,surface=rough x0 y0\n            n445 Thighway=path,name=something x0 y0\n            n446 Thighway=path,wikipedia:en=Path,wikidata=Q23 x0 y0\n            n567 Thighway=path,surface=dirt,wikipedia:en=Path x0 y0\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type  | extratags!dict         |\n            | N100   | highway | path  | 'wikipedia': 'en:Path' |\n            | N234   | highway | path  | 'surface': 'rough' |\n            | N445   | highway | path  | - |\n            | N446   | highway | path  | 'wikipedia:en': 'Path', 'wikidata': 'Q23' |\n            | N567   | highway | path  | 'surface': 'dirt', 'wikipedia:en': 'Path' |\n\n    Scenario: Additional relation types\n        Given the lua style file\n            \"\"\"\n            local flex = require('import-full')\n\n            flex.RELATION_TYPES['site'] = flex.relation_as_multipolygon\n            \"\"\"\n        And the grid\n            | 1 | 2 |\n            | 4 | 3 |\n        When loading osm data\n            \"\"\"\n            n1\n            n2\n            n3\n            n4\n            w1 Nn1,n2,n3,n4,n1\n            r1 Ttype=multipolygon,amenity=school Mw1@\n            r2 Ttype=site,amenity=school Mw1@\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type   |\n            | R1     | amenity | school |\n            | R2     | amenity | school |\n\n    Scenario: Exclude country relations\n        Given the lua style file\n            \"\"\"\n            local flex = require('import-full')\n\n            function osm2pgsql.process_relation(object)\n                if object.tags.boundary ~= 'administrative' or object.tags.admin_level ~= '2' then\n                  flex.process_relation(object)\n                end\n            end\n            \"\"\"\n       And the grid\n            | 1 | 2 |\n            | 4 | 3 |\n       When loading osm data\n            \"\"\"\n            n1\n            n2\n            n3\n            n4\n            w1 Nn1,n2,n3,n4,n1\n            r1 Ttype=multipolygon,boundary=administrative,admin_level=4,name=Small Mw1@\n            r2 Ttype=multipolygon,boundary=administrative,admin_level=2,name=Big Mw1@\n            \"\"\"\n        Then place contains exactly\n            | object | class    | type           |\n            | R1     | boundary | administrative |\n\n    Scenario: Customize processing functions\n        Given the lua style file\n            \"\"\"\n            local flex = require('import-full')\n\n            local original_process_tags = flex.process_tags\n\n            function flex.process_tags(o)\n                if o.object.tags.highway ~= nil and o.object.tags.access == 'no' then\n                    return\n                end\n\n                original_process_tags(o)\n            end\n            \"\"\"\n        When loading osm data\n            \"\"\"\n            n1 Thighway=residential x0 y0\n            n2 Thighway=residential,access=no x0 y0\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type        |\n            | N1     | highway | residential |\n"
  },
  {
    "path": "test/bdd/features/osm2pgsql/import/entrances.feature",
    "content": "Feature: Import of entrance objects by osm2pgsql\n    Testing of correct setup of the entrance table\n\n    Scenario: Import simple entrance\n        When loading osm data\n          \"\"\"\n          n1 Tshop=sweets,entrance=yes,access=public x4.5 y-4\n          n2 Trouting:entrance=main x66.1 y0.1\n          n3 Tentrance=main,routing:entrance=foot x1 y2\n          n4 Thighway=bus_stop\n          \"\"\"\n        Then place contains exactly\n          | object | class   | type   |\n          | N1     | shop    | sweets |\n          | N4     | highway | bus_stop |\n        And place_entrance contains exactly\n          | osm_id | type | extratags!dict                       | geometry!wkt |\n          | 1      | yes  | 'shop': 'sweets', 'access': 'public' | 4.5 -4       |\n          | 2      | main | -                                    | 66.1 0.1     |\n          | 3      | main | -                                    | 1 2          |\n\n    Scenario: Addresses and entrance information can exist on the same node\n        When loading osm data\n          \"\"\"\n          n1 Taddr:housenumber=10,addr:street=North,entrance=main\n          \"\"\"\n          Then place contains exactly\n            | object | class | type  | address+housenumber |\n            | N1     | place | house | 10                  |\n          And place_entrance contains exactly\n            | osm_id | type |\n            | 1      | main |\n    Scenario Outline: Entrance import can be disabled\n        Given the lua style file\n            \"\"\"\n            local flex = require('import-full')\n            flex.set_entrance_filter<param>\n            \"\"\"\n        When loading osm data\n          \"\"\"\n          n1 Tentrance=yes,access=public\n          n2 Trouting:entrance=main\n          \"\"\"\n        Then place contains exactly\n          | object |\n        And place_entrance contains exactly\n          | osm_id |\n\n        Examples:\n          | param |\n          | ()    |\n          | (nil) |\n          | {}    |\n          | {include={'access'}} |\n          | {main_tags={}}       |\n\n    Scenario: Entrance import can have custom main tags\n        Given the lua style file\n            \"\"\"\n            local flex = require('import-full')\n            flex.set_entrance_filter{main_tags = {'door'}}\n            \"\"\"\n        When loading osm data\n          \"\"\"\n          n1 Tentrance=yes,access=public\n          n2 Tdoor=foot,entrance=yes\n          \"\"\"\n        Then place contains exactly\n          | object |\n        And place_entrance contains exactly\n          | osm_id | type | extratags!dict    |\n          | 2      | foot | 'entrance': 'yes' |\n\n    Scenario: Entrance import can have custom extra tags included\n        Given the lua style file\n            \"\"\"\n            local flex = require('import-full')\n            flex.set_entrance_filter{main_tags = {'entrance'},\n                                     extra_include = {'access'}}\n            \"\"\"\n        When loading osm data\n          \"\"\"\n          n1 Tentrance=yes,access=public,shop=newspaper\n          n2 Tentrance=yes,shop=sweets\n          \"\"\"\n        Then place_entrance contains exactly\n          | osm_id | type | extratags!dict     |\n          | 1      | yes  | 'access': 'public' |\n          | 2      | yes  | -                  |\n\n    Scenario: Entrance import can have custom extra tags excluded\n        Given the lua style file\n            \"\"\"\n            local flex = require('import-full')\n            flex.set_entrance_filter{main_tags = {'entrance', 'door'},\n                                     extra_exclude = {'shop'}}\n            \"\"\"\n        When loading osm data\n          \"\"\"\n          n1 Tentrance=yes,access=public,shop=newspaper\n          n2 Tentrance=yes,door=yes,shop=sweets\n          \"\"\"\n        Then place_entrance contains exactly\n          | osm_id | type | extratags!dict     |\n          | 1      | yes  | 'access': 'public' |\n          | 2      | yes  | -                  |\n\n    Scenario: Entrance import can have a custom function\n        Given the lua style file\n            \"\"\"\n            local flex = require('import-full')\n            flex.set_entrance_filter(function(object)\n                return {entrance='always', extratags = {ref = '1'}}\n            end)\n            \"\"\"\n        When loading osm data\n          \"\"\"\n          n1 Tentrance=yes,access=public,shop=newspaper\n          n2 Tshop=sweets\n          \"\"\"\n        Then place_entrance contains exactly\n          | osm_id | type   | extratags!dict     |\n          | 1      | always | 'ref': '1'         |\n          | 2      | always | 'ref': '1'         |\n"
  },
  {
    "path": "test/bdd/features/osm2pgsql/import/interpolation.feature",
    "content": "Feature: Import of interpolations\n    Test if interpolation objects are correctly imported into the\n    place_interpolation table\n\n    Background:\n        Given the grid\n            | 1 | 2 |\n            | 4 | 3 |\n\n    Scenario: Simple address interpolations\n        When loading osm data\n            \"\"\"\n            n1\n            n2\n            w13001 Taddr:interpolation=odd,addr:street=Blumenstrasse Nn1,n2\n            w13002 Taddr:interpolation=even,place=city Nn1,n2\n            w13003 Taddr:interpolation=odd Nn1,n1\n            \"\"\"\n        Then place contains exactly\n            | object | class | type |\n            | W13002 | place | city |\n        And place_interpolation contains exactly\n            | osm_id | type | address!dict              | nodes!ints | geometry!wkt |\n            | 13001  | odd  | \"street\": \"Blumenstrasse\" | 1,2        | 1,2          |\n            | 13002  | even | -                         | 1,2        | 1,2          |\n\n    Scenario: Address interpolation with housenumber\n        When loading osm data\n            \"\"\"\n            n1\n            n2\n            n3\n            n4\n            w34 Taddr:interpolation=all,addr:housenumber=2-4,building=yes Nn1,n2,n3,n4,n1\n            w35 Taddr:interpolation=all,addr:housenumber=5,building=yes Nn1,n2,n3,n4,n1\n            w36 Taddr:interpolation=all,addr:housenumber=2a-c Nn1,n2,n3,n4,n1\n            \"\"\"\n        Then place contains exactly\n            | object | class    | type  | address!dict                                |\n            | W35    | building | yes   | \"housenumber\": \"5\", \"interpolation\": \"all\" |\n            | W34    | building | yes   | \"housenumber\": \"2-4\", \"interpolation\": \"all\" |\n            | W36    | place    | house | \"housenumber\": \"2a-c\", \"interpolation\": \"all\" |\n"
  },
  {
    "path": "test/bdd/features/osm2pgsql/import/relation.feature",
    "content": "Feature: Import of relations by osm2pgsql\n    Testing specific relation problems related to members.\n\n    Scenario: Don't import empty waterways\n        When loading osm data\n          \"\"\"\n          n1 Tamenity=prison,name=foo\n          r1 Ttype=waterway,waterway=river,name=XZ Mn1@\n          \"\"\"\n        Then place has no entry for R1\n"
  },
  {
    "path": "test/bdd/features/osm2pgsql/import/simple.feature",
    "content": "Feature: Import of simple objects by osm2pgsql\n    Testing basic tagging in osm2pgsql imports.\n\n    Scenario: Import simple objects\n        When loading osm data\n          \"\"\"\n          n1 Tamenity=prison,name=foo x34.3 y-23\n          n100 x0 y0\n          n101 x0 y0.1\n          n102 x0.1 y0.2\n          n200 x0 y0\n          n201 x0 y1\n          n202 x1 y1\n          n203 x1 y0\n          w1 Tshop=toys,name=tata Nn100,n101,n102\n          w2 Tref=45 Nn200,n201,n202,n203,n200\n          r1 Ttype=multipolygon,tourism=hotel,name=XZ Mn1@,w2@\n          \"\"\"\n        Then place contains exactly\n          | object | class   | type   | name!dict       | geometry!wkt |\n          | N1     | amenity | prison | 'name' : 'foo'  | 34.3 -23 |\n          | W1     | shop    | toys   | 'name' : 'tata' | 0 0, 0 0.1, 0.1 0.2 |\n          | R1     | tourism | hotel  | 'name' : 'XZ'   | (0 0, 0 1, 1 1, 1 0, 0 0) |\n\n    Scenario: Import object with two main tags\n        When loading osm data\n          \"\"\"\n          n1 Ttourism=hotel,amenity=restaurant,name=foo\n          \"\"\"\n        Then place contains exactly\n          | object | class   | type       | name!dict      |\n          | N1     | tourism | hotel      | 'name' : 'foo' |\n          | N1     | amenity | restaurant | 'name' : 'foo' |\n\n    Scenario: Import stand-alone house number with postcode\n        When loading osm data\n          \"\"\"\n          n1 Taddr:housenumber=4,addr:postcode=3345\n          \"\"\"\n        Then place contains exactly\n          | object | class | type |\n          | N1     | place | house |\n\n    Scenario Outline: Tags used by Nominatim internally are always imported\n        Given the lua style file\n            \"\"\"\n            local flex = require('import-<style>')\n            \"\"\"\n        When loading osm data\n            \"\"\"\n            n1 Tboundary=administrative,place=city,name=Foo,wikipedia:de=Foo\n            n2 Tplace=hamlet,wikidata=Q1234321,name=Bar\n            \"\"\"\n        Then place contains exactly\n           | object | class    | extratags!dict         |\n           | N1     | boundary | 'place': 'city', 'wikipedia:de': 'Foo' |\n           | N2     | place    | 'wikidata': 'Q1234321' |\n\n        Examples:\n           | style   |\n           | admin   |\n           | street  |\n           | address |\n           | full    |\n           | extratags |\n"
  },
  {
    "path": "test/bdd/features/osm2pgsql/import/tags.feature",
    "content": "Feature: Tag evaluation\n    Tests if tags are correctly imported into the place table\n\n    Scenario: Main tags as fallback\n        When loading osm data\n            \"\"\"\n            n100 Tjunction=yes,highway=bus_stop\n            n101 Tjunction=yes,name=Bar\n            n200 Tbuilding=yes,amenity=cafe\n            n201 Tbuilding=yes,name=Intersting\n            n202 Tbuilding=yes\n            \"\"\"\n        Then place contains exactly\n            | object | class    | type     |\n            | N100   | highway  | bus_stop |\n            | N101   | junction | yes      |\n            | N200   | amenity  | cafe     |\n            | N201   | building | yes      |\n\n\n    Scenario: Name and reg tags\n        When loading osm data\n            \"\"\"\n            n2001 Thighway=road,name=Foo,alt_name:de=Bar,ref=45\n            n2002 Thighway=road,name:prefix=Pre,name:suffix=Post,ref:de=55\n            n2003 Thighway=yes,name:%20%de=Foo,name=real1\n            n2004 Thighway=yes,name:%a%de=Foo,name=real2\n            n2005 Thighway=yes,name:%9%de=Foo,name:\\\\=real3\n            n2006 Thighway=yes,name:%9%de=Foo,name=rea\\l3\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type | name!dict |\n            | N2001  | highway | road | 'name': 'Foo', 'alt_name:de': 'Bar', 'ref': '45' |\n            | N2002  | highway | road | - |\n            | N2003  | highway | yes  | 'name: de': 'Foo', 'name': 'real1' |\n            | N2004  | highway | yes  | 'name:\\\\nde': 'Foo', 'name': 'real2' |\n            | N2005  | highway | yes  | 'name:\\tde': 'Foo', r'name:\\\\\\\\': 'real3' |\n            | N2006  | highway | yes  | 'name:\\tde': 'Foo', 'name': r'rea\\l3' |\n\n        And place contains\n            | object | extratags!dict |\n            | N2002  | 'name:prefix': 'Pre', 'name:suffix': 'Post', 'ref:de': '55' |\n\n\n    Scenario: Name when using with_name flag\n        When loading osm data\n            \"\"\"\n            n3001 Tbridge=yes,bridge:name=GoldenGate\n            n3002 Tbridge=yes,bridge:name:en=Rainbow\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type | name!dict            |\n            | N3001  | bridge  | yes  | 'name': 'GoldenGate' |\n            | N3002  | bridge  | yes  | 'name:en': 'Rainbow' |\n\n\n    Scenario: Address tags\n        When loading osm data\n            \"\"\"\n            n4001 Taddr:housenumber=34,addr:city=Esmarald,addr:county=Land\n            n4002 Taddr:streetnumber=10,is_in:city=Rootoo,is_in=Gold\n            \"\"\"\n        Then place contains exactly\n            | object | class | address!dict |\n            | N4001  | place | 'housenumber': '34', 'city': 'Esmarald', 'county': 'Land' |\n            | N4002  | place | 'streetnumber': '10', 'city': 'Rootoo' |\n\n\n    Scenario: Country codes\n        When loading osm data\n            \"\"\"\n            n5001 Tshop=yes,country_code=DE\n            n5002 Tshop=yes,country_code=toolong\n            n5003 Tshop=yes,country_code=x\n            n5004 Tshop=yes,addr:country=us\n            n5005 Tshop=yes,country=be\n            n5006 Tshop=yes,addr:country=France\n            \"\"\"\n        Then place contains exactly\n            | object | class | address!dict    |\n            | N5001  | shop  | 'country': 'DE' |\n            | N5002  | shop  | - |\n            | N5003  | shop  | - |\n            | N5004  | shop  | 'country': 'us' |\n            | N5005  | shop  | - |\n            | N5006  | shop  | - |\n\n\n    Scenario: Postcodes\n        When loading osm data\n            \"\"\"\n            n6001 Tshop=bank,addr:postcode=12345\n            n6002 Tshop=bank,tiger:zip_left=34343\n            n6003 Tshop=bank,is_in:postcode=9009\n            n6004 Taddr:postcode=54322\n            \"\"\"\n        Then place contains exactly\n            | object | class | address!dict        |\n            | N6001  | shop  | 'postcode': '12345' |\n            | N6002  | shop  | 'postcode': '34343' |\n            | N6003  | shop  | -                   |\n        And place_postcode contains exactly\n            | object | postcode | geometry |\n            | N6004  | 54322    | -        |\n\n\n    Scenario: Postcode areas\n        When loading osm data\n            \"\"\"\n            n1 x12.36853 y51.50618\n            n2 x12.36853 y51.42362\n            n3 x12.63666 y51.42362\n            n4 x12.63666 y51.50618\n            w1 Nn1,n2,n3,n4,n1\n            w2 Tboundary=postal_code,postal_code=443 Nn1,n2,n3,n4,n1\n            r1 Ttype=boundary,boundary=postal_code,postal_code=3456 Mw1@\n            \"\"\"\n        Then place contains exactly\n            | object |\n        And place_postcode contains exactly\n            | object | postcode | geometry!wkt |\n            | R1     | 3456     | (12.36853 51.50618, 12.36853 51.42362, 12.63666 51.42362, 12.63666 51.50618, 12.36853 51.50618) |\n\n    Scenario: Main with extra\n        When loading osm data\n            \"\"\"\n            n7001 Thighway=primary,bridge=yes,name=1\n            n7002 Thighway=primary,bridge=yes,bridge:name=1\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type    | name!dict   | extratags!dict |\n            | N7001  | highway | primary | 'name': '1' | 'bridge': 'yes' |\n            | N7002  | highway | primary | -           | 'bridge': 'yes', 'bridge:name': '1' |\n            | N7002  | bridge  | yes     | 'name': '1' | 'highway': 'primary', 'bridge:name': '1' |\n\n\n    Scenario: Global fallback and skipping\n        When loading osm data\n            \"\"\"\n            n8001 Tshop=shoes,note:de=Nein,xx=yy\n            n8002 Tshop=shoes,natural=no,ele=234\n            n8003 Tshop=shoes,name:source=survey\n            \"\"\"\n        Then place contains exactly\n            | object | class | name!dict | extratags!dict |\n            | N8001  | shop  |  -        | 'xx': 'yy'   |\n            | N8002  | shop  |  -        | 'ele': '234' |\n            | N8003  | shop  |  -        | -            |\n\n\n    Scenario: Admin levels\n        When loading osm data\n            \"\"\"\n            n9001 Tplace=city\n            n9002 Tplace=city,admin_level=16\n            n9003 Tplace=city,admin_level=x\n            n9004 Tplace=city,admin_level=1\n            n9005 Tplace=city,admin_level=0\n            n9006 Tplace=city,admin_level=2.5\n            \"\"\"\n        Then place contains exactly\n            | object | class | admin_level |\n            | N9001  | place | 15          |\n            | N9002  | place | 15          |\n            | N9003  | place | 15          |\n            | N9004  | place | 1           |\n            | N9005  | place | 15          |\n            | N9006  | place | 15          |\n\n\n    Scenario: Administrative boundaries with place tags\n        When loading osm data\n            \"\"\"\n            n10001 Tboundary=administrative,place=city,name=A\n            n10002 Tboundary=natural,place=city,name=B\n            n10003 Tboundary=administrative,place=island,name=C\n            \"\"\"\n        Then place contains\n            | object | class    | type           | extratags!dict  |\n            | N10001 | boundary | administrative | 'place': 'city' |\n        And place contains\n            | object | class    | type           |\n            | N10002 | boundary | natural        |\n            | N10002 | place    | city           |\n            | N10003 | boundary | administrative |\n            | N10003 | place    | island         |\n\n\n    Scenario: Building fallbacks\n        When loading osm data\n            \"\"\"\n            n12001 Ttourism=hotel,building=yes\n            n12002 Tbuilding=house\n            n12003 Tbuilding=shed,addr:housenumber=1\n            n12004 Tbuilding=yes,name=Das-Haus\n            n12005 Tbuilding=yes,addr:postcode=12345\n            \"\"\"\n        Then place contains exactly\n            | object | class    | type     |\n            | N12001 | tourism  | hotel    |\n            | N12003 | building | shed     |\n            | N12004 | building | yes      |\n        And place_postcode contains exactly\n            | object | postcode | geometry |\n            | N12005 | 12345    | -        |\n\n\n    Scenario: Footways\n        When loading osm data\n            \"\"\"\n            n1 x0.0 y0.0\n            n2 x0 y0.0001\n            w1 Thighway=footway Nn1,n2\n            w2 Thighway=footway,name=Road Nn1,n2\n            w3 Thighway=footway,name=Road,footway=sidewalk Nn1,n2\n            w4 Thighway=footway,name=Road,footway=crossing Nn1,n2\n            w5 Thighway=footway,name=Road,footway=residential Nn1,n2\n            \"\"\"\n        Then place contains exactly\n            | object | name+name |\n            | W2     | Road      |\n            | W5     | Road      |\n\n\n    Scenario: Tourism information\n        When loading osm data\n            \"\"\"\n            n100 Ttourism=information\n            n101 Ttourism=information,name=Generic\n            n102 Ttourism=information,information=guidepost\n            n103 Thighway=information,information=house\n            n104 Ttourism=information,information=yes,name=Something\n            n105 Ttourism=information,information=route_marker,name=3\n            \"\"\"\n        Then place contains exactly\n            | object | class       | type        |\n            | N100   | tourism     | information |\n            | N101   | tourism     | information |\n            | N102   | information | guidepost   |\n            | N103   | highway     | information |\n            | N104   | tourism     | information |\n\n\n    Scenario: Water features\n        When loading osm data\n            \"\"\"\n            n20 Tnatural=water\n            n21 Tnatural=water,name=SomePond\n            n22 Tnatural=water,water=pond\n            n23 Tnatural=water,water=pond,name=Pond\n            n24 Tnatural=water,water=river,name=BigRiver\n            n25 Tnatural=water,water=yes\n            n26 Tnatural=water,water=yes,name=Random\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type  |\n            | N21    | natural | water |\n            | N23    | water   | pond  |\n            | N26    | natural | water |\n\n    Scenario: Drop name for address fallback\n        When loading osm data\n            \"\"\"\n            n1 Taddr:housenumber=23,name=Foo\n            n2 Taddr:housenumber=23,addr:housename=Foo\n            n3 Taddr:housenumber=23\n            \"\"\"\n        Then place contains exactly\n            | object | class    | type  | address!dict        | name!dict |\n            | N1     | place    | house | 'housenumber': '23' | -    |\n            | N2     | place    | house | 'housenumber': '23' | 'addr:housename': 'Foo' |\n            | N3     | place    | house | 'housenumber': '23' | -    |\n\n\n    Scenario: Waterway locks\n        When loading osm data\n            \"\"\"\n            n1 Twaterway=river,lock=yes\n            n2 Twaterway=river,lock=yes,lock_name=LeLock\n            n3 Twaterway=river,lock=yes,name=LeWater\n            n4 Tamenity=parking,lock=yes,lock_name=Gold\n            \"\"\"\n        Then place contains exactly\n            | object | class    | type    | name!dict |\n            | N2     | lock     | yes     | 'name': 'LeLock' |\n            | N3     | waterway | river   | 'name': 'LeWater' |\n            | N4     | amenity  | parking | - |\n"
  },
  {
    "path": "test/bdd/features/osm2pgsql/update/entrances.feature",
    "content": "Feature: Update of entrance objects by osm2pgsql\n    Testing of correct update of the entrance table\n\n    Scenario: A new entrance is added\n        When loading osm data\n          \"\"\"\n          n1 Tshop=shoes\n          \"\"\"\n        Then place_entrance contains exactly\n          | osm_id |\n        When updating osm data\n          \"\"\"\n          n2 Tentrance=yes\n          \"\"\"\n        Then place_entrance contains exactly\n          | osm_id | type |\n          | 2      | yes  |\n\n    Scenario: An existing entrance is deleted\n        When loading osm data\n          \"\"\"\n          n1 Tentrance=yes\n          \"\"\"\n        Then place_entrance contains exactly\n          | osm_id | type |\n          | 1      | yes  |\n        When updating osm data\n          \"\"\"\n          n1 dD\n          \"\"\"\n        Then place_entrance contains exactly\n          | osm_id |\n\n    Scenario: An existing node becomes an entrance\n        When loading osm data\n          \"\"\"\n          n1 Tshop=sweets\n          \"\"\"\n        Then place_entrance contains exactly\n          | osm_id | type |\n        And place contains exactly\n          | object | class |\n          | N1     | shop  |\n        When updating osm data\n          \"\"\"\n          n1 Tshop=sweets,entrance=yes\n          \"\"\"\n        Then place_entrance contains exactly\n          | osm_id | type |\n          | 1      | yes  |\n        And place contains exactly\n          | object | class |\n          | N1     | shop  |\n\n    Scenario: An existing entrance tag is removed\n        When loading osm data\n          \"\"\"\n          n1 Tshop=sweets,entrance=yes\n          \"\"\"\n        Then place_entrance contains exactly\n          | osm_id | type |\n          | 1      | yes  |\n        And place contains exactly\n          | object | class |\n          | N1     | shop  |\n        When updating osm data\n          \"\"\"\n          n1 Tshop=sweets\n          \"\"\"\n        Then place_entrance contains exactly\n          | osm_id | type |\n        And place contains exactly\n          | object | class |\n          | N1     | shop  |\n\n    Scenario: Extratags are added to an entrance\n        When loading osm data\n          \"\"\"\n          n1 Tentrance=yes\n          \"\"\"\n        Then place_entrance contains exactly\n          | osm_id | type | extratags |\n          | 1      | yes  | -         |\n        When updating osm data\n          \"\"\"\n          n1 Tentrance=yes,access=yes\n          \"\"\"\n        Then place_entrance contains exactly\n          | osm_id | type | extratags!dict  |\n          | 1      | yes  | 'access': 'yes' |\n\n    Scenario: Extratags are deleted from an entrance\n        When loading osm data\n          \"\"\"\n          n1 Tentrance=yes,access=yes\n          \"\"\"\n        Then place_entrance contains exactly\n          | osm_id | type | extratags!dict  |\n          | 1      | yes  | 'access': 'yes' |\n        When updating osm data\n          \"\"\"\n          n1 Tentrance=yes\n          \"\"\"\n        Then place_entrance contains exactly\n          | osm_id | type | extratags |\n          | 1      | yes  | -         |\n"
  },
  {
    "path": "test/bdd/features/osm2pgsql/update/interpolations.feature",
    "content": "Feature: Updates of address interpolation objects\n    Test that changes to address interpolation objects are correctly\n    propagated.\n\n    Background:\n        Given the grid\n            | 1 | 2 |\n\n\n    Scenario: Adding a new interpolation\n        When loading osm data\n            \"\"\"\n            n1 Taddr:housenumber=3\n            n2 Taddr:housenumber=17\n            w33 Thighway=residential,name=Tao Nn1,n2\n            \"\"\"\n        Then place contains exactly\n            | object | class | type   |\n            | N1     | place | house  |\n            | N2     | place | house  |\n            | W33    | highway | residential |\n\n        When updating osm data\n            \"\"\"\n            w99 Taddr:interpolation=odd Nn1,n2\n            \"\"\"\n        Then place contains exactly\n            | object | class | type   |\n            | N1     | place | house  |\n            | N2     | place | house  |\n            | W33    | highway | residential |\n        And place_interpolation contains exactly\n            | osm_id | type |\n            | 99     | odd  |\n        When indexing\n        Then placex contains exactly\n            | object | class   | type   |\n            | N1     | place   | house  |\n            | N2     | place   | house  |\n            | W33    | highway | residential |\n        Then location_property_osmline contains exactly\n            | osm_id | startnumber |\n            | 99     | 5           |\n\n\n    Scenario: Delete an existing interpolation\n        When loading osm data\n            \"\"\"\n            n1 Taddr:housenumber=2\n            n2 Taddr:housenumber=7\n            w99 Taddr:interpolation=odd Nn1,n2\n            \"\"\"\n        Then place contains exactly\n            | object | class | type   |\n            | N1     | place | house  |\n            | N2     | place | house  |\n        And place_interpolation contains exactly\n            | osm_id | type |\n            | 99     | odd  |\n\n        When updating osm data\n            \"\"\"\n            w99 v2 dD\n            \"\"\"\n        Then place contains\n            | object | class | type   |\n            | N1     | place | house  |\n            | N2     | place | house  |\n        And place_interpolation contains exactly\n            | osm_id |\n        When indexing\n        Then placex contains exactly\n            | object | class | type   |\n            | N1     | place | house  |\n            | N2     | place | house  |\n        Then location_property_osmline contains exactly\n            | osm_id |\n\n\n    Scenario: Changing an object to an interpolation\n        When loading osm data\n            \"\"\"\n            n1 Taddr:housenumber=3\n            n2 Taddr:housenumber=17\n            w33 Thighway=residential Nn1,n2\n            w99 Thighway=residential Nn1,n2\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type   |\n            | N1     | place   | house  |\n            | N2     | place   | house  |\n            | W33    | highway | residential  |\n            | W99    | highway | residential  |\n        And place_interpolation contains exactly\n            | osm_id |\n\n        When updating osm data\n            \"\"\"\n            w99 Taddr:interpolation=odd Nn1,n2\n            \"\"\"\n        Then place contains exactly\n            | object | class | type   |\n            | N1     | place | house  |\n            | N2     | place | house  |\n            | W33    | highway | residential  |\n        And place_interpolation contains exactly\n            | osm_id | type |\n            | 99     | odd  |\n        When indexing\n        Then placex contains exactly\n            | object | class   | type   |\n            | N1     | place   | house  |\n            | N2     | place   | house  |\n            | W33    | highway | residential |\n        And location_property_osmline contains exactly\n            | osm_id | startnumber |\n            | 99     | 5           |\n\n\n    Scenario: Changing an interpolation to something else\n        When loading osm data\n            \"\"\"\n            n1 Taddr:housenumber=3\n            n2 Taddr:housenumber=17\n            w99 Taddr:interpolation=odd Nn1,n2\n            \"\"\"\n        Then place contains exactly\n            | object | class | type   |\n            | N1     | place | house  |\n            | N2     | place | house  |\n        And place_interpolation contains exactly\n            | osm_id | type |\n            | 99     | odd  |\n\n        When updating osm data\n            \"\"\"\n            w99 Thighway=residential Nn1,n2\n            \"\"\"\n        Then place contains\n            | object | class   | type   |\n            | N1     | place   | house  |\n            | N2     | place   | house  |\n            | W99    | highway | residential  |\n        And place_interpolation contains exactly\n            | osm_id |\n        When indexing\n        Then placex contains exactly\n            | object | class   | type   |\n            | N1     | place   | house  |\n            | N2     | place   | house  |\n            | W99    | highway | residential  |\n        And location_property_osmline contains exactly\n            | osm_id |\n"
  },
  {
    "path": "test/bdd/features/osm2pgsql/update/postcodes.feature",
    "content": "Feature: Update of postcode only objects\n    Tests that changes to objects containing only a postcode are\n    propagated correctly.\n\n    Scenario: Adding a postcode-only node\n        When loading osm data\n            \"\"\"\n            n1\n            \"\"\"\n        Then place contains exactly\n            | object |\n\n        When updating osm data\n            \"\"\"\n            n34 Tpostcode=4456\n            \"\"\"\n        Then place_postcode contains exactly\n            | object | postcode |\n            | N34    | 4456     |\n        And place contains exactly\n            | object |\n\n\n    Scenario: Deleting a postcode-only node\n        When loading osm data\n            \"\"\"\n            n34 Tpostcode=4456\n            \"\"\"\n        Then place_postcode contains exactly\n            | object | postcode |\n            | N34    | 4456     |\n        And place contains exactly\n            | object |\n\n        When updating osm data\n            \"\"\"\n            n34 v2 dD\n            \"\"\"\n        Then place contains exactly\n            | object |\n        And place_postcode contains exactly\n            | object |\n\n\n    Scenario Outline: Converting a regular object into a postcode-only node\n        When loading osm data\n            \"\"\"\n            n34 T<class>=<type>\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type   |\n            | N34    | <class> | <type> |\n\n        When updating osm data\n            \"\"\"\n            n34 Tpostcode=4456\n            \"\"\"\n        Then place contains exactly\n            | object |\n        And place_postcode contains exactly\n            | object | postcode |\n            | N34    | 4456     |\n        When indexing\n        Then placex contains exactly\n            | object |\n\n        Examples:\n            | class   | type       |\n            | amenity | restaurant |\n            | place   | hamlet     |\n\n\n    Scenario Outline: Converting a postcode-only node into a regular object\n        When loading osm data\n            \"\"\"\n            n34 Tpostcode=4456\n            \"\"\"\n        Then place_postcode contains exactly\n            | object | postcode |\n            | N34    | 4456     |\n\n        When updating osm data\n            \"\"\"\n            n34 T<class>=<type>\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type   |\n            | N34    | <class> | <type> |\n        And place_postcode contains exactly\n            | object |\n        When indexing\n        Then placex contains exactly\n            | object | class   | type   |\n            | N34    | <class> | <type> |\n\n        Examples:\n            | class   | type       |\n            | amenity | restaurant |\n            | place   | hamlet     |\n\n\n    Scenario: Converting an interpolation into a postcode-only node\n        Given the grid\n            | 1 | 2 |\n        When loading osm data\n            \"\"\"\n            n1 Taddr:housenumber=3\n            n2 Taddr:housenumber=17\n            w34 Taddr:interpolation=odd Nn1,n2\n            \"\"\"\n        Then place contains exactly\n            | object | class | type   |\n            | N1     | place | house  |\n            | N2     | place | house  |\n        And place_interpolation contains exactly\n            | osm_id | type |\n            | 34     | odd  |\n\n        When updating osm data\n            \"\"\"\n            w34 Tpostcode=4456 Nn1,n2\n            \"\"\"\n        Then place contains exactly\n            | object | class | type     |\n            | N1     | place | house    |\n            | N2     | place | house    |\n        And place_postcode contains exactly\n            | object | postcode |\n            | W34    | 4456     |\n        And place_interpolation contains exactly\n            | osm_id |\n        When indexing\n        Then location_property_osmline contains exactly\n            | osm_id |\n\n\n    Scenario: Converting a postcode-only node into an interpolation\n        Given the grid\n            | 1 | 2 |\n        When loading osm data\n            \"\"\"\n            n1 Taddr:housenumber=3\n            n2 Taddr:housenumber=17\n            w33 Thighway=residential Nn1,n2\n            w34 Tpostcode=4456 Nn1,n2\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type     |\n            | N1     | place   | house    |\n            | N2     | place   | house    |\n            | W33    | highway | residential |\n        And place_postcode contains exactly\n            | object | postcode |\n            | W34    | 4456     |\n\n        When updating osm data\n            \"\"\"\n            w34 Taddr:interpolation=odd Nn1,n2\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type   |\n            | N1     | place   | house  |\n            | N2     | place   | house  |\n            | W33    | highway | residential |\n        And place_interpolation contains exactly\n            | osm_id | type |\n            | 34     | odd  |\n        And place_postcode contains exactly\n            | object |\n        When indexing\n        Then location_property_osmline contains exactly\n            | osm_id | startnumber | endnumber |\n            | 34     | 5           | 15        |\n        And placex contains exactly\n            | object | class   | type   |\n            | N1     | place   | house  |\n            | N2     | place   | house  |\n            | W33    | highway | residential |\n"
  },
  {
    "path": "test/bdd/features/osm2pgsql/update/relation.feature",
    "content": "Feature: Update of relations by osm2pgsql\n    Testing relation update by osm2pgsql.\n\n    Scenario: Remove all members of a relation\n        When loading osm data\n          \"\"\"\n          n1 Tamenity=prison,name=foo\n          n200 x0 y0\n          n201 x0 y0.0001\n          n202 x0.0001 y0.0001\n          n203 x0.0001 y0\n          w2 Tref=45' Nn200,n201,n202,n203,n200\n          r1 Ttype=multipolygon,tourism=hotel,name=XZ Mw2@\n          \"\"\"\n        Then place contains\n          | object | class   | type   | name!dict |\n          | R1     | tourism | hotel  | 'name' : 'XZ' |\n          When updating osm data\n            \"\"\"\n            r1 Ttype=multipolygon,tourism=hotel,name=XZ Mn1@\n            \"\"\"\n        Then place has no entry for R1\n\n\n    Scenario: Change type of a relation\n        When loading osm data\n          \"\"\"\n          n200 x0 y0\n          n201 x0 y0.0001\n          n202 x0.0001 y0.0001\n          n203 x0.0001 y0\n          w2 Tref=45 Nn200,n201,n202,n203,n200\n          r1 Ttype=multipolygon,tourism=hotel,name=XZ Mw2@\n          \"\"\"\n        Then place contains\n          | object | class   | type   | name!dict |\n          | R1     | tourism | hotel  | 'name' : 'XZ' |\n        When updating osm data\n          \"\"\"\n          r1 Ttype=multipolygon,amenity=prison,name=XZ Mw2@\n          \"\"\"\n        Then place has no entry for R1:tourism\n        And place contains\n          | object | class   | type   | name!dict |\n          | R1     | amenity | prison | 'name' : 'XZ' |\n\n    Scenario: Change name of a relation\n        When loading osm data\n          \"\"\"\n          n200 x0 y0\n          n201 x0 y0.0001\n          n202 x0.0001 y0.0001\n          n203 x0.0001 y0\n          w2 Tref=45 Nn200,n201,n202,n203,n200\n          r1 Ttype=multipolygon,tourism=hotel,name=AB Mw2@\n          \"\"\"\n        Then place contains\n          | object | class   | type   | name!dict |\n          | R1     | tourism | hotel  | 'name' : 'AB' |\n        When updating osm data\n          \"\"\"\n          r1 Ttype=multipolygon,tourism=hotel,name=XY Mw2@\n          \"\"\"\n        Then place contains\n          | object | class   | type   | name!dict |\n          | R1     | tourism | hotel  | 'name' : 'XY' |\n\n    Scenario: Change type of a relation into something unknown\n        When loading osm data\n          \"\"\"\n          n200 x0 y0\n          n201 x0 y0.0001\n          n202 x0.0001 y0.0001\n          n203 x0.0001 y0\n          w2 Tref=45 Nn200,n201,n202,n203,n200\n          r1 Ttype=multipolygon,tourism=hotel,name=XY Mw2@\n          \"\"\"\n        Then place contains\n          | object | class   | type   | name!dict |\n          | R1     | tourism | hotel  | 'name' : 'XY' |\n        When updating osm data\n          \"\"\"\n          r1 Ttype=multipolygon,amenities=prison,name=XY Mw2@\n          \"\"\"\n        Then place has no entry for R1\n\n    Scenario: Type tag is removed\n        When loading osm data\n          \"\"\"\n          n200 x0 y0\n          n201 x0 y0.0001\n          n202 x0.0001 y0.0001\n          n203 x0.0001 y0\n          w2 Tref=45 Nn200,n201,n202,n203,n200\n          r1 Ttype=multipolygon,tourism=hotel,name=XY Mw2@\n          \"\"\"\n        Then place contains\n          | object | class   | type   | name!dict |\n          | R1     | tourism | hotel  | 'name' : 'XY' |\n        When updating osm data\n          \"\"\"\n          r1 Ttourism=hotel,name=XY Mw2@\n          \"\"\"\n        Then place has no entry for R1\n\n    Scenario: Type tag is renamed to something unknown\n        When loading osm data\n          \"\"\"\n          n200 x0 y0\n          n201 x0 y0.0001\n          n202 x0.0001 y0.0001\n          n203 x0.0001 y0\n          w2 Tref=45 Nn200,n201,n202,n203,n200\n          r1 Ttype=multipolygon,tourism=hotel,name=XY Mw2@\n          \"\"\"\n        Then place contains\n          | object | class   | type   | name!dict |\n          | R1     | tourism | hotel  | 'name' : 'XY' |\n        When updating osm data\n          \"\"\"\n          r1 Ttype=multipolygonn,tourism=hotel,name=XY Mw2@\n          \"\"\"\n        Then place has no entry for R1\n\n    Scenario: Country boundary names are left untouched when country_code unknown\n        When loading osm data\n          \"\"\"\n          n200 Tamenity=prison x0 y0\n          n201 x0 y0.0001\n          n202 x0.0001 y0.0001\n          n203 x0.0001 y0\n          \"\"\"\n        And updating osm data\n          \"\"\"\n          w1 Nn200,n201,n202,n203,n200\n          r1 Ttype=boundary,boundary=administrative,name=Foo,country_code=XX,admin_level=2 Mw1@\n          \"\"\"\n        Then place contains\n          | object | address+country | name!dict      |\n          | R1     | XX              | 'name' : 'Foo' |\n"
  },
  {
    "path": "test/bdd/features/osm2pgsql/update/simple.feature",
    "content": "Feature: Update of simple objects by osm2pgsql\n    Testing basic update functions of osm2pgsql.\n\n    Scenario: Adding a new object\n        When loading osm data\n          \"\"\"\n          n1 Tplace=town,name=Middletown\n          \"\"\"\n        Then place contains exactly\n          | object | class | type | name+name  |\n          | N1     | place | town | Middletown |\n\n       When updating osm data\n         \"\"\"\n         n2 Tamenity=hotel,name=Posthotel\n         \"\"\"\n        Then place contains exactly\n          | object | class   | type  | name+name  |\n          | N1     | place   | town  | Middletown |\n          | N2     | amenity | hotel | Posthotel  |\n        And placex contains exactly\n          | object | class   | type  | name+name  | indexed_status |\n          | N1     | place   | town  | Middletown | 0              |\n          | N2     | amenity | hotel | Posthotel  | 1              |\n\n\n    Scenario: Deleting an existing object\n        When loading osm data\n          \"\"\"\n          n1 Tplace=town,name=Middletown\n          n2 Tamenity=hotel,name=Posthotel\n          \"\"\"\n        Then place contains exactly\n          | object | class   | type  | name+name  |\n          | N1     | place   | town  | Middletown |\n          | N2     | amenity | hotel | Posthotel  |\n\n       When updating osm data\n         \"\"\"\n         n2 dD\n         \"\"\"\n        Then place contains exactly\n          | object | class | type  | name+name  |\n          | N1     | place | town  | Middletown |\n        And placex contains exactly\n          | object | class   | type  | name+name  | indexed_status |\n          | N1     | place   | town  | Middletown | 0              |\n          | N2     | amenity | hotel | Posthotel  | 100            |\n"
  },
  {
    "path": "test/bdd/features/osm2pgsql/update/tags.feature",
    "content": "Feature: Tag evaluation\n    Tests if tags are correctly updated in the place table\n\n    Background:\n        Given the grid\n            | 1  | 2  | 3 |\n            | 10 | 11 |   |\n            | 45 | 46 |   |\n\n    Scenario: Main tag deleted\n        When loading osm data\n            \"\"\"\n            n1 Tamenity=restaurant\n            n2 Thighway=bus_stop,railway=stop,name=X\n            n3 Tamenity=prison\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type       |\n            | N1     | amenity | restaurant |\n            | N2     | highway | bus_stop   |\n            | N2     | railway | stop       |\n            | N3     | amenity | prison     |\n\n        When updating osm data\n            \"\"\"\n            n1 Tnot_a=restaurant\n            n2 Thighway=bus_stop,name=X\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type       |\n            | N2     | highway | bus_stop   |\n            | N3     | amenity | prison     |\n        And placex contains\n            | object | class   | indexed_status |\n            | N3     | amenity | 0              |\n        When indexing\n        Then placex contains exactly\n            | object | class   | type     | name!dict   |\n            | N2     | highway | bus_stop | 'name': 'X' |\n            | N3     | amenity | prison   | -           |\n\n\n    Scenario: Main tag added\n        When loading osm data\n            \"\"\"\n            n1 Tatity=restaurant\n            n2 Thighway=bus_stop,name=X\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type       |\n            | N2     | highway | bus_stop   |\n\n        When updating osm data\n            \"\"\"\n            n1 Tamenity=restaurant\n            n2 Thighway=bus_stop,railway=stop,name=X\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type       |\n            | N1     | amenity | restaurant |\n            | N2     | highway | bus_stop   |\n            | N2     | railway | stop       |\n        When indexing\n        Then placex contains exactly\n            | object | class   | type       | name!dict   |\n            | N1     | amenity | restaurant | -           |\n            | N2     | highway | bus_stop   | 'name': 'X' |\n            | N2     | railway | stop       | 'name': 'X' |\n\n\n    Scenario: Main tag modified\n        When loading osm data\n            \"\"\"\n            n10 Thighway=footway,name=X\n            n11 Tamenity=atm\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type    |\n            | N10    | highway | footway |\n            | N11    | amenity | atm     |\n\n        When updating osm data\n            \"\"\"\n            n10 Thighway=path,name=X\n            n11 Thighway=primary\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type    |\n            | N10    | highway | path    |\n            | N11    | highway | primary |\n        When indexing\n        Then placex contains exactly\n            | object | class   | type       | name!dict   |\n            | N10    | highway | path       | 'name': 'X' |\n            | N11    | highway | primary    | -           |\n\n\n    Scenario: Main tags with name, name added\n        When loading osm data\n            \"\"\"\n            n45 Tlanduse=cemetry\n            n46 Tbuilding=yes\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type    |\n\n        When updating osm data\n            \"\"\"\n            n45 Tlanduse=cemetry,name=TODO\n            n46 Tbuilding=yes,addr:housenumber=1\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type    |\n            | N45    | landuse | cemetry |\n            | N46    | building| yes     |\n        When indexing\n        Then placex contains exactly\n            | object | class   | type       | name!dict      | address!dict       |\n            | N45    | landuse | cemetry    | 'name': 'TODO' | -                  |\n            | N46    | building| yes        | -              | 'housenumber': '1' |\n\n\n    Scenario: Main tags with name, name removed\n        When loading osm data\n            \"\"\"\n            n45 Tlanduse=cemetry,name=TODO\n            n46 Tbuilding=yes,addr:housenumber=1\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type    |\n            | N45    | landuse | cemetry |\n            | N46    | building| yes     |\n\n        When updating osm data\n            \"\"\"\n            n45 Tlanduse=cemetry\n            n46 Tbuilding=yes\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type    |\n        When indexing\n        Then placex contains exactly\n            | object      |\n\n    Scenario: Main tags with name, name modified\n        When loading osm data\n            \"\"\"\n            n45 Tlanduse=cemetry,name=TODO\n            n46 Tbuilding=yes,addr:housenumber=1\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type    | name!dict       | address!dict      |\n            | N45    | landuse | cemetry | 'name' : 'TODO' | -                 |\n            | N46    | building| yes     | -               | 'housenumber': '1'|\n\n        When updating osm data\n            \"\"\"\n            n45 Tlanduse=cemetry,name=DONE\n            n46 Tbuilding=yes,addr:housenumber=10\n            \"\"\"\n        Then place contains exactly\n            | object | class   | type    | name!dict       | address!dict       |\n            | N45    | landuse | cemetry | 'name' : 'DONE' | -                  |\n            | N46    | building| yes     | -               | 'housenumber': '10'|\n        When indexing\n        Then placex contains exactly\n            | object | class   | type    | name!dict       | address!dict       |\n            | N45    | landuse | cemetry | 'name' : 'DONE' | -                  |\n            | N46    | building| yes     | -               | 'housenumber': '10'|\n\n\n    Scenario: Main tag added to address only node\n        When loading osm data\n            \"\"\"\n            n1 Taddr:housenumber=345\n            \"\"\"\n        Then place contains exactly\n            | object | class | type  | address!dict |\n            | N1     | place | house | 'housenumber': '345'|\n\n        When updating osm data\n            \"\"\"\n            n1 Taddr:housenumber=345,building=yes\n            \"\"\"\n        Then place contains exactly\n            | object | class    | type  | address!dict |\n            | N1     | building | yes   | 'housenumber': '345'|\n        When indexing\n        Then placex contains exactly\n            | object | class    | type  | address!dict |\n            | N1     | building | yes   | 'housenumber': '345'|\n\n\n    Scenario: Main tag removed from address only node\n        When loading osm data\n            \"\"\"\n            n1 Taddr:housenumber=345,building=yes\n            \"\"\"\n        Then place contains exactly\n            | object | class    | type  | address!dict |\n            | N1     | building | yes   | 'housenumber': '345'|\n\n        When updating osm data\n            \"\"\"\n            n1 Taddr:housenumber=345\n            \"\"\"\n        Then place contains exactly\n            | object | class | type  | address!dict |\n            | N1     | place | house | 'housenumber': '345'|\n        When indexing\n        Then placex contains exactly\n            | object | class | type  | address!dict |\n            | N1     | place | house | 'housenumber': '345'|\n\n\n    Scenario: Main tags with name key, adding key name\n        When loading osm data\n            \"\"\"\n            n2 Tbridge=yes\n            \"\"\"\n        Then place contains exactly\n            | object | class    | type  |\n\n        When updating osm data\n            \"\"\"\n            n2 Tbridge=yes,bridge:name=high\n            \"\"\"\n        Then place contains exactly\n            | object | class    | type  | name!dict      |\n            | N2     | bridge   | yes   | 'name': 'high' |\n        When indexing\n        Then placex contains exactly\n            | object | class    | type  | name!dict      |\n            | N2     | bridge   | yes   | 'name': 'high' |\n\n\n    Scenario: Main tags with name key, deleting key name\n        When loading osm data\n            \"\"\"\n            n2 Tbridge=yes,bridge:name=high\n            \"\"\"\n        Then place contains exactly\n            | object | class    | type  | name!dict      |\n            | N2     | bridge   | yes   | 'name': 'high' |\n\n        When updating osm data\n            \"\"\"\n            n2 Tbridge=yes\n            \"\"\"\n        Then place contains exactly\n            | object |\n        When indexing\n        Then placex contains exactly\n            | object |\n\n\n    Scenario: Main tags with name key, changing key name\n        When loading osm data\n            \"\"\"\n            n2 Tbridge=yes,bridge:name=high\n            \"\"\"\n        Then place contains exactly\n            | object | class    | type  | name!dict      |\n            | N2     | bridge   | yes   | 'name': 'high' |\n\n        When updating osm data\n            \"\"\"\n            n2 Tbridge=yes,bridge:name:en=high\n            \"\"\"\n        Then place contains exactly\n            | object | class  | type | name!dict         |\n            | N2     | bridge | yes  | 'name:en': 'high' |\n        When indexing\n        Then placex contains exactly\n            | object | class  | type | name!dict         |\n            | N2     | bridge | yes  | 'name:en': 'high' |\n\n\n    Scenario: Downgrading a highway to one that is dropped without name\n        When loading osm data\n          \"\"\"\n          n100 x0 y0\n          n101 x0.0001 y0.0001\n          w1 Thighway=residential Nn100,n101\n          \"\"\"\n        Then place contains exactly\n          | object | class |\n          | W1     | highway |\n\n        When updating osm data\n          \"\"\"\n          w1 Thighway=service Nn100,n101\n          \"\"\"\n        Then place contains exactly\n          | object     |\n        When indexing\n        Then placex contains exactly\n            | object |\n\n\n    Scenario: Upgrading a highway to one that is not dropped without name\n        When loading osm data\n          \"\"\"\n          n100 x0 y0\n          n101 x0.0001 y0.0001\n          w1 Thighway=service Nn100,n101\n          \"\"\"\n        Then place contains exactly\n          | object     |\n\n        When updating osm data\n          \"\"\"\n          w1 Thighway=unclassified Nn100,n101\n          \"\"\"\n        Then place contains exactly\n          | object | class   |\n          | W1     | highway |\n        When indexing\n        Then placex contains exactly\n          | object | class   |\n          | W1     | highway |\n\n\n    Scenario: Downgrading a highway when a second tag is present\n        When loading osm data\n          \"\"\"\n          n100 x0 y0\n          n101 x0.0001 y0.0001\n          w1 Thighway=residential,tourism=hotel Nn100,n101\n          \"\"\"\n        Then place contains exactly\n          | object | class   | type        |\n          | W1     | highway | residential |\n          | W1     | tourism | hotel       |\n\n        When updating osm data\n          \"\"\"\n          w1 Thighway=service,tourism=hotel Nn100,n101\n          \"\"\"\n        Then place contains exactly\n          | object | class   | type  |\n          | W1     | tourism | hotel |\n        When indexing\n        Then placex contains exactly\n          | object | class   | type  |\n          | W1     | tourism | hotel |\n\n\n    Scenario: Upgrading a highway when a second tag is present\n        When loading osm data\n          \"\"\"\n          n100 x0 y0\n          n101 x0.0001 y0.0001\n          w1 Thighway=service,tourism=hotel Nn100,n101\n          \"\"\"\n        Then place contains exactly\n          | object | class   | type  |\n          | W1     | tourism | hotel |\n\n        When updating osm data\n          \"\"\"\n          w1 Thighway=residential,tourism=hotel Nn100,n101\n          \"\"\"\n        Then place contains exactly\n          | object | class   | type        |\n          | W1     | highway | residential |\n          | W1     | tourism | hotel       |\n        When indexing\n        Then placex contains exactly\n          | object | class   | type        |\n          | W1     | highway | residential |\n          | W1     | tourism | hotel       |\n\n\n    Scenario: Replay on administrative boundary\n        When loading osm data\n          \"\"\"\n          n10 x34.0 y-4.23\n          n11 x34.1 y-4.23\n          n12 x34.2 y-4.13\n          w10 Tboundary=administrative,waterway=river,name=Border,admin_level=2 Nn12,n11,n10\n          \"\"\"\n        Then place contains exactly\n          | object | class    | type           | admin_level | name!dict        |\n          | W10    | waterway | river          | 2           | 'name': 'Border' |\n          | W10    | boundary | administrative | 2           | 'name': 'Border' |\n\n        When updating osm data\n          \"\"\"\n          w10 Tboundary=administrative,waterway=river,name=Border,admin_level=2 Nn12,n11,n10\n          \"\"\"\n        Then place contains exactly\n          | object | class    | type           | admin_level | name!dict        |\n          | W10    | waterway | river          | 2           | 'name': 'Border' |\n          | W10    | boundary | administrative | 2           | 'name': 'Border' |\n        When indexing\n        Then placex contains exactly\n          | object | class    | type           | admin_level | name!dict        |\n          | W10    | waterway | river          | 2           | 'name': 'Border' |\n\n\n    Scenario: Change admin_level on administrative boundary\n        Given the grid\n          | 10 | 11 |\n          | 13 | 12 |\n        When loading osm data\n          \"\"\"\n          n10\n          n11\n          n12\n          n13\n          w10 Nn10,n11,n12,n13,n10\n          r10 Ttype=multipolygon,boundary=administrative,name=Border,admin_level=2 Mw10@\n          \"\"\"\n        Then place contains exactly\n          | object | class    | admin_level |\n          | R10    | boundary | 2           |\n\n        When updating osm data\n          \"\"\"\n          r10 Ttype=multipolygon,boundary=administrative,name=Border,admin_level=4 Mw10@\n          \"\"\"\n        Then place contains exactly\n          | object | class    | type           | admin_level |\n          | R10    | boundary | administrative | 4           |\n        When indexing\n        Then placex contains exactly\n          | object | class    | type           | admin_level |\n          | R10    | boundary | administrative | 4           |\n\n\n    Scenario: Change boundary to administrative\n        Given the grid\n          | 10 | 11 |\n          | 13 | 12 |\n        When loading osm data\n          \"\"\"\n          n10\n          n11\n          n12\n          n13\n          w10 Nn10,n11,n12,n13,n10\n          r10 Ttype=multipolygon,boundary=informal,name=Border,admin_level=4 Mw10@\n          \"\"\"\n        Then place contains exactly\n          | object | class    | type     | admin_level |\n          | R10    | boundary | informal | 4           |\n\n        When updating osm data\n          \"\"\"\n          r10 Ttype=multipolygon,boundary=administrative,name=Border,admin_level=4 Mw10@\n          \"\"\"\n        Then place contains exactly\n          | object | class    | type           | admin_level |\n          | R10    | boundary | administrative | 4           |\n        When indexing\n        Then placex contains exactly\n          | object | class    | type           | admin_level |\n          | R10    | boundary | administrative | 4           |\n\n\n    Scenario: Change boundary away from administrative\n        Given the grid\n          | 10 | 11 |\n          | 13 | 12 |\n        When loading osm data\n          \"\"\"\n          n10\n          n11\n          n12\n          n13\n          w10 Nn10,n11,n12,n13,n10\n          r10 Ttype=multipolygon,boundary=administrative,name=Border,admin_level=4 Mw10@\n          \"\"\"\n        Then place contains exactly\n          | object | class    | type           | admin_level |\n          | R10    | boundary | administrative | 4           |\n\n        When updating osm data\n          \"\"\"\n          r10 Ttype=multipolygon,boundary=informal,name=Border,admin_level=4 Mw10@\n          \"\"\"\n        Then place contains exactly\n          | object | class    | type     | admin_level |\n          | R10    | boundary | informal | 4           |\n        When indexing\n        Then placex contains exactly\n          | object | class    | type     | admin_level |\n          | R10    | boundary | informal | 4           |\n\n\n    Scenario: Main tag and geometry is changed\n        When loading osm data\n          \"\"\"\n          n1 x40 y40\n          n2 x40.0001 y40\n          n3 x40.0001 y40.0001\n          n4 x40 y40.0001\n          w5 Tbuilding=house,name=Foo Nn1,n2,n3,n4,n1\n          \"\"\"\n        Then place contains exactly\n          | object | class    | type  |\n          | W5     | building | house |\n\n        When updating osm data\n          \"\"\"\n          n1 x39.999 y40\n          w5 Tbuilding=terrace,name=Bar Nn1,n2,n3,n4,n1\n          \"\"\"\n        Then place contains exactly\n          | object | class    | type    |\n          | W5     | building | terrace |\n"
  },
  {
    "path": "test/bdd/test_api.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nCollector for all BDD API tests.\n\nThese tests work on a static test database that is the same for all tests.\nThe source data for the database can be found in the test/testdb directory.\n\"\"\"\nfrom pathlib import Path\nimport xml.etree.ElementTree as ET\n\nimport pytest\nfrom pytest_bdd.parsers import re as step_parse\nfrom pytest_bdd import when, given, then\n\nfrom nominatim_db import cli\nfrom nominatim_db.config import Configuration\n\nfrom utils.db import DBManager\nfrom utils.api_runner import APIRunner\nfrom utils.api_result import APIResult\n\n\nTESTDB_PATH = (Path(__file__) / '..' / '..' / 'testdb').resolve()\n\nCONTENT_TYPES = {\n    'json': 'application/json; charset=utf-8',\n    'xml': 'text/xml; charset=utf-8',\n    'geojson': 'application/json; charset=utf-8',\n    'geocodejson': 'application/json; charset=utf-8',\n    'html': 'text/html; charset=utf-8'\n}\n\n\n@pytest.fixture(autouse=True, scope='session')\ndef session_api_test_db(pytestconfig):\n    \"\"\" Create a Nominatim database from the official API test data.\n        Will only recreate an existing database if --nominatim-purge\n        was set.\n    \"\"\"\n    dbname = pytestconfig.getini('nominatim_api_test_db')\n\n    config = Configuration(None).get_os_env()\n    config['NOMINATIM_DATABASE_DSN'] = f\"pgsql:dbname={dbname}\"\n    config['NOMINATIM_LANGUAGES'] = 'en,de,fr,ja'\n    config['NOMINATIM_USE_US_TIGER_DATA'] = 'yes'\n    if pytestconfig.option.NOMINATIM_TOKENIZER is not None:\n        config['NOMINATIM_TOKENIZER'] = pytestconfig.option.NOMINATIM_TOKENIZER\n\n    dbm = DBManager(purge=pytestconfig.option.NOMINATIM_PURGE)\n\n    if not dbm.check_for_db(dbname):\n        try:\n            cli.nominatim(cli_args=['import', '--project-dir', str(TESTDB_PATH),\n                                    '--osm-file', str(TESTDB_PATH / 'apidb-test-data.pbf')],\n                          environ=config)\n            cli.nominatim(cli_args=['add-data', '--project-dir', str(TESTDB_PATH),\n                                    '--tiger-data', str(TESTDB_PATH / 'tiger')],\n                          environ=config)\n            cli.nominatim(cli_args=['freeze', '--project-dir', str(TESTDB_PATH)],\n                          environ=config)\n            cli.nominatim(cli_args=['special-phrases', '--project-dir', str(TESTDB_PATH),\n                                    '--import-from-csv',\n                                    str(TESTDB_PATH / 'full_en_phrases_test.csv')],\n                          environ=config)\n        except:  # noqa: E722\n            dbm.drop_db(dbname)\n            raise\n\n\n@pytest.fixture\ndef test_config_env(pytestconfig):\n    dbname = pytestconfig.getini('nominatim_api_test_db')\n\n    config = Configuration(None).get_os_env()\n    config['NOMINATIM_DATABASE_DSN'] = f\"pgsql:dbname={dbname}\"\n    config['NOMINATIM_LANGUAGES'] = 'en,de,fr,ja'\n    config['NOMINATIM_USE_US_TIGER_DATA'] = 'yes'\n    if pytestconfig.option.NOMINATIM_TOKENIZER is not None:\n        config['NOMINATIM_TOKENIZER'] = pytestconfig.option.NOMINATIM_TOKENIZER\n\n    return config\n\n\n@pytest.fixture\ndef api_http_request_headers():\n    return {}\n\n\n@given('the HTTP header', target_fixture='api_http_request_headers')\ndef set_additional_http_headers(api_http_request_headers, datatable):\n    api_http_request_headers.update(zip(datatable[0], datatable[1]))\n    return api_http_request_headers\n\n\n@given('an unknown database', target_fixture='test_config_env')\ndef setup_connection_unknown_database(test_config_env):\n    test_config_env['NOMINATIM_DATABASE_DSN'] = \"pgsql:dbname=gerlkghngergn6732nf\"\n    return test_config_env\n\n\n@when(step_parse(r'sending v1/(?P<endpoint>\\S+)(?: with format (?P<fmt>\\S+))?'),\n      target_fixture='api_response')\ndef send_api_status(test_config_env, api_http_request_headers, pytestconfig,\n                    datatable, endpoint, fmt):\n    runner = APIRunner(test_config_env, pytestconfig.option.NOMINATIM_API_ENGINE)\n    return runner.run_step(endpoint, {}, datatable, fmt, api_http_request_headers)\n\n\n@then(step_parse(r'a HTTP (?P<status>\\d+) is returned'), converters={'status': int})\ndef check_http_result(api_response, status):\n    assert api_response.status == status\n\n\n@then(step_parse('the page content equals \"(?P<content>.*)\"'))\ndef check_page_content_exact(api_response, content):\n    assert api_response.body == content\n\n\n@then('the result is valid html')\ndef check_for_html_correctness(api_response):\n    assert api_response.headers['content-type'] == CONTENT_TYPES['html']\n\n    try:\n        tree = ET.fromstring(api_response.body)\n    except Exception as ex:\n        assert False, f\"Could not parse page: {ex}\\n{api_response.body}\"\n\n    assert tree.tag == 'html'\n\n    body = tree.find('./body')\n    assert body is not None\n    assert body.find('.//script') is None\n\n\n@then(step_parse(r'the result is valid (?P<fmt>\\S+)(?: with (?P<num>\\d+) results?)?'),\n      target_fixture='nominatim_result')\ndef parse_api_json_response(api_response, fmt, num):\n    assert api_response.headers['content-type'] == CONTENT_TYPES[fmt]\n\n    result = APIResult(fmt, api_response.endpoint, api_response.body)\n\n    if num:\n        assert len(result) == int(num)\n\n    return result\n\n\nif pytest.version_tuple >= (8, 0, 0):\n    PYTEST_BDD_SCENARIOS = ['features/api']\nelse:\n    from pytest_bdd import scenarios\n    scenarios('features/api')\n"
  },
  {
    "path": "test/bdd/test_db.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nCollector for BDD import acceptance tests.\n\nThese tests check the Nominatim import chain after the osm2pgsql import.\n\"\"\"\nimport asyncio\nimport re\nfrom collections import defaultdict\n\nimport psycopg\nimport psycopg.sql as pysql\n\nimport pytest\nfrom pytest_bdd import when, then, given\nfrom pytest_bdd.parsers import re as step_parse\n\nfrom utils.place_inserter import PlaceColumn\nfrom utils.checks import check_table_content\nfrom utils.geometry_alias import ALIASES\n\nfrom nominatim_db.config import Configuration\nfrom nominatim_db import cli\nfrom nominatim_db.tools.database_import import load_data, create_table_triggers\nfrom nominatim_db.tools.postcodes import update_postcodes\nfrom nominatim_db.tokenizer import factory as tokenizer_factory\n\n\ndef _rewrite_placeid_field(field, new_field, datatable, place_ids):\n    try:\n        oidx = datatable[0].index(field)\n        datatable[0][oidx] = new_field\n        for line in datatable[1:]:\n            line[oidx] = None if line[oidx] == '-' else place_ids[line[oidx]]\n    except ValueError:\n        pass\n\n\ndef _collect_place_ids(conn):\n    pids = {}\n    with conn.cursor() as cur:\n        for row in cur.execute('SELECT place_id, osm_type, osm_id, class FROM placex'):\n            pids[f\"{row[1]}{row[2]}\"] = row[0]\n            pids[f\"{row[1]}{row[2]}:{row[3]}\"] = row[0]\n\n    return pids\n\n\n@pytest.fixture\ndef row_factory(db_conn):\n    def _insert_row(table, **data):\n        columns = []\n        placeholders = []\n        values = []\n        for k, v in data.items():\n            columns.append(pysql.Identifier(k))\n            if isinstance(v, tuple):\n                placeholders.append(pysql.SQL(v[0]))\n                values.append(v[1])\n            elif isinstance(v, (pysql.Literal, pysql.SQL)):\n                placeholders.append(v)\n            else:\n                placeholders.append(pysql.Placeholder())\n                values.append(v)\n\n        sql = pysql.SQL(\"INSERT INTO {table} ({columns}) VALUES({values})\")\\\n                   .format(table=pysql.Identifier(table),\n                           columns=pysql.SQL(',').join(columns),\n                           values=pysql.SQL(',').join(placeholders))\n\n        db_conn.execute(sql, values)\n        db_conn.commit()\n\n    return _insert_row\n\n\n@pytest.fixture\ndef test_config_env(pytestconfig):\n    dbname = pytestconfig.getini('nominatim_test_db')\n\n    config = Configuration(None).get_os_env()\n    config['NOMINATIM_DATABASE_DSN'] = f\"pgsql:dbname={dbname}\"\n    config['NOMINATIM_LANGUAGES'] = 'en,de,fr,ja'\n    config['NOMINATIM_USE_US_TIGER_DATA'] = 'yes'\n    if pytestconfig.option.NOMINATIM_TOKENIZER is not None:\n        config['NOMINATIM_TOKENIZER'] = pytestconfig.option.NOMINATIM_TOKENIZER\n\n    return config\n\n\n@pytest.fixture\ndef update_config(def_config):\n    \"\"\" Prepare the database for being updatable and return the config.\n    \"\"\"\n    cli.nominatim(['refresh', '--functions'], def_config.environ)\n\n    return def_config\n\n\n@given(step_parse('the (?P<named>named )?places'), target_fixture=None)\ndef import_places(db_conn, named, datatable, node_grid):\n    \"\"\" Insert todo rows into the place table.\n        When 'named' is given, then a random name will be generated for all\n        objects.\n    \"\"\"\n    with db_conn.cursor() as cur:\n        for row in datatable[1:]:\n            PlaceColumn(node_grid).add_row(datatable[0], row, named is not None).db_insert(cur)\n\n\n@given(step_parse('the entrances'), target_fixture=None)\ndef import_place_entrances(row_factory, datatable, node_grid):\n    \"\"\" Insert todo rows into the place_entrance table.\n    \"\"\"\n    for row in datatable[1:]:\n        data = PlaceColumn(node_grid).add_row(datatable[0], row, False)\n        assert data.columns['osm_type'] == 'N'\n\n        params = {'osm_id': data.columns['osm_id'],\n                  'type': data.columns['type'],\n                  'extratags': data.columns.get('extratags'),\n                  'geometry': pysql.SQL(data.get_wkt())}\n\n        row_factory('place_entrance', **params)\n\n\n@given(step_parse('the interpolations'), target_fixture=None)\ndef import_place_interpolations(row_factory, datatable, node_grid):\n    \"\"\" Insert todo rows into the place_entrance table.\n    \"\"\"\n    for row in datatable[1:]:\n        data = PlaceColumn(node_grid).add_row(datatable[0], row, False)\n        assert data.columns['osm_type'] == 'W'\n\n        params = {'osm_id': data.columns['osm_id'],\n                  'type': data.columns['type'],\n                  'address': data.columns.get('address'),\n                  'nodes': [int(x) for x in data.columns['nodes'].split(',')],\n                  'geometry': pysql.SQL(data.get_wkt())}\n\n        row_factory('place_interpolation', **params)\n\n\n@given(step_parse('the postcodes'), target_fixture=None)\ndef import_place_postcode(db_conn, datatable, node_grid):\n    \"\"\" Insert todo rows into the place_postcode table. If a row for the\n        requested object already exists it is overwritten.\n    \"\"\"\n    with db_conn.cursor() as cur:\n        for row in datatable[1:]:\n            data = defaultdict(lambda: None)\n            data.update((k, v) for k, v in zip(datatable[0], row))\n\n            if data['centroid'].startswith('country:'):\n                ccode = data['centroid'][8:].upper()\n                data['centroid'] = 'srid=4326;POINT({} {})'.format(*ALIASES[ccode])\n            else:\n                data['centroid'] = f\"srid=4326;{node_grid.geometry_to_wkt(data['centroid'])}\"\n\n            data['osm_type'] = data['osm'][0]\n            data['osm_id'] = data['osm'][1:]\n\n            if 'geometry' in data:\n                geom = f\"'srid=4326;{node_grid.geometry_to_wkt(data['geometry'])}'::geometry\"\n            else:\n                geom = 'null'\n\n            cur.execute(\"\"\" DELETE FROM place_postcode\n                            WHERE osm_type = %(osm_type)s and osm_id = %(osm_id)s\"\"\",\n                        data)\n            cur.execute(f\"\"\"INSERT INTO place_postcode\n                            (osm_type, osm_id, country_code, postcode, centroid, geometry)\n                            VALUES (%(osm_type)s, %(osm_id)s,\n                                    %(country)s, %(postcode)s,\n                                    %(centroid)s, {geom})\"\"\", data)\n    db_conn.commit()\n\n\n@given('the ways', target_fixture=None)\ndef import_ways(row_factory, datatable):\n    \"\"\" Import raw ways into the osm2pgsql way middle table.\n    \"\"\"\n    id_idx = datatable[0].index('id')\n    node_idx = datatable[0].index('nodes')\n    for line in datatable[1:]:\n        row_factory('planet_osm_ways',\n                    id=line[id_idx],\n                    nodes=[int(x) for x in line[node_idx].split(',')],\n                    tags=psycopg.types.json.Json(\n                        {k[5:]: v for k, v in zip(datatable[0], line)\n                         if k.startswith(\"tags+\")}))\n\n\n@given('the relations', target_fixture=None)\ndef import_rels(row_factory, datatable):\n    \"\"\" Import raw relations into the osm2pgsql relation middle table.\n        Also populates place_associated_street for associatedStreet relations.\n    \"\"\"\n    id_idx = datatable[0].index('id')\n    memb_idx = datatable[0].index('members')\n    for line in datatable[1:]:\n        raw_tags = {k[5:]: v for k, v in zip(datatable[0], line)\n                    if k.startswith(\"tags+\")}\n        members = []\n        if line[memb_idx]:\n            for member in line[memb_idx].split(','):\n                m = re.fullmatch(r'\\s*([RWN])(\\d+)(?::(\\S+))?\\s*', member)\n                if not m:\n                    raise ValueError(f'Illegal member {member}.')\n                members.append({'ref': int(m[2]), 'role': m[3] or '', 'type': m[1]})\n\n        row_factory('planet_osm_rels',\n                    id=int(line[id_idx]), tags=psycopg.types.json.Json(raw_tags),\n                    members=psycopg.types.json.Json(members))\n\n        # Mirror associatedStreet data into the dedicated table.\n        if raw_tags.get('type') == 'associatedStreet':\n            for mem in members:\n                row_factory('place_associated_street',\n                            relation_id=int(line[id_idx]),\n                            member_type=mem['type'],\n                            member_id=mem['ref'],\n                            member_role=mem['role'])\n\n\n@when('importing', target_fixture='place_ids')\ndef do_import(db_conn, def_config):\n    \"\"\" Run a reduced version of the Nominatim import.\n    \"\"\"\n    create_table_triggers(db_conn, def_config)\n    asyncio.run(load_data(def_config.get_libpq_dsn(), 1))\n    tokenizer = tokenizer_factory.get_tokenizer_for_db(def_config)\n    update_postcodes(def_config.get_libpq_dsn(), None, tokenizer)\n    cli.nominatim(['index', '-q'], def_config.environ)\n\n    return _collect_place_ids(db_conn)\n\n\n@when('updating places', target_fixture='place_ids')\ndef do_update(db_conn, update_config, node_grid, datatable):\n    \"\"\" Update the place table with the given data. Also runs all triggers\n        related to updates and reindexes the new data.\n    \"\"\"\n    with db_conn.cursor() as cur:\n        for row in datatable[1:]:\n            PlaceColumn(node_grid).add_row(datatable[0], row, False).db_insert(cur)\n        cur.execute('SELECT flush_deleted_places()')\n    db_conn.commit()\n\n    cli.nominatim(['index', '-q'], update_config.environ)\n\n    return _collect_place_ids(db_conn)\n\n\n@when('updating relations', target_fixture=None)\ndef do_update_relations(db_conn, update_config, datatable):\n    \"\"\" Update associatedStreet relations in place_associated_street.\n        Simulates what osm2pgsql flex does: DELETE all existing rows for the\n        relation then re-INSERT the new member list.\n    \"\"\"\n    id_idx = datatable[0].index('id')\n    memb_idx = datatable[0].index('members')\n    with db_conn.cursor() as cur:\n        for line in datatable[1:]:\n            relation_id = int(line[id_idx])\n            raw_tags = {k[5:]: v for k, v in zip(datatable[0], line)\n                        if k.startswith(\"tags+\")}\n            # DELETE all old rows – trigger invalidates any house members.\n            cur.execute('DELETE FROM place_associated_street WHERE relation_id = %s',\n                        (relation_id,))\n            # Re-INSERT the new member list when the relation is still live.\n            if raw_tags.get('type') == 'associatedStreet' and line[memb_idx]:\n                for member in line[memb_idx].split(','):\n                    m = re.fullmatch(r'\\s*([RWN])(\\d+)(?::(\\S+))?\\s*', member)\n                    if not m:\n                        raise ValueError(f'Illegal member {member}.')\n                    cur.execute(\n                        \"\"\"INSERT INTO place_associated_street\n                               (relation_id, member_type, member_id, member_role)\n                               VALUES (%s, %s, %s, %s)\"\"\",\n                        (relation_id, m[1], int(m[2]), m[3] or ''))\n    db_conn.commit()\n    cli.nominatim(['index', '-q'], update_config.environ)\n\n\n@when('updating entrances', target_fixture=None)\ndef update_place_entrances(db_conn, datatable, node_grid):\n    \"\"\" Update rows in the place_entrance table.\n    \"\"\"\n    with db_conn.cursor() as cur:\n        for row in datatable[1:]:\n            data = PlaceColumn(node_grid).add_row(datatable[0], row, False)\n            assert data.columns['osm_type'] == 'N'\n\n            cur.execute(\"DELETE FROM place_entrance WHERE osm_id = %s\",\n                        (data.columns['osm_id'],))\n            cur.execute(\"\"\"INSERT INTO place_entrance (osm_id, type, extratags, geometry)\n                           VALUES (%s, %s, %s, {})\"\"\".format(data.get_wkt()),\n                        (data.columns['osm_id'], data.columns['type'],\n                         data.columns.get('extratags')))\n    db_conn.commit()\n\n\n@when('updating interpolations', target_fixture=None)\ndef update_place_interpolations(db_conn, row_factory, update_config, datatable, node_grid):\n    \"\"\" Update rows in the place_entrance table.\n    \"\"\"\n    for row in datatable[1:]:\n        data = PlaceColumn(node_grid).add_row(datatable[0], row, False)\n        assert data.columns['osm_type'] == 'W'\n\n        params = {'osm_id': data.columns['osm_id'],\n                  'type': data.columns['type'],\n                  'address': data.columns.get('address'),\n                  'nodes': [int(x) for x in data.columns['nodes'].split(',')],\n                  'geometry': pysql.SQL(data.get_wkt())}\n\n        row_factory('place_interpolation', **params)\n\n    db_conn.execute('SELECT flush_deleted_places()')\n    db_conn.commit()\n\n    cli.nominatim(['index', '-q', '--minrank', '30'], update_config.environ)\n\n\n@when('refreshing postcodes')\ndef do_postcode_update(update_config):\n    \"\"\" Recompute the postcode centroids.\n    \"\"\"\n    cli.nominatim(['refresh', '--postcodes'], update_config.environ)\n\n\n@when(step_parse(r'marking for delete (?P<otype>[NRW])(?P<oid>\\d+)'),\n      converters={'oid': int})\ndef do_delete_place(db_conn, update_config, node_grid, otype, oid):\n    \"\"\" Remove the given place from the database.\n    \"\"\"\n    with db_conn.cursor() as cur:\n        cur.execute('TRUNCATE place_to_be_deleted')\n        cur.execute('DELETE FROM place WHERE osm_type = %s and osm_id = %s',\n                    (otype, oid))\n        cur.execute('DELETE FROM place_interpolation WHERE osm_id = %s',\n                    (oid, ))\n        cur.execute('SELECT flush_deleted_places()')\n        if otype == 'N':\n            cur.execute('DELETE FROM place_entrance WHERE osm_id = %s',\n                        (oid, ))\n        cur.execute('DELETE FROM place_postcode WHERE osm_type = %s and osm_id = %s',\n                    (otype, oid))\n    db_conn.commit()\n\n    cli.nominatim(['index', '-q'], update_config.environ)\n\n\n@then(step_parse(r'(?P<table>\\w+) contains(?P<exact> exactly)?'))\ndef then_check_table_content(db_conn, place_ids, datatable, node_grid, table, exact):\n    _rewrite_placeid_field('object', 'place_id', datatable, place_ids)\n    _rewrite_placeid_field('parent_place_id', 'parent_place_id', datatable, place_ids)\n    _rewrite_placeid_field('linked_place_id', 'linked_place_id', datatable, place_ids)\n    if table == 'place_addressline':\n        _rewrite_placeid_field('address', 'address_place_id', datatable, place_ids)\n\n    for i, title in enumerate(datatable[0]):\n        if title.startswith('addr+'):\n            datatable[0][i] = f\"address+{title[5:]}\"\n\n    check_table_content(db_conn, table, datatable, grid=node_grid, exact=bool(exact))\n\n\n@then(step_parse(r'(DISABLED?P<table>placex?) has no entry for (?P<oid>[NRW]\\d+(?::\\S+)?)'))\ndef then_check_place_missing_lines(db_conn, place_ids, table, oid):\n    assert oid in place_ids\n\n    sql = pysql.SQL(\"\"\"SELECT count(*) FROM {}\n                       WHERE place_id = %s\"\"\").format(pysql.Identifier(tablename))\n\n    with conn.cursor(row_factory=tuple_row) as cur:\n        assert cur.execute(sql, [place_ids[oid]]).fetchone()[0] == 0\n\n\n@then(step_parse(r'W(?P<oid>\\d+) expands to interpolation'),\n      converters={'oid': int})\ndef then_check_interpolation_table(db_conn, node_grid, place_ids, oid, datatable):\n    with db_conn.cursor() as cur:\n        cur.execute('SELECT count(*) FROM location_property_osmline WHERE osm_id = %s',\n                    [oid])\n        assert cur.fetchone()[0] == len(datatable) - 1\n\n    converted = [['osm_id', 'startnumber', 'endnumber', 'linegeo!wkt']]\n    start_idx = datatable[0].index('start') if 'start' in datatable[0] else None\n    end_idx = datatable[0].index('end') if 'end' in datatable[0] else None\n    geom_idx = datatable[0].index('geometry') if 'geometry' in datatable[0] else None\n    converted = [['osm_id']]\n    for val, col in zip((start_idx, end_idx, geom_idx),\n                        ('startnumber', 'endnumber', 'linegeo!wkt')):\n        if val is not None:\n            converted[0].append(col)\n\n    for line in datatable[1:]:\n        convline = [oid]\n        for val in (start_idx, end_idx):\n            if val is not None:\n                convline.append(line[val])\n        if geom_idx is not None:\n            convline.append(line[geom_idx])\n        converted.append(convline)\n\n    _rewrite_placeid_field('parent_place_id', 'parent_place_id', converted, place_ids)\n\n    check_table_content(db_conn, 'location_property_osmline', converted, grid=node_grid)\n\n\n@then(step_parse(r'W(?P<oid>\\d+) expands to no interpolation'),\n      converters={'oid': int})\ndef then_check_interpolation_table_negative(db_conn, oid):\n    with db_conn.cursor() as cur:\n        cur.execute(\"\"\"SELECT count(*) FROM location_property_osmline\n                       WHERE osm_id = %s and startnumber is not null\"\"\",\n                    [oid])\n        assert cur.fetchone()[0] == 0\n\n\nif pytest.version_tuple >= (8, 0, 0):\n    PYTEST_BDD_SCENARIOS = ['features/db']\nelse:\n    from pytest_bdd import scenarios\n    scenarios('features/db')\n"
  },
  {
    "path": "test/bdd/test_osm2pgsql.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nCollector for BDD osm2pgsql import style tests.\n\"\"\"\nimport asyncio\nimport random\n\nimport pytest\nfrom pytest_bdd import when, then, given\nfrom pytest_bdd.parsers import re as step_parse\n\nfrom nominatim_db import cli\nfrom nominatim_db.tools.exec_utils import run_osm2pgsql\nfrom nominatim_db.tools.database_import import load_data, create_table_triggers\nfrom nominatim_db.tools.replication import run_osm2pgsql_updates\n\nfrom utils.checks import check_table_content\n\n\n@pytest.fixture\ndef osm2pgsql_options(def_config):\n    return dict(osm2pgsql='osm2pgsql',\n                osm2pgsql_cache=50,\n                osm2pgsql_style=str(def_config.get_import_style_file()),\n                osm2pgsql_style_path=def_config.lib_dir.lua,\n                threads=1,\n                dsn=def_config.get_libpq_dsn(),\n                flatnode_file='',\n                tablespaces=dict(slim_data='', slim_index='',\n                                 main_data='', main_index=''),\n                append=False)\n\n\n@pytest.fixture\ndef opl_writer(tmp_path, node_grid):\n    nr = [0]\n\n    def _write(data):\n        fname = tmp_path / f\"test_osm_{nr[0]}.opl\"\n        nr[0] += 1\n        with fname.open('wt', encoding='utf-8') as fd:\n            for line in data.split('\\n'):\n                if line.startswith('n') and ' x' not in line:\n                    coord = node_grid.get(line[1:].split(' ')[0]) \\\n                            or (random.uniform(-180, 180), random.uniform(-90, 90))\n                    line = f\"{line} x{coord[0]:.7f} y{coord[1]:.7f}\"\n                fd.write(line)\n                fd.write('\\n')\n        return fname\n\n    return _write\n\n\n@given('the lua style file', target_fixture='osm2pgsql_options')\ndef set_lua_style_file(osm2pgsql_options, docstring, tmp_path):\n    style = tmp_path / 'custom.lua'\n    style.write_text(docstring, encoding='utf-8')\n    osm2pgsql_options['osm2pgsql_style'] = str(style)\n\n    return osm2pgsql_options\n\n\n@when('loading osm data')\ndef load_from_osm_file(db, osm2pgsql_options, opl_writer, docstring):\n    \"\"\" Load the given data into a freshly created test database using osm2pgsql.\n        No further indexing is done.\n\n        The data is expected as attached text in OPL format.\n    \"\"\"\n    osm2pgsql_options['import_file'] = opl_writer(docstring.replace(r'//', r'/'))\n    osm2pgsql_options['append'] = False\n    run_osm2pgsql(osm2pgsql_options)\n\n\n@when('updating osm data')\ndef update_from_osm_file(db_conn, def_config, osm2pgsql_options, opl_writer, docstring):\n    \"\"\" Update a database previously populated with 'loading osm data'.\n        Needs to run indexing on the existing data first to yield the correct\n        result.\n\n        The data is expected as attached text in OPL format.\n    \"\"\"\n    create_table_triggers(db_conn, def_config)\n    asyncio.run(load_data(def_config.get_libpq_dsn(), 1))\n    cli.nominatim(['index'], def_config.environ)\n    cli.nominatim(['refresh', '--functions'], def_config.environ)\n\n    osm2pgsql_options['import_file'] = opl_writer(docstring.replace(r'//', r'/'))\n    run_osm2pgsql_updates(db_conn, osm2pgsql_options)\n\n\n@when('indexing')\ndef do_index(def_config):\n    \"\"\" Run Nominatim's indexing step.\n    \"\"\"\n    cli.nominatim(['index'], def_config.environ)\n\n\n@then(step_parse(r'(?P<table>\\w+) contains(?P<exact> exactly)?'))\ndef check_place_content(db_conn, datatable, node_grid, table, exact):\n    check_table_content(db_conn, table, datatable, grid=node_grid, exact=bool(exact))\n\n\nif pytest.version_tuple >= (8, 0, 0):\n    PYTEST_BDD_SCENARIOS = ['features/osm2pgsql']\nelse:\n    from pytest_bdd import scenarios\n    scenarios('features/osm2pgsql')\n"
  },
  {
    "path": "test/bdd/utils/__init__.py",
    "content": ""
  },
  {
    "path": "test/bdd/utils/api_result.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nWrapper for results from the API\n\"\"\"\nimport json\nimport xml.etree.ElementTree as ET\n\n\nclass APIResult:\n\n    def __init__(self, fmt, endpoint, body):\n        getattr(self, '_parse_' + fmt)(endpoint, body)\n\n    def is_simple(self):\n        return not isinstance(self.result, list)\n\n    def __len__(self):\n        return 1 if self.is_simple() else len(self.result)\n\n    def __str__(self):\n        return json.dumps({'meta': self.meta, 'result': self.result}, indent=2)\n\n    def _parse_json(self, _, body):\n        self.meta = {}\n        self.result = json.loads(body)\n\n    def _parse_xml(self, endpoint, body):\n        xml_tree = ET.fromstring(body)\n\n        self.meta = dict(xml_tree.attrib)\n\n        if xml_tree.tag == 'reversegeocode':\n            self._parse_xml_simple(xml_tree)\n        elif xml_tree.tag == 'searchresults':\n            self._parse_xml_multi(xml_tree)\n        elif xml_tree.tag == 'error':\n            self.result = {'error': {sub.tag: sub.text for sub in xml_tree}}\n\n    def _parse_xml_simple(self, xml):\n        self.result = {}\n\n        for child in xml:\n            if child.tag == 'result':\n                assert not self.result, \"More than one result in reverse result\"\n                self.result.update(child.attrib)\n                assert 'display_name' not in self.result\n                self.result['display_name'] = child.text\n            elif child.tag == 'addressparts':\n                assert 'address' not in self.result\n                self.result['address'] = {sub.tag: sub.text for sub in child}\n            elif child.tag == 'extratags':\n                assert 'extratags' not in self.result\n                self.result['extratags'] = {tag.attrib['key']: tag.attrib['value'] for tag in child}\n            elif child.tag == 'namedetails':\n                assert 'namedetails' not in self.result\n                self.result['namedetails'] = {tag.attrib['desc']: tag.text for tag in child}\n            elif child.tag == 'geokml':\n                assert 'geokml' not in self.result\n                self.result['geokml'] = ET.tostring(child, encoding='unicode')\n            elif child.tag == 'error':\n                assert not self.result\n                self.result['error'] = child.text\n            else:\n                assert False, f\"Unknown XML tag {child.tag} on page: {self.page}\"\n\n    def _parse_xml_multi(self, xml):\n        self.result = []\n\n        for child in xml:\n            assert child.tag == \"place\"\n            res = dict(child.attrib)\n\n            address = {}\n            for sub in child:\n                if sub.tag == 'extratags':\n                    assert 'extratags' not in res\n                    res['extratags'] = {tag.attrib['key']: tag.attrib['value'] for tag in sub}\n                elif sub.tag == 'namedetails':\n                    assert 'namedetails' not in res\n                    res['namedetails'] = {tag.attrib['desc']: tag.text for tag in sub}\n                elif sub.tag == 'geokml':\n                    res['geokml'] = ET.tostring(sub, encoding='utf-8')\n                else:\n                    address[sub.tag] = sub.text\n\n            if address:\n                res['address'] = address\n\n            self.result.append(res)\n\n    def _parse_geojson(self, _, body):\n        geojson = json.loads(body)\n\n        assert geojson.get('type') == 'FeatureCollection'\n        assert isinstance(geojson.get('features'), list)\n\n        self.meta = {k: v for k, v in geojson.items() if k not in ('type', 'features')}\n        self.result = []\n\n        for obj in geojson['features']:\n            assert isinstance(obj, dict)\n            assert obj.get('type') == 'Feature'\n\n            assert isinstance(obj.get('properties'), dict)\n            result = obj['properties']\n            assert 'geojson' not in result\n            result['geojson'] = obj['geometry']\n            if 'bbox' in obj:\n                assert 'boundingbox' not in result\n                # bbox is  minlon, minlat, maxlon, maxlat\n                # boundingbox is minlat, maxlat, minlon, maxlon\n                result['boundingbox'] = [obj['bbox'][1], obj['bbox'][3],\n                                         obj['bbox'][0], obj['bbox'][2]]\n            self.result.append(result)\n\n    def _parse_geocodejson(self, endpoint, body):\n        self._parse_geojson(endpoint, body)\n\n        assert set(self.meta.keys()) == {'geocoding'}\n        assert isinstance(self.meta['geocoding'], dict)\n        self.meta = self.meta['geocoding']\n\n        for r in self.result:\n            assert set(r.keys()) == {'geocoding', 'geojson'}\n            inner = r.pop('geocoding')\n            assert isinstance(inner, dict)\n            assert 'geojson' not in inner\n            r.update(inner)\n"
  },
  {
    "path": "test/bdd/utils/api_runner.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nVarious helper classes for running Nominatim commands.\n\"\"\"\nimport asyncio\nfrom collections import namedtuple\n\nAPIResponse = namedtuple('APIResponse', ['endpoint', 'status', 'body', 'headers'])\n\n\nclass APIRunner:\n    \"\"\" Execute a call to an API endpoint.\n    \"\"\"\n    def __init__(self, environ, api_engine):\n        create_func = getattr(self, f\"create_engine_{api_engine}\")\n        self.exec_engine = create_func(environ)\n\n    def run(self, endpoint, params, http_headers):\n        return asyncio.run(self.exec_engine(endpoint, params, http_headers))\n\n    def run_step(self, endpoint, base_params, datatable, fmt, http_headers):\n        if fmt:\n            base_params['format'] = fmt.strip()\n\n        if datatable:\n            if datatable[0] == ['param', 'value']:\n                base_params.update(datatable[1:])\n            else:\n                base_params.update(zip(datatable[0], datatable[1]))\n\n        return self.run(endpoint, base_params, http_headers)\n\n    def create_engine_falcon(self, environ):\n        import nominatim_api.server.falcon.server\n        import falcon.testing\n\n        async def exec_engine_falcon(endpoint, params, http_headers):\n            app = nominatim_api.server.falcon.server.get_application(None, environ)\n\n            async with falcon.testing.ASGIConductor(app) as conductor:\n                response = await conductor.get(\"/\" + endpoint, params=params,\n                                               headers=http_headers)\n\n            return APIResponse(endpoint, response.status_code,\n                               response.text, response.headers)\n\n        return exec_engine_falcon\n\n    def create_engine_starlette(self, environ):\n        import nominatim_api.server.starlette.server\n        from asgi_lifespan import LifespanManager\n        from starlette.testclient import TestClient\n\n        async def _request(endpoint, params, http_headers):\n            app = nominatim_api.server.starlette.server.get_application(None, environ)\n\n            async with LifespanManager(app):\n                client = TestClient(app, base_url=\"http://nominatim.test\")\n                response = client.get(\"/\" + endpoint, params=params, headers=http_headers)\n\n            return APIResponse(endpoint, response.status_code,\n                               response.text, response.headers)\n\n        return _request\n"
  },
  {
    "path": "test/bdd/utils/checks.py",
    "content": "# SPDX-License-Identifier: GPL-2.0-only\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nHelper functions to compare expected values.\n\"\"\"\nimport ast\nimport collections.abc\nimport json\nimport re\nimport math\n\nfrom psycopg import sql as pysql\nfrom psycopg.rows import dict_row\nfrom .geometry_alias import ALIASES\n\n\nCOMPARATOR_TERMS = {\n    'exactly': lambda exp, act: exp == act,\n    'more than': lambda exp, act: act > exp,\n    'less than': lambda exp, act: act < exp,\n}\n\n\ndef _pretty(obj):\n    return json.dumps(obj, sort_keys=True, indent=2)\n\n\ndef _pt_close(p1, p2):\n    return math.isclose(p1[0], p2[0], abs_tol=1e-07) \\\n           and math.isclose(p1[1], p2[1], abs_tol=1e-07)\n\n\ndef within_box(value, expect):\n    coord = [float(x) for x in expect.split(',')]\n\n    if isinstance(value, str):\n        if value.startswith('POINT'):\n            value = value[6:-1].split(' ')\n        else:\n            value = value.split(',')\n    value = list(map(float, value))\n\n    if len(value) == 2:\n        return coord[0] <= value[0] <= coord[2] \\\n               and coord[1] <= value[1] <= coord[3]\n\n    if len(value) == 4:\n        return value[0] >= coord[0] and value[1] <= coord[1] \\\n               and value[2] >= coord[2] and value[3] <= coord[3]\n\n    raise ValueError(\"Not a coordinate or bbox.\")\n\n\nCOMPARISON_FUNCS = {\n    None: lambda val, exp: str(val) == exp,\n    'i': lambda val, exp: str(val).lower() == exp.lower(),\n    'fm': lambda val, exp: re.fullmatch(exp, val) is not None,\n    'dict': lambda val, exp: (val is None if exp == '-'\n                              else (val == ast.literal_eval('{' + exp + '}'))),\n    'ints': lambda val, exp: (val is None if exp == '-'\n                              else (val == [int(i) for i in exp.split(',')])),\n    'in_box': within_box\n}\n\nOSM_TYPE = {'node': 'n', 'way': 'w', 'relation': 'r',\n            'N': 'n', 'W': 'w', 'R': 'r'}\n\n\nclass ResultAttr:\n    \"\"\" Returns the given attribute as a string.\n\n        The key parameter determines how the value is formatted before\n        returning. To refer to sub attributes, use '+' to add more keys\n        (e.g. 'name+ref' will access obj['name']['ref']). A '!' introduces\n        a formatting suffix. If no suffix is given, the value will be\n        converted using the str() function.\n\n        Available formatters:\n\n        !:...   - use a formatting expression according to Python Mini Format Spec\n        !i      - make case-insensitive comparison\n        !fm     - consider comparison string a regular expression and match full value\n        !wkt    - convert the expected value to a WKT string before comparing\n        !in_box - the expected value is a comma-separated bbox description\n        !dict   - compare as a dictitionary, member order does not matter\n        !ints   - compare as integer array\n    \"\"\"\n\n    def __init__(self, obj, key, grid=None):\n        self.grid = grid\n        self.obj = obj\n        if '!' in key:\n            self.key, self.fmt = key.rsplit('!', 1)\n        else:\n            self.key = key\n            self.fmt = None\n\n        if self.key == 'object':\n            assert 'osm_id' in obj\n            assert 'osm_type' in obj\n            self.subobj = OSM_TYPE[obj['osm_type']] + str(obj['osm_id'])\n            self.fmt = 'i'\n        else:\n            done = ''\n            self.subobj = self.obj\n            for sub in self.key.split('+'):\n                done += f\"[{sub}]\"\n                if isinstance(self.subobj, collections.abc.Sequence) and sub.isdigit():\n                    sub = int(sub)\n                    assert sub < len(self.subobj), \\\n                        f\"Out of bound index {done}. Full object:\\n{_pretty(self.obj)}\"\n                else:\n                    assert sub in self.subobj, \\\n                        f\"Missing attribute {done}. Full object:\\n{_pretty(self.obj)}\"\n                self.subobj = self.subobj[sub]\n\n    def __eq__(self, other):\n        # work around bad quoting by pytest-bdd\n        if not isinstance(other, str):\n            return self.subobj == other\n\n        other = other.replace(r'\\\\', '\\\\')\n\n        if self.fmt in COMPARISON_FUNCS:\n            return COMPARISON_FUNCS[self.fmt](self.subobj, other)\n\n        if self.fmt.startswith(':'):\n            return other == f\"{{{self.fmt}}}\".format(self.subobj)\n\n        if self.fmt == 'wkt':\n            return self.compare_wkt(self.subobj, other)\n\n        raise RuntimeError(f\"Unknown format string '{self.fmt}'.\")\n\n    def __repr__(self):\n        k = self.key.replace('+', '][')\n        if self.fmt:\n            k += '!' + self.fmt\n        return f\"result[{k}]({self.subobj})\"\n\n    def compare_wkt(self, value, expected):\n        \"\"\" Compare a WKT value against a compact geometry format.\n            The function understands the following formats:\n\n              country:<country code>\n                 Point geometry guaranteed to be in the given country\n              <P>\n                 Point geometry\n              <P>,...,<P>\n                 Line geometry\n              (<P>,...,<P>)\n                 Polygon geometry\n\n           <P> may either be a coordinate of the form '<x> <y>' or a single\n           number. In the latter case it must refer to a point in\n           a previously defined grid.\n        \"\"\"\n        m = re.fullmatch(r'(POINT)\\(([0-9. -]*)\\)', value) \\\n            or re.fullmatch(r'(LINESTRING)\\(([0-9,. -]*)\\)', value) \\\n            or re.fullmatch(r'(POLYGON)\\(\\(([0-9,. -]*)\\)\\)', value)\n        if not m:\n            return False\n\n        converted = [list(map(float, pt.split(' ', 1)))\n                     for pt in map(str.strip, m[2].split(','))]\n\n        if expected.startswith('country:'):\n            ccode = expected[8:].upper()\n            assert ccode in ALIASES, f\"Geometry error: unknown country {ccode}\"\n            return m[1] == 'POINT' and _pt_close(converted[0], ALIASES[ccode])\n\n        if ',' not in expected:\n            return m[1] == 'POINT' and _pt_close(converted[0], self.get_point(expected))\n\n        if '(' not in expected:\n            return m[1] == 'LINESTRING' and \\\n                all(_pt_close(p1, p2) for p1, p2 in\n                    zip(converted, (self.get_point(p) for p in expected.split(','))))\n\n        if m[1] != 'POLYGON':\n            return False\n\n        # Polygon comparison is tricky because the polygons don't necessarily\n        # end at the same point or have the same winding order.\n        # Brute force all possible variants of the expected polygon\n        exp_coords = [self.get_point(p) for p in expected[1:-1].split(',')]\n        if exp_coords[0] != exp_coords[-1]:\n            raise RuntimeError(f\"Invalid polygon {expected}. \"\n                               \"First and last point need to be the same\")\n        for line in (exp_coords[:-1], exp_coords[-1:0:-1]):\n            for i in range(len(line)):\n                if all(_pt_close(p1, p2) for p1, p2 in\n                       zip(converted, line[i:] + line[:i])):\n                    return True\n\n        return False\n\n    def get_point(self, pt):\n        pt = pt.strip()\n        if ' ' in pt:\n            return list(map(float, pt.split(' ', 1)))\n\n        assert self.grid\n\n        return self.grid.get(pt)\n\n\ndef check_table_content(conn, tablename, data, grid=None, exact=False):\n    lines = set(range(1, len(data)))\n\n    cols = []\n    for col in data[0]:\n        if col == 'object':\n            cols.extend(('osm_id', 'osm_type'))\n        elif '!' in col:\n            name, fmt = col.rsplit('!', 1)\n            if fmt in ('wkt', 'in_box'):\n                cols.append(f\"ST_AsText({name}) as {name}\")\n            else:\n                cols.append(name.split('+')[0])\n        else:\n            cols.append(col.split('+')[0])\n\n    with conn.cursor(row_factory=dict_row) as cur:\n        cur.execute(pysql.SQL(f\"SELECT {','.join(cols)} FROM\")\n                    + pysql.Identifier(tablename))\n\n        table_content = ''\n        for row in cur:\n            table_content += '\\n' + str(row)\n            for i in lines:\n                for col, value in zip(data[0], data[i]):\n                    if ResultAttr(row, col, grid=grid) != (None if value == '-' else value):\n                        break\n                else:\n                    lines.remove(i)\n                    break\n            else:\n                assert not exact, f\"Unexpected row in table {tablename}: {row}\"\n\n        assert not lines, \\\n               \"Rows not found:\\n\" \\\n               + '\\n'.join(str(data[i]) for i in lines) \\\n               + \"\\nTable content:\\n\" \\\n               + table_content\n"
  },
  {
    "path": "test/bdd/utils/db.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nHelper functions for managing test databases.\n\"\"\"\nimport asyncio\nimport psycopg\nfrom psycopg import sql as pysql\n\nfrom nominatim_db.tools.database_import import setup_database_skeleton, create_tables, \\\n                                               create_partition_tables, create_search_indices\nfrom nominatim_db.data.country_info import setup_country_tables, create_country_names\nfrom nominatim_db.tools.refresh import create_functions, load_address_levels_from_config\nfrom nominatim_db.tools.exec_utils import run_osm2pgsql\nfrom nominatim_db.tokenizer import factory as tokenizer_factory\n\n\nclass DBManager:\n\n    def __init__(self, purge=False):\n        self.purge = purge\n\n    def check_for_db(self, dbname):\n        \"\"\" Check if the given DB already exists.\n            When the purge option is set, then an existing database will\n            be deleted and the function returns that it does not exist.\n        \"\"\"\n        if self.purge:\n            self.drop_db(dbname)\n            return False\n\n        return self.exists_db(dbname)\n\n    def drop_db(self, dbname):\n        \"\"\" Drop the given database if it exists.\n        \"\"\"\n        with psycopg.connect(dbname='postgres') as conn:\n            conn.autocommit = True\n            conn.execute(pysql.SQL('DROP DATABASE IF EXISTS')\n                         + pysql.Identifier(dbname))\n\n    def exists_db(self, dbname):\n        \"\"\" Check if a database with the given name exists already.\n        \"\"\"\n        with psycopg.connect(dbname='postgres') as conn:\n            cur = conn.execute('select count(*) from pg_database where datname = %s',\n                               (dbname,))\n            return cur.fetchone()[0] == 1\n\n    def create_db_from_template(self, dbname, template):\n        \"\"\" Create a new database from the given template database.\n            Any existing database with the same name will be dropped.\n        \"\"\"\n        with psycopg.connect(dbname='postgres') as conn:\n            conn.autocommit = True\n            conn.execute(pysql.SQL('DROP DATABASE IF EXISTS')\n                         + pysql.Identifier(dbname))\n            conn.execute(pysql.SQL('CREATE DATABASE {} WITH TEMPLATE {}')\n                              .format(pysql.Identifier(dbname),\n                                      pysql.Identifier(template)))\n\n    def setup_template_db(self, config):\n        \"\"\" Create a template DB which contains the necessary extensions\n            and basic static tables.\n\n            The template will only be created if the database does not yet\n            exist or 'purge' is set.\n        \"\"\"\n        dsn = config.get_libpq_dsn()\n\n        if self.check_for_db(config.get_database_params()['dbname']):\n            return\n\n        setup_database_skeleton(dsn)\n\n        run_osm2pgsql(dict(osm2pgsql='osm2pgsql',\n                           osm2pgsql_cache=1,\n                           osm2pgsql_style=str(config.get_import_style_file()),\n                           osm2pgsql_style_path=config.lib_dir.lua,\n                           threads=1,\n                           dsn=dsn,\n                           flatnode_file='',\n                           tablespaces=dict(slim_data='', slim_index='',\n                                            main_data='', main_index=''),\n                           append=False,\n                           import_data=b'<osm version=\"0.6\"></osm>'))\n\n        setup_country_tables(dsn, config.lib_dir.data)\n\n        with psycopg.connect(dsn) as conn:\n            create_tables(conn, config)\n            load_address_levels_from_config(conn, config)\n            create_partition_tables(conn, config)\n            create_functions(conn, config, enable_diff_updates=False)\n            asyncio.run(create_search_indices(conn, config))\n\n            tokenizer = tokenizer_factory.create_tokenizer(config)\n            create_country_names(conn, tokenizer)\n"
  },
  {
    "path": "test/bdd/utils/geometry_alias.py",
    "content": "# SPDX-License-Identifier: GPL-2.0-only\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nCollection of aliases for various world coordinates.\n\"\"\"\n\nALIASES = {\n    # Country aliases\n    'AD': (1.58972, 42.54241),\n    'AE': (54.61589, 24.82431),\n    'AF': (65.90264, 34.84708),\n    'AG': (-61.72430, 17.069),\n    'AI': (-63.10571, 18.25461),\n    'AL': (19.84941, 40.21232),\n    'AM': (44.64229, 40.37821),\n    'AO': (16.21924, -12.77014),\n    'AQ': (44.99999, -75.65695),\n    'AR': (-61.10759, -34.37615),\n    'AS': (-170.68470, -14.29307),\n    'AT': (14.25747, 47.36542),\n    'AU': (138.23155, -23.72068),\n    'AW': (-69.98255, 12.555),\n    'AX': (19.91839, 59.81682),\n    'AZ': (48.38555, 40.61639),\n    'BA': (17.18514, 44.25582),\n    'BB': (-59.53342, 13.19),\n    'BD': (89.75989, 24.34205),\n    'BE': (4.90078, 50.34682),\n    'BF': (-0.56743, 11.90471),\n    'BG': (24.80616, 43.09859),\n    'BH': (50.52032, 25.94685),\n    'BI': (29.54561, -2.99057),\n    'BJ': (2.70062, 10.02792),\n    'BL': (-62.79349, 17.907),\n    'BM': (-64.77406, 32.30199),\n    'BN': (114.52196, 4.28638),\n    'BO': (-62.02473, -17.77723),\n    'BQ': (-63.14322, 17.566),\n    'BR': (-45.77065, -9.58685),\n    'BS': (-77.60916, 23.8745),\n    'BT': (90.01350, 27.28137),\n    'BV': (3.35744, -54.4215),\n    'BW': (23.51505, -23.48391),\n    'BY': (26.77259, 53.15885),\n    'BZ': (-88.63489, 16.33951),\n    'CA': (-107.74817, 67.12612),\n    'CC': (96.84420, -12.01734),\n    'CD': (24.09544, -1.67713),\n    'CF': (22.58701, 5.98438),\n    'CG': (15.78875, 0.40388),\n    'CH': (7.65705, 46.57446),\n    'CI': (-6.31190, 6.62783),\n    'CK': (-159.77835, -21.23349),\n    'CL': (-70.41790, -53.77189),\n    'CM': (13.26022, 5.94519),\n    'CN': (96.44285, 38.04260),\n    'CO': (-72.52951, 2.45174),\n    'CR': (-83.83314, 9.93514),\n    'CU': (-80.81673, 21.88852),\n    'CV': (-24.50810, 14.929),\n    'CW': (-68.96409, 12.1845),\n    'CX': (105.62411, -10.48417),\n    'CY': (32.95922, 35.37010),\n    'CZ': (16.32098, 49.50692),\n    'DE': (9.30716, 50.21289),\n    'DJ': (42.96904, 11.41542),\n    'DK': (9.18490, 55.98916),\n    'DM': (-61.00358, 15.65470),\n    'DO': (-69.62855, 18.58841),\n    'DZ': (4.24749, 25.79721),\n    'EC': (-77.45831, -0.98284),\n    'EE': (23.94288, 58.43952),\n    'EG': (28.95293, 28.17718),\n    'EH': (-13.69031, 25.01241),\n    'ER': (39.01223, 14.96033),\n    'ES': (-2.59110, 38.79354),\n    'ET': (38.61697, 7.71399),\n    'FI': (26.89798, 63.56194),\n    'FJ': (177.91853, -17.74237),\n    'FK': (-58.99044, -51.34509),\n    'FM': (151.95358, 8.5045),\n    'FO': (-6.60483, 62.10000),\n    'FR': (0.28410, 47.51045),\n    'GA': (10.81070, -0.07429),\n    'GB': (-0.92823, 52.01618),\n    'GD': (-61.64524, 12.191),\n    'GE': (44.16664, 42.00385),\n    'GF': (-53.46524, 3.56188),\n    'GG': (-2.50580, 49.58543),\n    'GH': (-0.46348, 7.16051),\n    'GI': (-5.32053, 36.11066),\n    'GL': (-33.85511, 74.66355),\n    'GM': (-16.40960, 13.25),\n    'GN': (-13.83940, 10.96291),\n    'GP': (-61.68712, 16.23049),\n    'GQ': (10.23973, 1.43119),\n    'GR': (23.17850, 39.06206),\n    'GS': (-36.49430, -54.43067),\n    'GT': (-90.74368, 15.20428),\n    'GU': (144.73362, 13.44413),\n    'GW': (-14.83525, 11.92486),\n    'GY': (-58.45167, 5.73698),\n    'HK': (114.18577, 22.34923),\n    'HM': (73.68230, -53.22105),\n    'HN': (-86.95414, 15.23820),\n    'HR': (17.49966, 45.52689),\n    'HT': (-73.51925, 18.32492),\n    'HU': (20.35362, 47.51721),\n    'ID': (123.34505, -0.83791),\n    'IE': (-9.00520, 52.87725),\n    'IL': (35.46314, 32.86165),\n    'IM': (-4.86740, 54.023),\n    'IN': (88.67620, 27.86155),\n    'IO': (71.42743, -6.14349),\n    'IQ': (42.58109, 34.26103),\n    'IR': (56.09355, 30.46751),\n    'IS': (-17.51785, 64.71687),\n    'IT': (10.42639, 44.87904),\n    'JE': (-2.19261, 49.12458),\n    'JM': (-76.84020, 18.3935),\n    'JO': (36.55552, 30.75741),\n    'JP': (138.72531, 35.92099),\n    'KE': (36.90602, 1.08512),\n    'KG': (76.15571, 41.66497),\n    'KH': (104.31901, 12.95555),\n    'KI': (173.63353, 0.139),\n    'KM': (44.31474, -12.241),\n    'KN': (-62.69379, 17.2555),\n    'KP': (126.65575, 39.64575),\n    'KR': (127.27740, 36.41388),\n    'KW': (47.30684, 29.69180),\n    'KY': (-81.07455, 19.29949),\n    'KZ': (72.00811, 49.88855),\n    'LA': (102.44391, 19.81609),\n    'LB': (35.48464, 33.41766),\n    'LC': (-60.97894, 13.891),\n    'LI': (9.54693, 47.15934),\n    'LK': (80.38520, 8.41649),\n    'LR': (-11.16960, 4.04122),\n    'LS': (28.66984, -29.94538),\n    'LT': (24.51735, 55.49293),\n    'LU': (6.08649, 49.81533),\n    'LV': (23.51033, 56.67144),\n    'LY': (15.36841, 28.12177),\n    'MA': (-4.03061, 33.21696),\n    'MC': (7.47743, 43.62917),\n    'MD': (29.61725, 46.66517),\n    'ME': (19.72291, 43.02441),\n    'MF': (-63.06666, 18.08102),\n    'MG': (45.86378, -20.50245),\n    'MH': (171.94982, 5.983),\n    'MK': (21.42108, 41.08980),\n    'ML': (-1.93310, 16.46993),\n    'MM': (95.54624, 21.09620),\n    'MN': (99.81138, 48.18615),\n    'MO': (113.56441, 22.16209),\n    'MP': (145.21345, 14.14902),\n    'MQ': (-60.81128, 14.43706),\n    'MR': (-9.42324, 22.59251),\n    'MS': (-62.19455, 16.745),\n    'MT': (14.38363, 35.94467),\n    'MU': (57.55121, -20.41),\n    'MV': (73.39292, 4.19375),\n    'MW': (33.95722, -12.28218),\n    'MX': (-105.89221, 25.86826),\n    'MY': (112.71154, 2.10098),\n    'MZ': (37.58689, -13.72682),\n    'NA': (16.68569, -21.46572),\n    'NC': (164.95322, -20.38889),\n    'NE': (10.06041, 19.08273),\n    'NF': (167.95718, -29.0645),\n    'NG': (10.17781, 10.17804),\n    'NI': (-85.87974, 13.21715),\n    'NL': (-68.57062, 12.041),\n    'NO': (23.11556, 70.09934),\n    'NP': (83.36259, 28.13107),\n    'NR': (166.93479, -0.5275),\n    'NU': (-169.84873, -19.05305),\n    'NZ': (167.97209, -45.13056),\n    'OM': (56.86055, 20.47413),\n    'PA': (-79.40160, 8.80656),\n    'PE': (-78.66540, -7.54711),\n    'PF': (-145.05719, -16.70862),\n    'PG': (146.64600, -7.37427),\n    'PH': (121.48359, 15.09965),\n    'PK': (72.11347, 31.14629),\n    'PL': (17.88136, 52.77182),\n    'PM': (-56.19515, 46.78324),\n    'PN': (-130.10642, -25.06955),\n    'PR': (-65.88755, 18.37169),\n    'PS': (35.39801, 32.24773),\n    'PT': (-8.45743, 40.11154),\n    'PW': (134.49645, 7.3245),\n    'PY': (-59.51787, -22.41281),\n    'QA': (51.49903, 24.99816),\n    'RE': (55.77345, -21.36388),\n    'RO': (26.37632, 45.36120),\n    'RS': (20.40371, 44.56413),\n    'RU': (116.44060, 59.06780),\n    'RW': (29.57882, -1.62404),\n    'SA': (47.73169, 22.43790),\n    'SB': (164.63894, -10.23606),\n    'SC': (46.36566, -9.454),\n    'SD': (28.14720, 14.56423),\n    'SE': (15.68667, 60.35568),\n    'SG': (103.84187, 1.304),\n    'SH': (-12.28155, -37.11546),\n    'SI': (14.04738, 46.39085),\n    'SJ': (15.27552, 79.23365),\n    'SK': (20.41603, 48.86970),\n    'SL': (-11.47773, 8.78156),\n    'SM': (12.46062, 43.94279),\n    'SN': (-15.37111, 14.99477),\n    'SO': (46.93383, 9.34094),\n    'SR': (-55.42864, 4.56985),\n    'SS': (28.13573, 8.50933),\n    'ST': (6.61025, 0.2215),\n    'SV': (-89.36665, 13.43072),\n    'SX': (-63.15393, 17.9345),\n    'SY': (38.15513, 35.34221),\n    'SZ': (31.78263, -26.14244),\n    'TC': (-71.32554, 21.35),\n    'TD': (17.42092, 13.46223),\n    'TF': (137.5, -67.5),\n    'TG': (1.06983, 7.87677),\n    'TH': (102.00877, 16.42310),\n    'TJ': (71.91349, 39.01527),\n    'TK': (-171.82603, -9.20990),\n    'TL': (126.22520, -8.72636),\n    'TM': (57.71603, 39.92534),\n    'TN': (9.04958, 34.84199),\n    'TO': (-176.99320, -23.11104),\n    'TR': (32.82002, 39.86350),\n    'TT': (-60.70793, 11.1385),\n    'TV': (178.77499, -9.41685),\n    'TW': (120.30074, 23.17002),\n    'TZ': (33.53892, -5.01840),\n    'UA': (33.44335, 49.30619),\n    'UG': (32.96523, 2.08584),\n    'UM': (-169.50993, 16.74605),\n    'US': (-116.39535, 40.71379),\n    'UY': (-56.46505, -33.62658),\n    'UZ': (61.35529, 42.96107),\n    'VA': (12.33197, 42.04931),\n    'VC': (-61.09905, 13.316),\n    'VE': (-64.88323, 7.69849),\n    'VG': (-64.62479, 18.419),\n    'VI': (-64.88950, 18.32263),\n    'VN': (104.20179, 10.27644),\n    'VU': (167.31919, -15.88687),\n    'WF': (-176.20781, -13.28535),\n    'WS': (-172.10966, -13.85093),\n    'YE': (45.94562, 16.16338),\n    'YT': (44.93774, -12.60882),\n    'ZA': (23.19488, -30.43276),\n    'ZM': (26.38618, -14.39966),\n    'ZW': (30.12419, -19.86907)\n    }\n"
  },
  {
    "path": "test/bdd/utils/grid.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nA grid describing node placement in an area.\nUseful for visually describing geometries.\n\"\"\"\nimport re\n\n\nclass Grid:\n\n    def __init__(self, table, step, origin):\n        if step is None:\n            step = 0.00001\n        if origin is None:\n            origin = (0.0, 0.0)\n        self.grid = {}\n\n        y = origin[1]\n        for line in table:\n            x = origin[0]\n            for pt_id in line:\n                if pt_id:\n                    self.grid[pt_id] = (x, y)\n                x += step\n            y += step\n\n    def get(self, nodeid):\n        \"\"\" Get the coordinates for the given grid node.\n        \"\"\"\n        return self.grid.get(nodeid)\n\n    def parse_point(self, value):\n        \"\"\" Get the coordinates for either a grid node or a full coordinate.\n        \"\"\"\n        value = value.strip()\n        if ' ' in value:\n            return [float(v) for v in value.split(' ', 1)]\n\n        return self.grid.get(value)\n\n    def parse_line(self, value):\n        return [self.parse_point(p) for p in value.split(',')]\n\n    def geometry_to_wkt(self, value):\n        \"\"\" Parses the given value into a geometry and returns the WKT.\n\n            The value can either be a WKT already or a geometry shortcut\n            with coordinates or grid points.\n        \"\"\"\n        if re.fullmatch(r'([A-Z]+)\\((.*)\\)', value) is not None:\n            return value  # already a WKT\n\n        # points\n        if ',' not in value:\n            x, y = self.parse_point(value)\n            return f\"POINT({x} {y})\"\n\n        # linestring\n        if '(' not in value:\n            coords = ','.join(' '.join(f\"{p:.7f}\" for p in pt)\n                              for pt in self.parse_line(value))\n            return f\"LINESTRING({coords})\"\n\n        # simple polygons\n        coords = ','.join(' '.join(f\"{p:.7f}\" for p in pt)\n                          for pt in self.parse_line(value[1:-1]))\n        return f\"POLYGON(({coords}))\"\n"
  },
  {
    "path": "test/bdd/utils/place_inserter.py",
    "content": "# SPDX-License-Identifier: GPL-2.0-only\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nHelper classes for filling the place table.\n\"\"\"\nimport ast\nimport random\nimport string\n\nfrom .geometry_alias import ALIASES\nfrom .grid import Grid\n\n\nclass PlaceColumn:\n    \"\"\" Helper class to collect contents from a BDD table row and\n        insert it into the place table.\n    \"\"\"\n    def __init__(self, grid=None):\n        self.columns = {'admin_level': 15}\n        self.grid = grid or Grid()\n        self.geometry = None\n\n    def add_row(self, headings, row, force_name):\n        \"\"\" Parse the content from the given behave row as place column data.\n        \"\"\"\n        for name, value in zip(headings, row):\n            self._add(name, value)\n\n        assert 'osm_type' in self.columns, \"osm column missing\"\n\n        if force_name and 'name' not in self.columns:\n            self._add_hstore(\n                'name',\n                'name',\n                ''.join(random.choices(string.ascii_uppercase)\n                        + random.choices(string.printable, k=random.randrange(30))),\n            )\n\n        return self\n\n    def _add(self, key, value):\n        if hasattr(self, '_set_key_' + key):\n            getattr(self, '_set_key_' + key)(value)\n        elif key.startswith('name+'):\n            self._add_hstore('name', key[5:], value)\n        elif key.startswith('extra+'):\n            self._add_hstore('extratags', key[6:], value)\n        elif key.startswith('addr+'):\n            self._add_hstore('address', key[5:], value)\n        elif key in ('name', 'address', 'extratags'):\n            self.columns[key] = ast.literal_eval('{' + value + '}')\n        else:\n            self.columns[key] = None if value == '' else value\n\n    def _set_key_name(self, value):\n        self._add_hstore('name', 'name', value)\n\n    def _set_key_osm(self, value):\n        assert value[0] in 'NRW' and value[1:].isdigit(), \\\n               \"OSM id needs to be of format <NRW><id>.\"\n\n        self.columns['osm_type'] = value[0]\n        self.columns['osm_id'] = int(value[1:])\n\n    def _set_key_admin(self, value):\n        self.columns['admin_level'] = int(value)\n\n    def _set_key_housenr(self, value):\n        if value:\n            self._add_hstore('address', 'housenumber', value)\n\n    def _set_key_postcode(self, value):\n        if value:\n            self._add_hstore('address', 'postcode', value)\n\n    def _set_key_street(self, value):\n        if value:\n            self._add_hstore('address', 'street', value)\n\n    def _set_key_addr_place(self, value):\n        if value:\n            self._add_hstore('address', 'place', value)\n\n    def _set_key_country(self, value):\n        if value:\n            self._add_hstore('address', 'country', value)\n\n    def _set_key_geometry(self, value):\n        if value.startswith('country:'):\n            ccode = value[8:].upper()\n            self.geometry = \"ST_SetSRID(ST_Point({}, {}), 4326)\".format(*ALIASES[ccode])\n        else:\n            wkt = self.grid.geometry_to_wkt(value)\n            self.geometry = f\"'srid=4326;{wkt}'::geometry\"\n\n    def _add_hstore(self, column, key, value):\n        if column in self.columns:\n            self.columns[column][key] = value\n        else:\n            self.columns[column] = {key: value}\n\n    def get_wkt(self):\n        if self.columns['osm_type'] == 'N' and self.geometry is None:\n            pt = self.grid.get(str(self.columns['osm_id']))\n            if pt is None:\n                pt = (random.uniform(-180, 180), random.uniform(-90, 90))\n\n            return \"ST_SetSRID(ST_Point({}, {}), 4326)\".format(*pt)\n\n        assert self.geometry is not None, \"Geometry missing\"\n        return self.geometry\n\n    def db_delete(self, cursor):\n        \"\"\" Issue a delete for the given OSM object.\n        \"\"\"\n        cursor.execute('DELETE FROM place WHERE osm_type = %s and osm_id = %s',\n                       (self.columns['osm_type'], self.columns['osm_id']))\n\n    def db_insert(self, cursor):\n        \"\"\" Insert the collected data into the database.\n        \"\"\"\n        query = 'INSERT INTO place ({}, geometry) values({}, {})'.format(\n            ','.join(self.columns.keys()),\n            ','.join(['%s' for x in range(len(self.columns))]),\n            self.get_wkt())\n        cursor.execute(query, list(self.columns.values()))\n"
  },
  {
    "path": "test/python/api/conftest.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nHelper fixtures for API call tests.\n\"\"\"\nimport pytest\nimport pytest_asyncio\nimport datetime as dt\n\nimport sqlalchemy as sa\n\nimport nominatim_api as napi\nfrom nominatim_db.db.sql_preprocessor import SQLPreprocessor\nfrom nominatim_api.search.query_analyzer_factory import make_query_analyzer\nfrom nominatim_db.tools import convert_sqlite\nimport nominatim_api.logging as loglib\n\n\nclass APITester:\n\n    def __init__(self):\n        self.api = napi.NominatimAPI()\n        self.async_to_sync(self.api._async_api.setup_database())\n\n    def async_to_sync(self, func):\n        \"\"\" Run an asynchronous function until completion using the\n            internal loop of the API.\n        \"\"\"\n        return self.api._loop.run_until_complete(func)\n\n    def add_data(self, table, data):\n        \"\"\" Insert data into the given table.\n        \"\"\"\n        sql = getattr(self.api._async_api._tables, table).insert()\n        self.async_to_sync(self.exec_async(sql, data))\n\n    def add_placex(self, **kw):\n        name = kw.get('name')\n        if isinstance(name, str):\n            name = {'name': name}\n\n        centroid = kw.get('centroid', (23.0, 34.0))\n        geometry = kw.get('geometry', 'POINT(%f %f)' % centroid)\n\n        self.add_data('placex',\n                      {'place_id': kw.get('place_id', 1000),\n                       'osm_type': kw.get('osm_type', 'W'),\n                       'osm_id': kw.get('osm_id', 4),\n                       'class_': kw.get('class_', 'highway'),\n                       'type': kw.get('type', 'residential'),\n                       'name': name,\n                       'address': kw.get('address'),\n                       'extratags': kw.get('extratags'),\n                       'parent_place_id': kw.get('parent_place_id'),\n                       'linked_place_id': kw.get('linked_place_id'),\n                       'admin_level': kw.get('admin_level', 15),\n                       'country_code': kw.get('country_code'),\n                       'housenumber': kw.get('housenumber'),\n                       'postcode': kw.get('postcode'),\n                       'wikipedia': kw.get('wikipedia'),\n                       'rank_search': kw.get('rank_search', 30),\n                       'rank_address': kw.get('rank_address', 30),\n                       'importance': kw.get('importance', 0.00001),\n                       'centroid': 'POINT(%f %f)' % centroid,\n                       'indexed_status': kw.get('indexed_status', 0),\n                       'indexed_date': kw.get('indexed_date',\n                                              dt.datetime(2022, 12, 7, 14, 14, 46, 0)),\n                       'geometry': geometry})\n\n    def add_address_placex(self, object_id, **kw):\n        self.add_placex(**kw)\n        self.add_data('addressline',\n                      {'place_id': object_id,\n                       'address_place_id': kw.get('place_id', 1000),\n                       'distance': kw.get('distance', 0.0),\n                       'cached_rank_address': kw.get('rank_address', 30),\n                       'fromarea': kw.get('fromarea', False),\n                       'isaddress': kw.get('isaddress', True)})\n\n    def add_osmline(self, **kw):\n        self.add_data('osmline',\n                      {'place_id': kw.get('place_id', 10000),\n                       'osm_id': kw.get('osm_id', 4004),\n                       'parent_place_id': kw.get('parent_place_id'),\n                       'indexed_status': kw.get('indexed_status', 0),\n                       'indexed_date': kw.get('indexed_date',\n                                              dt.datetime(2022, 12, 7, 14, 14, 46, 0)),\n                       'startnumber': kw.get('startnumber', 2),\n                       'endnumber': kw.get('endnumber', 6),\n                       'step': kw.get('step', 2),\n                       'address': kw.get('address'),\n                       'postcode': kw.get('postcode'),\n                       'country_code': kw.get('country_code'),\n                       'linegeo': kw.get('geometry', 'LINESTRING(1.1 -0.2, 1.09 -0.22)')})\n\n    def add_tiger(self, **kw):\n        self.add_data('tiger',\n                      {'place_id': kw.get('place_id', 30000),\n                       'parent_place_id': kw.get('parent_place_id'),\n                       'startnumber': kw.get('startnumber', 2),\n                       'endnumber': kw.get('endnumber', 6),\n                       'step': kw.get('step', 2),\n                       'postcode': kw.get('postcode'),\n                       'linegeo': kw.get('geometry', 'LINESTRING(1.1 -0.2, 1.09 -0.22)')})\n\n    def add_postcode(self, **kw):\n        self.add_data('postcode',\n                      {'place_id': kw.get('place_id', 1000),\n                       'osm_id': kw.get('osm_id'),\n                       'parent_place_id': kw.get('parent_place_id'),\n                       'country_code': kw.get('country_code'),\n                       'postcode': kw.get('postcode'),\n                       'rank_search': kw.get('rank_search', 21),\n                       'indexed_status': kw.get('indexed_status', 0),\n                       'indexed_date': kw.get('indexed_date',\n                                              dt.datetime(2022, 12, 7, 14, 14, 46, 0)),\n                       'centroid': kw.get('centroid', 'POINT(23 34)'),\n                       'geometry': kw.get('geometry', 'POLYGON((22.99 33.99, 22.99 34.01, '\n                                                      '23.01 34, 22.99 33.99))')})\n\n    def add_country(self, country_code, geometry):\n        self.add_data('country_grid',\n                      {'country_code': country_code,\n                       'area': 0.1,\n                       'geometry': geometry})\n\n    def add_country_name(self, country_code, names, partition=0):\n        self.add_data('country_name',\n                      {'country_code': country_code,\n                       'name': names,\n                       'partition': partition})\n\n    def add_search_name(self, place_id, **kw):\n        centroid = kw.get('centroid', (23.0, 34.0))\n        self.add_data('search_name',\n                      {'place_id': place_id,\n                       'importance': kw.get('importance', 0.00001),\n                       'search_rank': kw.get('search_rank', 30),\n                       'address_rank': kw.get('address_rank', 30),\n                       'name_vector': kw.get('names', []),\n                       'nameaddress_vector': kw.get('address', []),\n                       'country_code': kw.get('country_code', 'xx'),\n                       'centroid': 'POINT(%f %f)' % centroid})\n\n    def add_class_type_table(self, cls, typ):\n        self.async_to_sync(\n            self.exec_async(sa.text(f\"\"\"CREATE TABLE place_classtype_{cls}_{typ}\n                                         AS (SELECT place_id, centroid FROM placex\n                                             WHERE class = '{cls}' AND type = '{typ}')\n                                     \"\"\")))\n\n    def add_word_table(self, content):\n        data = [dict(zip(['word_id', 'word_token', 'type', 'word', 'info'], c))\n                for c in content]\n\n        async def _do_sql():\n            async with self.api._async_api.begin() as conn:\n                if 'word' not in conn.t.meta.tables:\n                    await make_query_analyzer(conn)\n                    word_table = conn.t.meta.tables['word']\n                    await conn.connection.run_sync(word_table.create)\n                if data:\n                    await conn.execute(conn.t.meta.tables['word'].insert(), data)\n\n        self.async_to_sync(_do_sql())\n\n    async def exec_async(self, sql, *args, **kwargs):\n        async with self.api._async_api.begin() as conn:\n            return await conn.execute(sql, *args, **kwargs)\n\n    async def create_tables(self):\n        async with self.api._async_api._engine.begin() as conn:\n            await conn.run_sync(self.api._async_api._tables.meta.create_all)\n\n\n@pytest.fixture\ndef apiobj(temp_db_with_extensions, temp_db_conn, monkeypatch):\n    \"\"\" Create an asynchronous SQLAlchemy engine for the test DB.\n    \"\"\"\n    monkeypatch.setenv('NOMINATIM_USE_US_TIGER_DATA', 'yes')\n    testapi = APITester()\n    testapi.async_to_sync(testapi.create_tables())\n\n    proc = SQLPreprocessor(temp_db_conn, testapi.api.config)\n    proc.run_sql_file(temp_db_conn, 'functions/ranking.sql')\n\n    loglib.set_log_output('text')\n    yield testapi\n    print(loglib.get_and_disable())\n\n    testapi.api.close()\n\n\n@pytest.fixture(params=['postgres_db', 'sqlite_db'])\ndef frontend(request, tmp_path):\n    testapis = []\n    if request.param == 'sqlite_db':\n        db = str(tmp_path / 'test_nominatim_python_unittest.sqlite')\n\n        def mkapi(apiobj, options={'reverse'}):\n            apiobj.add_data(\n                'properties',\n                [{'property': 'tokenizer', 'value': 'icu'},\n                 {'property': 'tokenizer_import_normalisation', 'value': ':: lower();'},\n                 {'property': 'tokenizer_import_transliteration',\n                  'value': \"'1' > '/1/'; 'ä' > 'ä '\"}])\n\n            async def _do_sql():\n                async with apiobj.api._async_api.begin() as conn:\n                    if 'word' in conn.t.meta.tables:\n                        return\n                    await make_query_analyzer(conn)\n                    word_table = conn.t.meta.tables['word']\n                    await conn.connection.run_sync(word_table.create)\n\n            apiobj.async_to_sync(_do_sql())\n\n            apiobj.async_to_sync(convert_sqlite.convert(None, db, options))\n            outapi = napi.NominatimAPI(environ={'NOMINATIM_DATABASE_DSN': f\"sqlite:dbname={db}\",\n                                                'NOMINATIM_USE_US_TIGER_DATA': 'yes'})\n            testapis.append(outapi)\n\n            return outapi\n    elif request.param == 'postgres_db':\n        def mkapi(apiobj, options=None):\n            return apiobj.api\n\n    yield mkapi\n\n    for api in testapis:\n        api.close()\n\n\n@pytest_asyncio.fixture\nasync def api(temp_db):\n    async with napi.NominatimAPIAsync() as api:\n        yield api\n"
  },
  {
    "path": "test/python/api/fake_adaptor.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nProvides dummy implementations of ASGIAdaptor for testing.\n\"\"\"\nfrom collections import namedtuple\n\nimport nominatim_api.v1.server_glue as glue\nfrom nominatim_api.v1.format import dispatch as formatting\nfrom nominatim_api.config import Configuration\n\n\nclass FakeError(BaseException):\n\n    def __init__(self, msg, status):\n        self.msg = msg\n        self.status = status\n\n    def __str__(self):\n        return f'{self.status} -- {self.msg}'\n\n\nFakeResponse = namedtuple('FakeResponse', ['status', 'output', 'content_type'])\n\n\nclass FakeAdaptor(glue.ASGIAdaptor):\n\n    def __init__(self, params=None, headers=None, config=None):\n        self.params = params or {}\n        self.headers = headers or {}\n        self._config = config or Configuration(None)\n\n    def get(self, name, default=None):\n        return self.params.get(name, default)\n\n    def get_header(self, name, default=None):\n        return self.headers.get(name, default)\n\n    def error(self, msg, status=400):\n        return FakeError(msg, status)\n\n    def create_response(self, status, output, num_results):\n        return FakeResponse(status, output, self.content_type)\n\n    def base_uri(self):\n        return 'http://test'\n\n    def config(self):\n        return self._config\n\n    def formatting(self):\n        return formatting\n\n    def query_stats(self):\n        return None\n"
  },
  {
    "path": "test/python/api/query_processing/test_normalize.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for normalizing search queries.\n\"\"\"\nfrom icu import Transliterator\n\nimport nominatim_api.search.query as qmod\nfrom nominatim_api.query_preprocessing.config import QueryConfig\nfrom nominatim_api.query_preprocessing import normalize\n\n\ndef run_preprocessor_on(query, norm):\n    normalizer = Transliterator.createFromRules(\"normalization\", norm)\n    proc = normalize.create(QueryConfig().set_normalizer(normalizer))\n\n    return proc(query)\n\n\ndef test_normalize_simple():\n    norm = ':: lower();'\n    query = [qmod.Phrase(qmod.PHRASE_ANY, 'Hallo')]\n\n    out = run_preprocessor_on(query, norm)\n\n    assert len(out) == 1\n    assert out == [qmod.Phrase(qmod.PHRASE_ANY, 'hallo')]\n"
  },
  {
    "path": "test/python/api/query_processing/test_regex_replace.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n'''\nTests for replacing values in an input using custom regex.\n'''\nimport pytest\n\nimport nominatim_api.search.query as qmod\nfrom nominatim_api.query_preprocessing.config import QueryConfig\nfrom nominatim_api.query_preprocessing import regex_replace\n\n\ndef run_preprocessor_on(query):\n    config = QueryConfig()\n    config.set_normalizer(None)\n\n    config['replacements'] = [\n        {'pattern': r'\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b', 'replace': ''},  # IPv4\n        {'pattern': r'https?://\\S+', 'replace': ''}  # HTTP/HTTPS URLs\n    ]\n\n    proc = regex_replace.create(config)\n    return proc(query)\n\n\n@pytest.mark.parametrize('inp,outp', [\n    (['45.67.89.101'], []),\n    (['198.51.100.23'], []),\n    (['203.0.113.255'], []),\n    (['http://www.openstreetmap.org'], []),\n    (['https://www.openstreetmap.org/edit'], []),\n    (['http://osm.org'], []),\n    (['https://www.openstreetmap.org/user/abc'], []),\n    (['https://tile.openstreetmap.org/12/2048/2048.png'], []),\n    (['Check the map at https://www.openstreetmap.org'], ['Check the map at ']),\n    (['Use 203.0.113.255 for routing'], ['Use  for routing']),\n    (['Find maps at https://osm.org and http://openstreetmap.org'], ['Find maps at  and ']),\n    (['203.0.113.255', 'Some Address'], ['Some Address']),\n    (['https://osm.org', 'Another Place'], ['Another Place']),\n])\ndef test_split_phrases(inp, outp):\n    query = [qmod.Phrase(qmod.PHRASE_ANY, text) for text in inp]\n\n    out = run_preprocessor_on(query)\n    assert out == [qmod.Phrase(qmod.PHRASE_ANY, text) for text in outp]\n"
  },
  {
    "path": "test/python/api/query_processing/test_split_japanese_phrases.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for japanese phrase splitting.\n\"\"\"\nimport pytest\n\nimport nominatim_api.search.query as qmod\nfrom nominatim_api.query_preprocessing.config import QueryConfig\nfrom nominatim_api.query_preprocessing import split_japanese_phrases\n\n\ndef run_preprocessor_on(query):\n    proc = split_japanese_phrases.create(QueryConfig().set_normalizer(None))\n\n    return proc(query)\n\n\n@pytest.mark.parametrize('inp,outp', [('大阪府大阪市大阪', '大阪府:大阪市:大阪'),\n                                      ('大阪府大阪', '大阪府:大阪'),\n                                      ('大阪市大阪', '大阪市:大阪')])\ndef test_split_phrases(inp, outp):\n    query = [qmod.Phrase(qmod.PHRASE_ANY, inp)]\n\n    out = run_preprocessor_on(query)\n\n    assert out == [qmod.Phrase(qmod.PHRASE_ANY, outp)]\n"
  },
  {
    "path": "test/python/api/search/test_api_search_query.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for tokenized query data structures.\n\"\"\"\nimport pytest\n\nfrom nominatim_api.search import query\n\n\nclass MyToken(query.Token):\n\n    def get_category(self):\n        return 'this', 'that'\n\n    def get_country(self):\n        return 'cc'\n\n\ndef mktoken(tid: int):\n    return MyToken(penalty=3.0, token=tid, count=1, addr_count=1,\n                   lookup_word='foo')\n\n\n@pytest.fixture\ndef qnode():\n    return query.QueryNode(query.BREAK_PHRASE, query.PHRASE_ANY, 0.0, '', '')\n\n\n@pytest.mark.parametrize('ptype,ttype', [(query.PHRASE_ANY, 'W'),\n                                         (query.PHRASE_AMENITY, 'Q'),\n                                         (query.PHRASE_STREET, 'w'),\n                                         (query.PHRASE_CITY, 'W'),\n                                         (query.PHRASE_COUNTRY, 'C'),\n                                         (query.PHRASE_POSTCODE, 'P')])\ndef test_phrase_compatible(ptype, ttype):\n    assert query._phrase_compatible_with(ptype, ttype, False)\n\n\n@pytest.mark.parametrize('ptype', [query.PHRASE_COUNTRY, query.PHRASE_POSTCODE])\ndef test_phrase_incompatible(ptype):\n    assert not query._phrase_compatible_with(ptype, query.TOKEN_PARTIAL, True)\n\n\ndef test_query_node_empty(qnode):\n    assert qnode.get_tokens(3, query.TOKEN_WORD) is None\n\n\ndef test_query_node_with_content(qnode):\n    qnode.starting.append(query.TokenList(2, query.TOKEN_PARTIAL, [mktoken(100), mktoken(101)]))\n    qnode.starting.append(query.TokenList(2, query.TOKEN_WORD, [mktoken(1000)]))\n\n    assert not qnode.has_tokens(3, query.TOKEN_PARTIAL)\n    assert not qnode.has_tokens(2, query.TOKEN_COUNTRY)\n    assert qnode.has_tokens(2, query.TOKEN_PARTIAL)\n    assert qnode.has_tokens(2, query.TOKEN_WORD)\n\n    assert qnode.get_tokens(2, query.TOKEN_COUNTRY) is None\n    assert len(qnode.get_tokens(2, query.TOKEN_PARTIAL)) == 2\n    assert len(qnode.get_tokens(2, query.TOKEN_WORD)) == 1\n\n\ndef test_query_struct_empty():\n    q = query.QueryStruct([])\n\n    assert q.num_token_slots() == 0\n\n\ndef test_query_struct_with_tokens():\n    q = query.QueryStruct([query.Phrase(query.PHRASE_ANY, 'foo bar')])\n    q.add_node(query.BREAK_WORD, query.PHRASE_ANY)\n    q.add_node(query.BREAK_END, query.PHRASE_ANY)\n\n    assert q.num_token_slots() == 2\n\n    q.add_token(query.TokenRange(0, 1), query.TOKEN_PARTIAL, mktoken(1))\n    q.add_token(query.TokenRange(1, 2), query.TOKEN_PARTIAL, mktoken(2))\n    q.add_token(query.TokenRange(1, 2), query.TOKEN_WORD, mktoken(99))\n    q.add_token(query.TokenRange(1, 2), query.TOKEN_WORD, mktoken(98))\n\n    assert q.get_tokens(query.TokenRange(0, 2), query.TOKEN_WORD) == []\n    assert len(q.get_tokens(query.TokenRange(1, 2), query.TOKEN_WORD)) == 2\n\n    partials = list(q.iter_partials(query.TokenRange(0, 2)))\n\n    assert len(partials) == 2\n    assert [t.token for t in partials] == [1, 2]\n\n    assert q.find_lookup_word_by_id(4) == 'None'\n    assert q.find_lookup_word_by_id(99) == '[W]foo'\n\n\ndef test_query_struct_incompatible_token():\n    q = query.QueryStruct([query.Phrase(query.PHRASE_COUNTRY, 'foo bar')])\n    q.add_node(query.BREAK_WORD, query.PHRASE_COUNTRY)\n    q.add_node(query.BREAK_END, query.PHRASE_ANY)\n\n    q.add_token(query.TokenRange(0, 1), query.TOKEN_PARTIAL, mktoken(1))\n    q.add_token(query.TokenRange(1, 2), query.TOKEN_COUNTRY, mktoken(100))\n\n    assert len(q.get_tokens(query.TokenRange(1, 2), query.TOKEN_COUNTRY)) == 1\n\n\ndef test_query_struct_amenity_single_word():\n    q = query.QueryStruct([query.Phrase(query.PHRASE_AMENITY, 'bar')])\n    q.add_node(query.BREAK_END, query.PHRASE_ANY)\n\n    q.add_token(query.TokenRange(0, 1), query.TOKEN_PARTIAL, mktoken(1))\n    q.add_token(query.TokenRange(0, 1), query.TOKEN_NEAR_ITEM, mktoken(2))\n    q.add_token(query.TokenRange(0, 1), query.TOKEN_QUALIFIER, mktoken(3))\n\n    assert q.nodes[0].partial.token == 1\n    assert len(q.get_tokens(query.TokenRange(0, 1), query.TOKEN_NEAR_ITEM)) == 1\n    assert len(q.get_tokens(query.TokenRange(0, 1), query.TOKEN_QUALIFIER)) == 0\n\n\ndef test_query_struct_amenity_two_words():\n    q = query.QueryStruct([query.Phrase(query.PHRASE_AMENITY, 'foo bar')])\n    q.add_node(query.BREAK_WORD, query.PHRASE_AMENITY)\n    q.add_node(query.BREAK_END, query.PHRASE_ANY)\n\n    for trange in [(0, 1), (1, 2)]:\n        q.add_token(query.TokenRange(*trange), query.TOKEN_PARTIAL, mktoken(1))\n        q.add_token(query.TokenRange(*trange), query.TOKEN_NEAR_ITEM, mktoken(2))\n        q.add_token(query.TokenRange(*trange), query.TOKEN_QUALIFIER, mktoken(3))\n\n    assert q.nodes[0].partial.token == 1\n    assert len(q.get_tokens(query.TokenRange(0, 1), query.TOKEN_NEAR_ITEM)) == 0\n    assert len(q.get_tokens(query.TokenRange(0, 1), query.TOKEN_QUALIFIER)) == 1\n\n    assert q.nodes[1].partial.token == 1\n    assert len(q.get_tokens(query.TokenRange(1, 2), query.TOKEN_NEAR_ITEM)) == 0\n    assert len(q.get_tokens(query.TokenRange(1, 2), query.TOKEN_QUALIFIER)) == 1\n"
  },
  {
    "path": "test/python/api/search/test_db_search_builder.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for creating abstract searches from token assignments.\n\"\"\"\nfrom typing import Optional\nimport pytest\nimport dataclasses\n\nfrom nominatim_api.search.query import Token, TokenRange, QueryStruct, Phrase\nimport nominatim_api.search.query as qmod\nfrom nominatim_api.search.db_search_builder import SearchBuilder\nfrom nominatim_api.search.token_assignment import TokenAssignment\nfrom nominatim_api.types import SearchDetails\nimport nominatim_api.search.db_searches as dbs\n\n\n@dataclasses.dataclass\nclass MyToken(Token):\n    cc: Optional[str] = None\n\n    def get_category(self):\n        return 'this', 'that'\n\n    def get_country(self):\n        return self.cc\n\n\ndef make_query(*args):\n    q = QueryStruct([Phrase(qmod.PHRASE_ANY, '')])\n\n    for _ in range(max(inner[0] for tlist in args for inner in tlist)):\n        q.add_node(qmod.BREAK_WORD, qmod.PHRASE_ANY)\n    q.add_node(qmod.BREAK_END, qmod.PHRASE_ANY)\n\n    for start, tlist in enumerate(args):\n        for end, ttype, tinfos in tlist:\n            for tinfo in tinfos:\n                if isinstance(tinfo, tuple):\n                    q.add_token(TokenRange(start, end), ttype,\n                                MyToken(penalty=0.5 if ttype == qmod.TOKEN_PARTIAL else 0.0,\n                                        token=tinfo[0], count=1, addr_count=1,\n                                        lookup_word=tinfo[1]))\n                else:\n                    q.add_token(TokenRange(start, end), ttype, tinfo)\n\n    return q\n\n\ndef test_country_search():\n    q = make_query([(1, qmod.TOKEN_COUNTRY, [\n        MyToken(penalty=0.0, token=2, count=1, addr_count=1, lookup_word='Germany', cc='de'),\n        MyToken(penalty=0.0, token=3, count=1, addr_count=1, lookup_word='UK', cc='en'),\n        ])])\n    builder = SearchBuilder(q, SearchDetails())\n\n    searches = list(builder.build(TokenAssignment(country=TokenRange(0, 1))))\n\n    assert len(searches) == 1\n\n    search = searches[0]\n\n    assert isinstance(search, dbs.CountrySearch)\n    assert set(search.countries.values) == {'de', 'en'}\n\n\ndef test_country_search_with_country_restriction():\n    q = make_query([(1, qmod.TOKEN_COUNTRY, [\n        MyToken(penalty=0.0, token=2, count=1, addr_count=1, lookup_word='Germany', cc='de'),\n        MyToken(penalty=0.0, token=3, count=1, addr_count=1, lookup_word='UK', cc='en'),\n    ])])\n    builder = SearchBuilder(q, SearchDetails.from_kwargs({'countries': 'en,fr'}))\n\n    searches = list(builder.build(TokenAssignment(country=TokenRange(0, 1))))\n\n    assert len(searches) == 1\n\n    search = searches[0]\n\n    assert isinstance(search, dbs.CountrySearch)\n    assert set(search.countries.values) == {'en'}\n\n\ndef test_country_search_with_conflicting_country_restriction():\n    q = make_query([(1, qmod.TOKEN_COUNTRY, [\n        MyToken(penalty=0.0, token=2, count=1, addr_count=1, lookup_word='Germany', cc='de'),\n        MyToken(penalty=0.0, token=3, count=1, addr_count=1, lookup_word='UK', cc='en'),\n    ])])\n    builder = SearchBuilder(q, SearchDetails.from_kwargs({'countries': 'fr'}))\n\n    searches = list(builder.build(TokenAssignment(country=TokenRange(0, 1))))\n\n    assert len(searches) == 0\n\n\ndef test_postcode_search_simple():\n    q = make_query([(1, qmod.TOKEN_POSTCODE, [(34, '2367')])])\n    builder = SearchBuilder(q, SearchDetails())\n\n    searches = list(builder.build(TokenAssignment(postcode=TokenRange(0, 1))))\n\n    assert len(searches) == 1\n    search = searches[0]\n\n    assert isinstance(search, dbs.PostcodeSearch)\n    assert search.postcodes.values == ['2367']\n    assert not search.countries.values\n    assert not search.lookups\n    assert not search.rankings\n\n\ndef test_postcode_with_country():\n    q = make_query(\n        [(1, qmod.TOKEN_POSTCODE, [(34, '2367')])],\n        [(2, qmod.TOKEN_COUNTRY, [\n            MyToken(penalty=0.0, token=1, count=1, addr_count=1, lookup_word='none', cc='xx'),\n            ])])\n    builder = SearchBuilder(q, SearchDetails())\n\n    searches = list(builder.build(TokenAssignment(postcode=TokenRange(0, 1),\n                                                  country=TokenRange(1, 2))))\n\n    assert len(searches) == 1\n    search = searches[0]\n\n    assert isinstance(search, dbs.PostcodeSearch)\n    assert search.postcodes.values == ['2367']\n    assert search.countries.values == ['xx']\n    assert not search.lookups\n    assert not search.rankings\n\n\ndef test_postcode_with_address():\n    q = make_query([(1, qmod.TOKEN_POSTCODE, [(34, '2367')])],\n                   [(2, qmod.TOKEN_PARTIAL, [(100, 'word')])])\n    builder = SearchBuilder(q, SearchDetails())\n\n    searches = list(builder.build(TokenAssignment(postcode=TokenRange(0, 1),\n                                                  address=[TokenRange(1, 2)])))\n\n    assert len(searches) == 1\n    search = searches[0]\n\n    assert isinstance(search, dbs.PostcodeSearch)\n    assert search.postcodes.values == ['2367']\n    assert not search.countries\n    assert search.lookups\n    assert not search.rankings\n\n\ndef test_postcode_with_address_with_full_word():\n    q = make_query([(1, qmod.TOKEN_POSTCODE, [(34, '2367')])],\n                   [(2, qmod.TOKEN_PARTIAL, [(100, 'word')]),\n                    (2, qmod.TOKEN_WORD, [(1, 'full')])])\n    builder = SearchBuilder(q, SearchDetails())\n\n    searches = list(builder.build(TokenAssignment(postcode=TokenRange(0, 1),\n                                                  address=[TokenRange(1, 2)])))\n\n    assert len(searches) == 1\n    search = searches[0]\n\n    assert isinstance(search, dbs.PostcodeSearch)\n    assert search.postcodes.values == ['2367']\n    assert not search.countries\n    assert search.lookups\n    assert len(search.rankings) == 1\n\n\n@pytest.mark.parametrize('kwargs', [{'viewbox': '0,0,1,1', 'bounded_viewbox': True},\n                                    {'near': '10,10'}])\ndef test_near_item_only(kwargs):\n    q = make_query([(1, qmod.TOKEN_NEAR_ITEM, [(2, 'foo')])])\n    builder = SearchBuilder(q, SearchDetails.from_kwargs(kwargs))\n\n    searches = list(builder.build(TokenAssignment(near_item=TokenRange(0, 1))))\n\n    assert len(searches) == 1\n\n    search = searches[0]\n\n    assert isinstance(search, dbs.PoiSearch)\n    assert search.qualifiers.values == [('this', 'that')]\n\n\n@pytest.mark.parametrize('kwargs', [{'viewbox': '0,0,1,1'},\n                                    {}])\ndef test_near_item_skipped(kwargs):\n    q = make_query([(1, qmod.TOKEN_NEAR_ITEM, [(2, 'foo')])])\n    builder = SearchBuilder(q, SearchDetails.from_kwargs(kwargs))\n\n    searches = list(builder.build(TokenAssignment(near_item=TokenRange(0, 1))))\n\n    assert len(searches) == 0\n\n\ndef test_name_only_search():\n    q = make_query([(1, qmod.TOKEN_PARTIAL, [(1, 'a')]),\n                    (1, qmod.TOKEN_WORD, [(100, 'a')])])\n    builder = SearchBuilder(q, SearchDetails())\n\n    searches = list(builder.build(TokenAssignment(name=TokenRange(0, 1))))\n\n    assert len(searches) == 1\n    search = searches[0]\n\n    assert isinstance(search, dbs.PlaceSearch)\n    assert not search.postcodes.values\n    assert not search.countries.values\n    assert not search.qualifiers.values\n    assert len(search.lookups) == 1\n    assert len(search.rankings) == 1\n\n\ndef test_name_with_qualifier():\n    q = make_query([(1, qmod.TOKEN_PARTIAL, [(1, 'a')]),\n                    (1, qmod.TOKEN_WORD, [(100, 'a')])],\n                   [(2, qmod.TOKEN_QUALIFIER, [(55, 'hotel')])])\n    builder = SearchBuilder(q, SearchDetails())\n\n    searches = list(builder.build(TokenAssignment(name=TokenRange(0, 1),\n                                                  qualifier=TokenRange(1, 2))))\n\n    assert len(searches) == 1\n    search = searches[0]\n\n    assert isinstance(search, dbs.PlaceSearch)\n    assert not search.postcodes.values\n    assert not search.countries.values\n    assert search.qualifiers.values == [('this', 'that')]\n    assert len(search.lookups) == 1\n    assert len(search.rankings) == 1\n\n\ndef test_name_with_housenumber_search():\n    q = make_query([(1, qmod.TOKEN_PARTIAL, [(1, 'a')]),\n                    (1, qmod.TOKEN_WORD, [(100, 'a')])],\n                   [(2, qmod.TOKEN_HOUSENUMBER, [(66, '66')])])\n    builder = SearchBuilder(q, SearchDetails())\n\n    searches = list(builder.build(TokenAssignment(name=TokenRange(0, 1),\n                                                  housenumber=TokenRange(1, 2))))\n\n    assert len(searches) == 1\n    search = searches[0]\n\n    assert isinstance(search, dbs.AddressSearch)\n    assert not search.postcodes.values\n    assert not search.countries.values\n    assert search.housenumbers.values == ['66']\n    assert len(search.lookups) == 1\n    assert len(search.rankings) == 1\n\n\ndef test_name_and_address():\n    q = make_query([(1, qmod.TOKEN_PARTIAL, [(1, 'a')]),\n                    (1, qmod.TOKEN_WORD, [(100, 'a')])],\n                   [(2, qmod.TOKEN_PARTIAL, [(2, 'b')]),\n                    (2, qmod.TOKEN_WORD, [(101, 'b')])],\n                   [(3, qmod.TOKEN_PARTIAL, [(3, 'c')]),\n                    (3, qmod.TOKEN_WORD, [(102, 'c')])])\n    builder = SearchBuilder(q, SearchDetails())\n\n    searches = list(builder.build(TokenAssignment(name=TokenRange(0, 1),\n                                                  address=[TokenRange(1, 2),\n                                                           TokenRange(2, 3)])))\n\n    assert len(searches) == 1\n    search = searches[0]\n\n    assert isinstance(search, dbs.PlaceSearch)\n    assert not search.postcodes.values\n    assert not search.countries.values\n    assert len(search.lookups) == 2\n    assert len(search.rankings) == 3\n\n\ndef test_name_and_complex_address():\n    q = make_query([(1, qmod.TOKEN_PARTIAL, [(1, 'a')]),\n                    (1, qmod.TOKEN_WORD, [(100, 'a')])],\n                   [(2, qmod.TOKEN_PARTIAL, [(2, 'b')]),\n                    (3, qmod.TOKEN_WORD, [(101, 'bc')])],\n                   [(3, qmod.TOKEN_PARTIAL, [(3, 'c')])],\n                   [(4, qmod.TOKEN_PARTIAL, [(4, 'd')]),\n                    (4, qmod.TOKEN_WORD, [(103, 'd')])])\n    builder = SearchBuilder(q, SearchDetails())\n\n    searches = list(builder.build(TokenAssignment(name=TokenRange(0, 1),\n                                                  address=[TokenRange(1, 2),\n                                                           TokenRange(2, 4)])))\n\n    assert len(searches) == 1\n    search = searches[0]\n\n    assert isinstance(search, dbs.PlaceSearch)\n    assert not search.postcodes.values\n    assert not search.countries.values\n    assert len(search.lookups) == 2\n    assert len(search.rankings) == 2\n\n\ndef test_name_only_near_search():\n    q = make_query([(1, qmod.TOKEN_NEAR_ITEM, [(88, 'g')])],\n                   [(2, qmod.TOKEN_PARTIAL, [(1, 'a')]),\n                    (2, qmod.TOKEN_WORD, [(100, 'a')])])\n    builder = SearchBuilder(q, SearchDetails())\n\n    searches = list(builder.build(TokenAssignment(name=TokenRange(1, 2),\n                                                  near_item=TokenRange(0, 1))))\n\n    assert len(searches) == 1\n    search = searches[0]\n\n    assert isinstance(search, dbs.NearSearch)\n    assert isinstance(search.search, dbs.PlaceSearch)\n\n\ndef test_name_only_search_with_category():\n    q = make_query([(1, qmod.TOKEN_PARTIAL, [(1, 'a')]),\n                    (1, qmod.TOKEN_WORD, [(100, 'a')])])\n    builder = SearchBuilder(q, SearchDetails.from_kwargs({'categories': [('foo', 'bar')]}))\n\n    searches = list(builder.build(TokenAssignment(name=TokenRange(0, 1))))\n\n    assert len(searches) == 1\n    search = searches[0]\n\n    assert isinstance(search, dbs.PlaceSearch)\n    assert search.qualifiers.values == [('foo', 'bar')]\n\n\ndef test_name_with_near_item_search_with_category_mismatch():\n    q = make_query([(1, qmod.TOKEN_NEAR_ITEM, [(88, 'g')])],\n                   [(2, qmod.TOKEN_PARTIAL, [(1, 'a')]),\n                    (2, qmod.TOKEN_WORD, [(100, 'a')])])\n    builder = SearchBuilder(q, SearchDetails.from_kwargs({'categories': [('foo', 'bar')]}))\n\n    searches = list(builder.build(TokenAssignment(name=TokenRange(1, 2),\n                                                  near_item=TokenRange(0, 1))))\n\n    assert len(searches) == 0\n\n\ndef test_name_with_near_item_search_with_category_match():\n    q = make_query([(1, qmod.TOKEN_NEAR_ITEM, [(88, 'g')])],\n                   [(2, qmod.TOKEN_PARTIAL, [(1, 'a')]),\n                    (2, qmod.TOKEN_WORD, [(100, 'a')])])\n    builder = SearchBuilder(q, SearchDetails.from_kwargs({'categories': [('foo', 'bar'),\n                                                                         ('this', 'that')]}))\n\n    searches = list(builder.build(TokenAssignment(name=TokenRange(1, 2),\n                                                  near_item=TokenRange(0, 1))))\n\n    assert len(searches) == 1\n    search = searches[0]\n\n    assert isinstance(search, dbs.NearSearch)\n    assert isinstance(search.search, dbs.PlaceSearch)\n\n\ndef test_name_with_qualifier_search_with_category_mismatch():\n    q = make_query([(1, qmod.TOKEN_QUALIFIER, [(88, 'g')])],\n                   [(2, qmod.TOKEN_PARTIAL, [(1, 'a')]),\n                    (2, qmod.TOKEN_WORD, [(100, 'a')])])\n    builder = SearchBuilder(q, SearchDetails.from_kwargs({'categories': [('foo', 'bar')]}))\n\n    searches = list(builder.build(TokenAssignment(name=TokenRange(1, 2),\n                                                  qualifier=TokenRange(0, 1))))\n\n    assert len(searches) == 0\n\n\ndef test_name_with_qualifier_search_with_category_match():\n    q = make_query([(1, qmod.TOKEN_QUALIFIER, [(88, 'g')])],\n                   [(2, qmod.TOKEN_PARTIAL, [(1, 'a')]),\n                    (2, qmod.TOKEN_WORD, [(100, 'a')])])\n    builder = SearchBuilder(q, SearchDetails.from_kwargs({'categories': [('foo', 'bar'),\n                                                                         ('this', 'that')]}))\n\n    searches = list(builder.build(TokenAssignment(name=TokenRange(1, 2),\n                                                  qualifier=TokenRange(0, 1))))\n\n    assert len(searches) == 1\n    search = searches[0]\n\n    assert isinstance(search, dbs.PlaceSearch)\n    assert search.qualifiers.values == [('this', 'that')]\n\n\ndef test_name_only_search_with_countries():\n    q = make_query([(1, qmod.TOKEN_PARTIAL, [(1, 'a')]),\n                    (1, qmod.TOKEN_WORD, [(100, 'a')])])\n    builder = SearchBuilder(q, SearchDetails.from_kwargs({'countries': 'de,en'}))\n\n    searches = list(builder.build(TokenAssignment(name=TokenRange(0, 1))))\n\n    assert len(searches) == 1\n    search = searches[0]\n\n    assert isinstance(search, dbs.PlaceSearch)\n    assert not search.postcodes.values\n    assert set(search.countries.values) == {'de', 'en'}\n\n\ndef make_counted_searches(name_part, name_full, address_part, address_full,\n                          num_address_parts=1):\n    q = QueryStruct([Phrase(qmod.PHRASE_ANY, '')])\n    for i in range(1 + num_address_parts):\n        q.add_node(qmod.BREAK_WORD, qmod.PHRASE_ANY)\n    q.add_node(qmod.BREAK_END, qmod.PHRASE_ANY)\n\n    q.add_token(TokenRange(0, 1), qmod.TOKEN_PARTIAL,\n                MyToken(0.5, 1, name_part, 1, 'name_part'))\n    q.add_token(TokenRange(0, 1), qmod.TOKEN_WORD,\n                MyToken(0, 101, name_full, 1, 'name_full'))\n    for i in range(num_address_parts):\n        q.add_token(TokenRange(i + 1, i + 2), qmod.TOKEN_PARTIAL,\n                    MyToken(0.5, 2, 1, address_part, 'address_part'))\n        q.add_token(TokenRange(i + 1, i + 2), qmod.TOKEN_WORD,\n                    MyToken(0, 102, 1, address_full, 'address_full'))\n\n    builder = SearchBuilder(q, SearchDetails())\n\n    return list(builder.build(TokenAssignment(name=TokenRange(0, 1),\n                                              address=[TokenRange(1, 1 + num_address_parts)])))\n\n\ndef test_infrequent_partials_in_name():\n    searches = make_counted_searches(1, 1, 1, 1)\n\n    assert len(searches) == 1\n    search = searches[0]\n\n    assert isinstance(search, dbs.PlaceSearch)\n    assert len(search.lookups) == 2\n    assert len(search.rankings) == 2\n\n    assert set((s.column, s.lookup_type.__name__) for s in search.lookups) == \\\n        {('name_vector', 'LookupAll'), ('nameaddress_vector', 'Restrict')}\n\n\ndef test_frequent_partials_in_name_and_address():\n    searches = make_counted_searches(20001, 1, 20001, 1)\n\n    assert len(searches) == 2\n\n    assert all(isinstance(s, dbs.PlaceSearch) for s in searches)\n    searches.sort(key=lambda s: s.penalty)\n\n    assert set((s.column, s.lookup_type.__name__) for s in searches[0].lookups) == \\\n        {('name_vector', 'LookupAny'), ('nameaddress_vector', 'Restrict')}\n    assert set((s.column, s.lookup_type.__name__) for s in searches[1].lookups) == \\\n        {('nameaddress_vector', 'Restrict'), ('name_vector', 'LookupAll')}\n\n\ndef test_too_frequent_partials_in_name_and_address():\n    searches = make_counted_searches(50001, 1, 30001, 1)\n\n    assert len(searches) == 1\n\n    assert all(isinstance(s, dbs.PlaceSearch) for s in searches)\n    searches.sort(key=lambda s: s.penalty)\n\n    assert set((s.column, s.lookup_type.__name__) for s in searches[0].lookups) == \\\n        {('name_vector', 'LookupAny'), ('nameaddress_vector', 'Restrict')}\n"
  },
  {
    "path": "test/python/api/search/test_icu_query_analyzer.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for query analyzer for ICU tokenizer.\n\"\"\"\nimport pytest\nimport pytest_asyncio\n\nfrom nominatim_api import NominatimAPIAsync\nfrom nominatim_api.search.query import Phrase\nimport nominatim_api.search.query as qmod\nimport nominatim_api.search.icu_tokenizer as tok\nfrom nominatim_api.logging import set_log_output, get_and_disable\n\n\nasync def add_word(conn, word_id, word_token, wtype, word, info=None):\n    t = conn.t.meta.tables['word']\n    await conn.execute(t.insert(), {'word_id': word_id,\n                                    'word_token': word_token,\n                                    'type': wtype,\n                                    'word': word,\n                                    'info': info})\n\n\ndef make_phrase(query):\n    return [Phrase(qmod.PHRASE_ANY, s) for s in query.split(',')]\n\n\n@pytest_asyncio.fixture\nasync def conn(table_factory):\n    \"\"\" Create an asynchronous SQLAlchemy engine for the test DB.\n    \"\"\"\n    table_factory('nominatim_properties',\n                  definition='property TEXT, value TEXT',\n                  content=(('tokenizer_import_normalisation', ':: lower();'),\n                           ('tokenizer_import_transliteration', \"'1' > '/1/'; 'ä' > 'ä '\")))\n    table_factory('word',\n                  definition='word_id INT, word_token TEXT, type TEXT, word TEXT, info JSONB')\n\n    async with NominatimAPIAsync() as api:\n        async with api.begin() as conn:\n            yield conn\n\n\n@pytest.mark.asyncio\nasync def test_empty_phrase(conn):\n    ana = await tok.create_query_analyzer(conn)\n\n    query = await ana.analyze_query([])\n\n    assert len(query.source) == 0\n    assert query.num_token_slots() == 0\n\n\n@pytest.mark.asyncio\nasync def test_single_phrase_with_unknown_terms(conn):\n    ana = await tok.create_query_analyzer(conn)\n\n    await add_word(conn, 1, 'foo', 'w', 'FOO')\n\n    query = await ana.analyze_query(make_phrase('foo BAR'))\n\n    assert len(query.source) == 1\n    assert query.source[0].ptype == qmod.PHRASE_ANY\n    assert query.source[0].text == 'foo bar'\n\n    assert query.num_token_slots() == 2\n    assert query.nodes[0].partial.token == 1\n    assert query.nodes[1].partial is None\n\n\n@pytest.mark.asyncio\nasync def test_multiple_phrases(conn):\n    ana = await tok.create_query_analyzer(conn)\n\n    await add_word(conn, 1, 'one', 'w', 'one')\n    await add_word(conn, 2, 'two', 'w', 'two')\n    await add_word(conn, 100, 'one two', 'W', 'one two')\n    await add_word(conn, 3, 'three', 'w', 'three')\n\n    query = await ana.analyze_query(make_phrase('one two,three'))\n\n    assert len(query.source) == 2\n\n\n@pytest.mark.asyncio\nasync def test_splitting_in_transliteration(conn):\n    ana = await tok.create_query_analyzer(conn)\n\n    await add_word(conn, 1, 'mä', 'W', 'ma')\n    await add_word(conn, 2, 'fo', 'W', 'fo')\n\n    query = await ana.analyze_query(make_phrase('mäfo'))\n\n    assert query.num_token_slots() == 2\n    assert query.nodes[0].starting\n    assert query.nodes[1].starting\n    assert query.nodes[1].btype == qmod.BREAK_TOKEN\n\n\n@pytest.mark.asyncio\n@pytest.mark.parametrize('term,order', [('23456', ['P', 'H', 'W']),\n                                        ('3', ['H', 'W'])])\nasync def test_penalty_postcodes_and_housenumbers(conn, term, order):\n    ana = await tok.create_query_analyzer(conn)\n\n    await add_word(conn, 2, term, 'H', term)\n    await add_word(conn, 3, term, 'w', term)\n    await add_word(conn, 4, term, 'W', term)\n\n    query = await ana.analyze_query(make_phrase(term))\n\n    assert query.num_token_slots() == 1\n\n    torder = [(min(t.penalty for t in tl.tokens), tl.ttype) for tl in query.nodes[0].starting]\n    torder.sort()\n\n    print(torder)\n\n    assert [t[1] for t in torder] == order\n\n\n@pytest.mark.asyncio\nasync def test_category_words_only_at_beginning(conn):\n    ana = await tok.create_query_analyzer(conn)\n\n    await add_word(conn, 1, 'foo', 'S', 'FOO', {'op': 'in'})\n    await add_word(conn, 2, 'bar', 'w', 'BAR')\n\n    query = await ana.analyze_query(make_phrase('foo BAR foo'))\n\n    assert query.num_token_slots() == 3\n    assert len(query.nodes[0].starting) == 1\n    assert query.nodes[0].starting[0].ttype == qmod.TOKEN_NEAR_ITEM\n    assert not query.nodes[2].starting\n\n\n@pytest.mark.asyncio\nasync def test_freestanding_qualifier_words_become_category(conn):\n    ana = await tok.create_query_analyzer(conn)\n\n    await add_word(conn, 1, 'foo', 'S', 'FOO', {'op': '-'})\n\n    query = await ana.analyze_query(make_phrase('foo'))\n\n    assert query.num_token_slots() == 1\n    assert len(query.nodes[0].starting) == 1\n    assert query.nodes[0].starting[0].ttype == qmod.TOKEN_NEAR_ITEM\n\n\n@pytest.mark.asyncio\nasync def test_qualifier_words(conn):\n    ana = await tok.create_query_analyzer(conn)\n\n    await add_word(conn, 1, 'foo', 'S', None, {'op': '-'})\n    await add_word(conn, 2, 'bar', 'w', None)\n\n    query = await ana.analyze_query(make_phrase('foo BAR foo BAR foo'))\n\n    assert query.num_token_slots() == 5\n    assert set(t.ttype for t in query.nodes[0].starting) == {qmod.TOKEN_QUALIFIER}\n    assert set(t.ttype for t in query.nodes[2].starting) == {qmod.TOKEN_QUALIFIER}\n    assert set(t.ttype for t in query.nodes[4].starting) == {qmod.TOKEN_QUALIFIER}\n\n\n@pytest.mark.asyncio\nasync def test_add_unknown_housenumbers(conn):\n    ana = await tok.create_query_analyzer(conn)\n\n    await add_word(conn, 1, '23', 'H', '23')\n\n    query = await ana.analyze_query(make_phrase('466 23 99834 34a'))\n\n    assert query.num_token_slots() == 4\n    assert query.nodes[0].starting[0].ttype == qmod.TOKEN_HOUSENUMBER\n    assert len(query.nodes[0].starting[0].tokens) == 1\n    assert query.nodes[0].starting[0].tokens[0].token == 0\n    assert query.nodes[1].starting[0].ttype == qmod.TOKEN_HOUSENUMBER\n    assert len(query.nodes[1].starting[0].tokens) == 1\n    assert query.nodes[1].starting[0].tokens[0].token == 1\n    assert query.nodes[2].has_tokens(3, qmod.TOKEN_POSTCODE)\n    assert not query.nodes[2].has_tokens(3, qmod.TOKEN_HOUSENUMBER)\n    assert not query.nodes[2].has_tokens(4, qmod.TOKEN_HOUSENUMBER)\n    assert not query.nodes[3].has_tokens(4, qmod.TOKEN_HOUSENUMBER)\n\n\n@pytest.mark.asyncio\n@pytest.mark.parametrize('logtype', ['text', 'html'])\nasync def test_log_output(conn, logtype):\n\n    ana = await tok.create_query_analyzer(conn)\n\n    await add_word(conn, 1, 'foo', 'w', 'FOO')\n\n    set_log_output(logtype)\n    await ana.analyze_query(make_phrase('foo'))\n\n    assert get_and_disable()\n"
  },
  {
    "path": "test/python/api/search/test_postcode_parser.py",
    "content": "\n# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTest for parsing of postcodes in queries.\n\"\"\"\nimport re\nfrom itertools import zip_longest\n\nimport pytest\n\nfrom nominatim_api.search.postcode_parser import PostcodeParser\nfrom nominatim_api.search.query import QueryStruct, PHRASE_ANY, PHRASE_POSTCODE, PHRASE_STREET\n\n\n@pytest.fixture\ndef pc_config(project_env):\n    country_file = project_env.project_dir / 'country_settings.yaml'\n    country_file.write_text(r\"\"\"\nab:\n  postcode:\n    pattern: \"ddddd ll\"\nba:\n  postcode:\n    pattern: \"ddddd\"\nde:\n  postcode:\n    pattern: \"ddddd\"\ngr:\n  postcode:\n    pattern: \"(ddd) ?(dd)\"\n    output: \\1 \\2\nin:\n  postcode:\n    pattern: \"(ddd) ?(ddd)\"\n    output: \\1\\2\nmc:\n  postcode:\n    pattern: \"980dd\"\nmz:\n  postcode:\n    pattern: \"(dddd)(?:-dd)?\"\nbn:\n  postcode:\n    pattern: \"(ll) ?(dddd)\"\n    output: \\1\\2\nky:\n  postcode:\n    pattern: \"(d)-(dddd)\"\n    output: KY\\1-\\2\n\ngb:\n  postcode:\n    pattern: \"(l?ld[A-Z0-9]?) ?(dll)\"\n    output: \\1 \\2\n\n    \"\"\", encoding='utf-8')\n\n    return project_env\n\n\ndef mk_query(inp):\n    query = QueryStruct([])\n    phrase_split = re.split(r\"([ ,:'-])\", inp)\n\n    for word, breakchar in zip_longest(*[iter(phrase_split)]*2, fillvalue='>'):\n        query.add_node(breakchar, PHRASE_ANY, word, word)\n\n    return query\n\n\n@pytest.mark.parametrize('query,pos', [('45325 Berlin', 0),\n                                       ('45325:Berlin', 0),\n                                       ('45325,Berlin', 0),\n                                       ('Berlin 45325', 1),\n                                       ('Berlin,45325', 1),\n                                       ('Berlin:45325', 1),\n                                       ('Hansastr,45325 Berlin', 1),\n                                       ('Hansastr 45325 Berlin', 1)])\ndef test_simple_postcode(pc_config, query, pos):\n    parser = PostcodeParser(pc_config)\n\n    result = parser.parse(mk_query(query))\n\n    assert result == {(pos, pos + 1, '45325'), (pos, pos + 1, '453 25')}\n\n\n@pytest.mark.parametrize('query', ['EC1R 3HF', 'ec1r 3hf'])\ndef test_postcode_matching_case_insensitive(pc_config, query):\n    parser = PostcodeParser(pc_config)\n\n    assert parser.parse(mk_query(query)) == {(0, 2, 'EC1R 3HF')}\n\n\ndef test_contained_postcode(pc_config):\n    parser = PostcodeParser(pc_config)\n\n    assert parser.parse(mk_query('12345 dx')) == {(0, 1, '12345'), (0, 1, '123 45'),\n                                                  (0, 2, '12345 DX')}\n\n\n@pytest.mark.parametrize('query,frm,to', [('345987', 0, 1), ('345 987', 0, 2),\n                                          ('Aina 345 987', 1, 3),\n                                          ('Aina 23 345 987 ff', 2, 4)])\ndef test_postcode_with_space(pc_config, query, frm, to):\n    parser = PostcodeParser(pc_config)\n\n    result = parser.parse(mk_query(query))\n\n    assert result == {(frm, to, '345987')}\n\n\ndef test_overlapping_postcode(pc_config):\n    parser = PostcodeParser(pc_config)\n\n    assert parser.parse(mk_query('123 456 78')) == {(0, 2, '123456'), (1, 3, '456 78')}\n\n\n@pytest.mark.parametrize('query', ['45325-Berlin', \"45325'Berlin\",\n                                   'Berlin-45325', \"Berlin'45325\", '45325Berlin'\n                                   '345-987', \"345'987\", '345,987', '345:987'])\ndef test_not_a_postcode(pc_config, query):\n    parser = PostcodeParser(pc_config)\n\n    assert not parser.parse(mk_query(query))\n\n\n@pytest.mark.parametrize('query', ['ba 12233', 'ba-12233'])\ndef test_postcode_with_country_prefix(pc_config, query):\n    parser = PostcodeParser(pc_config)\n\n    assert (0, 2, '12233') in parser.parse(mk_query(query))\n\n\ndef test_postcode_with_joined_country_prefix(pc_config):\n    parser = PostcodeParser(pc_config)\n\n    assert parser.parse(mk_query('ba12233')) == {(0, 1, '12233')}\n\n\ndef test_postcode_with_non_matching_country_prefix(pc_config):\n    parser = PostcodeParser(pc_config)\n\n    assert not parser.parse(mk_query('ky12233'))\n\n\ndef test_postcode_inside_postcode_phrase(pc_config):\n    parser = PostcodeParser(pc_config)\n\n    query = QueryStruct([])\n    query.nodes[-1].ptype = PHRASE_STREET\n    query.add_node(',', PHRASE_STREET, '12345', '12345')\n    query.add_node(',', PHRASE_POSTCODE, 'xz', 'xz')\n    query.add_node('>', PHRASE_POSTCODE, '4444', '4444')\n\n    assert parser.parse(query) == {(2, 3, '4444')}\n\n\ndef test_partial_postcode_in_postcode_phrase(pc_config):\n    parser = PostcodeParser(pc_config)\n\n    query = QueryStruct([])\n    query.nodes[-1].ptype = PHRASE_POSTCODE\n    query.add_node(' ', PHRASE_POSTCODE, '2224', '2224')\n    query.add_node('>', PHRASE_POSTCODE, '12345', '12345')\n\n    assert not parser.parse(query)\n"
  },
  {
    "path": "test/python/api/search/test_query.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTest data types for search queries.\n\"\"\"\nimport pytest\n\nimport nominatim_api.search.query as nq\n\n\ndef test_token_range_equal():\n    assert nq.TokenRange(2, 3) == nq.TokenRange(2, 3)\n    assert not (nq.TokenRange(2, 3) != nq.TokenRange(2, 3))\n\n\n@pytest.mark.parametrize('lop,rop', [((1, 2), (3, 4)),\n                                     ((3, 4), (3, 5)),\n                                     ((10, 12), (11, 12))])\ndef test_token_range_unequal(lop, rop):\n    assert not (nq.TokenRange(*lop) == nq.TokenRange(*rop))\n    assert nq.TokenRange(*lop) != nq.TokenRange(*rop)\n\n\ndef test_token_range_lt():\n    assert nq.TokenRange(1, 3) < nq.TokenRange(10, 12)\n    assert nq.TokenRange(5, 6) < nq.TokenRange(7, 8)\n    assert nq.TokenRange(1, 4) < nq.TokenRange(4, 5)\n    assert not (nq.TokenRange(5, 6) < nq.TokenRange(5, 6))\n    assert not (nq.TokenRange(10, 11) < nq.TokenRange(4, 5))\n\n\ndef test_token_rankge_gt():\n    assert nq.TokenRange(3, 4) > nq.TokenRange(1, 2)\n    assert nq.TokenRange(100, 200) > nq.TokenRange(10, 11)\n    assert nq.TokenRange(10, 11) > nq.TokenRange(4, 10)\n    assert not (nq.TokenRange(5, 6) > nq.TokenRange(5, 6))\n    assert not (nq.TokenRange(1, 2) > nq.TokenRange(3, 4))\n    assert not (nq.TokenRange(4, 10) > nq.TokenRange(3, 5))\n\n\ndef test_token_range_unimplemented_ops():\n    with pytest.raises(TypeError):\n        nq.TokenRange(1, 3) <= nq.TokenRange(10, 12)\n    with pytest.raises(TypeError):\n        nq.TokenRange(1, 3) >= nq.TokenRange(10, 12)\n\n\ndef test_query_extract_words():\n    q = nq.QueryStruct([])\n    q.add_node(nq.BREAK_WORD, nq.PHRASE_ANY, '12', '')\n    q.add_node(nq.BREAK_TOKEN, nq.PHRASE_ANY, 'ab', '')\n    q.add_node(nq.BREAK_PHRASE, nq.PHRASE_ANY, '12', '')\n    q.add_node(nq.BREAK_END, nq.PHRASE_ANY, 'hallo', '')\n\n    words = q.extract_words()\n\n    assert set(words.keys()) \\\n        == {'12', 'ab', 'hallo', '12 ab', 'ab 12', '12 ab 12'}\n    assert sorted(words['12']) == [nq.TokenRange(0, 1), nq.TokenRange(2, 3)]\n    assert words['12 ab'] == [nq.TokenRange(0, 2)]\n    assert words['hallo'] == [nq.TokenRange(3, 4)]\n"
  },
  {
    "path": "test/python/api/search/test_query_analyzer_factory.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for query analyzer creation.\n\"\"\"\nimport pytest\n\nfrom nominatim_api.search.query_analyzer_factory import make_query_analyzer\nfrom nominatim_api.search.icu_tokenizer import ICUQueryAnalyzer\n\n\n@pytest.mark.asyncio\nasync def test_import_icu_tokenizer(table_factory, api):\n    table_factory('nominatim_properties',\n                  definition='property TEXT, value TEXT',\n                  content=(('tokenizer', 'icu'),\n                           ('tokenizer_import_normalisation', ':: lower();'),\n                           ('tokenizer_import_transliteration', \"'1' > '/1/'; 'ä' > 'ä '\")))\n\n    async with api.begin() as conn:\n        ana = await make_query_analyzer(conn)\n\n        assert isinstance(ana, ICUQueryAnalyzer)\n\n\n@pytest.mark.asyncio\nasync def test_import_missing_property(table_factory, api):\n    table_factory('nominatim_properties',\n                  definition='property TEXT, value TEXT')\n\n    async with api.begin() as conn:\n        with pytest.raises(ValueError, match='Property.*not found'):\n            await make_query_analyzer(conn)\n\n\n@pytest.mark.asyncio\nasync def test_import_missing_module(table_factory, api):\n    table_factory('nominatim_properties',\n                  definition='property TEXT, value TEXT',\n                  content=(('tokenizer', 'missing'),))\n\n    async with api.begin() as conn:\n        with pytest.raises(RuntimeError, match='Tokenizer not found'):\n            await make_query_analyzer(conn)\n"
  },
  {
    "path": "test/python/api/search/test_search_address.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for running the address searcher.\n\"\"\"\nimport pytest\n\nimport nominatim_api as napi\nfrom nominatim_api.types import SearchDetails, PlaceID\nfrom nominatim_api.search.db_searches import AddressSearch\nfrom nominatim_api.search.db_search_fields import WeightedStrings, WeightedCategories, \\\n                                                  FieldLookup, FieldRanking, RankedTokens\nfrom nominatim_api.search.db_search_lookups import LookupAll\n\nAPIOPTIONS = ['search']\n\n\ndef run_search(apiobj, frontend, global_penalty, lookup, ranking, count=2,\n               hnrs=[], pcs=[], ccodes=[], quals=[], has_address=False,\n               details=SearchDetails()):\n    class MySearchData:\n        penalty = global_penalty\n        postcodes = WeightedStrings(pcs, [0.0] * len(pcs))\n        countries = WeightedStrings(ccodes, [0.0] * len(ccodes))\n        housenumbers = WeightedStrings(hnrs, [0.0] * len(hnrs))\n        qualifiers = WeightedCategories(quals, [0.0] * len(quals))\n        lookups = lookup\n        rankings = ranking\n\n    search = AddressSearch(0.0, MySearchData(), count, has_address)\n\n    if frontend is None:\n        api = apiobj\n    else:\n        api = frontend(apiobj, options=APIOPTIONS)\n\n    async def run():\n        async with api._async_api.begin() as conn:\n            return await search.lookup(conn, details)\n\n    results = api._loop.run_until_complete(run())\n    results.sort(key=lambda r: r.accuracy)\n\n    return results\n\n\nclass TestStreetWithHousenumber:\n\n    @pytest.fixture(autouse=True)\n    def fill_database(self, apiobj):\n        apiobj.add_placex(place_id=1, class_='place', type='house',\n                          parent_place_id=1000,\n                          housenumber='20 a', country_code='es')\n        apiobj.add_placex(place_id=2, class_='place', type='house',\n                          parent_place_id=1000,\n                          housenumber='21;22', country_code='es')\n        apiobj.add_placex(place_id=1000, class_='highway', type='residential',\n                          rank_search=26, rank_address=26,\n                          country_code='es')\n        apiobj.add_search_name(1000, names=[1, 2, 10, 11],\n                               search_rank=26, address_rank=26,\n                               country_code='es')\n        apiobj.add_placex(place_id=91, class_='place', type='house',\n                          parent_place_id=2000,\n                          housenumber='20', country_code='pt')\n        apiobj.add_placex(place_id=92, class_='place', type='house',\n                          parent_place_id=2000,\n                          housenumber='22', country_code='pt')\n        apiobj.add_placex(place_id=93, class_='place', type='house',\n                          parent_place_id=2000,\n                          housenumber='24', country_code='pt')\n        apiobj.add_placex(place_id=2000, class_='highway', type='residential',\n                          rank_search=26, rank_address=26,\n                          country_code='pt')\n        apiobj.add_search_name(2000, names=[1, 2, 20, 21],\n                               search_rank=26, address_rank=26,\n                               country_code='pt')\n\n    @pytest.mark.parametrize('hnr,res', [('20', [91, 1]), ('20 a', [1]),\n                                         ('21', [2]), ('22', [2, 92]),\n                                         ('24', [93]), ('25', [])])\n    def test_lookup_by_single_housenumber(self, apiobj, frontend, hnr, res):\n        lookup = FieldLookup('name_vector', [1, 2], LookupAll)\n        ranking = FieldRanking('name_vector', 0.3, [RankedTokens(0.0, [10])])\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [ranking], hnrs=[hnr])\n\n        assert [r.place_id for r in results] == res + [1000, 2000]\n\n    @pytest.mark.parametrize('cc,res', [('es', [2, 1000]), ('pt', [92, 2000])])\n    def test_lookup_with_country_restriction(self, apiobj, frontend, cc, res):\n        lookup = FieldLookup('name_vector', [1, 2], LookupAll)\n        ranking = FieldRanking('name_vector', 0.3, [RankedTokens(0.0, [10])])\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [ranking], hnrs=['22'],\n                             ccodes=[cc])\n\n        assert [r.place_id for r in results] == res\n\n    def test_lookup_exclude_housenumber_placeid(self, apiobj, frontend):\n        lookup = FieldLookup('name_vector', [1, 2], LookupAll)\n        ranking = FieldRanking('name_vector', 0.3, [RankedTokens(0.0, [10])])\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [ranking], hnrs=['22'],\n                             details=SearchDetails(excluded=[PlaceID(92)]))\n\n        assert [r.place_id for r in results] == [2, 1000, 2000]\n\n    def test_lookup_exclude_street_placeid(self, apiobj, frontend):\n        lookup = FieldLookup('name_vector', [1, 2], LookupAll)\n        ranking = FieldRanking('name_vector', 0.3, [RankedTokens(0.0, [10])])\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [ranking], hnrs=['22'],\n                             details=SearchDetails(excluded=[PlaceID(1000)]))\n\n        assert [r.place_id for r in results] == [2, 92, 2000]\n\n    def test_lookup_only_house_qualifier(self, apiobj, frontend):\n        lookup = FieldLookup('name_vector', [1, 2], LookupAll)\n        ranking = FieldRanking('name_vector', 0.3, [RankedTokens(0.0, [10])])\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [ranking], hnrs=['22'],\n                             quals=[('place', 'house')])\n\n        assert [r.place_id for r in results] == [2, 92]\n\n    def test_lookup_only_street_qualifier(self, apiobj, frontend):\n        lookup = FieldLookup('name_vector', [1, 2], LookupAll)\n        ranking = FieldRanking('name_vector', 0.3, [RankedTokens(0.0, [10])])\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [ranking], hnrs=['22'],\n                             quals=[('highway', 'residential')])\n\n        assert [r.place_id for r in results] == [1000, 2000]\n\n    @pytest.mark.parametrize('rank,found', [(26, True), (27, False), (30, False)])\n    def test_lookup_min_rank(self, apiobj, frontend, rank, found):\n        lookup = FieldLookup('name_vector', [1, 2], LookupAll)\n        ranking = FieldRanking('name_vector', 0.3, [RankedTokens(0.0, [10])])\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [ranking], hnrs=['22'],\n                             details=SearchDetails(min_rank=rank))\n\n        assert [r.place_id for r in results] == ([2, 92, 1000, 2000] if found else [2, 92])\n\n    @pytest.mark.parametrize('geom', [napi.GeometryFormat.GEOJSON,\n                                      napi.GeometryFormat.KML,\n                                      napi.GeometryFormat.SVG,\n                                      napi.GeometryFormat.TEXT])\n    def test_return_geometries(self, apiobj, frontend, geom):\n        lookup = FieldLookup('name_vector', [1, 2], LookupAll)\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [], hnrs=['20', '21', '22'],\n                             details=SearchDetails(geometry_output=geom))\n\n        assert results\n        assert all(geom.name.lower() in r.geometry for r in results)\n\n\ndef test_very_large_housenumber(apiobj, frontend):\n    apiobj.add_placex(place_id=93, class_='place', type='house',\n                      parent_place_id=2000,\n                      housenumber='2467463524544', country_code='pt')\n    apiobj.add_placex(place_id=2000, class_='highway', type='residential',\n                      rank_search=26, rank_address=26,\n                      country_code='pt')\n    apiobj.add_search_name(2000, names=[1, 2],\n                           search_rank=26, address_rank=26,\n                           country_code='pt')\n\n    lookup = FieldLookup('name_vector', [1, 2], LookupAll)\n\n    results = run_search(apiobj, frontend, 0.1, [lookup], [], hnrs=['2467463524544'],\n                         details=SearchDetails())\n\n    assert results\n    assert [r.place_id for r in results] == [93, 2000]\n\n\nclass TestInterpolations:\n\n    @pytest.fixture(autouse=True)\n    def fill_database(self, apiobj):\n        apiobj.add_placex(place_id=990, class_='highway', type='service',\n                          rank_search=27, rank_address=27,\n                          centroid=(10.0, 10.0),\n                          geometry='LINESTRING(9.995 10, 10.005 10)')\n        apiobj.add_search_name(990, names=[111],\n                               search_rank=27, address_rank=27)\n        apiobj.add_placex(place_id=991, class_='place', type='house',\n                          parent_place_id=990,\n                          rank_search=30, rank_address=30,\n                          housenumber='23',\n                          centroid=(10.0, 10.00002))\n        apiobj.add_osmline(place_id=992,\n                           parent_place_id=990,\n                           startnumber=21, endnumber=29, step=2,\n                           centroid=(10.0, 10.00001),\n                           geometry='LINESTRING(9.995 10.00001, 10.005 10.00001)')\n\n    @pytest.mark.parametrize('hnr,res', [('21', [992]), ('22', []), ('23', [991])])\n    def test_lookup_housenumber(self, apiobj, frontend, hnr, res):\n        lookup = FieldLookup('name_vector', [111], LookupAll)\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [], hnrs=[hnr])\n\n        assert [r.place_id for r in results] == res + [990]\n\n    @pytest.mark.parametrize('geom', [napi.GeometryFormat.GEOJSON,\n                                      napi.GeometryFormat.KML,\n                                      napi.GeometryFormat.SVG,\n                                      napi.GeometryFormat.TEXT])\n    def test_osmline_with_geometries(self, apiobj, frontend, geom):\n        lookup = FieldLookup('name_vector', [111], LookupAll)\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [], hnrs=['21'],\n                             details=SearchDetails(geometry_output=geom))\n\n        assert results[0].place_id == 992\n        assert geom.name.lower() in results[0].geometry\n\n\nclass TestTiger:\n\n    @pytest.fixture(autouse=True)\n    def fill_database(self, apiobj):\n        apiobj.add_placex(place_id=990, class_='highway', type='service',\n                          rank_search=27, rank_address=27,\n                          country_code='us',\n                          centroid=(10.0, 10.0),\n                          geometry='LINESTRING(9.995 10, 10.005 10)')\n        apiobj.add_search_name(990, names=[111], country_code='us',\n                               search_rank=27, address_rank=27)\n        apiobj.add_placex(place_id=991, class_='place', type='house',\n                          parent_place_id=990,\n                          rank_search=30, rank_address=30,\n                          housenumber='23',\n                          country_code='us',\n                          centroid=(10.0, 10.00002))\n        apiobj.add_tiger(place_id=992,\n                         parent_place_id=990,\n                         startnumber=21, endnumber=29, step=2,\n                         centroid=(10.0, 10.00001),\n                         geometry='LINESTRING(9.995 10.00001, 10.005 10.00001)')\n\n    @pytest.mark.parametrize('hnr,res', [('21', [992]), ('22', []), ('23', [991])])\n    def test_lookup_housenumber(self, apiobj, frontend, hnr, res):\n        lookup = FieldLookup('name_vector', [111], LookupAll)\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [], hnrs=[hnr])\n\n        assert [r.place_id for r in results] == res + [990]\n\n    @pytest.mark.parametrize('geom', [napi.GeometryFormat.GEOJSON,\n                                      napi.GeometryFormat.KML,\n                                      napi.GeometryFormat.SVG,\n                                      napi.GeometryFormat.TEXT])\n    def test_tiger_with_geometries(self, apiobj, frontend, geom):\n        lookup = FieldLookup('name_vector', [111], LookupAll)\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [], hnrs=['21'],\n                             details=SearchDetails(geometry_output=geom))\n\n        assert results[0].place_id == 992\n        assert geom.name.lower() in results[0].geometry\n"
  },
  {
    "path": "test/python/api/search/test_search_country.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for running the country searcher.\n\"\"\"\nimport pytest\n\nimport nominatim_api as napi\nfrom nominatim_api.types import SearchDetails, PlaceID\nfrom nominatim_api.search.db_searches import CountrySearch\nfrom nominatim_api.search.db_search_fields import WeightedStrings\n\n\ndef run_search(apiobj, frontend, global_penalty, ccodes,\n               country_penalties=None, details=SearchDetails()):\n    if country_penalties is None:\n        country_penalties = [0.0] * len(ccodes)\n\n    class MySearchData:\n        penalty = global_penalty\n        countries = WeightedStrings(ccodes, country_penalties)\n\n    search = CountrySearch(MySearchData())\n    api = frontend(apiobj, options=['search'])\n\n    async def run():\n        async with api._async_api.begin() as conn:\n            return await search.lookup(conn, details)\n\n    return api._loop.run_until_complete(run())\n\n\ndef test_find_from_placex(apiobj, frontend):\n    apiobj.add_placex(place_id=55, class_='boundary', type='administrative',\n                      rank_search=4, rank_address=4,\n                      name={'name': 'Lolaland'},\n                      country_code='yw',\n                      centroid=(10, 10),\n                      geometry='POLYGON((9.5 9.5, 9.5 10.5, 10.5 10.5, 10.5 9.5, 9.5 9.5))')\n\n    results = run_search(apiobj, frontend, 0.5, ['de', 'yw'], [0.0, 0.3])\n\n    assert len(results) == 1\n    assert results[0].place_id == 55\n    assert results[0].accuracy == 0.8\n\n\ndef test_find_from_fallback_countries(apiobj, frontend):\n    apiobj.add_country('ro', 'POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))')\n    apiobj.add_country_name('ro', {'name': 'România'})\n\n    results = run_search(apiobj, frontend, 0.0, ['ro'])\n\n    assert len(results) == 1\n    assert results[0].names == {'name': 'România'}\n\n\ndef test_find_none(apiobj, frontend):\n    assert len(run_search(apiobj, frontend, 0.0, ['xx'])) == 0\n\n\n@pytest.mark.parametrize('coord,numres', [((0.5, 1), 1), ((10, 10), 0)])\ndef test_find_near(apiobj, frontend, coord, numres):\n    apiobj.add_country('ro', 'POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))')\n    apiobj.add_country_name('ro', {'name': 'România'})\n\n    results = run_search(apiobj, frontend, 0.0, ['ro'],\n                         details=SearchDetails(near=napi.Point(*coord),\n                                               near_radius=0.1))\n\n    assert len(results) == numres\n\n\nclass TestCountryParameters:\n\n    @pytest.fixture(autouse=True)\n    def fill_database(self, apiobj):\n        apiobj.add_placex(place_id=55, class_='boundary', type='administrative',\n                          rank_search=4, rank_address=4,\n                          name={'name': 'Lolaland'},\n                          country_code='yw',\n                          centroid=(10, 10),\n                          geometry='POLYGON((9.5 9.5, 9.5 10.5, 10.5 10.5, 10.5 9.5, 9.5 9.5))')\n        apiobj.add_country('ro', 'POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))')\n        apiobj.add_country_name('ro', {'name': 'România'})\n\n    @pytest.mark.parametrize('geom', [napi.GeometryFormat.GEOJSON,\n                                      napi.GeometryFormat.KML,\n                                      napi.GeometryFormat.SVG,\n                                      napi.GeometryFormat.TEXT])\n    @pytest.mark.parametrize('cc', ['yw', 'ro'])\n    def test_return_geometries(self, apiobj, frontend, geom, cc):\n        results = run_search(apiobj, frontend, 0.5, [cc],\n                             details=SearchDetails(geometry_output=geom))\n\n        assert len(results) == 1\n        assert geom.name.lower() in results[0].geometry\n\n    @pytest.mark.parametrize('pid,rids', [(76, [55]), (55, [])])\n    def test_exclude_place_id(self, apiobj, frontend, pid, rids):\n        results = run_search(apiobj, frontend, 0.5, ['yw', 'ro'],\n                             details=SearchDetails(excluded=[PlaceID(pid)]))\n\n        assert [r.place_id for r in results] == rids\n\n    @pytest.mark.parametrize('viewbox,rids', [((9, 9, 11, 11), [55]),\n                                              ((-10, -10, -3, -3), [])])\n    def test_bounded_viewbox_in_placex(self, apiobj, frontend, viewbox, rids):\n        results = run_search(apiobj, frontend, 0.5, ['yw'],\n                             details=SearchDetails.from_kwargs({'viewbox': viewbox,\n                                                                'bounded_viewbox': True}))\n\n        assert [r.place_id for r in results] == rids\n\n    @pytest.mark.parametrize('viewbox,numres', [((0, 0, 1, 1), 1),\n                                                ((-10, -10, -3, -3), 0)])\n    def test_bounded_viewbox_in_fallback(self, apiobj, frontend, viewbox, numres):\n        results = run_search(apiobj, frontend, 0.5, ['ro'],\n                             details=SearchDetails.from_kwargs({'viewbox': viewbox,\n                                                                'bounded_viewbox': True}))\n\n        assert len(results) == numres\n"
  },
  {
    "path": "test/python/api/search/test_search_near.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for running the near searcher.\n\"\"\"\nimport pytest\n\nimport nominatim_api as napi\nfrom nominatim_api.types import SearchDetails, PlaceID\nfrom nominatim_api.search.db_searches import NearSearch, PlaceSearch\nfrom nominatim_api.search.db_search_fields import WeightedStrings, WeightedCategories, \\\n                                                  FieldLookup\nfrom nominatim_api.search.db_search_lookups import LookupAll\n\n\ndef run_search(apiobj, frontend, global_penalty, cat, cat_penalty=None, ccodes=[],\n               details=SearchDetails()):\n\n    class PlaceSearchData:\n        penalty = 0.0\n        postcodes = WeightedStrings([], [])\n        countries = WeightedStrings(ccodes, [0.0] * len(ccodes))\n        housenumbers = WeightedStrings([], [])\n        qualifiers = WeightedStrings([], [])\n        lookups = [FieldLookup('name_vector', [56], LookupAll)]\n        rankings = []\n\n    if ccodes is not None:\n        details.countries = ccodes\n\n    place_search = PlaceSearch(0.0, PlaceSearchData(), 2, False)\n\n    if cat_penalty is None:\n        cat_penalty = [0.0] * len(cat)\n\n    near_search = NearSearch(0.1, WeightedCategories(cat, cat_penalty), place_search)\n\n    api = frontend(apiobj, options=['search'])\n\n    async def run():\n        async with api._async_api.begin() as conn:\n            return await near_search.lookup(conn, details)\n\n    results = api._loop.run_until_complete(run())\n    results.sort(key=lambda r: r.accuracy)\n\n    return results\n\n\ndef test_no_results_inner_query(apiobj, frontend):\n    assert not run_search(apiobj, frontend, 0.4, [('this', 'that')])\n\n\ndef test_no_appropriate_results_inner_query(apiobj, frontend):\n    apiobj.add_placex(place_id=100, country_code='us',\n                      centroid=(5.6, 4.3),\n                      geometry='POLYGON((0.0 0.0, 10.0 0.0, 10.0 2.0, 0.0 2.0, 0.0 0.0))')\n    apiobj.add_search_name(100, names=[56], country_code='us',\n                           centroid=(5.6, 4.3))\n    apiobj.add_placex(place_id=22, class_='amenity', type='bank',\n                      centroid=(5.6001, 4.2994))\n\n    assert not run_search(apiobj, frontend, 0.4, [('amenity', 'bank')])\n\n\nclass TestNearSearch:\n\n    @pytest.fixture(autouse=True)\n    def fill_database(self, apiobj):\n        apiobj.add_placex(place_id=100, country_code='us',\n                          centroid=(5.6, 4.3))\n        apiobj.add_search_name(100, names=[56], country_code='us',\n                               centroid=(5.6, 4.3))\n        apiobj.add_placex(place_id=101, country_code='mx',\n                          centroid=(-10.3, 56.9))\n        apiobj.add_search_name(101, names=[56], country_code='mx',\n                               centroid=(-10.3, 56.9))\n\n    def test_near_in_placex(self, apiobj, frontend):\n        apiobj.add_placex(place_id=22, class_='amenity', type='bank',\n                          centroid=(5.6001, 4.2994))\n        apiobj.add_placex(place_id=23, class_='amenity', type='bench',\n                          centroid=(5.6001, 4.2994))\n\n        results = run_search(apiobj, frontend, 0.1, [('amenity', 'bank')])\n\n        assert [r.place_id for r in results] == [22]\n\n    def test_multiple_types_near_in_placex(self, apiobj, frontend):\n        apiobj.add_placex(place_id=22, class_='amenity', type='bank',\n                          importance=0.002,\n                          centroid=(5.6001, 4.2994))\n        apiobj.add_placex(place_id=23, class_='amenity', type='bench',\n                          importance=0.001,\n                          centroid=(5.6001, 4.2994))\n\n        results = run_search(apiobj, frontend, 0.1, [('amenity', 'bank'),\n                                                     ('amenity', 'bench')])\n\n        assert [r.place_id for r in results] == [22, 23]\n\n    def test_near_in_classtype(self, apiobj, frontend):\n        apiobj.add_placex(place_id=22, class_='amenity', type='bank',\n                          centroid=(5.6, 4.34))\n        apiobj.add_placex(place_id=23, class_='amenity', type='bench',\n                          centroid=(5.6, 4.34))\n        apiobj.add_class_type_table('amenity', 'bank')\n        apiobj.add_class_type_table('amenity', 'bench')\n\n        results = run_search(apiobj, frontend, 0.1, [('amenity', 'bank')])\n\n        assert [r.place_id for r in results] == [22]\n\n    @pytest.mark.parametrize('cc,rid', [('us', 22), ('mx', 23)])\n    def test_restrict_by_country(self, apiobj, frontend, cc, rid):\n        apiobj.add_placex(place_id=22, class_='amenity', type='bank',\n                          centroid=(5.6001, 4.2994),\n                          country_code='us')\n        apiobj.add_placex(place_id=122, class_='amenity', type='bank',\n                          centroid=(5.6001, 4.2994),\n                          country_code='mx')\n        apiobj.add_placex(place_id=23, class_='amenity', type='bank',\n                          centroid=(-10.3001, 56.9),\n                          country_code='mx')\n        apiobj.add_placex(place_id=123, class_='amenity', type='bank',\n                          centroid=(-10.3001, 56.9),\n                          country_code='us')\n\n        results = run_search(apiobj, frontend, 0.1, [('amenity', 'bank')], ccodes=[cc, 'fr'])\n\n        assert [r.place_id for r in results] == [rid]\n\n    @pytest.mark.parametrize('excluded,rid', [(22, 122), (122, 22)])\n    def test_exclude_place_by_id(self, apiobj, frontend, excluded, rid):\n        apiobj.add_placex(place_id=22, class_='amenity', type='bank',\n                          centroid=(5.6001, 4.2994),\n                          country_code='us')\n        apiobj.add_placex(place_id=122, class_='amenity', type='bank',\n                          centroid=(5.6001, 4.2994),\n                          country_code='us')\n\n        results = run_search(apiobj, frontend, 0.1, [('amenity', 'bank')],\n                             details=SearchDetails(excluded=[PlaceID(excluded)]))\n\n        assert [r.place_id for r in results] == [rid]\n\n    @pytest.mark.parametrize('layer,rids', [(napi.DataLayer.POI, [22]),\n                                            (napi.DataLayer.MANMADE, [])])\n    def test_with_layer(self, apiobj, frontend, layer, rids):\n        apiobj.add_placex(place_id=22, class_='amenity', type='bank',\n                          centroid=(5.6001, 4.2994),\n                          country_code='us')\n\n        results = run_search(apiobj, frontend, 0.1, [('amenity', 'bank')],\n                             details=SearchDetails(layers=layer))\n\n        assert [r.place_id for r in results] == rids\n"
  },
  {
    "path": "test/python/api/search/test_search_places.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for running the named place searcher.\n\"\"\"\nimport json\n\nimport pytest\n\nimport nominatim_api as napi\nfrom nominatim_api.types import SearchDetails, PlaceID\nfrom nominatim_api.search.db_searches import PlaceSearch\nfrom nominatim_api.search.db_search_fields import WeightedStrings, WeightedCategories, \\\n                                                  FieldLookup, FieldRanking, RankedTokens\nfrom nominatim_api.search.db_search_lookups import LookupAll, LookupAny, Restrict\n\nAPIOPTIONS = ['search']\n\n\ndef run_search(apiobj, frontend, global_penalty, lookup, ranking, count=2,\n               pcs=[], ccodes=[], quals=[], has_address=False,\n               details=SearchDetails()):\n    class MySearchData:\n        penalty = global_penalty\n        postcodes = WeightedStrings(pcs, [0.0] * len(pcs))\n        countries = WeightedStrings(ccodes, [0.0] * len(ccodes))\n        qualifiers = WeightedCategories(quals, [0.0] * len(quals))\n        lookups = lookup\n        rankings = ranking\n        housenumbers = None\n\n    search = PlaceSearch(0.0, MySearchData(), count, has_address)\n\n    if frontend is None:\n        api = apiobj\n    else:\n        api = frontend(apiobj, options=APIOPTIONS)\n\n    async def run():\n        async with api._async_api.begin() as conn:\n            return await search.lookup(conn, details)\n\n    results = api._loop.run_until_complete(run())\n    results.sort(key=lambda r: r.accuracy)\n\n    return results\n\n\nclass TestNameOnlySearches:\n\n    @pytest.fixture(autouse=True)\n    def fill_database(self, apiobj):\n        apiobj.add_placex(place_id=100, country_code='us',\n                          centroid=(5.6, 4.3))\n        apiobj.add_search_name(100, names=[1, 2, 10, 11], country_code='us',\n                               centroid=(5.6, 4.3))\n        apiobj.add_placex(place_id=101, country_code='mx',\n                          centroid=(-10.3, 56.9))\n        apiobj.add_search_name(101, names=[1, 2, 20, 21], country_code='mx',\n                               centroid=(-10.3, 56.9))\n\n    @pytest.mark.parametrize('lookup_type', [LookupAll, Restrict])\n    @pytest.mark.parametrize('rank,res', [([10], [100, 101]),\n                                          ([20], [101, 100])])\n    def test_lookup_all_match(self, apiobj, frontend, lookup_type, rank, res):\n        lookup = FieldLookup('name_vector', [1, 2], lookup_type)\n        ranking = FieldRanking('name_vector', 0.4, [RankedTokens(0.0, rank)])\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [ranking])\n\n        assert [r.place_id for r in results] == res\n\n    @pytest.mark.parametrize('lookup_type', [LookupAll, Restrict])\n    def test_lookup_all_partial_match(self, apiobj, frontend, lookup_type):\n        lookup = FieldLookup('name_vector', [1, 20], lookup_type)\n        ranking = FieldRanking('name_vector', 0.4, [RankedTokens(0.0, [21])])\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [ranking])\n\n        assert len(results) == 1\n        assert results[0].place_id == 101\n\n    @pytest.mark.parametrize('rank,res', [([10], [100, 101]),\n                                          ([20], [101, 100])])\n    def test_lookup_any_match(self, apiobj, frontend, rank, res):\n        lookup = FieldLookup('name_vector', [11, 21], LookupAny)\n        ranking = FieldRanking('name_vector', 0.4, [RankedTokens(0.0, rank)])\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [ranking])\n\n        assert [r.place_id for r in results] == res\n\n    def test_lookup_any_partial_match(self, apiobj, frontend):\n        lookup = FieldLookup('name_vector', [20], LookupAll)\n        ranking = FieldRanking('name_vector', 0.4, [RankedTokens(0.0, [21])])\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [ranking])\n\n        assert len(results) == 1\n        assert results[0].place_id == 101\n\n    @pytest.mark.parametrize('cc,res', [('us', 100), ('mx', 101)])\n    def test_lookup_restrict_country(self, apiobj, frontend, cc, res):\n        lookup = FieldLookup('name_vector', [1, 2], LookupAll)\n        ranking = FieldRanking('name_vector', 0.4, [RankedTokens(0.0, [10])])\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [ranking], ccodes=[cc])\n\n        assert [r.place_id for r in results] == [res]\n\n    def test_lookup_restrict_placeid(self, apiobj, frontend):\n        lookup = FieldLookup('name_vector', [1, 2], LookupAll)\n        ranking = FieldRanking('name_vector', 0.4, [RankedTokens(0.0, [10])])\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [ranking],\n                             details=SearchDetails(excluded=[PlaceID(101)]))\n\n        assert [r.place_id for r in results] == [100]\n\n    @pytest.mark.parametrize('geom', [napi.GeometryFormat.GEOJSON,\n                                      napi.GeometryFormat.KML,\n                                      napi.GeometryFormat.SVG,\n                                      napi.GeometryFormat.TEXT])\n    def test_return_geometries(self, apiobj, frontend, geom):\n        lookup = FieldLookup('name_vector', [20], LookupAll)\n        ranking = FieldRanking('name_vector', 0.4, [RankedTokens(0.0, [21])])\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [ranking],\n                             details=SearchDetails(geometry_output=geom))\n\n        assert geom.name.lower() in results[0].geometry\n\n    @pytest.mark.parametrize('factor,npoints', [(0.0, 3), (1.0, 2)])\n    def test_return_simplified_geometry(self, apiobj, frontend, factor, npoints):\n        apiobj.add_placex(place_id=333, country_code='us',\n                          centroid=(9.0, 9.0),\n                          geometry='LINESTRING(8.9 9.0, 9.0 9.0, 9.1 9.0)')\n        apiobj.add_search_name(333, names=[55], country_code='us',\n                               centroid=(5.6, 4.3))\n\n        lookup = FieldLookup('name_vector', [55], LookupAll)\n        ranking = FieldRanking('name_vector', 0.4, [RankedTokens(0.0, [21])])\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [ranking],\n                             details=SearchDetails(geometry_output=napi.GeometryFormat.GEOJSON,\n                                                   geometry_simplification=factor))\n\n        assert len(results) == 1\n        result = results[0]\n        geom = json.loads(result.geometry['geojson'])\n\n        assert result.place_id == 333\n        assert len(geom['coordinates']) == npoints\n\n    @pytest.mark.parametrize('viewbox,rids', [('5.0,4.0,6.0,5.0', [100]),\n                                              ('5.7,4.0,6.0,5.0', [100, 101]),\n                                              ('10.0,10.0,11.0,11.0', [101, 100])])\n    @pytest.mark.parametrize('wcount', [2, 50000])\n    def test_prefer_viewbox(self, apiobj, frontend, viewbox, rids, wcount):\n        lookup = FieldLookup('name_vector', [1, 2], LookupAll)\n        ranking = FieldRanking('name_vector', 0.2, [RankedTokens(0.0, [21])])\n\n        api = frontend(apiobj, options=APIOPTIONS)\n        results = run_search(api, None, 0.1, [lookup], [ranking])\n        assert [r.place_id for r in results] == [101, 100]\n\n        results = run_search(api, None, 0.1, [lookup], [ranking], count=wcount,\n                             details=SearchDetails.from_kwargs({'viewbox': viewbox}))\n        assert [r.place_id for r in results] == rids\n\n    @pytest.mark.parametrize('viewbox', ['5.0,4.0,6.0,5.0', '5.55,4.27,5.62,4.31'])\n    def test_force_viewbox(self, apiobj, frontend, viewbox):\n        lookup = FieldLookup('name_vector', [1, 2], LookupAll)\n\n        details = SearchDetails.from_kwargs({'viewbox': viewbox,\n                                             'bounded_viewbox': True})\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [], details=details)\n        assert [r.place_id for r in results] == [100]\n\n    def test_prefer_near(self, apiobj, frontend):\n        lookup = FieldLookup('name_vector', [1, 2], LookupAll)\n        ranking = FieldRanking('name_vector', 0.4, [RankedTokens(0.0, [21])])\n\n        api = frontend(apiobj, options=APIOPTIONS)\n        results = run_search(api, None, 0.1, [lookup], [ranking])\n        assert [r.place_id for r in results] == [101, 100]\n\n        results = run_search(api, None, 0.1, [lookup], [ranking],\n                             details=SearchDetails.from_kwargs({'near': '5.6,4.3'}))\n        results.sort(key=lambda r: -r.importance)\n        assert [r.place_id for r in results] == [100, 101]\n\n    @pytest.mark.parametrize('radius', [0.09, 0.11])\n    def test_force_near(self, apiobj, frontend, radius):\n        lookup = FieldLookup('name_vector', [1, 2], LookupAll)\n\n        details = SearchDetails.from_kwargs({'near': '5.6,4.3',\n                                             'near_radius': radius})\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [], details=details)\n\n        assert [r.place_id for r in results] == [100]\n\n\n@pytest.mark.parametrize('wcount,rids', [(2, [990, 991]), (30000, [990])])\ndef test_name_and_postcode(apiobj, frontend, wcount, rids):\n    apiobj.add_placex(place_id=990, class_='highway', type='service',\n                      rank_search=27, rank_address=27,\n                      postcode='11225',\n                      centroid=(10.0, 10.0),\n                      geometry='LINESTRING(9.995 10, 10.005 10)')\n    apiobj.add_search_name(990, names=[111], centroid=(10.0, 10.0),\n                           search_rank=27, address_rank=27)\n    apiobj.add_placex(place_id=991, class_='highway', type='service',\n                      rank_search=27, rank_address=27,\n                      postcode='11221',\n                      centroid=(10.3, 10.3),\n                      geometry='LINESTRING(9.995 10.3, 10.005 10.3)')\n    apiobj.add_search_name(991, names=[111], centroid=(10.3, 10.3),\n                           search_rank=27, address_rank=27)\n    apiobj.add_postcode(place_id=100, country_code='ch', postcode='11225',\n                        geometry='POINT(10 10)')\n\n    lookup = FieldLookup('name_vector', [111], LookupAll)\n\n    results = run_search(apiobj, frontend, 0.1, [lookup], [], pcs=['11225'], count=wcount,\n                         details=SearchDetails())\n\n    assert results\n    assert [r.place_id for r in results] == rids\n\n\nclass TestLayersRank30:\n\n    @pytest.fixture(autouse=True)\n    def fill_database(self, apiobj):\n        apiobj.add_placex(place_id=223, class_='place', type='house',\n                          housenumber='1',\n                          rank_address=30,\n                          rank_search=30)\n        apiobj.add_search_name(223, names=[34],\n                               importance=0.0009,\n                               address_rank=30, search_rank=30)\n        apiobj.add_placex(place_id=224, class_='amenity', type='toilet',\n                          rank_address=30,\n                          rank_search=30)\n        apiobj.add_search_name(224, names=[34],\n                               importance=0.0008,\n                               address_rank=30, search_rank=30)\n        apiobj.add_placex(place_id=225, class_='man_made', type='tower',\n                          rank_address=0,\n                          rank_search=30)\n        apiobj.add_search_name(225, names=[34],\n                               importance=0.0007,\n                               address_rank=0, search_rank=30)\n        apiobj.add_placex(place_id=226, class_='railway', type='station',\n                          rank_address=0,\n                          rank_search=30)\n        apiobj.add_search_name(226, names=[34],\n                               importance=0.0006,\n                               address_rank=0, search_rank=30)\n        apiobj.add_placex(place_id=227, class_='natural', type='cave',\n                          rank_address=0,\n                          rank_search=30)\n        apiobj.add_search_name(227, names=[34],\n                               importance=0.0005,\n                               address_rank=0, search_rank=30)\n\n    @pytest.mark.parametrize('layer,res',\n                             [(napi.DataLayer.ADDRESS, [223]),\n                              (napi.DataLayer.POI, [224]),\n                              (napi.DataLayer.ADDRESS | napi.DataLayer.POI, [223, 224]),\n                              (napi.DataLayer.MANMADE, [225]),\n                              (napi.DataLayer.RAILWAY, [226]),\n                              (napi.DataLayer.NATURAL, [227]),\n                              (napi.DataLayer.MANMADE | napi.DataLayer.NATURAL, [225, 227]),\n                              (napi.DataLayer.MANMADE | napi.DataLayer.RAILWAY, [225, 226])])\n    def test_layers_rank30(self, apiobj, frontend, layer, res):\n        lookup = FieldLookup('name_vector', [34], LookupAny)\n\n        results = run_search(apiobj, frontend, 0.1, [lookup], [],\n                             details=SearchDetails(layers=layer))\n\n        assert [r.place_id for r in results] == res\n"
  },
  {
    "path": "test/python/api/search/test_search_poi.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for running the POI searcher.\n\"\"\"\nimport pytest\n\nfrom nominatim_api.types import SearchDetails\nfrom nominatim_api.search.db_searches import PoiSearch\nfrom nominatim_api.search.db_search_fields import WeightedStrings, WeightedCategories\n\n\ndef run_search(apiobj, frontend, global_penalty, poitypes, poi_penalties=None,\n               ccodes=[], details=SearchDetails()):\n    if poi_penalties is None:\n        poi_penalties = [0.0] * len(poitypes)\n\n    class MySearchData:\n        penalty = global_penalty\n        qualifiers = WeightedCategories(poitypes, poi_penalties)\n        countries = WeightedStrings(ccodes, [0.0] * len(ccodes))\n\n    search = PoiSearch(MySearchData())\n\n    api = frontend(apiobj, options=['search'])\n\n    async def run():\n        async with api._async_api.begin() as conn:\n            return await search.lookup(conn, details)\n\n    return api._loop.run_until_complete(run())\n\n\n@pytest.mark.parametrize('coord,pid', [('34.3, 56.100021', 2),\n                                       ('5.0, 4.59933', 1)])\ndef test_simple_near_search_in_placex(apiobj, frontend, coord, pid):\n    apiobj.add_placex(place_id=1, class_='highway', type='bus_stop',\n                      centroid=(5.0, 4.6))\n    apiobj.add_placex(place_id=2, class_='highway', type='bus_stop',\n                      centroid=(34.3, 56.1))\n\n    details = SearchDetails.from_kwargs({'near': coord, 'near_radius': 0.001})\n\n    results = run_search(apiobj, frontend, 0.1, [('highway', 'bus_stop')], [0.5], details=details)\n\n    assert [r.place_id for r in results] == [pid]\n\n\n@pytest.mark.parametrize('coord,pid', [('34.3, 56.100021', 2),\n                                       ('34.3, 56.4', 2),\n                                       ('5.0, 4.59933', 1)])\ndef test_simple_near_search_in_classtype(apiobj, frontend, coord, pid):\n    apiobj.add_placex(place_id=1, class_='highway', type='bus_stop',\n                      centroid=(5.0, 4.6))\n    apiobj.add_placex(place_id=2, class_='highway', type='bus_stop',\n                      centroid=(34.3, 56.1))\n    apiobj.add_class_type_table('highway', 'bus_stop')\n\n    details = SearchDetails.from_kwargs({'near': coord, 'near_radius': 0.5})\n\n    results = run_search(apiobj, frontend, 0.1, [('highway', 'bus_stop')], [0.5], details=details)\n\n    assert [r.place_id for r in results] == [pid]\n\n\nclass TestPoiSearchWithRestrictions:\n\n    @pytest.fixture(autouse=True, params=[\"placex\", \"classtype\"])\n    def fill_database(self, apiobj, request):\n        apiobj.add_placex(place_id=1, class_='highway', type='bus_stop',\n                          country_code='au',\n                          centroid=(34.3, 56.10003))\n        apiobj.add_placex(place_id=2, class_='highway', type='bus_stop',\n                          country_code='nz',\n                          centroid=(34.3, 56.1))\n        if request.param == 'classtype':\n            apiobj.add_class_type_table('highway', 'bus_stop')\n            self.args = {'near': '34.3, 56.4', 'near_radius': 0.5}\n        else:\n            self.args = {'near': '34.3, 56.100021', 'near_radius': 0.001}\n\n    def test_unrestricted(self, apiobj, frontend):\n        results = run_search(apiobj, frontend, 0.1, [('highway', 'bus_stop')], [0.5],\n                             details=SearchDetails.from_kwargs(self.args))\n\n        assert [r.place_id for r in results] == [1, 2]\n\n    def test_restict_country(self, apiobj, frontend):\n        results = run_search(apiobj, frontend, 0.1, [('highway', 'bus_stop')], [0.5],\n                             ccodes=['de', 'nz'],\n                             details=SearchDetails.from_kwargs(self.args))\n\n        assert [r.place_id for r in results] == [2]\n\n    def test_restrict_by_viewbox(self, apiobj, frontend):\n        args = {'bounded_viewbox': True, 'viewbox': '34.299,56.0,34.3001,56.10001'}\n        args.update(self.args)\n        results = run_search(apiobj, frontend, 0.1, [('highway', 'bus_stop')], [0.5],\n                             ccodes=['de', 'nz'],\n                             details=SearchDetails.from_kwargs(args))\n\n        assert [r.place_id for r in results] == [2]\n"
  },
  {
    "path": "test/python/api/search/test_search_postcode.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for running the postcode searcher.\n\"\"\"\nimport pytest\n\nimport nominatim_api as napi\nfrom nominatim_api.types import SearchDetails, PlaceID\nfrom nominatim_api.search.db_searches import PostcodeSearch\nfrom nominatim_api.search.db_search_fields import WeightedStrings, FieldLookup, \\\n                                                  FieldRanking, RankedTokens\n\n\ndef poly_around(x, y, diff=0.01):\n    return f\"POLYGON(({x - diff} {y - diff}, {x + diff} {y - diff},\"\\\n           f\"         {x + diff} {y + diff}, {x - diff} {y + diff}, {x - diff} {y - diff}))\"\n\n\ndef run_search(apiobj, frontend, global_penalty, pcs, pc_penalties=None,\n               ccodes=[], lookup=[], ranking=[], details=SearchDetails()):\n    if pc_penalties is None:\n        pc_penalties = [0.0] * len(pcs)\n\n    class MySearchData:\n        penalty = global_penalty\n        postcodes = WeightedStrings(pcs, pc_penalties)\n        countries = WeightedStrings(ccodes, [0.0] * len(ccodes))\n        lookups = lookup\n        rankings = ranking\n\n    search = PostcodeSearch(0.0, MySearchData())\n\n    api = frontend(apiobj, options=['search'])\n\n    async def run():\n        async with api._async_api.begin() as conn:\n            return await search.lookup(conn, details)\n\n    return api._loop.run_until_complete(run())\n\n\ndef test_postcode_only_search(apiobj, frontend):\n    apiobj.add_postcode(place_id=100, country_code='ch', postcode='12345')\n    apiobj.add_postcode(place_id=101, country_code='pl', postcode='12 345')\n\n    results = run_search(apiobj, frontend, 0.3, ['12345', '12 345'], [0.0, 0.1])\n\n    assert len(results) == 2\n    assert [r.place_id for r in results] == [100, 101]\n\n\ndef test_postcode_with_country(apiobj, frontend):\n    apiobj.add_postcode(place_id=100, country_code='ch', postcode='12345')\n    apiobj.add_postcode(place_id=101, country_code='pl', postcode='12 345')\n\n    results = run_search(apiobj, frontend, 0.3, ['12345', '12 345'], [0.0, 0.1],\n                         ccodes=['de', 'pl'])\n\n    assert len(results) == 1\n    assert results[0].place_id == 101\n    assert results[0].osm_object is None\n\n\ndef test_postcode_area(apiobj, frontend):\n    apiobj.add_postcode(place_id=200, country_code='ch', postcode='12345',\n                        osm_id=34,\n                        centroid='POINT(0.5 0.5)', geometry=poly_around(0.5, 0.5))\n\n    results = run_search(apiobj, frontend, 0.3, ['12345'], [0.0])\n\n    assert len(results) == 1\n    assert results[0].place_id == 200\n    assert results[0].osm_object == ('R', 34)\n\n\nclass TestPostcodeSearchWithAddress:\n\n    @pytest.fixture(autouse=True)\n    def fill_database(self, apiobj):\n        apiobj.add_postcode(place_id=100, country_code='ch',\n                            parent_place_id=1000, postcode='12345',\n                            centroid='POINT(17 5)', geometry=poly_around(17, 5))\n        apiobj.add_postcode(place_id=101, country_code='pl',\n                            parent_place_id=2000, postcode='12345',\n                            centroid='POINT(-45 7)', geometry=poly_around(-45, 7))\n        apiobj.add_placex(place_id=1000, class_='place', type='village',\n                          rank_search=22, rank_address=22,\n                          country_code='ch')\n        apiobj.add_search_name(1000, names=[1, 2, 10, 11],\n                               search_rank=22, address_rank=22,\n                               country_code='ch')\n        apiobj.add_placex(place_id=2000, class_='place', type='village',\n                          rank_search=22, rank_address=22,\n                          country_code='pl')\n        apiobj.add_search_name(2000, names=[1, 2, 20, 21],\n                               search_rank=22, address_rank=22,\n                               country_code='pl')\n\n    def test_lookup_both(self, apiobj, frontend):\n        lookup = FieldLookup('name_vector', [1, 2], 'restrict')\n        ranking = FieldRanking('name_vector', 0.3, [RankedTokens(0.0, [10])])\n\n        results = run_search(apiobj, frontend, 0.1, ['12345'], lookup=[lookup], ranking=[ranking])\n\n        assert [r.place_id for r in results] == [100, 101]\n\n    def test_restrict_by_name(self, apiobj, frontend):\n        lookup = FieldLookup('name_vector', [10], 'restrict')\n\n        results = run_search(apiobj, frontend, 0.1, ['12345'], lookup=[lookup])\n\n        assert [r.place_id for r in results] == [100]\n\n    @pytest.mark.parametrize('coord,place_id', [((16.5, 5), 100),\n                                                ((-45.1, 7.004), 101)])\n    def test_lookup_near(self, apiobj, frontend, coord, place_id):\n        lookup = FieldLookup('name_vector', [1, 2], 'restrict')\n        ranking = FieldRanking('name_vector', 0.3, [RankedTokens(0.0, [10])])\n\n        results = run_search(apiobj, frontend, 0.1, ['12345'],\n                             lookup=[lookup], ranking=[ranking],\n                             details=SearchDetails(near=napi.Point(*coord),\n                                                   near_radius=0.6))\n\n        assert [r.place_id for r in results] == [place_id]\n\n    @pytest.mark.parametrize('geom', [napi.GeometryFormat.GEOJSON,\n                                      napi.GeometryFormat.KML,\n                                      napi.GeometryFormat.SVG,\n                                      napi.GeometryFormat.TEXT])\n    def test_return_geometries(self, apiobj, frontend, geom):\n        results = run_search(apiobj, frontend, 0.1, ['12345'],\n                             details=SearchDetails(geometry_output=geom))\n\n        assert results\n        assert all(geom.name.lower() in r.geometry for r in results)\n\n    @pytest.mark.parametrize('viewbox, rids', [('-46,6,-44,8', [101, 100]),\n                                               ('16,4,18,6', [100, 101])])\n    def test_prefer_viewbox(self, apiobj, frontend, viewbox, rids):\n        results = run_search(apiobj, frontend, 0.1, ['12345'],\n                             details=SearchDetails.from_kwargs({'viewbox': viewbox}))\n\n        assert [r.place_id for r in results] == rids\n\n    @pytest.mark.parametrize('viewbox, rid', [('-46,6,-44,8', 101),\n                                              ('16,4,18,6', 100)])\n    def test_restrict_to_viewbox(self, apiobj, frontend, viewbox, rid):\n        results = run_search(apiobj, frontend, 0.1, ['12345'],\n                             details=SearchDetails.from_kwargs({'viewbox': viewbox,\n                                                                'bounded_viewbox': True}))\n\n        assert [r.place_id for r in results] == [rid]\n\n    @pytest.mark.parametrize('coord,rids', [((17.05, 5), [100, 101]),\n                                            ((-45, 7.1), [101, 100])])\n    def test_prefer_near(self, apiobj, frontend, coord, rids):\n        results = run_search(apiobj, frontend, 0.1, ['12345'],\n                             details=SearchDetails(near=napi.Point(*coord)))\n\n        assert [r.place_id for r in results] == rids\n\n    @pytest.mark.parametrize('pid,rid', [(100, 101), (101, 100)])\n    def test_exclude(self, apiobj, frontend, pid, rid):\n        results = run_search(apiobj, frontend, 0.1, ['12345'],\n                             details=SearchDetails(excluded=[PlaceID(pid)]))\n\n        assert [r.place_id for r in results] == [rid]\n"
  },
  {
    "path": "test/python/api/search/test_token_assignment.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTest for creation of token assignments from tokenized queries.\n\"\"\"\nimport pytest\n\nfrom nominatim_api.search.query import QueryStruct, Phrase, TokenRange, Token\nimport nominatim_api.search.query as qmod\nfrom nominatim_api.search.token_assignment import (yield_token_assignments,\n                                                   TokenAssignment)\nfrom nominatim_api.search.icu_tokenizer import PENALTY_BREAK\n\n\nclass MyToken(Token):\n    def get_category(self):\n        return 'this', 'that'\n\n    def get_country(self):\n        return 'cc'\n\n\ndef make_query(*args):\n    q = QueryStruct([Phrase(args[0][1], '')])\n    dummy = MyToken(penalty=3.0, token=45, count=1, addr_count=1,\n                    lookup_word='foo')\n\n    for btype, ptype, _ in args[1:]:\n        q.add_node(btype, ptype)\n        q.nodes[-1].penalty = PENALTY_BREAK[btype]\n    q.add_node(qmod.BREAK_END, qmod.PHRASE_ANY)\n\n    for start, t in enumerate(args):\n        for end, ttype in t[2]:\n            q.add_token(TokenRange(start, end), ttype, dummy)\n\n    return q\n\n\ndef check_assignments(actual, *expected):\n    todo = list(expected)\n    for assignment in actual:\n        assert assignment in todo, f\"Unexpected assignment: {assignment}\"\n        todo.remove(assignment)\n\n    assert not todo, f\"Missing assignments: {expected}\"\n\n\ndef test_query_with_missing_tokens():\n    q = QueryStruct([Phrase(qmod.PHRASE_ANY, '')])\n    q.add_node(qmod.BREAK_END, qmod.PHRASE_ANY)\n\n    assert list(yield_token_assignments(q)) == []\n\n\ndef test_one_word_query():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY,\n                    [(1, qmod.TOKEN_PARTIAL),\n                     (1, qmod.TOKEN_WORD),\n                     (1, qmod.TOKEN_HOUSENUMBER)]))\n\n    res = list(yield_token_assignments(q))\n    assert res == [TokenAssignment(name=TokenRange(0, 1))]\n\n\ndef test_single_postcode():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY,\n                    [(1, qmod.TOKEN_POSTCODE)]))\n\n    res = list(yield_token_assignments(q))\n    assert res == [TokenAssignment(postcode=TokenRange(0, 1))]\n\n\ndef test_single_country_name():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY,\n                    [(1, qmod.TOKEN_COUNTRY)]))\n\n    res = list(yield_token_assignments(q))\n    assert res == [TokenAssignment(country=TokenRange(0, 1))]\n\n\ndef test_single_word_poi_search():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY,\n                    [(1, qmod.TOKEN_NEAR_ITEM),\n                     (1, qmod.TOKEN_QUALIFIER)]))\n\n    res = list(yield_token_assignments(q))\n    assert res == [TokenAssignment(near_item=TokenRange(0, 1))]\n\n\n@pytest.mark.parametrize('btype', [qmod.BREAK_WORD, qmod.BREAK_PART, qmod.BREAK_TOKEN])\ndef test_multiple_simple_words(btype):\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_PARTIAL)]),\n                   (btype, qmod.PHRASE_ANY, [(2, qmod.TOKEN_PARTIAL)]),\n                   (btype, qmod.PHRASE_ANY, [(3, qmod.TOKEN_PARTIAL)]))\n\n    penalty = PENALTY_BREAK[btype]\n\n    check_assignments(yield_token_assignments(q),\n                      TokenAssignment(name=TokenRange(0, 3)),\n                      TokenAssignment(penalty=penalty, name=TokenRange(0, 2),\n                                      address=[TokenRange(2, 3)]),\n                      TokenAssignment(penalty=penalty, name=TokenRange(0, 1),\n                                      address=[TokenRange(1, 3)]),\n                      TokenAssignment(penalty=penalty, name=TokenRange(1, 3),\n                                      address=[TokenRange(0, 1)]),\n                      TokenAssignment(penalty=penalty, name=TokenRange(2, 3),\n                                      address=[TokenRange(0, 2)]))\n\n\ndef test_multiple_words_respect_phrase_break():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_PHRASE, qmod.PHRASE_ANY, [(2, qmod.TOKEN_PARTIAL)]))\n\n    check_assignments(yield_token_assignments(q),\n                      TokenAssignment(name=TokenRange(0, 1),\n                                      address=[TokenRange(1, 2)]),\n                      TokenAssignment(name=TokenRange(1, 2),\n                                      address=[TokenRange(0, 1)]))\n\n\ndef test_housenumber_and_street():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_HOUSENUMBER)]),\n                   (qmod.BREAK_PHRASE, qmod.PHRASE_ANY, [(2, qmod.TOKEN_PARTIAL)]))\n\n    check_assignments(yield_token_assignments(q),\n                      TokenAssignment(name=TokenRange(1, 2),\n                                      housenumber=TokenRange(0, 1)),\n                      TokenAssignment(penalty=0.1, address=[TokenRange(1, 2)],\n                                      housenumber=TokenRange(0, 1)))\n\n\ndef test_housenumber_and_street_backwards():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_PHRASE, qmod.PHRASE_ANY, [(2, qmod.TOKEN_HOUSENUMBER)]))\n\n    check_assignments(yield_token_assignments(q),\n                      TokenAssignment(name=TokenRange(0, 1),\n                                      housenumber=TokenRange(1, 2)),\n                      TokenAssignment(penalty=0.1, address=[TokenRange(0, 1)],\n                                      housenumber=TokenRange(1, 2)))\n\n\ndef test_housenumber_and_postcode():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(2, qmod.TOKEN_HOUSENUMBER)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(3, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(4, qmod.TOKEN_POSTCODE)]))\n\n    check_assignments(yield_token_assignments(q),\n                      TokenAssignment(penalty=pytest.approx(0.3),\n                                      name=TokenRange(0, 1),\n                                      housenumber=TokenRange(1, 2),\n                                      address=[TokenRange(2, 3)],\n                                      postcode=TokenRange(3, 4)),\n                      TokenAssignment(penalty=pytest.approx(0.4),\n                                      housenumber=TokenRange(1, 2),\n                                      address=[TokenRange(0, 1), TokenRange(2, 3)],\n                                      postcode=TokenRange(3, 4)))\n\n\ndef test_postcode_and_housenumber():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(2, qmod.TOKEN_POSTCODE)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(3, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(4, qmod.TOKEN_HOUSENUMBER)]))\n\n    check_assignments(yield_token_assignments(q),\n                      TokenAssignment(penalty=pytest.approx(0.3),\n                                      name=TokenRange(2, 3),\n                                      housenumber=TokenRange(3, 4),\n                                      address=[TokenRange(0, 1)],\n                                      postcode=TokenRange(1, 2)),\n                      TokenAssignment(penalty=pytest.approx(0.4),\n                                      housenumber=TokenRange(3, 4),\n                                      address=[TokenRange(0, 1), TokenRange(2, 3)],\n                                      postcode=TokenRange(1, 2)))\n\n\ndef test_country_housenumber_postcode():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_COUNTRY)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(2, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(3, qmod.TOKEN_HOUSENUMBER)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(4, qmod.TOKEN_POSTCODE)]))\n\n    check_assignments(yield_token_assignments(q))\n\n\n@pytest.mark.parametrize('ttype', [qmod.TOKEN_POSTCODE, qmod.TOKEN_COUNTRY,\n                                   qmod.TOKEN_NEAR_ITEM, qmod.TOKEN_QUALIFIER])\ndef test_housenumber_with_only_special_terms(ttype):\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_HOUSENUMBER)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(2, ttype)]))\n\n    check_assignments(yield_token_assignments(q))\n\n\n@pytest.mark.parametrize('ttype', [qmod.TOKEN_POSTCODE, qmod.TOKEN_HOUSENUMBER, qmod.TOKEN_COUNTRY])\ndef test_multiple_special_tokens(ttype):\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, ttype)]),\n                   (qmod.BREAK_PHRASE, qmod.PHRASE_ANY, [(2, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_PHRASE, qmod.PHRASE_ANY, [(3, ttype)]))\n\n    check_assignments(yield_token_assignments(q))\n\n\ndef test_housenumber_many_phrases():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_PHRASE, qmod.PHRASE_ANY, [(2, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_PHRASE, qmod.PHRASE_ANY, [(3, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_PHRASE, qmod.PHRASE_ANY, [(4, qmod.TOKEN_HOUSENUMBER)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(5, qmod.TOKEN_PARTIAL)]))\n\n    check_assignments(yield_token_assignments(q),\n                      TokenAssignment(penalty=0.1,\n                                      name=TokenRange(4, 5),\n                                      housenumber=TokenRange(3, 4),\n                                      address=[TokenRange(0, 1), TokenRange(1, 2),\n                                               TokenRange(2, 3)]),\n                      TokenAssignment(penalty=0.2,\n                                      housenumber=TokenRange(3, 4),\n                                      address=[TokenRange(0, 1), TokenRange(1, 2),\n                                               TokenRange(2, 3), TokenRange(4, 5)]))\n\n\ndef test_country_at_beginning():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_COUNTRY)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(2, qmod.TOKEN_PARTIAL)]))\n\n    check_assignments(yield_token_assignments(q),\n                      TokenAssignment(penalty=0.1, name=TokenRange(1, 2),\n                                      country=TokenRange(0, 1)))\n\n\ndef test_country_at_end():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(2, qmod.TOKEN_COUNTRY)]))\n\n    check_assignments(yield_token_assignments(q),\n                      TokenAssignment(penalty=0.1, name=TokenRange(0, 1),\n                                      country=TokenRange(1, 2)))\n\n\ndef test_country_in_middle():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(2, qmod.TOKEN_COUNTRY)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(3, qmod.TOKEN_PARTIAL)]))\n\n    check_assignments(yield_token_assignments(q))\n\n\ndef test_postcode_with_designation():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_POSTCODE)]),\n                   (qmod.BREAK_PHRASE, qmod.PHRASE_ANY, [(2, qmod.TOKEN_PARTIAL)]))\n\n    check_assignments(yield_token_assignments(q),\n                      TokenAssignment(penalty=0.1, name=TokenRange(1, 2),\n                                      postcode=TokenRange(0, 1)),\n                      TokenAssignment(postcode=TokenRange(0, 1),\n                                      address=[TokenRange(1, 2)]))\n\n\ndef test_postcode_with_designation_backwards():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_PHRASE, qmod.PHRASE_ANY, [(2, qmod.TOKEN_POSTCODE)]))\n\n    check_assignments(yield_token_assignments(q),\n                      TokenAssignment(name=TokenRange(0, 1),\n                                      postcode=TokenRange(1, 2)),\n                      TokenAssignment(penalty=0.1, postcode=TokenRange(1, 2),\n                                      address=[TokenRange(0, 1)]))\n\n\ndef test_near_item_at_beginning():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_NEAR_ITEM)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(2, qmod.TOKEN_PARTIAL)]))\n\n    check_assignments(yield_token_assignments(q),\n                      TokenAssignment(penalty=0.1, name=TokenRange(1, 2),\n                                      near_item=TokenRange(0, 1)))\n\n\ndef test_near_item_at_end():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(2, qmod.TOKEN_NEAR_ITEM)]))\n\n    check_assignments(yield_token_assignments(q),\n                      TokenAssignment(penalty=0.1, name=TokenRange(0, 1),\n                                      near_item=TokenRange(1, 2)))\n\n\ndef test_near_item_in_middle():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(2, qmod.TOKEN_NEAR_ITEM)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(3, qmod.TOKEN_PARTIAL)]))\n\n    check_assignments(yield_token_assignments(q))\n\n\ndef test_qualifier_at_beginning():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_QUALIFIER)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(2, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(3, qmod.TOKEN_PARTIAL)]))\n\n    check_assignments(yield_token_assignments(q),\n                      TokenAssignment(penalty=0.1, name=TokenRange(1, 3),\n                                      qualifier=TokenRange(0, 1)),\n                      TokenAssignment(penalty=0.2, name=TokenRange(1, 2),\n                                      qualifier=TokenRange(0, 1),\n                                      address=[TokenRange(2, 3)]))\n\n\ndef test_qualifier_after_name():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(2, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(3, qmod.TOKEN_QUALIFIER)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(4, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(5, qmod.TOKEN_PARTIAL)]))\n\n    check_assignments(yield_token_assignments(q),\n                      TokenAssignment(penalty=0.2, name=TokenRange(0, 2),\n                                      qualifier=TokenRange(2, 3),\n                                      address=[TokenRange(3, 5)]),\n                      TokenAssignment(penalty=0.2, name=TokenRange(3, 5),\n                                      qualifier=TokenRange(2, 3),\n                                      address=[TokenRange(0, 2)]))\n\n\ndef test_qualifier_before_housenumber():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_QUALIFIER)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(2, qmod.TOKEN_HOUSENUMBER)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(3, qmod.TOKEN_PARTIAL)]))\n\n    check_assignments(yield_token_assignments(q))\n\n\ndef test_qualifier_after_housenumber():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_HOUSENUMBER)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(2, qmod.TOKEN_QUALIFIER)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(3, qmod.TOKEN_PARTIAL)]))\n\n    check_assignments(yield_token_assignments(q))\n\n\ndef test_qualifier_in_middle_of_phrase():\n    q = make_query((qmod.BREAK_START, qmod.PHRASE_ANY, [(1, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_PHRASE, qmod.PHRASE_ANY, [(2, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(3, qmod.TOKEN_QUALIFIER)]),\n                   (qmod.BREAK_WORD, qmod.PHRASE_ANY, [(4, qmod.TOKEN_PARTIAL)]),\n                   (qmod.BREAK_PHRASE, qmod.PHRASE_ANY, [(5, qmod.TOKEN_PARTIAL)]))\n\n    check_assignments(yield_token_assignments(q))\n"
  },
  {
    "path": "test/python/api/test_api_connection.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for enhanced connection class for API functions.\n\"\"\"\nimport pytest\n\nimport sqlalchemy as sa\n\n\n@pytest.mark.asyncio\nasync def test_run_scalar(api, table_factory):\n    table_factory('foo', definition='that TEXT', content=(('a', ),))\n\n    async with api.begin() as conn:\n        assert await conn.scalar(sa.text('SELECT * FROM foo')) == 'a'\n\n\n@pytest.mark.asyncio\nasync def test_run_execute(api, table_factory):\n    table_factory('foo', definition='that TEXT', content=(('a', ),))\n\n    async with api.begin() as conn:\n        result = await conn.execute(sa.text('SELECT * FROM foo'))\n        assert result.fetchone()[0] == 'a'\n\n\n@pytest.mark.asyncio\nasync def test_get_property_existing_cached(api, table_factory):\n    table_factory('nominatim_properties',\n                  definition='property TEXT, value TEXT',\n                  content=(('dbv', '96723'), ))\n\n    async with api.begin() as conn:\n        assert await conn.get_property('dbv') == '96723'\n\n        await conn.execute(sa.text('TRUNCATE nominatim_properties'))\n\n        assert await conn.get_property('dbv') == '96723'\n\n\n@pytest.mark.asyncio\nasync def test_get_property_existing_uncached(api, table_factory):\n    table_factory('nominatim_properties',\n                  definition='property TEXT, value TEXT',\n                  content=(('dbv', '96723'), ))\n\n    async with api.begin() as conn:\n        assert await conn.get_property('dbv') == '96723'\n\n        await conn.execute(sa.text(\"UPDATE nominatim_properties SET value = '1'\"))\n\n        assert await conn.get_property('dbv', cached=False) == '1'\n\n\n@pytest.mark.asyncio\n@pytest.mark.parametrize('param', ['foo', 'DB:server_version'])\nasync def test_get_property_missing(api, table_factory, param):\n    table_factory('nominatim_properties',\n                  definition='property TEXT, value TEXT')\n\n    async with api.begin() as conn:\n        with pytest.raises(ValueError):\n            await conn.get_property(param)\n\n\n@pytest.mark.asyncio\nasync def test_get_db_property_existing(api):\n    async with api.begin() as conn:\n        assert await conn.get_db_property('server_version') > 0\n\n\n@pytest.mark.asyncio\nasync def test_get_db_property_bad_name(api):\n    async with api.begin() as conn:\n        with pytest.raises(ValueError):\n            await conn.get_db_property('dfkgjd.rijg')\n"
  },
  {
    "path": "test/python/api/test_api_deletable_v1.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for the deletable v1 API call.\n\"\"\"\nimport json\n\nimport pytest\n\nfrom fake_adaptor import FakeAdaptor\n\nimport nominatim_api.v1.server_glue as glue\n\n\nclass TestDeletableEndPoint:\n\n    @pytest.fixture(autouse=True)\n    def setup_deletable_table(self, temp_db_cursor, table_factory, temp_db_with_extensions):\n        table_factory('import_polygon_delete',\n                      definition='osm_id bigint, osm_type char(1), class text, type text',\n                      content=[(345, 'N', 'boundary', 'administrative'),\n                               (781, 'R', 'landuse', 'wood'),\n                               (781, 'R', 'landcover', 'grass')])\n        table_factory(\n            'placex',\n            definition=\"\"\"place_id bigint, osm_id bigint, osm_type char(1),\n                          class text, type text, name HSTORE, country_code char(2)\"\"\",\n            content=[(1, 345, 'N', 'boundary', 'administrative', {'old_name': 'Former'}, 'ab'),\n                     (2, 781, 'R', 'landuse', 'wood', {'name': 'Wood'}, 'cd'),\n                     (3, 781, 'R', 'landcover', 'grass', None, 'cd')])\n\n    @pytest.mark.asyncio\n    async def test_deletable(self, api):\n        a = FakeAdaptor()\n\n        resp = await glue.deletable_endpoint(api, a)\n        results = json.loads(resp.output)\n\n        results.sort(key=lambda r: r['place_id'])\n\n        assert results == [{'place_id': 1, 'country_code': 'ab', 'name': None,\n                            'osm_id': 345, 'osm_type': 'N',\n                            'class': 'boundary', 'type': 'administrative'},\n                           {'place_id': 2, 'country_code': 'cd', 'name': 'Wood',\n                            'osm_id': 781, 'osm_type': 'R',\n                            'class': 'landuse', 'type': 'wood'},\n                           {'place_id': 3, 'country_code': 'cd', 'name': None,\n                            'osm_id': 781, 'osm_type': 'R',\n                            'class': 'landcover', 'type': 'grass'}]\n"
  },
  {
    "path": "test/python/api/test_api_details.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for details API call.\n\"\"\"\nimport datetime as dt\n\nimport pytest\n\nimport nominatim_api as napi\n\n\n@pytest.mark.parametrize('idobj', (napi.PlaceID(332), napi.OsmID('W', 4),\n                                   napi.OsmID('W', 4, 'highway')))\ndef test_lookup_in_placex(apiobj, frontend, idobj):\n    import_date = dt.datetime(2022, 12, 7, 14, 14, 46, 0)\n    apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,\n                      class_='highway', type='residential',\n                      name={'name': 'Road'}, address={'city': 'Barrow'},\n                      extratags={'surface': 'paved'},\n                      parent_place_id=34, linked_place_id=55,\n                      admin_level=15, country_code='gb',\n                      housenumber='4',\n                      postcode='34425', wikipedia='en:Faa',\n                      rank_search=27, rank_address=26,\n                      importance=0.01,\n                      centroid=(23, 34),\n                      indexed_date=import_date,\n                      geometry='LINESTRING(23 34, 23.1 34, 23.1 34.1, 23 34)')\n\n    api = frontend(apiobj, options={'details'})\n    result = api.details(idobj)\n    napi.Locales().localize_results([result])\n\n    assert result is not None\n\n    assert result.source_table.name == 'PLACEX'\n    assert result.category == ('highway', 'residential')\n    assert result.centroid == (pytest.approx(23.0), pytest.approx(34.0))\n\n    assert result.place_id == 332\n    assert result.parent_place_id == 34\n    assert result.linked_place_id == 55\n    assert result.osm_object == ('W', 4)\n    assert result.admin_level == 15\n\n    assert result.names == {'name': 'Road'}\n    assert result.address == {'city': 'Barrow'}\n    assert result.extratags == {'surface': 'paved'}\n\n    assert result.housenumber == '4'\n    assert result.postcode == '34425'\n    assert result.wikipedia == 'en:Faa'\n\n    assert result.rank_search == 27\n    assert result.rank_address == 26\n    assert result.importance == pytest.approx(0.01)\n\n    assert result.country_code == 'gb'\n    assert result.indexed_date == import_date.replace(tzinfo=dt.timezone.utc)\n\n    assert result.address_rows is None\n    assert result.linked_rows is None\n    assert result.parented_rows is None\n    assert result.name_keywords is None\n    assert result.address_keywords is None\n\n    assert result.geometry == {'type': 'ST_LineString'}\n\n\ndef test_lookup_in_placex_minimal_info(apiobj, frontend):\n    import_date = dt.datetime(2022, 12, 7, 14, 14, 46, 0)\n    apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,\n                      class_='highway', type='residential',\n                      admin_level=15,\n                      rank_search=27, rank_address=26,\n                      centroid=(23, 34),\n                      indexed_date=import_date,\n                      importance=0.8,\n                      geometry='LINESTRING(23 34, 23.1 34, 23.1 34.1, 23 34)')\n\n    api = frontend(apiobj, options={'details'})\n    result = api.details(napi.PlaceID(332))\n    napi.Locales().localize_results([result])\n\n    assert result is not None\n\n    assert result.source_table.name == 'PLACEX'\n    assert result.category == ('highway', 'residential')\n    assert result.centroid == (pytest.approx(23.0), pytest.approx(34.0))\n\n    assert result.place_id == 332\n    assert result.parent_place_id is None\n    assert result.linked_place_id is None\n    assert result.osm_object == ('W', 4)\n    assert result.admin_level == 15\n\n    assert result.names is None\n    assert result.address is None\n    assert result.extratags is None\n\n    assert result.housenumber is None\n    assert result.postcode is None\n    assert result.wikipedia is None\n\n    assert result.rank_search == 27\n    assert result.rank_address == 26\n    assert result.importance == pytest.approx(0.8)\n\n    assert result.country_code is None\n    assert result.indexed_date == import_date.replace(tzinfo=dt.timezone.utc)\n\n    assert result.address_rows is None\n    assert result.linked_rows is None\n    assert result.parented_rows is None\n    assert result.name_keywords is None\n    assert result.address_keywords is None\n\n    assert result.geometry == {'type': 'ST_LineString'}\n\n\ndef test_lookup_in_placex_with_geometry(apiobj, frontend):\n    apiobj.add_placex(place_id=332,\n                      geometry='LINESTRING(23 34, 23.1 34)')\n\n    api = frontend(apiobj, options={'details'})\n    result = api.details(napi.PlaceID(332), geometry_output=napi.GeometryFormat.GEOJSON)\n\n    assert result.geometry == {'geojson': '{\"type\":\"LineString\",\"coordinates\":[[23,34],[23.1,34]]}'}\n\n\ndef test_lookup_placex_with_address_details(apiobj, frontend):\n    apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,\n                      class_='highway', type='residential',  name='Street',\n                      country_code='pl',\n                      rank_search=27, rank_address=26)\n    apiobj.add_address_placex(332, fromarea=False, isaddress=False,\n                              distance=0.0034,\n                              place_id=1000, osm_type='N', osm_id=3333,\n                              class_='place', type='suburb', name='Smallplace',\n                              country_code='pl', admin_level=13,\n                              rank_search=24, rank_address=23)\n    apiobj.add_address_placex(332, fromarea=True, isaddress=True,\n                              place_id=1001, osm_type='N', osm_id=3334,\n                              class_='place', type='city', name='Bigplace',\n                              country_code='pl',\n                              rank_search=17, rank_address=16)\n\n    api = frontend(apiobj, options={'details'})\n    result = api.details(napi.PlaceID(332), address_details=True)\n    napi.Locales().localize_results([result])\n\n    assert result.address_rows == [\n               napi.AddressLine(place_id=332, osm_object=('W', 4),\n                                category=('highway', 'residential'),\n                                names={'name': 'Street'}, extratags={},\n                                admin_level=15, fromarea=True, isaddress=True,\n                                rank_address=26, distance=0.0,\n                                local_name='Street'),\n               napi.AddressLine(place_id=1000, osm_object=('N', 3333),\n                                category=('place', 'suburb'),\n                                names={'name': 'Smallplace'}, extratags={},\n                                admin_level=13, fromarea=False, isaddress=True,\n                                rank_address=23, distance=0.0034,\n                                local_name='Smallplace'),\n               napi.AddressLine(place_id=1001, osm_object=('N', 3334),\n                                category=('place', 'city'),\n                                names={'name': 'Bigplace'}, extratags={},\n                                admin_level=15, fromarea=True, isaddress=True,\n                                rank_address=16, distance=0.0,\n                                local_name='Bigplace'),\n               napi.AddressLine(place_id=None, osm_object=None,\n                                category=('place', 'country_code'),\n                                names={'ref': 'pl'}, extratags={},\n                                admin_level=None, fromarea=True, isaddress=False,\n                                rank_address=4, distance=0.0)\n           ]\n\n\ndef test_lookup_place_with_linked_places_none_existing(apiobj, frontend):\n    apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,\n                      class_='highway', type='residential',  name='Street',\n                      country_code='pl', linked_place_id=45,\n                      rank_search=27, rank_address=26)\n\n    api = frontend(apiobj, options={'details'})\n    result = api.details(napi.PlaceID(332), linked_places=True)\n\n    assert result.linked_rows == []\n\n\ndef test_lookup_place_with_linked_places_existing(apiobj, frontend):\n    apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,\n                      class_='highway', type='residential',  name='Street',\n                      country_code='pl', linked_place_id=45,\n                      rank_search=27, rank_address=26)\n    apiobj.add_placex(place_id=1001, osm_type='W', osm_id=5,\n                      class_='highway', type='residential',  name='Street',\n                      country_code='pl', linked_place_id=332,\n                      rank_search=27, rank_address=26)\n    apiobj.add_placex(place_id=1002, osm_type='W', osm_id=6,\n                      class_='highway', type='residential',  name='Street',\n                      country_code='pl', linked_place_id=332,\n                      rank_search=27, rank_address=26)\n\n    api = frontend(apiobj, options={'details'})\n    result = api.details(napi.PlaceID(332), linked_places=True)\n\n    assert result.linked_rows == [\n               napi.AddressLine(place_id=1001, osm_object=('W', 5),\n                                category=('highway', 'residential'),\n                                names={'name': 'Street'}, extratags={},\n                                admin_level=15, fromarea=False, isaddress=True,\n                                rank_address=26, distance=0.0),\n               napi.AddressLine(place_id=1002, osm_object=('W', 6),\n                                category=('highway', 'residential'),\n                                names={'name': 'Street'}, extratags={},\n                                admin_level=15, fromarea=False, isaddress=True,\n                                rank_address=26, distance=0.0),\n    ]\n\n\ndef test_lookup_place_with_parented_places_not_existing(apiobj, frontend):\n    apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,\n                      class_='highway', type='residential',  name='Street',\n                      country_code='pl', parent_place_id=45,\n                      rank_search=27, rank_address=26)\n\n    api = frontend(apiobj, options={'details'})\n    result = api.details(napi.PlaceID(332), parented_places=True)\n\n    assert result.parented_rows == []\n\n\ndef test_lookup_place_with_parented_places_existing(apiobj, frontend):\n    apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,\n                      class_='highway', type='residential',  name='Street',\n                      country_code='pl', parent_place_id=45,\n                      rank_search=27, rank_address=26)\n    apiobj.add_placex(place_id=1001, osm_type='N', osm_id=5,\n                      class_='place', type='house', housenumber='23',\n                      country_code='pl', parent_place_id=332,\n                      rank_search=30, rank_address=30)\n    apiobj.add_placex(place_id=1002, osm_type='W', osm_id=6,\n                      class_='highway', type='residential',  name='Street',\n                      country_code='pl', parent_place_id=332,\n                      rank_search=27, rank_address=26)\n\n    api = frontend(apiobj, options={'details'})\n    result = api.details(napi.PlaceID(332), parented_places=True)\n\n    assert result.parented_rows == [\n               napi.AddressLine(place_id=1001, osm_object=('N', 5),\n                                category=('place', 'house'),\n                                names={'housenumber': '23'}, extratags={},\n                                admin_level=15, fromarea=False, isaddress=True,\n                                rank_address=30, distance=0.0),\n    ]\n\n\n@pytest.mark.parametrize('idobj', (napi.PlaceID(4924), napi.OsmID('W', 9928)))\ndef test_lookup_in_osmline(apiobj, frontend, idobj):\n    import_date = dt.datetime(2022, 12, 7, 14, 14, 46, 0)\n    apiobj.add_osmline(place_id=4924, osm_id=9928,\n                       parent_place_id=12,\n                       startnumber=1, endnumber=4, step=1,\n                       country_code='gb', postcode='34425',\n                       address={'city': 'Big'},\n                       indexed_date=import_date,\n                       geometry='LINESTRING(23 34, 23 35)')\n\n    api = frontend(apiobj, options={'details'})\n    result = api.details(idobj)\n\n    assert result is not None\n\n    assert result.source_table.name == 'OSMLINE'\n    assert result.category == ('place', 'houses')\n    assert result.centroid == (pytest.approx(23.0), pytest.approx(34.5))\n\n    assert result.place_id == 4924\n    assert result.parent_place_id == 12\n    assert result.linked_place_id is None\n    assert result.osm_object == ('W', 9928)\n    assert result.admin_level == 15\n\n    assert result.names is None\n    assert result.address == {'city': 'Big'}\n    assert result.extratags == {'startnumber': '1', 'endnumber': '4', 'step': '1'}\n\n    assert result.housenumber is None\n    assert result.postcode == '34425'\n    assert result.wikipedia is None\n\n    assert result.rank_search == 30\n    assert result.rank_address == 30\n    assert result.importance is None\n\n    assert result.country_code == 'gb'\n    assert result.indexed_date == import_date.replace(tzinfo=dt.timezone.utc)\n\n    assert result.address_rows is None\n    assert result.linked_rows is None\n    assert result.parented_rows is None\n    assert result.name_keywords is None\n    assert result.address_keywords is None\n\n    assert result.geometry == {'type': 'ST_LineString'}\n\n\ndef test_lookup_in_osmline_split_interpolation(apiobj, frontend):\n    apiobj.add_osmline(place_id=1000, osm_id=9,\n                       startnumber=2, endnumber=4, step=1)\n    apiobj.add_osmline(place_id=1001, osm_id=9,\n                       startnumber=6, endnumber=9, step=1)\n    apiobj.add_osmline(place_id=1002, osm_id=9,\n                       startnumber=11, endnumber=20, step=1)\n\n    api = frontend(apiobj, options={'details'})\n    for i in range(1, 6):\n        result = api.details(napi.OsmID('W', 9, str(i)))\n        assert result.place_id == 1000\n    for i in range(7, 11):\n        result = api.details(napi.OsmID('W', 9, str(i)))\n        assert result.place_id == 1001\n    for i in range(12, 22):\n        result = api.details(napi.OsmID('W', 9, str(i)))\n        assert result.place_id == 1002\n\n\ndef test_lookup_osmline_with_address_details(apiobj, frontend):\n    apiobj.add_osmline(place_id=9000, osm_id=9,\n                       startnumber=2, endnumber=4, step=1,\n                       parent_place_id=332)\n    apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,\n                      class_='highway', type='residential',  name='Street',\n                      country_code='pl',\n                      rank_search=27, rank_address=26)\n    apiobj.add_address_placex(332, fromarea=False, isaddress=False,\n                              distance=0.0034,\n                              place_id=1000, osm_type='N', osm_id=3333,\n                              class_='place', type='suburb', name='Smallplace',\n                              country_code='pl', admin_level=13,\n                              rank_search=24, rank_address=23)\n    apiobj.add_address_placex(332, fromarea=True, isaddress=True,\n                              place_id=1001, osm_type='N', osm_id=3334,\n                              class_='place', type='city', name='Bigplace',\n                              country_code='pl',\n                              rank_search=17, rank_address=16)\n\n    api = frontend(apiobj, options={'details'})\n    result = api.details(napi.PlaceID(9000), address_details=True)\n    napi.Locales().localize_results([result])\n\n    assert result.address_rows == [\n               napi.AddressLine(place_id=332, osm_object=('W', 4),\n                                category=('highway', 'residential'),\n                                names={'name': 'Street'}, extratags={},\n                                admin_level=15, fromarea=True, isaddress=True,\n                                rank_address=26, distance=0.0,\n                                local_name='Street'),\n               napi.AddressLine(place_id=1000, osm_object=('N', 3333),\n                                category=('place', 'suburb'),\n                                names={'name': 'Smallplace'}, extratags={},\n                                admin_level=13, fromarea=False, isaddress=True,\n                                rank_address=23, distance=0.0034,\n                                local_name='Smallplace'),\n               napi.AddressLine(place_id=1001, osm_object=('N', 3334),\n                                category=('place', 'city'),\n                                names={'name': 'Bigplace'}, extratags={},\n                                admin_level=15, fromarea=True, isaddress=True,\n                                rank_address=16, distance=0.0,\n                                local_name='Bigplace'),\n               napi.AddressLine(place_id=None, osm_object=None,\n                                category=('place', 'country_code'),\n                                names={'ref': 'pl'}, extratags={},\n                                admin_level=None, fromarea=True, isaddress=False,\n                                rank_address=4, distance=0.0)\n           ]\n\n\ndef test_lookup_in_tiger(apiobj, frontend):\n    apiobj.add_tiger(place_id=4924,\n                     parent_place_id=12,\n                     startnumber=1, endnumber=4, step=1,\n                     postcode='34425',\n                     geometry='LINESTRING(23 34, 23 35)')\n    apiobj.add_placex(place_id=12,\n                      category=('highway', 'residential'),\n                      osm_type='W', osm_id=6601223,\n                      geometry='LINESTRING(23 34, 23 35)')\n\n    api = frontend(apiobj, options={'details'})\n    result = api.details(napi.PlaceID(4924))\n\n    assert result is not None\n\n    assert result.source_table.name == 'TIGER'\n    assert result.category == ('place', 'houses')\n    assert result.centroid == (pytest.approx(23.0), pytest.approx(34.5))\n\n    assert result.place_id == 4924\n    assert result.parent_place_id == 12\n    assert result.linked_place_id is None\n    assert result.osm_object == ('W', 6601223)\n    assert result.admin_level == 15\n\n    assert result.names is None\n    assert result.address is None\n    assert result.extratags == {'startnumber': '1', 'endnumber': '4', 'step': '1'}\n\n    assert result.housenumber is None\n    assert result.postcode == '34425'\n    assert result.wikipedia is None\n\n    assert result.rank_search == 30\n    assert result.rank_address == 30\n    assert result.importance is None\n\n    assert result.country_code == 'us'\n    assert result.indexed_date is None\n\n    assert result.address_rows is None\n    assert result.linked_rows is None\n    assert result.parented_rows is None\n    assert result.name_keywords is None\n    assert result.address_keywords is None\n\n    assert result.geometry == {'type': 'ST_LineString'}\n\n\ndef test_lookup_tiger_with_address_details(apiobj, frontend):\n    apiobj.add_tiger(place_id=9000,\n                     startnumber=2, endnumber=4, step=1,\n                     parent_place_id=332)\n    apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,\n                      class_='highway', type='residential',  name='Street',\n                      country_code='us',\n                      rank_search=27, rank_address=26)\n    apiobj.add_address_placex(332, fromarea=False, isaddress=False,\n                              distance=0.0034,\n                              place_id=1000, osm_type='N', osm_id=3333,\n                              class_='place', type='suburb', name='Smallplace',\n                              country_code='us', admin_level=13,\n                              rank_search=24, rank_address=23)\n    apiobj.add_address_placex(332, fromarea=True, isaddress=True,\n                              place_id=1001, osm_type='N', osm_id=3334,\n                              class_='place', type='city', name='Bigplace',\n                              country_code='us',\n                              rank_search=17, rank_address=16)\n\n    api = frontend(apiobj, options={'details'})\n    result = api.details(napi.PlaceID(9000), address_details=True)\n    napi.Locales().localize_results([result])\n\n    assert result.address_rows == [\n               napi.AddressLine(place_id=332, osm_object=('W', 4),\n                                category=('highway', 'residential'),\n                                names={'name': 'Street'}, extratags={},\n                                admin_level=15, fromarea=True, isaddress=True,\n                                rank_address=26, distance=0.0,\n                                local_name='Street'),\n               napi.AddressLine(place_id=1000, osm_object=('N', 3333),\n                                category=('place', 'suburb'),\n                                names={'name': 'Smallplace'}, extratags={},\n                                admin_level=13, fromarea=False, isaddress=True,\n                                rank_address=23, distance=0.0034,\n                                local_name='Smallplace'),\n               napi.AddressLine(place_id=1001, osm_object=('N', 3334),\n                                category=('place', 'city'),\n                                names={'name': 'Bigplace'}, extratags={},\n                                admin_level=15, fromarea=True, isaddress=True,\n                                rank_address=16, distance=0.0,\n                                local_name='Bigplace'),\n               napi.AddressLine(place_id=None, osm_object=None,\n                                category=('place', 'country_code'),\n                                names={'ref': 'us'}, extratags={},\n                                admin_level=None, fromarea=True, isaddress=False,\n                                rank_address=4, distance=0.0)\n           ]\n\n\ndef test_lookup_in_postcode(apiobj, frontend):\n    import_date = dt.datetime(2022, 12, 7, 14, 14, 46, 0)\n    apiobj.add_postcode(place_id=554,\n                        parent_place_id=152,\n                        postcode='34 425',\n                        country_code='gb',\n                        rank_search=20,\n                        indexed_date=import_date,\n                        centroid='POINT(-9.45 5.6)',\n                        geometry='POLYGON((-9.5 5.5, -9.5 5.7, -9.4 5.6, -9.5 5.5))')\n\n    api = frontend(apiobj, options={'details'})\n    result = api.details(napi.PlaceID(554))\n\n    assert result is not None\n\n    assert result.source_table.name == 'POSTCODE'\n    assert result.category == ('place', 'postcode')\n    assert result.centroid == (pytest.approx(-9.45), pytest.approx(5.6))\n\n    assert result.place_id == 554\n    assert result.parent_place_id == 152\n    assert result.linked_place_id is None\n    assert result.osm_object is None\n    assert result.admin_level == 15\n\n    assert result.names == {'ref': '34 425'}\n    assert result.address is None\n    assert result.extratags is None\n\n    assert result.housenumber is None\n    assert result.postcode is None\n    assert result.wikipedia is None\n\n    assert result.rank_search == 20\n    assert result.rank_address == 5\n    assert result.importance is None\n\n    assert result.country_code == 'gb'\n    assert result.indexed_date == import_date.replace(tzinfo=dt.timezone.utc)\n\n    assert result.address_rows is None\n    assert result.linked_rows is None\n    assert result.parented_rows is None\n    assert result.name_keywords is None\n    assert result.address_keywords is None\n\n    assert result.geometry == {'type': 'ST_Polygon'}\n\n\n@pytest.mark.parametrize('lookup', [napi.PlaceID(9000),\n                                    napi.OsmID('R', 12)])\ndef test_lookup_postcode_with_address_details(apiobj, frontend, lookup):\n    apiobj.add_postcode(place_id=9000, osm_id=12,\n                        parent_place_id=332,\n                        postcode='34 425',\n                        country_code='gb',\n                        rank_search=25)\n    apiobj.add_placex(place_id=332, osm_type='N', osm_id=3333,\n                      class_='place', type='suburb',  name='Smallplace',\n                      country_code='gb', admin_level=13,\n                      rank_search=24, rank_address=23)\n    apiobj.add_address_placex(332, fromarea=True, isaddress=True,\n                              place_id=1001, osm_type='N', osm_id=3334,\n                              class_='place', type='city', name='Bigplace',\n                              country_code='gb',\n                              rank_search=17, rank_address=16)\n\n    api = frontend(apiobj, options={'details'})\n    result = api.details(lookup, address_details=True)\n    napi.Locales().localize_results([result])\n\n    assert result.address_rows == [\n               napi.AddressLine(place_id=9000, osm_object=('R', 12),\n                                category=('boundary', 'postal_code'),\n                                names={'ref': '34 425'}, extratags={},\n                                admin_level=15, fromarea=True, isaddress=True,\n                                rank_address=5, distance=0.0,\n                                local_name='34 425'),\n               napi.AddressLine(place_id=332, osm_object=('N', 3333),\n                                category=('place', 'suburb'),\n                                names={'name': 'Smallplace'}, extratags={},\n                                admin_level=13, fromarea=True, isaddress=True,\n                                rank_address=23, distance=0.0,\n                                local_name='Smallplace'),\n               napi.AddressLine(place_id=1001, osm_object=('N', 3334),\n                                category=('place', 'city'),\n                                names={'name': 'Bigplace'}, extratags={},\n                                admin_level=15, fromarea=True, isaddress=True,\n                                rank_address=16, distance=0.0,\n                                local_name='Bigplace'),\n               napi.AddressLine(place_id=None, osm_object=None,\n                                category=('place', 'country_code'),\n                                names={'ref': 'gb'}, extratags={},\n                                admin_level=None, fromarea=True, isaddress=False,\n                                rank_address=4, distance=0.0)\n           ]\n\n\n@pytest.mark.parametrize('objid', [napi.PlaceID(1736),\n                                   napi.OsmID('W', 55),\n                                   napi.OsmID('N', 55, 'amenity')])\ndef test_lookup_missing_object(apiobj, frontend, objid):\n    apiobj.add_placex(place_id=1, osm_type='N', osm_id=55,\n                      class_='place', type='suburb')\n\n    api = frontend(apiobj, options={'details'})\n    assert api.details(objid) is None\n\n\n@pytest.mark.parametrize('gtype', (napi.GeometryFormat.KML,\n                                   napi.GeometryFormat.SVG,\n                                   napi.GeometryFormat.TEXT))\ndef test_lookup_unsupported_geometry(apiobj, frontend, gtype):\n    apiobj.add_placex(place_id=332)\n\n    api = frontend(apiobj, options={'details'})\n    with pytest.raises(ValueError):\n        api.details(napi.PlaceID(332), geometry_output=gtype)\n"
  },
  {
    "path": "test/python/api/test_api_lookup.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for lookup API call.\n\"\"\"\nimport json\n\nimport pytest\n\nimport nominatim_api as napi\n\n\ndef test_lookup_empty_list(apiobj, frontend):\n    api = frontend(apiobj, options={'details'})\n    assert api.lookup([]) == []\n\n\ndef test_lookup_non_existing(apiobj, frontend):\n    api = frontend(apiobj, options={'details'})\n    assert api.lookup((napi.PlaceID(332), napi.OsmID('W', 4),\n                       napi.OsmID('W', 4, 'highway'))) == []\n\n\n@pytest.mark.parametrize('idobj', (napi.PlaceID(332), napi.OsmID('W', 4),\n                                   napi.OsmID('W', 4, 'highway')))\ndef test_lookup_single_placex(apiobj, frontend, idobj):\n    apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,\n                      class_='highway', type='residential',\n                      name={'name': 'Road'}, address={'city': 'Barrow'},\n                      extratags={'surface': 'paved'},\n                      parent_place_id=34, linked_place_id=55,\n                      admin_level=15, country_code='gb',\n                      housenumber='4',\n                      postcode='34425', wikipedia='en:Faa',\n                      rank_search=27, rank_address=26,\n                      importance=0.01,\n                      centroid=(23, 34),\n                      geometry='LINESTRING(23 34, 23.1 34, 23.1 34.1, 23 34)')\n\n    api = frontend(apiobj, options={'details'})\n    result = api.lookup([idobj])\n\n    assert len(result) == 1\n\n    result = result[0]\n\n    assert result.source_table.name == 'PLACEX'\n    assert result.category == ('highway', 'residential')\n    assert result.centroid == (pytest.approx(23.0), pytest.approx(34.0))\n\n    assert result.place_id == 332\n    assert result.osm_object == ('W', 4)\n\n    assert result.names == {'name': 'Road'}\n    assert result.address == {'city': 'Barrow'}\n    assert result.extratags == {'surface': 'paved'}\n\n    assert result.housenumber == '4'\n    assert result.postcode == '34425'\n    assert result.wikipedia == 'en:Faa'\n\n    assert result.rank_search == 27\n    assert result.rank_address == 26\n    assert result.importance == pytest.approx(0.01)\n\n    assert result.country_code == 'gb'\n\n    assert result.address_rows is None\n    assert result.linked_rows is None\n    assert result.parented_rows is None\n    assert result.name_keywords is None\n    assert result.address_keywords is None\n\n    assert result.geometry == {}\n\n\ndef test_lookup_multiple_places(apiobj, frontend):\n    apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,\n                      class_='highway', type='residential',\n                      name={'name': 'Road'}, address={'city': 'Barrow'},\n                      extratags={'surface': 'paved'},\n                      parent_place_id=34, linked_place_id=55,\n                      admin_level=15, country_code='gb',\n                      housenumber='4',\n                      postcode='34425', wikipedia='en:Faa',\n                      rank_search=27, rank_address=26,\n                      importance=0.01,\n                      centroid=(23, 34),\n                      geometry='LINESTRING(23 34, 23.1 34, 23.1 34.1, 23 34)')\n    apiobj.add_osmline(place_id=4924, osm_id=9928,\n                       parent_place_id=12,\n                       startnumber=1, endnumber=4, step=1,\n                       country_code='gb', postcode='34425',\n                       address={'city': 'Big'},\n                       geometry='LINESTRING(23 34, 23 35)')\n\n    api = frontend(apiobj, options={'details'})\n    result = api.lookup((napi.OsmID('W', 1),\n                         napi.OsmID('W', 4),\n                         napi.OsmID('W', 9928)))\n\n    assert len(result) == 2\n\n    assert set(r.place_id for r in result) == {332, 4924}\n\n\n@pytest.mark.parametrize('gtype', list(napi.GeometryFormat))\ndef test_simple_place_with_geometry(apiobj, frontend, gtype):\n    apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,\n                      class_='highway', type='residential',\n                      name={'name': 'Road'}, address={'city': 'Barrow'},\n                      extratags={'surface': 'paved'},\n                      parent_place_id=34, linked_place_id=55,\n                      admin_level=15, country_code='gb',\n                      housenumber='4',\n                      postcode='34425', wikipedia='en:Faa',\n                      rank_search=27, rank_address=26,\n                      importance=0.01,\n                      centroid=(23, 34),\n                      geometry='POLYGON((23 34, 23.1 34, 23.1 34.1, 23 34))')\n\n    api = frontend(apiobj, options={'details'})\n    result = api.lookup([napi.OsmID('W', 4)], geometry_output=gtype)\n\n    assert len(result) == 1\n    assert result[0].place_id == 332\n\n    if gtype == napi.GeometryFormat.NONE:\n        assert list(result[0].geometry.keys()) == []\n    else:\n        assert list(result[0].geometry.keys()) == [gtype.name.lower()]\n\n\ndef test_simple_place_with_geometry_simplified(apiobj, frontend):\n    apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,\n                      class_='highway', type='residential',\n                      name={'name': 'Road'}, address={'city': 'Barrow'},\n                      extratags={'surface': 'paved'},\n                      parent_place_id=34, linked_place_id=55,\n                      admin_level=15, country_code='gb',\n                      housenumber='4',\n                      postcode='34425', wikipedia='en:Faa',\n                      rank_search=27, rank_address=26,\n                      importance=0.01,\n                      centroid=(23, 34),\n                      geometry='POLYGON((23 34, 22.999 34, 23.1 34, 23.1 34.1, 23 34))')\n\n    api = frontend(apiobj, options={'details'})\n    result = api.lookup([napi.OsmID('W', 4)],\n                        geometry_output=napi.GeometryFormat.GEOJSON,\n                        geometry_simplification=0.1)\n\n    assert len(result) == 1\n    assert result[0].place_id == 332\n\n    geom = json.loads(result[0].geometry['geojson'])\n\n    assert geom['type'] == 'Polygon'\n    assert geom['coordinates'] == [[[23, 34], [23.1, 34], [23.1, 34.1], [23, 34]]]\n"
  },
  {
    "path": "test/python/api/test_api_polygons_v1.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for the deletable v1 API call.\n\"\"\"\nimport json\nimport datetime as dt\n\nimport pytest\n\nfrom fake_adaptor import FakeAdaptor\n\nimport nominatim_api.v1.server_glue as glue\n\n\nclass TestPolygonsEndPoint:\n\n    @pytest.fixture(autouse=True)\n    def setup_deletable_table(self, temp_db_cursor, table_factory, temp_db_with_extensions):\n        self.now = dt.datetime.now()\n        self.recent = dt.datetime.now() - dt.timedelta(days=3)\n\n        table_factory('import_polygon_error',\n                      definition=\"\"\"osm_id bigint,\n                                    osm_type character(1),\n                                    class text,\n                                    type text,\n                                    name hstore,\n                                    country_code character varying(2),\n                                    updated timestamp without time zone,\n                                    errormessage text,\n                                    prevgeometry geometry(Geometry,4326),\n                                    newgeometry geometry(Geometry,4326)\"\"\",\n                      content=[(345, 'N', 'boundary', 'administrative',\n                               {'name': 'Foo'}, 'xx', self.recent,\n                               'some text', None, None),\n                               (781, 'R', 'landuse', 'wood',\n                                None, 'ds', self.now,\n                                'Area reduced by lots', None, None)])\n\n    @pytest.mark.asyncio\n    async def test_polygons_simple(self, api):\n        a = FakeAdaptor()\n\n        resp = await glue.polygons_endpoint(api, a)\n        results = json.loads(resp.output)\n\n        results.sort(key=lambda r: (r['osm_type'], r['osm_id']))\n\n        assert results == [{'osm_type': 'N', 'osm_id': 345,\n                            'class': 'boundary', 'type': 'administrative',\n                            'name': 'Foo', 'country_code': 'xx',\n                            'errormessage': 'some text',\n                            'updated': self.recent.isoformat(sep=' ', timespec='seconds')},\n                           {'osm_type': 'R', 'osm_id': 781,\n                            'class': 'landuse', 'type': 'wood',\n                            'name': None, 'country_code': 'ds',\n                            'errormessage': 'Area reduced by lots',\n                            'updated': self.now.isoformat(sep=' ', timespec='seconds')}]\n\n    @pytest.mark.asyncio\n    async def test_polygons_days(self, api):\n        a = FakeAdaptor()\n        a.params['days'] = '2'\n\n        resp = await glue.polygons_endpoint(api, a)\n        results = json.loads(resp.output)\n\n        assert [r['osm_id'] for r in results] == [781]\n\n    @pytest.mark.asyncio\n    async def test_polygons_class(self, api):\n        a = FakeAdaptor()\n        a.params['class'] = 'landuse'\n\n        resp = await glue.polygons_endpoint(api, a)\n        results = json.loads(resp.output)\n\n        assert [r['osm_id'] for r in results] == [781]\n\n    @pytest.mark.asyncio\n    async def test_polygons_reduced(self, api):\n        a = FakeAdaptor()\n        a.params['reduced'] = '1'\n\n        resp = await glue.polygons_endpoint(api, a)\n        results = json.loads(resp.output)\n\n        assert [r['osm_id'] for r in results] == [781]\n"
  },
  {
    "path": "test/python/api/test_api_reverse.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for reverse API call.\n\nThese tests make sure that all Python code is correct and executable.\nFunctional tests can be found in the BDD test suite.\n\"\"\"\nimport json\n\nimport pytest\n\nimport nominatim_api as napi\n\nAPI_OPTIONS = {'reverse'}\n\n\ndef test_reverse_rank_30(apiobj, frontend):\n    apiobj.add_placex(place_id=223, class_='place', type='house',\n                      housenumber='1',\n                      centroid=(1.3, 0.7),\n                      geometry='POINT(1.3 0.7)')\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    result = api.reverse((1.3, 0.7))\n\n    assert result is not None\n    assert result.place_id == 223\n\n\n@pytest.mark.parametrize('country', ['de', 'us'])\ndef test_reverse_street(apiobj, frontend, country):\n    apiobj.add_placex(place_id=990, class_='highway', type='service',\n                      rank_search=27, rank_address=27,\n                      name={'name': 'My Street'},\n                      centroid=(10.0, 10.0),\n                      country_code=country,\n                      geometry='LINESTRING(9.995 10, 10.005 10)')\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    assert api.reverse((9.995, 10)).place_id == 990\n\n\ndef test_reverse_ignore_unindexed(apiobj, frontend):\n    apiobj.add_placex(place_id=223, class_='place', type='house',\n                      housenumber='1',\n                      indexed_status=2,\n                      centroid=(1.3, 0.7),\n                      geometry='POINT(1.3 0.7)')\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    result = api.reverse((1.3, 0.7))\n\n    assert result is None\n\n\n@pytest.mark.parametrize('y,layer,place_id',\n                         [(0.7, napi.DataLayer.ADDRESS, 223),\n                          (0.70001, napi.DataLayer.POI, 224),\n                          (0.7, napi.DataLayer.ADDRESS | napi.DataLayer.POI, 224),\n                          (0.70001, napi.DataLayer.ADDRESS | napi.DataLayer.POI, 223),\n                          (0.7, napi.DataLayer.MANMADE, 225),\n                          (0.7, napi.DataLayer.RAILWAY, 226),\n                          (0.7, napi.DataLayer.NATURAL, 227),\n                          (0.70003, napi.DataLayer.MANMADE | napi.DataLayer.RAILWAY, 225),\n                          (0.70003, napi.DataLayer.MANMADE | napi.DataLayer.NATURAL, 225),\n                          (5, napi.DataLayer.ADDRESS, 229),\n                          (5.0001, napi.DataLayer.ADDRESS, 229)])\ndef test_reverse_rank_30_layers(apiobj, frontend, y, layer, place_id):\n    apiobj.add_placex(place_id=223, osm_type='N', class_='place', type='house',\n                      housenumber='1',\n                      rank_address=30,\n                      rank_search=30,\n                      centroid=(1.3, 0.70001))\n    apiobj.add_placex(place_id=224, osm_type='N', class_='amenity', type='toilet',\n                      rank_address=30,\n                      rank_search=30,\n                      centroid=(1.3, 0.7))\n    apiobj.add_placex(place_id=225, osm_type='N', class_='man_made', type='tower',\n                      rank_address=0,\n                      rank_search=30,\n                      centroid=(1.3, 0.70003))\n    apiobj.add_placex(place_id=226, osm_type='N', class_='railway', type='station',\n                      rank_address=0,\n                      rank_search=30,\n                      centroid=(1.3, 0.70004))\n    apiobj.add_placex(place_id=227, osm_type='N', class_='natural', type='cave',\n                      rank_address=0,\n                      rank_search=30,\n                      centroid=(1.3, 0.70005))\n    apiobj.add_placex(place_id=229, class_='place', type='house',\n                      name={'addr:housename': 'Old Cottage'},\n                      rank_address=30,\n                      rank_search=30,\n                      centroid=(1.3, 5))\n    apiobj.add_placex(place_id=230, class_='place', type='house',\n                      housenumber='2',\n                      address={'_inherited': ''},\n                      rank_address=30,\n                      rank_search=30,\n                      centroid=(1.3, 5.0001))\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    assert api.reverse((1.3, y), layers=layer).place_id == place_id\n\n\ndef test_reverse_poi_layer_with_no_pois(apiobj, frontend):\n    apiobj.add_placex(place_id=223, class_='place', type='house',\n                      housenumber='1',\n                      rank_address=30,\n                      rank_search=30,\n                      centroid=(1.3, 0.70001))\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    assert api.reverse((1.3, 0.70001), max_rank=29,\n                       layers=napi.DataLayer.POI) is None\n\n\n@pytest.mark.parametrize('with_geom', [True, False])\ndef test_reverse_housenumber_on_street(apiobj, frontend, with_geom):\n    apiobj.add_placex(place_id=990, class_='highway', type='service',\n                      rank_search=27, rank_address=27,\n                      name={'name': 'My Street'},\n                      centroid=(10.0, 10.0),\n                      geometry='LINESTRING(9.995 10, 10.005 10)')\n    apiobj.add_placex(place_id=991, class_='place', type='house',\n                      parent_place_id=990,\n                      rank_search=30, rank_address=30,\n                      housenumber='23',\n                      centroid=(10.0, 10.00001))\n    apiobj.add_placex(place_id=1990, class_='highway', type='service',\n                      rank_search=27, rank_address=27,\n                      name={'name': 'Other Street'},\n                      centroid=(10.0, 1.0),\n                      geometry='LINESTRING(9.995 1, 10.005 1)')\n    apiobj.add_placex(place_id=1991, class_='place', type='house',\n                      parent_place_id=1990,\n                      rank_search=30, rank_address=30,\n                      housenumber='23',\n                      centroid=(10.0, 1.00001))\n\n    params = {'geometry_output': napi.GeometryFormat.TEXT} if with_geom else {}\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    assert api.reverse((10.0, 10.0), max_rank=30, **params).place_id == 991\n    assert api.reverse((10.0, 10.0), max_rank=27).place_id == 990\n    assert api.reverse((10.0, 10.00001), max_rank=30).place_id == 991\n    assert api.reverse((10.0, 1.0), **params).place_id == 1991\n\n\n@pytest.mark.parametrize('with_geom', [True, False])\ndef test_reverse_housenumber_interpolation(apiobj, frontend, with_geom):\n    apiobj.add_placex(place_id=990, class_='highway', type='service',\n                      rank_search=27, rank_address=27,\n                      name={'name': 'My Street'},\n                      centroid=(10.0, 10.0),\n                      geometry='LINESTRING(9.995 10, 10.005 10)')\n    apiobj.add_placex(place_id=991, class_='place', type='house',\n                      parent_place_id=990,\n                      rank_search=30, rank_address=30,\n                      housenumber='23',\n                      centroid=(10.0, 10.0002))\n    apiobj.add_osmline(place_id=992,\n                       parent_place_id=990,\n                       startnumber=1, endnumber=3, step=1,\n                       centroid=(10.0, 10.0001),\n                       geometry='LINESTRING(9.995 10.0001, 10.005 10.0001)')\n    apiobj.add_placex(place_id=1990, class_='highway', type='service',\n                      rank_search=27, rank_address=27,\n                      name={'name': 'Other Street'},\n                      centroid=(10.0, 20.0),\n                      geometry='LINESTRING(9.995 20, 10.005 20)')\n    apiobj.add_osmline(place_id=1992,\n                       parent_place_id=1990,\n                       startnumber=1, endnumber=3, step=1,\n                       centroid=(10.0, 20.0001),\n                       geometry='LINESTRING(9.995 20.0001, 10.005 20.0001)')\n\n    params = {'geometry_output': napi.GeometryFormat.TEXT} if with_geom else {}\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    assert api.reverse((10.0, 10.0), **params).place_id == 992\n    assert api.reverse((10.0, 20.0), **params).place_id == 1992\n\n\ndef test_reverse_housenumber_point_interpolation(apiobj, frontend):\n    apiobj.add_placex(place_id=990, class_='highway', type='service',\n                      rank_search=27, rank_address=27,\n                      name={'name': 'My Street'},\n                      centroid=(10.0, 10.0),\n                      geometry='LINESTRING(9.995 10, 10.005 10)')\n    apiobj.add_osmline(place_id=992,\n                       parent_place_id=990,\n                       startnumber=42, endnumber=42, step=1,\n                       centroid=(10.0, 10.00001),\n                       geometry='POINT(10.0 10.00001)')\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    res = api.reverse((10.0, 10.0))\n    assert res.place_id == 992\n    assert res.housenumber == '42'\n\n\ndef test_reverse_tiger_number(apiobj, frontend):\n    apiobj.add_placex(place_id=990, class_='highway', type='service',\n                      rank_search=27, rank_address=27,\n                      name={'name': 'My Street'},\n                      centroid=(10.0, 10.0),\n                      country_code='us',\n                      geometry='LINESTRING(9.995 10, 10.005 10)')\n    apiobj.add_tiger(place_id=992,\n                     parent_place_id=990,\n                     startnumber=1, endnumber=3, step=1,\n                     centroid=(10.0, 10.00001),\n                     geometry='LINESTRING(9.995 10.00001, 10.005 10.00001)')\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    assert api.reverse((10.0, 10.0)).place_id == 992\n    assert api.reverse((10.0, 10.00001)).place_id == 992\n\n\ndef test_reverse_point_tiger(apiobj, frontend):\n    apiobj.add_placex(place_id=990, class_='highway', type='service',\n                      rank_search=27, rank_address=27,\n                      name={'name': 'My Street'},\n                      centroid=(10.0, 10.0),\n                      country_code='us',\n                      geometry='LINESTRING(9.995 10, 10.005 10)')\n    apiobj.add_tiger(place_id=992,\n                     parent_place_id=990,\n                     startnumber=1, endnumber=1, step=1,\n                     centroid=(10.0, 10.00001),\n                     geometry='POINT(10.0 10.00001)')\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    res = api.reverse((10.0, 10.0))\n    assert res.place_id == 992\n    assert res.housenumber == '1'\n\n\ndef test_reverse_low_zoom_address(apiobj, frontend):\n    apiobj.add_placex(place_id=1001, class_='place', type='house',\n                      housenumber='1',\n                      rank_address=30,\n                      rank_search=30,\n                      centroid=(59.3, 80.70001))\n    apiobj.add_placex(place_id=1002, class_='place', type='town',\n                      name={'name': 'Town'},\n                      rank_address=16,\n                      rank_search=16,\n                      centroid=(59.3, 80.70001),\n                      geometry=\"\"\"POLYGON((59.3 80.70001, 59.3001 80.70001,\n                                        59.3001 80.70101, 59.3 80.70101, 59.3 80.70001))\"\"\")\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    assert api.reverse((59.30005, 80.7005)).place_id == 1001\n    assert api.reverse((59.30005, 80.7005), max_rank=18).place_id == 1002\n\n\ndef test_reverse_place_node_in_area(apiobj, frontend):\n    apiobj.add_placex(place_id=1002, class_='place', type='town',\n                      name={'name': 'Town Area'},\n                      rank_address=16,\n                      rank_search=16,\n                      centroid=(59.3, 80.70001),\n                      geometry=\"\"\"POLYGON((59.3 80.70001, 59.3001 80.70001,\n                                        59.3001 80.70101, 59.3 80.70101, 59.3 80.70001))\"\"\")\n    apiobj.add_placex(place_id=1003, class_='place', type='suburb',\n                      name={'name': 'Suburb Point'},\n                      osm_type='N',\n                      rank_address=18,\n                      rank_search=18,\n                      centroid=(59.30004, 80.70055))\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    assert api.reverse((59.30004, 80.70055)).place_id == 1003\n\n\n@pytest.mark.parametrize('layer,place_id', [(napi.DataLayer.MANMADE, 225),\n                                            (napi.DataLayer.RAILWAY, 226),\n                                            (napi.DataLayer.NATURAL, 227),\n                                            (napi.DataLayer.MANMADE | napi.DataLayer.RAILWAY, 225),\n                                            (napi.DataLayer.MANMADE | napi.DataLayer.NATURAL, 225)])\ndef test_reverse_larger_area_layers(apiobj, frontend, layer, place_id):\n    apiobj.add_placex(place_id=225, class_='man_made', type='dam',\n                      name={'name': 'Dam'},\n                      rank_address=0,\n                      rank_search=25,\n                      centroid=(1.3, 0.70003))\n    apiobj.add_placex(place_id=226, class_='railway', type='yard',\n                      name={'name': 'Dam'},\n                      rank_address=0,\n                      rank_search=20,\n                      centroid=(1.3, 0.70004))\n    apiobj.add_placex(place_id=227, class_='natural', type='spring',\n                      name={'name': 'Dam'},\n                      rank_address=0,\n                      rank_search=16,\n                      centroid=(1.3, 0.70005))\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    assert api.reverse((1.3, 0.7), layers=layer).place_id == place_id\n\n\ndef test_reverse_country_lookup_no_objects(apiobj, frontend):\n    apiobj.add_country('xx', 'POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))')\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    assert api.reverse((0.5, 0.5)) is None\n\n\n@pytest.mark.parametrize('rank', [4, 30])\n@pytest.mark.parametrize('with_geom', [True, False])\ndef test_reverse_country_lookup_country_only(apiobj, frontend, rank, with_geom):\n    apiobj.add_country('xx', 'POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))')\n    apiobj.add_country('yy', 'POLYGON((10 0, 10 1, 11 1, 11 0, 10 0))')\n    apiobj.add_placex(place_id=225, class_='place', type='country',\n                      name={'name': 'My Country'},\n                      rank_address=4,\n                      rank_search=4,\n                      country_code='xx',\n                      centroid=(0.7, 0.7))\n\n    params = {'max_rank': rank}\n    if with_geom:\n        params['geometry_output'] = napi.GeometryFormat.TEXT\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    assert api.reverse((0.5, 0.5), **params).place_id == 225\n    assert api.reverse((10.5, 0.5), **params) is None\n\n\n@pytest.mark.parametrize('with_geom', [True, False])\ndef test_reverse_country_lookup_place_node_inside(apiobj, frontend, with_geom):\n    apiobj.add_country('xx', 'POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))')\n    apiobj.add_country('yy', 'POLYGON((10 0, 10 1, 11 1, 11 0, 10 0))')\n    apiobj.add_placex(place_id=225, class_='place', type='state',\n                      osm_type='N',\n                      name={'name': 'My State'},\n                      rank_address=6,\n                      rank_search=6,\n                      country_code='xx',\n                      centroid=(0.5, 0.505))\n    apiobj.add_placex(place_id=425, class_='place', type='state',\n                      osm_type='N',\n                      name={'name': 'Other State'},\n                      rank_address=6,\n                      rank_search=6,\n                      country_code='yy',\n                      centroid=(10.5, 0.505))\n\n    params = {'geometry_output': napi.GeometryFormat.KML} if with_geom else {}\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    assert api.reverse((0.5, 0.5), **params).place_id == 225\n    assert api.reverse((10.5, 0.5), **params).place_id == 425\n\n\n@pytest.mark.parametrize('gtype', list(napi.GeometryFormat))\ndef test_reverse_geometry_output_placex(apiobj, frontend, gtype):\n    apiobj.add_country('xx', 'POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))')\n    apiobj.add_placex(place_id=1001, class_='place', type='house',\n                      housenumber='1',\n                      rank_address=30,\n                      rank_search=30,\n                      centroid=(59.3, 80.70001))\n    apiobj.add_placex(place_id=1003, class_='place', type='suburb',\n                      name={'name': 'Suburb Point'},\n                      osm_type='N',\n                      rank_address=18,\n                      rank_search=18,\n                      country_code='xx',\n                      centroid=(0.5, 0.5))\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    assert api.reverse((59.3, 80.70001), geometry_output=gtype).place_id == 1001\n    assert api.reverse((0.5, 0.5), geometry_output=gtype).place_id == 1003\n\n\ndef test_reverse_simplified_geometry(apiobj, frontend):\n    apiobj.add_placex(place_id=1001, class_='place', type='house',\n                      housenumber='1',\n                      rank_address=30,\n                      rank_search=30,\n                      centroid=(59.3, 80.70001))\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    details = dict(geometry_output=napi.GeometryFormat.GEOJSON,\n                   geometry_simplification=0.1)\n    assert api.reverse((59.3, 80.70001), **details).place_id == 1001\n\n\ndef test_reverse_interpolation_geometry(apiobj, frontend):\n    apiobj.add_osmline(place_id=992,\n                       parent_place_id=990,\n                       startnumber=1, endnumber=3, step=1,\n                       centroid=(10.0, 10.00001),\n                       geometry='LINESTRING(9.995 10.00001, 10.005 10.00001)')\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    result = api.reverse((10.0, 10.0), geometry_output=napi.GeometryFormat.TEXT)\n\n    assert result.geometry['text'] == 'POINT(10 10.00001)'\n\n\ndef test_reverse_tiger_geometry(apiobj, frontend):\n    apiobj.add_placex(place_id=990, class_='highway', type='service',\n                      rank_search=27, rank_address=27,\n                      name={'name': 'My Street'},\n                      centroid=(10.0, 10.0),\n                      country_code='us',\n                      geometry='LINESTRING(9.995 10, 10.005 10)')\n    apiobj.add_tiger(place_id=992,\n                     parent_place_id=990,\n                     startnumber=1, endnumber=3, step=1,\n                     centroid=(10.0, 10.00001),\n                     geometry='LINESTRING(9.995 10.00001, 10.005 10.00001)')\n    apiobj.add_placex(place_id=1000, class_='highway', type='service',\n                      rank_search=27, rank_address=27,\n                      name={'name': 'My Street'},\n                      centroid=(11.0, 11.0),\n                      country_code='us',\n                      geometry='LINESTRING(10.995 11, 11.005 11)')\n    apiobj.add_tiger(place_id=1001,\n                     parent_place_id=1000,\n                     startnumber=1, endnumber=3, step=1,\n                     centroid=(11.0, 11.00001),\n                     geometry='LINESTRING(10.995 11.00001, 11.005 11.00001)')\n\n    api = frontend(apiobj, options=API_OPTIONS)\n\n    params = {'geometry_output': napi.GeometryFormat.GEOJSON}\n\n    output = api.reverse((10.0, 10.0), **params)\n    assert json.loads(output.geometry['geojson']) \\\n        == {'coordinates': [10, 10.00001], 'type': 'Point'}\n\n    output = api.reverse((11.0, 11.0), **params)\n    assert json.loads(output.geometry['geojson']) \\\n        == {'coordinates': [11, 11.00001], 'type': 'Point'}\n"
  },
  {
    "path": "test/python/api/test_api_search.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for search API calls.\n\nThese tests make sure that all Python code is correct and executable.\nFunctional tests can be found in the BDD test suite.\n\"\"\"\nimport pytest\n\nimport nominatim_api.logging as loglib\n\nAPI_OPTIONS = {'search'}\n\n\n@pytest.fixture(autouse=True)\ndef setup_icu_tokenizer(apiobj):\n    \"\"\" Setup the properties needed for using the ICU tokenizer.\n    \"\"\"\n    apiobj.add_data('properties',\n                    [{'property': 'tokenizer', 'value': 'icu'},\n                     {'property': 'tokenizer_import_normalisation', 'value': ':: lower();'},\n                     {'property': 'tokenizer_import_transliteration',\n                      'value': \"'1' > '/1/'; 'ä' > 'ä '\"},\n                     ])\n\n\ndef test_search_no_content(apiobj, frontend):\n    apiobj.add_word_table([])\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    assert api.search('foo') == []\n\n\ndef test_search_simple_word(apiobj, frontend):\n    apiobj.add_word_table([(55, 'test', 'W', 'test', None),\n                           (2, 'test', 'w', 'test', None)])\n\n    apiobj.add_placex(place_id=444, class_='place', type='village',\n                      centroid=(1.3, 0.7))\n    apiobj.add_search_name(444, names=[2, 55])\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    results = api.search('TEST')\n\n    assert [r.place_id for r in results] == [444]\n\n\n@pytest.mark.parametrize('logtype', ['text', 'html'])\ndef test_search_with_debug(apiobj, frontend, logtype):\n    apiobj.add_word_table([(55, 'test', 'W', 'test', None),\n                           (2, 'test', 'w', 'test', None)])\n\n    apiobj.add_placex(place_id=444, class_='place', type='village',\n                      centroid=(1.3, 0.7))\n    apiobj.add_search_name(444, names=[2, 55])\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    loglib.set_log_output(logtype)\n    api.search('TEST')\n\n    assert loglib.get_and_disable()\n\n\ndef test_address_no_content(apiobj, frontend):\n    apiobj.add_word_table([])\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    assert api.search_address(amenity='hotel',\n                              street='Main St 34',\n                              city='Happyville',\n                              county='Wideland',\n                              state='Praerie',\n                              postalcode='55648',\n                              country='xx') == []\n\n\n@pytest.mark.parametrize('atype,address,search', [('street', 26, 26),\n                                                  ('city', 16, 18),\n                                                  ('county', 12, 12),\n                                                  ('state', 8, 8)])\ndef test_address_simple_places(apiobj, frontend, atype, address, search):\n    apiobj.add_word_table([(55, 'test', 'W', 'test', None),\n                           (2, 'test', 'w', 'test', None)])\n\n    apiobj.add_placex(place_id=444,\n                      rank_address=address, rank_search=search,\n                      centroid=(1.3, 0.7))\n    apiobj.add_search_name(444, names=[2, 55], address_rank=address, search_rank=search)\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    results = api.search_address(**{atype: 'TEST'})\n\n    assert [r.place_id for r in results] == [444]\n\n\ndef test_address_country(apiobj, frontend):\n    apiobj.add_word_table([(None, 'ro', 'C', 'ro', {'cc': 'ro'})])\n    apiobj.add_country('ro', 'POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))')\n    apiobj.add_country_name('ro', {'name': 'România'})\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    assert len(api.search_address(country='ro')) == 1\n\n\ndef test_category_no_categories(apiobj, frontend):\n    apiobj.add_word_table([])\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    assert api.search_category([], near_query='Berlin') == []\n\n\ndef test_category_no_content(apiobj, frontend):\n    apiobj.add_word_table([])\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    assert api.search_category([('amenity', 'restaurant')]) == []\n\n\ndef test_category_simple_restaurant(apiobj, frontend):\n    apiobj.add_word_table([])\n\n    apiobj.add_placex(place_id=444, class_='amenity', type='restaurant',\n                      centroid=(1.3, 0.7))\n    apiobj.add_search_name(444, names=[2, 55], address_rank=16, search_rank=18)\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    results = api.search_category([('amenity', 'restaurant')],\n                                  near=(1.3, 0.701), near_radius=0.015)\n\n    assert [r.place_id for r in results] == [444]\n\n\ndef test_category_with_search_phrase(apiobj, frontend):\n    apiobj.add_word_table([(55, 'test', 'W', 'test', None),\n                           (2, 'test', 'w', 'test', None)])\n\n    apiobj.add_placex(place_id=444, class_='place', type='village',\n                      rank_address=16, rank_search=18,\n                      centroid=(1.3, 0.7))\n    apiobj.add_search_name(444, names=[2, 55], address_rank=16, search_rank=18)\n    apiobj.add_placex(place_id=95, class_='amenity', type='restaurant',\n                      centroid=(1.3, 0.7003))\n\n    api = frontend(apiobj, options=API_OPTIONS)\n    results = api.search_category([('amenity', 'restaurant')], near_query='TEST')\n\n    assert [r.place_id for r in results] == [95]\n"
  },
  {
    "path": "test/python/api/test_api_status.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for the status API call.\n\"\"\"\nimport asyncio\nimport datetime as dt\n\nimport pytest\n\nfrom nominatim_api.version import NOMINATIM_API_VERSION\nimport nominatim_api as napi\n\n\ndef test_status_no_extra_info(apiobj, frontend):\n    api = frontend(apiobj)\n    result = api.status()\n\n    assert result.status == 0\n    assert result.message == 'OK'\n    assert result.software_version == NOMINATIM_API_VERSION\n    assert result.database_version is None\n    assert result.data_updated is None\n\n\ndef test_status_full(apiobj, frontend):\n    import_date = dt.datetime(2022, 12, 7, 14, 14, 46, 0, tzinfo=dt.timezone.utc)\n    apiobj.add_data('import_status',\n                    [{'lastimportdate': import_date}])\n    apiobj.add_data('properties',\n                    [{'property': 'database_version', 'value': '99.5.4-2'}])\n\n    api = frontend(apiobj)\n    result = api.status()\n\n    assert result.status == 0\n    assert result.message == 'OK'\n    assert result.software_version == NOMINATIM_API_VERSION\n    assert result.database_version == '99.5.4-2'\n    assert result.data_updated == import_date\n\n\ndef test_status_database_not_found(monkeypatch):\n    monkeypatch.setenv('NOMINATIM_DATABASE_DSN', 'dbname=rgjdfkgjedkrgdfkngdfkg')\n\n    api = napi.NominatimAPI()\n\n    result = api.status()\n\n    assert result.status == 700\n    assert result.message == 'Database connection failed'\n    assert result.software_version == NOMINATIM_API_VERSION\n    assert result.database_version is None\n    assert result.data_updated is None\n\n\n@pytest.mark.asyncio\nasync def test_status_connection_timeout_single_pool(status_table, property_table, monkeypatch):\n    monkeypatch.setenv('NOMINATIM_API_POOL_SIZE', '1')\n    monkeypatch.setenv('NOMINATIM_REQUEST_TIMEOUT', '1')\n\n    async with napi.NominatimAPIAsync() as api:\n        async with api.begin():\n            with pytest.raises((TimeoutError, asyncio.TimeoutError)):\n                await api.status()\n\n        await api.status()\n\n\n@pytest.mark.asyncio\nasync def test_status_connection_timeout_multi_pool(status_table, property_table, monkeypatch):\n    monkeypatch.setenv('NOMINATIM_API_POOL_SIZE', '2')\n    monkeypatch.setenv('NOMINATIM_REQUEST_TIMEOUT', '1')\n\n    async with napi.NominatimAPIAsync() as api:\n        async with api.begin(), api.begin():\n            with pytest.raises((TimeoutError, asyncio.TimeoutError)):\n                await api.status()\n\n        await api.status()\n"
  },
  {
    "path": "test/python/api/test_api_types.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for loading of parameter dataclasses.\n\"\"\"\nimport pytest\n\nfrom nominatim_api.errors import UsageError\nimport nominatim_api.types as typ\n\n\ndef test_no_params_defaults():\n    params = typ.LookupDetails.from_kwargs({})\n\n    assert not params.parented_places\n    assert params.geometry_simplification == 0.0\n\n\n@pytest.mark.parametrize('k,v', [('geometry_output',  'a'),\n                                 ('linked_places', 0),\n                                 ('geometry_simplification', 'NaN')])\ndef test_bad_format_reverse(k, v):\n    with pytest.raises(UsageError):\n        typ.ReverseDetails.from_kwargs({k: v})\n\n\n@pytest.mark.parametrize('rin,rout', [(-23, 0), (0, 0), (1, 1),\n                                      (15, 15), (30, 30), (31, 30)])\ndef test_rank_params(rin, rout):\n    params = typ.ReverseDetails.from_kwargs({'max_rank': rin})\n\n    assert params.max_rank == rout\n\n\nclass TestFormatExcluded:\n\n    @pytest.mark.parametrize('inp', ['', None])\n    def test_empty_value(self, inp):\n        assert typ.format_excluded(inp) == []\n\n    @pytest.mark.parametrize('inp,expected', [\n        ('123', [typ.PlaceID(123)]),\n        ('123,456', [typ.PlaceID(123), typ.PlaceID(456)]),\n        ('N100', [typ.OsmID('N', 100)]),\n        ('W101', [typ.OsmID('W', 101)]),\n        ('R102', [typ.OsmID('R', 102)]),\n        ('N100,W101,R102', [typ.OsmID('N', 100), typ.OsmID('W', 101), typ.OsmID('R', 102)]),\n        ('n100', [typ.OsmID('N', 100)]),\n        ('123,N456,W789', [typ.PlaceID(123), typ.OsmID('N', 456), typ.OsmID('W', 789)]),\n        (' 123 , N456 ', [typ.PlaceID(123), typ.OsmID('N', 456)]),\n        ('123,,456', [typ.PlaceID(123), typ.PlaceID(456)]),\n        ('0', []),\n        ('N0', []),\n        ('000123', [typ.PlaceID(123)])\n    ])\n    def test_valid_exclude_ids(self, inp, expected):\n        assert typ.format_excluded(inp) == expected\n\n    @pytest.mark.parametrize('inp, bad_id', [\n        ('abc', 'abc'),\n        ('X999', 'X999'),\n        ('-540', '-540'),\n        ('N-100', 'N-100'),\n        ('123,abc,456', 'abc'),\n        ('N:100', 'N:100')\n        ])\n    def test_invalid_exclude_ids(self, inp, bad_id):\n        with pytest.raises(UsageError, match=f\"Invalid exclude ID: {bad_id}\"):\n            typ.format_excluded(inp)\n\n    @pytest.mark.parametrize('inp', [[12.5], [{'key': 'value'}], [[123, 456]]])\n    def test_invalid_list_element_type(self, inp):\n        with pytest.raises(UsageError, match=\"Parameter 'excluded' contains invalid types.\"):\n            typ.format_excluded(inp)\n"
  },
  {
    "path": "test/python/api/test_export.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for export CLI function.\n\"\"\"\nimport pytest\n\nimport nominatim_db.cli\n\n\n@pytest.fixture\ndef run_export(tmp_path, capsys):\n    def _exec(args):\n        cli_args = ['export', '--project-dir', str(tmp_path)] + args\n        assert 0 == nominatim_db.cli.nominatim(cli_args=cli_args)\n        return capsys.readouterr().out.split('\\r\\n')\n\n    return _exec\n\n\n@pytest.fixture(autouse=True)\ndef setup_database_with_context(apiobj):\n    apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,\n                      class_='highway', type='residential',  name='Street',\n                      country_code='pl', postcode='55674',\n                      rank_search=27, rank_address=26)\n    apiobj.add_address_placex(332, fromarea=False, isaddress=False,\n                              distance=0.0034,\n                              place_id=1000, osm_type='N', osm_id=3333,\n                              class_='place', type='suburb', name='Smallplace',\n                              country_code='pl', admin_level=13,\n                              rank_search=24, rank_address=23)\n    apiobj.add_address_placex(332, fromarea=True, isaddress=True,\n                              place_id=1001, osm_type='N', osm_id=3334,\n                              class_='place', type='city', name='Bigplace',\n                              country_code='pl',\n                              rank_search=17, rank_address=16)\n\n\ndef test_export_default(run_export):\n    csv = run_export([])\n\n    assert csv == ['street,suburb,city,county,state,country', 'Street,,Bigplace,,,', '']\n\n\ndef test_export_output_type(run_export):\n    csv = run_export(['--output-type', 'city'])\n\n    assert csv == ['street,suburb,city,county,state,country', ',,Bigplace,,,', '']\n\n\ndef test_export_output_format(run_export):\n    csv = run_export(['--output-format', 'placeid;street;nothing;postcode'])\n\n    assert csv == ['placeid,street,nothing,postcode', '332,Street,,55674', '']\n\n\ndef test_export_restrict_to_node_good(run_export):\n    csv = run_export(['--restrict-to-osm-node', '3334'])\n\n    assert csv == ['street,suburb,city,county,state,country', 'Street,,Bigplace,,,', '']\n\n\ndef test_export_restrict_to_node_not_address(run_export):\n    csv = run_export(['--restrict-to-osm-node', '3333'])\n\n    assert csv == ['street,suburb,city,county,state,country', '']\n"
  },
  {
    "path": "test/python/api/test_helpers_v1.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for the helper functions for v1 API.\n\"\"\"\nimport pytest\n\nimport nominatim_api.v1.helpers as helper\n\n\n@pytest.mark.parametrize('inp', ['',\n                                 'abc',\n                                 '12 23',\n                                 'abc -78.90, 12.456 def',\n                                 '40 N 60 W'])\ndef test_extract_coords_no_coords(inp):\n    query, x, y = helper.extract_coords_from_query(inp)\n\n    assert query == inp\n    assert x is None\n    assert y is None\n\n\ndef test_extract_coords_null_island():\n    assert ('', 0.0, 0.0) == helper.extract_coords_from_query('0.0 -0.0')\n\n\ndef test_extract_coords_with_text_before():\n    assert ('abc', 12.456, -78.90) == helper.extract_coords_from_query('abc  -78.90, 12.456')\n\n\ndef test_extract_coords_with_text_after():\n    assert ('abc', 12.456, -78.90) == helper.extract_coords_from_query('-78.90, 12.456   abc')\n\n\n@pytest.mark.parametrize('inp', [' [12.456,-78.90] ', ' 12.456,-78.90 '])\ndef test_extract_coords_with_spaces(inp):\n    assert ('', -78.90, 12.456) == helper.extract_coords_from_query(inp)\n\n\n@pytest.mark.parametrize('inp', ['40 26.767 N 79 58.933 W',\n                                 '40° 26.767′ N 79° 58.933′ W',\n                                 \"40° 26.767' N 79° 58.933' W\",\n                                 \"40° 26.767'\\n\"\n                                 \"    N 79° 58.933' W\",\n                                 'N 40 26.767, W 79 58.933',\n                                 'N 40°26.767′, W 79°58.933′',\n                                 '\tN 40°26.767′, W 79°58.933′',\n                                 \"N 40°26.767', W 79°58.933'\",\n\n                                 '40 26 46 N 79 58 56 W',\n                                 '40° 26′ 46″ N 79° 58′ 56″ W',\n                                 '40° 26′ 46.00″ N 79° 58′ 56.00″ W',\n                                 '40°26′46″N 79°58′56″W',\n                                 'N 40 26 46 W 79 58 56',\n                                 'N 40° 26′ 46″, W 79° 58′ 56″',\n                                 'N 40° 26\\' 46\", W 79° 58\\' 56\"',\n                                 'N 40° 26\\' 46\", W 79° 58\\' 56\"',\n\n                                 '40.446 -79.982',\n                                 '40.446,-79.982',\n                                 '40.446° N 79.982° W',\n                                 'N 40.446° W 79.982°',\n\n                                 '[40.446 -79.982]',\n                                 '[40.446,\u000b-79.982]',\n                                 '       40.446  ,   -79.982     ',\n                                 '       40.446  ,   -79.982     ',\n                                 '       40.446\t,   -79.982\t',\n                                 '       40.446\u000b,   -79.982\t'])\ndef test_extract_coords_formats(inp):\n    query, x, y = helper.extract_coords_from_query(inp)\n\n    assert query == ''\n    assert pytest.approx(x, abs=0.001) == -79.982\n    assert pytest.approx(y, abs=0.001) == 40.446\n\n    query, x, y = helper.extract_coords_from_query('foo bar ' + inp)\n\n    assert query == 'foo bar'\n    assert pytest.approx(x, abs=0.001) == -79.982\n    assert pytest.approx(y, abs=0.001) == 40.446\n\n    query, x, y = helper.extract_coords_from_query(inp + ' x')\n\n    assert query == 'x'\n    assert pytest.approx(x, abs=0.001) == -79.982\n    assert pytest.approx(y, abs=0.001) == 40.446\n\n\ndef test_extract_coords_formats_southeast():\n    query, x, y = helper.extract_coords_from_query('S 40 26.767, E 79 58.933')\n\n    assert query == ''\n    assert pytest.approx(x, abs=0.001) == 79.982\n    assert pytest.approx(y, abs=0.001) == -40.446\n\n\n@pytest.mark.parametrize('inp', ['[shop=fish] foo bar',\n                                 'foo [shop=fish] bar',\n                                 'foo [shop=fish]bar',\n                                 'foo bar [shop=fish]'])\ndef test_extract_category_good(inp):\n    query, cls, typ = helper.extract_category_from_query(inp)\n\n    assert query == 'foo bar'\n    assert cls == 'shop'\n    assert typ == 'fish'\n\n\ndef test_extract_category_only():\n    assert helper.extract_category_from_query('[shop=market]') == ('', 'shop', 'market')\n\n\n@pytest.mark.parametrize('inp', ['house []', 'nothing', '[352]'])\ndef test_extract_category_no_match(inp):\n    assert helper.extract_category_from_query(inp) == (inp, None, None)\n"
  },
  {
    "path": "test/python/api/test_localization.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTest functions for adapting results to the user's locale.\n\"\"\"\nimport pytest\n\nfrom nominatim_api import Locales\n\n\ndef test_display_name_empty_names():\n    loc = Locales(['en', 'de'])\n\n    assert loc.display_name(None) == ''\n    assert loc.display_name({}) == ''\n\n\ndef test_display_name_none_localized():\n    loc = Locales()\n\n    assert loc.display_name({}) == ''\n    assert loc.display_name({'name:de': 'DE', 'name': 'ALL'}) == 'ALL'\n    assert loc.display_name({'ref': '34', 'name:de': 'DE'}) == '34'\n\n\ndef test_output_names_none_localized():\n    loc = Locales()\n\n    expected_tags = [\n        'name', '_place_name'\n    ]\n\n    assert loc.name_tags == expected_tags, f'Expected {expected_tags}, but got {loc.name_tags}'\n\n\ndef test_output_names_none_localized_and_custom_output_names():\n    loc = Locales(names='name:XX,entrance:XX,name,brand,test_tag,'\n                  'official_name:XX,short_name:XX,alt_name:XX')\n\n    expected_tags = [\n        'name', '_place_name', 'brand', '_place_brand', 'test_tag', '_place_test_tag'\n    ]\n\n    assert loc.name_tags == expected_tags, f'Expected {expected_tags}, but got {loc.name_tags}'\n\n\ndef test_output_names_none_localized_and_custom_output_names_more_than_two_changes():\n    loc = Locales(names='name:XX,brand,test_tag:XX,official_name,short_name:XX,'\n                  'alt_name,another_tag_with:XX,another_tag_withoutXX')\n\n    expected_tags = [\n        'brand', '_place_brand', 'official_name', '_place_official_name', 'alt_name',\n        '_place_alt_name', 'another_tag_withoutXX', '_place_another_tag_withoutXX'\n    ]\n\n    assert loc.name_tags == expected_tags, f'Expected {expected_tags}, but got {loc.name_tags}'\n\n\ndef test_output_names_none_localized_and_custom_output_names_including_space():\n    loc = Locales(names='name:XX,name ,short_name:XX, short_name')\n\n    expected_tags = [\n        'name', '_place_name', 'short_name', '_place_short_name'\n    ]\n\n    assert loc.name_tags == expected_tags, f'Expected {expected_tags}, but got {loc.name_tags}'\n\n\ndef test_display_name_localized():\n    loc = Locales(['en', 'de'])\n\n    assert loc.display_name({}) == ''\n    assert loc.display_name({'name:de': 'DE', 'name': 'ALL'}) == 'DE'\n    assert loc.display_name({'ref': '34', 'name:de': 'DE'}) == 'DE'\n\n\ndef test_output_names_localized():\n    loc = Locales(['en', 'es'])\n\n    expected_tags = [\n        'name:en', '_place_name:en', 'name:es', '_place_name:es', 'name', '_place_name'\n    ]\n\n    assert loc.name_tags == expected_tags, f'Expected {expected_tags}, but got {loc.name_tags}'\n\n\ndef test_output_names_localized_and_empty_names():\n    loc = Locales(['en'], \"\")\n    expected_tags = []\n\n    assert loc.name_tags == expected_tags, f'Expected {expected_tags}, but got {loc.name_tags}'\n\n\ndef test_output_names_localized_and_custom_names_ordering_logic():\n    loc = Locales(['en', 'fr'], \"name:XX,ref\")\n\n    expected = [\n        'name:en', '_place_name:en',\n        'name:fr', '_place_name:fr',\n        'ref', '_place_ref'\n    ]\n    assert loc.name_tags == expected\n\n\ndef test_output_names_localized_and_custom_output_names_including_space():\n    loc = Locales(['en', 'es'], names='name:XX,name ,short_name:XX, short_name')\n\n    expected_tags = [\n        'name:en', '_place_name:en', 'name:es', '_place_name:es',\n        'name', '_place_name',\n        'short_name:en', '_place_short_name:en', 'short_name:es', '_place_short_name:es',\n        'short_name', '_place_short_name'\n    ]\n\n    assert loc.name_tags == expected_tags, f'Expected {expected_tags}, but got {loc.name_tags}'\n\n\ndef test_output_names_localized_and_custom_output_names():\n    loc = Locales(['en', 'es'], names='name:XX,entrance:XX,name,brand,test_tag,'\n                  'official_name:XX,short_name:XX,alt_name:XX')\n\n    expected_tags = [\n        'name:en', '_place_name:en', 'name:es', '_place_name:es', 'entrance:en',\n        '_place_entrance:en', 'entrance:es', '_place_entrance:es', 'name', '_place_name',\n        'brand', '_place_brand', 'test_tag', '_place_test_tag', 'official_name:en',\n        '_place_official_name:en', 'official_name:es', '_place_official_name:es',\n        'short_name:en', '_place_short_name:en', 'short_name:es', '_place_short_name:es',\n        'alt_name:en', '_place_alt_name:en', 'alt_name:es', '_place_alt_name:es'\n    ]\n\n    assert loc.name_tags == expected_tags, f'Expected {expected_tags}, but got {loc.name_tags}'\n\n\ndef test_output_names_localized_and_custom_output_names_start_with_tag_that_has_no_XX():\n    loc = Locales(['en', 'es'],\n                  names='name,brand,test_tag,official_name:XX,short_name:XX,alt_name:XX')\n\n    expected_tags = [\n        'name', '_place_name', 'brand', '_place_brand', 'test_tag', '_place_test_tag',\n        'official_name:en', '_place_official_name:en', 'official_name:es',\n        '_place_official_name:es', 'short_name:en', '_place_short_name:en', 'short_name:es',\n        '_place_short_name:es', 'alt_name:en', '_place_alt_name:en', 'alt_name:es',\n        '_place_alt_name:es'\n    ]\n\n    assert loc.name_tags == expected_tags, f'Expected {expected_tags}, but got {loc.name_tags}'\n\n\ndef test_output_names_localized_and_custom_output_names_no_named_tags():\n    loc = Locales(['en', 'es'], names='name,brand,test_tag')\n\n    expected_tags = [\n        'name', '_place_name', 'brand', '_place_brand', 'test_tag', '_place_test_tag'\n    ]\n\n    assert loc.name_tags == expected_tags, f'Expected {expected_tags}, but got {loc.name_tags}'\n\n\ndef test_output_names_localized_and_custom_output_names_only_named_tags():\n    loc = Locales(['en', 'es'],\n                  names='name:XX,entrance:XX,official_name:XX,short_name:XX,alt_name:XX')\n\n    expected_tags = [\n        'name:en', '_place_name:en', 'name:es', '_place_name:es', 'entrance:en',\n        '_place_entrance:en', 'entrance:es', '_place_entrance:es', 'official_name:en',\n        '_place_official_name:en', 'official_name:es', '_place_official_name:es',\n        'short_name:en', '_place_short_name:en', 'short_name:es', '_place_short_name:es',\n        'alt_name:en', '_place_alt_name:en', 'alt_name:es', '_place_alt_name:es'\n    ]\n\n    assert loc.name_tags == expected_tags, f'Expected {expected_tags}, but got {loc.name_tags}'\n\n\ndef test_output_names_localized_and_custom_output_names_more_than_two_changes():\n    loc = Locales(['en', 'es'], names='name:XX,brand,test_tag:XX,official_name,'\n                  'short_name:XX,alt_name,another_tag_with:XX,another_tag_withoutXX')\n\n    expected_tags = [\n        'name:en', '_place_name:en', 'name:es', '_place_name:es', 'brand', '_place_brand',\n        'test_tag:en', '_place_test_tag:en', 'test_tag:es', '_place_test_tag:es', 'official_name',\n        '_place_official_name', 'short_name:en', '_place_short_name:en', 'short_name:es',\n        '_place_short_name:es', 'alt_name', '_place_alt_name', 'another_tag_with:en',\n        '_place_another_tag_with:en', 'another_tag_with:es', '_place_another_tag_with:es',\n        'another_tag_withoutXX', '_place_another_tag_withoutXX'\n    ]\n\n    assert loc.name_tags == expected_tags, f'Expected {expected_tags}, but got {loc.name_tags}'\n\n\ndef test_output_names_localized_and_custom_output_names_XX_in_the_middle():\n    loc = Locales(['en', 'es'], names='name:XX,br:XXand,test_tag:XX,official_name,'\n                  'sh:XXort_name:XX,alt_name,another_tag_with:XX,another_tag_withoutXX')\n\n    expected_tags = [\n        'name:en', '_place_name:en', 'name:es', '_place_name:es', 'br:XXand', '_place_br:XXand',\n        'test_tag:en', '_place_test_tag:en', 'test_tag:es', '_place_test_tag:es', 'official_name',\n        '_place_official_name', 'sh:XXort_name:en', '_place_sh:XXort_name:en', 'sh:XXort_name:es',\n        '_place_sh:XXort_name:es', 'alt_name', '_place_alt_name', 'another_tag_with:en',\n        '_place_another_tag_with:en', 'another_tag_with:es', '_place_another_tag_with:es',\n        'another_tag_withoutXX', '_place_another_tag_withoutXX'\n    ]\n\n    assert loc.name_tags == expected_tags, f'Expected {expected_tags}, but got {loc.name_tags}'\n\n\ndef test_display_name_preference():\n    loc = Locales(['en', 'de'])\n\n    assert loc.display_name({}) == ''\n    assert loc.display_name({'name:de': 'DE', 'name:en': 'EN'}) == 'EN'\n    assert loc.display_name({'official_name:en': 'EN', 'name:de': 'DE'}) == 'DE'\n\n\n@pytest.mark.parametrize('langstr,langlist',\n                         [('fr', ['fr']),\n                          ('fr-FR', ['fr-FR', 'fr']),\n                          ('de,fr-FR', ['de', 'fr-FR', 'fr']),\n                          ('fr,de,fr-FR', ['fr', 'de', 'fr-FR']),\n                          ('en;q=0.5,fr', ['fr', 'en']),\n                          ('en;q=0.5,fr,en-US', ['fr', 'en-US', 'en']),\n                          ('en,fr;garbage,de', ['en', 'de'])])\ndef test_from_language_preferences(langstr, langlist):\n    assert Locales.from_accept_languages(langstr).languages == langlist\n"
  },
  {
    "path": "test/python/api/test_result_formatting_v1.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for formatting results for the V1 API.\n\nThese test only ensure that the Python code is correct.\nFor functional tests see BDD test suite.\n\"\"\"\nimport datetime as dt\nimport json\nimport xml.etree.ElementTree as ET\n\nimport pytest\n\nfrom nominatim_api.v1.format import dispatch as v1_format\nimport nominatim_api as napi\n\nSTATUS_FORMATS = {'text', 'json'}\n\n# StatusResult\n\n\ndef test_status_format_list():\n    assert set(v1_format.list_formats(napi.StatusResult)) == STATUS_FORMATS\n\n\n@pytest.mark.parametrize('fmt', list(STATUS_FORMATS))\ndef test_status_supported(fmt):\n    assert v1_format.supports_format(napi.StatusResult, fmt)\n\n\ndef test_status_unsupported():\n    assert not v1_format.supports_format(napi.StatusResult, 'gagaga')\n\n\ndef test_status_format_text():\n    assert v1_format.format_result(napi.StatusResult(0, 'message here'), 'text', {}) \\\n        == 'OK'\n\n\ndef test_status_format_error_text():\n    assert v1_format.format_result(napi.StatusResult(500, 'message here'), 'text', {}) \\\n        == 'ERROR: message here'\n\n\ndef test_status_format_json_minimal():\n    status = napi.StatusResult(700, 'Bad format.')\n\n    result = v1_format.format_result(status, 'json', {})\n\n    assert json.loads(result) == {'status': 700,\n                                  'message': 'Bad format.',\n                                  'software_version': napi.__version__}\n\n\ndef test_status_format_json_full():\n    status = napi.StatusResult(0, 'OK')\n    status.data_updated = dt.datetime(2010, 2, 7, 20, 20, 3, 0, tzinfo=dt.timezone.utc)\n    status.database_version = '5.6'\n\n    result = v1_format.format_result(status, 'json', {})\n\n    assert json.loads(result) == {'status': 0,\n                                  'message': 'OK',\n                                  'data_updated': '2010-02-07T20:20:03+00:00',\n                                  'software_version': napi.__version__,\n                                  'database_version': '5.6'}\n\n\n# DetailedResult\n\ndef test_search_details_minimal():\n    search = napi.DetailedResult(napi.SourceTable.PLACEX,\n                                 ('place', 'thing'),\n                                 napi.Point(1.0, 2.0))\n\n    result = v1_format.format_result(search, 'json', {})\n\n    assert json.loads(result) == \\\n           {'category': 'place',\n            'type': 'thing',\n            'admin_level': 15,\n            'names': {},\n            'localname': '',\n            'calculated_importance': pytest.approx(0.00001),\n            'rank_address': 30,\n            'rank_search': 30,\n            'isarea': False,\n            'addresstags': {},\n            'extratags': {},\n            'centroid': {'type': 'Point', 'coordinates': [1.0, 2.0]},\n            'geometry': {'type': 'Point', 'coordinates': [1.0, 2.0]},\n            }\n\n\ndef test_search_details_full():\n    import_date = dt.datetime(2010, 2, 7, 20, 20, 3, 0, tzinfo=dt.timezone.utc)\n    search = napi.DetailedResult(\n                  source_table=napi.SourceTable.PLACEX,\n                  category=('amenity', 'bank'),\n                  centroid=napi.Point(56.947, -87.44),\n                  place_id=37563,\n                  parent_place_id=114,\n                  linked_place_id=55693,\n                  osm_object=('W', 442100),\n                  admin_level=14,\n                  names={'name': 'Bank', 'name:fr': 'Banque'},\n                  address={'city': 'Niento', 'housenumber': '  3'},\n                  extratags={'atm': 'yes'},\n                  housenumber='3',\n                  postcode='556 X23',\n                  wikipedia='en:Bank',\n                  rank_address=29,\n                  rank_search=28,\n                  importance=0.0443,\n                  country_code='ll',\n                  indexed_date=import_date\n                  )\n    napi.Locales().localize_results([search])\n\n    result = v1_format.format_result(search, 'json', {})\n\n    assert json.loads(result) == \\\n           {'place_id': 37563,\n            'parent_place_id': 114,\n            'osm_type': 'W',\n            'osm_id': 442100,\n            'category': 'amenity',\n            'type': 'bank',\n            'admin_level': 14,\n            'localname': 'Bank',\n            'names': {'name': 'Bank', 'name:fr': 'Banque'},\n            'addresstags': {'city': 'Niento', 'housenumber': '  3'},\n            'housenumber': '3',\n            'calculated_postcode': '556 X23',\n            'country_code': 'll',\n            'indexed_date': '2010-02-07T20:20:03+00:00',\n            'importance': pytest.approx(0.0443),\n            'calculated_importance': pytest.approx(0.0443),\n            'extratags': {'atm': 'yes'},\n            'calculated_wikipedia': 'en:Bank',\n            'rank_address': 29,\n            'rank_search': 28,\n            'isarea': False,\n            'centroid': {'type': 'Point', 'coordinates': [56.947, -87.44]},\n            'geometry': {'type': 'Point', 'coordinates': [56.947, -87.44]},\n            }\n\n\n@pytest.mark.parametrize('gtype,isarea', [('ST_Point', False),\n                                          ('ST_LineString', False),\n                                          ('ST_Polygon', True),\n                                          ('ST_MultiPolygon', True)])\ndef test_search_details_no_geometry(gtype, isarea):\n    search = napi.DetailedResult(napi.SourceTable.PLACEX,\n                                 ('place', 'thing'),\n                                 napi.Point(1.0, 2.0),\n                                 geometry={'type': gtype})\n\n    result = v1_format.format_result(search, 'json', {})\n    js = json.loads(result)\n\n    assert js['geometry'] == {'type': 'Point', 'coordinates': [1.0, 2.0]}\n    assert js['isarea'] == isarea\n\n\ndef test_search_details_with_geometry():\n    search = napi.DetailedResult(\n        napi.SourceTable.PLACEX,\n        ('place', 'thing'),\n        napi.Point(1.0, 2.0),\n        geometry={'geojson': '{\"type\":\"Point\",\"coordinates\":[56.947,-87.44]}'})\n\n    result = v1_format.format_result(search, 'json', {})\n    js = json.loads(result)\n\n    assert js['geometry'] == {'type': 'Point', 'coordinates': [56.947, -87.44]}\n    assert js['isarea'] is False\n\n\ndef test_search_details_with_icon_available():\n    search = napi.DetailedResult(napi.SourceTable.PLACEX,\n                                 ('amenity', 'restaurant'),\n                                 napi.Point(1.0, 2.0))\n\n    result = v1_format.format_result(search, 'json', {'icon_base_url': 'foo'})\n    js = json.loads(result)\n\n    assert js['icon'] == 'foo/food_restaurant.p.20.png'\n\n\ndef test_search_details_with_icon_not_available():\n    search = napi.DetailedResult(napi.SourceTable.PLACEX,\n                                 ('amenity', 'tree'),\n                                 napi.Point(1.0, 2.0))\n\n    result = v1_format.format_result(search, 'json', {'icon_base_url': 'foo'})\n    js = json.loads(result)\n\n    assert 'icon' not in js\n\n\ndef test_search_details_with_address_minimal():\n    search = napi.DetailedResult(napi.SourceTable.PLACEX,\n                                 ('place', 'thing'),\n                                 napi.Point(1.0, 2.0),\n                                 address_rows=[\n                                   napi.AddressLine(place_id=None,\n                                                    osm_object=None,\n                                                    category=('bnd', 'note'),\n                                                    names={},\n                                                    extratags=None,\n                                                    admin_level=None,\n                                                    fromarea=False,\n                                                    isaddress=False,\n                                                    rank_address=10,\n                                                    distance=0.0)\n                                 ])\n\n    result = v1_format.format_result(search, 'json', {})\n    js = json.loads(result)\n\n    assert js['address'] == [{'localname': '',\n                              'class': 'bnd',\n                              'type': 'note',\n                              'rank_address': 10,\n                              'distance': 0.0,\n                              'isaddress': False}]\n\n\n@pytest.mark.parametrize('field,outfield', [('address_rows', 'address'),\n                                            ('linked_rows', 'linked_places'),\n                                            ('parented_rows', 'hierarchy')\n                                            ])\ndef test_search_details_with_further_infos(field, outfield):\n    search = napi.DetailedResult(napi.SourceTable.PLACEX,\n                                 ('place', 'thing'),\n                                 napi.Point(1.0, 2.0))\n\n    setattr(search, field, [napi.AddressLine(place_id=3498,\n                                             osm_object=('R', 442),\n                                             category=('bnd', 'note'),\n                                             names={'name': 'Trespass'},\n                                             extratags={'access': 'no',\n                                                        'place_type': 'spec'},\n                                             admin_level=4,\n                                             fromarea=True,\n                                             isaddress=True,\n                                             rank_address=10,\n                                             distance=0.034)\n                            ])\n\n    result = v1_format.format_result(search, 'json', {})\n    js = json.loads(result)\n\n    assert js[outfield] == [{'localname': 'Trespass',\n                             'place_id': 3498,\n                             'osm_id': 442,\n                             'osm_type': 'R',\n                             'place_type': 'spec',\n                             'class': 'bnd',\n                             'type': 'note',\n                             'admin_level': 4,\n                             'rank_address': 10,\n                             'distance': 0.034,\n                             'isaddress': True}]\n\n\ndef test_search_details_grouped_hierarchy():\n    search = napi.DetailedResult(napi.SourceTable.PLACEX,\n                                 ('place', 'thing'),\n                                 napi.Point(1.0, 2.0),\n                                 parented_rows=[napi.AddressLine(\n                                    place_id=3498,\n                                    osm_object=('R', 442),\n                                    category=('bnd', 'note'),\n                                    names={'name': 'Trespass'},\n                                    extratags={'access': 'no',\n                                               'place_type': 'spec'},\n                                    admin_level=4,\n                                    fromarea=True,\n                                    isaddress=True,\n                                    rank_address=10,\n                                    distance=0.034)])\n\n    result = v1_format.format_result(search, 'json', {'group_hierarchy': True})\n    js = json.loads(result)\n\n    assert js['hierarchy'] == {'note': [{'localname': 'Trespass',\n                                         'place_id': 3498,\n                                         'osm_id': 442,\n                                         'osm_type': 'R',\n                                         'place_type': 'spec',\n                                         'class': 'bnd',\n                                         'type': 'note',\n                                         'admin_level': 4,\n                                         'rank_address': 10,\n                                         'distance': 0.034,\n                                         'isaddress': True}]}\n\n\ndef test_search_details_keywords_name():\n    search = napi.DetailedResult(napi.SourceTable.PLACEX,\n                                 ('place', 'thing'),\n                                 napi.Point(1.0, 2.0),\n                                 name_keywords=[\n                                     napi.WordInfo(23, 'foo', 'mefoo'),\n                                     napi.WordInfo(24, 'foo', 'bafoo')])\n\n    result = v1_format.format_result(search, 'json', {'keywords': True})\n    js = json.loads(result)\n\n    assert js['keywords'] == {'name': [{'id': 23, 'token': 'foo'},\n                                       {'id': 24, 'token': 'foo'}],\n                              'address': []}\n\n\ndef test_search_details_keywords_address():\n    search = napi.DetailedResult(napi.SourceTable.PLACEX,\n                                 ('place', 'thing'),\n                                 napi.Point(1.0, 2.0),\n                                 address_keywords=[\n                                     napi.WordInfo(23, 'foo', 'mefoo'),\n                                     napi.WordInfo(24, 'foo', 'bafoo')])\n\n    result = v1_format.format_result(search, 'json', {'keywords': True})\n    js = json.loads(result)\n\n    assert js['keywords'] == {'address': [{'id': 23, 'token': 'foo'},\n                                          {'id': 24, 'token': 'foo'}],\n                              'name': []}\n\n\n# admin_level injection into extratags\n\nSEARCH_FORMATS = ['json', 'jsonv2', 'geojson', 'geocodejson', 'xml']\n\n\n@pytest.mark.parametrize('fmt', SEARCH_FORMATS)\ndef test_search_extratags_boundary_administrative_injects_admin_level(fmt):\n    search = napi.SearchResult(napi.SourceTable.PLACEX,\n                               ('boundary', 'administrative'),\n                               napi.Point(1.0, 2.0),\n                               admin_level=6,\n                               extratags={'place': 'city'})\n\n    raw = v1_format.format_result(napi.SearchResults([search]), fmt,\n                                  {'extratags': True})\n\n    if fmt == 'xml':\n        root = ET.fromstring(raw)\n        tags = {tag.attrib['key']: tag.attrib['value']\n                for tag in root.find('.//extratags').findall('tag')}\n        assert tags['admin_level'] == '6'\n        assert tags['place'] == 'city'\n    else:\n        result = json.loads(raw)\n        if fmt == 'geocodejson':\n            extra = result['features'][0]['properties']['geocoding']['extra']\n        elif fmt == 'geojson':\n            extra = result['features'][0]['properties']['extratags']\n        else:\n            extra = result[0]['extratags']\n\n        assert extra['admin_level'] == '6'\n        assert extra['place'] == 'city'\n\n\n@pytest.mark.parametrize('fmt', SEARCH_FORMATS)\ndef test_search_extratags_non_boundary_no_admin_level_injection(fmt):\n    search = napi.SearchResult(napi.SourceTable.PLACEX,\n                               ('place', 'city'),\n                               napi.Point(1.0, 2.0),\n                               admin_level=8,\n                               extratags={'place': 'city'})\n\n    raw = v1_format.format_result(napi.SearchResults([search]), fmt,\n                                  {'extratags': True})\n\n    if fmt == 'xml':\n        root = ET.fromstring(raw)\n        tags = {tag.attrib['key']: tag.attrib['value']\n                for tag in root.find('.//extratags').findall('tag')}\n        assert 'admin_level' not in tags\n        assert tags['place'] == 'city'\n    else:\n        result = json.loads(raw)\n        if fmt == 'geocodejson':\n            extra = result['features'][0]['properties']['geocoding']['extra']\n        elif fmt == 'geojson':\n            extra = result['features'][0]['properties']['extratags']\n        else:\n            extra = result[0]['extratags']\n\n        assert 'admin_level' not in extra\n        assert extra['place'] == 'city'\n\n\n@pytest.mark.parametrize('fmt', SEARCH_FORMATS)\ndef test_search_extratags_boundary_admin_level_15_no_injection(fmt):\n    search = napi.SearchResult(napi.SourceTable.PLACEX,\n                               ('boundary', 'administrative'),\n                               napi.Point(1.0, 2.0),\n                               admin_level=15,\n                               extratags={'place': 'city'})\n\n    raw = v1_format.format_result(napi.SearchResults([search]), fmt,\n                                  {'extratags': True})\n\n    if fmt == 'xml':\n        root = ET.fromstring(raw)\n        tags = {tag.attrib['key']: tag.attrib['value']\n                for tag in root.find('.//extratags').findall('tag')}\n        assert 'admin_level' not in tags\n        assert tags['place'] == 'city'\n    else:\n        result = json.loads(raw)\n        if fmt == 'geocodejson':\n            extra = result['features'][0]['properties']['geocoding']['extra']\n        elif fmt == 'geojson':\n            extra = result['features'][0]['properties']['extratags']\n        else:\n            extra = result[0]['extratags']\n\n        assert 'admin_level' not in extra\n        assert extra['place'] == 'city'\n"
  },
  {
    "path": "test/python/api/test_result_formatting_v1_reverse.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for formatting reverse results for the V1 API.\n\nThese test only ensure that the Python code is correct.\nFor functional tests see BDD test suite.\n\"\"\"\nimport json\nimport xml.etree.ElementTree as ET\n\nimport pytest\n\nfrom nominatim_api.v1.format import dispatch as v1_format\nimport nominatim_api as napi\n\nFORMATS = ['json', 'jsonv2', 'geojson', 'geocodejson', 'xml']\n\n\n@pytest.mark.parametrize('fmt', FORMATS)\ndef test_format_reverse_minimal(fmt):\n    reverse = napi.ReverseResult(napi.SourceTable.PLACEX,\n                                 ('amenity', 'post_box'),\n                                 napi.Point(0.3, -8.9))\n\n    raw = v1_format.format_result(napi.ReverseResults([reverse]), fmt, {})\n\n    if fmt == 'xml':\n        root = ET.fromstring(raw)\n        assert root.tag == 'reversegeocode'\n    else:\n        result = json.loads(raw)\n        assert isinstance(result, dict)\n\n\n@pytest.mark.parametrize('fmt', FORMATS)\ndef test_format_reverse_no_result(fmt):\n    raw = v1_format.format_result(napi.ReverseResults(), fmt, {})\n\n    if fmt == 'xml':\n        root = ET.fromstring(raw)\n        assert root.find('error').text == 'Unable to geocode'\n    else:\n        assert json.loads(raw) == {'error': 'Unable to geocode'}\n\n\n@pytest.mark.parametrize('fmt', FORMATS)\ndef test_format_reverse_with_osm_id(fmt):\n    reverse = napi.ReverseResult(napi.SourceTable.PLACEX,\n                                 ('amenity', 'post_box'),\n                                 napi.Point(0.3, -8.9),\n                                 place_id=5564,\n                                 osm_object=('N', 23))\n\n    raw = v1_format.format_result(napi.ReverseResults([reverse]), fmt, {})\n\n    if fmt == 'xml':\n        root = ET.fromstring(raw).find('result')\n        assert root.attrib['osm_type'] == 'node'\n        assert root.attrib['osm_id'] == '23'\n    else:\n        result = json.loads(raw)\n        if fmt == 'geocodejson':\n            props = result['features'][0]['properties']['geocoding']\n        elif fmt == 'geojson':\n            props = result['features'][0]['properties']\n        else:\n            props = result\n        assert props['osm_type'] == 'node'\n        assert props['osm_id'] == 23\n\n\n@pytest.mark.parametrize('fmt', FORMATS)\ndef test_format_reverse_with_address(fmt):\n    reverse = napi.ReverseResult(napi.SourceTable.PLACEX,\n                                 ('place', 'thing'),\n                                 napi.Point(1.0, 2.0),\n                                 country_code='fe',\n                                 address_rows=napi.AddressLines([\n                                   napi.AddressLine(place_id=None,\n                                                    osm_object=None,\n                                                    category=('place', 'county'),\n                                                    names={'name': 'Hello'},\n                                                    extratags=None,\n                                                    admin_level=5,\n                                                    fromarea=False,\n                                                    isaddress=True,\n                                                    rank_address=10,\n                                                    distance=0.0),\n                                   napi.AddressLine(place_id=None,\n                                                    osm_object=None,\n                                                    category=('place', 'county'),\n                                                    names={'name': 'ByeBye'},\n                                                    extratags=None,\n                                                    admin_level=5,\n                                                    fromarea=False,\n                                                    isaddress=False,\n                                                    rank_address=10,\n                                                    distance=0.0)\n                                 ]))\n    napi.Locales().localize_results([reverse])\n\n    raw = v1_format.format_result(napi.ReverseResults([reverse]), fmt,\n                                  {'addressdetails': True})\n    if fmt == 'xml':\n        root = ET.fromstring(raw)\n        assert root.find('addressparts').find('county').text == 'Hello'\n    else:\n        result = json.loads(raw)\n        assert isinstance(result, dict)\n\n        if fmt == 'geocodejson':\n            props = result['features'][0]['properties']['geocoding']\n            assert 'admin' in props\n            assert props['county'] == 'Hello'\n        else:\n            if fmt == 'geojson':\n                props = result['features'][0]['properties']\n            else:\n                props = result\n            assert 'address' in props\n\n\ndef test_format_reverse_geocodejson_special_parts():\n    reverse = napi.ReverseResult(napi.SourceTable.PLACEX,\n                                 ('place', 'house'),\n                                 napi.Point(1.0, 2.0),\n                                 place_id=33,\n                                 country_code='fe',\n                                 address_rows=napi.AddressLines([\n                                   napi.AddressLine(place_id=None,\n                                                    osm_object=None,\n                                                    category=('place', 'house_number'),\n                                                    names={'ref': '1'},\n                                                    extratags=None,\n                                                    admin_level=15,\n                                                    fromarea=False,\n                                                    isaddress=True,\n                                                    rank_address=10,\n                                                    distance=0.0),\n                                   napi.AddressLine(place_id=None,\n                                                    osm_object=None,\n                                                    category=('place', 'postcode'),\n                                                    names={'ref': '99446'},\n                                                    extratags=None,\n                                                    admin_level=11,\n                                                    fromarea=False,\n                                                    isaddress=True,\n                                                    rank_address=10,\n                                                    distance=0.0),\n                                   napi.AddressLine(place_id=33,\n                                                    osm_object=None,\n                                                    category=('place', 'county'),\n                                                    names={'name': 'Hello'},\n                                                    extratags=None,\n                                                    admin_level=5,\n                                                    fromarea=False,\n                                                    isaddress=True,\n                                                    rank_address=10,\n                                                    distance=0.0)\n                                 ]))\n\n    napi.Locales().localize_results([reverse])\n\n    raw = v1_format.format_result(napi.ReverseResults([reverse]), 'geocodejson',\n                                  {'addressdetails': True})\n\n    props = json.loads(raw)['features'][0]['properties']['geocoding']\n    assert props['housenumber'] == '1'\n    assert props['postcode'] == '99446'\n    assert 'county' not in props\n\n\n@pytest.mark.parametrize('fmt', FORMATS)\ndef test_format_reverse_with_address_none(fmt):\n    reverse = napi.ReverseResult(napi.SourceTable.PLACEX,\n                                 ('place', 'thing'),\n                                 napi.Point(1.0, 2.0),\n                                 address_rows=napi.AddressLines())\n\n    raw = v1_format.format_result(napi.ReverseResults([reverse]), fmt,\n                                  {'addressdetails': True})\n\n    if fmt == 'xml':\n        root = ET.fromstring(raw)\n        assert root.find('addressparts') is None\n    else:\n        result = json.loads(raw)\n        assert isinstance(result, dict)\n\n        if fmt == 'geocodejson':\n            props = result['features'][0]['properties']['geocoding']\n            print(props)\n            assert 'admin' in props\n        else:\n            if fmt == 'geojson':\n                props = result['features'][0]['properties']\n            else:\n                props = result\n            assert 'address' in props\n\n\n@pytest.mark.parametrize('fmt', ['json', 'jsonv2', 'geojson', 'xml'])\ndef test_format_reverse_with_extratags(fmt):\n    reverse = napi.ReverseResult(napi.SourceTable.PLACEX,\n                                 ('place', 'thing'),\n                                 napi.Point(1.0, 2.0),\n                                 extratags={'one': 'A', 'two': 'B'})\n\n    raw = v1_format.format_result(napi.ReverseResults([reverse]), fmt,\n                                  {'extratags': True})\n\n    if fmt == 'xml':\n        root = ET.fromstring(raw)\n        assert root.find('extratags').find('tag').attrib['key'] == 'one'\n    else:\n        result = json.loads(raw)\n        if fmt == 'geojson':\n            extra = result['features'][0]['properties']['extratags']\n        else:\n            extra = result['extratags']\n\n        assert extra == {'one': 'A', 'two': 'B'}\n\n\n@pytest.mark.parametrize('fmt', ['json', 'jsonv2', 'geojson', 'xml'])\ndef test_format_reverse_with_extratags_none(fmt):\n    reverse = napi.ReverseResult(napi.SourceTable.PLACEX,\n                                 ('place', 'thing'),\n                                 napi.Point(1.0, 2.0))\n\n    raw = v1_format.format_result(napi.ReverseResults([reverse]), fmt,\n                                  {'extratags': True})\n\n    if fmt == 'xml':\n        root = ET.fromstring(raw)\n        assert root.find('extratags') is not None\n    else:\n        result = json.loads(raw)\n        if fmt == 'geojson':\n            extra = result['features'][0]['properties']['extratags']\n        else:\n            extra = result['extratags']\n\n        assert extra is None\n\n\n@pytest.mark.parametrize('fmt', ['json', 'jsonv2', 'geojson', 'xml'])\ndef test_format_reverse_with_namedetails_with_name(fmt):\n    reverse = napi.ReverseResult(napi.SourceTable.PLACEX,\n                                 ('place', 'thing'),\n                                 napi.Point(1.0, 2.0),\n                                 names={'name': 'A', 'ref': '1'})\n\n    raw = v1_format.format_result(napi.ReverseResults([reverse]), fmt,\n                                  {'namedetails': True})\n\n    if fmt == 'xml':\n        root = ET.fromstring(raw)\n        assert root.find('namedetails').find('name').text == 'A'\n    else:\n        result = json.loads(raw)\n        if fmt == 'geojson':\n            extra = result['features'][0]['properties']['namedetails']\n        else:\n            extra = result['namedetails']\n\n        assert extra == {'name': 'A', 'ref': '1'}\n\n\n@pytest.mark.parametrize('fmt', ['json', 'jsonv2', 'geojson', 'xml'])\ndef test_format_reverse_with_namedetails_without_name(fmt):\n    reverse = napi.ReverseResult(napi.SourceTable.PLACEX,\n                                 ('place', 'thing'),\n                                 napi.Point(1.0, 2.0))\n\n    raw = v1_format.format_result(napi.ReverseResults([reverse]), fmt,\n                                  {'namedetails': True})\n\n    if fmt == 'xml':\n        root = ET.fromstring(raw)\n        assert root.find('namedetails') is not None\n    else:\n        result = json.loads(raw)\n        if fmt == 'geojson':\n            extra = result['features'][0]['properties']['namedetails']\n        else:\n            extra = result['namedetails']\n\n        assert extra is None\n\n\n@pytest.mark.parametrize('fmt', ['json', 'jsonv2'])\ndef test_search_details_with_icon_available(fmt):\n    reverse = napi.ReverseResult(napi.SourceTable.PLACEX,\n                                 ('amenity', 'restaurant'),\n                                 napi.Point(1.0, 2.0))\n\n    result = v1_format.format_result(napi.ReverseResults([reverse]), fmt,\n                                     {'icon_base_url': 'foo'})\n\n    js = json.loads(result)\n\n    assert js['icon'] == 'foo/food_restaurant.p.20.png'\n\n\n@pytest.mark.parametrize('fmt', ['json', 'jsonv2'])\ndef test_search_details_with_icon_not_available(fmt):\n    reverse = napi.ReverseResult(napi.SourceTable.PLACEX,\n                                 ('amenity', 'tree'),\n                                 napi.Point(1.0, 2.0))\n\n    result = v1_format.format_result(napi.ReverseResults([reverse]), fmt,\n                                     {'icon_base_url': 'foo'})\n\n    assert 'icon' not in json.loads(result)\n"
  },
  {
    "path": "test/python/api/test_results.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for result datatype helper functions.\n\"\"\"\nimport struct\nfrom binascii import hexlify\n\nimport pytest\n\nfrom nominatim_api import SourceTable, DetailedResult, Point\nimport nominatim_api.results as nresults\n\n\ndef mkpoint(x, y):\n    return hexlify(struct.pack(\"=biidd\", 1, 0x20000001, 4326, x, y)).decode('utf-8')\n\n\nclass FakeRow:\n    def __init__(self, **kwargs):\n        if 'parent_place_id' not in kwargs:\n            kwargs['parent_place_id'] = None\n        for k, v in kwargs.items():\n            setattr(self, k, v)\n        self._mapping = kwargs\n\n\ndef test_minimal_detailed_result():\n    res = DetailedResult(SourceTable.PLACEX,\n                         ('amenity', 'post_box'),\n                         Point(23.1, 0.5))\n\n    assert res.lon == 23.1\n    assert res.lat == 0.5\n    assert res.calculated_importance() == pytest.approx(0.00001)\n\n\ndef test_detailed_result_custom_importance():\n    res = DetailedResult(SourceTable.PLACEX,\n                         ('amenity', 'post_box'),\n                         Point(23.1, 0.5),\n                         importance=0.4563)\n\n    assert res.calculated_importance() == 0.4563\n\n\n@pytest.mark.parametrize('func', (nresults.create_from_osmline_row,\n                                  nresults.create_from_tiger_row))\ndef test_create_row_with_housenumber(func):\n    row = FakeRow(place_id=2345, osm_type='W', osm_id=111, housenumber=4,\n                  address=None, postcode='99900', country_code='xd',\n                  centroid=mkpoint(0, 0))\n\n    res = func(row, DetailedResult)\n\n    assert res.housenumber == '4'\n    assert res.extratags is None\n    assert res.category == ('place', 'house')\n\n\n@pytest.mark.parametrize('func', (nresults.create_from_osmline_row,\n                                  nresults.create_from_tiger_row))\ndef test_create_row_without_housenumber(func):\n    row = FakeRow(place_id=2345, osm_type='W', osm_id=111,\n                  startnumber=1, endnumber=11, step=2,\n                  address=None, postcode='99900', country_code='xd',\n                  centroid=mkpoint(0, 0))\n\n    res = func(row, DetailedResult)\n\n    assert res.housenumber is None\n    assert res.extratags == {'startnumber': '1', 'endnumber': '11', 'step': '2'}\n    assert res.category == ('place', 'houses')\n"
  },
  {
    "path": "test/python/api/test_server_glue_v1.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for the Python web frameworks adaptor, v1 API.\n\"\"\"\nimport json\nimport xml.etree.ElementTree as ET\n\nimport pytest\n\nfrom fake_adaptor import FakeAdaptor, FakeError, FakeResponse\n\nimport nominatim_api.v1.server_glue as glue\nimport nominatim_api as napi\nimport nominatim_api.logging as loglib\n\n\n# ASGIAdaptor.get_int/bool()\n\n@pytest.mark.parametrize('func', ['get_int', 'get_bool'])\ndef test_adaptor_get_int_missing_but_required(func):\n    with pytest.raises(FakeError, match='^400 -- .*missing'):\n        getattr(FakeAdaptor(), func)('something')\n\n\n@pytest.mark.parametrize('func, val', [('get_int', 23), ('get_bool', True)])\ndef test_adaptor_get_int_missing_with_default(func, val):\n    assert getattr(FakeAdaptor(), func)('something', val) == val\n\n\n@pytest.mark.parametrize('inp', ['0', '234', '-4566953498567934876'])\ndef test_adaptor_get_int_success(inp):\n    assert FakeAdaptor(params={'foo': inp}).get_int('foo') == int(inp)\n    assert FakeAdaptor(params={'foo': inp}).get_int('foo', 4) == int(inp)\n\n\n@pytest.mark.parametrize('inp', ['rs', '4.5', '6f'])\ndef test_adaptor_get_int_bad_number(inp):\n    with pytest.raises(FakeError, match='^400 -- .*must be a number'):\n        FakeAdaptor(params={'foo': inp}).get_int('foo')\n\n\n@pytest.mark.parametrize('inp', ['1', 'true', 'whatever', 'false'])\ndef test_adaptor_get_bool_trueish(inp):\n    assert FakeAdaptor(params={'foo': inp}).get_bool('foo')\n\n\ndef test_adaptor_get_bool_falsish():\n    assert not FakeAdaptor(params={'foo': '0'}).get_bool('foo')\n\n\n# ASGIAdaptor.parse_format()\n\ndef test_adaptor_parse_format_use_default():\n    adaptor = FakeAdaptor()\n\n    assert glue.parse_format(adaptor, napi.StatusResult, 'text') == 'text'\n    assert adaptor.content_type == 'text/plain; charset=utf-8'\n\n\ndef test_adaptor_parse_format_use_configured():\n    adaptor = FakeAdaptor(params={'format': 'json'})\n\n    assert glue.parse_format(adaptor, napi.StatusResult, 'text') == 'json'\n    assert adaptor.content_type == 'application/json; charset=utf-8'\n\n\ndef test_adaptor_parse_format_invalid_value():\n    adaptor = FakeAdaptor(params={'format': '@!#'})\n\n    with pytest.raises(FakeError, match='^400 -- .*must be one of'):\n        glue.parse_format(adaptor, napi.StatusResult, 'text')\n\n\n# ASGIAdaptor.get_accepted_languages()\n\ndef test_accepted_languages_from_param():\n    a = FakeAdaptor(params={'accept-language': 'de'})\n    assert glue.get_accepted_languages(a) == 'de'\n\n\ndef test_accepted_languages_from_header():\n    a = FakeAdaptor(headers={'accept-language': 'de'})\n    assert glue.get_accepted_languages(a) == 'de'\n\n\ndef test_accepted_languages_from_default(monkeypatch):\n    monkeypatch.setenv('NOMINATIM_DEFAULT_LANGUAGE', 'de')\n    a = FakeAdaptor()\n    assert glue.get_accepted_languages(a) == 'de'\n\n\ndef test_accepted_languages_param_over_header():\n    a = FakeAdaptor(params={'accept-language': 'de'},\n                    headers={'accept-language': 'en'})\n    assert glue.get_accepted_languages(a) == 'de'\n\n\ndef test_accepted_languages_header_over_default(monkeypatch):\n    monkeypatch.setenv('NOMINATIM_DEFAULT_LANGUAGE', 'en')\n    a = FakeAdaptor(headers={'accept-language': 'de'})\n    assert glue.get_accepted_languages(a) == 'de'\n\n\n# ASGIAdaptor.raise_error()\n\nclass TestAdaptorRaiseError:\n\n    @pytest.fixture(autouse=True)\n    def init_adaptor(self):\n        self.adaptor = FakeAdaptor()\n        glue.setup_debugging(self.adaptor)\n\n    def run_raise_error(self, msg, status):\n        with pytest.raises(FakeError) as excinfo:\n            self.adaptor.raise_error(msg, status=status)\n\n        return excinfo.value\n\n    def test_without_content_set(self):\n        err = self.run_raise_error('TEST', 404)\n\n        assert self.adaptor.content_type == 'text/plain; charset=utf-8'\n        assert err.msg == 'ERROR 404: TEST'\n        assert err.status == 404\n\n    def test_json(self):\n        self.adaptor.content_type = 'application/json; charset=utf-8'\n\n        err = self.run_raise_error('TEST', 501)\n\n        content = json.loads(err.msg)['error']\n        assert content['code'] == 501\n        assert content['message'] == 'TEST'\n\n    def test_xml(self):\n        self.adaptor.content_type = 'text/xml; charset=utf-8'\n\n        err = self.run_raise_error('this!', 503)\n\n        content = ET.fromstring(err.msg)\n\n        assert content.tag == 'error'\n        assert content.find('code').text == '503'\n        assert content.find('message').text == 'this!'\n\n\ndef test_raise_error_during_debug():\n    a = FakeAdaptor(params={'debug': '1'})\n    glue.setup_debugging(a)\n    loglib.log().section('Ongoing')\n\n    with pytest.raises(FakeError) as excinfo:\n        a.raise_error('badstate')\n\n    content = ET.fromstring(excinfo.value.msg)\n\n    assert content.tag == 'html'\n\n    assert '>Ongoing<' in excinfo.value.msg\n    assert 'badstate' in excinfo.value.msg\n\n\n# ASGIAdaptor.build_response\n\ndef test_build_response_without_content_type():\n    resp = glue.build_response(FakeAdaptor(), 'attention')\n\n    assert isinstance(resp, FakeResponse)\n    assert resp.status == 200\n    assert resp.output == 'attention'\n    assert resp.content_type == 'text/plain; charset=utf-8'\n\n\ndef test_build_response_with_status():\n    a = FakeAdaptor(params={'format': 'json'})\n    glue.parse_format(a, napi.StatusResult, 'text')\n\n    resp = glue.build_response(a, 'stuff\\nmore stuff', status=404)\n\n    assert isinstance(resp, FakeResponse)\n    assert resp.status == 404\n    assert resp.output == 'stuff\\nmore stuff'\n    assert resp.content_type == 'application/json; charset=utf-8'\n\n\ndef test_build_response_jsonp_with_json():\n    a = FakeAdaptor(params={'format': 'json', 'json_callback': 'test.func'})\n    glue.parse_format(a, napi.StatusResult, 'text')\n\n    resp = glue.build_response(a, '{}')\n\n    assert isinstance(resp, FakeResponse)\n    assert resp.status == 200\n    assert resp.output == 'test.func({})'\n    assert resp.content_type == 'application/javascript; charset=utf-8'\n\n\ndef test_build_response_jsonp_without_json():\n    a = FakeAdaptor(params={'format': 'text', 'json_callback': 'test.func'})\n    glue.parse_format(a, napi.StatusResult, 'text')\n\n    resp = glue.build_response(a, '{}')\n\n    assert isinstance(resp, FakeResponse)\n    assert resp.status == 200\n    assert resp.output == '{}'\n    assert resp.content_type == 'text/plain; charset=utf-8'\n\n\n@pytest.mark.parametrize('param', ['alert(); func', '\\\\n', '', 'a b'])\ndef test_build_response_jsonp_bad_format(param):\n    a = FakeAdaptor(params={'format': 'json', 'json_callback': param})\n    glue.parse_format(a, napi.StatusResult, 'text')\n\n    with pytest.raises(FakeError, match='^400 -- .*Invalid'):\n        glue.build_response(a, '{}')\n\n\n# status_endpoint()\n\nclass TestStatusEndpoint:\n\n    @pytest.fixture(autouse=True)\n    def patch_status_func(self, monkeypatch):\n        async def _status(*args, **kwargs):\n            return self.status\n\n        monkeypatch.setattr(napi.NominatimAPIAsync, 'status', _status)\n\n    @pytest.mark.asyncio\n    async def test_status_without_params(self):\n        a = FakeAdaptor()\n        self.status = napi.StatusResult(0, 'foo')\n\n        resp = await glue.status_endpoint(napi.NominatimAPIAsync(), a)\n\n        assert isinstance(resp, FakeResponse)\n        assert resp.status == 200\n        assert resp.content_type == 'text/plain; charset=utf-8'\n\n    @pytest.mark.asyncio\n    async def test_status_with_error(self):\n        a = FakeAdaptor()\n        self.status = napi.StatusResult(405, 'foo')\n\n        resp = await glue.status_endpoint(napi.NominatimAPIAsync(), a)\n\n        assert isinstance(resp, FakeResponse)\n        assert resp.status == 500\n        assert resp.content_type == 'text/plain; charset=utf-8'\n\n    @pytest.mark.asyncio\n    async def test_status_json_with_error(self):\n        a = FakeAdaptor(params={'format': 'json'})\n        self.status = napi.StatusResult(405, 'foo')\n\n        resp = await glue.status_endpoint(napi.NominatimAPIAsync(), a)\n\n        assert isinstance(resp, FakeResponse)\n        assert resp.status == 200\n        assert resp.content_type == 'application/json; charset=utf-8'\n\n    @pytest.mark.asyncio\n    async def test_status_bad_format(self):\n        a = FakeAdaptor(params={'format': 'foo'})\n        self.status = napi.StatusResult(0, 'foo')\n\n        with pytest.raises(FakeError):\n            await glue.status_endpoint(napi.NominatimAPIAsync(), a)\n\n\n# details_endpoint()\n\nclass TestDetailsEndpoint:\n\n    @pytest.fixture(autouse=True)\n    def patch_lookup_func(self, monkeypatch):\n        self.result = napi.DetailedResult(napi.SourceTable.PLACEX,\n                                          ('place', 'thing'),\n                                          napi.Point(1.0, 2.0))\n        self.lookup_args = []\n\n        async def _lookup(*args, **kwargs):\n            self.lookup_args.extend(args[1:])\n            return self.result\n\n        monkeypatch.setattr(napi.NominatimAPIAsync, 'details', _lookup)\n\n    @pytest.mark.asyncio\n    async def test_details_no_params(self):\n        a = FakeAdaptor()\n\n        with pytest.raises(FakeError, match='^400 -- .*Missing'):\n            await glue.details_endpoint(napi.NominatimAPIAsync(), a)\n\n    @pytest.mark.asyncio\n    async def test_details_by_place_id(self):\n        a = FakeAdaptor(params={'place_id': '4573'})\n\n        await glue.details_endpoint(napi.NominatimAPIAsync(), a)\n\n        assert self.lookup_args[0].place_id == 4573\n\n    @pytest.mark.asyncio\n    async def test_details_by_osm_id(self):\n        a = FakeAdaptor(params={'osmtype': 'N', 'osmid': '45'})\n\n        await glue.details_endpoint(napi.NominatimAPIAsync(), a)\n\n        assert self.lookup_args[0].osm_type == 'N'\n        assert self.lookup_args[0].osm_id == 45\n        assert self.lookup_args[0].osm_class is None\n\n    @pytest.mark.asyncio\n    async def test_details_with_debugging(self):\n        a = FakeAdaptor(params={'osmtype': 'N', 'osmid': '45', 'debug': '1'})\n\n        resp = await glue.details_endpoint(napi.NominatimAPIAsync(), a)\n        content = ET.fromstring(resp.output)\n\n        assert resp.content_type == 'text/html; charset=utf-8'\n        assert content.tag == 'html'\n\n    @pytest.mark.asyncio\n    async def test_details_no_result(self):\n        a = FakeAdaptor(params={'place_id': '4573'})\n        self.result = None\n\n        with pytest.raises(FakeError, match='^404 -- .*found'):\n            await glue.details_endpoint(napi.NominatimAPIAsync(), a)\n\n\n# reverse_endpoint()\nclass TestReverseEndPoint:\n\n    @pytest.fixture(autouse=True)\n    def patch_reverse_func(self, monkeypatch):\n        self.result = napi.ReverseResult(napi.SourceTable.PLACEX,\n                                         ('place', 'thing'),\n                                         napi.Point(1.0, 2.0))\n\n        async def _reverse(*args, **kwargs):\n            return self.result\n\n        monkeypatch.setattr(napi.NominatimAPIAsync, 'reverse', _reverse)\n\n    @pytest.mark.asyncio\n    @pytest.mark.parametrize('params', [{}, {'lat': '3.4'}, {'lon': '6.7'}])\n    async def test_reverse_no_params(self, params):\n        a = FakeAdaptor()\n        a.params = params\n        a.params['format'] = 'xml'\n\n        with pytest.raises(FakeError, match='^400 -- (?s:.*)missing'):\n            await glue.reverse_endpoint(napi.NominatimAPIAsync(), a)\n\n    @pytest.mark.asyncio\n    async def test_reverse_success(self):\n        a = FakeAdaptor()\n        a.params['lat'] = '56.3'\n        a.params['lon'] = '6.8'\n\n        assert await glue.reverse_endpoint(napi.NominatimAPIAsync(), a)\n\n    @pytest.mark.asyncio\n    async def test_reverse_from_search(self):\n        a = FakeAdaptor()\n        a.params['q'] = '34.6 2.56'\n        a.params['format'] = 'json'\n\n        res = await glue.search_endpoint(napi.NominatimAPIAsync(), a)\n\n        assert len(json.loads(res.output)) == 1\n\n\n# lookup_endpoint()\n\nclass TestLookupEndpoint:\n\n    @pytest.fixture(autouse=True)\n    def patch_lookup_func(self, monkeypatch):\n        self.results = [napi.SearchResult(napi.SourceTable.PLACEX,\n                                          ('place', 'thing'),\n                                          napi.Point(1.0, 2.0))]\n\n        async def _lookup(*args, **kwargs):\n            return napi.SearchResults(self.results)\n\n        monkeypatch.setattr(napi.NominatimAPIAsync, 'lookup', _lookup)\n\n    @pytest.mark.asyncio\n    async def test_lookup_no_params(self):\n        a = FakeAdaptor()\n        a.params['format'] = 'json'\n\n        res = await glue.lookup_endpoint(napi.NominatimAPIAsync(), a)\n\n        assert res.output == '[]'\n\n    @pytest.mark.asyncio\n    @pytest.mark.parametrize('param', ['w', 'bad', ''])\n    async def test_lookup_bad_params(self, param):\n        a = FakeAdaptor()\n        a.params['format'] = 'json'\n        a.params['osm_ids'] = f'W34,{param},N33333'\n\n        res = await glue.lookup_endpoint(napi.NominatimAPIAsync(), a)\n\n        assert len(json.loads(res.output)) == 1\n\n    @pytest.mark.asyncio\n    @pytest.mark.parametrize('param', ['p234234', '4563'])\n    async def test_lookup_bad_osm_type(self, param):\n        a = FakeAdaptor()\n        a.params['format'] = 'json'\n        a.params['osm_ids'] = f'W34,{param},N33333'\n\n        res = await glue.lookup_endpoint(napi.NominatimAPIAsync(), a)\n\n        assert len(json.loads(res.output)) == 1\n\n    @pytest.mark.asyncio\n    async def test_lookup_working(self):\n        a = FakeAdaptor()\n        a.params['format'] = 'json'\n        a.params['osm_ids'] = 'N23,W34'\n\n        res = await glue.lookup_endpoint(napi.NominatimAPIAsync(), a)\n\n        assert len(json.loads(res.output)) == 1\n\n\n# search_endpoint()\n\nclass TestSearchEndPointSearch:\n\n    @pytest.fixture(autouse=True)\n    def patch_lookup_func(self, monkeypatch):\n        self.results = [napi.SearchResult(napi.SourceTable.PLACEX,\n                                          ('place', 'thing'),\n                                          napi.Point(1.0, 2.0))]\n\n        async def _search(*args, **kwargs):\n            return napi.SearchResults(self.results)\n\n        monkeypatch.setattr(napi.NominatimAPIAsync, 'search', _search)\n\n    @pytest.mark.asyncio\n    async def test_search_free_text(self):\n        a = FakeAdaptor()\n        a.params['q'] = 'something'\n\n        res = await glue.search_endpoint(napi.NominatimAPIAsync(), a)\n\n        assert len(json.loads(res.output)) == 1\n\n    @pytest.mark.asyncio\n    async def test_search_free_text_xml(self):\n        a = FakeAdaptor()\n        a.params['q'] = 'something'\n        a.params['format'] = 'xml'\n\n        res = await glue.search_endpoint(napi.NominatimAPIAsync(), a)\n\n        assert res.status == 200\n        assert res.output.index('something') > 0\n\n    @pytest.mark.asyncio\n    async def test_search_free_and_structured(self):\n        a = FakeAdaptor()\n        a.params['q'] = 'something'\n        a.params['city'] = 'ignored'\n\n        with pytest.raises(FakeError, match='^400 -- .*cannot be used together'):\n            await glue.search_endpoint(napi.NominatimAPIAsync(), a)\n\n    @pytest.mark.asyncio\n    @pytest.mark.parametrize('dedupe,numres', [(True, 1), (False, 2)])\n    async def test_search_dedupe(self, dedupe, numres):\n        self.results = self.results * 2\n        a = FakeAdaptor()\n        a.params['q'] = 'something'\n        if not dedupe:\n            a.params['dedupe'] = '0'\n\n        res = await glue.search_endpoint(napi.NominatimAPIAsync(), a)\n\n        assert len(json.loads(res.output)) == numres\n\n\nclass TestSearchEndPointSearchAddress:\n\n    @pytest.fixture(autouse=True)\n    def patch_lookup_func(self, monkeypatch):\n        self.results = [napi.SearchResult(napi.SourceTable.PLACEX,\n                                          ('place', 'thing'),\n                                          napi.Point(1.0, 2.0))]\n\n        async def _search(*args, **kwargs):\n            return napi.SearchResults(self.results)\n\n        monkeypatch.setattr(napi.NominatimAPIAsync, 'search_address', _search)\n\n    @pytest.mark.asyncio\n    async def test_search_structured(self):\n        a = FakeAdaptor()\n        a.params['street'] = 'something'\n\n        res = await glue.search_endpoint(napi.NominatimAPIAsync(), a)\n\n        assert len(json.loads(res.output)) == 1\n\n\nclass TestSearchEndPointSearchCategory:\n\n    @pytest.fixture(autouse=True)\n    def patch_lookup_func(self, monkeypatch):\n        self.results = [napi.SearchResult(napi.SourceTable.PLACEX,\n                                          ('place', 'thing'),\n                                          napi.Point(1.0, 2.0))]\n\n        async def _search(*args, **kwargs):\n            return napi.SearchResults(self.results)\n\n        monkeypatch.setattr(napi.NominatimAPIAsync, 'search_category', _search)\n\n    @pytest.mark.asyncio\n    async def test_search_category(self):\n        a = FakeAdaptor()\n        a.params['q'] = '[shop=fog]'\n\n        res = await glue.search_endpoint(napi.NominatimAPIAsync(), a)\n\n        assert len(json.loads(res.output)) == 1\n"
  },
  {
    "path": "test/python/api/test_timeout.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for timeout helper\n\"\"\"\nimport asyncio\n\nimport pytest\n\nfrom nominatim_api.timeout import Timeout\n\n\n@pytest.mark.asyncio\nasync def test_timeout_none():\n    timeout = Timeout(None)\n\n    assert timeout.abs is None\n    assert not timeout.is_elapsed()\n\n\n@pytest.mark.asyncio\nasync def test_timeout_should_not_be_elapsed_after_creation():\n    assert not Timeout(2).is_elapsed()\n\n\n@pytest.mark.asyncio\nasync def test_timeout_elapse():\n    timeout = Timeout(0.5)\n\n    assert timeout.abs is not None\n    await asyncio.sleep(0.5)\n    assert timeout.is_elapsed()\n"
  },
  {
    "path": "test/python/api/test_warm.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for warm-up CLI function.\n\"\"\"\nimport pytest\n\nimport nominatim_db.cli\n\n\n@pytest.fixture(autouse=True)\ndef setup_database_with_context(apiobj, table_factory):\n    table_factory('word',\n                  definition='word_id INT, word_token TEXT, type TEXT, word TEXT, info JSONB',\n                  content=[(55, 'test', 'W', 'test', None),\n                           (2, 'test', 'w', 'test', None)])\n\n    apiobj.add_data('properties',\n                    [{'property': 'tokenizer', 'value': 'icu'},\n                     {'property': 'tokenizer_import_normalisation', 'value': ':: lower();'},\n                     {'property': 'tokenizer_import_transliteration',\n                      'value': \"'1' > '/1/'; 'ä' > 'ä '\"}\n                     ])\n\n\n@pytest.mark.parametrize('args', [['--search-only'], ['--reverse-only']])\ndef test_warm_all(tmp_path, args):\n    assert 0 == nominatim_db.cli.nominatim(cli_args=['admin', '--project-dir', str(tmp_path),\n                                                     '--warm'] + args)\n"
  },
  {
    "path": "test/python/cli/conftest.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\nimport pytest\n\nimport nominatim_db.cli\n\n\nclass MockParamCapture:\n    \"\"\" Mock that records the parameters with which a function was called\n        as well as the number of calls.\n    \"\"\"\n    def __init__(self, retval=0):\n        self.called = 0\n        self.return_value = retval\n        self.last_args = None\n        self.last_kwargs = None\n\n    def __call__(self, *args, **kwargs):\n        self.called += 1\n        self.last_args = args\n        self.last_kwargs = kwargs\n        return self.return_value\n\n\nclass AsyncMockParamCapture:\n    \"\"\" Mock that records the parameters with which a function was called\n        as well as the number of calls.\n    \"\"\"\n    def __init__(self, retval=0):\n        self.called = 0\n        self.return_value = retval\n        self.last_args = None\n        self.last_kwargs = None\n\n    async def __call__(self, *args, **kwargs):\n        self.called += 1\n        self.last_args = args\n        self.last_kwargs = kwargs\n        return self.return_value\n\n\nclass DummyTokenizer:\n    def __init__(self, *args, **kwargs):\n        self.update_sql_functions_called = False\n        self.finalize_import_called = False\n        self.update_statistics_called = False\n        self.update_word_tokens_called = False\n\n    def update_sql_functions(self, *args, **kwargs):\n        self.update_sql_functions_called = True\n\n    def finalize_import(self, *args, **kwargs):\n        self.finalize_import_called = True\n\n    def update_statistics(self, *args, **kwargs):\n        self.update_statistics_called = True\n\n    def update_word_tokens(self, *args, **kwargs):\n        self.update_word_tokens_called = True\n\n\n@pytest.fixture\ndef cli_call():\n    \"\"\" Call the nominatim main function with the correct paths set.\n        Returns a function that can be called with the desired CLI arguments.\n    \"\"\"\n    def _call_nominatim(*args):\n        return nominatim_db.cli.nominatim(cli_args=args)\n\n    return _call_nominatim\n\n\n@pytest.fixture\ndef mock_func_factory(monkeypatch):\n    def get_mock(module, func):\n        mock = MockParamCapture()\n        mock.func_name = func\n        monkeypatch.setattr(module, func, mock)\n        return mock\n\n    return get_mock\n\n\n@pytest.fixture\ndef async_mock_func_factory(monkeypatch):\n    def get_mock(module, func):\n        mock = AsyncMockParamCapture()\n        mock.func_name = func\n        monkeypatch.setattr(module, func, mock)\n        return mock\n\n    return get_mock\n\n\n@pytest.fixture\ndef cli_tokenizer_mock(monkeypatch):\n    tok = DummyTokenizer()\n    monkeypatch.setattr(nominatim_db.tokenizer.factory, 'get_tokenizer_for_db',\n                        lambda *args: tok)\n    monkeypatch.setattr(nominatim_db.tokenizer.factory, 'create_tokenizer',\n                        lambda *args: tok)\n\n    return tok\n"
  },
  {
    "path": "test/python/cli/test_cli.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for command line interface wrapper.\n\nThese tests just check that the various command line parameters route to the\ncorrect functionality. They use a lot of monkeypatching to avoid executing\nthe actual functions.\n\"\"\"\nimport pytest\n\nimport nominatim_db.indexer.indexer\nimport nominatim_db.tools.add_osm_data\nimport nominatim_db.tools.freeze\nimport nominatim_db.tools.tiger_data\n\n\ndef test_cli_help(cli_call, capsys):\n    \"\"\" Running nominatim tool without arguments prints help.\n    \"\"\"\n    assert cli_call() == 1\n\n    captured = capsys.readouterr()\n    assert captured.out.startswith('usage:')\n\n\ndef test_cli_version(cli_call, capsys):\n    \"\"\" Running nominatim tool --version prints a version string.\n    \"\"\"\n    assert cli_call('--version') == 0\n\n    captured = capsys.readouterr()\n    assert captured.out.startswith('Nominatim version')\n\n\nclass TestCliWithDb:\n\n    @pytest.fixture(autouse=True)\n    def setup_cli_call(self, cli_call, temp_db, cli_tokenizer_mock, table_factory):\n        self.call_nominatim = cli_call\n        self.tokenizer_mock = cli_tokenizer_mock\n        # Make sure tools.freeze.is_frozen doesn't report database as frozen. Monkeypatching failed\n        table_factory('place')\n\n    @pytest.mark.parametrize(\"name,oid\", [('file', 'foo.osm'), ('diff', 'foo.osc')])\n    def test_cli_add_data_file_command(self, cli_call, mock_func_factory, name, oid):\n        mock_run_legacy = mock_func_factory(nominatim_db.tools.add_osm_data, 'add_data_from_file')\n        assert cli_call('add-data', '--' + name, str(oid)) == 0\n\n        assert mock_run_legacy.called == 1\n\n    @pytest.mark.parametrize(\"name,oid\", [('node', 12), ('way', 8), ('relation', 32)])\n    def test_cli_add_data_object_command(self, cli_call, mock_func_factory, name, oid):\n        mock_run_legacy = mock_func_factory(nominatim_db.tools.add_osm_data, 'add_osm_object')\n        assert cli_call('add-data', '--' + name, str(oid)) == 0\n\n        assert mock_run_legacy.called == 1\n\n    def test_cli_add_data_tiger_data(self, cli_call, cli_tokenizer_mock, async_mock_func_factory):\n        mock = async_mock_func_factory(nominatim_db.tools.tiger_data, 'add_tiger_data')\n\n        assert cli_call('add-data', '--tiger-data', 'somewhere') == 0\n\n        assert mock.called == 1\n\n    def test_freeze_command(self, mock_func_factory):\n        mock_drop = mock_func_factory(nominatim_db.tools.freeze, 'drop_update_tables')\n        mock_flatnode = mock_func_factory(nominatim_db.tools.freeze, 'drop_flatnode_file')\n\n        assert self.call_nominatim('freeze') == 0\n\n        assert mock_drop.called == 1\n        assert mock_flatnode.called == 1\n\n    @pytest.mark.parametrize(\"params,do_bnds,do_ranks\", [\n                              ([], 2, 2),\n                              (['--boundaries-only'], 2, 0),\n                              (['--no-boundaries'], 0, 2),\n                              (['--boundaries-only', '--no-boundaries'], 0, 0)])\n    def test_index_command(self, monkeypatch, async_mock_func_factory, table_factory,\n                           params, do_bnds, do_ranks):\n        table_factory('import_status', 'indexed bool')\n        bnd_mock = async_mock_func_factory(nominatim_db.indexer.indexer.Indexer,\n                                           'index_boundaries')\n        rank_mock = async_mock_func_factory(nominatim_db.indexer.indexer.Indexer,\n                                            'index_by_rank')\n        postcode_mock = async_mock_func_factory(nominatim_db.indexer.indexer.Indexer,\n                                                'index_postcodes')\n\n        has_pending_retvals = [True, False]\n        monkeypatch.setattr(nominatim_db.indexer.indexer.Indexer, 'has_pending',\n                            lambda *args, **kwargs: has_pending_retvals.pop(0))\n\n        assert self.call_nominatim('index', *params) == 0\n\n        assert bnd_mock.called == do_bnds\n        assert rank_mock.called == do_ranks\n        assert postcode_mock.called == do_ranks\n\n    def test_special_phrases_wiki_command(self, mock_func_factory):\n        func = mock_func_factory(nominatim_db.clicmd.special_phrases.SPImporter, 'import_phrases')\n\n        self.call_nominatim('special-phrases', '--import-from-wiki', '--no-replace')\n\n        assert func.called == 1\n\n    def test_special_phrases_csv_command(self, src_dir, mock_func_factory):\n        func = mock_func_factory(nominatim_db.clicmd.special_phrases.SPImporter, 'import_phrases')\n        testdata = src_dir / 'test' / 'testdb'\n        csv_path = str((testdata / 'full_en_phrases_test.csv').resolve())\n\n        self.call_nominatim('special-phrases', '--import-from-csv', csv_path)\n\n        assert func.called == 1\n\n    def test_special_phrases_csv_bad_file(self, src_dir):\n        testdata = src_dir / 'something349053905.csv'\n\n        self.call_nominatim('special-phrases', '--import-from-csv',\n                            str(testdata.resolve())) == 1\n"
  },
  {
    "path": "test/python/cli/test_cmd_admin.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTest for the command line interface wrapper admin subcommand.\n\nThese tests just check that the various command line parameters route to the\ncorrect functionality. They use a lot of monkeypatching to avoid executing\nthe actual functions.\n\"\"\"\nimport pytest\n\nimport nominatim_db.tools.admin\nimport nominatim_db.tools.check_database\nimport nominatim_db.tools.migration\nimport nominatim_db.clicmd.admin\n\n\ndef test_admin_command_check_database(cli_call, mock_func_factory):\n    mock = mock_func_factory(nominatim_db.tools.check_database, 'check_database')\n\n    assert cli_call('admin', '--check-database') == 0\n    assert mock.called == 1\n\n\ndef test_admin_migrate(cli_call, mock_func_factory):\n    mock = mock_func_factory(nominatim_db.tools.migration, 'migrate')\n\n    assert cli_call('admin', '--migrate') == 0\n    assert mock.called == 1\n\n\ndef test_admin_clean_deleted_relations(cli_call, mock_func_factory):\n    mock = mock_func_factory(nominatim_db.tools.admin, 'clean_deleted_relations')\n\n    assert cli_call('admin', '--clean-deleted', '1 month') == 0\n    assert mock.called == 1\n\n\ndef test_admin_clean_deleted_relations_no_age(cli_call, mock_func_factory):\n    mock_func_factory(nominatim_db.tools.admin, 'clean_deleted_relations')\n\n    assert cli_call('admin', '--clean-deleted') == 1\n\n\nclass TestCliAdminWithDb:\n\n    @pytest.fixture(autouse=True)\n    def setup_cli_call(self, cli_call, temp_db, cli_tokenizer_mock):\n        self.call_nominatim = cli_call\n        self.tokenizer_mock = cli_tokenizer_mock\n\n    @pytest.mark.parametrize(\"func, params\", [('analyse_indexing', ('--analyse-indexing', ))])\n    def test_analyse_indexing(self, mock_func_factory, func, params):\n        mock = mock_func_factory(nominatim_db.tools.admin, func)\n\n        assert self.call_nominatim('admin', *params) == 0\n        assert mock.called == 1\n"
  },
  {
    "path": "test/python/cli/test_cmd_api.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for API access commands of command-line interface wrapper.\n\"\"\"\nimport json\nimport pytest\n\nimport nominatim_api as napi\n\n\n@pytest.mark.parametrize('call', ['search', 'reverse', 'lookup', 'details', 'status'])\ndef test_list_format(cli_call, call):\n    assert 0 == cli_call(call, '--list-formats')\n\n\n@pytest.mark.parametrize('call', ['search', 'reverse', 'lookup', 'details', 'status'])\ndef test_bad_format(cli_call, call):\n    assert 1 == cli_call(call, '--format', 'rsdfsdfsdfsaefsdfsd')\n\n\nclass TestCliStatusCall:\n\n    @pytest.fixture(autouse=True)\n    def setup_status_mock(self, monkeypatch):\n        monkeypatch.setattr(napi.NominatimAPI, 'status',\n                            lambda self: napi.StatusResult(200, 'OK'))\n\n    def test_status_simple(self, cli_call, tmp_path):\n        result = cli_call('status', '--project-dir', str(tmp_path))\n\n        assert result == 0\n\n    def test_status_json_format(self, cli_call, tmp_path, capsys):\n        result = cli_call('status', '--project-dir', str(tmp_path),\n                          '--format', 'json')\n\n        assert result == 0\n\n        json.loads(capsys.readouterr().out)\n\n\nclass TestCliDetailsCall:\n\n    @pytest.fixture(autouse=True)\n    def setup_status_mock(self, monkeypatch):\n        result = napi.DetailedResult(napi.SourceTable.PLACEX, ('place', 'thing'),\n                                     napi.Point(1.0, -3.0))\n\n        monkeypatch.setattr(napi.NominatimAPI, 'details',\n                            lambda *args, **kwargs: result)\n\n    @pytest.mark.parametrize(\"params\", [('--node', '1'),\n                                        ('--way', '1'),\n                                        ('--relation', '1'),\n                                        ('--place_id', '10001')])\n    def test_details_json_format(self, cli_call, tmp_path, capsys, params):\n        result = cli_call('details', '--project-dir', str(tmp_path), *params)\n\n        assert result == 0\n\n        json.loads(capsys.readouterr().out)\n\n\nclass TestCliReverseCall:\n\n    @pytest.fixture(autouse=True)\n    def setup_reverse_mock(self, monkeypatch):\n        result = napi.ReverseResult(napi.SourceTable.PLACEX, ('place', 'thing'),\n                                    napi.Point(1.0, -3.0),\n                                    names={'name': 'Name', 'name:fr': 'Nom'},\n                                    extratags={'extra': 'Extra'},\n                                    locale_name='Name')\n\n        monkeypatch.setattr(napi.NominatimAPI, 'reverse',\n                            lambda *args, **kwargs: result)\n\n    def test_reverse_simple(self, cli_call, tmp_path, capsys):\n        result = cli_call('reverse', '--project-dir', str(tmp_path),\n                          '--lat', '34', '--lon', '34')\n\n        assert result == 0\n\n        out = json.loads(capsys.readouterr().out)\n        assert out['name'] == 'Name'\n        assert 'address' not in out\n        assert 'extratags' not in out\n        assert 'namedetails' not in out\n\n    @pytest.mark.parametrize('param,field', [('--addressdetails', 'address'),\n                                             ('--extratags', 'extratags'),\n                                             ('--namedetails', 'namedetails')])\n    def test_reverse_extra_stuff(self, cli_call, tmp_path, capsys, param, field):\n        result = cli_call('reverse', '--project-dir', str(tmp_path),\n                          '--lat', '34', '--lon', '34', param)\n\n        assert result == 0\n\n        out = json.loads(capsys.readouterr().out)\n        assert field in out\n\n    def test_reverse_format(self, cli_call, tmp_path, capsys):\n        result = cli_call('reverse', '--project-dir', str(tmp_path),\n                          '--lat', '34', '--lon', '34', '--format', 'geojson')\n\n        assert result == 0\n\n        out = json.loads(capsys.readouterr().out)\n        assert out['type'] == 'FeatureCollection'\n\n\nclass TestCliLookupCall:\n\n    @pytest.fixture(autouse=True)\n    def setup_lookup_mock(self, monkeypatch):\n        result = napi.SearchResult(napi.SourceTable.PLACEX, ('place', 'thing'),\n                                   napi.Point(1.0, -3.0),\n                                   names={'name': 'Name', 'name:fr': 'Nom'},\n                                   extratags={'extra': 'Extra'},\n                                   locale_name='Name')\n\n        monkeypatch.setattr(napi.NominatimAPI, 'lookup',\n                            lambda *args, **kwargs: napi.SearchResults([result]))\n\n    def test_lookup_simple(self, cli_call, tmp_path, capsys):\n        result = cli_call('lookup', '--project-dir', str(tmp_path),\n                          '--id', 'N34')\n\n        assert result == 0\n\n        out = json.loads(capsys.readouterr().out)\n        assert len(out) == 1\n        assert out[0]['name'] == 'Name'\n        assert 'address' not in out[0]\n        assert 'extratags' not in out[0]\n        assert 'namedetails' not in out[0]\n\n\n@pytest.mark.parametrize('endpoint, params', [('search', ('--query', 'Berlin')),\n                                              ('search_address', ('--city', 'Berlin'))\n                                              ])\ndef test_search(cli_call, tmp_path, capsys, monkeypatch, endpoint, params):\n    result = napi.SearchResult(napi.SourceTable.PLACEX, ('place', 'thing'),\n                               napi.Point(1.0, -3.0),\n                               names={'name': 'Name', 'name:fr': 'Nom'},\n                               extratags={'extra': 'Extra'},\n                               locale_name='Name')\n\n    monkeypatch.setattr(napi.NominatimAPI, endpoint,\n                        lambda *args, **kwargs: napi.SearchResults([result]))\n\n    result = cli_call('search', '--project-dir', str(tmp_path), *params)\n\n    assert result == 0\n\n    out = json.loads(capsys.readouterr().out)\n    assert len(out) == 1\n    assert out[0]['name'] == 'Name'\n    assert 'address' not in out[0]\n    assert 'extratags' not in out[0]\n    assert 'namedetails' not in out[0]\n"
  },
  {
    "path": "test/python/cli/test_cmd_import.py",
    "content": "# SPDX-License-Identifier: GPL-2.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for import command of the command-line interface wrapper.\n\"\"\"\nimport pytest\n\nimport nominatim_db.tools.database_import\nimport nominatim_db.data.country_info\nimport nominatim_db.tools.refresh\nimport nominatim_db.tools.postcodes\nimport nominatim_db.indexer.indexer\nimport nominatim_db.db.properties\n\n\nclass TestCliImportWithDb:\n\n    @pytest.fixture(autouse=True)\n    def setup_cli_call(self, cli_call, temp_db, cli_tokenizer_mock):\n        self.call_nominatim = cli_call\n        self.tokenizer_mock = cli_tokenizer_mock\n\n    def test_import_missing_file(self):\n        assert self.call_nominatim('import', '--osm-file', 'sfsafegwedgw.reh.erh') == 1\n\n    def test_import_bad_file(self):\n        assert self.call_nominatim('import', '--osm-file', '.') == 1\n\n    @pytest.mark.parametrize('with_updates', [True, False])\n    def test_import_full(self, mock_func_factory, async_mock_func_factory,\n                         with_updates, place_table, property_table):\n        mocks = [\n            mock_func_factory(nominatim_db.tools.database_import, 'setup_database_skeleton'),\n            mock_func_factory(nominatim_db.data.country_info, 'setup_country_tables'),\n            mock_func_factory(nominatim_db.tools.database_import, 'import_osm_data'),\n            mock_func_factory(nominatim_db.tools.refresh, 'import_wikipedia_articles'),\n            mock_func_factory(nominatim_db.tools.refresh, 'import_secondary_importance'),\n            mock_func_factory(nominatim_db.tools.database_import, 'truncate_data_tables'),\n            async_mock_func_factory(nominatim_db.tools.database_import, 'load_data'),\n            mock_func_factory(nominatim_db.tools.database_import, 'create_tables'),\n            mock_func_factory(nominatim_db.tools.database_import, 'create_table_triggers'),\n            mock_func_factory(nominatim_db.tools.database_import, 'create_partition_tables'),\n            async_mock_func_factory(nominatim_db.tools.database_import, 'create_search_indices'),\n            mock_func_factory(nominatim_db.data.country_info, 'create_country_names'),\n            mock_func_factory(nominatim_db.tools.refresh, 'load_address_levels_from_config'),\n            mock_func_factory(nominatim_db.tools.postcodes, 'update_postcodes'),\n            async_mock_func_factory(nominatim_db.indexer.indexer.Indexer, 'index_full'),\n        ]\n\n        params = ['import', '--osm-file', __file__]\n\n        if with_updates:\n            mocks.append(mock_func_factory(nominatim_db.tools.freeze, 'drop_update_tables'))\n            params.append('--no-updates')\n\n        cf_mock = mock_func_factory(nominatim_db.tools.refresh, 'create_functions')\n\n        assert self.call_nominatim(*params) == 0\n        assert self.tokenizer_mock.finalize_import_called\n\n        assert cf_mock.called > 1\n\n        for mock in mocks:\n            assert mock.called == 1, \"Mock '{}' not called\".format(mock.func_name)\n\n    def test_import_continue_load_data(self, mock_func_factory, async_mock_func_factory):\n        mocks = [\n            mock_func_factory(nominatim_db.tools.database_import, 'truncate_data_tables'),\n            async_mock_func_factory(nominatim_db.tools.database_import, 'load_data'),\n            async_mock_func_factory(nominatim_db.tools.database_import, 'create_search_indices'),\n            mock_func_factory(nominatim_db.data.country_info, 'create_country_names'),\n            mock_func_factory(nominatim_db.tools.postcodes, 'update_postcodes'),\n            async_mock_func_factory(nominatim_db.indexer.indexer.Indexer, 'index_full'),\n            mock_func_factory(nominatim_db.db.properties, 'set_property')\n        ]\n\n        assert self.call_nominatim('import', '--continue', 'load-data') == 0\n        assert self.tokenizer_mock.finalize_import_called\n\n        for mock in mocks:\n            assert mock.called == 1, \"Mock '{}' not called\".format(mock.func_name)\n\n    def test_import_continue_indexing(self, mock_func_factory, async_mock_func_factory,\n                                      placex_table, temp_db_conn):\n        mocks = [\n            async_mock_func_factory(nominatim_db.tools.database_import, 'create_search_indices'),\n            mock_func_factory(nominatim_db.data.country_info, 'create_country_names'),\n            async_mock_func_factory(nominatim_db.indexer.indexer.Indexer, 'index_full'),\n            mock_func_factory(nominatim_db.db.properties, 'set_property')\n        ]\n\n        assert self.call_nominatim('import', '--continue', 'indexing') == 0\n\n        for mock in mocks:\n            assert mock.called == 1, \"Mock '{}' not called\".format(mock.func_name)\n\n        # Calling it again still works for the index\n        assert self.call_nominatim('import', '--continue', 'indexing') == 0\n\n    def test_import_continue_postprocess(self, mock_func_factory, async_mock_func_factory):\n        mocks = [\n            async_mock_func_factory(nominatim_db.tools.database_import, 'create_search_indices'),\n            mock_func_factory(nominatim_db.data.country_info, 'create_country_names'),\n            mock_func_factory(nominatim_db.db.properties, 'set_property')\n        ]\n\n        assert self.call_nominatim('import', '--continue', 'db-postprocess') == 0\n\n        assert self.tokenizer_mock.finalize_import_called\n\n        for mock in mocks:\n            assert mock.called == 1, \"Mock '{}' not called\".format(mock.func_name)\n"
  },
  {
    "path": "test/python/cli/test_cmd_index.py",
    "content": "# SPDX-License-Identifier: GPL-2.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for index command of the command-line interface wrapper.\n\"\"\"\nimport pytest\n\nimport nominatim_db.indexer.indexer\n\n\nclass TestCliIndexWithDb:\n\n    @pytest.fixture(autouse=True)\n    def setup_cli_call(self, cli_call, cli_tokenizer_mock):\n        self.call_nominatim = cli_call\n        self.tokenizer_mock = cli_tokenizer_mock\n\n    def test_index_empty_subset(self, monkeypatch, async_mock_func_factory, placex_row):\n        placex_row(rank_address=1, indexed_status=1)\n        placex_row(rank_address=20, indexed_status=1)\n\n        mocks = [\n            async_mock_func_factory(nominatim_db.indexer.indexer.Indexer, 'index_boundaries'),\n            async_mock_func_factory(nominatim_db.indexer.indexer.Indexer, 'index_by_rank'),\n            async_mock_func_factory(nominatim_db.indexer.indexer.Indexer, 'index_postcodes'),\n        ]\n\n        def _reject_repeat_call(*args, **kwargs):\n            assert False, \"Did not expect multiple Indexer.has_pending invocations\"\n\n        has_pending_calls = [nominatim_db.indexer.indexer.Indexer.has_pending, _reject_repeat_call]\n        monkeypatch.setattr(nominatim_db.indexer.indexer.Indexer, 'has_pending',\n                            lambda *args, **kwargs: has_pending_calls.pop(0)(*args, **kwargs))\n\n        assert self.call_nominatim('index', '--minrank', '5', '--maxrank', '10') == 0\n\n        for mock in mocks:\n            assert mock.called == 1, \"Mock '{}' not called\".format(mock.func_name)\n"
  },
  {
    "path": "test/python/cli/test_cmd_refresh.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for command line interface wrapper for refresk command.\n\"\"\"\nimport pytest\n\nimport nominatim_db.tools.refresh\nimport nominatim_db.tools.postcodes\nimport nominatim_db.indexer.indexer\n\n\nclass TestRefresh:\n\n    @pytest.fixture(autouse=True)\n    def setup_cli_call(self, cli_call, temp_db, cli_tokenizer_mock):\n        self.call_nominatim = cli_call\n        self.tokenizer_mock = cli_tokenizer_mock\n\n    @pytest.mark.parametrize(\"command,func\", [\n                             ('address-levels', 'load_address_levels_from_config'),\n                             ('wiki-data', 'import_wikipedia_articles'),\n                             ('importance', 'recompute_importance'),\n                             ])\n    def test_refresh_command(self, mock_func_factory, command, func):\n        mock_func_factory(nominatim_db.tools.refresh, 'create_functions')\n        func_mock = mock_func_factory(nominatim_db.tools.refresh, func)\n\n        assert self.call_nominatim('refresh', '--' + command) == 0\n        assert func_mock.called == 1\n\n    def test_refresh_word_count(self):\n        assert self.call_nominatim('refresh', '--word-count') == 0\n        assert self.tokenizer_mock.update_statistics_called\n\n    def test_refresh_word_tokens(self):\n        assert self.call_nominatim('refresh', '--word-tokens') == 0\n        assert self.tokenizer_mock.update_word_tokens_called\n\n    def test_refresh_postcodes(self, async_mock_func_factory, mock_func_factory,\n                               place_postcode_table):\n        func_mock = mock_func_factory(nominatim_db.tools.postcodes, 'update_postcodes')\n        idx_mock = async_mock_func_factory(nominatim_db.indexer.indexer.Indexer, 'index_postcodes')\n\n        assert self.call_nominatim('refresh', '--postcodes') == 0\n        assert func_mock.called == 1\n        assert idx_mock.called == 1\n\n    def test_refresh_postcodes_no_place_table(self):\n        # Do nothing without the place table\n        assert self.call_nominatim('refresh', '--postcodes') == 0\n\n    def test_refresh_create_functions(self, mock_func_factory):\n        func_mock = mock_func_factory(nominatim_db.tools.refresh, 'create_functions')\n\n        assert self.call_nominatim('refresh', '--functions') == 0\n        assert func_mock.called == 1\n        assert self.tokenizer_mock.update_sql_functions_called\n\n    def test_refresh_wikidata_file_not_found(self, monkeypatch):\n        monkeypatch.setenv('NOMINATIM_WIKIPEDIA_DATA_PATH', 'gjoiergjeroi345Q')\n\n        assert self.call_nominatim('refresh', '--wiki-data') == 1\n\n    def test_refresh_secondary_importance_file_not_found(self):\n        assert self.call_nominatim('refresh', '--secondary-importance') == 1\n\n    def test_refresh_secondary_importance_new_table(self, mock_func_factory):\n        mocks = [mock_func_factory(nominatim_db.tools.refresh, 'import_secondary_importance'),\n                 mock_func_factory(nominatim_db.tools.refresh, 'create_functions')]\n\n        assert self.call_nominatim('refresh', '--secondary-importance') == 0\n        assert mocks[0].called == 1\n        assert mocks[1].called == 1\n\n    def test_refresh_importance_computed_after_wiki_import(self, monkeypatch, mock_func_factory):\n        calls = []\n        monkeypatch.setattr(nominatim_db.tools.refresh, 'import_wikipedia_articles',\n                            lambda *args, **kwargs: calls.append('import') or 0)\n        monkeypatch.setattr(nominatim_db.tools.refresh, 'recompute_importance',\n                            lambda *args, **kwargs: calls.append('update'))\n        func_mock = mock_func_factory(nominatim_db.tools.refresh, 'create_functions')\n\n        assert self.call_nominatim('refresh', '--importance', '--wiki-data') == 0\n\n        assert calls == ['import', 'update']\n        assert func_mock.called == 1\n\n    @pytest.mark.parametrize('params', [('--data-object', 'w234'),\n                                        ('--data-object', 'N23', '--data-object', 'N24'),\n                                        ('--data-area', 'R7723'),\n                                        ('--data-area', 'r7723', '--data-area', 'r2'),\n                                        ('--data-area', 'R9284425',\n                                         '--data-object', 'n1234567894567')])\n    def test_refresh_objects(self, params, mock_func_factory):\n        func_mock = mock_func_factory(nominatim_db.tools.refresh, 'invalidate_osm_object')\n\n        assert self.call_nominatim('refresh', *params) == 0\n\n        assert func_mock.called == len(params)/2\n\n    @pytest.mark.parametrize('func', ('--data-object', '--data-area'))\n    @pytest.mark.parametrize('param', ('234', 'a55', 'R 453', 'Rel'))\n    def test_refresh_objects_bad_param(self, func, param, mock_func_factory):\n        func_mock = mock_func_factory(nominatim_db.tools.refresh, 'invalidate_osm_object')\n\n        self.call_nominatim('refresh', func, param) == 1\n        assert func_mock.called == 0\n"
  },
  {
    "path": "test/python/cli/test_cmd_replication.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for replication command of command-line interface wrapper.\n\"\"\"\nimport datetime as dt\nimport time\n\nimport pytest\n\nimport nominatim_db.cli\nimport nominatim_db.indexer.indexer\nimport nominatim_db.tools.replication\nimport nominatim_db.tools.refresh\nfrom nominatim_db.db import status\n\n\n@pytest.fixture\ndef tokenizer_mock(monkeypatch):\n    class DummyTokenizer:\n        def __init__(self, *args, **kwargs):\n            self.update_sql_functions_called = False\n            self.finalize_import_called = False\n\n        def update_sql_functions(self, *args):\n            self.update_sql_functions_called = True\n\n        def finalize_import(self, *args):\n            self.finalize_import_called = True\n\n    tok = DummyTokenizer()\n    monkeypatch.setattr(nominatim_db.tokenizer.factory, 'get_tokenizer_for_db',\n                        lambda *args: tok)\n    monkeypatch.setattr(nominatim_db.tokenizer.factory, 'create_tokenizer',\n                        lambda *args: tok)\n\n    return tok\n\n\n@pytest.fixture\ndef init_status(temp_db_conn, status_table):\n    status.set_status(temp_db_conn, date=dt.datetime.now(dt.timezone.utc), seq=1)\n\n\n@pytest.fixture\ndef index_mock(async_mock_func_factory, tokenizer_mock, init_status):\n    return async_mock_func_factory(nominatim_db.indexer.indexer.Indexer, 'index_full')\n\n\n@pytest.fixture\ndef update_mock(mock_func_factory, init_status, tokenizer_mock):\n    return mock_func_factory(nominatim_db.tools.replication, 'update')\n\n\nclass TestCliReplication:\n\n    @pytest.fixture(autouse=True)\n    def setup_cli_call(self, cli_call, temp_db):\n        self.call_nominatim = lambda *args: cli_call('replication', *args)\n\n    @pytest.fixture(autouse=True)\n    def setup_update_function(self, monkeypatch):\n        def _mock_updates(states):\n            monkeypatch.setattr(nominatim_db.tools.replication, 'update',\n                                lambda *args, **kwargs: states.pop())\n\n        self.update_states = _mock_updates\n\n    @pytest.mark.parametrize(\"params,func\", [\n                             (('--init',), 'init_replication'),\n                             (('--init', '--no-update-functions'), 'init_replication'),\n                             (('--check-for-updates',), 'check_for_updates')\n                             ])\n    def test_replication_command(self, mock_func_factory, params, func):\n        func_mock = mock_func_factory(nominatim_db.tools.replication, func)\n\n        if params == ('--init',):\n            umock = mock_func_factory(nominatim_db.tools.refresh, 'create_functions')\n\n        assert self.call_nominatim(*params) == 0\n        assert func_mock.called == 1\n        if params == ('--init',):\n            assert umock.called == 1\n\n    def test_replication_update_bad_interval(self, monkeypatch):\n        monkeypatch.setenv('NOMINATIM_REPLICATION_UPDATE_INTERVAL', 'xx')\n\n        assert self.call_nominatim() == 1\n\n    def test_replication_update_bad_interval_for_geofabrik(self, monkeypatch):\n        monkeypatch.setenv('NOMINATIM_REPLICATION_URL',\n                           'https://download.geofabrik.de/europe/italy-updates')\n\n        assert self.call_nominatim() == 1\n\n    def test_replication_update_continuous_no_index(self):\n        assert self.call_nominatim('--no-index') == 1\n\n    def test_replication_update_once_no_index(self, update_mock, monkeypatch):\n        monkeypatch.setenv('NOMINATIM_OSM2PGSQL_BINARY', 'OSM2PGSQL NOT AVAILABLE')\n        assert self.call_nominatim('--once', '--no-index') == 0\n\n        assert str(update_mock.last_args[1]['osm2pgsql']).endswith('OSM2PGSQL NOT AVAILABLE')\n\n    def test_replication_update_custom_osm2pgsql(self, monkeypatch, update_mock):\n        monkeypatch.setenv('NOMINATIM_OSM2PGSQL_BINARY', '/secret/osm2pgsql')\n        assert self.call_nominatim('--once', '--no-index') == 0\n\n        assert str(update_mock.last_args[1]['osm2pgsql']) == '/secret/osm2pgsql'\n\n    @pytest.mark.parametrize(\"update_interval\", [60, 3600])\n    def test_replication_catchup(self, placex_table, monkeypatch, index_mock, update_interval):\n        monkeypatch.setenv('NOMINATIM_REPLICATION_UPDATE_INTERVAL', str(update_interval))\n        self.update_states([nominatim_db.tools.replication.UpdateState.NO_CHANGES])\n\n        assert self.call_nominatim('--catch-up') == 0\n\n    def test_replication_update_custom_threads(self, update_mock):\n        assert self.call_nominatim('--once', '--no-index', '--threads', '4') == 0\n\n        assert update_mock.last_args[1]['threads'] == 4\n\n    def test_replication_update_continuous(self, index_mock):\n        self.update_states([nominatim_db.tools.replication.UpdateState.UP_TO_DATE,\n                            nominatim_db.tools.replication.UpdateState.UP_TO_DATE])\n\n        with pytest.raises(IndexError):\n            self.call_nominatim()\n\n        assert index_mock.called == 2\n\n    def test_replication_update_continuous_no_change(self, mock_func_factory,\n                                                     index_mock):\n        self.update_states([nominatim_db.tools.replication.UpdateState.NO_CHANGES,\n                            nominatim_db.tools.replication.UpdateState.UP_TO_DATE])\n\n        sleep_mock = mock_func_factory(time, 'sleep')\n\n        with pytest.raises(IndexError):\n            self.call_nominatim()\n\n        assert index_mock.called == 1\n        assert sleep_mock.called == 1\n        assert sleep_mock.last_args[0] == 60\n"
  },
  {
    "path": "test/python/config/test_config.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTest for loading dotenv configuration.\n\"\"\"\nfrom pathlib import Path\nimport pytest\n\nfrom nominatim_db.config import Configuration, flatten_config_list\nfrom nominatim_db.errors import UsageError\n\n\n@pytest.fixture\ndef make_config():\n    \"\"\" Create a configuration object from the given project directory.\n    \"\"\"\n    def _mk_config(project_dir=None):\n        return Configuration(project_dir)\n\n    return _mk_config\n\n\n@pytest.fixture\ndef make_config_path(tmp_path):\n    \"\"\" Create a configuration object with project and config directories\n        in a temporary directory.\n    \"\"\"\n    def _mk_config():\n        (tmp_path / 'project').mkdir()\n        (tmp_path / 'config').mkdir()\n        conf = Configuration(tmp_path / 'project')\n        conf.config_dir = tmp_path / 'config'\n        return conf\n\n    return _mk_config\n\n\ndef test_no_project_dir(make_config):\n    config = make_config()\n\n    assert config.DATABASE_WEBUSER == 'www-data'\n\n\n@pytest.mark.parametrize(\"val\", ('apache', '\"apache\"'))\ndef test_prefer_project_setting_over_default(make_config, val, tmp_path):\n    envfile = tmp_path / '.env'\n    envfile.write_text('NOMINATIM_DATABASE_WEBUSER={}\\n'.format(val), encoding='utf-8')\n\n    config = make_config(tmp_path)\n\n    assert config.DATABASE_WEBUSER == 'apache'\n\n\ndef test_prefer_os_environ_over_project_setting(make_config, monkeypatch, tmp_path):\n    envfile = tmp_path / '.env'\n    envfile.write_text('NOMINATIM_DATABASE_WEBUSER=apache\\n', encoding='utf-8')\n\n    monkeypatch.setenv('NOMINATIM_DATABASE_WEBUSER', 'nobody')\n\n    config = make_config(tmp_path)\n\n    assert config.DATABASE_WEBUSER == 'nobody'\n\n\ndef test_prefer_os_environ_can_unset_project_setting(make_config, monkeypatch, tmp_path):\n    envfile = tmp_path / '.env'\n    envfile.write_text('NOMINATIM_OSM2PGSQL_BINARY=osm2pgsql\\n', encoding='utf-8')\n\n    monkeypatch.setenv('NOMINATIM_OSM2PGSQL_BINARY', '')\n\n    config = make_config(tmp_path)\n\n    assert config.OSM2PGSQL_BINARY == ''\n\n\ndef test_get_os_env_add_defaults(make_config, monkeypatch):\n    config = make_config()\n\n    monkeypatch.delenv('NOMINATIM_DATABASE_WEBUSER', raising=False)\n\n    assert config.get_os_env()['NOMINATIM_DATABASE_WEBUSER'] == 'www-data'\n\n\ndef test_get_os_env_prefer_os_environ(make_config, monkeypatch):\n    config = make_config()\n\n    monkeypatch.setenv('NOMINATIM_DATABASE_WEBUSER', 'nobody')\n\n    assert config.get_os_env()['NOMINATIM_DATABASE_WEBUSER'] == 'nobody'\n\n\ndef test_get_libpq_dsn_convert_default(make_config):\n    config = make_config()\n\n    assert config.get_libpq_dsn() == 'dbname=nominatim'\n\n\ndef test_get_libpq_dsn_convert_php(make_config, monkeypatch):\n    config = make_config()\n\n    monkeypatch.setenv('NOMINATIM_DATABASE_DSN',\n                       'pgsql:dbname=gis;password=foo;host=localhost')\n\n    assert config.get_libpq_dsn() == 'dbname=gis password=foo host=localhost'\n\n\n@pytest.mark.parametrize(\"val,expect\", [('foo bar', \"'foo bar'\"),\n                                        (\"xy'z\", \"xy\\\\'z\"),\n                                        ])\ndef test_get_libpq_dsn_convert_php_special_chars(make_config, monkeypatch, val, expect):\n    config = make_config()\n\n    monkeypatch.setenv('NOMINATIM_DATABASE_DSN',\n                       'pgsql:dbname=gis;password={}'.format(val))\n\n    assert config.get_libpq_dsn() == \"dbname=gis password={}\".format(expect)\n\n\ndef test_get_libpq_dsn_convert_libpq(make_config, monkeypatch):\n    config = make_config()\n\n    monkeypatch.setenv('NOMINATIM_DATABASE_DSN',\n                       'host=localhost dbname=gis password=foo')\n\n    assert config.get_libpq_dsn() == 'host=localhost dbname=gis password=foo'\n\n\n@pytest.mark.parametrize(\"value,result\",\n                         [(x, True) for x in ('1', 'true', 'True', 'yes', 'YES')] +\n                         [(x, False) for x in ('0', 'false', 'no', 'NO', 'x')])\ndef test_get_bool(make_config, monkeypatch, value, result):\n    config = make_config()\n\n    monkeypatch.setenv('NOMINATIM_FOOBAR', value)\n\n    assert config.get_bool('FOOBAR') == result\n\n\ndef test_get_bool_empty(make_config):\n    config = make_config()\n\n    assert config.TOKENIZER_CONFIG == ''\n    assert not config.get_bool('TOKENIZER_CONFIG')\n\n\n@pytest.mark.parametrize(\"value,result\", [('0', 0), ('1', 1),\n                                          ('85762513444', 85762513444)])\ndef test_get_int_success(make_config, monkeypatch, value, result):\n    config = make_config()\n\n    monkeypatch.setenv('NOMINATIM_FOOBAR', value)\n\n    assert config.get_int('FOOBAR') == result\n\n\n@pytest.mark.parametrize(\"value\", ['1b', 'fg', '0x23'])\ndef test_get_int_bad_values(make_config, monkeypatch, value):\n    config = make_config()\n\n    monkeypatch.setenv('NOMINATIM_FOOBAR', value)\n\n    with pytest.raises(UsageError):\n        config.get_int('FOOBAR')\n\n\ndef test_get_int_empty(make_config):\n    config = make_config()\n\n    assert config.TOKENIZER_CONFIG == ''\n\n    with pytest.raises(UsageError):\n        config.get_int('TOKENIZER_CONFIG')\n\n\n@pytest.mark.parametrize(\"value,outlist\", [('sd', ['sd']),\n                                           ('dd,rr', ['dd', 'rr']),\n                                           (' a , b ', ['a', 'b'])])\ndef test_get_str_list_success(make_config, monkeypatch, value, outlist):\n    config = make_config()\n\n    monkeypatch.setenv('NOMINATIM_MYLIST', value)\n\n    assert config.get_str_list('MYLIST') == outlist\n\n\ndef test_get_str_list_empty(make_config):\n    config = make_config()\n\n    assert config.get_str_list('LANGUAGES') is None\n\n\ndef test_get_path_empty(make_config):\n    config = make_config()\n\n    assert config.TOKENIZER_CONFIG == ''\n    assert not config.get_path('TOKENIZER_CONFIG')\n\n\ndef test_get_path_absolute(make_config, monkeypatch, tmp_path):\n    config = make_config()\n\n    p = (tmp_path / \"does_not_exist\").resolve()\n    monkeypatch.setenv('NOMINATIM_FOOBAR', str(p))\n    result = config.get_path('FOOBAR')\n\n    assert isinstance(result, Path)\n    assert str(result) == str(p)\n\n\ndef test_get_path_relative(make_config, monkeypatch, tmp_path):\n    config = make_config(tmp_path)\n\n    monkeypatch.setenv('NOMINATIM_FOOBAR', 'an/oyster')\n    result = config.get_path('FOOBAR')\n\n    assert isinstance(result, Path)\n    assert str(result) == str(tmp_path / 'an/oyster')\n\n\ndef test_get_import_style_intern(make_config, src_dir, monkeypatch):\n    config = make_config()\n\n    monkeypatch.setenv('NOMINATIM_IMPORT_STYLE', 'street')\n\n    expected = src_dir / 'lib-lua' / 'import-street.lua'\n\n    assert config.get_import_style_file() == expected\n\n\ndef test_get_import_style_extern_relative(make_config_path, monkeypatch):\n    config = make_config_path()\n    (config.project_dir / 'custom.style').write_text('x', encoding='utf-8')\n\n    monkeypatch.setenv('NOMINATIM_IMPORT_STYLE', 'custom.style')\n\n    assert str(config.get_import_style_file()) == str(config.project_dir / 'custom.style')\n\n\ndef test_get_import_style_extern_absolute(make_config, tmp_path, monkeypatch):\n    config = make_config()\n    cfgfile = tmp_path / 'test.style'\n\n    cfgfile.write_text('x', encoding='utf-8')\n\n    monkeypatch.setenv('NOMINATIM_IMPORT_STYLE', str(cfgfile))\n\n    assert str(config.get_import_style_file()) == str(cfgfile)\n\n\ndef test_load_subconf_from_project_dir(make_config_path):\n    config = make_config_path()\n\n    testfile = config.project_dir / 'test.yaml'\n    testfile.write_text('cow: muh\\ncat: miau\\n', encoding='utf-8')\n\n    testfile = config.config_dir / 'test.yaml'\n    testfile.write_text('cow: miau\\ncat: muh\\n', encoding='utf-8')\n\n    rules = config.load_sub_configuration('test.yaml')\n\n    assert rules == dict(cow='muh', cat='miau')\n\n\ndef test_load_subconf_from_settings_dir(make_config_path):\n    config = make_config_path()\n\n    testfile = config.config_dir / 'test.yaml'\n    testfile.write_text('cow: muh\\ncat: miau\\n', encoding='utf-8')\n\n    rules = config.load_sub_configuration('test.yaml')\n\n    assert rules == dict(cow='muh', cat='miau')\n\n\ndef test_load_subconf_empty_env_conf(make_config_path, monkeypatch):\n    monkeypatch.setenv('NOMINATIM_MY_CONFIG', '')\n    config = make_config_path()\n\n    testfile = config.config_dir / 'test.yaml'\n    testfile.write_text('cow: muh\\ncat: miau\\n', encoding='utf-8')\n\n    rules = config.load_sub_configuration('test.yaml', config='MY_CONFIG')\n\n    assert rules == dict(cow='muh', cat='miau')\n\n\ndef test_load_subconf_env_absolute_found(make_config_path, monkeypatch, tmp_path):\n    monkeypatch.setenv('NOMINATIM_MY_CONFIG', str(tmp_path / 'other.yaml'))\n    config = make_config_path()\n\n    (config.config_dir / 'test.yaml').write_text('cow: muh\\ncat: miau\\n', encoding='utf-8')\n    (tmp_path / 'other.yaml').write_text('dog: muh\\nfrog: miau\\n', encoding='utf-8')\n\n    rules = config.load_sub_configuration('test.yaml', config='MY_CONFIG')\n\n    assert rules == dict(dog='muh', frog='miau')\n\n\ndef test_load_subconf_env_absolute_not_found(make_config_path, monkeypatch, tmp_path):\n    monkeypatch.setenv('NOMINATIM_MY_CONFIG', str(tmp_path / 'other.yaml'))\n    config = make_config_path()\n\n    (config.config_dir / 'test.yaml').write_text('cow: muh\\ncat: miau\\n', encoding='utf-8')\n\n    with pytest.raises(UsageError, match='Config file not found.'):\n        config.load_sub_configuration('test.yaml', config='MY_CONFIG')\n\n\n@pytest.mark.parametrize(\"location\", ['project_dir', 'config_dir'])\ndef test_load_subconf_env_relative_found(make_config_path, monkeypatch, location):\n    monkeypatch.setenv('NOMINATIM_MY_CONFIG', 'other.yaml')\n    config = make_config_path()\n\n    (config.config_dir / 'test.yaml').write_text('cow: muh\\ncat: miau\\n', encoding='utf-8')\n    (getattr(config, location) / 'other.yaml').write_text('dog: bark\\n', encoding='utf-8')\n\n    rules = config.load_sub_configuration('test.yaml', config='MY_CONFIG')\n\n    assert rules == dict(dog='bark')\n\n\ndef test_load_subconf_env_relative_not_found(make_config_path, monkeypatch):\n    monkeypatch.setenv('NOMINATIM_MY_CONFIG', 'other.yaml')\n    config = make_config_path()\n\n    (config.config_dir / 'test.yaml').write_text('cow: muh\\ncat: miau\\n', encoding='utf-8')\n\n    with pytest.raises(UsageError, match='Config file not found.'):\n        config.load_sub_configuration('test.yaml', config='MY_CONFIG')\n\n\ndef test_load_subconf_json(make_config_path):\n    config = make_config_path()\n\n    (config.project_dir / 'test.json').write_text('{\"cow\": \"muh\", \"cat\": \"miau\"}', encoding='utf-8')\n\n    rules = config.load_sub_configuration('test.json')\n\n    assert rules == dict(cow='muh', cat='miau')\n\n\ndef test_load_subconf_not_found(make_config_path):\n    config = make_config_path()\n\n    with pytest.raises(UsageError, match='Config file not found.'):\n        config.load_sub_configuration('test.yaml')\n\n\ndef test_load_subconf_env_unknown_format(make_config_path):\n    config = make_config_path()\n\n    (config.project_dir / 'test.xml').write_text('<html></html>', encoding='utf-8')\n\n    with pytest.raises(UsageError, match='unknown format'):\n        config.load_sub_configuration('test.xml')\n\n\ndef test_load_subconf_include_absolute(make_config_path, tmp_path):\n    config = make_config_path()\n\n    testfile = config.config_dir / 'test.yaml'\n    testfile.write_text(f'base: !include {tmp_path}/inc.yaml\\n', encoding='utf-8')\n    (tmp_path / 'inc.yaml').write_text('first: 1\\nsecond: 2\\n', encoding='utf-8')\n\n    rules = config.load_sub_configuration('test.yaml')\n\n    assert rules == dict(base=dict(first=1, second=2))\n\n\n@pytest.mark.parametrize(\"location\", ['project_dir', 'config_dir'])\ndef test_load_subconf_include_relative(make_config_path, tmp_path, location):\n    config = make_config_path()\n\n    testfile = config.config_dir / 'test.yaml'\n    testfile.write_text('base: !include inc.yaml\\n', encoding='utf-8')\n    (getattr(config, location) / 'inc.yaml').write_text('first: 1\\nsecond: 2\\n', encoding='utf-8')\n\n    rules = config.load_sub_configuration('test.yaml')\n\n    assert rules == dict(base=dict(first=1, second=2))\n\n\ndef test_load_subconf_include_bad_format(make_config_path):\n    config = make_config_path()\n\n    testfile = config.config_dir / 'test.yaml'\n    testfile.write_text('base: !include inc.txt\\n', encoding='utf-8')\n    (config.config_dir / 'inc.txt').write_text('first: 1\\nsecond: 2\\n', encoding='utf-8')\n\n    with pytest.raises(UsageError, match='Cannot handle config file format.'):\n        config.load_sub_configuration('test.yaml')\n\n\ndef test_load_subconf_include_not_found(make_config_path):\n    config = make_config_path()\n\n    testfile = config.config_dir / 'test.yaml'\n    testfile.write_text('base: !include inc.txt\\n', encoding='utf-8')\n\n    with pytest.raises(UsageError, match='Config file not found.'):\n        config.load_sub_configuration('test.yaml')\n\n\ndef test_load_subconf_include_recursive(make_config_path):\n    config = make_config_path()\n\n    testfile = config.config_dir / 'test.yaml'\n    testfile.write_text('base: !include inc.yaml\\n', encoding='utf-8')\n    (config.config_dir / 'inc.yaml').write_text('- !include more.yaml\\n- upper\\n', encoding='utf-8')\n    (config.config_dir / 'more.yaml').write_text('- the end\\n', encoding='utf-8')\n\n    rules = config.load_sub_configuration('test.yaml')\n\n    assert rules == dict(base=[['the end'], 'upper'])\n\n\n@pytest.mark.parametrize(\"content\", [[], None])\ndef test_flatten_config_list_empty(content):\n    assert flatten_config_list(content) == []\n\n\n@pytest.mark.parametrize(\"content\", [{'foo': 'bar'}, 'hello world', 3])\ndef test_flatten_config_list_no_list(content):\n    with pytest.raises(UsageError):\n        flatten_config_list(content)\n\n\ndef test_flatten_config_list_allready_flat():\n    assert flatten_config_list([1, 2, 456]) == [1, 2, 456]\n\n\ndef test_flatten_config_list_nested():\n    content = [\n        34,\n        [{'first': '1st', 'second': '2nd'}, {}],\n        [[2, 3], [45, [56, 78], 66]],\n        'end'\n    ]\n\n    assert flatten_config_list(content) == \\\n        [34, {'first': '1st', 'second': '2nd'}, {}, 2, 3, 45, 56, 78, 66, 'end']\n"
  },
  {
    "path": "test/python/config/test_config_load_module.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTest for loading extra Python modules.\n\"\"\"\nimport sys\n\nimport pytest\n\nfrom nominatim_db.config import Configuration\n\n\n@pytest.fixture\ndef test_config(src_dir, tmp_path):\n    \"\"\" Create a configuration object with project and config directories\n        in a temporary directory.\n    \"\"\"\n    (tmp_path / 'project').mkdir()\n    (tmp_path / 'config').mkdir()\n    conf = Configuration(tmp_path / 'project')\n    conf.config_dir = tmp_path / 'config'\n    return conf\n\n\ndef test_load_default_module(test_config):\n    module = test_config.load_plugin_module('version', 'nominatim_db')\n\n    assert isinstance(module.NOMINATIM_VERSION, tuple)\n\n\ndef test_load_default_module_with_hyphen(test_config):\n    module = test_config.load_plugin_module('place-info', 'nominatim_db.data')\n\n    assert isinstance(module.PlaceInfo, object)\n\n\ndef test_load_plugin_module(test_config, tmp_path):\n    (tmp_path / 'project' / 'testpath').mkdir()\n    (tmp_path / 'project' / 'testpath' / 'mymod.py')\\\n        .write_text(\"def my_test_function():\\n  return 'gjwitlsSG42TG%'\", encoding='utf-8')\n\n    module = test_config.load_plugin_module('testpath/mymod.py', 'private.something')\n\n    assert module.my_test_function() == 'gjwitlsSG42TG%'\n\n    # also test reloading module\n    (tmp_path / 'project' / 'testpath' / 'mymod.py')\\\n        .write_text(\"def my_test_function():\\n  return 'hjothjorhj'\", encoding='utf-8')\n\n    module = test_config.load_plugin_module('testpath/mymod.py', 'private.something')\n\n    assert module.my_test_function() == 'gjwitlsSG42TG%'\n\n\ndef test_load_external_library_module(test_config, tmp_path, monkeypatch):\n    MODULE_NAME = 'foogurenqodr4'\n    pythonpath = tmp_path / 'priv-python'\n    pythonpath.mkdir()\n    (pythonpath / MODULE_NAME).mkdir()\n    (pythonpath / MODULE_NAME / '__init__.py').write_text('', encoding='utf-8')\n    (pythonpath / MODULE_NAME / 'tester.py')\\\n        .write_text(\"def my_test_function():\\n  return 'gjwitlsSG42TG%'\", encoding='utf-8')\n\n    monkeypatch.syspath_prepend(pythonpath)\n\n    module = test_config.load_plugin_module(f'{MODULE_NAME}.tester', 'private.something')\n\n    assert module.my_test_function() == 'gjwitlsSG42TG%'\n\n    # also test reloading module\n    (pythonpath / MODULE_NAME / 'tester.py')\\\n        .write_text(\"def my_test_function():\\n  return 'dfigjreigj'\", encoding='utf-8')\n\n    module = test_config.load_plugin_module(f'{MODULE_NAME}.tester', 'private.something')\n\n    assert module.my_test_function() == 'gjwitlsSG42TG%'\n\n    del sys.modules[f'{MODULE_NAME}.tester']\n"
  },
  {
    "path": "test/python/conftest.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\nimport itertools\nimport sys\nimport asyncio\nfrom pathlib import Path\n\nif sys.platform == 'win32':\n    asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())\n\nimport psycopg\nfrom psycopg import sql as pysql\nimport pytest\n\n# always test against the source\nSRC_DIR = (Path(__file__) / '..' / '..' / '..').resolve()\nsys.path.insert(0, str(SRC_DIR / 'src'))\n\nfrom nominatim_db.config import Configuration\nfrom nominatim_db.db import connection, properties\nfrom nominatim_db.db.sql_preprocessor import SQLPreprocessor\nimport nominatim_db.tokenizer.factory\n\nimport dummy_tokenizer\nfrom cursor import CursorForTesting\n\n\ndef _with_srid(geom, default=None):\n    if geom is None:\n        return None if default is None else f\"SRID=4326;{default}\"\n\n    return f\"SRID=4326;{geom}\"\n\n\n@pytest.fixture\ndef src_dir():\n    return SRC_DIR\n\n\n@pytest.fixture\ndef temp_db(monkeypatch):\n    \"\"\" Create an empty database for the test. The database name is also\n        exported into NOMINATIM_DATABASE_DSN.\n    \"\"\"\n    name = 'test_nominatim_python_unittest'\n\n    with psycopg.connect(dbname='postgres', autocommit=True) as conn:\n        with conn.cursor() as cur:\n            cur.execute(pysql.SQL('DROP DATABASE IF EXISTS') + pysql.Identifier(name))\n            cur.execute(pysql.SQL('CREATE DATABASE') + pysql.Identifier(name))\n\n    monkeypatch.setenv('NOMINATIM_DATABASE_DSN', 'dbname=' + name)\n\n    with psycopg.connect(dbname=name) as conn:\n        with conn.cursor() as cur:\n            cur.execute('CREATE EXTENSION hstore')\n\n    yield name\n\n    with psycopg.connect(dbname='postgres', autocommit=True) as conn:\n        with conn.cursor() as cur:\n            cur.execute(pysql.SQL('DROP DATABASE IF EXISTS') + pysql.Identifier(name))\n\n\n@pytest.fixture\ndef dsn(temp_db):\n    return 'dbname=' + temp_db\n\n\n@pytest.fixture\ndef temp_db_with_extensions(temp_db):\n    with psycopg.connect(dbname=temp_db) as conn:\n        with conn.cursor() as cur:\n            cur.execute('CREATE EXTENSION postgis')\n\n    return temp_db\n\n\n@pytest.fixture\ndef temp_db_conn(temp_db):\n    \"\"\" Connection to the test database.\n    \"\"\"\n    with connection.connect('', autocommit=True, dbname=temp_db) as conn:\n        connection.register_hstore(conn)\n        yield conn\n\n\n@pytest.fixture\ndef temp_db_cursor(temp_db):\n    \"\"\" Connection and cursor towards the test database. The connection will\n        be in auto-commit mode.\n    \"\"\"\n    with psycopg.connect(dbname=temp_db, autocommit=True, cursor_factory=CursorForTesting) as conn:\n        connection.register_hstore(conn)\n        with conn.cursor() as cur:\n            yield cur\n\n\n@pytest.fixture\ndef table_factory(temp_db_conn):\n    \"\"\" A fixture that creates new SQL tables, potentially filled with\n        content.\n    \"\"\"\n    def mk_table(name, definition='id INT', content=None):\n        with psycopg.ClientCursor(temp_db_conn) as cur:\n            cur.execute(pysql.SQL(\"CREATE TABLE {} ({})\")\n                             .format(pysql.Identifier(name),\n                                     pysql.SQL(definition)))\n            if content:\n                sql = pysql.SQL(\"INSERT INTO {} VALUES ({})\")\\\n                           .format(pysql.Identifier(name),\n                                   pysql.SQL(',').join([pysql.Placeholder()\n                                                        for _ in range(len(content[0]))]))\n                cur.executemany(sql, content)\n\n    return mk_table\n\n\n@pytest.fixture\ndef def_config():\n    cfg = Configuration(None)\n    return cfg\n\n\n@pytest.fixture\ndef project_env(tmp_path):\n    projdir = tmp_path / 'project'\n    projdir.mkdir()\n    cfg = Configuration(projdir)\n    return cfg\n\n\n@pytest.fixture\ndef country_table(table_factory):\n    table_factory('country_name', 'partition INT, country_code varchar(2), name hstore')\n\n\n@pytest.fixture\ndef country_row(country_table, temp_db_cursor):\n    def _add(partition=None, country=None, names=None):\n        temp_db_cursor.insert_row('country_name', partition=partition,\n                                  country_code=country, name=names)\n\n    return _add\n\n\n@pytest.fixture\ndef load_sql(temp_db_conn, country_table):\n    conf = Configuration(None)\n\n    def _run(*filename, **kwargs):\n        for fn in filename:\n            SQLPreprocessor(temp_db_conn, conf).run_sql_file(temp_db_conn, fn, **kwargs)\n\n    return _run\n\n\n@pytest.fixture\ndef property_table(load_sql, temp_db_conn):\n    load_sql('tables/nominatim_properties.sql')\n\n    class _PropTable:\n        def set(self, name, value):\n            properties.set_property(temp_db_conn, name, value)\n\n        def get(self, name):\n            return properties.get_property(temp_db_conn, name)\n\n    return _PropTable()\n\n\n@pytest.fixture\ndef status_table(load_sql):\n    \"\"\" Create an empty version of the status table and\n        the status logging table.\n    \"\"\"\n    load_sql('tables/status.sql')\n\n\n@pytest.fixture\ndef place_table(temp_db_with_extensions, table_factory):\n    \"\"\" Create an empty version of the place table.\n    \"\"\"\n    table_factory('place',\n                  \"\"\"osm_id int8 NOT NULL,\n                     osm_type char(1) NOT NULL,\n                     class text NOT NULL,\n                     type text NOT NULL,\n                     name hstore,\n                     admin_level smallint,\n                     address HSTORE,\n                     extratags HSTORE,\n                     geometry GEOMETRY(Geometry,4326) NOT NULL\"\"\")\n\n\n@pytest.fixture\ndef place_row(place_table, temp_db_cursor):\n    \"\"\" A factory for rows in the place table. The table is created as a\n        prerequisite to the fixture.\n    \"\"\"\n    idseq = itertools.count(1001)\n\n    def _insert(osm_type='N', osm_id=None, cls='amenity', typ='cafe', names=None,\n                admin_level=None, address=None, extratags=None, geom='POINT(0 0)'):\n        args = {'osm_type': osm_type, 'osm_id': osm_id or next(idseq),\n                'class': cls, 'type': typ, 'name': names, 'admin_level': admin_level,\n                'address': address, 'extratags': extratags,\n                'geometry': _with_srid(geom)}\n        temp_db_cursor.insert_row('place', **args)\n\n    return _insert\n\n\n@pytest.fixture\ndef place_postcode_table(temp_db_with_extensions, table_factory):\n    \"\"\" Create an empty version of the place_postcode table.\n    \"\"\"\n    table_factory('place_postcode',\n                  \"\"\"osm_type char(1) NOT NULL,\n                     osm_id bigint NOT NULL,\n                     postcode text NOT NULL,\n                     country_code TEXT,\n                     centroid GEOMETRY(Point, 4326) NOT NULL,\n                     geometry GEOMETRY(Geometry, 4326)\"\"\")\n\n\n@pytest.fixture\ndef place_postcode_row(place_postcode_table, temp_db_cursor):\n    \"\"\" A factory for rows in the place_postcode table. The table is created as a\n        prerequisite to the fixture.\n    \"\"\"\n    idseq = itertools.count(5001)\n\n    def _insert(osm_type='N', osm_id=None, postcode=None, country=None,\n                centroid='POINT(12.0 4.0)', geom=None):\n        temp_db_cursor.insert_row('place_postcode',\n                                  osm_type=osm_type, osm_id=osm_id or next(idseq),\n                                  postcode=postcode, country_code=country,\n                                  centroid=_with_srid(centroid),\n                                  geometry=_with_srid(geom))\n\n    return _insert\n\n\n@pytest.fixture\ndef place_interpolation_table(temp_db_with_extensions, table_factory):\n    \"\"\" Create an empty version of the place_interpolation table.\n    \"\"\"\n    table_factory('place_interpolation',\n                  \"\"\"osm_id bigint NOT NULL,\n                     type TEXT,\n                     address HSTORE,\n                     nodes BIGINT[],\n                     geometry GEOMETRY(Geometry, 4326)\"\"\")\n\n\n@pytest.fixture\ndef place_interpolation_row(place_interpolation_table, temp_db_cursor):\n    \"\"\" A factory for rows in the place_interpolation table. The table is created as a\n        prerequisite to the fixture.\n    \"\"\"\n    idseq = itertools.count(30001)\n\n    def _insert(osm_id=None, typ='odd', address=None,\n                nodes=None, geom='LINESTRING(0.1 0.21, 0.1 0.2)'):\n        params = {'osm_id': osm_id or next(idseq),\n                  'type': typ, 'address': address, 'nodes': nodes,\n                  'geometry': _with_srid(geom)}\n        temp_db_cursor.insert_row('place_interpolation', **params)\n\n    return _insert\n\n\n@pytest.fixture\ndef placex_table(temp_db_with_extensions, temp_db_conn, load_sql, place_table):\n    \"\"\" Create an empty version of the placex table.\n    \"\"\"\n    load_sql('tables/placex.sql')\n    temp_db_conn.execute(\"CREATE SEQUENCE IF NOT EXISTS seq_place START 1\")\n\n\n@pytest.fixture\ndef placex_row(placex_table, temp_db_cursor):\n    \"\"\" A factory for rows in the placex table. The table is created as a\n        prerequisite to the fixture.\n    \"\"\"\n    idseq = itertools.count(1001)\n\n    def _add(osm_type='N', osm_id=None, cls='amenity', typ='cafe', names=None,\n             admin_level=None, address=None, extratags=None, geom='POINT(10 4)',\n             country=None, housenumber=None, rank_search=30, rank_address=30,\n             centroid='POINT(10 4)', indexed_status=0, indexed_date=None,\n             importance=0.00001):\n        args = {'place_id': pysql.SQL(\"nextval('seq_place')\"),\n                'osm_type': osm_type, 'osm_id': osm_id or next(idseq),\n                'class': cls, 'type': typ, 'name': names, 'admin_level': admin_level,\n                'address': address, 'housenumber': housenumber,\n                'rank_search': rank_search, 'rank_address': rank_address,\n                'extratags': extratags, 'importance': importance,\n                'centroid': _with_srid(centroid), 'geometry': _with_srid(geom),\n                'country_code': country,\n                'indexed_status': indexed_status, 'indexed_date': indexed_date,\n                'partition': pysql.Literal(0), 'geometry_sector': pysql.Literal(1)}\n        return temp_db_cursor.insert_row('placex', **args)\n\n    return _add\n\n\n@pytest.fixture\ndef osmline_table(temp_db_with_extensions, load_sql):\n    load_sql('tables/interpolation.sql')\n\n\n@pytest.fixture\ndef osmline_row(osmline_table, temp_db_cursor):\n    idseq = itertools.count(20001)\n\n    def _add(osm_id=None, geom='LINESTRING(12.0 11.0, 12.003 11.0)'):\n        return temp_db_cursor.insert_row(\n            'location_property_osmline',\n            place_id=pysql.SQL(\"nextval('seq_place')\"),\n            osm_id=osm_id or next(idseq),\n            geometry_sector=pysql.Literal(20),\n            partition=pysql.Literal(0),\n            indexed_status=1,\n            linegeo=_with_srid(geom))\n\n    return _add\n\n\n@pytest.fixture\ndef postcode_table(temp_db_with_extensions, load_sql):\n    load_sql('tables/postcodes.sql')\n\n\n@pytest.fixture\ndef postcode_row(postcode_table, temp_db_cursor):\n    def _add(country, postcode, x=34.5, y=-9.33):\n        geom = _with_srid(f\"POINT({x} {y})\")\n        return temp_db_cursor.insert_row(\n            'location_postcodes',\n            place_id=pysql.SQL(\"nextval('seq_place')\"),\n            indexed_status=pysql.Literal(1),\n            country_code=country, postcode=postcode,\n            centroid=geom,\n            rank_search=pysql.Literal(16),\n            geometry=('ST_Expand(%s::geometry, 0.005)', geom))\n\n    return _add\n\n\n@pytest.fixture\ndef sql_preprocessor_cfg(tmp_path, table_factory, temp_db_with_extensions, country_row):\n    for part in range(3):\n        country_row(partition=part)\n\n    cfg = Configuration(None)\n    cfg.set_libdirs(sql=tmp_path)\n    return cfg\n\n\n@pytest.fixture\ndef sql_preprocessor(sql_preprocessor_cfg, temp_db_conn):\n    return SQLPreprocessor(temp_db_conn, sql_preprocessor_cfg)\n\n\n@pytest.fixture\ndef tokenizer_mock(monkeypatch, property_table):\n    \"\"\" Sets up the configuration so that the test dummy tokenizer will be\n        loaded when the tokenizer factory is used. Also returns a factory\n        with which a new dummy tokenizer may be created.\n    \"\"\"\n    monkeypatch.setenv('NOMINATIM_TOKENIZER', 'dummy')\n\n    def _import_dummy(*args, **kwargs):\n        return dummy_tokenizer\n\n    monkeypatch.setattr(nominatim_db.tokenizer.factory,\n                        \"_import_tokenizer\", _import_dummy)\n    property_table.set('tokenizer', 'dummy')\n\n    def _create_tokenizer():\n        return dummy_tokenizer.DummyTokenizer(None)\n\n    return _create_tokenizer\n"
  },
  {
    "path": "test/python/cursor.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nSpecialised psycopg cursor with shortcut functions useful for testing.\n\"\"\"\nimport psycopg\nfrom psycopg import sql as pysql\n\n\nclass CursorForTesting(psycopg.Cursor):\n    \"\"\" Extension to the DictCursor class that provides execution\n        short-cuts that simplify writing assertions.\n    \"\"\"\n\n    def scalar(self, sql, params=None):\n        \"\"\" Execute a query with a single return value and return this value.\n            Raises an assertion when not exactly one row is returned.\n        \"\"\"\n        self.execute(sql, params)\n        assert self.rowcount == 1\n        return self.fetchone()[0]\n\n    def row_set(self, sql, params=None):\n        \"\"\" Execute a query and return the result as a set of tuples.\n            Fails when the SQL command returns duplicate rows.\n        \"\"\"\n        self.execute(sql, params)\n\n        result = set((tuple(row) for row in self))\n        assert len(result) == self.rowcount\n\n        return result\n\n    def table_exists(self, table):\n        \"\"\" Check that a table with the given name exists in the database.\n        \"\"\"\n        num = self.scalar(\"\"\"SELECT count(*) FROM pg_tables\n                             WHERE tablename = %s\"\"\", (table, ))\n        return num == 1\n\n    def index_exists(self, table, index):\n        \"\"\" Check that an indexwith the given name exists on the given table.\n        \"\"\"\n        num = self.scalar(\"\"\"SELECT count(*) FROM pg_indexes\n                             WHERE tablename = %s and indexname = %s\"\"\",\n                          (table, index))\n        return num == 1\n\n    def table_rows(self, table, where=None):\n        \"\"\" Return the number of rows in the given table.\n        \"\"\"\n        sql = pysql.SQL('SELECT count(*) FROM') + pysql.Identifier(table)\n        if where is not None:\n            sql += pysql.SQL('WHERE') + pysql.SQL(where)\n\n        return self.scalar(sql)\n\n    def insert_row(self, table, **data):\n        \"\"\" Insert a row into the given table.\n\n            'data' is a dictionary of column names and associated values.\n            When the value is a pysql.Literal or pysql.SQL, then the expression\n            will be inserted as is instead of loading the value. When the\n            value is a tuple, then the first element will be added as an\n            SQL expression for the value and the second element is treated\n            as the actual value to insert. The SQL expression must contain\n            a %s placeholder in that case.\n\n            If data contains a 'place_id' column, then the value of the\n            place_id column after insert is returned. Otherwise the function\n            returns nothing.\n        \"\"\"\n        columns = []\n        placeholders = []\n        values = []\n        for k, v in data.items():\n            columns.append(pysql.Identifier(k))\n            if isinstance(v, tuple):\n                placeholders.append(pysql.SQL(v[0]))\n                values.append(v[1])\n            elif isinstance(v, (pysql.Literal, pysql.SQL)):\n                placeholders.append(v)\n            else:\n                placeholders.append(pysql.Placeholder())\n                values.append(v)\n\n        sql = pysql.SQL(\"INSERT INTO {table} ({columns}) VALUES({values})\")\\\n                   .format(table=pysql.Identifier(table),\n                           columns=pysql.SQL(',').join(columns),\n                           values=pysql.SQL(',').join(placeholders))\n\n        if 'place_id' in data:\n            sql += pysql.SQL('RETURNING place_id')\n\n        self.execute(sql, values)\n\n        return self.fetchone()[0] if 'place_id' in data else None\n"
  },
  {
    "path": "test/python/data/test_country_info.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for function that handle country properties.\n\"\"\"\nfrom textwrap import dedent\nimport pytest\n\nfrom nominatim_db.data import country_info\n\n\n@pytest.fixture\ndef loaded_country(def_config):\n    country_info.setup_country_config(def_config)\n\n\n@pytest.fixture\ndef env_with_country_config(project_env):\n\n    def _mk_config(cfg):\n        (project_env.project_dir / 'country_settings.yaml').write_text(\n            dedent(cfg), encoding='utf-8')\n\n        return project_env\n\n    return _mk_config\n\n\n@pytest.mark.parametrize(\"no_partitions\", (True, False))\ndef test_setup_country_tables(src_dir, temp_db_with_extensions, dsn, temp_db_cursor,\n                              loaded_country, no_partitions):\n    country_info.setup_country_tables(dsn, src_dir / 'data', no_partitions)\n\n    assert temp_db_cursor.table_exists('country_name')\n    assert temp_db_cursor.table_rows('country_name') == \\\n        temp_db_cursor.scalar(\n            'SELECT count(DISTINCT country_code) FROM country_name')\n\n    partitions = temp_db_cursor.row_set(\n        \"SELECT DISTINCT partition FROM country_name\")\n    if no_partitions:\n        assert partitions == {(0, )}\n    else:\n        assert len(partitions) > 10\n\n    assert temp_db_cursor.table_exists('country_osm_grid')\n    assert temp_db_cursor.table_rows('country_osm_grid') > 100\n\n\n@pytest.mark.parametrize(\"languages\", (None, ['fr', 'en']))\ndef test_create_country_names(temp_db_with_extensions, temp_db_conn, temp_db_cursor,\n                              country_row, tokenizer_mock, languages, loaded_country):\n    temp_db_cursor.execute('TRUNCATE country_name')\n    country_row(country='us', names={\"name\": \"us1\", \"name:af\": \"us2\"})\n    country_row(country='fr', names={\"name\": \"Fra\", \"name:en\": \"Fren\"})\n\n    assert temp_db_cursor.scalar(\"SELECT count(*) FROM country_name\") == 2\n\n    tokenizer = tokenizer_mock()\n\n    country_info.create_country_names(temp_db_conn, tokenizer, languages)\n\n    assert len(tokenizer.analyser_cache['countries']) == 2\n\n    result_set = {k: set(v.values())\n                  for k, v in tokenizer.analyser_cache['countries']}\n\n    if languages:\n        assert result_set == {'us': set(('us', 'us1')),\n                              'fr': set(('fr', 'Fra', 'Fren'))}\n    else:\n        assert result_set == {'us': set(('us', 'us1', 'us2')),\n                              'fr': set(('fr', 'Fra', 'Fren'))}\n\n\ndef test_setup_country_names_prefixes(env_with_country_config):\n    config = env_with_country_config(\"\"\"\\\n                                     es:\n                                       names:\n                                         name:\n                                           en: Spain\n                                           de: Spanien\n                                           default: Espagñe\n                                     us:\n                                       names:\n                                         short_name:\n                                           default: USA\n                                         name:\n                                           default: United States\n                                           en: United States\n                                     \"\"\")\n    info = country_info._CountryInfo()\n    info.load(config)\n\n    assert info.get('es')['names'] == {\"name\": \"Espagñe\",\n                                       \"name:en\": \"Spain\",\n                                       \"name:de\": \"Spanien\"}\n    assert info.get('us')['names'] == {\"name\": \"United States\",\n                                       \"name:en\": \"United States\",\n                                       \"short_name\": \"USA\"}\n    assert 'names' not in info.get('xx')\n\n\ndef test_setup_country_config_languages_not_loaded(env_with_country_config):\n    config = env_with_country_config(\"\"\"\\\n                                     de:\n                                         partition: 3\n                                         names:\n                                             name:\n                                                 default: Deutschland\n                                     \"\"\")\n    info = country_info._CountryInfo()\n    info.load(config)\n    assert dict(info.items()) == {'de': {'partition': 3,\n                                         'languages': [],\n                                         'names': {'name': 'Deutschland'}}}\n\n\ndef test_setup_country_config_name_not_loaded(env_with_country_config):\n    config = env_with_country_config(\"\"\"\\\n                                     de:\n                                         partition: 3\n                                         languages: de\n                                         names:\n                                     \"\"\")\n\n    info = country_info._CountryInfo()\n    info.load(config)\n\n    assert dict(info.items()) == {'de': {'partition': 3,\n                                         'languages': ['de'],\n                                         'names': {}}}\n\n\ndef test_setup_country_config_names_not_loaded(env_with_country_config):\n    config = env_with_country_config(\"\"\"\n                                     de:\n                                         partition: 3\n                                         languages: de\n                                     \"\"\")\n\n    info = country_info._CountryInfo()\n    info.load(config)\n\n    assert dict(info.items()) == {'de': {'partition': 3,\n                                         'languages': ['de'],\n                                         'names': {}}}\n\n\ndef test_setup_country_config_special_character(env_with_country_config):\n    config = env_with_country_config(\"\"\"\n                                     bq:\n                                         partition: 250\n                                         languages: nl\n                                         names:\n                                             name:\n                                                 default: \"\\\\N\"\n                                     \"\"\")\n\n    info = country_info._CountryInfo()\n    info.load(config)\n\n    assert dict(info.items()) == {'bq': {'partition': 250,\n                                         'languages': ['nl'],\n                                         'names': {'name': '\\x85'}}}\n"
  },
  {
    "path": "test/python/db/test_connection.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for specialised connection and cursor classes.\n\"\"\"\nimport pytest\nimport psycopg\n\nimport nominatim_db.db.connection as nc\n\n\n@pytest.fixture\ndef db(dsn):\n    with nc.connect(dsn) as conn:\n        yield conn\n\n\ndef test_connection_table_exists(db, table_factory):\n    assert not nc.table_exists(db, 'foobar')\n\n    table_factory('foobar')\n\n    assert nc.table_exists(db, 'foobar')\n\n\ndef test_has_column_no_table(db):\n    assert not nc.table_has_column(db, 'sometable', 'somecolumn')\n\n\n@pytest.mark.parametrize('name,result', [('tram', True), ('car', False)])\ndef test_has_column(db, table_factory, name, result):\n    table_factory('stuff', 'tram TEXT')\n\n    assert nc.table_has_column(db, 'stuff', name) == result\n\n\ndef test_connection_index_exists(db, table_factory, temp_db_cursor):\n    assert not nc.index_exists(db, 'some_index')\n\n    table_factory('foobar')\n    temp_db_cursor.execute('CREATE INDEX some_index ON foobar(id)')\n\n    assert nc.index_exists(db, 'some_index')\n    assert nc.index_exists(db, 'some_index', table='foobar')\n    assert not nc.index_exists(db, 'some_index', table='bar')\n\n\ndef test_drop_table_existing(db, table_factory):\n    table_factory('dummy')\n    assert nc.table_exists(db, 'dummy')\n\n    nc.drop_tables(db, 'dummy')\n    assert not nc.table_exists(db, 'dummy')\n\n\ndef test_drop_table_non_existing(db):\n    nc.drop_tables(db, 'dfkjgjriogjigjgjrdghehtre')\n\n\ndef test_drop_many_tables(db, table_factory):\n    tables = [f'table{n}' for n in range(5)]\n\n    for t in tables:\n        table_factory(t)\n        assert nc.table_exists(db, t)\n\n    nc.drop_tables(db, *tables)\n\n    for t in tables:\n        assert not nc.table_exists(db, t)\n\n\ndef test_drop_table_non_existing_force(db):\n    with pytest.raises(psycopg.ProgrammingError, match='.*does not exist.*'):\n        nc.drop_tables(db, 'dfkjgjriogjigjgjrdghehtre', if_exists=False)\n\n\ndef test_connection_server_version_tuple(db):\n    ver = nc.server_version_tuple(db)\n\n    assert isinstance(ver, tuple)\n    assert len(ver) == 2\n    assert ver[0] > 8\n\n\ndef test_connection_postgis_version_tuple(db, temp_db_with_extensions):\n    ver = nc.postgis_version_tuple(db)\n\n    assert isinstance(ver, tuple)\n    assert len(ver) == 2\n    assert ver[0] >= 2\n\n\ndef test_cursor_scalar(db, table_factory):\n    table_factory('dummy')\n\n    assert nc.execute_scalar(db, 'SELECT count(*) FROM dummy') == 0\n\n\ndef test_cursor_scalar_many_rows(db):\n    with pytest.raises(RuntimeError, match='Query did not return a single row.'):\n        nc.execute_scalar(db, 'SELECT * FROM pg_tables')\n\n\ndef test_cursor_scalar_no_rows(db, table_factory):\n    table_factory('dummy')\n\n    with pytest.raises(RuntimeError, match='Query did not return a single row.'):\n        nc.execute_scalar(db, 'SELECT id FROM dummy')\n\n\ndef test_get_pg_env_add_variable(monkeypatch):\n    monkeypatch.delenv('PGPASSWORD', raising=False)\n    env = nc.get_pg_env('user=fooF')\n\n    assert env['PGUSER'] == 'fooF'\n    assert 'PGPASSWORD' not in env\n\n\ndef test_get_pg_env_overwrite_variable(monkeypatch):\n    monkeypatch.setenv('PGUSER', 'some default')\n    env = nc.get_pg_env('user=overwriter')\n\n    assert env['PGUSER'] == 'overwriter'\n\n\ndef test_get_pg_env_ignore_unknown():\n    env = nc.get_pg_env('client_encoding=stuff', base_env={})\n\n    assert env == {}\n"
  },
  {
    "path": "test/python/db/test_properties.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for property table manpulation.\n\"\"\"\nimport pytest\n\nfrom nominatim_db.db import properties\n\n\n@pytest.fixture\ndef property_factory(property_table, temp_db_cursor):\n    \"\"\" A function fixture that adds a property into the property table.\n    \"\"\"\n    def _add_property(name, value):\n        temp_db_cursor.execute(\"INSERT INTO nominatim_properties VALUES(%s, %s)\",\n                               (name, value))\n\n    return _add_property\n\n\ndef test_get_property_existing(property_factory, temp_db_conn):\n    property_factory('foo', 'bar')\n\n    assert properties.get_property(temp_db_conn, 'foo') == 'bar'\n\n\ndef test_get_property_unknown(property_factory, temp_db_conn):\n    property_factory('other', 'bar')\n\n    assert properties.get_property(temp_db_conn, 'foo') is None\n\n\n@pytest.mark.parametrize(\"prefill\", (True, False))\ndef test_set_property_new(property_factory, temp_db_conn, temp_db_cursor, prefill):\n    if prefill:\n        property_factory('something', 'bar')\n\n    properties.set_property(temp_db_conn, 'something', 'else')\n\n    assert temp_db_cursor.scalar(\"\"\"SELECT value FROM nominatim_properties\n                                    WHERE property = 'something'\"\"\") == 'else'\n\n    assert properties.get_property(temp_db_conn, 'something') == 'else'\n"
  },
  {
    "path": "test/python/db/test_sql_preprocessor.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for SQL preprocessing.\n\"\"\"\nimport pytest\nimport pytest_asyncio  # noqa\n\nfrom nominatim_db.db.sql_preprocessor import SQLPreprocessor\n\n\n@pytest.fixture\ndef sql_factory(tmp_path):\n    def _mk_sql(sql_body):\n        (tmp_path / 'test.sql').write_text(\"\"\"\n          CREATE OR REPLACE FUNCTION test() RETURNS TEXT\n          AS $$\n          BEGIN\n            {}\n          END;\n          $$ LANGUAGE plpgsql IMMUTABLE;\"\"\".format(sql_body), encoding='utf-8')\n        return 'test.sql'\n\n    return _mk_sql\n\n\n@pytest.mark.parametrize(\"expr,ret\", [\n    (\"'a'\", 'a'),\n    (\"'{{db.partitions|join}}'\", '012'),\n    (\"{% if 'country_name' in db.tables %}'yes'{% else %}'no'{% endif %}\", \"yes\"),\n    (\"{% if 'xxx' in db.tables %}'yes'{% else %}'no'{% endif %}\", \"no\"),\n    (\"'{{db.tablespace.address_data}}'\", \"\"),\n    (\"'{{db.tablespace.search_data}}'\", 'TABLESPACE \"dsearch\"'),\n    (\"'{{db.tablespace.address_index}}'\", 'TABLESPACE \"iaddress\"'),\n    (\"'{{db.tablespace.aux_data}}'\", 'TABLESPACE \"daux\"')\n    ])\ndef test_load_file_simple(sql_preprocessor_cfg, sql_factory,\n                          temp_db_conn, temp_db_cursor, monkeypatch,\n                          expr, ret):\n    monkeypatch.setenv('NOMINATIM_TABLESPACE_SEARCH_DATA', 'dsearch')\n    monkeypatch.setenv('NOMINATIM_TABLESPACE_ADDRESS_INDEX', 'iaddress')\n    monkeypatch.setenv('NOMINATIM_TABLESPACE_AUX_DATA', 'daux')\n    sqlfile = sql_factory(\"RETURN {};\".format(expr))\n\n    SQLPreprocessor(temp_db_conn, sql_preprocessor_cfg).run_sql_file(temp_db_conn, sqlfile)\n\n    assert temp_db_cursor.scalar('SELECT test()') == ret\n\n\ndef test_load_file_with_params(sql_preprocessor, sql_factory, temp_db_conn, temp_db_cursor):\n    sqlfile = sql_factory(\"RETURN '{{ foo }} {{ bar }}';\")\n\n    sql_preprocessor.run_sql_file(temp_db_conn, sqlfile, bar='XX', foo='ZZ')\n\n    assert temp_db_cursor.scalar('SELECT test()') == 'ZZ XX'\n\n\n@pytest.mark.asyncio\nasync def test_load_parallel_file(dsn, sql_preprocessor, tmp_path, temp_db_cursor):\n    (tmp_path / 'test.sql').write_text(\"\"\"\n        CREATE TABLE foo (a TEXT);\n        CREATE TABLE foo2(a TEXT);\"\"\" + \"\\n---\\nCREATE TABLE bar (b INT);\", encoding='utf-8')\n\n    await sql_preprocessor.run_parallel_sql_file(dsn, 'test.sql', num_threads=4)\n\n    assert temp_db_cursor.table_exists('foo')\n    assert temp_db_cursor.table_exists('foo2')\n    assert temp_db_cursor.table_exists('bar')\n"
  },
  {
    "path": "test/python/db/test_status.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for status table manipulation.\n\"\"\"\nimport datetime as dt\n\nimport pytest\n\nimport nominatim_db.db.status\nfrom nominatim_db.errors import UsageError\n\nOSM_NODE_DATA = \"\"\"\\\n<osm version=\"0.6\" generator=\"OpenStreetMap server\" copyright=\"OpenStreetMap and contributors\" attribution=\"http://www.openstreetmap.org/copyright\" license=\"http://opendatacommons.org/licenses/odbl/1-0/\">\n<node id=\"45673\" visible=\"true\" version=\"1\" changeset=\"2047\" timestamp=\"2006-01-27T22:09:10Z\" user=\"Foo\" uid=\"111\" lat=\"48.7586670\" lon=\"8.1343060\">\n</node>\n</osm>\n\"\"\"  # noqa\n\n\ndef iso_date(date):\n    return dt.datetime.strptime(date, nominatim_db.db.status.ISODATE_FORMAT)\\\n               .replace(tzinfo=dt.timezone.utc)\n\n\n@pytest.fixture(autouse=True)\ndef setup_status_table(status_table):\n    pass\n\n\n@pytest.mark.parametrize('offline', [True, False])\ndef test_compute_database_date_from_osm2pgsql(table_factory, temp_db_conn, offline):\n    table_factory('osm2pgsql_properties', 'property TEXT, value TEXT',\n                  content=(('current_timestamp', '2024-01-03T23:45:54Z'), ))\n\n    date = nominatim_db.db.status.compute_database_date(temp_db_conn, offline=offline)\n    assert date == iso_date('2024-01-03T23:45:54')\n\n\ndef test_compute_database_date_from_osm2pgsql_nodata(table_factory, temp_db_conn):\n    table_factory('osm2pgsql_properties', 'property TEXT, value TEXT')\n\n    with pytest.raises(UsageError,\n                       match='Cannot determine database date from data in offline mode'):\n        nominatim_db.db.status.compute_database_date(temp_db_conn, offline=True)\n\n\ndef test_compute_database_date_place_empty(place_table, temp_db_conn):\n    with pytest.raises(UsageError):\n        nominatim_db.db.status.compute_database_date(temp_db_conn)\n\n\ndef test_compute_database_date_valid(monkeypatch, place_row, temp_db_conn):\n    place_row(osm_type='N', osm_id=45673)\n\n    requested_url = []\n\n    def mock_url(url):\n        requested_url.append(url)\n        return OSM_NODE_DATA\n\n    monkeypatch.setattr(nominatim_db.db.status, \"get_url\", mock_url)\n\n    date = nominatim_db.db.status.compute_database_date(temp_db_conn)\n\n    assert requested_url == ['https://www.openstreetmap.org/api/0.6/node/45673/1']\n    assert date == iso_date('2006-01-27T22:09:10')\n\n\ndef test_compute_database_broken_api(monkeypatch, place_row, temp_db_conn):\n    place_row(osm_type='N', osm_id=45673)\n\n    requested_url = []\n\n    def mock_url(url):\n        requested_url.append(url)\n        return '<osm version=\"0.6\" generator=\"OpenStre'\n\n    monkeypatch.setattr(nominatim_db.db.status, \"get_url\", mock_url)\n\n    with pytest.raises(UsageError):\n        nominatim_db.db.status.compute_database_date(temp_db_conn)\n\n\ndef test_set_status_empty_table(temp_db_conn, temp_db_cursor):\n    date = dt.datetime.fromordinal(1000000).replace(tzinfo=dt.timezone.utc)\n    nominatim_db.db.status.set_status(temp_db_conn, date=date)\n\n    assert temp_db_cursor.row_set(\"SELECT * FROM import_status\") == {(date, None, True)}\n\n\ndef test_set_status_filled_table(temp_db_conn, temp_db_cursor):\n    date = dt.datetime.fromordinal(1000000).replace(tzinfo=dt.timezone.utc)\n    nominatim_db.db.status.set_status(temp_db_conn, date=date)\n\n    assert temp_db_cursor.table_rows('import_status') == 1\n\n    date = dt.datetime.fromordinal(1000100).replace(tzinfo=dt.timezone.utc)\n    nominatim_db.db.status.set_status(temp_db_conn, date=date, seq=456, indexed=False)\n\n    assert temp_db_cursor.row_set(\"SELECT * FROM import_status\") == {(date, 456, False)}\n\n\ndef test_set_status_missing_date(temp_db_conn, temp_db_cursor):\n    date = dt.datetime.fromordinal(1000000).replace(tzinfo=dt.timezone.utc)\n    nominatim_db.db.status.set_status(temp_db_conn, date=date)\n\n    assert temp_db_cursor.table_rows('import_status') == 1\n\n    nominatim_db.db.status.set_status(temp_db_conn, date=None, seq=456, indexed=False)\n\n    assert temp_db_cursor.row_set(\"SELECT * FROM import_status\") == {(date, 456, False)}\n\n\ndef test_get_status_empty_table(temp_db_conn):\n    assert nominatim_db.db.status.get_status(temp_db_conn) == (None, None, None)\n\n\ndef test_get_status_success(temp_db_conn):\n    date = dt.datetime.fromordinal(1000000).replace(tzinfo=dt.timezone.utc)\n    nominatim_db.db.status.set_status(temp_db_conn, date=date, seq=667, indexed=False)\n\n    assert nominatim_db.db.status.get_status(temp_db_conn) == (date, 667, False)\n\n\n@pytest.mark.parametrize(\"old_state\", [True, False])\n@pytest.mark.parametrize(\"new_state\", [True, False])\ndef test_set_indexed(temp_db_conn, temp_db_cursor, old_state, new_state):\n    date = dt.datetime.fromordinal(1000000).replace(tzinfo=dt.timezone.utc)\n    nominatim_db.db.status.set_status(temp_db_conn, date=date, indexed=old_state)\n    nominatim_db.db.status.set_indexed(temp_db_conn, new_state)\n\n    assert temp_db_cursor.scalar(\"SELECT indexed FROM import_status\") == new_state\n\n\ndef test_set_indexed_empty_status(temp_db_conn, temp_db_cursor):\n    nominatim_db.db.status.set_indexed(temp_db_conn, True)\n\n    assert temp_db_cursor.table_rows(\"import_status\") == 0\n\n\ndef test_log_status(temp_db_conn, temp_db_cursor):\n    date = dt.datetime.fromordinal(1000000).replace(tzinfo=dt.timezone.utc)\n    start = dt.datetime.now() - dt.timedelta(hours=1)\n\n    nominatim_db.db.status.set_status(temp_db_conn, date=date, seq=56)\n    nominatim_db.db.status.log_status(temp_db_conn, start, 'index')\n\n    temp_db_conn.commit()\n\n    assert temp_db_cursor.table_rows(\"import_osmosis_log\") == 1\n    assert temp_db_cursor.scalar(\"SELECT batchseq FROM import_osmosis_log\") == 56\n    assert temp_db_cursor.scalar(\"SELECT event FROM import_osmosis_log\") == 'index'\n"
  },
  {
    "path": "test/python/db/test_utils.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for DB utility functions in db.utils\n\"\"\"\nimport pytest\n\nimport nominatim_db.db.utils as db_utils\nfrom nominatim_db.errors import UsageError\n\n\ndef test_execute_file_success(dsn, temp_db_cursor, tmp_path):\n    tmpfile = tmp_path / 'test.sql'\n    tmpfile.write_text(\n        'CREATE TABLE test (id INT);\\nINSERT INTO test VALUES(56);', encoding='utf-8')\n\n    db_utils.execute_file(dsn, tmpfile)\n\n    assert temp_db_cursor.row_set('SELECT * FROM test') == {(56, )}\n\n\ndef test_execute_file_bad_file(dsn, tmp_path):\n    with pytest.raises(FileNotFoundError):\n        db_utils.execute_file(dsn, tmp_path / 'test2.sql')\n\n\ndef test_execute_file_bad_sql(dsn, tmp_path):\n    tmpfile = tmp_path / 'test.sql'\n    tmpfile.write_text('CREATE STABLE test (id INT)', encoding='utf-8')\n\n    with pytest.raises(UsageError):\n        db_utils.execute_file(dsn, tmpfile)\n\n\ndef test_execute_file_bad_sql_ignore_errors(dsn, tmp_path):\n    tmpfile = tmp_path / 'test.sql'\n    tmpfile.write_text('CREATE STABLE test (id INT)', encoding='utf-8')\n\n    db_utils.execute_file(dsn, tmpfile, ignore_errors=True)\n\n\ndef test_execute_file_with_pre_code(dsn, tmp_path, temp_db_cursor):\n    tmpfile = tmp_path / 'test.sql'\n    tmpfile.write_text('INSERT INTO test VALUES(4)', encoding='utf-8')\n\n    db_utils.execute_file(dsn, tmpfile, pre_code='CREATE TABLE test (id INT)')\n\n    assert temp_db_cursor.row_set('SELECT * FROM test') == {(4, )}\n\n\ndef test_execute_file_with_post_code(dsn, tmp_path, temp_db_cursor):\n    tmpfile = tmp_path / 'test.sql'\n    tmpfile.write_text('CREATE TABLE test (id INT)', encoding='utf-8')\n\n    db_utils.execute_file(dsn, tmpfile, post_code='INSERT INTO test VALUES(23)')\n\n    assert temp_db_cursor.row_set('SELECT * FROM test') == {(23, )}\n"
  },
  {
    "path": "test/python/dummy_tokenizer.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTokenizer for testing.\n\"\"\"\nfrom nominatim_db.data.place_info import PlaceInfo\nfrom nominatim_db.config import Configuration\n\n\ndef create(dsn):\n    \"\"\" Create a new instance of the tokenizer provided by this module.\n    \"\"\"\n    return DummyTokenizer(dsn)\n\n\nclass DummyTokenizer:\n\n    def __init__(self, dsn):\n        self.dsn = dsn\n        self.init_state = None\n        self.analyser_cache = {}\n\n    def init_new_db(self, *args, **kwargs):\n        assert self.init_state is None\n        self.init_state = \"new\"\n\n    def init_from_project(self, config):\n        assert isinstance(config, Configuration)\n        assert self.init_state is None\n        self.init_state = \"loaded\"\n\n    @staticmethod\n    def finalize_import(_):\n        pass\n\n    def name_analyzer(self):\n        return DummyNameAnalyzer(self.analyser_cache)\n\n\nclass DummyNameAnalyzer:\n\n    def __enter__(self):\n        return self\n\n    def __exit__(self, exc_type, exc_value, traceback):\n        self.close()\n\n    def __init__(self, cache):\n        self.analyser_cache = cache\n        cache['countries'] = []\n\n    def close(self):\n        pass\n\n    @staticmethod\n    def normalize_postcode(postcode):\n        return postcode\n\n    @staticmethod\n    def update_postcodes_from_db():\n        pass\n\n    def update_special_phrases(self, phrases, should_replace):\n        self.analyser_cache['special_phrases'] = phrases\n\n    def add_country_names(self, code, names):\n        self.analyser_cache['countries'].append((code, names))\n\n    @staticmethod\n    def process_place(place):\n        assert isinstance(place, PlaceInfo)\n        return {}\n"
  },
  {
    "path": "test/python/indexer/test_indexing.py",
    "content": "#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for running the indexing.\n\"\"\"\n\nimport pytest\nimport pytest_asyncio  # noqa\n\nfrom nominatim_db.indexer import indexer\nfrom nominatim_db.tokenizer import factory\n\n\nclass TestIndexing:\n    @pytest.fixture(autouse=True)\n    def setup(self, temp_db_conn, project_env, tokenizer_mock,\n              placex_table, postcode_table, osmline_table):\n        self.conn = temp_db_conn\n        temp_db_conn.execute(\"\"\"\n            CREATE OR REPLACE FUNCTION date_update() RETURNS TRIGGER AS $$\n            BEGIN\n              IF NEW.indexed_status = 0 and OLD.indexed_status != 0 THEN\n                NEW.indexed_date = now();\n              END IF;\n              RETURN NEW;\n            END; $$ LANGUAGE plpgsql;\n\n            DROP TYPE IF EXISTS prepare_update_info CASCADE;\n            CREATE TYPE prepare_update_info AS (\n                         name HSTORE,\n                         address HSTORE,\n                         rank_address SMALLINT,\n                         country_code TEXT,\n                         class TEXT,\n                         type TEXT,\n                         linked_place_id BIGINT\n                       );\n            CREATE OR REPLACE FUNCTION placex_indexing_prepare(p placex,\n                                                 OUT result prepare_update_info) AS $$\n            BEGIN\n              result.address := p.address;\n              result.name := p.name;\n              result.class := p.class;\n              result.type := p.type;\n              result.country_code := p.country_code;\n              result.rank_address := p.rank_address;\n            END; $$ LANGUAGE plpgsql STABLE;\n\n            CREATE OR REPLACE FUNCTION get_interpolation_address(in_address HSTORE, wayid BIGINT)\n            RETURNS HSTORE AS $$ SELECT in_address $$ LANGUAGE sql STABLE;\n        \"\"\")\n\n        for table in ('placex', 'location_property_osmline', 'location_postcodes'):\n            temp_db_conn.execute(\"\"\"CREATE TRIGGER {0}_update BEFORE UPDATE ON {0}\n                                    FOR EACH ROW EXECUTE PROCEDURE date_update()\n                                 \"\"\".format(table))\n\n        self.tokenizer = factory.create_tokenizer(project_env)\n\n    def scalar(self, query):\n        with self.conn.cursor() as cur:\n            cur.execute(query)\n            return cur.fetchone()[0]\n\n    def placex_unindexed(self):\n        return self.scalar('SELECT count(*) from placex where indexed_status > 0')\n\n    def osmline_unindexed(self):\n        return self.scalar(\"\"\"SELECT count(*) from location_property_osmline\n                              WHERE indexed_status > 0\"\"\")\n\n    @pytest.mark.parametrize(\"threads\", [1, 15])\n    @pytest.mark.asyncio\n    async def test_index_all_by_rank(self, dsn, threads, placex_row, osmline_row):\n        for rank in range(31):\n            placex_row(rank_address=rank, rank_search=rank, indexed_status=1)\n        osmline_row()\n\n        assert self.placex_unindexed() == 31\n        assert self.osmline_unindexed() == 1\n\n        idx = indexer.Indexer(dsn, self.tokenizer, threads)\n        await idx.index_by_rank(0, 30)\n\n        assert self.placex_unindexed() == 0\n        assert self.osmline_unindexed() == 0\n\n        assert self.scalar(\"\"\"SELECT count(*) from placex\n                                 WHERE indexed_status = 0 and indexed_date is null\"\"\") == 0\n        # ranks come in order of rank address\n        assert self.scalar(\"\"\"\n            SELECT count(*) FROM placex p WHERE rank_address > 0\n              AND indexed_date >= (SELECT min(indexed_date) FROM placex o\n                                   WHERE p.rank_address < o.rank_address)\"\"\") == 0\n        # placex address ranked objects come before interpolations\n        assert self.scalar(\n            \"\"\"SELECT count(*) FROM placex WHERE rank_address > 0\n                 AND indexed_date >\n                       (SELECT min(indexed_date) FROM location_property_osmline)\"\"\") == 0\n        # rank 0 comes after all other placex objects\n        assert self.scalar(\n            \"\"\"SELECT count(*) FROM placex WHERE rank_address > 0\n                 AND indexed_date >\n                       (SELECT min(indexed_date) FROM placex WHERE rank_address = 0)\"\"\") == 0\n\n    @pytest.mark.parametrize(\"threads\", [1, 15])\n    @pytest.mark.asyncio\n    async def test_index_partial_without_30(self, dsn, threads, placex_row, osmline_row):\n        for rank in range(31):\n            placex_row(rank_address=rank, rank_search=rank, indexed_status=1)\n        osmline_row()\n\n        assert self.placex_unindexed() == 31\n        assert self.osmline_unindexed() == 1\n\n        idx = indexer.Indexer(dsn, self.tokenizer, threads)\n        await idx.index_by_rank(4, 15)\n\n        assert self.placex_unindexed() == 19\n        assert self.osmline_unindexed() == 1\n\n        assert self.scalar(\"\"\"\n                        SELECT count(*) FROM placex\n                          WHERE indexed_status = 0 AND not rank_address between 4 and 15\"\"\") == 0\n\n    @pytest.mark.parametrize(\"threads\", [1, 15])\n    @pytest.mark.asyncio\n    async def test_index_partial_with_30(self, dsn, threads, placex_row, osmline_row):\n        for rank in range(31):\n            placex_row(rank_address=rank, rank_search=rank, indexed_status=1)\n        osmline_row()\n\n        assert self.placex_unindexed() == 31\n        assert self.osmline_unindexed() == 1\n\n        idx = indexer.Indexer(dsn, self.tokenizer, threads)\n        await idx.index_by_rank(28, 30)\n\n        assert self.placex_unindexed() == 28\n        assert self.osmline_unindexed() == 0\n\n        assert self.scalar(\"\"\"\n                        SELECT count(*) FROM placex\n                          WHERE indexed_status = 0 AND rank_address between 0 and 27\"\"\") == 0\n\n    @pytest.mark.parametrize(\"threads\", [1, 15])\n    @pytest.mark.asyncio\n    async def test_index_boundaries(self, dsn, threads, placex_row, osmline_row):\n        for rank in range(4, 10):\n            placex_row(cls='boundary', typ='administrative',\n                       rank_address=rank, rank_search=rank, indexed_status=1)\n        for rank in range(31):\n            placex_row(rank_address=rank, rank_search=rank, indexed_status=1)\n        osmline_row()\n\n        assert self.placex_unindexed() == 37\n        assert self.osmline_unindexed() == 1\n\n        idx = indexer.Indexer(dsn, self.tokenizer, threads)\n        await idx.index_boundaries()\n\n        assert self.placex_unindexed() == 31\n        assert self.osmline_unindexed() == 1\n\n        assert self.scalar(\"\"\"\n                        SELECT count(*) FROM placex\n                          WHERE indexed_status = 0 AND class != 'boundary'\"\"\") == 0\n\n    @pytest.mark.parametrize(\"threads\", [1, 15])\n    @pytest.mark.asyncio\n    async def test_index_postcodes(self, dsn, threads, postcode_row):\n        for postcode in range(1000):\n            postcode_row(country='de', postcode=postcode)\n        for postcode in range(32000, 33000):\n            postcode_row(country='us', postcode=postcode)\n\n        idx = indexer.Indexer(dsn, self.tokenizer, threads)\n        await idx.index_postcodes()\n\n        assert self.scalar(\"\"\"SELECT count(*) FROM location_postcodes\n                                      WHERE indexed_status != 0\"\"\") == 0\n\n    @pytest.mark.parametrize(\"analyse\", [True, False])\n    @pytest.mark.asyncio\n    async def test_index_full(self, dsn, analyse, placex_row, osmline_row, postcode_row):\n        for rank in range(4, 10):\n            placex_row(cls='boundary', typ='administrative',\n                       rank_address=rank, rank_search=rank, indexed_status=1)\n        for rank in range(31):\n            placex_row(rank_address=rank, rank_search=rank, indexed_status=1)\n        osmline_row()\n        for postcode in range(1000):\n            postcode_row(country='de', postcode=postcode)\n\n        idx = indexer.Indexer(dsn, self.tokenizer, 4)\n        await idx.index_full(analyse=analyse)\n\n        assert self.placex_unindexed() == 0\n        assert self.osmline_unindexed() == 0\n        assert self.scalar(\"\"\"SELECT count(*) FROM location_postcodes\n                                 WHERE indexed_status != 0\"\"\") == 0\n"
  },
  {
    "path": "test/python/mock_icu_word_table.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nLegacy word table for testing with functions to prefil and test contents\nof the table.\n\"\"\"\nfrom nominatim_db.db.connection import execute_scalar\n\nfrom psycopg.types.json import Jsonb\n\n\nclass MockIcuWordTable:\n    \"\"\" A word table for testing using legacy word table structure.\n    \"\"\"\n    def __init__(self, conn):\n        self.conn = conn\n        with conn.cursor() as cur:\n            cur.execute(\"\"\"CREATE TABLE word (word_id INTEGER,\n                                              word_token text NOT NULL,\n                                              type text NOT NULL,\n                                              word text,\n                                              info jsonb)\"\"\")\n\n        conn.commit()\n\n    def add_full_word(self, word_id, word, word_token=None):\n        with self.conn.cursor() as cur:\n            cur.execute(\"\"\"INSERT INTO word (word_id, word_token, type, word, info)\n                           VALUES(%s, %s, 'W', %s, '{}'::jsonb)\"\"\",\n                        (word_id, word or word_token, word))\n        self.conn.commit()\n\n    def add_special(self, word_token, word, cls, typ, oper):\n        with self.conn.cursor() as cur:\n            cur.execute(\"\"\"INSERT INTO word (word_token, type, word, info)\n                              VALUES (%s, 'S', %s,\n                                      json_build_object('class', %s::text,\n                                                        'type', %s::text,\n                                                        'op', %s::text))\n                        \"\"\", (word_token, word, cls, typ, oper))\n        self.conn.commit()\n\n    def add_country(self, country_code, word_token, lookup):\n        with self.conn.cursor() as cur:\n            cur.execute(\"\"\"INSERT INTO word (word_token, type, word, info)\n                           VALUES(%s, 'C', %s, %s)\"\"\",\n                        (word_token, lookup, Jsonb({'cc': country_code})))\n        self.conn.commit()\n\n    def add_postcode(self, word_token, postcode):\n        with self.conn.cursor() as cur:\n            cur.execute(\"\"\"INSERT INTO word (word_token, type, word)\n                              VALUES (%s, 'P', %s)\n                        \"\"\", (word_token, postcode))\n        self.conn.commit()\n\n    def add_housenumber(self, word_id, word_tokens, word=None):\n        with self.conn.cursor() as cur:\n            if isinstance(word_tokens, str):\n                # old style without analyser\n                cur.execute(\"\"\"INSERT INTO word (word_id, word_token, type)\n                                  VALUES (%s, %s, 'H')\n                            \"\"\", (word_id, word_tokens))\n            else:\n                if word is None:\n                    word = word_tokens[0]\n                for token in word_tokens:\n                    cur.execute(\"\"\"INSERT INTO word (word_id, word_token, type, word, info)\n                                      VALUES (%s, %s, 'H', %s,\n                                              jsonb_build_object('lookup', %s::text))\n                                \"\"\", (word_id, token, word, word_tokens[0]))\n\n        self.conn.commit()\n\n    def count(self):\n        return execute_scalar(self.conn, \"SELECT count(*) FROM word\")\n\n    def count_special(self):\n        return execute_scalar(self.conn, \"SELECT count(*) FROM word WHERE type = 'S'\")\n\n    def count_housenumbers(self):\n        return execute_scalar(self.conn, \"SELECT count(*) FROM word WHERE type = 'H'\")\n\n    def get_special(self):\n        with self.conn.cursor() as cur:\n            cur.execute(\"SELECT word_token, info, word FROM word WHERE type = 'S'\")\n            result = set(((row[0], row[2], row[1]['class'],\n                           row[1]['type'], row[1]['op']) for row in cur))\n            assert len(result) == cur.rowcount, \"Word table has duplicates.\"\n            return result\n\n    def get_country(self):\n        with self.conn.cursor() as cur:\n            cur.execute(\"SELECT info->>'cc', word_token, word FROM word WHERE type = 'C'\")\n            result = set((tuple(row) for row in cur))\n            assert len(result) == cur.rowcount, \"Word table has duplicates.\"\n            return result\n\n    def get_postcodes(self):\n        with self.conn.cursor() as cur:\n            cur.execute(\"SELECT word FROM word WHERE type = 'P'\")\n            return set((row[0] for row in cur))\n\n    def get_partial_words(self):\n        with self.conn.cursor() as cur:\n            cur.execute(\"SELECT word_token, info FROM word WHERE type ='w'\")\n            return set(((row[0], row[1]['count']) for row in cur))\n"
  },
  {
    "path": "test/python/pytest.ini",
    "content": "[pytest]\nmarkers =\n    sanitizer_params\nasyncio_default_fixture_loop_scope = function\n"
  },
  {
    "path": "test/python/tokenizer/sanitizers/test_clean_housenumbers.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for the sanitizer that normalizes housenumbers.\n\"\"\"\nimport pytest\n\nfrom nominatim_db.tokenizer.place_sanitizer import PlaceSanitizer\nfrom nominatim_db.data.place_info import PlaceInfo\n\n\n@pytest.fixture\ndef sanitize(request, def_config):\n    sanitizer_args = {'step': 'clean-housenumbers'}\n    for mark in request.node.iter_markers(name=\"sanitizer_params\"):\n        sanitizer_args.update({k.replace('_', '-'): v for k, v in mark.kwargs.items()})\n\n    def _run(**kwargs):\n        place = PlaceInfo({'address': kwargs})\n        _, address = PlaceSanitizer([sanitizer_args], def_config).process_names(place)\n\n        return sorted([(p.kind, p.name) for p in address])\n\n    return _run\n\n\ndef test_simple_number(sanitize):\n    assert sanitize(housenumber='34') == [('housenumber', '34')]\n\n\n@pytest.mark.parametrize('number', ['1;2;3', '1,2,3', '1; 3 ,2',\n                                    '2,,3,1', '1;2;3;;', ';3;2;1'])\ndef test_housenumber_lists(sanitize, number):\n    assert sanitize(housenumber=number) == \\\n           [('housenumber', '1'), ('housenumber', '2'), ('housenumber', '3')]\n\n\n@pytest.mark.sanitizer_params(filter_kind=('number', 'streetnumber'))\ndef test_filter_kind(sanitize):\n    assert sanitize(housenumber='34', number='4', badnumber='65') == \\\n            [('badnumber', '65'), ('housenumber', '34'), ('housenumber', '4')]\n\n\n@pytest.mark.parametrize('number', ('6523', 'n/a', '4'))\ndef test_convert_to_name_converted(def_config, number):\n    sanitizer_args = {'step': 'clean-housenumbers',\n                      'convert-to-name': (r'\\d+', 'n/a')}\n\n    place = PlaceInfo({'address': {'housenumber': number}})\n    names, address = PlaceSanitizer([sanitizer_args], def_config).process_names(place)\n\n    assert ('housenumber', number) in set((p.kind, p.name) for p in names)\n    assert 'housenumber' not in set(p.kind for p in address)\n\n\n@pytest.mark.parametrize('number', ('a54', 'n.a', 'bow'))\ndef test_convert_to_name_unconverted(def_config, number):\n    sanitizer_args = {'step': 'clean-housenumbers',\n                      'convert-to-name': (r'\\d+', 'n/a')}\n\n    place = PlaceInfo({'address': {'housenumber': number}})\n    names, address = PlaceSanitizer([sanitizer_args], def_config).process_names(place)\n\n    assert 'housenumber' not in set(p.kind for p in names)\n    assert ('housenumber', number) in set((p.kind, p.name) for p in address)\n\n\n@pytest.mark.parametrize('hnr,itype,out', [\n                            ('1-5', 'all', (1, 2, 3, 4, 5)),\n                            ('1-5', 'odd', (1, 3, 5)),\n                            ('1-5', 'even', (2, 4)),\n                            ('6-9', '1', (6, 7, 8, 9)),\n                            ('6-9', '2', (6, 8)),\n                            ('6-9', '3', (6, 9)),\n                            ('6-9', '5', (6,)),\n                            ('6-9', 'odd', (7, 9)),\n                            ('6-9', 'even', (6, 8)),\n                            ('6-22', 'even', (6, 8, 10, 12, 14, 16, 18, 20, 22))\n                            ])\ndef test_convert_interpolations(sanitize, hnr, itype, out):\n    assert set(sanitize(housenumber=hnr, interpolation=itype)) \\\n            == {('housenumber', str(i)) for i in out}\n\n\n@pytest.mark.parametrize('hnr', ('23', '23-', '3z-f', '1-10', '5-1', '1-4-5'))\ndef test_ignore_interpolation_with_bad_housenumber(sanitize, hnr):\n    assert sanitize(housenumber=hnr, interpolation='all') == [('housenumber', hnr)]\n"
  },
  {
    "path": "test/python/tokenizer/sanitizers/test_clean_postcodes.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for the sanitizer that normalizes postcodes.\n\"\"\"\nimport pytest\n\nfrom nominatim_db.tokenizer.place_sanitizer import PlaceSanitizer\nfrom nominatim_db.data.place_info import PlaceInfo\nfrom nominatim_db.data import country_info\n\n\n@pytest.fixture\ndef sanitize(def_config, request):\n    country_info.setup_country_config(def_config)\n    sanitizer_args = {'step': 'clean-postcodes'}\n    for mark in request.node.iter_markers(name=\"sanitizer_params\"):\n        sanitizer_args.update({k.replace('_', '-'): v for k, v in mark.kwargs.items()})\n\n    def _run(country=None, **kwargs):\n        pi = {'address': kwargs}\n        if country is not None:\n            pi['country_code'] = country\n\n        _, address = PlaceSanitizer([sanitizer_args], def_config).process_names(PlaceInfo(pi))\n\n        return sorted([(p.kind, p.name) for p in address])\n\n    return _run\n\n\n@pytest.mark.parametrize(\"country\", (None, 'ae'))\ndef test_postcode_no_country(sanitize, country):\n    assert sanitize(country=country, postcode='23231') == [('unofficial_postcode', '23231')]\n\n\n@pytest.mark.parametrize(\"country\", (None, 'ae'))\n@pytest.mark.sanitizer_params(convert_to_address=False)\ndef test_postcode_no_country_drop(sanitize, country):\n    assert sanitize(country=country, postcode='23231') == []\n\n\n@pytest.mark.parametrize(\"postcode\", ('12345', '  12345  ', 'de 12345',\n                                      'DE12345', 'DE 12345', 'DE-12345'))\ndef test_postcode_pass_good_format(sanitize, postcode):\n    assert sanitize(country='de', postcode=postcode) == [('postcode', '12345')]\n\n\n@pytest.mark.parametrize(\"postcode\", ('123456', '', '   ', '.....',\n                                      'DE  12345', 'DEF12345', 'CH 12345'))\n@pytest.mark.sanitizer_params(convert_to_address=False)\ndef test_postcode_drop_bad_format(sanitize, postcode):\n    assert sanitize(country='de', postcode=postcode) == []\n\n\n@pytest.mark.parametrize(\"postcode\", ('1234', '9435', '99000'))\ndef test_postcode_cyprus_pass(sanitize, postcode):\n    assert sanitize(country='cy', postcode=postcode) == [('postcode', postcode)]\n\n\n@pytest.mark.parametrize(\"postcode\", ('91234', '99a45', '567'))\n@pytest.mark.sanitizer_params(convert_to_address=False)\ndef test_postcode_cyprus_fail(sanitize, postcode):\n    assert sanitize(country='cy', postcode=postcode) == []\n\n\n@pytest.mark.parametrize(\"postcode\", ('123456', 'A33F2G7'))\ndef test_postcode_kazakhstan_pass(sanitize, postcode):\n    assert sanitize(country='kz', postcode=postcode) == [('postcode', postcode)]\n\n\n@pytest.mark.parametrize(\"postcode\", ('V34T6Y923456', '99345'))\n@pytest.mark.sanitizer_params(convert_to_address=False)\ndef test_postcode_kazakhstan_fail(sanitize, postcode):\n    assert sanitize(country='kz', postcode=postcode) == []\n\n\n@pytest.mark.parametrize(\"postcode\", ('675 34', '67534', 'SE-675 34', 'SE67534'))\ndef test_postcode_sweden_pass(sanitize, postcode):\n    assert sanitize(country='se', postcode=postcode) == [('postcode', '675 34')]\n\n\n@pytest.mark.parametrize(\"postcode\", ('67 345', '671123'))\n@pytest.mark.sanitizer_params(convert_to_address=False)\ndef test_postcode_sweden_fail(sanitize, postcode):\n    assert sanitize(country='se', postcode=postcode) == []\n\n\n@pytest.mark.parametrize(\"postcode\", ('AD123', '123', 'AD 123', 'AD-123'))\ndef test_postcode_andorra_pass(sanitize, postcode):\n    assert sanitize(country='ad', postcode=postcode) == [('postcode', 'AD123')]\n\n\n@pytest.mark.parametrize(\"postcode\", ('AD1234', 'AD AD123', 'XX123'))\n@pytest.mark.sanitizer_params(convert_to_address=False)\ndef test_postcode_andorra_fail(sanitize, postcode):\n    assert sanitize(country='ad', postcode=postcode) == []\n\n\n@pytest.mark.parametrize(\"postcode\", ('AI-2640', '2640', 'AI 2640'))\ndef test_postcode_anguilla_pass(sanitize, postcode):\n    assert sanitize(country='ai', postcode=postcode) == [('postcode', 'AI-2640')]\n\n\n@pytest.mark.parametrize(\"postcode\", ('AI-2000', 'AI US-2640', 'AI AI-2640'))\n@pytest.mark.sanitizer_params(convert_to_address=False)\ndef test_postcode_anguilla_fail(sanitize, postcode):\n    assert sanitize(country='ai', postcode=postcode) == []\n\n\n@pytest.mark.parametrize(\"postcode\", ('BN1111', 'BN 1111', 'BN BN1111', 'BN BN 1111'))\ndef test_postcode_brunei_pass(sanitize, postcode):\n    assert sanitize(country='bn', postcode=postcode) == [('postcode', 'BN1111')]\n\n\n@pytest.mark.parametrize(\"postcode\", ('BN-1111', 'BNN1111'))\n@pytest.mark.sanitizer_params(convert_to_address=False)\ndef test_postcode_brunei_fail(sanitize, postcode):\n    assert sanitize(country='bn', postcode=postcode) == []\n\n\n@pytest.mark.parametrize(\"postcode\", ('IM1 1AA', 'IM11AA', 'IM IM11AA'))\ndef test_postcode_isle_of_man_pass(sanitize, postcode):\n    assert sanitize(country='im', postcode=postcode) == [('postcode', 'IM1 1AA')]\n\n\n@pytest.mark.parametrize(\"postcode\", ('IZ1 1AA', 'IM1 AA'))\n@pytest.mark.sanitizer_params(convert_to_address=False)\ndef test_postcode_isle_of_man_fail(sanitize, postcode):\n    assert sanitize(country='im', postcode=postcode) == []\n\n\n@pytest.mark.parametrize(\"postcode\", ('JE5 0LA', 'JE50LA', 'JE JE50LA', 'je JE5 0LA'))\ndef test_postcode_jersey_pass(sanitize, postcode):\n    assert sanitize(country='je', postcode=postcode) == [('postcode', 'JE5 0LA')]\n\n\n@pytest.mark.parametrize(\"postcode\", ('gb JE5 0LA', 'IM50LA', 'IM5 012'))\n@pytest.mark.sanitizer_params(convert_to_address=False)\ndef test_postcode_jersey_fail(sanitize, postcode):\n    assert sanitize(country='je', postcode=postcode) == []\n\n\n@pytest.mark.parametrize(\"postcode\", ('KY1-1234', '1-1234', 'KY 1-1234'))\ndef test_postcode_cayman_islands_pass(sanitize, postcode):\n    assert sanitize(country='ky', postcode=postcode) == [('postcode', 'KY1-1234')]\n\n\n@pytest.mark.parametrize(\"postcode\", ('KY-1234', 'KZ1-1234', 'KY1 1234', 'KY1-123', 'KY KY1-1234'))\n@pytest.mark.sanitizer_params(convert_to_address=False)\ndef test_postcode_cayman_islands_fail(sanitize, postcode):\n    assert sanitize(country='ky', postcode=postcode) == []\n\n\n@pytest.mark.parametrize(\"postcode\", ('LC11 222', '11 222', '11222', 'LC 11 222'))\ndef test_postcode_saint_lucia_pass(sanitize, postcode):\n    assert sanitize(country='lc', postcode=postcode) == [('postcode', 'LC11 222')]\n\n\n@pytest.mark.parametrize(\"postcode\", ('11 2222', 'LC LC11 222'))\n@pytest.mark.sanitizer_params(convert_to_address=False)\ndef test_postcode_saint_lucia_fail(sanitize, postcode):\n    assert sanitize(country='lc', postcode=postcode) == []\n\n\n@pytest.mark.parametrize(\"postcode\", ('LV-1111', '1111', 'LV 1111', 'LV1111',))\ndef test_postcode_latvia_pass(sanitize, postcode):\n    assert sanitize(country='lv', postcode=postcode) == [('postcode', 'LV-1111')]\n\n\n@pytest.mark.parametrize(\"postcode\", ('111', '11111', 'LV LV-1111'))\n@pytest.mark.sanitizer_params(convert_to_address=False)\ndef test_postcode_latvia_fail(sanitize, postcode):\n    assert sanitize(country='lv', postcode=postcode) == []\n\n\n@pytest.mark.parametrize(\"postcode\", ('MD-1111', '1111', 'MD 1111', 'MD1111'))\ndef test_postcode_moldova_pass(sanitize, postcode):\n    assert sanitize(country='md', postcode=postcode) == [('postcode', 'MD-1111')]\n\n\n@pytest.mark.parametrize(\"postcode\", (\"MD MD-1111\", \"MD MD1111\", \"MD MD 1111\"))\n@pytest.mark.sanitizer_params(convert_to_address=False)\ndef test_postcode_moldova_fail(sanitize, postcode):\n    assert sanitize(country='md', postcode=postcode) == []\n\n\n@pytest.mark.parametrize(\"postcode\", ('VLT 1117', 'GDJ 1234', 'BZN 2222'))\ndef test_postcode_malta_pass(sanitize, postcode):\n    assert sanitize(country='mt', postcode=postcode) == [('postcode', postcode)]\n\n\n@pytest.mark.parametrize(\"postcode\", ('MTF 1111', 'MT MTF 1111', 'MTF1111', 'MT MTF1111'))\ndef test_postcode_malta_mtarfa_pass(sanitize, postcode):\n    assert sanitize(country='mt', postcode=postcode) == [('postcode', 'MTF 1111')]\n\n\n@pytest.mark.parametrize(\"postcode\", ('1111', 'MTMT 1111'))\n@pytest.mark.sanitizer_params(convert_to_address=False)\ndef test_postcode_malta_fail(sanitize, postcode):\n    assert sanitize(country='mt', postcode=postcode) == []\n\n\n@pytest.mark.parametrize(\"postcode\", ('VC1111', '1111', 'VC-1111', 'VC 1111'))\ndef test_postcode_saint_vincent_pass(sanitize, postcode):\n    assert sanitize(country='vc', postcode=postcode) == [('postcode', 'VC1111')]\n\n\n@pytest.mark.parametrize(\"postcode\", ('VC11', 'VC VC1111'))\n@pytest.mark.sanitizer_params(convert_to_address=False)\ndef test_postcode_saint_vincent_fail(sanitize, postcode):\n    assert sanitize(country='vc', postcode=postcode) == []\n\n\n@pytest.mark.parametrize(\"postcode\", ('VG1111', '1111', 'VG 1111', 'VG-1111'))\ndef test_postcode_virgin_islands_pass(sanitize, postcode):\n    assert sanitize(country='vg', postcode=postcode) == [('postcode', 'VG1111')]\n\n\n@pytest.mark.parametrize(\"postcode\", ('111', '11111', 'VG VG1111'))\n@pytest.mark.sanitizer_params(convert_to_address=False)\ndef test_postcode_virgin_islands_fail(sanitize, postcode):\n    assert sanitize(country='vg', postcode=postcode) == []\n\n\n@pytest.mark.parametrize(\"postcode\", ('AB1', '123-456-7890', '1 as 44'))\n@pytest.mark.sanitizer_params(default_pattern='[A-Z0-9- ]{3,12}')\ndef test_postcode_default_pattern_pass(sanitize, postcode):\n    assert sanitize(country='an', postcode=postcode) == [('postcode', postcode.upper())]\n\n\n@pytest.mark.parametrize(\"postcode\", ('C', '12', 'ABC123DEF 456', '1234,5678', '11223;11224'))\n@pytest.mark.sanitizer_params(convert_to_address=False, default_pattern='[A-Z0-9- ]{3,12}')\ndef test_postcode_default_pattern_fail(sanitize, postcode):\n    assert sanitize(country='an', postcode=postcode) == []\n\n\n@pytest.mark.parametrize(\"postcode\", ('00000', '00-000', 'PL-00000', 'PL 00-000'))\n@pytest.mark.sanitizer_params(convert_to_address=False)\ndef test_postcode_zeros(sanitize, postcode):\n    assert sanitize(country='pl', postcode=postcode) == []\n"
  },
  {
    "path": "test/python/tokenizer/sanitizers/test_clean_tiger_tags.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for sanitizer that clean up TIGER tags.\n\"\"\"\nimport pytest\n\nfrom nominatim_db.tokenizer.place_sanitizer import PlaceSanitizer\nfrom nominatim_db.data.place_info import PlaceInfo\n\n\nclass TestCleanTigerTags:\n\n    @pytest.fixture(autouse=True)\n    def setup_country(self, def_config):\n        self.config = def_config\n\n    def run_sanitizer_on(self, addr):\n        place = PlaceInfo({'address': addr})\n        _, outaddr = PlaceSanitizer([{'step': 'clean-tiger-tags'}],\n                                    self.config).process_names(place)\n\n        return sorted([(p.name, p.kind, p.suffix) for p in outaddr])\n\n    @pytest.mark.parametrize('inname,outname', [('Hamilton, AL', 'Hamilton'),\n                                                ('Little, Borough, CA', 'Little, Borough')])\n    def test_well_formatted(self, inname, outname):\n        assert self.run_sanitizer_on({'tiger:county': inname})\\\n            == [(outname, 'county', 'tiger')]\n\n    @pytest.mark.parametrize('name', ('Hamilton', 'Big, Road', ''))\n    def test_badly_formatted(self, name):\n        assert self.run_sanitizer_on({'tiger:county': name})\\\n            == [(name, 'county', 'tiger')]\n\n    def test_unmatched(self):\n        assert self.run_sanitizer_on({'tiger:country': 'US'})\\\n            == [('US', 'tiger', 'country')]\n"
  },
  {
    "path": "test/python/tokenizer/sanitizers/test_delete_tags.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\r\n#\r\n# This file is part of Nominatim. (https://nominatim.org)\r\n#\r\n# Copyright (C) 2025 by the Nominatim developer community.\r\n# For a full list of authors see the git log.\r\n\"\"\"\r\nTests for the sanitizer that normalizes housenumbers.\r\n\"\"\"\r\nimport pytest\r\n\r\nfrom nominatim_db.data.place_info import PlaceInfo\r\nfrom nominatim_db.tokenizer.place_sanitizer import PlaceSanitizer\r\n\r\n\r\nclass TestWithDefault:\r\n\r\n    @pytest.fixture(autouse=True)\r\n    def setup_country(self, def_config):\r\n        self.config = def_config\r\n\r\n    def run_sanitizer_on(self, type, **kwargs):\r\n\r\n        place = PlaceInfo({type: {k.replace('_', ':'): v for k, v in kwargs.items()},\r\n                          'country_code': 'de', 'rank_address': 30})\r\n\r\n        sanitizer_args = {'step': 'delete-tags'}\r\n\r\n        name, address = PlaceSanitizer([sanitizer_args],\r\n                                       self.config).process_names(place)\r\n\r\n        return {'name': sorted([(p.name, p.kind, p.suffix or '') for p in name]),\r\n                'address': sorted([(p.name, p.kind, p.suffix or '') for p in address])}\r\n\r\n    def test_on_name(self):\r\n        res = self.run_sanitizer_on('name', name='foo', ref='bar', ref_abc='baz')\r\n\r\n        assert res.get('name') == []\r\n\r\n    def test_on_address(self):\r\n        res = self.run_sanitizer_on('address', name='foo', ref='bar', ref_abc='baz')\r\n\r\n        assert res.get('address') == [('bar', 'ref', ''), ('baz', 'ref', 'abc'),\r\n                                      ('foo', 'name', '')]\r\n\r\n\r\nclass TestTypeField:\r\n\r\n    @pytest.fixture(autouse=True)\r\n    def setup_country(self, def_config):\r\n        self.config = def_config\r\n\r\n    def run_sanitizer_on(self, type, **kwargs):\r\n\r\n        place = PlaceInfo({'name': {k.replace('_', ':'): v for k, v in kwargs.items()},\r\n                           'country_code': 'de', 'rank_address': 30})\r\n\r\n        sanitizer_args = {'step': 'delete-tags',\r\n                          'type': type}\r\n\r\n        name, _ = PlaceSanitizer([sanitizer_args],\r\n                                 self.config).process_names(place)\r\n\r\n        return sorted([(p.name, p.kind, p.suffix or '') for p in name])\r\n\r\n    def test_name_type(self):\r\n        res = self.run_sanitizer_on('name', name='foo', ref='bar', ref_abc='baz')\r\n\r\n        assert res == []\r\n\r\n    def test_address_type(self):\r\n        res = self.run_sanitizer_on('address', name='foo', ref='bar', ref_abc='baz')\r\n\r\n        assert res == [('bar', 'ref', ''), ('baz', 'ref', 'abc'),\r\n                       ('foo', 'name', '')]\r\n\r\n\r\nclass TestFilterKind:\r\n\r\n    @pytest.fixture(autouse=True)\r\n    def setup_country(self, def_config):\r\n        self.config = def_config\r\n\r\n    def run_sanitizer_on(self, filt, **kwargs):\r\n\r\n        place = PlaceInfo({'name': {k.replace('_', ':'): v for k, v in kwargs.items()},\r\n                           'country_code': 'de', 'rank_address': 30})\r\n\r\n        sanitizer_args = {'step': 'delete-tags',\r\n                          'filter-kind': filt}\r\n\r\n        name, _ = PlaceSanitizer([sanitizer_args],\r\n                                 self.config).process_names(place)\r\n\r\n        return sorted([(p.name, p.kind, p.suffix or '') for p in name])\r\n\r\n    def test_single_exact_name(self):\r\n        res = self.run_sanitizer_on(['name'], ref='foo', name='foo',\r\n                                    name_abc='bar', ref_abc='bar')\r\n\r\n        assert res == [('bar', 'ref', 'abc'), ('foo', 'ref', '')]\r\n\r\n    def test_single_pattern(self):\r\n        res = self.run_sanitizer_on(['.*name'],\r\n                                    name_fr='foo', ref_fr='foo', namexx_fr='bar',\r\n                                    shortname_fr='bar', name='bar')\r\n\r\n        assert res == [('bar', 'namexx', 'fr'), ('foo', 'ref', 'fr')]\r\n\r\n    def test_multiple_patterns(self):\r\n        res = self.run_sanitizer_on(['.*name', 'ref'],\r\n                                    name_fr='foo', ref_fr='foo', oldref_fr='foo',\r\n                                    namexx_fr='bar', shortname_fr='baz', name='baz')\r\n\r\n        assert res == [('bar', 'namexx', 'fr'), ('foo', 'oldref', 'fr')]\r\n\r\n\r\nclass TestRankAddress:\r\n\r\n    @pytest.fixture(autouse=True)\r\n    def setup_country(self, def_config):\r\n        self.config = def_config\r\n\r\n    def run_sanitizer_on(self, rank_addr, **kwargs):\r\n\r\n        place = PlaceInfo({'name': {k.replace('_', ':'): v for k, v in kwargs.items()},\r\n                           'country_code': 'de', 'rank_address': 30})\r\n\r\n        sanitizer_args = {'step': 'delete-tags',\r\n                          'rank_address': rank_addr}\r\n\r\n        name, _ = PlaceSanitizer([sanitizer_args],\r\n                                 self.config).process_names(place)\r\n\r\n        return sorted([(p.name, p.kind, p.suffix or '') for p in name])\r\n\r\n    def test_single_rank(self):\r\n        res = self.run_sanitizer_on('30', name='foo', ref='bar')\r\n\r\n        assert res == []\r\n\r\n    def test_single_rank_fail(self):\r\n        res = self.run_sanitizer_on('28', name='foo', ref='bar')\r\n\r\n        assert res == [('bar', 'ref', ''), ('foo', 'name', '')]\r\n\r\n    def test_ranged_rank_pass(self):\r\n        res = self.run_sanitizer_on('26-30', name='foo', ref='bar')\r\n\r\n        assert res == []\r\n\r\n    def test_ranged_rank_fail(self):\r\n        res = self.run_sanitizer_on('26-29', name='foo', ref='bar')\r\n\r\n        assert res == [('bar', 'ref', ''), ('foo', 'name', '')]\r\n\r\n    def test_mixed_rank_pass(self):\r\n        res = self.run_sanitizer_on(['4', '20-28', '30', '10-12'], name='foo', ref='bar')\r\n\r\n        assert res == []\r\n\r\n    def test_mixed_rank_fail(self):\r\n        res = self.run_sanitizer_on(['4-8', '10', '26-29', '18'], name='foo', ref='bar')\r\n\r\n        assert res == [('bar', 'ref', ''), ('foo', 'name', '')]\r\n\r\n\r\nclass TestSuffix:\r\n\r\n    @pytest.fixture(autouse=True)\r\n    def setup_country(self, def_config):\r\n        self.config = def_config\r\n\r\n    def run_sanitizer_on(self, suffix, **kwargs):\r\n\r\n        place = PlaceInfo({'name': {k.replace('_', ':'): v for k, v in kwargs.items()},\r\n                           'country_code': 'de', 'rank_address': 30})\r\n\r\n        sanitizer_args = {'step': 'delete-tags',\r\n                          'suffix': suffix}\r\n\r\n        name, _ = PlaceSanitizer([sanitizer_args],\r\n                                 self.config).process_names(place)\r\n\r\n        return sorted([(p.name, p.kind, p.suffix or '') for p in name])\r\n\r\n    def test_single_suffix(self):\r\n        res = self.run_sanitizer_on('abc', name='foo', name_abc='foo',\r\n                                    name_pqr='bar', ref='bar', ref_abc='baz')\r\n\r\n        assert res == [('bar', 'name', 'pqr'), ('bar', 'ref', ''), ('foo', 'name', '')]\r\n\r\n    def test_multiple_suffix(self):\r\n        res = self.run_sanitizer_on(['abc.*', 'pqr'], name='foo', name_abcxx='foo',\r\n                                    ref_pqr='bar', name_pqrxx='baz')\r\n\r\n        assert res == [('baz', 'name', 'pqrxx'), ('foo', 'name', '')]\r\n\r\n\r\nclass TestCountryCodes:\r\n\r\n    @pytest.fixture(autouse=True)\r\n    def setup_country(self, def_config):\r\n        self.config = def_config\r\n\r\n    def run_sanitizer_on(self, country_code, **kwargs):\r\n\r\n        place = PlaceInfo({'name': {k.replace('_', ':'): v for k, v in kwargs.items()},\r\n                           'country_code': 'de', 'rank_address': 30})\r\n\r\n        sanitizer_args = {'step': 'delete-tags',\r\n                          'country_code': country_code}\r\n\r\n        name, _ = PlaceSanitizer([sanitizer_args],\r\n                                 self.config).process_names(place)\r\n\r\n        return sorted([(p.name, p.kind) for p in name])\r\n\r\n    def test_single_country_code_pass(self):\r\n        res = self.run_sanitizer_on('de', name='foo', ref='bar')\r\n\r\n        assert res == []\r\n\r\n    def test_single_country_code_fail(self):\r\n        res = self.run_sanitizer_on('in', name='foo', ref='bar')\r\n\r\n        assert res == [('bar', 'ref'), ('foo', 'name')]\r\n\r\n    def test_empty_country_code_list(self):\r\n        res = self.run_sanitizer_on([], name='foo', ref='bar')\r\n\r\n        assert res == [('bar', 'ref'), ('foo', 'name')]\r\n\r\n    def test_multiple_country_code_pass(self):\r\n        res = self.run_sanitizer_on(['in', 'de', 'fr'], name='foo', ref='bar')\r\n\r\n        assert res == []\r\n\r\n    def test_multiple_country_code_fail(self):\r\n        res = self.run_sanitizer_on(['in', 'au', 'fr'], name='foo', ref='bar')\r\n\r\n        assert res == [('bar', 'ref'), ('foo', 'name')]\r\n\r\n\r\nclass TestAllParameters:\r\n\r\n    @pytest.fixture(autouse=True)\r\n    def setup_country(self, def_config):\r\n        self.config = def_config\r\n\r\n    def run_sanitizer_on(self, country_code, rank_addr, suffix, **kwargs):\r\n\r\n        place = PlaceInfo({'name': {k.replace('_', ':'): v for k, v in kwargs.items()},\r\n                           'country_code': 'de', 'rank_address': 30})\r\n\r\n        sanitizer_args = {\r\n                        'step': 'delete-tags',\r\n                        'type': 'name',\r\n                        'filter-kind': ['name', 'ref'],\r\n                        'country_code': country_code,\r\n                        'rank_address': rank_addr,\r\n                        'suffix': suffix,\r\n                        'name': r'[\\s\\S]*',\r\n                    }\r\n\r\n        name, _ = PlaceSanitizer([sanitizer_args],\r\n                                 self.config).process_names(place)\r\n\r\n        return sorted([(p.name, p.kind, p.suffix or '') for p in name])\r\n\r\n    def test_string_arguments_pass(self):\r\n        res = self.run_sanitizer_on('de', '25-30', r'[\\s\\S]*',\r\n                                    name='foo', ref='foo', name_abc='bar', ref_abc='baz')\r\n\r\n        assert res == []\r\n\r\n    def test_string_arguments_fail(self):\r\n        res = self.run_sanitizer_on('in', '25-30', r'[\\s\\S]*',\r\n                                    name='foo', ref='foo', name_abc='bar', ref_abc='baz')\r\n\r\n        assert res == [('bar', 'name', 'abc'), ('baz', 'ref', 'abc'),\r\n                       ('foo', 'name', ''), ('foo', 'ref', '')]\r\n\r\n    def test_list_arguments_pass(self):\r\n        res = self.run_sanitizer_on(['de', 'in'], ['20-28', '30'], [r'abc.*', r'[\\s\\S]*'],\r\n                                    name='foo', ref='foo', name_abcxx='bar', ref_pqr='baz')\r\n\r\n        assert res == []\r\n\r\n    def test_list_arguments_fail(self):\r\n        res = self.run_sanitizer_on(['de', 'in'], ['14', '20-29'], [r'abc.*', r'pqr'],\r\n                                    name='foo', ref_abc='foo', name_abcxx='bar', ref_pqr='baz')\r\n\r\n        assert res == [('bar', 'name', 'abcxx'), ('baz', 'ref', 'pqr'),\r\n                       ('foo', 'name', ''), ('foo', 'ref', 'abc')]\r\n\r\n    def test_mix_arguments_pass(self):\r\n        res = self.run_sanitizer_on('de', ['10', '20-28', '30'], r'[\\s\\S]*',\r\n                                    name_abc='foo', ref_abc='foo', name_abcxx='bar', ref_pqr='baz')\r\n\r\n        assert res == []\r\n\r\n    def test_mix_arguments_fail(self):\r\n        res = self.run_sanitizer_on(['de', 'in'], ['10', '20-28', '30'], r'abc.*',\r\n                                    name='foo', ref='foo', name_pqr='bar', ref_pqr='baz')\r\n\r\n        assert res == [('bar', 'name', 'pqr'), ('baz', 'ref', 'pqr'),\r\n                       ('foo', 'name', ''), ('foo', 'ref', '')]\r\n"
  },
  {
    "path": "test/python/tokenizer/sanitizers/test_sanitizer_config.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for sanitizer configuration helper functions.\n\"\"\"\nimport pytest\n\nfrom nominatim_db.errors import UsageError\nfrom nominatim_db.tokenizer.sanitizers.config import SanitizerConfig\n\n\ndef test_string_list_default_empty():\n    assert SanitizerConfig().get_string_list('op') == []\n\n\ndef test_string_list_default_something():\n    assert SanitizerConfig().get_string_list('op', default=['a', 'b']) == ['a', 'b']\n\n\ndef test_string_list_value_string():\n    assert SanitizerConfig({'op': 't'}).get_string_list('op', default=['a', 'b']) == ['t']\n\n\ndef test_string_list_value_list():\n    assert SanitizerConfig({'op': ['1', '2']}).get_string_list('op') == ['1', '2']\n\n\ndef test_string_list_value_empty():\n    assert SanitizerConfig({'op': ''}).get_string_list('op', default=['a', 'b']) == []\n\n\ndef test_string_list_value_dict():\n    with pytest.raises(UsageError):\n        SanitizerConfig({'op': {'1': 'a'}}).get_string_list('op')\n\n\ndef test_string_list_value_int_list():\n    with pytest.raises(UsageError):\n        SanitizerConfig({'op': [1, 2]}).get_string_list('op')\n\n\n@pytest.mark.parametrize('inp', ('fg34', 'f\\\\f', 'morning [glory]', '56.78'))\ndef test_create_split_regex_no_params_unsplit(inp):\n    regex = SanitizerConfig().get_delimiter()\n\n    assert list(regex.split(inp)) == [inp]\n\n\n@pytest.mark.parametrize('inp,outp', [('here,there', ['here', 'there']),\n                                      ('ying;;yang', ['ying', 'yang']),\n                                      (';a; ;c;d,', ['', 'a', '', 'c', 'd', '']),\n                                      ('1,  3  ,5', ['1', '3', '5'])\n                                      ])\ndef test_create_split_regex_no_params_split(inp, outp):\n    regex = SanitizerConfig().get_delimiter()\n\n    assert list(regex.split(inp)) == outp\n\n\n@pytest.mark.parametrize('delimiter', ['.', '\\\\', '[]', '   ', '/.*+'])\ndef test_create_split_regex_custom(delimiter):\n    regex = SanitizerConfig({'delimiters': delimiter}).get_delimiter()\n\n    assert list(regex.split(f'out{delimiter}house')) == ['out', 'house']\n    assert list(regex.split('out,house')) == ['out,house']\n\n\ndef test_create_split_regex_empty_delimiter():\n    with pytest.raises(UsageError):\n        SanitizerConfig({'delimiters': ''}).get_delimiter()\n\n\n@pytest.mark.parametrize('inp', ('name', 'name:de', 'na\\\\me', '.*', ''))\ndef test_create_name_filter_no_param_no_default(inp):\n    filt = SanitizerConfig({'filter-kind': 'place'}).get_filter('name')\n\n    assert filt(inp)\n\n\n@pytest.mark.parametrize('inp', ('name', 'name:de', 'na\\\\me', '.*', ''))\ndef test_create_name_filter_no_param_default_pass_all(inp):\n    filt = SanitizerConfig().get_filter('name', 'PASS_ALL')\n\n    assert filt(inp)\n\n\n@pytest.mark.parametrize('inp', ('name', 'name:de', 'na\\\\me', '.*', ''))\ndef test_create_name_filter_no_param_default_fail_all(inp):\n    filt = SanitizerConfig().get_filter('name', 'FAIL_ALL')\n\n    assert not filt(inp)\n\n\ndef test_create_name_filter_no_param_default_invalid_string():\n    with pytest.raises(ValueError):\n        SanitizerConfig().get_filter('name', 'abc')\n\n\ndef test_create_name_filter_no_param_default_empty_list():\n    with pytest.raises(ValueError):\n        SanitizerConfig().get_filter('name', [])\n\n\n@pytest.mark.parametrize('kind', ('de', 'name:de', 'ende'))\ndef test_create_kind_filter_default_positive(kind):\n    filt = SanitizerConfig().get_filter('filter-kind', ['.*de'])\n\n    assert filt(kind)\n\n\n@pytest.mark.parametrize('kind', ('de', 'name:de', 'ende'))\ndef test_create_kind_filter_default_negetive(kind):\n    filt = SanitizerConfig().get_filter('filter-kind', ['.*fr'])\n\n    assert not filt(kind)\n\n\n@pytest.mark.parametrize('kind', ('lang', 'lang:de', 'langxx'))\ndef test_create_kind_filter_custom_regex_positive(kind):\n    filt = SanitizerConfig({'filter-kind': 'lang.*'}\n                           ).get_filter('filter-kind', ['.*fr'])\n\n    assert filt(kind)\n\n\n@pytest.mark.parametrize('kind', ('de ', '123', '', 'bedece'))\ndef test_create_kind_filter_custom_regex_negative(kind):\n    filt = SanitizerConfig({'filter-kind': '.*de'}).get_filter('filter-kind')\n\n    assert not filt(kind)\n\n\n@pytest.mark.parametrize('kind', ('name', 'fr', 'name:fr', 'frfr', '34'))\ndef test_create_kind_filter_many_positive(kind):\n    filt = SanitizerConfig({'filter-kind': ['.*fr', 'name', r'\\d+']}\n                           ).get_filter('filter-kind')\n\n    assert filt(kind)\n\n\n@pytest.mark.parametrize('kind', ('name:de', 'fridge', 'a34', '.*', '\\\\'))\ndef test_create_kind_filter_many_negative(kind):\n    filt = SanitizerConfig({'filter-kind': ['.*fr', 'name', r'\\d+']}\n                           ).get_filter('filter-kind')\n\n    assert not filt(kind)\n"
  },
  {
    "path": "test/python/tokenizer/sanitizers/test_split_name_list.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for the sanitizer that splits multivalue lists.\n\"\"\"\nimport pytest\n\nfrom nominatim_db.tokenizer.place_sanitizer import PlaceSanitizer\nfrom nominatim_db.data.place_info import PlaceInfo\n\nfrom nominatim_db.errors import UsageError\n\n\nclass TestSplitName:\n\n    @pytest.fixture(autouse=True)\n    def setup_country(self, def_config):\n        self.config = def_config\n\n    def run_sanitizer_on(self, **kwargs):\n        place = PlaceInfo({'name': kwargs})\n        name, _ = PlaceSanitizer([{'step': 'split-name-list'}], self.config).process_names(place)\n\n        return sorted([(p.name, p.kind, p.suffix) for p in name])\n\n    def sanitize_with_delimiter(self, delimiter, name):\n        place = PlaceInfo({'name': {'name': name}})\n        san = PlaceSanitizer([{'step': 'split-name-list', 'delimiters': delimiter}],\n                             self.config)\n        name, _ = san.process_names(place)\n\n        return sorted([p.name for p in name])\n\n    def test_simple(self):\n        assert self.run_sanitizer_on(name='ABC') == [('ABC', 'name', None)]\n        assert self.run_sanitizer_on(name='') == [('', 'name', None)]\n\n    def test_splits(self):\n        assert self.run_sanitizer_on(name='A;B;C') == [('A', 'name', None),\n                                                       ('B', 'name', None),\n                                                       ('C', 'name', None)]\n        assert self.run_sanitizer_on(short_name=' House, boat ') == [('House', 'short_name', None),\n                                                                     ('boat', 'short_name', None)]\n\n    def test_empty_fields(self):\n        assert self.run_sanitizer_on(name='A;;B') == [('A', 'name', None),\n                                                      ('B', 'name', None)]\n        assert self.run_sanitizer_on(name='A; ,B') == [('A', 'name', None),\n                                                       ('B', 'name', None)]\n        assert self.run_sanitizer_on(name=' ;B') == [('B', 'name', None)]\n        assert self.run_sanitizer_on(name='B,') == [('B', 'name', None)]\n\n    def test_custom_delimiters(self):\n        assert self.sanitize_with_delimiter(':', '12:45,3') == ['12', '45,3']\n        assert self.sanitize_with_delimiter('\\\\', 'a;\\\\b!#@ \\\\') == ['a;', 'b!#@']\n        assert self.sanitize_with_delimiter('[]', 'foo[to]be') == ['be', 'foo', 'to']\n        assert self.sanitize_with_delimiter(' ', 'morning  sun') == ['morning', 'sun']\n\n    def test_empty_delimiter_set(self):\n        with pytest.raises(UsageError):\n            self.sanitize_with_delimiter('', 'abc')\n\n\ndef test_no_name_list(def_config):\n    place = PlaceInfo({'address': {'housenumber': '3'}})\n    name, address = PlaceSanitizer([{'step': 'split-name-list'}], def_config).process_names(place)\n\n    assert not name\n    assert len(address) == 1\n"
  },
  {
    "path": "test/python/tokenizer/sanitizers/test_strip_brace_terms.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for the sanitizer that handles braced suffixes.\n\"\"\"\nimport pytest\n\nfrom nominatim_db.tokenizer.place_sanitizer import PlaceSanitizer\nfrom nominatim_db.data.place_info import PlaceInfo\n\n\nclass TestStripBrace:\n\n    @pytest.fixture(autouse=True)\n    def setup_country(self, def_config):\n        self.config = def_config\n\n    def run_sanitizer_on(self, **kwargs):\n        place = PlaceInfo({'name': kwargs})\n        name, _ = PlaceSanitizer([{'step': 'strip-brace-terms'}], self.config).process_names(place)\n\n        return sorted([(p.name, p.kind, p.suffix) for p in name])\n\n    def test_no_braces(self):\n        assert self.run_sanitizer_on(name='foo', ref='23') == [('23', 'ref', None),\n                                                               ('foo', 'name', None)]\n\n    def test_simple_braces(self):\n        assert self.run_sanitizer_on(name='Halle (Saale)', ref='3') \\\n            == [('3', 'ref', None), ('Halle', 'name', None), ('Halle (Saale)', 'name', None)]\n        assert self.run_sanitizer_on(name='ack ( bar') \\\n            == [('ack', 'name', None), ('ack ( bar', 'name', None)]\n        assert self.run_sanitizer_on(name='Berlin (Ost) Hauptbahnhof') \\\n            == [('Berlin (Ost) Hauptbahnhof', 'name', None)]\n\n    def test_only_braces(self):\n        assert self.run_sanitizer_on(name='(maybe)') == [('(maybe)', 'name', None)]\n\n    def test_double_braces(self):\n        assert self.run_sanitizer_on(name='a((b))') == [('a', 'name', None),\n                                                        ('a((b))', 'name', None)]\n        assert self.run_sanitizer_on(name='a (b) (c)') == [('a', 'name', None),\n                                                           ('a (b) (c)', 'name', None)]\n\n\ndef test_no_names(def_config):\n    place = PlaceInfo({'address': {'housenumber': '3'}})\n    name, address = PlaceSanitizer([{'step': 'strip-brace-terms'}], def_config).process_names(place)\n\n    assert not name\n    assert len(address) == 1\n"
  },
  {
    "path": "test/python/tokenizer/sanitizers/test_tag_analyzer_by_language.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for the sanitizer that enables language-dependent analyzers.\n\"\"\"\nimport pytest\n\nfrom nominatim_db.data.place_info import PlaceInfo\nfrom nominatim_db.tokenizer.place_sanitizer import PlaceSanitizer\nfrom nominatim_db.data.country_info import setup_country_config\n\n\nclass TestWithDefaults:\n\n    @pytest.fixture(autouse=True)\n    def setup_country(self, def_config):\n        self.config = def_config\n\n    def run_sanitizer_on(self, country, **kwargs):\n        place = PlaceInfo({'name': {k.replace('_', ':'): v for k, v in kwargs.items()},\n                           'country_code': country})\n        name, _ = PlaceSanitizer([{'step': 'tag-analyzer-by-language'}],\n                                 self.config).process_names(place)\n\n        return sorted([(p.name, p.kind, p.suffix, p.attr) for p in name])\n\n    def test_no_names(self):\n        assert self.run_sanitizer_on('de') == []\n\n    def test_simple(self):\n        res = self.run_sanitizer_on('fr', name='Foo', name_de='Zoo', ref_abc='M')\n\n        assert res == [('Foo', 'name', None, {}),\n                       ('M', 'ref', 'abc', {'analyzer': 'abc'}),\n                       ('Zoo', 'name', 'de', {'analyzer': 'de'})]\n\n    @pytest.mark.parametrize('suffix', ['DE', 'asbc'])\n    def test_illegal_suffix(self, suffix):\n        assert self.run_sanitizer_on('fr', **{'name_' + suffix: 'Foo'}) \\\n                 == [('Foo', 'name', suffix, {})]\n\n\nclass TestFilterKind:\n\n    @pytest.fixture(autouse=True)\n    def setup_country(self, def_config):\n        self.config = def_config\n\n    def run_sanitizer_on(self, filt, **kwargs):\n        place = PlaceInfo({'name': {k.replace('_', ':'): v for k, v in kwargs.items()},\n                           'country_code': 'de'})\n        name, _ = PlaceSanitizer([{'step': 'tag-analyzer-by-language',\n                                   'filter-kind': filt}],\n                                 self.config).process_names(place)\n\n        return sorted([(p.name, p.kind, p.suffix, p.attr) for p in name])\n\n    def test_single_exact_name(self):\n        res = self.run_sanitizer_on(['name'], name_fr='A', ref_fr='12',\n                                    shortname_fr='C', name='D')\n\n        assert res == [('12', 'ref',  'fr', {}),\n                       ('A',  'name', 'fr', {'analyzer': 'fr'}),\n                       ('C',  'shortname', 'fr', {}),\n                       ('D',  'name', None, {})]\n\n    def test_single_pattern(self):\n        res = self.run_sanitizer_on(['.*name'],\n                                    name_fr='A', ref_fr='12', namexx_fr='B',\n                                    shortname_fr='C', name='D')\n\n        assert res == [('12', 'ref',  'fr', {}),\n                       ('A',  'name', 'fr', {'analyzer': 'fr'}),\n                       ('B',  'namexx', 'fr', {}),\n                       ('C',  'shortname', 'fr', {'analyzer': 'fr'}),\n                       ('D',  'name', None, {})]\n\n    def test_multiple_patterns(self):\n        res = self.run_sanitizer_on(['.*name', 'ref'],\n                                    name_fr='A', ref_fr='12', oldref_fr='X',\n                                    namexx_fr='B', shortname_fr='C', name='D')\n\n        assert res == [('12', 'ref',  'fr', {'analyzer': 'fr'}),\n                       ('A',  'name', 'fr', {'analyzer': 'fr'}),\n                       ('B',  'namexx', 'fr', {}),\n                       ('C',  'shortname', 'fr', {'analyzer': 'fr'}),\n                       ('D',  'name', None, {}),\n                       ('X',  'oldref', 'fr', {})]\n\n\nclass TestDefaultCountry:\n\n    @pytest.fixture(autouse=True)\n    def setup_country(self, def_config):\n        setup_country_config(def_config)\n        self.config = def_config\n\n    def run_sanitizer_append(self, mode,  country, **kwargs):\n        place = PlaceInfo({'name': {k.replace('_', ':'): v for k, v in kwargs.items()},\n                           'country_code': country})\n        name, _ = PlaceSanitizer([{'step': 'tag-analyzer-by-language',\n                                   'use-defaults': mode,\n                                   'mode': 'append'}],\n                                 self.config).process_names(place)\n\n        assert all(isinstance(p.attr, dict) for p in name)\n        assert all(len(p.attr) <= 1 for p in name)\n        assert all(not p.attr or ('analyzer' in p.attr and p.attr['analyzer'])\n                   for p in name)\n\n        return sorted([(p.name, p.attr.get('analyzer', '')) for p in name])\n\n    def run_sanitizer_replace(self, mode,  country, **kwargs):\n        place = PlaceInfo({'name': {k.replace('_', ':'): v for k, v in kwargs.items()},\n                           'country_code': country})\n        name, _ = PlaceSanitizer([{'step': 'tag-analyzer-by-language',\n                                   'use-defaults': mode,\n                                   'mode': 'replace'}],\n                                 self.config).process_names(place)\n\n        assert all(isinstance(p.attr, dict) for p in name)\n        assert all(len(p.attr) <= 1 for p in name)\n        assert all(not p.attr or ('analyzer' in p.attr and p.attr['analyzer'])\n                   for p in name)\n\n        return sorted([(p.name, p.attr.get('analyzer', '')) for p in name])\n\n    def test_missing_country(self):\n        place = PlaceInfo({'name': {'name': 'something'}})\n        name, _ = PlaceSanitizer([{'step': 'tag-analyzer-by-language',\n                                   'use-defaults': 'all',\n                                   'mode': 'replace'}],\n                                 self.config).process_names(place)\n\n        assert len(name) == 1\n        assert name[0].name == 'something'\n        assert name[0].suffix is None\n        assert 'analyzer' not in name[0].attr\n\n    def test_mono_unknown_country(self):\n        expect = [('XX', '')]\n\n        assert self.run_sanitizer_replace('mono', 'xx', name='XX') == expect\n        assert self.run_sanitizer_append('mono', 'xx', name='XX') == expect\n\n    def test_mono_monoling_replace(self):\n        res = self.run_sanitizer_replace('mono', 'de', name='Foo')\n\n        assert res == [('Foo', 'de')]\n\n    def test_mono_monoling_append(self):\n        res = self.run_sanitizer_append('mono', 'de', name='Foo')\n\n        assert res == [('Foo', ''), ('Foo', 'de')]\n\n    def test_mono_multiling(self):\n        expect = [('XX', '')]\n\n        assert self.run_sanitizer_replace('mono', 'ch', name='XX') == expect\n        assert self.run_sanitizer_append('mono', 'ch', name='XX') == expect\n\n    def test_all_unknown_country(self):\n        expect = [('XX', '')]\n\n        assert self.run_sanitizer_replace('all', 'xx', name='XX') == expect\n        assert self.run_sanitizer_append('all', 'xx', name='XX') == expect\n\n    def test_all_monoling_replace(self):\n        res = self.run_sanitizer_replace('all', 'de', name='Foo')\n\n        assert res == [('Foo', 'de')]\n\n    def test_all_monoling_append(self):\n        res = self.run_sanitizer_append('all', 'de', name='Foo')\n\n        assert res == [('Foo', ''), ('Foo', 'de')]\n\n    def test_all_multiling_append(self):\n        res = self.run_sanitizer_append('all', 'ch', name='XX')\n\n        assert res == [('XX', ''),\n                       ('XX', 'de'), ('XX', 'fr'), ('XX', 'it'), ('XX', 'rm')]\n\n    def test_all_multiling_replace(self):\n        res = self.run_sanitizer_replace('all', 'ch', name='XX')\n\n        assert res == [('XX', 'de'), ('XX', 'fr'), ('XX', 'it'), ('XX', 'rm')]\n\n\nclass TestCountryWithWhitelist:\n\n    @pytest.fixture(autouse=True)\n    def setup_country(self, def_config):\n        self.config = def_config\n\n    def run_sanitizer_on(self, mode,  country, **kwargs):\n        place = PlaceInfo({'name': {k.replace('_', ':'): v for k, v in kwargs.items()},\n                           'country_code': country})\n        name, _ = PlaceSanitizer([{'step': 'tag-analyzer-by-language',\n                                   'use-defaults': mode,\n                                   'mode': 'replace',\n                                   'whitelist': ['de', 'fr', 'ru']}],\n                                 self.config).process_names(place)\n\n        assert all(isinstance(p.attr, dict) for p in name)\n        assert all(len(p.attr) <= 1 for p in name)\n        assert all(not p.attr or ('analyzer' in p.attr and p.attr['analyzer'])\n                   for p in name)\n\n        return sorted([(p.name, p.attr.get('analyzer', '')) for p in name])\n\n    def test_mono_monoling(self):\n        assert self.run_sanitizer_on('mono', 'de', name='Foo') == [('Foo', 'de')]\n        assert self.run_sanitizer_on('mono', 'pt', name='Foo') == [('Foo', '')]\n\n    def test_mono_multiling(self):\n        assert self.run_sanitizer_on('mono', 'ca', name='Foo') == [('Foo', '')]\n\n    def test_all_monoling(self):\n        assert self.run_sanitizer_on('all', 'de', name='Foo') == [('Foo', 'de')]\n        assert self.run_sanitizer_on('all', 'pt', name='Foo') == [('Foo', '')]\n\n    def test_all_multiling(self):\n        assert self.run_sanitizer_on('all', 'ca', name='Foo') == [('Foo', 'fr')]\n        assert self.run_sanitizer_on('all', 'ch', name='Foo') \\\n            == [('Foo', 'de'), ('Foo', 'fr')]\n\n\nclass TestWhiteList:\n\n    @pytest.fixture(autouse=True)\n    def setup_country(self, def_config):\n        self.config = def_config\n\n    def run_sanitizer_on(self, whitelist, **kwargs):\n        place = PlaceInfo({'name': {k.replace('_', ':'): v for k, v in kwargs.items()}})\n        name, _ = PlaceSanitizer([{'step': 'tag-analyzer-by-language',\n                                   'mode': 'replace',\n                                   'whitelist': whitelist}],\n                                 self.config).process_names(place)\n\n        assert all(isinstance(p.attr, dict) for p in name)\n        assert all(len(p.attr) <= 1 for p in name)\n        assert all(not p.attr or ('analyzer' in p.attr and p.attr['analyzer'])\n                   for p in name)\n\n        return sorted([(p.name, p.attr.get('analyzer', '')) for p in name])\n\n    def test_in_whitelist(self):\n        assert self.run_sanitizer_on(['de', 'xx'], ref_xx='123') == [('123', 'xx')]\n\n    def test_not_in_whitelist(self):\n        assert self.run_sanitizer_on(['de', 'xx'], ref_yy='123') == [('123', '')]\n\n    def test_empty_whitelist(self):\n        assert self.run_sanitizer_on([], ref_yy='123') == [('123', '')]\n"
  },
  {
    "path": "test/python/tokenizer/sanitizers/test_tag_japanese.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\nimport pytest\n\nfrom nominatim_db.data.place_info import PlaceInfo\nfrom nominatim_db.tokenizer.place_sanitizer import PlaceSanitizer\n\n\nclass TestTagJapanese:\n    @pytest.fixture(autouse=True)\n    def setup_country(self, def_config):\n        self.config = def_config\n\n    def run_sanitizer_on(self, type, **kwargs):\n        place = PlaceInfo({\n            'address': kwargs,\n            'country_code': 'jp'\n        })\n        sanitizer_args = {'step': 'tag-japanese'}\n        _, address = PlaceSanitizer([sanitizer_args], self.config).process_names(place)\n        tmp_list = [(p.name, p.kind) for p in address]\n        return sorted(tmp_list)\n\n    def test_on_address(self):\n        res = self.run_sanitizer_on('address', name='foo', ref='bar', ref_abc='baz')\n        assert res == [('bar', 'ref'), ('baz', 'ref_abc'), ('foo', 'name')]\n\n    def test_housenumber(self):\n        res = self.run_sanitizer_on('address', housenumber='2')\n        assert res == [('2', 'housenumber')]\n\n    def test_blocknumber(self):\n        res = self.run_sanitizer_on('address', block_number='6')\n        assert res == [('6', 'housenumber')]\n\n    def test_neighbourhood(self):\n        res = self.run_sanitizer_on('address', neighbourhood='8')\n        assert res == [('8', 'place')]\n\n    def test_quarter(self):\n        res = self.run_sanitizer_on('address', quarter='kase')\n        assert res == [('kase', 'place')]\n\n    def test_housenumber_blocknumber(self):\n        res = self.run_sanitizer_on('address', housenumber='2', block_number='6')\n        assert res == [('6-2', 'housenumber')]\n\n    def test_quarter_neighbourhood(self):\n        res = self.run_sanitizer_on('address', quarter='kase', neighbourhood='8')\n        assert res == [('kase8', 'place')]\n\n    def test_blocknumber_housenumber_quarter(self):\n        res = self.run_sanitizer_on('address', block_number='6', housenumber='2', quarter='kase')\n        assert res == [('6-2', 'housenumber'), ('kase', 'place')]\n\n    def test_blocknumber_housenumber_quarter_neighbourhood(self):\n        res = self.run_sanitizer_on('address', block_number='6', housenumber='2', neighbourhood='8')\n        assert res == [('6-2', 'housenumber'), ('8', 'place')]\n\n    def test_blocknumber_quarter_neighbourhood(self):\n        res = self.run_sanitizer_on('address', block_number='6', quarter='kase', neighbourhood='8')\n        assert res == [('6', 'housenumber'), ('kase8', 'place')]\n\n    def test_blocknumber_quarter(self):\n        res = self.run_sanitizer_on('address', block_number='6', quarter='kase')\n        assert res == [('6', 'housenumber'), ('kase', 'place')]\n\n    def test_blocknumber_neighbourhood(self):\n        res = self.run_sanitizer_on('address', block_number='6', neighbourhood='8')\n        assert res == [('6', 'housenumber'), ('8', 'place')]\n\n    def test_housenumber_quarter_neighbourhood(self):\n        res = self.run_sanitizer_on('address', housenumber='2', quarter='kase', neighbourhood='8')\n        assert res == [('2', 'housenumber'), ('kase8', 'place')]\n\n    def test_housenumber_quarter(self):\n        res = self.run_sanitizer_on('address', housenumber='2', quarter='kase')\n        assert res == [('2', 'housenumber'), ('kase', 'place')]\n\n    def test_housenumber_blocknumber_neighbourhood_quarter(self):\n        res = self.run_sanitizer_on('address', block_number='6', housenumber='2',\n                                    quarter='kase', neighbourhood='8')\n        assert res == [('6-2', 'housenumber'), ('kase8', 'place')]\n"
  },
  {
    "path": "test/python/tokenizer/test_factory.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for creating new tokenizers.\n\"\"\"\nimport pytest\n\nfrom nominatim_db.db import properties\nfrom nominatim_db.tokenizer import factory\nfrom nominatim_db.errors import UsageError\nfrom dummy_tokenizer import DummyTokenizer\n\n\ndef test_setup_bad_tokenizer_name(project_env, monkeypatch):\n    monkeypatch.setenv('NOMINATIM_TOKENIZER', 'dummy')\n\n    with pytest.raises(UsageError):\n        factory.create_tokenizer(project_env)\n\n\nclass TestFactory:\n    @pytest.fixture(autouse=True)\n    def init_env(self, project_env, property_table, tokenizer_mock):\n        self.config = project_env\n\n    def test_setup_dummy_tokenizer(self, temp_db_conn):\n        tokenizer = factory.create_tokenizer(self.config)\n\n        assert isinstance(tokenizer, DummyTokenizer)\n        assert tokenizer.init_state == \"new\"\n\n        assert properties.get_property(temp_db_conn, 'tokenizer') == 'dummy'\n\n    def test_load_tokenizer(self):\n        factory.create_tokenizer(self.config)\n\n        tokenizer = factory.get_tokenizer_for_db(self.config)\n\n        assert isinstance(tokenizer, DummyTokenizer)\n        assert tokenizer.init_state == \"loaded\"\n\n    def test_load_repopulate_tokenizer_dir(self):\n        factory.create_tokenizer(self.config)\n\n        self.config.project_dir = self.config.project_dir\n\n        factory.get_tokenizer_for_db(self.config)\n\n    def test_load_missing_property(self, temp_db_cursor):\n        factory.create_tokenizer(self.config)\n\n        temp_db_cursor.execute(\"TRUNCATE TABLE nominatim_properties\")\n\n        with pytest.raises(UsageError):\n            factory.get_tokenizer_for_db(self.config)\n"
  },
  {
    "path": "test/python/tokenizer/test_icu.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for ICU tokenizer.\n\"\"\"\nimport yaml\nimport itertools\n\nimport pytest\n\nfrom nominatim_db.tokenizer import icu_tokenizer\nimport nominatim_db.tokenizer.icu_rule_loader\nfrom nominatim_db.db import properties\nfrom nominatim_db.data.place_info import PlaceInfo\n\nfrom mock_icu_word_table import MockIcuWordTable\n\n\n@pytest.fixture\ndef word_table(temp_db_conn):\n    return MockIcuWordTable(temp_db_conn)\n\n\n@pytest.fixture\ndef test_config(project_env, tmp_path):\n    sqldir = tmp_path / 'sql'\n    sqldir.mkdir()\n    (sqldir / 'tokenizer').mkdir()\n    (sqldir / 'tokenizer' / 'icu_tokenizer.sql').write_text(\"SELECT 'a'\", encoding='utf-8')\n\n    project_env.lib_dir.sql = sqldir\n\n    return project_env\n\n\n@pytest.fixture\ndef tokenizer_factory(dsn, property_table, sql_preprocessor, place_table, word_table):\n    def _maker():\n        return icu_tokenizer.create(dsn)\n\n    return _maker\n\n\n@pytest.fixture\ndef db_prop(temp_db_conn):\n    def _get_db_property(name):\n        return properties.get_property(temp_db_conn, name)\n\n    return _get_db_property\n\n\n@pytest.fixture\ndef analyzer(tokenizer_factory, test_config, monkeypatch,\n             temp_db_with_extensions, tmp_path):\n    sql = tmp_path / 'sql' / 'tokenizer' / 'icu_tokenizer.sql'\n    sql.write_text(\"SELECT 'a';\", encoding='utf-8')\n\n    monkeypatch.setenv('NOMINATIM_TERM_NORMALIZATION', ':: lower();')\n    tok = tokenizer_factory()\n    tok.init_new_db(test_config)\n    monkeypatch.undo()\n\n    def _mk_analyser(norm=(\"[[:Punctuation:][:Space:]]+ > ' '\",), trans=(':: upper()',),\n                     variants=('~gasse -> gasse', 'street => st', ),\n                     sanitizers=[], with_housenumber=False,\n                     with_postcode=False):\n        cfgstr = {'normalization': list(norm),\n                  'sanitizers': sanitizers,\n                  'transliteration': list(trans),\n                  'token-analysis': [{'analyzer': 'generic',\n                                      'variants': [{'words': list(variants)}]}]}\n        if with_housenumber:\n            cfgstr['token-analysis'].append({'id': '@housenumber',\n                                             'analyzer': 'housenumbers'})\n        if with_postcode:\n            cfgstr['token-analysis'].append({'id': '@postcode',\n                                             'analyzer': 'postcodes'})\n        (test_config.project_dir / 'icu_tokenizer.yaml').write_text(\n            yaml.dump(cfgstr), encoding='utf-8')\n        tok.loader = nominatim_db.tokenizer.icu_rule_loader.ICURuleLoader(test_config)\n\n        return tok.name_analyzer()\n\n    return _mk_analyser\n\n\n@pytest.fixture\ndef sql_functions(load_sql):\n    load_sql('functions/utils.sql')\n    load_sql('tokenizer/icu_tokenizer.sql')\n\n\n@pytest.fixture\ndef getorcreate_full_word(temp_db_cursor):\n    temp_db_cursor.execute(\"\"\"CREATE OR REPLACE FUNCTION getorcreate_full_word(\n                                                 norm_term TEXT, lookup_terms TEXT[],\n                                                 OUT full_token INT,\n                                                 OUT partial_tokens INT[])\n  AS $$\nDECLARE\n  partial_terms TEXT[] = '{}'::TEXT[];\n  term TEXT;\n  term_id INTEGER;\n  term_count INTEGER;\nBEGIN\n  SELECT min(word_id) INTO full_token\n    FROM word WHERE info->>'word' = norm_term and type = 'W';\n\n  IF full_token IS NULL THEN\n    full_token := nextval('seq_word');\n    INSERT INTO word (word_id, word_token, type, info)\n      SELECT full_token, lookup_term, 'W',\n             json_build_object('word', norm_term, 'count', 0)\n        FROM unnest(lookup_terms) as lookup_term;\n  END IF;\n\n  FOR term IN SELECT unnest(string_to_array(unnest(lookup_terms), ' ')) LOOP\n    term := trim(term);\n    IF NOT (ARRAY[term] <@ partial_terms) THEN\n      partial_terms := partial_terms || term;\n    END IF;\n  END LOOP;\n\n  partial_tokens := '{}'::INT[];\n  FOR term IN SELECT unnest(partial_terms) LOOP\n    SELECT min(word_id), max(info->>'count') INTO term_id, term_count\n      FROM word WHERE word_token = term and type = 'w';\n\n    IF term_id IS NULL THEN\n      term_id := nextval('seq_word');\n      term_count := 0;\n      INSERT INTO word (word_id, word_token, type, info)\n        VALUES (term_id, term, 'w', json_build_object('count', term_count));\n    END IF;\n\n    IF NOT (ARRAY[term_id] <@ partial_tokens) THEN\n      partial_tokens := partial_tokens || term_id;\n    END IF;\n  END LOOP;\nEND;\n$$\nLANGUAGE plpgsql;\n                              \"\"\")\n\n\ndef test_init_new(tokenizer_factory, test_config, db_prop):\n    tok = tokenizer_factory()\n    tok.init_new_db(test_config)\n\n    prop = db_prop(nominatim_db.tokenizer.icu_rule_loader.DBCFG_IMPORT_NORM_RULES)\n\n    assert prop.startswith(':: lower ();')\n\n\ndef test_init_word_table(tokenizer_factory, test_config, place_row, temp_db_cursor):\n    place_row(names={'name': 'Test Area', 'ref': '52'})\n    place_row(names={'name': 'No Area'})\n    place_row(names={'name': 'Holzstrasse'})\n\n    tok = tokenizer_factory()\n    tok.init_new_db(test_config)\n\n    assert temp_db_cursor.table_exists('word')\n\n\ndef test_init_from_project(test_config, tokenizer_factory):\n    tok = tokenizer_factory()\n    tok.init_new_db(test_config)\n\n    tok = tokenizer_factory()\n    tok.init_from_project(test_config)\n\n    assert tok.loader is not None\n\n\ndef test_update_sql_functions(db_prop, temp_db_cursor,\n                              tokenizer_factory, test_config, table_factory,\n                              monkeypatch):\n    tok = tokenizer_factory()\n    tok.init_new_db(test_config)\n\n    table_factory('test', 'txt TEXT')\n\n    func_file = test_config.lib_dir.sql / 'tokenizer' / 'icu_tokenizer.sql'\n    func_file.write_text(\"\"\"INSERT INTO test VALUES (1133)\"\"\", encoding='utf-8')\n\n    tok.update_sql_functions(test_config)\n\n    test_content = temp_db_cursor.row_set('SELECT * FROM test')\n    assert test_content == set((('1133', ), ))\n\n\ndef test_finalize_import(tokenizer_factory, temp_db_cursor,\n                         test_config, sql_preprocessor_cfg):\n    tok = tokenizer_factory()\n    tok.init_new_db(test_config)\n\n    assert not temp_db_cursor.index_exists('word', 'idx_word_word_id')\n\n    tok.finalize_import(test_config)\n\n    assert temp_db_cursor.index_exists('word', 'idx_word_word_id')\n\n\ndef test_check_database(test_config, tokenizer_factory,\n                        temp_db_cursor, sql_preprocessor_cfg):\n    tok = tokenizer_factory()\n    tok.init_new_db(test_config)\n\n    assert tok.check_database(test_config) is None\n\n\ndef test_update_statistics_reverse_only(word_table, tokenizer_factory, test_config):\n    tok = tokenizer_factory()\n    tok.update_statistics(test_config)\n\n\ndef test_update_statistics(word_table, table_factory, temp_db_cursor,\n                           tokenizer_factory, test_config):\n    word_table.add_full_word(1000, 'hello')\n    word_table.add_full_word(1001, 'bye')\n    word_table.add_full_word(1002, 'town')\n    table_factory('search_name',\n                  'place_id BIGINT, name_vector INT[], nameaddress_vector INT[]',\n                  [(12, [1000], [1001]), (13, [1001], [1002]), (14, [1000, 1001], [1002])])\n    tok = tokenizer_factory()\n\n    tok.update_statistics(test_config)\n\n    assert temp_db_cursor.row_set(\"\"\"SELECT word_id,\n                                            (info->>'count')::int,\n                                            (info->>'addr_count')::int\n                                     FROM word\n                                     WHERE type = 'W'\"\"\") == \\\n        {(1000, 2, None), (1001, 2, None), (1002, None, 2)}\n\n\ndef test_normalize_postcode(analyzer):\n    with analyzer() as anl:\n        anl.normalize_postcode('123') == '123'\n        anl.normalize_postcode('ab-34 ') == 'AB-34'\n        anl.normalize_postcode('38 Б') == '38 Б'\n\n\nclass TestPostcodes:\n\n    @pytest.fixture(autouse=True)\n    def setup(self, analyzer, sql_functions):\n        sanitizers = [{'step': 'clean-postcodes'}]\n        with analyzer(sanitizers=sanitizers, with_postcode=True) as anl:\n            self.analyzer = anl\n            yield anl\n\n    def process_postcode(self, cc, postcode):\n        return self.analyzer.process_place(PlaceInfo({'country_code': cc,\n                                                      'address': {'postcode': postcode}}))\n\n    def test_update_postcodes_deleted(self, word_table):\n        word_table.add_postcode(' 1234', '1234')\n        word_table.add_postcode(' 5678', '5678')\n\n        self.analyzer.update_postcodes_from_db()\n\n        assert word_table.count() == 0\n\n    def test_process_place_postcode_simple(self, word_table):\n        info = self.process_postcode('de', '12345')\n\n        assert info['postcode'] == '12345'\n\n    def test_process_place_postcode_with_space(self, word_table):\n        info = self.process_postcode('in', '123 567')\n\n        assert info['postcode'] == '123567'\n\n\ndef test_update_special_phrase_empty_table(analyzer, word_table):\n    with analyzer() as anl:\n        anl.update_special_phrases([\n            (\"König  bei\", \"amenity\", \"royal\", \"near\"),\n            (\"Könige \", \"amenity\", \"royal\", \"-\"),\n            (\"street\", \"highway\", \"primary\", \"in\")\n        ], True)\n\n    assert word_table.get_special() \\\n        == {('KÖNIG BEI', 'König bei', 'amenity', 'royal', 'near'),\n            ('KÖNIGE', 'Könige', 'amenity', 'royal', None),\n            ('STREET', 'street', 'highway', 'primary', 'in')}\n\n\ndef test_update_special_phrase_delete_all(analyzer, word_table):\n    word_table.add_special('FOO', 'foo', 'amenity', 'prison', 'in')\n    word_table.add_special('BAR', 'bar', 'highway', 'road', None)\n\n    assert word_table.count_special() == 2\n\n    with analyzer() as anl:\n        anl.update_special_phrases([], True)\n\n    assert word_table.count_special() == 0\n\n\ndef test_update_special_phrases_no_replace(analyzer, word_table):\n    word_table.add_special('FOO', 'foo', 'amenity', 'prison', 'in')\n    word_table.add_special('BAR', 'bar', 'highway', 'road', None)\n\n    assert word_table.count_special() == 2\n\n    with analyzer() as anl:\n        anl.update_special_phrases([], False)\n\n    assert word_table.count_special() == 2\n\n\ndef test_update_special_phrase_modify(analyzer, word_table):\n    word_table.add_special('FOO', 'foo', 'amenity', 'prison', 'in')\n    word_table.add_special('BAR', 'bar', 'highway', 'road', None)\n\n    assert word_table.count_special() == 2\n\n    with analyzer() as anl:\n        anl.update_special_phrases([\n            ('prison', 'amenity', 'prison', 'in'),\n            ('bar', 'highway', 'road', '-'),\n            ('garden', 'leisure', 'garden', 'near')\n        ], True)\n\n    assert word_table.get_special() \\\n        == {('PRISON', 'prison', 'amenity', 'prison', 'in'),\n            ('BAR', 'bar', 'highway', 'road', None),\n            ('GARDEN', 'garden', 'leisure', 'garden', 'near')}\n\n\ndef test_add_country_names_new(analyzer, word_table):\n    with analyzer() as anl:\n        anl.add_country_names('es', {'name': 'Espagña', 'name:en': 'Spain'})\n\n    assert word_table.get_country() == {('es', 'ESPAGÑA', 'Espagña'),\n                                        ('es', 'SPAIN', 'Spain')}\n\n\ndef test_add_country_names_extend(analyzer, word_table):\n    word_table.add_country('ch', 'SCHWEIZ', 'Schweiz')\n\n    with analyzer() as anl:\n        anl.add_country_names('ch', {'name': 'Schweiz', 'name:fr': 'Suisse'})\n\n    assert word_table.get_country() == {('ch', 'SCHWEIZ', 'Schweiz'),\n                                        ('ch', 'SUISSE', 'Suisse')}\n\n\nclass TestPlaceNames:\n\n    @pytest.fixture(autouse=True)\n    def setup(self, analyzer, sql_functions):\n        sanitizers = [{'step': 'split-name-list'},\n                      {'step': 'strip-brace-terms'}]\n        with analyzer(sanitizers=sanitizers) as anl:\n            self.analyzer = anl\n            yield anl\n\n    def expect_name_terms(self, info, *expected_terms):\n        tokens = self.analyzer.get_word_token_info(expected_terms)\n        for token in tokens:\n            assert token[2] is not None, \"No token for {0}\".format(token)\n\n        assert eval(info['names']) == set((t[2] for t in tokens))\n\n    def process_named_place(self, names):\n        return self.analyzer.process_place(PlaceInfo({'name': names}))\n\n    def test_simple_names(self):\n        info = self.process_named_place({'name': 'Soft bAr', 'ref': '34'})\n\n        self.expect_name_terms(info, '#Soft bAr', '#34', 'Soft', 'bAr', '34')\n\n    @pytest.mark.parametrize('sep', [',', ';'])\n    def test_names_with_separator(self, sep):\n        info = self.process_named_place({'name': sep.join(('New York', 'Big Apple'))})\n\n        self.expect_name_terms(info, '#New York', '#Big Apple',\n                                     'new', 'york', 'big', 'apple')\n\n    def test_full_names_with_bracket(self):\n        info = self.process_named_place({'name': 'Houseboat (left)'})\n\n        self.expect_name_terms(info, '#Houseboat (left)', '#Houseboat',\n                                     'houseboat', 'left')\n\n    def test_country_name(self, word_table):\n        place = PlaceInfo({'name': {'name': 'Norge'},\n                           'country_code': 'no',\n                           'rank_address': 4,\n                           'class': 'boundary',\n                           'type': 'administrative'})\n\n        info = self.analyzer.process_place(place)\n\n        self.expect_name_terms(info, '#norge', 'norge')\n        assert word_table.get_country() == {('no', 'NORGE', 'Norge')}\n\n\nclass TestPlaceAddress:\n\n    @pytest.fixture(autouse=True)\n    def setup(self, analyzer, sql_functions):\n        hnr = {'step': 'clean-housenumbers',\n               'filter-kind': ['housenumber', 'conscriptionnumber', 'streetnumber']}\n        with analyzer(trans=(\":: upper()\", \"'🜵' > ' '\"), sanitizers=[hnr]) as anl:\n            self.analyzer = anl\n            yield anl\n\n    @pytest.fixture\n    def getorcreate_hnr_id(self, temp_db_cursor):\n        temp_db_cursor.execute(\"\"\"CREATE OR REPLACE FUNCTION getorcreate_hnr_id(lookup_term TEXT)\n                                  RETURNS INTEGER AS $$\n                                    SELECT -nextval('seq_word')::INTEGER; $$ LANGUAGE SQL\"\"\")\n\n    def process_address(self, **kwargs):\n        return self.analyzer.process_place(PlaceInfo({'address': kwargs}))\n\n    def name_token_set(self, *expected_terms):\n        tokens = self.analyzer.get_word_token_info(expected_terms)\n        for token in tokens:\n            assert token[2] is not None, \"No token for {0}\".format(token)\n\n        return set((t[2] for t in tokens))\n\n    @pytest.mark.parametrize('pcode', ['12345', 'AB 123', '34-345'])\n    def test_process_place_postcode(self, word_table, pcode):\n        info = self.process_address(postcode=pcode)\n\n        assert info['postcode'] == pcode\n\n    @pytest.mark.parametrize('hnr', ['123a', '1', '101'])\n    def test_process_place_housenumbers_simple(self, hnr, getorcreate_hnr_id):\n        info = self.process_address(housenumber=hnr)\n\n        assert info['hnr'] == hnr.upper()\n        assert info['hnr_tokens'] == \"{-1}\"\n\n    def test_process_place_housenumbers_duplicates(self, getorcreate_hnr_id):\n        info = self.process_address(housenumber='134',\n                                    conscriptionnumber='134',\n                                    streetnumber='99a')\n\n        assert set(info['hnr'].split(';')) == set(('134', '99A'))\n        assert info['hnr_tokens'] == \"{-1,-2}\"\n\n    def test_process_place_housenumbers_cached(self, getorcreate_hnr_id):\n        info = self.process_address(housenumber=\"45\")\n        assert info['hnr_tokens'] == \"{-1}\"\n\n        info = self.process_address(housenumber=\"46\")\n        assert info['hnr_tokens'] == \"{-2}\"\n\n        info = self.process_address(housenumber=\"41;45\")\n        assert eval(info['hnr_tokens']) == {-1, -3}\n\n        info = self.process_address(housenumber=\"41\")\n        assert eval(info['hnr_tokens']) == {-3}\n\n    def test_process_place_street(self):\n        self.analyzer.process_place(PlaceInfo({'name': {'name': 'Grand Road'}}))\n        info = self.process_address(street='Grand Road')\n\n        assert eval(info['street']) == self.name_token_set('#Grand Road')\n\n    def test_process_place_nonexisting_street(self):\n        info = self.process_address(street='Grand Road')\n\n        assert info['street'] == '{}'\n\n    def test_process_place_multiple_street_tags(self):\n        self.analyzer.process_place(PlaceInfo({'name': {'name': 'Grand Road',\n                                                        'ref': '05989'}}))\n        info = self.process_address(**{'street': 'Grand Road',\n                                       'street:sym_ul': '05989'})\n\n        assert eval(info['street']) == self.name_token_set('#Grand Road', '#05989')\n\n    def test_process_place_street_empty(self):\n        info = self.process_address(street='🜵')\n\n        assert info['street'] == '{}'\n\n    def test_process_place_street_from_cache(self):\n        self.analyzer.process_place(PlaceInfo({'name': {'name': 'Grand Road'}}))\n        self.process_address(street='Grand Road')\n\n        # request address again\n        info = self.process_address(street='Grand Road')\n\n        assert eval(info['street']) == self.name_token_set('#Grand Road')\n\n    def test_process_place_place(self):\n        info = self.process_address(place='Honu Lulu')\n\n        assert eval(info['place']) == self.name_token_set('HONU', 'LULU', '#HONU LULU')\n\n    def test_process_place_place_extra(self):\n        info = self.process_address(**{'place:en': 'Honu Lulu'})\n\n        assert 'place' not in info\n\n    def test_process_place_place_empty(self):\n        info = self.process_address(place='🜵')\n\n        assert 'place' not in info\n\n    def test_process_place_address_terms(self):\n        info = self.process_address(country='de', city='Zwickau', state='Sachsen',\n                                    suburb='Zwickau', street='Hauptstr',\n                                    full='right behind the church')\n\n        city = self.name_token_set('ZWICKAU', '#ZWICKAU')\n        state = self.name_token_set('SACHSEN', '#SACHSEN')\n\n        result = {k: eval(v) for k, v in info['addr'].items()}\n\n        assert result == {'city': city, 'suburb': city, 'state': state}\n\n    def test_process_place_multiple_address_terms(self):\n        info = self.process_address(**{'city': 'Bruxelles', 'city:de': 'Brüssel'})\n\n        result = {k: eval(v) for k, v in info['addr'].items()}\n\n        assert result == {'city': self.name_token_set('Bruxelles', '#Bruxelles')}\n\n    def test_process_place_address_terms_empty(self):\n        info = self.process_address(country='de', city=' ', street='Hauptstr',\n                                    full='right behind the church')\n\n        assert 'addr' not in info\n\n\nclass TestPlaceHousenumberWithAnalyser:\n\n    @pytest.fixture(autouse=True)\n    def setup(self, analyzer, sql_functions):\n        hnr = {'step': 'clean-housenumbers',\n               'filter-kind': ['housenumber', 'conscriptionnumber', 'streetnumber']}\n        with analyzer(trans=(\":: upper()\", \"'🜵' > ' '\"), sanitizers=[hnr],\n                      with_housenumber=True) as anl:\n            self.analyzer = anl\n            yield anl\n\n    @pytest.fixture\n    def getorcreate_hnr_id(self, temp_db_cursor):\n        temp_db_cursor.execute(\"\"\"\n            CREATE OR REPLACE FUNCTION create_analyzed_hnr_id(norm_term TEXT, lookup_terms TEXT[])\n            RETURNS INTEGER AS $$\n                SELECT -nextval('seq_word')::INTEGER; $$ LANGUAGE SQL\"\"\")\n\n    def process_address(self, **kwargs):\n        return self.analyzer.process_place(PlaceInfo({'address': kwargs}))\n\n    def name_token_set(self, *expected_terms):\n        tokens = self.analyzer.get_word_token_info(expected_terms)\n        for token in tokens:\n            assert token[2] is not None, \"No token for {0}\".format(token)\n\n        return set((t[2] for t in tokens))\n\n    @pytest.mark.parametrize('hnr', ['123 a', '1', '101'])\n    def test_process_place_housenumbers_simple(self, hnr, getorcreate_hnr_id):\n        info = self.process_address(housenumber=hnr)\n\n        assert info['hnr'] == hnr.upper()\n        assert info['hnr_tokens'] == \"{-1}\"\n\n    def test_process_place_housenumbers_duplicates(self, getorcreate_hnr_id):\n        info = self.process_address(housenumber='134',\n                                    conscriptionnumber='134',\n                                    streetnumber='99a')\n\n        assert set(info['hnr'].split(';')) == set(('134', '99 A'))\n        assert info['hnr_tokens'] == \"{-1,-2}\"\n\n    def test_process_place_housenumbers_cached(self, getorcreate_hnr_id):\n        info = self.process_address(housenumber=\"45\")\n        assert info['hnr_tokens'] == \"{-1}\"\n\n        info = self.process_address(housenumber=\"46\")\n        assert info['hnr_tokens'] == \"{-2}\"\n\n        info = self.process_address(housenumber=\"41;45\")\n        assert eval(info['hnr_tokens']) == {-1, -3}\n\n        info = self.process_address(housenumber=\"41\")\n        assert eval(info['hnr_tokens']) == {-3}\n\n\nclass TestUpdateWordTokens:\n\n    @pytest.fixture(autouse=True)\n    def setup(self, tokenizer_factory, table_factory, placex_table, word_table):\n        table_factory('search_name', 'place_id BIGINT, name_vector INT[]')\n        self.tok = tokenizer_factory()\n\n    @pytest.fixture\n    def search_entry(self, temp_db_cursor):\n        place_id = itertools.count(1000)\n\n        def _insert(*args):\n            temp_db_cursor.execute(\"INSERT INTO search_name VALUES (%s, %s)\",\n                                   (next(place_id), list(args)))\n\n        return _insert\n\n    @pytest.fixture(params=['simple', 'analyzed'])\n    def add_housenumber(self, request, word_table):\n        if request.param == 'simple':\n            def _make(hid, hnr):\n                word_table.add_housenumber(hid, hnr)\n        elif request.param == 'analyzed':\n            def _make(hid, hnr):\n                word_table.add_housenumber(hid, [hnr])\n\n        return _make\n\n    @pytest.mark.parametrize('hnr', ('1a', '1234567', '34 5'))\n    def test_remove_unused_housenumbers(self, add_housenumber, word_table, hnr):\n        word_table.add_housenumber(1000, hnr)\n\n        assert word_table.count_housenumbers() == 1\n        self.tok.update_word_tokens()\n        assert word_table.count_housenumbers() == 0\n\n    def test_keep_unused_numeral_housenumbers(self, add_housenumber, word_table):\n        add_housenumber(1000, '5432')\n\n        assert word_table.count_housenumbers() == 1\n        self.tok.update_word_tokens()\n        assert word_table.count_housenumbers() == 1\n\n    def test_keep_housenumbers_from_search_name_table(self, add_housenumber,\n                                                      word_table, search_entry):\n        add_housenumber(9999, '5432a')\n        add_housenumber(9991, '9 a')\n        search_entry(123, 9999, 34)\n\n        assert word_table.count_housenumbers() == 2\n        self.tok.update_word_tokens()\n        assert word_table.count_housenumbers() == 1\n\n    def test_keep_housenumbers_from_placex_table(self, add_housenumber, word_table, placex_row):\n        add_housenumber(9999, '5432a')\n        add_housenumber(9990, '34z')\n        placex_row(housenumber='34z')\n        placex_row(housenumber='25432a')\n\n        assert word_table.count_housenumbers() == 2\n        self.tok.update_word_tokens()\n        assert word_table.count_housenumbers() == 1\n\n    def test_keep_housenumbers_from_placex_table_hnr_list(self, add_housenumber,\n                                                          word_table, placex_row):\n        add_housenumber(9991, '9 b')\n        add_housenumber(9990, '34z')\n        placex_row(housenumber='9 a;9 b;9 c')\n\n        assert word_table.count_housenumbers() == 2\n        self.tok.update_word_tokens()\n        assert word_table.count_housenumbers() == 1\n"
  },
  {
    "path": "test/python/tokenizer/test_icu_rule_loader.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for converting a config file to ICU rules.\n\"\"\"\nfrom textwrap import dedent\n\nimport pytest\nimport yaml\n\nfrom nominatim_db.tokenizer.icu_rule_loader import ICURuleLoader\nfrom nominatim_db.errors import UsageError\n\nfrom icu import Transliterator\n\nCONFIG_SECTIONS = ('normalization', 'transliteration', 'token-analysis')\n\n\nclass TestIcuRuleLoader:\n\n    @pytest.fixture(autouse=True)\n    def init_env(self, project_env):\n        self.project_env = project_env\n\n    def write_config(self, content):\n        (self.project_env.project_dir / 'icu_tokenizer.yaml').write_text(\n            dedent(content), encoding='utf-8')\n\n    def config_rules(self, *variants):\n        content = dedent(\"\"\"\\\n        normalization:\n            - \":: NFD ()\"\n            - \"[[:Nonspacing Mark:] [:Cf:]] >\"\n            - \":: lower ()\"\n            - \"[[:Punctuation:][:Space:]]+ > ' '\"\n            - \":: NFC ()\"\n        transliteration:\n            - \"::  Latin ()\"\n            - \"[[:Punctuation:][:Space:]]+ > ' '\"\n        token-analysis:\n            - analyzer: generic\n              variants:\n                  - words:\n        \"\"\")\n        content += '\\n'.join((\"             - \" + s for s in variants)) + '\\n'\n        self.write_config(content)\n\n    def get_replacements(self, *variants):\n        self.config_rules(*variants)\n        loader = ICURuleLoader(self.project_env)\n        rules = loader.analysis[None].config['replacements']\n\n        return sorted((k, sorted(v)) for k, v in rules)\n\n    def test_empty_rule_set(self):\n        self.write_config(\"\"\"\\\n            normalization:\n            transliteration:\n            token-analysis:\n              - analyzer: generic\n                variants:\n            \"\"\")\n\n        rules = ICURuleLoader(self.project_env)\n        assert rules.get_search_rules() == ''\n        assert rules.get_normalization_rules() == ''\n        assert rules.get_transliteration_rules() == ''\n\n    @pytest.mark.parametrize(\"section\", CONFIG_SECTIONS)\n    def test_missing_section(self, section):\n        rule_cfg = {s: [] for s in CONFIG_SECTIONS if s != section}\n        self.write_config(yaml.dump(rule_cfg))\n\n        with pytest.raises(UsageError):\n            ICURuleLoader(self.project_env)\n\n    def test_get_search_rules(self):\n        self.config_rules()\n        loader = ICURuleLoader(self.project_env)\n\n        rules = loader.get_search_rules()\n        trans = Transliterator.createFromRules(\"test\", rules)\n\n        assert trans.transliterate(\" Baum straße \") == \" baum straße \"\n        assert trans.transliterate(\" Baumstraße \") == \" baumstraße \"\n        assert trans.transliterate(\" Baumstrasse \") == \" baumstrasse \"\n        assert trans.transliterate(\" Baumstr \") == \" baumstr \"\n        assert trans.transliterate(\" Baumwegstr \") == \" baumwegstr \"\n        assert trans.transliterate(\" Αθήνα \") == \" athēna \"\n        assert trans.transliterate(\" проспект \") == \" prospekt \"\n\n    def test_get_normalization_rules(self):\n        self.config_rules()\n        loader = ICURuleLoader(self.project_env)\n        rules = loader.get_normalization_rules()\n        trans = Transliterator.createFromRules(\"test\", rules)\n\n        assert trans.transliterate(\" проспект-Prospekt \") == \" проспект prospekt \"\n\n    def test_get_transliteration_rules(self):\n        self.config_rules()\n        loader = ICURuleLoader(self.project_env)\n        rules = loader.get_transliteration_rules()\n        trans = Transliterator.createFromRules(\"test\", rules)\n\n        assert trans.transliterate(\" проспект-Prospekt \") == \" prospekt Prospekt \"\n\n    def test_transliteration_rules_from_file(self):\n        self.write_config(\"\"\"\\\n            normalization:\n            transliteration:\n                - \"'ax' > 'b'\"\n                - !include transliteration.yaml\n            token-analysis:\n                - analyzer: generic\n                  variants:\n            \"\"\")\n        transpath = self.project_env.project_dir / ('transliteration.yaml')\n        transpath.write_text('- \"x > y\"', encoding='utf-8')\n\n        loader = ICURuleLoader(self.project_env)\n        rules = loader.get_transliteration_rules()\n        trans = Transliterator.createFromRules(\"test\", rules)\n\n        assert trans.transliterate(\" axxt \") == \" byt \"\n\n    def test_search_rules(self):\n        self.config_rules('~street => s,st', 'master => mstr')\n        proc = ICURuleLoader(self.project_env).make_token_analysis()\n\n        assert proc.search.transliterate('Master Street').strip() == 'master street'\n        assert proc.search.transliterate('Earnes St').strip() == 'earnes st'\n        assert proc.search.transliterate('Nostreet').strip() == 'nostreet'\n\n    @pytest.mark.parametrize(\"variant\", ['foo > bar', 'foo -> bar -> bar',\n                                         '~foo~ -> bar', 'fo~ o -> bar'])\n    def test_invalid_variant_description(self, variant):\n        self.config_rules(variant)\n        with pytest.raises(UsageError):\n            ICURuleLoader(self.project_env)\n\n    def test_add_full(self):\n        repl = self.get_replacements(\"foo -> bar\")\n\n        assert repl == [(' foo ', [' bar', ' foo'])]\n\n    def test_replace_full(self):\n        repl = self.get_replacements(\"foo => bar\")\n\n        assert repl == [(' foo ', [' bar'])]\n\n    def test_add_suffix_no_decompose(self):\n        repl = self.get_replacements(\"~berg |-> bg\")\n\n        assert repl == [(' berg ', [' berg', ' bg']),\n                        ('berg ', ['berg', 'bg'])]\n\n    def test_replace_suffix_no_decompose(self):\n        repl = self.get_replacements(\"~berg |=> bg\")\n\n        assert repl == [(' berg ', [' bg']), ('berg ', ['bg'])]\n\n    def test_add_suffix_decompose(self):\n        repl = self.get_replacements(\"~berg -> bg\")\n\n        assert repl == [(' berg ', [' berg', ' bg', 'berg', 'bg']),\n                        ('berg ', [' berg', ' bg', 'berg', 'bg'])]\n\n    def test_replace_suffix_decompose(self):\n        repl = self.get_replacements(\"~berg => bg\")\n\n        assert repl == [(' berg ', [' bg', 'bg']),\n                        ('berg ', [' bg', 'bg'])]\n\n    def test_add_prefix_no_compose(self):\n        repl = self.get_replacements(\"hinter~ |-> hnt\")\n\n        assert repl == [(' hinter', [' hinter', ' hnt']),\n                        (' hinter ', [' hinter', ' hnt'])]\n\n    def test_replace_prefix_no_compose(self):\n        repl = self.get_replacements(\"hinter~ |=> hnt\")\n\n        assert repl == [(' hinter', [' hnt']), (' hinter ', [' hnt'])]\n\n    def test_add_prefix_compose(self):\n        repl = self.get_replacements(\"hinter~-> h\")\n\n        assert repl == [(' hinter', [' h', ' h ', ' hinter', ' hinter ']),\n                        (' hinter ', [' h', ' h', ' hinter', ' hinter'])]\n\n    def test_replace_prefix_compose(self):\n        repl = self.get_replacements(\"hinter~=> h\")\n\n        assert repl == [(' hinter', [' h', ' h ']),\n                        (' hinter ', [' h', ' h'])]\n\n    def test_add_beginning_only(self):\n        repl = self.get_replacements(\"^Premier -> Pr\")\n\n        assert repl == [('^ premier ', ['^ pr', '^ premier'])]\n\n    def test_replace_beginning_only(self):\n        repl = self.get_replacements(\"^Premier => Pr\")\n\n        assert repl == [('^ premier ', ['^ pr'])]\n\n    def test_add_final_only(self):\n        repl = self.get_replacements(\"road$ -> rd\")\n\n        assert repl == [(' road ^', [' rd ^', ' road ^'])]\n\n    def test_replace_final_only(self):\n        repl = self.get_replacements(\"road$ => rd\")\n\n        assert repl == [(' road ^', [' rd ^'])]\n\n    def test_decompose_only(self):\n        repl = self.get_replacements(\"~foo -> foo\")\n\n        assert repl == [(' foo ', [' foo', 'foo']),\n                        ('foo ', [' foo', 'foo'])]\n\n    def test_add_suffix_decompose_end_only(self):\n        repl = self.get_replacements(\"~berg |-> bg\", \"~berg$ -> bg\")\n\n        assert repl == [(' berg ', [' berg', ' bg']),\n                        (' berg ^', [' berg ^', ' bg ^', 'berg ^', 'bg ^']),\n                        ('berg ', ['berg', 'bg']),\n                        ('berg ^', [' berg ^', ' bg ^', 'berg ^', 'bg ^'])]\n\n    def test_replace_suffix_decompose_end_only(self):\n        repl = self.get_replacements(\"~berg |=> bg\", \"~berg$ => bg\")\n\n        assert repl == [(' berg ', [' bg']),\n                        (' berg ^', [' bg ^', 'bg ^']),\n                        ('berg ', ['bg']),\n                        ('berg ^', [' bg ^', 'bg ^'])]\n\n    def test_add_multiple_suffix(self):\n        repl = self.get_replacements(\"~berg,~burg -> bg\")\n\n        assert repl == [(' berg ', [' berg', ' bg', 'berg', 'bg']),\n                        (' burg ', [' bg', ' burg', 'bg', 'burg']),\n                        ('berg ', [' berg', ' bg', 'berg', 'bg']),\n                        ('burg ', [' bg', ' burg', 'bg', 'burg'])]\n"
  },
  {
    "path": "test/python/tokenizer/test_place_sanitizer.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for execution of the sanitztion step.\n\"\"\"\nimport pytest\n\nfrom nominatim_db.errors import UsageError\nimport nominatim_db.tokenizer.place_sanitizer as sanitizer\nfrom nominatim_db.data.place_info import PlaceInfo\n\n\ndef test_placeinfo_clone_new_name():\n    place = sanitizer.PlaceName('foo', 'ki', 'su')\n\n    newplace = place.clone(name='bar')\n\n    assert place.name == 'foo'\n    assert newplace.name == 'bar'\n    assert newplace.kind == 'ki'\n    assert newplace.suffix == 'su'\n\n\ndef test_placeinfo_clone_merge_attr():\n    place = sanitizer.PlaceName('foo', 'ki', 'su')\n    place.set_attr('a1', 'v1')\n    place.set_attr('a2', 'v2')\n\n    newplace = place.clone(attr={'a2': 'new', 'b2': 'foo'})\n\n    assert place.get_attr('a2') == 'v2'\n    assert place.get_attr('b2') is None\n    assert newplace.get_attr('a1') == 'v1'\n    assert newplace.get_attr('a2') == 'new'\n    assert newplace.get_attr('b2') == 'foo'\n\n\ndef test_placeinfo_has_attr():\n    place = sanitizer.PlaceName('foo', 'ki', 'su')\n    place.set_attr('a1', 'v1')\n\n    assert place.has_attr('a1')\n    assert not place.has_attr('whatever')\n\n\ndef test_sanitizer_default(def_config):\n    san = sanitizer.PlaceSanitizer([{'step': 'split-name-list'}], def_config)\n\n    name, address = san.process_names(PlaceInfo({'name': {'name:de:de': '1;2;3'},\n                                                 'address': {'street': 'Bald'}}))\n\n    assert len(name) == 3\n    assert all(isinstance(n, sanitizer.PlaceName) for n in name)\n    assert all(n.kind == 'name' for n in name)\n    assert all(n.suffix == 'de:de' for n in name)\n\n    assert len(address) == 1\n    assert all(isinstance(n, sanitizer.PlaceName) for n in address)\n\n\n@pytest.mark.parametrize('rules', [None, []])\ndef test_sanitizer_empty_list(def_config, rules):\n    san = sanitizer.PlaceSanitizer(rules, def_config)\n\n    name, address = san.process_names(PlaceInfo({'name': {'name:de:de': '1;2;3'}}))\n\n    assert len(name) == 1\n    assert all(isinstance(n, sanitizer.PlaceName) for n in name)\n\n\ndef test_sanitizer_missing_step_definition(def_config):\n    with pytest.raises(UsageError):\n        sanitizer.PlaceSanitizer([{'id': 'split-name-list'}], def_config)\n"
  },
  {
    "path": "test/python/tokenizer/token_analysis/test_analysis_postcodes.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for special postcode analysis and variant generation.\n\"\"\"\nimport pytest\n\nfrom icu import Transliterator\n\nimport nominatim_db.tokenizer.token_analysis.postcodes as module\nfrom nominatim_db.data.place_name import PlaceName\n\nDEFAULT_NORMALIZATION = \"\"\" :: NFD ();\n                            '🜳' > ' ';\n                            [[:Nonspacing Mark:] [:Cf:]] >;\n                            :: lower ();\n                            [[:Punctuation:][:Space:]]+ > ' ';\n                            :: NFC ();\n                        \"\"\"\n\nDEFAULT_TRANSLITERATION = \"\"\" ::  Latin ();\n                              '🜵' > ' ';\n                          \"\"\"\n\n\n@pytest.fixture\ndef analyser():\n    rules = {'analyzer': 'postcodes'}\n    config = module.configure(rules, DEFAULT_NORMALIZATION)\n\n    trans = Transliterator.createFromRules(\"test_trans\", DEFAULT_TRANSLITERATION)\n    norm = Transliterator.createFromRules(\"test_norm\", DEFAULT_NORMALIZATION)\n\n    return module.create(norm, trans, config)\n\n\ndef get_normalized_variants(proc, name):\n    norm = Transliterator.createFromRules(\"test_norm\", DEFAULT_NORMALIZATION)\n    return proc.compute_variants(norm.transliterate(name).strip())\n\n\n@pytest.mark.parametrize('name,norm', [('12', '12'),\n                                       ('A 34 ', 'A 34'),\n                                       ('34-av', '34-AV')])\ndef test_get_canonical_id(analyser, name, norm):\n    assert analyser.get_canonical_id(PlaceName(name=name, kind='', suffix='')) == norm\n\n\n@pytest.mark.parametrize('postcode,variants', [('12345', {'12345'}),\n                                               ('AB-998', {'ab 998', 'ab998'}),\n                                               ('23 FGH D3', {'23 fgh d3', '23fgh d3',\n                                                              '23 fghd3', '23fghd3'})])\ndef test_compute_variants(analyser, postcode, variants):\n    out = analyser.compute_variants(postcode)\n\n    assert len(out) == len(set(out))\n    assert set(out) == variants\n"
  },
  {
    "path": "test/python/tokenizer/token_analysis/test_generic.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for import name normalisation and variant generation.\n\"\"\"\nimport pytest\n\nfrom icu import Transliterator\n\nimport nominatim_db.tokenizer.token_analysis.generic as module\nfrom nominatim_db.errors import UsageError\n\nDEFAULT_NORMALIZATION = \"\"\" :: NFD ();\n                            '🜳' > ' ';\n                            [[:Nonspacing Mark:] [:Cf:]] >;\n                            :: lower ();\n                            [[:Punctuation:][:Space:]]+ > ' ';\n                            :: NFC ();\n                        \"\"\"\n\nDEFAULT_TRANSLITERATION = \"\"\" ::  Latin ();\n                              '🜵' > ' ';\n                          \"\"\"\n\n\ndef make_analyser(*variants, variant_only=False):\n    rules = {'analyzer': 'generic', 'variants': [{'words': variants}]}\n    if variant_only:\n        rules['mode'] = 'variant-only'\n    trans = Transliterator.createFromRules(\"test_trans\", DEFAULT_TRANSLITERATION)\n    norm = Transliterator.createFromRules(\"test_norm\", DEFAULT_NORMALIZATION)\n    config = module.configure(rules, norm, trans)\n\n    return module.create(norm, trans, config)\n\n\ndef get_normalized_variants(proc, name):\n    norm = Transliterator.createFromRules(\"test_norm\", DEFAULT_NORMALIZATION)\n    return proc.compute_variants(norm.transliterate(name).strip())[0]\n\n\ndef test_no_variants():\n    rules = {'analyzer': 'generic'}\n    trans = Transliterator.createFromRules(\"test_trans\", DEFAULT_TRANSLITERATION)\n    norm = Transliterator.createFromRules(\"test_norm\", DEFAULT_NORMALIZATION)\n    config = module.configure(rules, norm, trans)\n\n    proc = module.create(norm, trans, config)\n\n    assert get_normalized_variants(proc, '大德!') == ['dà dé']\n\n\ndef test_variants_empty():\n    proc = make_analyser('saint -> 🜵', 'street -> st')\n\n    assert get_normalized_variants(proc, '🜵') == []\n    assert get_normalized_variants(proc, '🜳') == []\n    assert get_normalized_variants(proc, 'saint') == ['saint']\n\n\nVARIANT_TESTS = [\n    (('~strasse,~straße -> str', '~weg => weg'), \"hallo\", {'hallo'}),\n    (('weg => wg',), \"holzweg\", {'holzweg'}),\n    (('weg -> wg',), \"holzweg\", {'holzweg'}),\n    (('~weg => weg',), \"holzweg\", {'holz weg', 'holzweg'}),\n    (('~weg -> weg',), \"holzweg\",  {'holz weg', 'holzweg'}),\n    (('~weg => w',), \"holzweg\", {'holz w', 'holzw'}),\n    (('~weg -> w',), \"holzweg\",  {'holz weg', 'holzweg', 'holz w', 'holzw'}),\n    (('~weg => weg',), \"Meier Weg\", {'meier weg', 'meierweg'}),\n    (('~weg -> weg',), \"Meier Weg\", {'meier weg', 'meierweg'}),\n    (('~weg => w',), \"Meier Weg\", {'meier w', 'meierw'}),\n    (('~weg -> w',), \"Meier Weg\", {'meier weg', 'meierweg', 'meier w', 'meierw'}),\n    (('weg => wg',), \"Meier Weg\", {'meier wg'}),\n    (('weg -> wg',), \"Meier Weg\", {'meier weg', 'meier wg'}),\n    (('~strasse,~straße -> str', '~weg => weg'), \"Bauwegstraße\",\n     {'bauweg straße', 'bauweg str', 'bauwegstraße', 'bauwegstr'}),\n    (('am => a', 'bach => b'), \"am bach\", {'a b'}),\n    (('am => a', '~bach => b'), \"am bach\", {'a b'}),\n    (('am -> a', '~bach -> b'), \"am bach\", {'am bach', 'a bach', 'am b', 'a b'}),\n    (('am -> a', '~bach -> b'), \"ambach\", {'ambach', 'am bach', 'amb', 'am b'}),\n    (('saint -> s,st', 'street -> st'), \"Saint Johns Street\",\n     {'saint johns street', 's johns street', 'st johns street',\n      'saint johns st', 's johns st', 'st johns st'}),\n    (('river$ -> r',), \"River Bend Road\", {'river bend road'}),\n    (('river$ -> r',), \"Bent River\", {'bent river', 'bent r'}),\n    (('^north => n',), \"North 2nd Street\", {'n 2nd street'}),\n    (('^north => n',), \"Airport North\", {'airport north'}),\n    (('am -> a',), \"am am am am am am am am\", {'am am am am am am am am'}),\n    (('am => a',), \"am am am am am am am am\", {'a a a a a a a a'})\n    ]\n\n\n@pytest.mark.parametrize(\"rules,name,variants\", VARIANT_TESTS)\ndef test_variants(rules, name, variants):\n    proc = make_analyser(*rules)\n\n    result = get_normalized_variants(proc, name)\n\n    assert len(result) == len(set(result))\n    assert set(get_normalized_variants(proc, name)) == variants\n\n\nVARIANT_ONLY_TESTS = [\n    (('weg => wg',), \"hallo\", set()),\n    (('weg => wg',), \"Meier Weg\", {'meier wg'}),\n    (('weg -> wg',), \"Meier Weg\", {'meier wg'}),\n    ]\n\n\n@pytest.mark.parametrize(\"rules,name,variants\", VARIANT_ONLY_TESTS)\ndef test_variants_only(rules, name, variants):\n    proc = make_analyser(*rules, variant_only=True)\n\n    result = get_normalized_variants(proc, name)\n\n    assert len(result) == len(set(result))\n    assert set(get_normalized_variants(proc, name)) == variants\n\n\nclass TestGetReplacements:\n\n    @staticmethod\n    def configure_rules(*variants):\n        rules = {'analyzer': 'generic', 'variants': [{'words': variants}]}\n        trans = Transliterator.createFromRules(\"test_trans\", DEFAULT_TRANSLITERATION)\n        norm = Transliterator.createFromRules(\"test_norm\", DEFAULT_NORMALIZATION)\n        return module.configure(rules, norm, trans)\n\n    def get_replacements(self, *variants):\n        config = self.configure_rules(*variants)\n\n        return sorted((k, sorted(v)) for k, v in config['replacements'])\n\n    @pytest.mark.parametrize(\"variant\", ['foo > bar', 'foo -> bar -> bar',\n                                         '~foo~ -> bar', 'fo~ o -> bar'])\n    def test_invalid_variant_description(self, variant):\n        with pytest.raises(UsageError):\n            self.configure_rules(variant)\n\n    @pytest.mark.parametrize(\"rule\", [\"!!! -> bar\", \"bar => !!!\"])\n    def test_ignore_unnormalizable_terms(self, rule):\n        repl = self.get_replacements(rule)\n\n        assert repl == []\n\n    def test_add_full(self):\n        repl = self.get_replacements(\"foo -> bar\")\n\n        assert repl == [(' foo ', [' bar', ' foo'])]\n\n    def test_replace_full(self):\n        repl = self.get_replacements(\"foo => bar\")\n\n        assert repl == [(' foo ', [' bar'])]\n\n    def test_add_suffix_no_decompose(self):\n        repl = self.get_replacements(\"~berg |-> bg\")\n\n        assert repl == [(' berg ', [' berg', ' bg']),\n                        ('berg ', ['berg', 'bg'])]\n\n    def test_replace_suffix_no_decompose(self):\n        repl = self.get_replacements(\"~berg |=> bg\")\n\n        assert repl == [(' berg ', [' bg']), ('berg ', ['bg'])]\n\n    def test_add_suffix_decompose(self):\n        repl = self.get_replacements(\"~berg -> bg\")\n\n        assert repl == [(' berg ', [' berg', ' bg', 'berg', 'bg']),\n                        ('berg ', [' berg', ' bg', 'berg', 'bg'])]\n\n    def test_replace_suffix_decompose(self):\n        repl = self.get_replacements(\"~berg => bg\")\n\n        assert repl == [(' berg ', [' bg', 'bg']),\n                        ('berg ', [' bg', 'bg'])]\n\n    def test_add_prefix_no_compose(self):\n        repl = self.get_replacements(\"hinter~ |-> hnt\")\n\n        assert repl == [(' hinter', [' hinter', ' hnt']),\n                        (' hinter ', [' hinter', ' hnt'])]\n\n    def test_replace_prefix_no_compose(self):\n        repl = self.get_replacements(\"hinter~ |=> hnt\")\n\n        assert repl == [(' hinter', [' hnt']), (' hinter ', [' hnt'])]\n\n    def test_add_prefix_compose(self):\n        repl = self.get_replacements(\"hinter~-> h\")\n\n        assert repl == [(' hinter', [' h', ' h ', ' hinter', ' hinter ']),\n                        (' hinter ', [' h', ' h', ' hinter', ' hinter'])]\n\n    def test_replace_prefix_compose(self):\n        repl = self.get_replacements(\"hinter~=> h\")\n\n        assert repl == [(' hinter', [' h', ' h ']),\n                        (' hinter ', [' h', ' h'])]\n\n    def test_add_beginning_only(self):\n        repl = self.get_replacements(\"^Premier -> Pr\")\n\n        assert repl == [('^ premier ', ['^ pr', '^ premier'])]\n\n    def test_replace_beginning_only(self):\n        repl = self.get_replacements(\"^Premier => Pr\")\n\n        assert repl == [('^ premier ', ['^ pr'])]\n\n    def test_add_final_only(self):\n        repl = self.get_replacements(\"road$ -> rd\")\n\n        assert repl == [(' road ^', [' rd ^', ' road ^'])]\n\n    def test_replace_final_only(self):\n        repl = self.get_replacements(\"road$ => rd\")\n\n        assert repl == [(' road ^', [' rd ^'])]\n\n    def test_decompose_only(self):\n        repl = self.get_replacements(\"~foo -> foo\")\n\n        assert repl == [(' foo ', [' foo', 'foo']),\n                        ('foo ', [' foo', 'foo'])]\n\n    def test_add_suffix_decompose_end_only(self):\n        repl = self.get_replacements(\"~berg |-> bg\", \"~berg$ -> bg\")\n\n        assert repl == [(' berg ', [' berg', ' bg']),\n                        (' berg ^', [' berg ^', ' bg ^', 'berg ^', 'bg ^']),\n                        ('berg ', ['berg', 'bg']),\n                        ('berg ^', [' berg ^', ' bg ^', 'berg ^', 'bg ^'])]\n\n    def test_replace_suffix_decompose_end_only(self):\n        repl = self.get_replacements(\"~berg |=> bg\", \"~berg$ => bg\")\n\n        assert repl == [(' berg ', [' bg']),\n                        (' berg ^', [' bg ^', 'bg ^']),\n                        ('berg ', ['bg']),\n                        ('berg ^', [' bg ^', 'bg ^'])]\n\n    @pytest.mark.parametrize('rule', [\"~berg,~burg -> bg\",\n                                      \"~berg, ~burg -> bg\",\n                                      \"~berg,,~burg -> bg\"])\n    def test_add_multiple_suffix(self, rule):\n        repl = self.get_replacements(rule)\n\n        assert repl == [(' berg ', [' berg', ' bg', 'berg', 'bg']),\n                        (' burg ', [' bg', ' burg', 'bg', 'burg']),\n                        ('berg ', [' berg', ' bg', 'berg', 'bg']),\n                        ('burg ', [' bg', ' burg', 'bg', 'burg'])]\n"
  },
  {
    "path": "test/python/tokenizer/token_analysis/test_generic_mutation.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for generic token analysis, mutation part.\n\"\"\"\nimport pytest\n\nfrom icu import Transliterator\n\nimport nominatim_db.tokenizer.token_analysis.generic as module\nfrom nominatim_db.errors import UsageError\n\nDEFAULT_NORMALIZATION = \"\"\" '🜳' > ' ';\n                            [[:Nonspacing Mark:] [:Cf:]] >;\n                            :: lower ();\n                            [[:Punctuation:][:Space:]]+ > ' '\n                        \"\"\"\n\nDEFAULT_TRANSLITERATION = \"\"\" ::  Latin ();\n                              '🜵' > ' ';\n                          \"\"\"\n\n\nclass TestMutationNoVariants:\n\n    def make_analyser(self, *mutations):\n        rules = {'analyzer': 'generic',\n                 'mutations': [{'pattern': m[0], 'replacements': m[1]}\n                               for m in mutations]\n                 }\n        trans = Transliterator.createFromRules(\"test_trans\", DEFAULT_TRANSLITERATION)\n        norm = Transliterator.createFromRules(\"test_norm\", DEFAULT_NORMALIZATION)\n        config = module.configure(rules, norm, trans)\n\n        self.analysis = module.create(norm, trans, config)\n\n    def variants(self, name):\n        norm = Transliterator.createFromRules(\"test_norm\", DEFAULT_NORMALIZATION)\n        return set(self.analysis.compute_variants(norm.transliterate(name).strip())[0])\n\n    @pytest.mark.parametrize('pattern', ('(capture)', ['a list']))\n    def test_bad_pattern(self, pattern):\n        with pytest.raises(UsageError):\n            self.make_analyser((pattern, ['b']))\n\n    @pytest.mark.parametrize('replacements', (None, 'a string'))\n    def test_bad_replacement(self, replacements):\n        with pytest.raises(UsageError):\n            self.make_analyser(('a', replacements))\n\n    def test_simple_replacement(self):\n        self.make_analyser(('a', ['b']))\n\n        assert self.variants('none') == {'none'}\n        assert self.variants('abba') == {'bbbb'}\n        assert self.variants('2 aar') == {'2 bbr'}\n\n    def test_multichar_replacement(self):\n        self.make_analyser(('1 1', ['1 1 1']))\n\n        assert self.variants('1 1456') == {'1 1 1456'}\n        assert self.variants('1 1 1') == {'1 1 1 1'}\n\n    def test_removement_replacement(self):\n        self.make_analyser((' ', [' ', '']))\n\n        assert self.variants('A 345') == {'a 345', 'a345'}\n        assert self.variants('a g b') == {'a g b', 'ag b', 'a gb', 'agb'}\n\n    def test_regex_pattern(self):\n        self.make_analyser(('[^a-z]+', ['XXX', ' ']))\n\n        assert self.variants('a-34n12') == {'aXXXnXXX', 'aXXXn', 'a nXXX', 'a n'}\n\n    def test_multiple_mutations(self):\n        self.make_analyser(('ä', ['ä', 'ae']), ('ö', ['ö', 'oe']))\n\n        assert self.variants('Längenöhr') == {'längenöhr', 'laengenöhr',\n                                              'längenoehr', 'laengenoehr'}\n"
  },
  {
    "path": "test/python/tokenizer/token_analysis/test_simple_trie.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for simplified trie structure.\n\"\"\"\n\nfrom nominatim_db.tokenizer.token_analysis.simple_trie import SimpleTrie\n\n\ndef test_single_item_trie():\n    t = SimpleTrie([('foob', 42)])\n\n    assert t.longest_prefix('afoobar') == (None, 0)\n    assert t.longest_prefix('afoobar', start=1) == (42, 5)\n    assert t.longest_prefix('foob') == (42, 4)\n    assert t.longest_prefix('123foofoo', 3) == (None, 3)\n\n\ndef test_complex_item_tree():\n    t = SimpleTrie([('a', 1),\n                    ('b', 2),\n                    ('auto', 3),\n                    ('buto', 4),\n                    ('automat', 5),\n                    ('bu', 6),\n                    ('bx', 7)])\n\n    assert t.longest_prefix('a') == (1, 1)\n    assert t.longest_prefix('au') == (1, 1)\n    assert t.longest_prefix('aut') == (1, 1)\n    assert t.longest_prefix('auto') == (3, 4)\n    assert t.longest_prefix('automat') == (5, 7)\n    assert t.longest_prefix('automatx') == (5, 7)\n    assert t.longest_prefix('butomat') == (4, 4)\n    assert t.longest_prefix('butomat', 1) == (None, 1)\n"
  },
  {
    "path": "test/python/tools/conftest.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\nimport pytest\n\n\n@pytest.fixture\ndef osm2pgsql_options(temp_db, tmp_path):\n    \"\"\" A standard set of options for osm2pgsql\n        together with a osm2pgsql mock that just reflects the command line.\n    \"\"\"\n    osm2pgsql_exec = tmp_path / 'osm2pgsql_mock'\n\n    osm2pgsql_exec.write_text(\"\"\"#!/bin/sh\n\nif [ \"$*\" = \"--version\" ]; then\n  >&2 echo \"2024-08-09 11:16:23  osm2pgsql version 11.7.2 (11.7.2)\"\nelse\n  echo \"$@\"\nfi\n    \"\"\", encoding='utf-8')\n    osm2pgsql_exec.chmod(0o777)\n\n    return dict(osm2pgsql=str(osm2pgsql_exec),\n                osm2pgsql_cache=10,\n                osm2pgsql_style='style.lua',\n                osm2pgsql_style_path=tmp_path,\n                threads=1,\n                dsn='dbname=' + temp_db,\n                flatnode_file='',\n                tablespaces=dict(slim_data='', slim_index='',\n                                 main_data='', main_index=''))\n"
  },
  {
    "path": "test/python/tools/test_add_osm_data.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for functions to add additional data to the database.\n\"\"\"\nfrom pathlib import Path\n\nimport pytest\n\nfrom nominatim_db.tools import add_osm_data\n\n\nclass CaptureGetUrl:\n\n    def __init__(self, monkeypatch):\n        self.url = None\n        monkeypatch.setattr(add_osm_data, 'get_url', self)\n\n    def __call__(self, url):\n        self.url = url\n        return '<xml></xml>'\n\n\n@pytest.fixture(autouse=True)\ndef setup_delete_postprocessing(temp_db_cursor):\n    temp_db_cursor.execute(\"\"\"CREATE OR REPLACE FUNCTION flush_deleted_places()\n                              RETURNS INTEGER AS $$ SELECT 1 $$ LANGUAGE SQL\"\"\")\n\n\ndef test_import_osm_file_simple(dsn, table_factory, osm2pgsql_options, capfd):\n\n    assert add_osm_data.add_data_from_file(dsn, Path('change.osm'), osm2pgsql_options) == 0\n    captured = capfd.readouterr()\n\n    assert '--append' in captured.out\n    assert '--output flex' in captured.out\n    assert f'--style {osm2pgsql_options[\"osm2pgsql_style\"]}' in captured.out\n    assert f'--number-processes {osm2pgsql_options[\"threads\"]}' in captured.out\n    assert f'--cache {osm2pgsql_options[\"osm2pgsql_cache\"]}' in captured.out\n    assert 'change.osm' in captured.out\n\n\n@pytest.mark.parametrize(\"osm_type\", ['node', 'way', 'relation'])\n@pytest.mark.parametrize(\"main_api,url\", [(True, 'https://www.openstreetmap.org/api'),\n                                          (False, 'https://overpass-api.de/api/interpreter?')])\ndef test_import_osm_object_main_api(dsn, osm2pgsql_options, monkeypatch,\n                                    capfd, osm_type, main_api, url):\n    get_url_mock = CaptureGetUrl(monkeypatch)\n\n    add_osm_data.add_osm_object(dsn, osm_type, 4536, main_api, osm2pgsql_options)\n    captured = capfd.readouterr()\n\n    assert get_url_mock.url.startswith(url)\n\n    assert '--append' in captured.out\n    assert '--output flex' in captured.out\n    assert f'--style {osm2pgsql_options[\"osm2pgsql_style\"]}' in captured.out\n    assert f'--number-processes {osm2pgsql_options[\"threads\"]}' in captured.out\n    assert f'--cache {osm2pgsql_options[\"osm2pgsql_cache\"]}' in captured.out\n    assert captured.out.endswith(' -\\n')\n"
  },
  {
    "path": "test/python/tools/test_admin.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for maintenance and analysis functions.\n\"\"\"\nimport pytest\nimport datetime as dt\n\nfrom nominatim_db.errors import UsageError\nfrom nominatim_db.tools import admin\nfrom nominatim_db.tokenizer import factory\n\n\n@pytest.fixture(autouse=True)\ndef create_placex_table(project_env, tokenizer_mock, temp_db_cursor, placex_table):\n    \"\"\" All tests in this module require the placex table to be set up.\n    \"\"\"\n    temp_db_cursor.execute(\"DROP TYPE IF EXISTS prepare_update_info CASCADE\")\n    temp_db_cursor.execute(\"\"\"CREATE TYPE prepare_update_info AS (\n                             name HSTORE,\n                             address HSTORE,\n                             rank_address SMALLINT,\n                             country_code TEXT,\n                             class TEXT,\n                             type TEXT,\n                             linked_place_id BIGINT\n                           )\"\"\")\n    temp_db_cursor.execute(\"\"\"CREATE OR REPLACE FUNCTION placex_indexing_prepare(p placex,\n                                                     OUT result prepare_update_info)\n                           AS $$\n                           BEGIN\n                             result.address := p.address;\n                             result.name := p.name;\n                             result.class := p.class;\n                             result.type := p.type;\n                             result.country_code := p.country_code;\n                             result.rank_address := p.rank_address;\n                           END;\n                           $$ LANGUAGE plpgsql STABLE;\n                        \"\"\")\n    factory.create_tokenizer(project_env)\n\n\ndef test_analyse_indexing_no_objects(project_env):\n    with pytest.raises(UsageError):\n        admin.analyse_indexing(project_env)\n\n\n@pytest.mark.parametrize(\"oid\", ['1234', 'N123a', 'X123'])\ndef test_analyse_indexing_bad_osmid(project_env, oid):\n    with pytest.raises(UsageError):\n        admin.analyse_indexing(project_env, osm_id=oid)\n\n\ndef test_analyse_indexing_unknown_osmid(project_env):\n    with pytest.raises(UsageError):\n        admin.analyse_indexing(project_env, osm_id='W12345674')\n\n\ndef test_analyse_indexing_with_place_id(project_env, placex_row):\n    place_id = placex_row()\n\n    admin.analyse_indexing(project_env, place_id=place_id)\n\n\ndef test_analyse_indexing_with_osm_id(project_env, placex_row):\n    placex_row(osm_type='N', osm_id=10000)\n\n    admin.analyse_indexing(project_env, osm_id='N10000')\n\n\nclass TestAdminCleanDeleted:\n\n    @pytest.fixture(autouse=True)\n    def setup_polygon_delete(self, project_env, table_factory, place_interpolation_table,\n                             placex_row, osmline_table, temp_db_cursor, load_sql):\n        \"\"\" Set up place_force_delete function and related tables\n        \"\"\"\n        self.project_env = project_env\n        self.temp_db_cursor = temp_db_cursor\n        table_factory('import_polygon_delete',\n                      \"\"\"osm_id BIGINT,\n                      osm_type CHAR(1),\n                      class TEXT NOT NULL,\n                      type TEXT NOT NULL\"\"\",\n                      ((100, 'N', 'boundary', 'administrative'),\n                       (145, 'N', 'boundary', 'administrative'),\n                       (175, 'R', 'landcover', 'grass')))\n\n        now = dt.datetime.now()\n        placex_row(osm_type='N', osm_id=100, cls='boundary', typ='administrative',\n                   indexed_status=1, indexed_date=now - dt.timedelta(days=30))\n        placex_row(osm_type='N', osm_id=145, cls='boundary', typ='administrative',\n                   indexed_status=1, indexed_date=now - dt.timedelta(days=90))\n        placex_row(osm_type='R', osm_id=175, cls='landcover', typ='grass',\n                   indexed_status=1, indexed_date=now - dt.timedelta(days=90))\n\n        # set up tables and triggers for utils function\n        table_factory('place_to_be_deleted',\n                      \"\"\"osm_id BIGINT,\n                      osm_type CHAR(1),\n                      class TEXT NOT NULL,\n                      type TEXT NOT NULL,\n                      deferred BOOLEAN\"\"\")\n        table_factory('place_interpolation_to_be_deleted',\n                      \"\"\"osm_id BIGINT,\n                      osm_type CHAR(1)\"\"\")\n        table_factory('import_polygon_error', \"\"\"osm_id BIGINT,\n                      osm_type CHAR(1),\n                      class TEXT NOT NULL,\n                      type TEXT NOT NULL\"\"\")\n        temp_db_cursor.execute(\"\"\"\n            CREATE OR REPLACE FUNCTION place_delete() RETURNS TRIGGER AS $$\n                BEGIN RETURN NULL; END;\n            $$ LANGUAGE plpgsql;\n\n            CREATE TRIGGER place_before_delete BEFORE DELETE ON place\n            FOR EACH ROW EXECUTE PROCEDURE place_delete();\n\n            CREATE TRIGGER place_interpolation_before_delete BEFORE DELETE ON place_interpolation\n            FOR EACH ROW EXECUTE PROCEDURE place_delete();\n        \"\"\")\n        load_sql('functions/utils.sql')\n\n    def test_admin_clean_deleted_no_records(self):\n        admin.clean_deleted_relations(self.project_env, age='1 year')\n\n        rowset = self.temp_db_cursor.row_set(\n            'SELECT osm_id, osm_type, class, type, indexed_status FROM placex')\n\n        assert rowset == {(100, 'N', 'boundary', 'administrative', 1),\n                          (145, 'N', 'boundary', 'administrative', 1),\n                          (175, 'R', 'landcover', 'grass', 1)}\n        assert self.temp_db_cursor.table_rows('import_polygon_delete') == 3\n\n    @pytest.mark.parametrize('test_age', ['T week', '1 welk', 'P1E'])\n    def test_admin_clean_deleted_bad_age(self, test_age):\n        with pytest.raises(UsageError):\n            admin.clean_deleted_relations(self.project_env, age=test_age)\n\n    def test_admin_clean_deleted_partial(self):\n        admin.clean_deleted_relations(self.project_env, age='2 months')\n\n        rowset = self.temp_db_cursor.row_set(\n            'SELECT osm_id, osm_type, class, type, indexed_status FROM placex')\n\n        assert rowset == {(100, 'N', 'boundary', 'administrative', 1),\n                          (145, 'N', 'boundary', 'administrative', 100),\n                          (175, 'R', 'landcover', 'grass', 100)}\n        assert self.temp_db_cursor.table_rows('import_polygon_delete') == 1\n\n    @pytest.mark.parametrize('test_age', ['1 week', 'P3D', '5 hours'])\n    def test_admin_clean_deleted(self, test_age):\n        admin.clean_deleted_relations(self.project_env, age=test_age)\n\n        rowset = self.temp_db_cursor.row_set(\n            'SELECT osm_id, osm_type, class, type, indexed_status FROM placex')\n\n        assert rowset == {(100, 'N', 'boundary', 'administrative', 100),\n                          (145, 'N', 'boundary', 'administrative', 100),\n                          (175, 'R', 'landcover', 'grass', 100)}\n        assert self.temp_db_cursor.table_rows('import_polygon_delete') == 0\n"
  },
  {
    "path": "test/python/tools/test_check_database.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for database integrity checks.\n\"\"\"\nimport pytest\n\nfrom nominatim_db.tools import check_database as chkdb\nimport nominatim_db.version\n\n\ndef test_check_database_unknown_db(def_config, monkeypatch):\n    monkeypatch.setenv('NOMINATIM_DATABASE_DSN', 'pgsql:dbname=fjgkhughwgh2423gsags')\n    assert chkdb.check_database(def_config) == 1\n\n\ndef test_check_database_fatal_test(def_config, temp_db):\n    assert chkdb.check_database(def_config) == 1\n\n\ndef test_check_connection_good(temp_db_conn, def_config):\n    assert chkdb.check_connection(temp_db_conn, def_config) == chkdb.CheckState.OK\n\n\ndef test_check_connection_bad(def_config):\n    badconn = chkdb._BadConnection('Error')\n    assert chkdb.check_connection(badconn, def_config) == chkdb.CheckState.FATAL\n\n\ndef test_check_database_version_not_found(property_table, temp_db_conn, def_config):\n    assert chkdb.check_database_version(temp_db_conn, def_config) == chkdb.CheckState.FATAL\n\n\ndef test_check_database_version_good(property_table, temp_db_conn, def_config):\n    property_table.set('database_version',\n                       str(nominatim_db.version.NOMINATIM_VERSION))\n    assert chkdb.check_database_version(temp_db_conn, def_config) == chkdb.CheckState.OK\n\n\ndef test_check_database_version_bad(property_table, temp_db_conn, def_config):\n    property_table.set('database_version', '3.9.9-9')\n    assert chkdb.check_database_version(temp_db_conn, def_config) == chkdb.CheckState.FATAL\n\n\ndef test_check_placex_table_good(placex_table, temp_db_conn, def_config):\n    assert chkdb.check_placex_table(temp_db_conn, def_config) == chkdb.CheckState.OK\n\n\ndef test_check_placex_table_bad(temp_db_conn, def_config):\n    assert chkdb.check_placex_table(temp_db_conn, def_config) == chkdb.CheckState.FATAL\n\n\ndef test_check_placex_table_size_good(placex_row, temp_db_conn, def_config):\n    for _ in range(2):\n        placex_row()\n    assert chkdb.check_placex_size(temp_db_conn, def_config) == chkdb.CheckState.OK\n\n\ndef test_check_placex_table_size_bad(placex_table, temp_db_conn, def_config):\n    assert chkdb.check_placex_size(temp_db_conn, def_config) == chkdb.CheckState.FATAL\n\n\ndef test_check_tokenizer_missing(temp_db_conn, def_config, tmp_path):\n    def_config.project_dir = tmp_path\n    assert chkdb.check_tokenizer(temp_db_conn, def_config) == chkdb.CheckState.FAIL\n\n\n@pytest.mark.parametrize(\"check_result,state\", [(None, chkdb.CheckState.OK),\n                                                (\"Something wrong\", chkdb.CheckState.FAIL)])\ndef test_check_tokenizer(temp_db_conn, def_config, monkeypatch,\n                         check_result, state):\n    class _TestTokenizer:\n        @staticmethod\n        def check_database(_):\n            return check_result\n\n    monkeypatch.setattr(chkdb.tokenizer_factory, 'get_tokenizer_for_db',\n                        lambda *a, **k: _TestTokenizer())\n    assert chkdb.check_tokenizer(temp_db_conn, def_config) == state\n\n\ndef test_check_indexing_good(placex_row, temp_db_conn, def_config):\n    for _ in range(2):\n        placex_row(indexed_status=0)\n    assert chkdb.check_indexing(temp_db_conn, def_config) == chkdb.CheckState.OK\n\n\ndef test_check_indexing_bad(placex_row, temp_db_conn, def_config):\n    for status in (0, 2):\n        placex_row(indexed_status=status)\n    assert chkdb.check_indexing(temp_db_conn, def_config) == chkdb.CheckState.FAIL\n\n\ndef test_check_indexing_bad_frozen(placex_row, temp_db_conn, def_config):\n    for status in (0, 2):\n        placex_row(indexed_status=status)\n    temp_db_conn.execute('DROP TABLE place')\n    assert chkdb.check_indexing(temp_db_conn, def_config) == chkdb.CheckState.WARN\n\n\ndef test_check_database_indexes_bad(temp_db_conn, def_config):\n    assert chkdb.check_database_indexes(temp_db_conn, def_config) == chkdb.CheckState.FAIL\n\n\ndef test_check_database_indexes_valid(temp_db_conn, def_config):\n    assert chkdb.check_database_index_valid(temp_db_conn, def_config) == chkdb.CheckState.OK\n\n\ndef test_check_tiger_table_disabled(temp_db_conn, def_config, monkeypatch):\n    monkeypatch.setenv('NOMINATIM_USE_US_TIGER_DATA', 'no')\n    assert chkdb.check_tiger_table(temp_db_conn, def_config) == chkdb.CheckState.NOT_APPLICABLE\n\n\ndef test_check_tiger_table_enabled(temp_db_cursor, temp_db_conn, def_config, monkeypatch):\n    monkeypatch.setenv('NOMINATIM_USE_US_TIGER_DATA', 'yes')\n    assert chkdb.check_tiger_table(temp_db_conn, def_config) == chkdb.CheckState.FAIL\n\n    temp_db_cursor.execute('CREATE TABLE location_property_tiger (place_id int)')\n    assert chkdb.check_tiger_table(temp_db_conn, def_config) == chkdb.CheckState.FAIL\n\n    temp_db_cursor.execute('INSERT INTO location_property_tiger VALUES (1), (2)')\n    assert chkdb.check_tiger_table(temp_db_conn, def_config) == chkdb.CheckState.OK\n"
  },
  {
    "path": "test/python/tools/test_database_import.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for functions to import a new database.\n\"\"\"\nfrom pathlib import Path\n\nimport pytest\nimport pytest_asyncio  # noqa\nimport psycopg\nfrom psycopg import sql as pysql\n\nfrom nominatim_db.tools import database_import\nfrom nominatim_db.errors import UsageError\n\n\nclass TestDatabaseSetup:\n    DBNAME = 'test_nominatim_python_unittest'\n\n    @pytest.fixture(autouse=True)\n    def setup_nonexistant_db(self):\n        with psycopg.connect(dbname='postgres', autocommit=True) as conn:\n            with conn.cursor() as cur:\n                cur.execute(pysql.SQL('DROP DATABASE IF EXISTS ')\n                            + pysql.Identifier(self.DBNAME))\n\n            yield True\n\n            with conn.cursor() as cur:\n                cur.execute(pysql.SQL('DROP DATABASE IF EXISTS ')\n                            + pysql.Identifier(self.DBNAME))\n\n    @pytest.fixture\n    def cursor(self):\n        with psycopg.connect(dbname=self.DBNAME) as conn:\n            with conn.cursor() as cur:\n                yield cur\n\n    def conn(self):\n        return psycopg.connect(dbname=self.DBNAME)\n\n    def test_setup_skeleton(self):\n        database_import.setup_database_skeleton(f'dbname={self.DBNAME}')\n\n        # Check that all extensions are set up.\n        with self.conn() as conn:\n            with conn.cursor() as cur:\n                cur.execute('CREATE TABLE t (h HSTORE, geom GEOMETRY(Geometry, 4326))')\n\n    def test_unsupported_pg_version(self, monkeypatch):\n        monkeypatch.setattr(database_import, 'POSTGRESQL_REQUIRED_VERSION', (100, 4))\n\n        with pytest.raises(UsageError, match='PostgreSQL server is too old.'):\n            database_import.setup_database_skeleton(f'dbname={self.DBNAME}')\n\n    def test_create_db_explicit_ro_user(self):\n        database_import.setup_database_skeleton(f'dbname={self.DBNAME}',\n                                                rouser='postgres')\n\n    def test_create_db_missing_ro_user(self):\n        with pytest.raises(UsageError, match='Missing read-only user.'):\n            database_import.setup_database_skeleton(f'dbname={self.DBNAME}',\n                                                    rouser='sdfwkjkjgdugu2jgsafkljas')\n\n    def test_setup_extensions_old_postgis(self, monkeypatch):\n        monkeypatch.setattr(database_import, 'POSTGIS_REQUIRED_VERSION', (50, 50))\n\n        with pytest.raises(UsageError, match='PostGIS is too old.'):\n            database_import.setup_database_skeleton(f'dbname={self.DBNAME}')\n\n\ndef test_setup_skeleton_already_exists(temp_db):\n    with pytest.raises(UsageError):\n        database_import.setup_database_skeleton(f'dbname={temp_db}')\n\n\ndef test_import_osm_data_simple(place_row, osm2pgsql_options, capfd):\n    place_row()\n\n    database_import.import_osm_data(Path('file.pbf'), osm2pgsql_options)\n    captured = capfd.readouterr()\n\n    assert '--create' in captured.out\n    assert '--output flex' in captured.out\n    assert f'--style {osm2pgsql_options[\"osm2pgsql_style\"]}' in captured.out\n    assert f'--number-processes {osm2pgsql_options[\"threads\"]}' in captured.out\n    assert f'--cache {osm2pgsql_options[\"osm2pgsql_cache\"]}' in captured.out\n    assert 'file.pbf' in captured.out\n\n\ndef test_import_osm_data_multifile(place_row, tmp_path, osm2pgsql_options, capfd):\n    place_row()\n    osm2pgsql_options['osm2pgsql_cache'] = 0\n\n    files = [tmp_path / 'file1.osm', tmp_path / 'file2.osm']\n    for f in files:\n        f.write_text('test', encoding='utf-8')\n\n    database_import.import_osm_data(files, osm2pgsql_options)\n    captured = capfd.readouterr()\n\n    assert 'file1.osm' in captured.out\n    assert 'file2.osm' in captured.out\n\n\ndef test_import_osm_data_simple_no_data(place_row, osm2pgsql_options):\n    with pytest.raises(UsageError, match='No data imported'):\n        database_import.import_osm_data(Path('file.pbf'), osm2pgsql_options)\n\n\ndef test_import_osm_data_simple_ignore_no_data(place_table, osm2pgsql_options):\n    database_import.import_osm_data(Path('file.pbf'), osm2pgsql_options,\n                                    ignore_errors=True)\n\n\ndef test_import_osm_data_drop(place_row, table_factory, temp_db_cursor,\n                              tmp_path, osm2pgsql_options):\n    place_row()\n    table_factory('planet_osm_nodes')\n\n    flatfile = tmp_path / 'flatfile'\n    flatfile.write_text('touch', encoding='utf-8')\n\n    osm2pgsql_options['flatnode_file'] = str(flatfile.resolve())\n\n    database_import.import_osm_data(Path('file.pbf'), osm2pgsql_options, drop=True)\n\n    assert not flatfile.exists()\n    assert not temp_db_cursor.table_exists('planet_osm_nodes')\n\n\ndef test_import_osm_data_default_cache(place_row, osm2pgsql_options, capfd):\n    place_row()\n\n    osm2pgsql_options['osm2pgsql_cache'] = 0\n\n    database_import.import_osm_data(Path(__file__), osm2pgsql_options)\n    captured = capfd.readouterr()\n\n    assert f'--cache {osm2pgsql_options[\"osm2pgsql_cache\"]}' in captured.out\n\n\n@pytest.mark.parametrize(\"with_search\", (True, False))\ndef test_truncate_database_tables(temp_db_conn, temp_db_cursor, table_factory, with_search):\n    tables = ['placex', 'place_addressline', 'location_area',\n              'location_area_country',\n              'location_property_tiger', 'location_property_osmline',\n              'location_postcodes', 'location_road_23']\n    if with_search:\n        tables.append('search_name')\n\n    for table in tables:\n        table_factory(table, content=((1, ), (2, ), (3, )))\n        assert temp_db_cursor.table_rows(table) == 3\n\n    database_import.truncate_data_tables(temp_db_conn)\n\n    for table in tables:\n        assert temp_db_cursor.table_rows(table) == 0\n\n\n@pytest.mark.parametrize(\"threads\", (1, 5))\n@pytest.mark.asyncio\nasync def test_load_data(dsn, place_row, place_interpolation_row, placex_table, osmline_table,\n                         temp_db_cursor, threads):\n    for oid in range(100, 130):\n        place_row(osm_id=oid)\n    place_interpolation_row(osm_id=342, typ='odd', geom='LINESTRING(0 0, 10 10)')\n\n    temp_db_cursor.execute(\"\"\"\n        CREATE OR REPLACE FUNCTION placex_insert() RETURNS TRIGGER AS $$\n        BEGIN\n          NEW.place_id := nextval('seq_place');\n          NEW.indexed_status := 1;\n          NEW.importance := 0.00001;\n          NEW.centroid := ST_Centroid(NEW.geometry);\n          NEW.partition := 0;\n          NEW.geometry_sector := 2424;\n          NEW.rank_address := 30;\n          NEW.rank_search := 30;\n        RETURN NEW;\n        END; $$ LANGUAGE plpgsql STABLE PARALLEL SAFE;\n\n        CREATE OR REPLACE FUNCTION osmline_insert() RETURNS TRIGGER AS $$\n        BEGIN\n          NEW.place_id := nextval('seq_place');\n          IF NEW.indexed_status IS NULL THEN\n            NEW.indexed_status := 1;\n            NEW.partition := 0;\n            NEW.geometry_sector := 2424;\n          END IF;\n        RETURN NEW;\n        END; $$ LANGUAGE plpgsql STABLE PARALLEL SAFE;\n\n        CREATE TRIGGER placex_before_insert BEFORE INSERT ON placex\n        FOR EACH ROW EXECUTE PROCEDURE placex_insert();\n\n        CREATE TRIGGER osmline_before_insert BEFORE INSERT ON location_property_osmline\n        FOR EACH ROW EXECUTE PROCEDURE osmline_insert();\n    \"\"\")\n\n    await database_import.load_data(dsn, threads)\n\n    assert temp_db_cursor.table_rows('placex') == 30\n    assert temp_db_cursor.table_rows('location_property_osmline') == 1\n\n\nclass TestSetupSQL:\n\n    @pytest.fixture(autouse=True)\n    def osm2ppsql_skel(self, def_config, temp_db_with_extensions, place_row,\n                       country_table, table_factory, temp_db_conn):\n        self.config = def_config\n        place_row()\n        table_factory('osm2pgsql_properties', 'property TEXT, value TEXT',\n                      (('db_format', 2),))\n\n        table_factory('planet_osm_rels', 'id BIGINT, members JSONB, tags JSONB')\n        table_factory('place_associated_street',\n                      'relation_id BIGINT, member_type TEXT, member_id BIGINT, member_role TEXT')\n        temp_db_conn.execute(\"\"\"\n            CREATE OR REPLACE FUNCTION planet_osm_member_ids(jsonb, character)\n              RETURNS bigint[] AS $$\n                SELECT array_agg((el->>'ref')::int8)\n                FROM jsonb_array_elements($1) AS el WHERE el->>'type' = $2\n              $$ LANGUAGE sql IMMUTABLE;\n            \"\"\")\n\n    @pytest.mark.parametrize(\"reverse\", [True, False])\n    def test_create_tables(self, table_factory, temp_db_conn, temp_db_cursor, reverse):\n        table_factory('country_osm_grid')\n\n        database_import.create_tables(temp_db_conn, self.config, reverse)\n\n        assert temp_db_cursor.table_exists('placex')\n        assert not reverse == temp_db_cursor.table_exists('search_name')\n\n    def test_create_table_triggers(self, temp_db_conn, placex_table, osmline_table,\n                                   place_interpolation_table, postcode_table, load_sql):\n        load_sql('functions.sql')\n\n        database_import.create_table_triggers(temp_db_conn, self.config)\n\n    def test_create_partition_tables(self, country_row, temp_db_conn, temp_db_cursor, load_sql):\n        for i in range(3):\n            country_row(partition=i)\n        load_sql('tables/location_area.sql')\n\n        database_import.create_partition_tables(temp_db_conn, self.config)\n\n        for i in range(3):\n            assert temp_db_cursor.table_exists(f\"location_area_large_{i}\")\n            assert temp_db_cursor.table_exists(f\"search_name_{i}\")\n\n    @pytest.mark.parametrize(\"drop\", [True, False])\n    @pytest.mark.asyncio\n    async def test_create_search_indices(self, temp_db_conn, temp_db_cursor, drop, load_sql):\n        load_sql('tables.sql', 'functions/ranking.sql')\n        await database_import.create_search_indices(temp_db_conn, self.config, drop)\n\n        assert temp_db_cursor.index_exists('placex', 'idx_placex_geometry')\n        assert not drop == temp_db_cursor.index_exists('placex', 'idx_placex_geometry_buildings')\n"
  },
  {
    "path": "test/python/tools/test_exec_utils.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for tools.exec_utils module.\n\"\"\"\nimport nominatim_db.tools.exec_utils as exec_utils\n\n\ndef test_run_osm2pgsql(osm2pgsql_options):\n    osm2pgsql_options['append'] = False\n    osm2pgsql_options['import_file'] = 'foo.bar'\n    osm2pgsql_options['tablespaces']['slim_data'] = 'extra'\n    exec_utils.run_osm2pgsql(osm2pgsql_options)\n\n\ndef test_run_osm2pgsql_disable_jit(osm2pgsql_options):\n    osm2pgsql_options['append'] = True\n    osm2pgsql_options['import_file'] = 'foo.bar'\n    osm2pgsql_options['disable_jit'] = True\n    exec_utils.run_osm2pgsql(osm2pgsql_options)\n"
  },
  {
    "path": "test/python/tools/test_freeze.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for freeze functions (removing unused database parts).\n\"\"\"\nfrom nominatim_db.tools import freeze\n\nNOMINATIM_RUNTIME_TABLES = [\n    'country_name', 'country_osm_grid',\n    'location_postcodes', 'location_property_osmline', 'location_property_tiger',\n    'placex', 'place_addressline',\n    'search_name',\n    'word'\n]\n\nNOMINATIM_DROP_TABLES = [\n    'address_levels',\n    'location_area', 'location_area_country', 'location_area_large_100',\n    'location_road_1',\n    'place', 'place_associated_street',\n    'planet_osm_nodes', 'planet_osm_rels', 'planet_osm_ways',\n    'search_name_111',\n    'wikipedia_article', 'wikipedia_redirect'\n]\n\n\ndef test_drop_tables(temp_db_conn, temp_db_cursor, table_factory):\n    for table in NOMINATIM_RUNTIME_TABLES + NOMINATIM_DROP_TABLES:\n        table_factory(table)\n\n    assert not freeze.is_frozen(temp_db_conn)\n\n    freeze.drop_update_tables(temp_db_conn)\n\n    for table in NOMINATIM_RUNTIME_TABLES:\n        assert temp_db_cursor.table_exists(table)\n\n    for table in NOMINATIM_DROP_TABLES:\n        assert not temp_db_cursor.table_exists(table)\n\n    assert freeze.is_frozen(temp_db_conn)\n\n\ndef test_drop_flatnode_file_no_file():\n    freeze.drop_flatnode_file(None)\n\n\ndef test_drop_flatnode_file_file_already_gone(tmp_path):\n    freeze.drop_flatnode_file(tmp_path / 'something.store')\n\n\ndef test_drop_flatnode_file_delete(tmp_path):\n    flatfile = tmp_path / 'flatnode.store'\n    flatfile.write_text('Some content', encoding=\"utf-8\")\n\n    freeze.drop_flatnode_file(flatfile)\n\n    assert not flatfile.exists()\n"
  },
  {
    "path": "test/python/tools/test_import_special_phrases.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\n    Tests for import special phrases methods\n    of the class SPImporter.\n\"\"\"\nimport pytest\nfrom nominatim_db.tools.special_phrases.sp_importer import SPImporter\nfrom nominatim_db.tools.special_phrases.sp_wiki_loader import SPWikiLoader\nfrom nominatim_db.tools.special_phrases.special_phrase import SpecialPhrase\n\n\n@pytest.fixture\ndef sp_importer(temp_db_conn, def_config, monkeypatch):\n    \"\"\"\n        Return an instance of SPImporter.\n    \"\"\"\n    monkeypatch.setenv('NOMINATIM_LANGUAGES', 'en')\n    loader = SPWikiLoader(def_config)\n    return SPImporter(def_config, temp_db_conn, loader)\n\n\n@pytest.fixture\ndef xml_wiki_content(src_dir):\n    \"\"\"\n        return the content of the static xml test file.\n    \"\"\"\n    xml_test_content = src_dir / 'test' / 'testdata' / 'special_phrases_test_content.txt'\n    return xml_test_content.read_text(encoding='utf-8')\n\n\n@pytest.fixture\ndef default_phrases(table_factory):\n    table_factory('place_classtype_testclasstypetable_to_delete')\n    table_factory('place_classtype_testclasstypetable_to_keep')\n\n\ndef test_fetch_existing_place_classtype_tables(sp_importer, table_factory):\n    \"\"\"\n        Check for the fetch_existing_place_classtype_tables() method.\n        It should return the table just created.\n    \"\"\"\n    table_factory('place_classtype_testclasstypetable')\n\n    sp_importer._fetch_existing_place_classtype_tables()\n    contained_table = sp_importer.table_phrases_to_delete.pop()\n    assert contained_table == 'place_classtype_testclasstypetable'\n\n\ndef test_check_sanity_class(sp_importer):\n    \"\"\"\n        Check for _check_sanity() method.\n        If a wrong class or type is given, an UsageError should raise.\n        If a good class and type are given, nothing special happens.\n    \"\"\"\n\n    assert not sp_importer._check_sanity(SpecialPhrase('en', '', 'type', ''))\n    assert not sp_importer._check_sanity(SpecialPhrase('en', 'class', '', ''))\n\n    assert sp_importer._check_sanity(SpecialPhrase('en', 'class', 'type', ''))\n\n\ndef test_load_white_and_black_lists(sp_importer):\n    \"\"\"\n        Test that _load_white_and_black_lists() well return\n        black list and white list and that they are of dict type.\n    \"\"\"\n    black_list, white_list = sp_importer._load_white_and_black_lists()\n\n    assert isinstance(black_list, dict) and isinstance(white_list, dict)\n\n\ndef test_create_place_classtype_indexes(temp_db_with_extensions,\n                                        temp_db_conn, temp_db_cursor,\n                                        table_factory, sp_importer):\n    \"\"\"\n        Test that _create_place_classtype_indexes() create the\n        place_id index and centroid index on the right place_class_type table.\n    \"\"\"\n    phrase_class = 'class'\n    phrase_type = 'type'\n    table_name = 'place_classtype_{}_{}'.format(phrase_class, phrase_type)\n\n    table_factory(table_name, 'place_id BIGINT, centroid GEOMETRY')\n\n    sp_importer._create_place_classtype_indexes('', phrase_class, phrase_type)\n    temp_db_conn.commit()\n\n    assert check_placeid_and_centroid_indexes(temp_db_cursor, phrase_class, phrase_type)\n\n\ndef test_create_place_classtype_table(temp_db_conn, temp_db_cursor, placex_table, sp_importer):\n    \"\"\"\n        Test that _create_place_classtype_table() create\n        the right place_classtype table.\n    \"\"\"\n    phrase_class = 'class'\n    phrase_type = 'type'\n    sp_importer._create_place_classtype_table('', phrase_class, phrase_type)\n    temp_db_conn.commit()\n\n    assert check_table_exist(temp_db_cursor, phrase_class, phrase_type)\n\n\ndef test_grant_access_to_web_user(temp_db_conn, temp_db_cursor, table_factory,\n                                  def_config, sp_importer):\n    \"\"\"\n        Test that _grant_access_to_webuser() give\n        right access to the web user.\n    \"\"\"\n    phrase_class = 'class'\n    phrase_type = 'type'\n    table_name = 'place_classtype_{}_{}'.format(phrase_class, phrase_type)\n\n    table_factory(table_name)\n\n    sp_importer._grant_access_to_webuser(phrase_class, phrase_type)\n    temp_db_conn.commit()\n\n    assert check_grant_access(temp_db_cursor, def_config.DATABASE_WEBUSER,\n                              phrase_class, phrase_type)\n\n\ndef test_create_place_classtype_table_and_indexes(temp_db_cursor, def_config, placex_row,\n                                                  sp_importer, temp_db_conn, monkeypatch):\n    \"\"\"\n        Test that _create_place_classtype_table_and_indexes()\n        create the right place_classtype tables and place_id indexes\n        and centroid indexes and grant access to the web user\n        for the given set of pairs.\n    \"\"\"\n    pairs = set([('class1', 'type1'), ('class2', 'type2')])\n    for pair in pairs:\n        placex_row(cls=pair[0], typ=pair[1])   # adding to db\n    sp_importer._create_classtype_table_and_indexes(pairs)\n    temp_db_conn.commit()\n\n    for pair in pairs:\n        assert check_table_exist(temp_db_cursor, pair[0], pair[1])\n        assert check_placeid_and_centroid_indexes(temp_db_cursor, pair[0], pair[1])\n        assert check_grant_access(temp_db_cursor, def_config.DATABASE_WEBUSER, pair[0], pair[1])\n\n\ndef test_remove_non_existent_tables_from_db(sp_importer, default_phrases,\n                                            temp_db_conn, temp_db_cursor):\n    \"\"\"\n        Check for the remove_non_existent_phrases_from_db() method.\n\n        It should removed entries from the word table which are contained\n        in the words_phrases_to_delete set and not those also contained\n        in the words_phrases_still_exist set.\n\n        place_classtype tables contained in table_phrases_to_delete should\n        be deleted.\n    \"\"\"\n    sp_importer.table_phrases_to_delete = {\n        'place_classtype_testclasstypetable_to_delete'\n    }\n\n    query_tables = \"\"\"\n        SELECT table_name\n        FROM information_schema.tables\n        WHERE table_schema='public'\n        AND table_name like 'place_classtype_%';\n    \"\"\"\n\n    sp_importer._remove_non_existent_tables_from_db()\n    temp_db_conn.commit()\n\n    assert temp_db_cursor.row_set(query_tables) \\\n        == {('place_classtype_testclasstypetable_to_keep', )}\n\n\n@pytest.mark.parametrize(\"should_replace\", [(True), (False)])\ndef test_import_phrases(monkeypatch, temp_db_cursor, def_config, sp_importer,\n                        placex_row, table_factory, tokenizer_mock,\n                        xml_wiki_content, should_replace):\n    \"\"\"\n        Check that the main import_phrases() method is well executed.\n        It should create the place_classtype table, the place_id and centroid indexes,\n        grand access to the web user and executing the SQL functions for amenities.\n        It should also update the database well by deleting or preserving existing entries\n        of the database.\n    \"\"\"\n    # Add some data to the database before execution in order to test\n    # what is deleted and what is preserved.\n    table_factory('place_classtype_amenity_animal_shelter')\n    table_factory('place_classtype_wrongclass_wrongtype')\n\n    monkeypatch.setattr('nominatim_db.tools.special_phrases.sp_wiki_loader._get_wiki_content',\n                        lambda lang: xml_wiki_content)\n\n    class_test = 'aerialway'\n    type_test = 'zip_line'\n\n    tokenizer = tokenizer_mock()\n    placex_row(cls=class_test, typ=type_test)  # in db for special phrase filtering\n    placex_row(cls='amenity', typ='animal_shelter')  # in db for special phrase filtering\n    sp_importer.import_phrases(tokenizer, should_replace)\n\n    assert len(tokenizer.analyser_cache['special_phrases']) == 19\n\n    assert check_table_exist(temp_db_cursor, class_test, type_test)\n    assert check_placeid_and_centroid_indexes(temp_db_cursor, class_test, type_test)\n    assert check_grant_access(temp_db_cursor, def_config.DATABASE_WEBUSER, class_test, type_test)\n    assert check_table_exist(temp_db_cursor, 'amenity', 'animal_shelter')\n    if should_replace:\n        assert not check_table_exist(temp_db_cursor, 'wrong_class', 'wrong_type')\n\n    assert temp_db_cursor.table_exists('place_classtype_amenity_animal_shelter')\n    if should_replace:\n        assert not temp_db_cursor.table_exists('place_classtype_wrongclass_wrongtype')\n\n\ndef check_table_exist(temp_db_cursor, phrase_class, phrase_type):\n    \"\"\"\n        Verify that the place_classtype table exists for the given\n        phrase_class and phrase_type.\n    \"\"\"\n    return temp_db_cursor.table_exists('place_classtype_{}_{}'.format(phrase_class, phrase_type))\n\n\ndef check_grant_access(temp_db_cursor, user, phrase_class, phrase_type):\n    \"\"\"\n        Check that the web user has been granted right access to the\n        place_classtype table of the given phrase_class and phrase_type.\n    \"\"\"\n    table_name = 'place_classtype_{}_{}'.format(phrase_class, phrase_type)\n\n    temp_db_cursor.execute(\"\"\"\n            SELECT * FROM information_schema.role_table_grants\n            WHERE table_name='{}'\n            AND grantee='{}'\n            AND privilege_type='SELECT'\"\"\".format(table_name, user))\n    return temp_db_cursor.fetchone()\n\n\ndef check_placeid_and_centroid_indexes(temp_db_cursor, phrase_class, phrase_type):\n    \"\"\"\n        Check that the place_id index and centroid index exist for the\n        place_classtype table of the given phrase_class and phrase_type.\n    \"\"\"\n    table_name = 'place_classtype_{}_{}'.format(phrase_class, phrase_type)\n    index_prefix = 'idx_place_classtype_{}_{}_'.format(phrase_class, phrase_type)\n\n    return (\n        temp_db_cursor.index_exists(table_name, index_prefix + 'centroid')\n        and\n        temp_db_cursor.index_exists(table_name, index_prefix + 'place_id')\n    )\n\n\n@pytest.mark.parametrize(\"should_replace\", [(True), (False)])\ndef test_import_phrases_special_phrase_filtering(monkeypatch, temp_db_cursor, def_config,\n                                                 sp_importer, placex_row, tokenizer_mock,\n                                                 xml_wiki_content, should_replace):\n\n    monkeypatch.setattr('nominatim_db.tools.special_phrases.sp_wiki_loader._get_wiki_content',\n                        lambda lang: xml_wiki_content)\n\n    class_test = 'aerialway'\n    type_test = 'zip_line'\n\n    placex_row(cls=class_test, typ=type_test)  # add to the database to make valid\n    tokenizer = tokenizer_mock()\n    sp_importer.import_phrases(tokenizer, should_replace)\n\n    assert ('Zip Line', 'aerialway', 'zip_line', '-') in sp_importer.word_phrases\n    assert check_table_exist(temp_db_cursor, class_test, type_test)\n    assert check_placeid_and_centroid_indexes(temp_db_cursor, class_test, type_test)\n    assert check_grant_access(temp_db_cursor, def_config.DATABASE_WEBUSER, class_test, type_test)\n\n\ndef test_get_classtype_pairs_directly(placex_row, temp_db_conn, sp_importer):\n    for _ in range(101):\n        placex_row(cls='highway', typ='residential')\n    for _ in range(99):\n        placex_row(cls='amenity', typ='toilet')\n\n    temp_db_conn.commit()\n\n    result = sp_importer.get_classtype_pairs(100)\n    print(\"RESULT:\", result)\n    assert ('highway', 'residential') in result\n    assert ('amenity', 'toilet') not in result\n"
  },
  {
    "path": "test/python/tools/test_migration.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for migration functions\n\"\"\"\nimport pytest\n\nfrom nominatim_db.tools import migration\nfrom nominatim_db.errors import UsageError\nimport nominatim_db.version\n\n\nclass DummyTokenizer:\n\n    def update_sql_functions(self, config):\n        pass\n\n\n@pytest.fixture\ndef postprocess_mock(monkeypatch):\n    monkeypatch.setattr(migration.refresh, 'create_functions', lambda *args: args)\n    monkeypatch.setattr(migration.tokenizer_factory, 'get_tokenizer_for_db',\n                        lambda *args: DummyTokenizer())\n\n\ndef test_no_migration_old_versions(temp_db_with_extensions, def_config, property_table):\n    property_table.set('database_version', '4.2.99-0')\n\n    with pytest.raises(UsageError, match='Migration not possible'):\n        migration.migrate(def_config, {})\n\n\ndef test_already_at_version(temp_db_with_extensions, def_config, property_table):\n\n    property_table.set('database_version',\n                       str(nominatim_db.version.NOMINATIM_VERSION))\n\n    assert migration.migrate(def_config, {}) == 0\n\n\ndef test_run_single_migration(temp_db_with_extensions, def_config, temp_db_cursor,\n                              property_table, monkeypatch, postprocess_mock):\n    oldversion = [4, 4, 99, 0]\n    property_table.set('database_version',\n                       str(nominatim_db.version.NominatimVersion(*oldversion)))\n\n    done = {'old': False, 'new': False}\n\n    def _migration(**_):\n        \"\"\" Dummy migration\"\"\"\n        done['new'] = True\n\n    def _old_migration(**_):\n        \"\"\" Dummy migration\"\"\"\n        done['old'] = True\n\n    oldversion[1] = 0\n    monkeypatch.setattr(migration, '_MIGRATION_FUNCTIONS',\n                        [(tuple(oldversion), _old_migration),\n                         (nominatim_db.version.NOMINATIM_VERSION, _migration)])\n\n    assert migration.migrate(def_config, {}) == 0\n\n    assert done['new']\n    assert not done['old']\n    assert property_table.get('database_version') == str(nominatim_db.version.NOMINATIM_VERSION)\n\n\n# Tests for specific migrations\n#\n# Each migration should come with two tests:\n#  1. Test that migration from old to new state works as expected.\n#  2. Test that the migration can be rerun on the new state without side effects.\n"
  },
  {
    "path": "test/python/tools/test_postcodes.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for functions to maintain the artificial postcode table.\n\"\"\"\nimport subprocess\n\nimport pytest\n\nfrom psycopg.rows import tuple_row\n\nfrom nominatim_db.tools import postcodes\nfrom nominatim_db.data import country_info\n\nimport dummy_tokenizer\n\n\n@pytest.fixture\ndef insert_implicit_postcode(placex_row, place_postcode_row):\n    \"\"\" Insert data into the placex and place table\n        which can then be used to compute one postcode.\n    \"\"\"\n    def _insert_implicit_postcode(osm_id, country, geometry, postcode, in_placex=False):\n        if in_placex:\n            placex_row(osm_id=osm_id, country=country, geom=geometry,\n                       centroid=geometry,\n                       address={'postcode': postcode})\n        else:\n            place_postcode_row(osm_id=osm_id, centroid=geometry,\n                               country=country, postcode=postcode)\n    return _insert_implicit_postcode\n\n\n@pytest.fixture\ndef insert_postcode_area(place_postcode_row):\n    \"\"\" Insert an area around a centroid to the postcode table.\n    \"\"\"\n    def _do(osm_id, country, postcode, x, y):\n        x1, x2, y1, y2 = x - 0.001, x + 0.001, y - 0.001, y + 0.001\n        place_postcode_row(osm_type='R', osm_id=osm_id, postcode=postcode, country=country,\n                           centroid=f\"POINT({x} {y})\",\n                           geom=f\"POLYGON(({x1} {y1}, {x1} {y2}, {x2} {y2}, {x2} {y1}, {x1} {y1}))\")\n    return _do\n\n\n@pytest.fixture\ndef postcode_update(dsn, temp_db_conn):\n    tokenizer = dummy_tokenizer.DummyTokenizer(None)\n\n    def _do(data_path=None):\n        with temp_db_conn.cursor() as cur:\n            cur.execute(\"\"\"CREATE TRIGGER location_postcodes_before_update\n                            BEFORE UPDATE ON location_postcodes\n                            FOR EACH ROW EXECUTE PROCEDURE postcodes_update()\"\"\")\n            cur.execute(\"\"\"CREATE TRIGGER location_postcodes_before_delete\n                            BEFORE DELETE ON location_postcodes\n                            FOR EACH ROW EXECUTE PROCEDURE postcodes_delete()\"\"\")\n            cur.execute(\"\"\"CREATE TRIGGER location_postcodes_before_insert\n                            BEFORE INSERT ON location_postcodes\n                            FOR EACH ROW EXECUTE PROCEDURE postcodes_insert()\"\"\")\n        temp_db_conn.commit()\n        postcodes.update_postcodes(dsn, data_path, tokenizer)\n    return _do\n\n\nclass TestPostcodes:\n    @pytest.fixture(autouse=True)\n    def setup(self, def_config, postcode_table, placex_table, place_postcode_table,\n              load_sql, temp_db_conn):\n        self.conn = temp_db_conn\n        country_info.setup_country_config(def_config)\n        load_sql('functions/postcode_triggers.sql')\n\n        temp_db_conn.execute(\"\"\"\n            CREATE OR REPLACE FUNCTION token_normalized_postcode(postcode TEXT)\n            RETURNS TEXT AS $$\n              SELECT postcode\n            $$ LANGUAGE sql;\n\n            CREATE OR REPLACE FUNCTION get_country_code(place geometry)\n            RETURNS TEXT AS $$\n              SELECT NULL\n            $$ LANGUAGE sql;\n\n            CREATE OR REPLACE FUNCTION expand_by_meters(geom GEOMETRY, meters FLOAT)\n            RETURNS GEOMETRY AS $$\n              SELECT ST_Envelope(ST_Buffer(geom::geography, meters, 1)::geometry)\n            $$ LANGUAGE sql;\n        \"\"\")\n\n    @property\n    def row_set(self):\n        with self.conn.cursor(row_factory=tuple_row) as cur:\n            cur.execute(\"\"\"SELECT osm_id, country_code, postcode,\n                                  ST_X(centroid), ST_Y(centroid)\n                           FROM location_postcodes\"\"\")\n            return {r for r in cur}\n\n    def test_postcodes_empty(self, postcode_update):\n        postcode_update()\n\n        assert not self.row_set\n\n    @pytest.mark.parametrize('in_placex', [True, False])\n    def test_postcodes_add_new_point(self, postcode_update, postcode_row,\n                                     insert_implicit_postcode, in_placex):\n        insert_implicit_postcode(1, 'xx', 'POINT(10 12)', '9486', in_placex)\n        postcode_row('yy', '9486', 99, 34)\n\n        postcode_update()\n\n        assert self.row_set == {(None, 'xx', '9486', 10, 12), }\n\n    def test_postcodes_add_new_area(self, postcode_update, insert_postcode_area):\n        insert_postcode_area(345, 'de', '10445', 23.5, 46.2)\n\n        postcode_update()\n\n        assert self.row_set == {(345, 'de', '10445', 23.5, 46.2)}\n\n    @pytest.mark.parametrize('in_placex', [True, False])\n    def test_postcodes_add_area_and_point(self, postcode_update, insert_postcode_area,\n                                          insert_implicit_postcode, in_placex):\n        insert_implicit_postcode(1, 'xx', 'POINT(10 12)', '10445', in_placex)\n        insert_postcode_area(345, 'xx', '10445', 23.5, 46.2)\n\n        postcode_update()\n\n        assert self.row_set == {(345, 'xx', '10445', 23.5, 46.2)}\n\n    @pytest.mark.parametrize('in_placex', [True, False])\n    def test_postcodes_add_point_within_area(self, postcode_update, insert_postcode_area,\n                                             insert_implicit_postcode, in_placex):\n        insert_implicit_postcode(1, 'xx', 'POINT(23.5 46.2)', '10446', in_placex)\n        insert_postcode_area(345, 'xx', '10445', 23.5, 46.2)\n\n        postcode_update()\n\n        assert self.row_set == {(345, 'xx', '10445', 23.5, 46.2)}\n\n    @pytest.mark.parametrize('coords', [(99, 34), (10, 34), (99, 12),\n                                        (9, 34), (9, 11), (23, 11)])\n    def test_postcodes_replace_coordinates(self, postcode_update, postcode_row, tmp_path,\n                                           insert_implicit_postcode, coords):\n        insert_implicit_postcode(1, 'xx', 'POINT(10 12)', 'AB 4511')\n        postcode_row('xx', 'AB 4511', *coords)\n\n        postcode_update(tmp_path)\n\n        assert self.row_set == {(None, 'xx', 'AB 4511', 10, 12)}\n\n    def test_postcodes_replace_coordinates_close(self, postcode_update, postcode_row,\n                                                 insert_implicit_postcode):\n        insert_implicit_postcode(1, 'xx', 'POINT(10 12)', 'AB 4511')\n        postcode_row('xx', 'AB 4511', 10, 11.99999999)\n\n        postcode_update()\n\n        assert self.row_set == {(None, 'xx', 'AB 4511', 10, 11.99999999)}\n\n    def test_postcodes_remove_point(self, postcode_update, postcode_row,\n                                    insert_implicit_postcode):\n        insert_implicit_postcode(1, 'xx', 'POINT(10 12)', 'AB 4511')\n        postcode_row('xx', 'badname', 10, 12)\n\n        postcode_update()\n\n        assert self.row_set == {(None, 'xx', 'AB 4511', 10, 12)}\n\n    def test_postcodes_ignore_empty_country(self, postcode_update, insert_implicit_postcode):\n        insert_implicit_postcode(1, None, 'POINT(10 12)', 'AB 4511')\n        postcode_update()\n        assert not self.row_set\n\n    def test_postcodes_remove_all(self, postcode_update, postcode_row, place_postcode_table):\n        postcode_row('ch', '5613', 10, 12)\n        postcode_update()\n\n        assert not self.row_set\n\n    def test_postcodes_multi_country(self, postcode_update,\n                                     insert_implicit_postcode):\n        insert_implicit_postcode(1, 'de', 'POINT(10 12)', '54451')\n        insert_implicit_postcode(2, 'cc', 'POINT(100 56)', 'DD23 T')\n        insert_implicit_postcode(3, 'de', 'POINT(10.3 11.0)', '54452')\n        insert_implicit_postcode(4, 'cc', 'POINT(10.3 11.0)', '54452')\n\n        postcode_update()\n\n        assert self.row_set == {(None, 'de', '54451', 10, 12),\n                                (None, 'de', '54452', 10.3, 11.0),\n                                (None, 'cc', '54452', 10.3, 11.0),\n                                (None, 'cc', 'DD23 T', 100, 56)}\n\n    @pytest.mark.parametrize(\"gzipped\", [True, False])\n    def test_postcodes_extern(self, postcode_update, tmp_path,\n                              insert_implicit_postcode, gzipped):\n        insert_implicit_postcode(1, 'xx', 'POINT(10 12)', 'AB 4511')\n\n        extfile = tmp_path / 'xx_postcodes.csv'\n        extfile.write_text(\"postcode,lat,lon\\nAB 4511,-4,-1\\nCD 4511,-5, -10\", encoding='utf-8')\n\n        if gzipped:\n            subprocess.run(['gzip', str(extfile)])\n            assert not extfile.is_file()\n\n        postcode_update(tmp_path)\n\n        assert self.row_set == {(None, 'xx', 'AB 4511', 10, 12),\n                                (None, 'xx', 'CD 4511', -10, -5)}\n\n    def test_postcodes_extern_bad_column(self, postcode_update, tmp_path,\n                                         insert_implicit_postcode):\n        insert_implicit_postcode(1, 'xx', 'POINT(10 12)', 'AB 4511')\n\n        extfile = tmp_path / 'xx_postcodes.csv'\n        extfile.write_text(\"postode,lat,lon\\nAB 4511,-4,-1\\nCD 4511,-5, -10\", encoding='utf-8')\n\n        postcode_update(tmp_path)\n\n        assert self.row_set == {(None, 'xx', 'AB 4511', 10, 12)}\n\n    def test_postcodes_extern_bad_number(self, postcode_update, insert_implicit_postcode,\n                                         tmp_path):\n        insert_implicit_postcode(1, 'xx', 'POINT(10 12)', 'AB 4511')\n\n        extfile = tmp_path / 'xx_postcodes.csv'\n        extfile.write_text(\n            \"postcode,lat,lon\\nXX 4511,-4,NaN\\nCD 4511,-5, -10\\n34,200,0\", encoding='utf-8')\n\n        postcode_update(tmp_path)\n\n        assert self.row_set == {(None, 'xx', 'AB 4511', 10, 12),\n                                (None, 'xx', 'CD 4511', -10, -5)}\n\n    def test_no_placex_entry(self, postcode_update, temp_db_cursor, place_postcode_row):\n        # Rewrite the get_country_code function to verify its execution.\n        temp_db_cursor.execute(\"\"\"\n            CREATE OR REPLACE FUNCTION get_country_code(place geometry) RETURNS TEXT AS $$\n              SELECT 'yy' $$ LANGUAGE sql\"\"\")\n        place_postcode_row(centroid='POINT(10 12)', postcode='AB 4511')\n        postcode_update()\n\n        assert self.row_set == {(None, 'yy', 'AB 4511', 10, 12)}\n\n    def test_discard_badly_formatted_postcodes(self, postcode_update, place_postcode_row):\n        place_postcode_row(centroid='POINT(10 12)', country='fr', postcode='AB 4511')\n        postcode_update()\n\n        assert not self.row_set\n\n\ndef test_can_compute(dsn, table_factory):\n    assert not postcodes.can_compute(dsn)\n    table_factory('place_postcode')\n    assert postcodes.can_compute(dsn)\n"
  },
  {
    "path": "test/python/tools/test_refresh.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTest for various refresh functions.\n\"\"\"\nfrom pathlib import Path\n\nimport pytest\n\nfrom nominatim_db.tools import refresh\n\n\ndef test_refresh_import_wikipedia_not_existing(dsn):\n    assert refresh.import_wikipedia_articles(dsn, Path('.')) == 1\n\n\ndef test_refresh_import_secondary_importance_non_existing(dsn):\n    assert refresh.import_secondary_importance(dsn, Path('.')) == 1\n\n\ndef test_refresh_import_secondary_importance_testdb(dsn, src_dir, temp_db_conn, temp_db_cursor):\n    temp_db_cursor.execute('CREATE EXTENSION postgis')\n    temp_db_cursor.execute('CREATE EXTENSION postgis_raster')\n    assert refresh.import_secondary_importance(dsn, src_dir / 'test' / 'testdb') == 0\n\n    assert temp_db_cursor.table_exists('secondary_importance')\n\n\n@pytest.mark.parametrize(\"replace\", (True, False))\ndef test_refresh_import_wikipedia(dsn, src_dir, table_factory, temp_db_cursor, replace):\n    if replace:\n        table_factory('wikimedia_importance')\n\n    # use the small wikipedia file for the API testdb\n    assert refresh.import_wikipedia_articles(dsn, src_dir / 'test' / 'testdb') == 0\n\n    assert temp_db_cursor.table_rows('wikimedia_importance') > 0\n\n\n@pytest.mark.parametrize('osm_type', ('N', 'W', 'R'))\ndef test_invalidate_osm_object_simple(placex_row, osm_type, temp_db_conn, temp_db_cursor):\n    placex_row(osm_type=osm_type, osm_id=57283)\n\n    refresh.invalidate_osm_object(osm_type, 57283, temp_db_conn, recursive=False)\n    temp_db_conn.commit()\n\n    assert 2 == temp_db_cursor.scalar(\"\"\"SELECT indexed_status FROM placex\n                                         WHERE osm_type = %s and osm_id = %s\"\"\",\n                                      (osm_type, 57283))\n\n\ndef test_invalidate_osm_object_nonexisting_simple(placex_row, temp_db_conn, temp_db_cursor):\n    placex_row(osm_type='W', osm_id=57283)\n\n    refresh.invalidate_osm_object('N', 57283, temp_db_conn, recursive=False)\n    temp_db_conn.commit()\n\n    assert 0 == temp_db_cursor.scalar(\"\"\"SELECT count(*) FROM placex\n                                         WHERE indexed_status > 0\"\"\")\n\n\n@pytest.mark.parametrize('osm_type', ('N', 'W', 'R'))\ndef test_invalidate_osm_object_recursive(placex_row, osm_type, temp_db_conn, temp_db_cursor):\n    placex_row(osm_type=osm_type, osm_id=57283)\n\n    temp_db_cursor.execute(\"\"\"CREATE OR REPLACE FUNCTION place_force_update(placeid BIGINT)\n                              RETURNS BOOLEAN AS $$\n                              BEGIN\n                                UPDATE placex SET indexed_status = 522\n                                WHERE place_id = placeid;\n                                RETURN TRUE;\n                              END;\n                              $$\n                              LANGUAGE plpgsql;\"\"\")\n\n    refresh.invalidate_osm_object(osm_type, 57283, temp_db_conn)\n    temp_db_conn.commit()\n\n    assert 522 == temp_db_cursor.scalar(\"\"\"SELECT indexed_status FROM placex\n                                           WHERE osm_type = %s and osm_id = %s\"\"\",\n                                        (osm_type, 57283))\n"
  },
  {
    "path": "test/python/tools/test_refresh_address_levels.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for function for importing address ranks.\n\"\"\"\nimport json\n\nimport pytest\n\nfrom nominatim_db.tools.refresh import load_address_levels, load_address_levels_from_config\n\n\ndef test_load_ranks_def_config(temp_db_conn, temp_db_cursor, def_config):\n    load_address_levels_from_config(temp_db_conn, def_config)\n\n    assert temp_db_cursor.table_rows('address_levels') > 0\n\n\ndef test_load_ranks_from_project_dir(project_env, temp_db_conn, temp_db_cursor):\n    test_file = project_env.project_dir / 'address-levels.json'\n    test_file.write_text('[{\"tags\":{\"place\":{\"sea\":2}}}]', encoding='utf-8')\n\n    load_address_levels_from_config(temp_db_conn, project_env)\n\n    assert temp_db_cursor.table_rows('address_levels') == 1\n\n\ndef test_load_ranks_from_broken_file(project_env, temp_db_conn):\n    test_file = project_env.project_dir / 'address-levels.json'\n    test_file.write_text('[{\"tags\":\"place\":{\"sea\":2}}}]', encoding='utf-8')\n\n    with pytest.raises(json.decoder.JSONDecodeError):\n        load_address_levels_from_config(temp_db_conn, project_env)\n\n\ndef test_load_ranks_country(temp_db_conn, temp_db_cursor):\n    load_address_levels(temp_db_conn, 'levels',\n                        [{\"tags\": {\"place\": {\"village\": 14}}},\n                         {\"countries\": ['de'],\n                          \"tags\": {\"place\": {\"village\": 15}}},\n                         {\"countries\": ['uk', 'us'],\n                          \"tags\": {\"place\": {\"village\": 16}}}\n                         ])\n\n    assert temp_db_cursor.row_set('SELECT * FROM levels') == \\\n           set([(None, 'place', 'village', 14, 14),\n                ('de', 'place', 'village', 15, 15),\n                ('uk', 'place', 'village', 16, 16),\n                ('us', 'place', 'village', 16, 16),\n                ])\n\n\ndef test_load_ranks_default_value(temp_db_conn, temp_db_cursor):\n    load_address_levels(temp_db_conn, 'levels',\n                        [{\"tags\": {\"boundary\": {\"\": 28}}},\n                         {\"countries\": ['hu'],\n                          \"tags\": {\"boundary\": {\"\": 29}}}\n                         ])\n\n    assert temp_db_cursor.row_set('SELECT * FROM levels') == \\\n           set([(None, 'boundary', None, 28, 28),\n                ('hu', 'boundary', None, 29, 29),\n                ])\n\n\ndef test_load_ranks_multiple_keys(temp_db_conn, temp_db_cursor):\n    load_address_levels(temp_db_conn, 'levels',\n                        [{\"tags\": {\"place\": {\"city\": 14},\n                                   \"boundary\": {\"administrative2\": 4}}\n                          }])\n\n    assert temp_db_cursor.row_set('SELECT * FROM levels') == \\\n           set([(None, 'place', 'city', 14, 14),\n                (None, 'boundary', 'administrative2', 4, 4),\n                ])\n\n\ndef test_load_ranks_address(temp_db_conn, temp_db_cursor):\n    load_address_levels(temp_db_conn, 'levels',\n                        [{\"tags\": {\"place\": {\"city\": 14,\n                                             \"town\": [14, 13]}}\n                          }])\n\n    assert temp_db_cursor.row_set('SELECT * FROM levels') == \\\n           set([(None, 'place', 'city', 14, 14),\n                (None, 'place', 'town', 14, 13),\n                ])\n"
  },
  {
    "path": "test/python/tools/test_refresh_create_functions.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for creating PL/pgSQL functions for Nominatim.\n\"\"\"\nimport pytest\n\nfrom nominatim_db.tools.refresh import create_functions\n\n\nclass TestCreateFunctions:\n    @pytest.fixture(autouse=True)\n    def init_env(self, sql_preprocessor, temp_db_conn, def_config, tmp_path):\n        self.conn = temp_db_conn\n        self.config = def_config\n        def_config.lib_dir.sql = tmp_path\n\n    def write_functions(self, content):\n        sqlfile = self.config.lib_dir.sql / 'functions.sql'\n        sqlfile.write_text(content, encoding='utf-8')\n\n    def test_create_functions(self, temp_db_cursor):\n        self.write_functions(\"\"\"CREATE OR REPLACE FUNCTION test() RETURNS INTEGER\n                              AS $$\n                              BEGIN\n                                RETURN 43;\n                              END;\n                              $$ LANGUAGE plpgsql IMMUTABLE;\n                           \"\"\")\n\n        create_functions(self.conn, self.config)\n\n        assert temp_db_cursor.scalar('SELECT test()') == 43\n\n    @pytest.mark.parametrize(\"dbg,ret\", ((True, 43), (False, 22)))\n    def test_create_functions_with_template(self, temp_db_cursor, dbg, ret):\n        self.write_functions(\"\"\"CREATE OR REPLACE FUNCTION test() RETURNS INTEGER\n                              AS $$\n                              BEGIN\n                                {% if debug %}\n                                RETURN 43;\n                                {% else %}\n                                RETURN 22;\n                                {% endif %}\n                              END;\n                              $$ LANGUAGE plpgsql IMMUTABLE;\n                           \"\"\")\n\n        create_functions(self.conn, self.config, enable_debug=dbg)\n\n        assert temp_db_cursor.scalar('SELECT test()') == ret\n"
  },
  {
    "path": "test/python/tools/test_refresh_wiki_data.py",
    "content": "# SPDX-License-Identifier: GPL-2.0-only\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for correctly assigning wikipedia pages to places.\n\"\"\"\nimport gzip\nimport csv\n\nimport pytest\n\nfrom nominatim_db.tools.refresh import (import_wikipedia_articles,\n                                        recompute_importance,\n                                        create_functions)\n\n\n@pytest.fixture\ndef wiki_csv(tmp_path, sql_preprocessor):\n    def _import(data):\n        with gzip.open(tmp_path / 'wikimedia-importance.csv.gz', mode='wt', encoding='utf-8') as fd:\n            writer = csv.DictWriter(fd, fieldnames=['language', 'type', 'title',\n                                                    'importance', 'wikidata_id'],\n                                    delimiter='\\t', quotechar='|')\n            writer.writeheader()\n            for lang, title, importance, wd in data:\n                writer.writerow({'language': lang, 'type': 'a',\n                                 'title': title, 'importance': str(importance),\n                                 'wikidata_id': wd})\n        return tmp_path\n\n    return _import\n\n\n@pytest.mark.parametrize('extra', [{'wikipedia:en': 'Test'},\n                                   {'wikipedia': 'en:Test'},\n                                   {'wikidata': 'Q123'}])\ndef test_wikipedia(dsn, temp_db_conn, temp_db_cursor, table_factory,\n                   def_config, wiki_csv, placex_row, extra):\n    import_wikipedia_articles(dsn, wiki_csv([('en', 'Test', 0.3, 'Q123')]))\n    create_functions(temp_db_conn, def_config)\n\n    content = temp_db_cursor.row_set(\n        'SELECT language, title, importance, wikidata FROM wikimedia_importance')\n    assert content == set([('en', 'Test', 0.3, 'Q123')])\n\n    place_id = placex_row(osm_id=12, extratags=extra)\n    table_factory('search_name',\n                  'place_id BIGINT, importance FLOAT',\n                  [(place_id, 0.2)])\n\n    recompute_importance(temp_db_conn)\n\n    content = temp_db_cursor.row_set('SELECT wikipedia, importance FROM placex')\n    assert content == set([('en:Test', 0.3)])\n    simp = temp_db_cursor.scalar('SELECT importance FROM search_name WHERE place_id = %s',\n                                 (place_id,))\n    assert simp == 0.3\n\n\ndef test_wikipedia_no_match(dsn, temp_db_conn, temp_db_cursor, def_config, wiki_csv,\n                            placex_row, table_factory):\n    import_wikipedia_articles(dsn, wiki_csv([('de', 'Test', 0.3, 'Q123')]))\n    create_functions(temp_db_conn, def_config)\n\n    place_id = placex_row(osm_id=12, extratags={'wikipedia': 'en:Test'}, rank_search=10)\n    table_factory('search_name',\n                  'place_id BIGINT, importance FLOAT',\n                  [(place_id, 0.2)])\n\n    recompute_importance(temp_db_conn)\n\n    content = temp_db_cursor.row_set('SELECT wikipedia, importance FROM placex')\n    assert list(content) == [(None, pytest.approx(0.26667666))]\n    simp = temp_db_cursor.scalar('SELECT importance FROM search_name WHERE place_id = %s',\n                                 (place_id,))\n    assert simp == pytest.approx(0.26667666)\n"
  },
  {
    "path": "test/python/tools/test_replication.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for replication functionality.\n\"\"\"\nimport datetime as dt\nimport time\n\nimport pytest\nfrom osmium.replication.server import OsmosisState\n\nimport nominatim_db.tools.replication\nimport nominatim_db.db.status as status\nfrom nominatim_db.errors import UsageError\n\nOSM_NODE_DATA = \"\"\"\\\n<osm version=\"0.6\" generator=\"OpenStreetMap server\" copyright=\"OpenStreetMap and contributors\" attribution=\"http://www.openstreetmap.org/copyright\" license=\"http://opendatacommons.org/licenses/odbl/1-0/\">\n<node id=\"100\" visible=\"true\" version=\"1\" changeset=\"2047\" timestamp=\"2006-01-27T22:09:10Z\" user=\"Foo\" uid=\"111\" lat=\"48.7586670\" lon=\"8.1343060\">\n</node>\n</osm>\n\"\"\"  # noqa\n\n\n@pytest.fixture(autouse=True)\ndef setup_status_table(status_table):\n    pass\n\n\n# init replication\n\ndef test_init_replication_bad_base_url(monkeypatch, place_row, temp_db_conn):\n    place_row(osm_type='N', osm_id=100)\n\n    monkeypatch.setattr(status, \"get_url\", lambda u: OSM_NODE_DATA)\n\n    with pytest.raises(UsageError, match=\"Failed to reach replication service\"):\n        nominatim_db.tools.replication.init_replication(temp_db_conn, 'https://test.io')\n\n\ndef test_init_replication_success(monkeypatch, place_row, temp_db_conn, temp_db_cursor):\n    place_row(osm_type='N', osm_id=100)\n\n    monkeypatch.setattr(status, \"get_url\", lambda u: OSM_NODE_DATA)\n    monkeypatch.setattr(nominatim_db.tools.replication.ReplicationServer,\n                        \"timestamp_to_sequence\",\n                        lambda self, date: 234)\n\n    nominatim_db.tools.replication.init_replication(temp_db_conn, 'https://test.io')\n\n    expected_date = dt.datetime.strptime('2006-01-27T19:09:10', status.ISODATE_FORMAT)\\\n                      .replace(tzinfo=dt.timezone.utc)\n\n    assert temp_db_cursor.row_set(\"SELECT * FROM import_status\") \\\n        == {(expected_date, 234, True)}\n\n\n# checking for updates\n\ndef test_check_for_updates_empty_status_table(temp_db_conn):\n    assert nominatim_db.tools.replication.check_for_updates(temp_db_conn, 'https://test.io') == 254\n\n\ndef test_check_for_updates_seq_not_set(temp_db_conn):\n    status.set_status(temp_db_conn, dt.datetime.now(dt.timezone.utc))\n\n    assert nominatim_db.tools.replication.check_for_updates(temp_db_conn, 'https://test.io') == 254\n\n\ndef test_check_for_updates_no_state(monkeypatch, temp_db_conn):\n    status.set_status(temp_db_conn, dt.datetime.now(dt.timezone.utc), seq=345)\n\n    monkeypatch.setattr(nominatim_db.tools.replication.ReplicationServer,\n                        \"get_state_info\", lambda self: None)\n\n    assert nominatim_db.tools.replication.check_for_updates(temp_db_conn, 'https://test.io') == 253\n\n\n@pytest.mark.parametrize(\"server_sequence,result\", [(344, 2), (345, 2), (346, 0)])\ndef test_check_for_updates_no_new_data(monkeypatch, temp_db_conn,\n                                       server_sequence, result):\n    date = dt.datetime.now(dt.timezone.utc)\n    status.set_status(temp_db_conn, date, seq=345)\n\n    monkeypatch.setattr(nominatim_db.tools.replication.ReplicationServer,\n                        \"get_state_info\",\n                        lambda self: OsmosisState(server_sequence, date))\n\n    assert result == \\\n        nominatim_db.tools.replication.check_for_updates(temp_db_conn, 'https://test.io')\n\n\n# updating\n\n@pytest.fixture\ndef update_options(tmpdir):\n    return dict(base_url='https://test.io',\n                indexed_only=False,\n                update_interval=3600,\n                import_file=tmpdir / 'foo.osm',\n                max_diff_size=1)\n\n\ndef test_update_empty_status_table(dsn):\n    with pytest.raises(UsageError):\n        nominatim_db.tools.replication.update(dsn, {})\n\n\ndef test_update_already_indexed(temp_db_conn, dsn):\n    status.set_status(temp_db_conn, dt.datetime.now(dt.timezone.utc), seq=34, indexed=False)\n\n    assert nominatim_db.tools.replication.update(dsn, dict(indexed_only=True)) \\\n        == nominatim_db.tools.replication.UpdateState.MORE_PENDING\n\n\ndef test_update_no_data_no_sleep(monkeypatch, temp_db_conn, dsn, update_options):\n    date = dt.datetime.now(dt.timezone.utc) - dt.timedelta(days=1)\n    status.set_status(temp_db_conn, date, seq=34)\n\n    monkeypatch.setattr(nominatim_db.tools.replication.ReplicationServer,\n                        \"apply_diffs\",\n                        lambda *args, **kwargs: None)\n\n    sleeptime = []\n    monkeypatch.setattr(time, 'sleep', sleeptime.append)\n\n    assert nominatim_db.tools.replication.update(dsn, update_options) \\\n        == nominatim_db.tools.replication.UpdateState.NO_CHANGES\n\n    assert not sleeptime\n\n\ndef test_update_no_data_sleep(monkeypatch, temp_db_conn, dsn, update_options):\n    date = dt.datetime.now(dt.timezone.utc) - dt.timedelta(minutes=30)\n    status.set_status(temp_db_conn, date, seq=34)\n\n    monkeypatch.setattr(nominatim_db.tools.replication.ReplicationServer,\n                        \"apply_diffs\",\n                        lambda *args, **kwargs: None)\n\n    sleeptime = []\n    monkeypatch.setattr(time, 'sleep', sleeptime.append)\n\n    assert nominatim_db.tools.replication.update(dsn, update_options) \\\n        == nominatim_db.tools.replication.UpdateState.NO_CHANGES\n\n    assert len(sleeptime) == 1\n    assert sleeptime[0] < 3600\n    assert sleeptime[0] > 0\n"
  },
  {
    "path": "test/python/tools/test_sp_csv_loader.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\n    Tests for methods of the SPCsvLoader class.\n\"\"\"\nimport pytest\n\nfrom nominatim_db.errors import UsageError\nfrom nominatim_db.tools.special_phrases.sp_csv_loader import SPCsvLoader\nfrom nominatim_db.tools.special_phrases.special_phrase import SpecialPhrase\n\n\n@pytest.fixture\ndef sp_csv_loader(src_dir):\n    \"\"\"\n        Return an instance of SPCsvLoader.\n    \"\"\"\n    csv_path = (src_dir / 'test' / 'testdata' / 'sp_csv_test.csv').resolve()\n    loader = SPCsvLoader(csv_path)\n    return loader\n\n\ndef test_generate_phrases(sp_csv_loader):\n    \"\"\"\n        Test method parse_csv()\n        Should return the right SpecialPhrase objects.\n    \"\"\"\n    phrases = list(sp_csv_loader.generate_phrases())\n\n    assert len(phrases) == 42\n    assert len(set(phrases)) == 41\n\n    assert SpecialPhrase('Billboard', 'advertising', 'billboard', '-') in phrases\n    assert SpecialPhrase('Zip Lines', 'aerialway', 'zip_line', '-') in phrases\n\n\ndef test_invalid_cvs_file():\n    \"\"\"\n        Test method check_csv_validity()\n        It should raise an exception when file with a\n        different exception than .csv is given.\n    \"\"\"\n    loader = SPCsvLoader('test.wrong')\n\n    with pytest.raises(UsageError, match='not a csv file'):\n        next(loader.generate_phrases())\n"
  },
  {
    "path": "test/python/tools/test_sp_importer.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\nfrom nominatim_db.tools.special_phrases.sp_importer import SPImporter\n\n\n# Testing Database Class Pair Retrival using Conftest.py and placex\ndef test_get_classtype_pair_data(placex_row, def_config, temp_db_conn):\n    for _ in range(100):\n        placex_row(cls='highway', typ='motorway')  # edge case 100\n\n    for _ in range(99):\n        placex_row(cls='amenity', typ='prison')  # edge case 99\n\n    for _ in range(150):\n        placex_row(cls='tourism', typ='hotel')\n\n    importer = SPImporter(config=def_config, conn=temp_db_conn, sp_loader=None)\n\n    result = importer.get_classtype_pairs(min=100)\n\n    assert result == {\n        (\"highway\", \"motorway\"),\n        (\"tourism\", \"hotel\")\n    }\n\n\ndef test_get_classtype_pair_data_more(placex_row, def_config, temp_db_conn):\n    for _ in range(99):\n        placex_row(cls='emergency', typ='firehydrant')  # edge case 99, not included\n\n    for _ in range(199):\n        placex_row(cls='amenity', typ='prison')\n\n    for _ in range(3478):\n        placex_row(cls='tourism', typ='hotel')\n\n    importer = SPImporter(config=def_config, conn=temp_db_conn, sp_loader=None)\n\n    result = importer.get_classtype_pairs(min=100)\n\n    assert result == {\n        (\"amenity\", \"prison\"),\n        (\"tourism\", \"hotel\")\n    }\n\n\ndef test_get_classtype_pair_data_default(placex_row, def_config, temp_db_conn):\n    for _ in range(1):\n        placex_row(cls='emergency', typ='firehydrant')\n\n    for _ in range(199):\n        placex_row(cls='amenity', typ='prison')\n\n    for _ in range(3478):\n        placex_row(cls='tourism', typ='hotel')\n\n    importer = SPImporter(config=def_config, conn=temp_db_conn, sp_loader=None)\n\n    result = importer.get_classtype_pairs()\n\n    assert result == {\n        (\"amenity\", \"prison\"),\n        (\"tourism\", \"hotel\"),\n        (\"emergency\", \"firehydrant\")\n    }\n"
  },
  {
    "path": "test/python/tools/test_sp_wiki_loader.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\n    Tests for methods of the SPWikiLoader class.\n\"\"\"\nimport pytest\nfrom nominatim_db.tools.special_phrases.sp_wiki_loader import SPWikiLoader\n\n\n@pytest.fixture\ndef sp_wiki_loader(src_dir, monkeypatch, def_config):\n    \"\"\"\n        Return an instance of SPWikiLoader.\n    \"\"\"\n    monkeypatch.setenv('NOMINATIM_LANGUAGES', 'en')\n    loader = SPWikiLoader(def_config)\n\n    def _mock_wiki_content(lang):\n        xml_test_content = src_dir / 'test' / 'testdata' / 'special_phrases_test_content.txt'\n        return xml_test_content.read_text(encoding='utf-8')\n\n    monkeypatch.setattr('nominatim_db.tools.special_phrases.sp_wiki_loader._get_wiki_content',\n                        _mock_wiki_content)\n    return loader\n\n\ndef test_generate_phrases(sp_wiki_loader):\n    \"\"\"\n        Test objects returned from the next() method.\n        It should return all SpecialPhrases objects of\n        the 'en' special phrases.\n    \"\"\"\n    phrases = list(sp_wiki_loader.generate_phrases())\n\n    assert set((p.p_label, p.p_class, p.p_type, p.p_operator) for p in phrases) == \\\n        {('Zip Line', 'aerialway', 'zip_line', '-'),\n         ('Zip Lines', 'aerialway', 'zip_line', '-'),\n         ('Zip Line in', 'aerialway', 'zip_line', 'in'),\n         ('Zip Lines in', 'aerialway', 'zip_line', 'in'),\n         ('Zip Line near', 'aerialway', 'zip_line', 'near'),\n         ('Animal shelter', 'amenity', 'animal_shelter', '-'),\n         ('Animal shelters', 'amenity', 'animal_shelter', '-'),\n         ('Animal shelter in', 'amenity', 'animal_shelter', 'in'),\n         ('Animal shelters in', 'amenity', 'animal_shelter', 'in'),\n         ('Animal shelter near', 'amenity', 'animal_shelter', 'near'),\n         ('Animal shelters near', 'amenity', 'animal_shelter', 'near'),\n         ('Drinking Water near', 'amenity', 'drinking_water', 'near'),\n         ('Water', 'amenity', 'drinking_water', '-'),\n         ('Water in', 'amenity', 'drinking_water', 'in'),\n         ('Water near', 'amenity', 'drinking_water', 'near'),\n         ('Embassy', 'amenity', 'embassy', '-'),\n         ('Embassys', 'amenity', 'embassy', '-'),\n         ('Embassies', 'amenity', 'embassy', '-'),\n         # test for one-cell-per-line format\n         ('Coworkings near', 'amenity', 'coworking_space', 'near')}\n"
  },
  {
    "path": "test/python/tools/test_tiger_data.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2026 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTest for tiger data function\n\"\"\"\nimport tarfile\nfrom textwrap import dedent\n\nimport pytest\nimport pytest_asyncio  # noqa: F401\n\nfrom nominatim_db.tools import tiger_data\nfrom nominatim_db.errors import UsageError\n\n\n@pytest.fixture\ndef csv_factory(tmp_path):\n    def _mk_file(fname, hnr_from=1, hnr_to=9, interpol='odd', street='Main St',\n                 city='Newtown', state='AL', postcode='12345',\n                 geometry='LINESTRING(-86.466995 32.428956,-86.466923 32.428933)'):\n        (tmp_path / (fname + '.csv')).write_text(dedent(\"\"\"\\\n        from;to;interpolation;street;city;state;postcode;geometry\n        {};{};{};{};{};{};{};{}\n        \"\"\".format(hnr_from, hnr_to, interpol, street, city, state,\n                   postcode, geometry)), encoding='utf-8')\n\n    return _mk_file\n\n\nclass TestTiger:\n\n    @pytest.fixture(autouse=True)\n    def setup(self, temp_db_conn, placex_row, load_sql):\n        load_sql('tables/search_name.sql', create_reverse_only=False)\n        load_sql('tables/tiger.sql')\n\n        # fake parent roads\n        for x in range(-870, -863):\n            for y in range(323, 328):\n                placex_row(rank_search=26, rank_address=26,\n                           geom=f\"LINESTRING({x/10 - 0.1} {y/10}, {x/10 + 0.1} {y/10})\")\n\n        temp_db_conn.execute(\"\"\"\n            CREATE OR REPLACE FUNCTION get_partition(cc VARCHAR(10)) RETURNS INTEGER AS $$\n              SELECT 0;\n            $$ LANGUAGE sql;\n            CREATE OR REPLACE FUNCTION token_matches_street(i JSONB, s INT[]) RETURNS BOOLEAN AS $$\n             SELECT false\n            $$ LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE;\n        \"\"\")\n\n    @pytest.mark.parametrize(\"threads\", (1, 5))\n    @pytest.mark.asyncio\n    async def test_add_tiger_data_database_frozen(self, def_config, src_dir, temp_db_cursor,\n                                                  tokenizer_mock, threads):\n        await tiger_data.add_tiger_data(str(src_dir / 'test' / 'testdb' / 'tiger'),\n                                        def_config, threads, tokenizer_mock())\n\n        assert temp_db_cursor.table_rows('location_property_tiger') == 6209\n\n    @pytest.mark.asyncio\n    async def test_add_tiger_data_reverse_only(self, def_config, src_dir, temp_db_cursor,\n                                               tokenizer_mock):\n        temp_db_cursor.execute(\"DROP TABLE search_name\")\n\n        with pytest.raises(UsageError,\n                           match=\"Cannot perform tiger import: required tables are missing. \"\n                           \"See https://github.com/osm-search/Nominatim/issues/2463 for details.\"):\n            await tiger_data.add_tiger_data(str(src_dir / 'test' / 'testdb' / 'tiger'),\n                                            def_config, 1, tokenizer_mock())\n\n        assert temp_db_cursor.table_rows('location_property_tiger') == 0\n\n    @pytest.mark.asyncio\n    async def test_add_tiger_data_no_files(self, def_config, temp_db_cursor, tokenizer_mock,\n                                           tmp_path):\n        await tiger_data.add_tiger_data(str(tmp_path), def_config, 1, tokenizer_mock())\n\n        assert temp_db_cursor.table_rows('location_property_tiger') == 0\n\n    @pytest.mark.asyncio\n    async def test_add_tiger_data_bad_file(self, def_config, temp_db_cursor, tokenizer_mock,\n                                           tmp_path):\n        sqlfile = tmp_path / '1010.csv'\n        sqlfile.write_text('Random text', encoding='utf-8')\n\n        await tiger_data.add_tiger_data(str(tmp_path), def_config, 1, tokenizer_mock())\n\n        assert temp_db_cursor.table_rows('location_property_tiger') == 0\n\n    @pytest.mark.asyncio\n    async def test_add_tiger_data_hnr_nan(self, def_config, temp_db_cursor, tokenizer_mock,\n                                          csv_factory, tmp_path):\n        csv_factory('file1', hnr_to=99)\n        csv_factory('file2', hnr_from='L12')\n        csv_factory('file3', hnr_to='12.4')\n\n        await tiger_data.add_tiger_data(str(tmp_path), def_config, 1, tokenizer_mock())\n\n        rows = temp_db_cursor.row_set(\"\"\"\n            SELECT startnumber, endnumber FROM location_property_tiger\"\"\")\n\n        assert rows == {(1, 99)}\n\n    @pytest.mark.parametrize(\"threads\", (1, 5))\n    @pytest.mark.asyncio\n    async def test_add_tiger_data_tarfile(self, def_config, temp_db_cursor, tokenizer_mock,\n                                          tmp_path, src_dir, threads):\n        tar = tarfile.open(str(tmp_path / 'sample.tar.gz'), \"w:gz\")\n        tar.add(str(src_dir / 'test' / 'testdb' / 'tiger' / '01001.csv'))\n        tar.close()\n\n        await tiger_data.add_tiger_data(str(tmp_path / 'sample.tar.gz'), def_config, threads,\n                                        tokenizer_mock())\n\n        assert temp_db_cursor.table_rows('location_property_tiger') == 6209\n\n    @pytest.mark.asyncio\n    async def test_add_tiger_data_bad_tarfile(self, def_config, tokenizer_mock, tmp_path):\n        tarfile = tmp_path / 'sample.tar.gz'\n        tarfile.write_text(\"\"\"Random text\"\"\", encoding='utf-8')\n\n        with pytest.raises(UsageError):\n            await tiger_data.add_tiger_data(str(tarfile), def_config, 1, tokenizer_mock())\n\n    @pytest.mark.asyncio\n    async def test_add_tiger_data_empty_tarfile(self, def_config, temp_db_cursor, tokenizer_mock,\n                                                tmp_path):\n        tar = tarfile.open(str(tmp_path / 'sample.tar.gz'), \"w:gz\")\n        tar.add(__file__)\n        tar.close()\n\n        await tiger_data.add_tiger_data(str(tmp_path / 'sample.tar.gz'), def_config, 1,\n                                        tokenizer_mock())\n\n        assert temp_db_cursor.table_rows('location_property_tiger') == 0\n"
  },
  {
    "path": "test/python/utils/test_centroid.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for centroid computation.\n\"\"\"\nimport pytest\n\nfrom nominatim_db.utils.centroid import PointsCentroid\n\n\ndef test_empty_set():\n    c = PointsCentroid()\n\n    with pytest.raises(ValueError, match='No points'):\n        c.centroid()\n\n\n@pytest.mark.parametrize(\"centroid\", [(0, 0), (-1, 3), [0.0000032, 88.4938]])\ndef test_one_point_centroid(centroid):\n    c = PointsCentroid()\n\n    c += centroid\n\n    assert len(c.centroid()) == 2\n    assert c.centroid() == (pytest.approx(centroid[0]), pytest.approx(centroid[1]))\n\n\ndef test_multipoint_centroid():\n    c = PointsCentroid()\n\n    c += (20.0, -10.0)\n    assert c.centroid() == (pytest.approx(20.0), pytest.approx(-10.0))\n    c += (20.2, -9.0)\n    assert c.centroid() == (pytest.approx(20.1), pytest.approx(-9.5))\n    c += (20.2, -9.0)\n    assert c.centroid() == (pytest.approx(20.13333), pytest.approx(-9.333333))\n\n\ndef test_manypoint_centroid():\n    c = PointsCentroid()\n\n    for _ in range(10000):\n        c += (4.564732, -0.000034)\n\n    assert c.centroid() == (pytest.approx(4.564732), pytest.approx(-0.000034))\n\n\n@pytest.mark.parametrize(\"param\", [\"aa\", None, 5, [1, 2, 3], (3, None), (\"a\", 3.9)])\ndef test_add_non_tuple(param):\n    c = PointsCentroid()\n\n    with pytest.raises(ValueError, match='2-element tuples'):\n        c += param\n"
  },
  {
    "path": "test/python/utils/test_json_writer.py",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C) 2025 by the Nominatim developer community.\n# For a full list of authors see the git log.\n\"\"\"\nTests for the streaming JSON writer.\n\"\"\"\nimport json\n\nimport pytest\n\nfrom nominatim_api.utils.json_writer import JsonWriter\n\n\n@pytest.mark.parametrize(\"inval,outstr\", [(None, 'null'),\n                                          (True, 'true'), (False, 'false'),\n                                          (23, '23'), (0, '0'), (-1.3, '-1.3'),\n                                          ('g\\nä', '\"g\\\\nä\"'), ('\"', '\"\\\\\\\"\"'),\n                                          ({}, '{}'), ([], '[]')])\ndef test_simple_value(inval, outstr):\n    writer = JsonWriter()\n    writer.value(inval)\n\n    assert writer() == outstr\n    json.loads(writer())\n\n\ndef test_empty_array():\n    writer = JsonWriter().start_array().end_array()\n\n    assert writer() == '[]'\n    json.loads(writer())\n\n\ndef test_array_with_single_value():\n    writer = JsonWriter().start_array().value(None).end_array()\n\n    assert writer() == '[null]'\n    json.loads(writer())\n\n\n@pytest.mark.parametrize(\"invals,outstr\", [((1, ), '[1]'),\n                                           (('a', 'b'), '[\"a\",\"b\"]')])\ndef test_array_with_data(invals, outstr):\n    writer = JsonWriter()\n\n    writer.start_array()\n    for ival in invals:\n        writer.value(ival).next()\n    writer.end_array()\n\n    assert writer() == outstr\n    json.loads(writer())\n\n\ndef test_empty_object():\n    writer = JsonWriter().start_object().end_object()\n\n    assert writer() == '{}'\n    json.loads(writer())\n\n\ndef test_object_single_entry():\n    writer = JsonWriter()\\\n                .start_object()\\\n                    .key('something')\\\n                    .value(5)\\\n                .end_object()\n\n    assert writer() == '{\"something\":5}'\n    json.loads(writer())\n\n\ndef test_object_many_values():\n    writer = JsonWriter()\\\n                .start_object()\\\n                    .keyval('foo', None)\\\n                    .keyval('bar', {})\\\n                    .keyval('baz', 'b\\taz')\\\n                .end_object()\n\n    assert writer() == '{\"foo\":null,\"bar\":{},\"baz\":\"b\\\\taz\"}'\n    json.loads(writer())\n\n\ndef test_object_many_values_without_none():\n    writer = JsonWriter()\\\n                .start_object()\\\n                    .keyval_not_none('foo', 0)\\\n                    .keyval_not_none('bar', None)\\\n                    .keyval_not_none('baz', '')\\\n                    .keyval_not_none('eve', False,\n                                     transform=lambda v: 'yes' if v else 'no')\\\n                .end_object()\n\n    assert writer() == '{\"foo\":0,\"baz\":\"\",\"eve\":\"no\"}'\n    json.loads(writer())\n\n\ndef test_raw_output():\n    writer = JsonWriter()\\\n                .start_array()\\\n                    .raw('{ \"nicely\": \"formatted here\" }').next()\\\n                    .value(1)\\\n                .end_array()\n\n    assert writer() == '[{ \"nicely\": \"formatted here\" },1]'\n"
  },
  {
    "path": "test/testdata/sp_csv_test.csv",
    "content": "phrase,class,type,operator,plural \nZip Lines,aerialway,zip_line,-,Y \nZip Line in,aerialway,zip_line,in,N \nZip Lines in,aerialway,zip_line,in,Y \nZip Line near,aerialway,zip_line,near,N \nZip Lines near,aerialway,zip_line,near,Y \nZip Wire,aerialway,zip_line,-,N \nZip Wires,aerialway,zip_line,-,Y \nZip Wire in,aerialway,zip_line,in,N \nZip Wires in,aerialway,zip_line,in,Y \nZip Wire near,aerialway,zip_line,near,N \nZip Wires near,aerialway,zip_line,near,Y \nZipline,aerialway,zip_line,-,N \nZiplines,aerialway,zip_line,-,Y \nZipline in,aerialway,zip_line,in,N \nZiplines in,aerialway,zip_line,in,Y \nZipline near,aerialway,zip_line,near,N \nZiplines near,aerialway,zip_line,near,Y \nZipwire,aerialway,zip_line,-,N \nZipwires,aerialway,zip_line,-,Y \nZipwires,aerialway,zip_line,name,Y \nZipwire in,aerialway,zip_line,in,N \nZipwires in,aerialway,zip_line,in,Y \nZipwire near,aerialway,zip_line,near,N \nZipwires near,aerialway,zip_line,near,Y \nAerodrome,aeroway,aerodrome,-,N \nAerodromes,aeroway,aerodrome,-,Y \nAerodrome in,aeroway,aerodrome,in,N \nAerodromes in,aeroway,aerodrome,in,Y \nAerodrome near,aeroway,aerodrome,near,N \nAerodromes near,aeroway,aerodrome,near,Y \nAirport,aeroway,aerodrome,-,N \nAirports,aeroway,aerodrome,-,Y \nAirport in,aeroway,aerodrome,in,N \nAirports in,aeroway,aerodrome,in,Y \nAirport near,aeroway,aerodrome,near,N \nAirports near,aeroway,aerodrome,near,Y \nBillboard,advertising,billboard,-,N \nBillboards,advertising,billboard,-,Y \nBillboard in,advertising,billboard,in,N \nBillboards in,advertising,billboard,in,Y \nBillboard near,advertising,billboard,near,N \nBillboards near,advertising,billboard,near,Y \n"
  },
  {
    "path": "test/testdata/special_phrases_test_content.txt",
    "content": "<mediawiki xmlns=\"http://www.mediawiki.org/xml/export-0.11/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.mediawiki.org/xml/export-0.11/ http://www.mediawiki.org/xml/export-0.11.xsd\" version=\"0.11\" xml:lang=\"en\">\n  <siteinfo>\n    <sitename>OpenStreetMap Wiki</sitename>\n    <dbname>wiki</dbname>\n    <base>https://wiki.openstreetmap.org/wiki/Main_Page</base>\n    <generator>MediaWiki 1.43.5</generator>\n    <case>first-letter</case>\n    <namespaces>\n      <namespace key=\"-2\" case=\"first-letter\">Media</namespace>\n      <namespace key=\"-1\" case=\"first-letter\">Special</namespace>\n      <namespace key=\"0\" case=\"first-letter\"/>\n      <namespace key=\"1\" case=\"first-letter\">Talk</namespace>\n      <namespace key=\"2\" case=\"first-letter\">User</namespace>\n      <namespace key=\"3\" case=\"first-letter\">User talk</namespace>\n      <namespace key=\"4\" case=\"first-letter\">Wiki</namespace>\n      <namespace key=\"5\" case=\"first-letter\">Wiki talk</namespace>\n      <namespace key=\"6\" case=\"first-letter\">File</namespace>\n      <namespace key=\"7\" case=\"first-letter\">File talk</namespace>\n      <namespace key=\"8\" case=\"first-letter\">MediaWiki</namespace>\n      <namespace key=\"9\" case=\"first-letter\">MediaWiki talk</namespace>\n      <namespace key=\"10\" case=\"first-letter\">Template</namespace>\n      <namespace key=\"11\" case=\"first-letter\">Template talk</namespace>\n      <namespace key=\"12\" case=\"first-letter\">Help</namespace>\n      <namespace key=\"13\" case=\"first-letter\">Help talk</namespace>\n      <namespace key=\"14\" case=\"first-letter\">Category</namespace>\n      <namespace key=\"15\" case=\"first-letter\">Category talk</namespace>\n      <namespace key=\"120\" case=\"first-letter\">Item</namespace>\n      <namespace key=\"121\" case=\"first-letter\">Item talk</namespace>\n      <namespace key=\"122\" case=\"first-letter\">Property</namespace>\n      <namespace key=\"123\" case=\"first-letter\">Property talk</namespace>\n      <namespace key=\"200\" case=\"first-letter\">DE</namespace>\n      <namespace key=\"201\" case=\"first-letter\">DE talk</namespace>\n      <namespace key=\"202\" case=\"first-letter\">FR</namespace>\n      <namespace key=\"203\" case=\"first-letter\">FR talk</namespace>\n      <namespace key=\"204\" case=\"first-letter\">ES</namespace>\n      <namespace key=\"205\" case=\"first-letter\">ES talk</namespace>\n      <namespace key=\"206\" case=\"first-letter\">IT</namespace>\n      <namespace key=\"207\" case=\"first-letter\">IT talk</namespace>\n      <namespace key=\"208\" case=\"first-letter\">NL</namespace>\n      <namespace key=\"209\" case=\"first-letter\">NL talk</namespace>\n      <namespace key=\"210\" case=\"first-letter\">RU</namespace>\n      <namespace key=\"211\" case=\"first-letter\">RU talk</namespace>\n      <namespace key=\"212\" case=\"first-letter\">JA</namespace>\n      <namespace key=\"213\" case=\"first-letter\">JA talk</namespace>\n      <namespace key=\"710\" case=\"first-letter\">TimedText</namespace>\n      <namespace key=\"711\" case=\"first-letter\">TimedText talk</namespace>\n      <namespace key=\"828\" case=\"first-letter\">Module</namespace>\n      <namespace key=\"829\" case=\"first-letter\">Module talk</namespace>\n      <namespace key=\"3000\" case=\"first-letter\">Proposal</namespace>\n      <namespace key=\"3001\" case=\"first-letter\">Proposal talk</namespace>\n    </namespaces>\n  </siteinfo>\n  <page>\n    <title>Nominatim/Special Phrases/EN</title>\n    <ns>0</ns>\n    <id>67365</id>\n    <revision>\n      <id>2861977</id>\n      <parentid>2634159</parentid>\n      <timestamp>2025-06-02T14:00:52Z</timestamp>\n      <contributor>\n        <username>Lonvia</username>\n        <id>17191</id>\n      </contributor>\n      <comment>overgeneralized entry removed, phrases need to chosen so that all results with the given tag can be described with that phrase</comment>\n      <origin>2861977</origin>\n      <model>wikitext</model>\n      <format>text/x-wiki</format>\n      <text bytes=\"160765\" sha1=\"0zlpuvnjs4io9e006rntbxm5b84kgst\" xml:space=\"preserve\">== en ==\n{| class=\"wikitable sortable\"\n|-\n! Word / Phrase !! Key !! Value !! Operator !! Plural\n|-\n| Zip Line || aerialway || zip_line || - || N\n|-\n| Zip Lines || aerialway || zip_line || - || Y\n|-\n| Zip Line in || aerialway || zip_line || in || N\n|-\n| Zip Lines in || aerialway || zip_line || in || Y\n|-\n| Zip Line near || aerialway || zip_line || near || N\n|-\n| Animal shelter || amenity || animal_shelter || - || N\n|-\n| Animal shelters || amenity || animal_shelter || - || Y\n|-\n| Animal shelter in || amenity || animal_shelter || in || N\n|-\n| Animal shelters in || amenity || animal_shelter || in || Y\n|-\n| Animal shelter near || amenity || animal_shelter || near|| N\n|-\n| Animal shelters near || amenity || animal_shelter || NEAR|| Y\n|-\n| Drinking Water near || amenity || drinking_water || near || N\n|-\n| Water || amenity || drinking_water || - || N\n|-\n| Water in || amenity || drinking_water || In || N\n|-\n| Water near || amenity || drinking_water || near || N\n|-\n| Embassy || amenity || embassy || - || N\n|-\n| Embassys || amenity || \"embassy\" || - || Y\n|-\n| Embassies || amenity || embassy || - || Y\n|-\n| Coworkings near\n| amenity\n| coworking_space\n| near\n| Y\n|}\n[[Category:Word list]]</text>\n      <sha1>0zlpuvnjs4io9e006rntbxm5b84kgst</sha1>\n    </revision>\n  </page>\n</mediawiki>\n"
  },
  {
    "path": "test/testdb/additional_api_test.data.osm",
    "content": "<?xml version='1.0' encoding='UTF-8'?>\n<osm version=\"0.6\" upload=\"false\" generator=\"osmium/1.10.0\">\n  <node id=\"1\" lat=\"47.11855\" lon=\"9.5697463\">\n    <tag k=\"addr:housenumber\" v=\"1001\"/>\n  </node>\n  <node id=\"2\" lat=\"47.1185372\" lon=\"9.5719698\">\n    <tag k=\"addr:housenumber\" v=\"1051\"/>\n  </node>\n  <node id=\"3\" lat=\"47.13288\" lon=\"9.55267\">\n    <tag k=\"addr:housenumber\" v=\"6\"/>\n    <tag k=\"addr:place\" v=\"Silum\" />\n  </node>\n  <node id=\"4\" lat=\"47.122487032\" lon=\"9.554483093\">\n    <tag k=\"addr:housenumber\" v=\"0\"/>\n    <tag k=\"addr:street\" v=\"Gnalpstrasse\" />\n  </node>\n  <way id=\"1\">\n    <nd ref=\"1\"/>\n    <nd ref=\"2\"/>\n    <tag k=\"addr:interpolation\" v=\"odd\"/>\n  </way>\n</osm>\n"
  },
  {
    "path": "test/testdb/full_en_phrases_test.csv",
    "content": "phrase,class,type,operator,plural\nZip Line,aerialway,zip_line,-,N \nZip Lines,aerialway,zip_line,-,Y \nZip Line in,aerialway,zip_line,in,N \nZip Lines in,aerialway,zip_line,in,Y \nZip Line near,aerialway,zip_line,near,N \nZip Lines near,aerialway,zip_line,near,Y \nZip Wire,aerialway,zip_line,-,N \nZip Wires,aerialway,zip_line,-,Y \nZip Wire in,aerialway,zip_line,in,N \nZip Wires in,aerialway,zip_line,in,Y \nZip Wire near,aerialway,zip_line,near,N \nZip Wires near,aerialway,zip_line,near,Y \nZipline,aerialway,zip_line,-,N \nZiplines,aerialway,zip_line,-,Y \nZipline in,aerialway,zip_line,in,N \nZiplines in,aerialway,zip_line,in,Y \nZipline near,aerialway,zip_line,near,N \nZiplines near,aerialway,zip_line,near,Y \nZipwire,aerialway,zip_line,-,N \nZipwires,aerialway,zip_line,-,Y \nZipwire in,aerialway,zip_line,in,N \nZipwires in,aerialway,zip_line,in,Y \nZipwire near,aerialway,zip_line,near,N \nZipwires near,aerialway,zip_line,near,Y \nAerodrome,aeroway,aerodrome,-,N \nAerodromes,aeroway,aerodrome,-,Y \nAerodrome in,aeroway,aerodrome,in,N \nAerodromes in,aeroway,aerodrome,in,Y \nAerodrome near,aeroway,aerodrome,near,N \nAerodromes near,aeroway,aerodrome,near,Y \nAirport,aeroway,aerodrome,-,N \nAirports,aeroway,aerodrome,-,Y \nAirport in,aeroway,aerodrome,in,N \nAirports in,aeroway,aerodrome,in,Y \nAirport near,aeroway,aerodrome,near,N \nAirports near,aeroway,aerodrome,near,Y \nBillboard,advertising,billboard,-,N \nBillboards,advertising,billboard,-,Y \nBillboard in,advertising,billboard,in,N \nBillboards in,advertising,billboard,in,Y \nBillboard near,advertising,billboard,near,N \nBillboards near,advertising,billboard,near,Y \nHoarding,advertising,billboard,-,N \nHoardings,advertising,billboard,-,Y \nHoarding in,advertising,billboard,in,N \nHoardings in,advertising,billboard,in,Y \nHoarding near,advertising,billboard,near,N \nHoardings near,advertising,billboard,near,Y \nAdvertising column,advertising,column,-,N \nAdvertising columns,advertising,column,-,Y \nAdvertising column in,advertising,column,in,N \nAdvertising columns in,advertising,column,in,Y \nAdvertising column near,advertising,column,near,N \nAdvertising columns near,advertising,column,near,Y \nLitfass column,advertising,column,-,N \nLitfass columns,advertising,column,-,Y \nLitfass column in,advertising,column,in,N \nLitfass columns in,advertising,column,in,Y \nLitfass column near,advertising,column,near,N \nLitfass columns near,advertising,column,near,Y \nMorris column,advertising,column,-,N \nMorris columns,advertising,column,-,Y \nMorris column in,advertising,column,in,N \nMorris columns in,advertising,column,in,Y \nMorris column near,advertising,column,near,N \nMorris columns near,advertising,column,near,Y \nAnimal boarding facility,amenity,animal_boarding,-,N \nAnimal boarding facilities,amenity,animal_boarding,-,Y \nAnimal boarding facility in,amenity,animal_boarding,in,N \nAnimal boarding facilities in,amenity,animal_boarding,in,Y \nAnimal boarding facility near,amenity,animal_boarding,near,N \nAnimal boarding facilities near,amenity,animal_boarding,near,Y \nAnimal shelter,amenity,animal_shelter,-,N \nAnimal shelters,amenity,animal_shelter,-,Y \nAnimal shelter in,amenity,animal_shelter,in,N \nAnimal shelters in,amenity,animal_shelter,in,Y \nAnimal shelter near,amenity,animal_shelter,near,N \nAnimal shelters near,amenity,animal_shelter,near,Y \nArts Centre,amenity,arts_centre,-,N \nArts Centres,amenity,arts_centre,-,Y \nArts Centre in,amenity,arts_centre,in,N \nArts Centres in,amenity,arts_centre,in,Y \nArts Centre near,amenity,arts_centre,near,N \nArts Centres near,amenity,arts_centre,near,Y \nArts Center,amenity,arts_centre,-,N \nArts Centers,amenity,arts_centre,-,Y \nArts Center in,amenity,arts_centre,in,N \nArts Centers in,amenity,arts_centre,in,Y \nArts Center near,amenity,arts_centre,near,N \nArts Centers near,amenity,arts_centre,near,Y \nATM,amenity,atm,-,N \nATMs,amenity,atm,-,Y \nATM in,amenity,atm,in,N \nATMs in,amenity,atm,in,Y \nATM near,amenity,atm,near,N \nATMs near,amenity,atm,near,Y \ncash,amenity,atm,-,N \ncash,amenity,atm,-,Y \ncash in,amenity,atm,in,N \ncash in,amenity,atm,in,Y \ncash near,amenity,atm,near,N \ncash near,amenity,atm,near,Y \ncash machine,amenity,atm,-,N \ncash machines,amenity,atm,-,Y \ncash machine in,amenity,atm,in,N \ncash machines in,amenity,atm,in,Y \ncash machine near,amenity,atm,near,N \ncash machines near,amenity,atm,near,Y \nBank,amenity,bank,-,N \nBanks,amenity,bank,-,Y \nBank in,amenity,bank,in,N \nBanks in,amenity,bank,in,Y \nBank near,amenity,bank,near,N \nBanks near,amenity,bank,near,Y \nBar,amenity,bar,-,N \nBars,amenity,bar,-,Y \nBar in,amenity,bar,in,N \nBars in,amenity,bar,in,Y \nBar near,amenity,bar,near,N \nBars near,amenity,bar,near,Y \nBar,amenity,pub,-,N \nBars,amenity,pub,-,Y \nBar in,amenity,pub,in,N \nBars in,amenity,pub,in,Y \nBar near,amenity,pub,near,N \nBars near,amenity,pub,near,Y \nBarbecue,amenity,bbq,-,N \nBarbecues,amenity,bbq,-,Y \nBarbecue in,amenity,bbq,in,N \nBarbecues in,amenity,bbq,in,Y \nBarbecue near,amenity,bbq,near,N \nBarbecues near,amenity,bbq,near,Y \nBarbecue grill,amenity,bbq,-,N \nBarbecue grills,amenity,bbq,-,Y \nBarbecue grill in,amenity,bbq,in,N \nBarbecue grills in,amenity,bbq,in,Y \nBarbecue grill near,amenity,bbq,near,N \nBarbecue grills near,amenity,bbq,near,Y \nBbq,amenity,bbq,-,N \nBbqs,amenity,bbq,-,Y \nBbq in,amenity,bbq,in,N \nBbqs in,amenity,bbq,in,Y \nBbq near,amenity,bbq,near,N \nBbqs near,amenity,bbq,near,Y \nBench,amenity,bench,-,N \nBenches,amenity,bench,-,Y \nBench in,amenity,bench,in,N \nBenches in,amenity,bench,in,Y \nBench near,amenity,bench,near,N \nBenches near,amenity,bench,near,Y \nCycle Parking,amenity,bicycle_parking,-,N \nCycle Parkings,amenity,bicycle_parking,-,Y \nCycle Parking in,amenity,bicycle_parking,in,N \nCycle Parkings in,amenity,bicycle_parking,in,Y \nCycle Parking near,amenity,bicycle_parking,near,N \nCycle Parkings near,amenity,bicycle_parking,near,Y \nCycle Rental,amenity,bicycle_rental,-,N \nCycle Rentals,amenity,bicycle_rental,-,Y \nCycle Rental in,amenity,bicycle_rental,in,N \nCycle Rentals in,amenity,bicycle_rental,in,Y \nCycle Rental near,amenity,bicycle_rental,near,N \nCycle Rentals near,amenity,bicycle_rental,near,Y \nBicycle Parking,amenity,bicycle_parking,-,N \nBicycle Parkings,amenity,bicycle_parking,-,Y \nBicycle Parking in,amenity,bicycle_parking,in,N \nBicycle Parkings in,amenity,bicycle_parking,in,Y \nBicycle Parking near,amenity,bicycle_parking,near,N \nBicycle Parkings near,amenity,bicycle_parking,near,Y \nBicycle Rental,amenity,bicycle_rental,-,N \nBicycle Rentals,amenity,bicycle_rental,-,Y \nBicycle Rental in,amenity,bicycle_rental,in,N \nBicycle Rentals in,amenity,bicycle_rental,in,Y \nBicycle Rental near,amenity,bicycle_rental,near,N \nBicycle Rentals near,amenity,bicycle_rental,near,Y \nBeer garden,amenity,biergarten,-,N \nBeer gardens,amenity,biergarten,-,Y \nBeer garden in,amenity,biergarten,in,N \nBeer gardens in,amenity,biergarten,in,Y \nBeer garden near,amenity,biergarten,near,N \nBeer gardens near,amenity,biergarten,near,Y \nBrothel,amenity,brothel,-,N \nBrothels,amenity,brothel,-,Y \nBrothel in,amenity,brothel,in,N \nBrothels in,amenity,brothel,in,Y \nBrothel near,amenity,brothel,near,N \nBrothels near,amenity,brothel,near,Y \nBureau de Change,amenity,bureau_de_change,-,N \nBureau de Changes,amenity,bureau_de_change,-,Y \nBureaus de Change,amenity,bureau_de_change,-,Y \nBureau de Change in,amenity,bureau_de_change,in,N \nBureau de Changes in,amenity,bureau_de_change,in,Y \nBureaus de Change in,amenity,bureau_de_change,in,Y \nBureau de Change near,amenity,bureau_de_change,near,N \nBureau de Changes near,amenity,bureau_de_change,near,Y \nBureaus de Change near,amenity,bureau_de_change,near,Y \nBus Station,amenity,bus_station,-,N \nBus Stations,amenity,bus_station,-,Y \nBus Station in,amenity,bus_station,in,N \nBus Stations in,amenity,bus_station,in,Y \nBus Station near,amenity,bus_station,near,N \nBus Stations near,amenity,bus_station,near,Y \nCafe,amenity,cafe,-,N \nCafes,amenity,cafe,-,Y \nCafe in,amenity,cafe,in,N \nCafes in,amenity,cafe,in,Y \nCafe near,amenity,cafe,near,N \nCafes near,amenity,cafe,near,Y \nCar Rental,amenity,car_rental,-,N \nCar Rentals,amenity,car_rental,-,Y \nCar Rental in,amenity,car_rental,in,N \nCar Rentals in,amenity,car_rental,in,Y \nCar Rental near,amenity,car_rental,near,N \nCar Rentals near,amenity,car_rental,near,Y \nCar Share,amenity,car_sharing,-,N \nCar Sharing,amenity,car_sharing,-,N \nCar Sharings,amenity,car_sharing,-,Y \nCar Share in,amenity,car_sharing,in,N \nCar Sharing in,amenity,car_sharing,in,N \nCar Sharings in,amenity,car_sharing,in,Y \nCar Share near,amenity,car_sharing,near,N \nCar Sharing near,amenity,car_sharing,near,N \nCar Sharings near,amenity,car_sharing,near,Y \nCar Wash,amenity,car_wash,-,N \nCar Washes,amenity,car_wash,-,Y \nCar Wash in,amenity,car_wash,in,N \nCar Washes in,amenity,car_wash,in,Y \nCar Wash near,amenity,car_wash,near,N \nCar Washes near,amenity,car_wash,near,Y \nCasino,amenity,casino,-,N \nCasinos,amenity,casino,-,Y \nCasino in,amenity,casino,in,N \nCasinos in,amenity,casino,in,Y \nCasino near,amenity,casino,near,N \nCasinos near,amenity,casino,near,Y \nCharging station,amenity,charging_station,-,N \nCharging stations,amenity,charging_station,-,Y \nCharging station in,amenity,charging_station,in,N \nCharging stations in,amenity,charging_station,in,Y \nCharging station near,amenity,charging_station,near,N \nCharging stations near,amenity,charging_station,near,Y \nCinema,amenity,cinema,-,N \nCinemas,amenity,cinema,-,Y \nCinema in,amenity,cinema,in,N \nCinemas in,amenity,cinema,in,Y \nCinema near,amenity,cinema,near,N \nCinemas near,amenity,cinema,near,Y \nClinic,amenity,clinic,-,N \nClinics,amenity,clinic,-,Y \nClinic in,amenity,clinic,in,N \nClinics in,amenity,clinic,in,Y \nClinic near,amenity,clinic,near,N \nClinics near,amenity,clinic,near,Y \nCollege,amenity,college,-,N \nColleges,amenity,college,-,Y \nCollege in,amenity,college,in,N \nColleges in,amenity,college,in,Y \nCollege near,amenity,college,near,N \nColleges near,amenity,college,near,Y \nConference Centre,amenity,conference_centre,-,N \nConference Centres,amenity,conference_centre,-,Y \nConference Centre in,amenity,conference_centre,in,N \nConference Centres in,amenity,conference_centre,in,Y \nConference Centre near,amenity,conference_centre,near,N \nConference Centres near,amenity,conference_centre,near,Y \nConference Center,amenity,conference_centre,-,N \nConference Centers,amenity,conference_centre,-,Y \nConference Center in,amenity,conference_centre,in,N \nConference Centers in,amenity,conference_centre,in,Y \nConference Center near,amenity,conference_centre,near,N \nConference Centers near,amenity,conference_centre,near,Y \nCommunity Centre,amenity,community_centre,-,N \nCommunity Centres,amenity,community_centre,-,Y \nCommunity Centre in,amenity,community_centre,in,N \nCommunity Centres in,amenity,community_centre,in,Y \nCommunity Centre near,amenity,community_centre,near,N \nCommunity Centres near,amenity,community_centre,near,Y \nCommunity Center,amenity,community_centre,-,N \nCommunity Centers,amenity,community_centre,-,Y \nCommunity Center in,amenity,community_centre,in,N \nCommunity Centers in,amenity,community_centre,in,Y \nCommunity Center near,amenity,community_centre,near,N \nCommunity Centers near,amenity,community_centre,near,Y \nCourthouse,amenity,courthouse,-,N \nCourthouses,amenity,courthouse,-,Y \nCourthouse in,amenity,courthouse,in,N \nCourthouses in,amenity,courthouse,in,Y \nCourthouse near,amenity,courthouse,near,N \nCourthouses near,amenity,courthouse,near,Y \nCrematorium,amenity,crematorium,-,N \nCrematoriums,amenity,crematorium,-,Y \nCrematorium in,amenity,crematorium,in,N \nCrematoriums in,amenity,crematorium,in,Y \nCrematorium near,amenity,crematorium,near,N \nCrematoriums near,amenity,crematorium,near,Y \nDentist,amenity,dentist,-,N \nDentists,amenity,dentist,-,Y \nDentist in,amenity,dentist,in,N \nDentists in,amenity,dentist,in,Y \nDentist near,amenity,dentist,near,N \nDentists near,amenity,dentist,near,Y \nDoctor,amenity,doctors,-,N \nDoctors,amenity,doctors,-,Y \nDoctor in,amenity,doctors,in,N \nDoctors in,amenity,doctors,in,Y \nDoctor near,amenity,doctors,near,N \nDoctors near,amenity,doctors,near,Y \nMartial Arts,amenity,dojo,-,N \nMartial Arts,amenity,dojo,-,Y \nMartial Arts in,amenity,dojo,in,N \nMartial Arts in,amenity,dojo,in,Y \nMartial Arts near,amenity,dojo,near,N \nMartial Arts near,amenity,dojo,near,Y \nDojo,amenity,dojo,-,N \nDojos,amenity,dojo,-,Y \nDojo in,amenity,dojo,in,N \nDojos in,amenity,dojo,in,Y \nDojo near,amenity,dojo,near,N \nDojos near,amenity,dojo,near,Y \nDojang,amenity,dojo,-,N \nDojang,amenity,dojo,-,Y \nDojang in,amenity,dojo,in,N \nDojang in,amenity,dojo,in,Y \nDojang near,amenity,dojo,near,N \nDojang near,amenity,dojo,near,Y \nDrinking Water,amenity,drinking_water,-,N \nDrinking Water in,amenity,drinking_water,in,N \nDrinking Water near,amenity,drinking_water,near,N \nWater,amenity,drinking_water,-,N \nWater in,amenity,drinking_water,in,N \nWater near,amenity,drinking_water,near,N \nDriving School,amenity,driving_school,-,N \nDriving Schools,amenity,driving_school,-,Y \nDriving School in,amenity,driving_school,in,N \nDriving Schools in,amenity,driving_school,in,Y \nDriving School near,amenity,driving_school,near,N \nDriving Schools near,amenity,driving_school,near,Y \nEmbassy,amenity,embassy,-,N \nEmbassys,amenity,embassy,-,Y \nEmbassies,amenity,embassy,-,Y \nEmbassy in,amenity,embassy,in,N \nEmbassys in,amenity,embassy,in,Y \nEmbassies in,amenity,embassy,in,Y \nEmbassy near,amenity,embassy,near,N \nEmbassys near,amenity,embassy,near,Y \nEmbassies near,amenity,embassy,near,Y \nFast Food,amenity,fast_food,-,N \nFast Food in,amenity,fast_food,in,N \nFast Food near,amenity,fast_food,near,N \nFood,amenity,restaurant,-,N \nFood,amenity,fast_food,-,N \nFood,amenity,restaurant,-,Y \nFood,amenity,fast_food,-,Y \nFood in,amenity,restaurant,in,N \nFood in,amenity,fast_food,in,N \nFood in,amenity,restaurant,in,Y \nFood in,amenity,fast_food,in,Y \nFood near,amenity,restaurant,near,N \nFood near,amenity,fast_food,near,N \nFood near,amenity,restaurant,near,Y \nFood near,amenity,fast_food,near,Y \nFerry Terminal,amenity,ferry_terminal,-,N \nFerry Terminals,amenity,ferry_terminal,-,Y \nFerry Terminal in,amenity,ferry_terminal,in,N \nFerry Terminals in,amenity,ferry_terminal,in,Y \nFerry Terminal near,amenity,ferry_terminal,near,N \nFerry Terminals near,amenity,ferry_terminal,near,Y \nFire Station,amenity,fire_station,-,N \nFire Stations,amenity,fire_station,-,Y \nFire Station in,amenity,fire_station,in,N \nFire Stations in,amenity,fire_station,in,Y \nFire Station near,amenity,fire_station,near,N \nFire Stations near,amenity,fire_station,near,Y \nFountain,amenity,fountain,-,N \nFountains,amenity,fountain,-,Y \nFountain in,amenity,fountain,in,N \nFountains in,amenity,fountain,in,Y \nFountain near,amenity,fountain,near,N \nFountains near,amenity,fountain,near,Y \nFuel,amenity,fuel,-,N \nFuels,amenity,fuel,-,Y \nFuel in,amenity,fuel,in,N \nFuels in,amenity,fuel,in,Y \nFuel near,amenity,fuel,near,N \nFuels near,amenity,fuel,near,Y \nFuel Station,amenity,fuel,-,N \nFuel Stations,amenity,fuel,-,Y \nFuel Station in,amenity,fuel,in,N \nFuel Stations in,amenity,fuel,in,Y \nFuel Station near,amenity,fuel,near,N \nFuel Stations near,amenity,fuel,near,Y \nGas,amenity,fuel,-,N \nGas,amenity,fuel,-,Y \nGas in,amenity,fuel,in,N \nGas in,amenity,fuel,in,Y \nGas near,amenity,fuel,near,N \nGas near,amenity,fuel,near,Y \nGas Station,amenity,fuel,-,N \nGas Stations,amenity,fuel,-,Y \nGas Station in,amenity,fuel,in,N \nGas Stations in,amenity,fuel,in,Y \nGas Station near,amenity,fuel,near,N \nGas Stations near,amenity,fuel,near,Y \nPetrol,amenity,fuel,-,N \nPetrol in,amenity,fuel,in,N \nPetrol near,amenity,fuel,near,N \nPetrol Stations near,amenity,fuel,near,Y \nPetrol Station,amenity,fuel,-,N \nPetrol Stations,amenity,fuel,-,Y \nPetrol Station in,amenity,fuel,in,N \nPetrol Stations in,amenity,fuel,in,Y \nPetrol Station near,amenity,fuel,near,N \nPetrol Stations near,amenity,fuel,near,Y \nGrave Yard,amenity,grave_yard,-,N \nGrave Yards,amenity,grave_yard,-,Y \nGrave Yard in,amenity,grave_yard,in,N \nGrave Yards in,amenity,grave_yard,in,Y \nGrave Yard near,amenity,grave_yard,near,N \nGrave Yards near,amenity,grave_yard,near,Y \nGrit bin,amenity,grit_bin,-,N \nGrit bins,amenity,grit_bin,-,Y \nGrit bin in,amenity,grit_bin,in,N \nGrit bins in,amenity,grit_bin,in,Y \nGrit bin near,amenity,grit_bin,near,N \nGrit bins near,amenity,grit_bin,near,Y \nFitness Centre,amenity,gym,-,N \nFitness Centres,amenity,gym,-,Y \nFitness Centre in,amenity,gym,in,N \nFitness Centres in,amenity,gym,in,Y \nFitness Centre near,amenity,gym,near,N \nFitness Centres near,amenity,gym,near,Y \nFitness Center,amenity,gym,-,N \nFitness Centers,amenity,gym,-,Y \nFitness Center in,amenity,gym,in,N \nFitness Centers in,amenity,gym,in,Y \nFitness Center near,amenity,gym,near,N \nFitness Centers near,amenity,gym,near,Y \nGym,amenity,gym,-,N \nGyms,amenity,gym,-,Y \nGym in,amenity,gym,in,N \nGyms in,amenity,gym,in,Y \nGym near,amenity,gym,near,N \nGyms near,amenity,gym,near,Y \nHospital,amenity,hospital,-,N \nHospitals,amenity,hospital,-,Y \nHospital in,amenity,hospital,in,N \nHospitals in,amenity,hospital,in,Y \nHospital near,amenity,hospital,near,N \nHospitals near,amenity,hospital,near,Y \nHunting Stand,amenity,hunting_stand,-,N \nHunting Stands,amenity,hunting_stand,-,Y \nHunting Stand in,amenity,hunting_stand,in,N \nHunting Stands in,amenity,hunting_stand,in,Y \nHunting Stand near,amenity,hunting_stand,near,N \nHunting Stands near,amenity,hunting_stand,near,Y \nIce Cream,amenity,ice_cream,-,N \nIce Cream in,amenity,ice_cream,in,N \nIce Cream near,amenity,ice_cream,near,N \nKaraoke,amenity,karaoke_box,-,N \nKaraokes,amenity,karaoke_box,-,Y \nKaraoke in,amenity,karaoke_box,in,N \nKaraokes in,amenity,karaoke_box,in,Y \nKaraokes near,amenity,karaoke_box,near,Y \nKindergarten,amenity,kindergarten,-,N \nKindergartens,amenity,kindergarten,-,Y \nKindergarten in,amenity,kindergarten,in,N \nKindergartens in,amenity,kindergarten,in,Y \nKindergarten near,amenity,kindergarten,near,N \nKindergartens near,amenity,kindergarten,near,Y \nNursery,amenity,kindergarten,-,N \nNurserys,amenity,kindergarten,-,Y \nNurseries,amenity,kindergarten,-,Y \nNursery in,amenity,kindergarten,in,N \nNurserys in,amenity,kindergarten,in,Y \nNurseries in,amenity,kindergarten,in,Y \nNursery near,amenity,kindergarten,near,N \nNurserys near,amenity,kindergarten,near,Y \nNurseries near,amenity,kindergarten,near,Y \nNursery School,amenity,kindergarten,-,N \nNursery Schools,amenity,kindergarten,-,Y \nNursery School in,amenity,kindergarten,in,N \nNursery Schools in,amenity,kindergarten,in,Y \nNursery School near,amenity,kindergarten,near,N \nNursery Schools near,amenity,kindergarten,near,Y \nKneipp Basin,amenity,kneipp_water_cure,-,N \nKneipp Basins,amenity,kneipp_water_cure,-,Y \nKneipp Basin in,amenity,kneipp_water_cure,in,N \nKneipp Basins in,amenity,kneipp_water_cure,in,Y \nKneipp Basin near,amenity,kneipp_water_cure,near,N \nKneipp Basins near,amenity,kneipp_water_cure,near,Y \nKneipp Bath,amenity,kneipp_water_cure,-,N \nKneipp Baths,amenity,kneipp_water_cure,-,Y \nKneipp Bath in,amenity,kneipp_water_cure,in,N \nKneipp Baths in,amenity,kneipp_water_cure,in,Y \nKneipp Bath near,amenity,kneipp_water_cure,near,N \nKneipp Baths near,amenity,kneipp_water_cure,near,Y \nKneipp Facility,amenity,kneipp_water_cure,-,N \nKneipp Facilitys,amenity,kneipp_water_cure,-,Y \nKneipp Facilities,amenity,kneipp_water_cure,-,Y \nKneipp Facility in,amenity,kneipp_water_cure,in,N \nKneipp Facilitys in,amenity,kneipp_water_cure,in,Y \nKneipp Facilities in,amenity,kneipp_water_cure,in,Y \nKneipp Facility near,amenity,kneipp_water_cure,near,N \nKneipp Facilitys near,amenity,kneipp_water_cure,near,Y \nKneipp Facilities near,amenity,kneipp_water_cure,near,Y \nLibrary,amenity,library,-,N \nLibrarys,amenity,library,-,Y \nLibraries,amenity,library,-,Y \nLibrary in,amenity,library,in,N \nLibrarys in,amenity,library,in,Y \nLibraries in,amenity,library,in,Y \nLibrary near,amenity,library,near,N \nLibrarys near,amenity,library,near,Y \nLibraries near,amenity,library,near,Y \nMarketplace,amenity,marketplace,-,N \nMarketplaces,amenity,marketplace,-,Y \nMarketplace in,amenity,marketplace,in,N \nMarketplaces in,amenity,marketplace,in,Y \nMarketplace near,amenity,marketplace,near,N \nMarketplaces near,amenity,marketplace,near,Y \nMotorcycle parking,amenity,motorcycle_parking,-,N \nMotorcycle parkings,amenity,motorcycle_parking,-,Y \nMotorcycle parking in,amenity,motorcycle_parking,in,N \nMotorcycle parkings in,amenity,motorcycle_parking,in,Y \nMotorcycle parking near,amenity,motorcycle_parking,near,N \nMotorcycle parkings near,amenity,motorcycle_parking,near,Y \nNight Club,amenity,nightclub,-,N \nNight Clubs,amenity,nightclub,-,Y \nNight Club in,amenity,nightclub,in,N \nNight Clubs in,amenity,nightclub,in,Y \nNight Club near,amenity,nightclub,near,N \nNight Clubs near,amenity,nightclub,near,Y \nNursing Home,amenity,nursing_home,-,N \nNursing Homes,amenity,nursing_home,-,Y \nNursing Home in,amenity,nursing_home,in,N \nNursing Homes in,amenity,nursing_home,in,Y \nNursing Home near,amenity,nursing_home,near,N \nNursing Homes near,amenity,nursing_home,near,Y \nPharmacy,amenity,pharmacy,-,N \nPharmacys,amenity,pharmacy,-,Y \nPharmacies,amenity,pharmacy,-,Y \nPharmacy in,amenity,pharmacy,in,N \nPharmacys in,amenity,pharmacy,in,Y \nPharmacies in,amenity,pharmacy,in,Y \nPharmacy near,amenity,pharmacy,near,N \nPharmacys near,amenity,pharmacy,near,Y \nPharmacies near,amenity,pharmacy,near,Y \nParking,amenity,parking,-,N \nParkings,amenity,parking,-,Y \nParking in,amenity,parking,in,N \nParkings in,amenity,parking,in,Y \nParking near,amenity,parking,near,N \nParkings near,amenity,parking,near,Y \nChurch,amenity,place_of_worship,-,N \nChurches,amenity,place_of_worship,-,Y \nChurch in,amenity,place_of_worship,in,N \nChurches in,amenity,place_of_worship,in,Y \nChurch near,amenity,place_of_worship,near,N \nChurches near,amenity,place_of_worship,near,Y \nPlace of Worship,amenity,place_of_worship,-,N \nPlace of Worships,amenity,place_of_worship,-,Y \nPlaces of Worship,amenity,place_of_worship,-,Y \nPlace of Worship in,amenity,place_of_worship,in,N \nPlace of Worships in,amenity,place_of_worship,in,Y \nPlaces of Worship in,amenity,place_of_worship,in,Y \nPlace of Worship near,amenity,place_of_worship,near,N \nPlace of Worships near,amenity,place_of_worship,near,Y \nPlaces of Worship near,amenity,place_of_worship,near,Y \nPlanetarium,amenity,planetarium,-,N \nPlanetariums,amenity,planetarium,-,Y \nPlanetaria,amenity,planetarium,-,Y \nPlanetarium in,amenity,planetarium,in,N \nPlanetariums in,amenity,planetarium,in,Y \nPlanetaria in,amenity,planetarium,in,Y \nPlanetarium near,amenity,planetarium,near,N \nPlanetariums near,amenity,planetarium,near,Y \nPlanetaria near,amenity,planetarium,near,Y \nPolice,amenity,police,-,N \nPolice in,amenity,police,in,N \nPolice near,amenity,police,near,N \nPost Box,amenity,post_box,-,N \nPost Boxes,amenity,post_box,-,Y \nPost Box in,amenity,post_box,in,N \nPost Boxes in,amenity,post_box,in,Y \nPost Box near,amenity,post_box,near,N \nPost Boxes near,amenity,post_box,near,Y \nPost Office,amenity,post_office,-,N \nPost Offices,amenity,post_office,-,Y \nPost Office in,amenity,post_office,in,N \nPost Offices in,amenity,post_office,in,Y \nPost Office near,amenity,post_office,near,N \nPost Offices near,amenity,post_office,near,Y \nPrison,amenity,prison,-,N \nPrisons,amenity,prison,-,Y \nPrison in,amenity,prison,in,N \nPrisons in,amenity,prison,in,Y \nPrison near,amenity,prison,near,N \nPrisons near,amenity,prison,near,Y \nBookcase,amenity,public_bookcase,-,N \nBookcases,amenity,public_bookcase,-,Y \nBookcase in,amenity,public_bookcase,in,N \nBookcases in,amenity,public_bookcase,in,Y \nBookcase near,amenity,public_bookcase,near,N \nBookcases near,amenity,public_bookcase,near,Y \nPublic Bookcase,amenity,public_bookcase,-,N \nPublic Bookcases,amenity,public_bookcase,-,Y \nPublic Bookcase in,amenity,public_bookcase,in,N \nPublic Bookcases in,amenity,public_bookcase,in,Y \nPublic Bookcase near,amenity,public_bookcase,near,N \nPublic Bookcases near,amenity,public_bookcase,near,Y \nPub,amenity,bar,-,N \nPubs,amenity,bar,-,Y \nPub in,amenity,bar,in,N \nPubs in,amenity,bar,in,Y \nPub near,amenity,bar,near,N \nPubs near,amenity,bar,near,Y \nPub,amenity,pub,-,N \nPubs,amenity,pub,-,Y \nPub in,amenity,pub,in,N \nPubs in,amenity,pub,in,Y \nPub near,amenity,pub,near,N \nPubs near,amenity,pub,near,Y \nPublic Building,amenity,public_building,-,N \nPublic Buildings,amenity,public_building,-,Y \nPublic Building in,amenity,public_building,in,N \nPublic Buildings in,amenity,public_building,in,Y \nPublic Building near,amenity,public_building,near,N \nPublic Buildings near,amenity,public_building,near,Y \nRecycling Point,amenity,recycling,-,N \nRecycling Points,amenity,recycling,-,Y \nRecycling Point in,amenity,recycling,in,N \nRecycling Points in,amenity,recycling,in,Y \nRecycling Point near,amenity,recycling,near,N \nRecycling Points near,amenity,recycling,near,Y \nRecycling Station,amenity,recycling,-,N \nRecycling Stations,amenity,recycling,-,Y \nRecycling Station in,amenity,recycling,in,N \nRecycling Stations in,amenity,recycling,in,Y \nRecycling Station near,amenity,recycling,near,N \nRecycling Stations near,amenity,recycling,near,Y \nRestaurant,amenity,restaurant,-,N \nRestaurants,amenity,restaurant,-,Y \nRestaurant in,amenity,restaurant,in,N \nRestaurants in,amenity,restaurant,in,Y \nRestaurant near,amenity,restaurant,near,N \nRestaurants near,amenity,restaurant,near,Y \nRetirement Home,amenity,retirement_home,-,N \nRetirement Homes,amenity,retirement_home,-,Y \nRetirement Home in,amenity,retirement_home,in,N \nRetirement Homes in,amenity,retirement_home,in,Y \nRetirement Home near,amenity,retirement_home,near,N \nRetirement Homes near,amenity,retirement_home,near,Y \nSauna,amenity,sauna,-,N \nSaunas,amenity,sauna,-,Y \nSauna in,amenity,sauna,in,N \nSaunas in,amenity,sauna,in,Y \nSauna near,amenity,sauna,near,N \nSaunas near,amenity,sauna,near,Y \nSchool,amenity,school,-,N \nSchools,amenity,school,-,Y \nSchool in,amenity,school,in,N \nSchools in,amenity,school,in,Y \nSchool near,amenity,school,near,N \nSchools near,amenity,school,near,Y \nShelter,amenity,shelter,-,N \nShelters,amenity,shelter,-,Y \nShelter in,amenity,shelter,in,N \nShelters in,amenity,shelter,in,Y \nShelter near,amenity,shelter,near,N \nShelters near,amenity,shelter,near,Y \nStudio,amenity,studio,-,N \nStudios,amenity,studio,-,Y \nStudio in,amenity,studio,in,N \nStudios in,amenity,studio,in,Y \nStudio near,amenity,studio,near,N \nStudios near,amenity,studio,near,Y \nSwinger Club,amenity,swingerclub,-,N \nSwinger Clubs,amenity,swingerclub,-,Y \nSwinger Club in,amenity,swingerclub,in,N \nSwinger Clubs in,amenity,swingerclub,in,Y \nSwinger Club near,amenity,swingerclub,near,N \nSwinger Clubs near,amenity,swingerclub,near,Y \nTaxi,amenity,taxi,-,N \nTaxis,amenity,taxi,-,Y \nTaxi in,amenity,taxi,in,N \nTaxis in,amenity,taxi,in,Y \nTaxi near,amenity,taxi,near,N \nTaxis near,amenity,taxi,near,Y \nTaxi Rank,amenity,taxi,-,N \nTaxi Ranks,amenity,taxi,-,Y \nTaxi Rank in,amenity,taxi,in,N \nTaxi Ranks in,amenity,taxi,in,Y \nTaxi Rank near,amenity,taxi,near,N \nTaxi Ranks near,amenity,taxi,near,Y \nTelephone,amenity,telephone,-,N \nTelephones,amenity,telephone,-,Y \nTelephone in,amenity,telephone,in,N \nTelephones in,amenity,telephone,in,Y \nTelephone near,amenity,telephone,near,N \nTelephones near,amenity,telephone,near,Y \nPublic Telephone,amenity,telephone,-,N \nPublic Telephones,amenity,telephone,-,Y \nPublic Telephone in,amenity,telephone,in,N \nPublic Telephones in,amenity,telephone,in,Y \nPublic Telephone near,amenity,telephone,near,N \nPublic Telephones near,amenity,telephone,near,Y \nPhone Booth,amenity,telephone,-,N \nPhone Booths,amenity,telephone,-,Y \nPhone Booth in,amenity,telephone,in,N \nPhone Booths in,amenity,telephone,in,Y \nPhone Booth near,amenity,telephone,near,N \nPhone Booths near,amenity,telephone,near,Y \nTheatre,amenity,theatre,-,N \nTheatres,amenity,theatre,-,Y \nTheatre in,amenity,theatre,in,N \nTheatres in,amenity,theatre,in,Y \nTheatre near,amenity,theatre,near,N \nTheatres near,amenity,theatre,near,Y \nToilet,amenity,toilets,-,N \nToilets,amenity,toilets,-,Y \nToilet in,amenity,toilets,in,N \nToilets in,amenity,toilets,in,Y \nToilet near,amenity,toilets,near,N \nToilets near,amenity,toilets,near,Y \nTown Hall,amenity,townhall,-,N \nTown Halls,amenity,townhall,-,Y \nTown Hall in,amenity,townhall,in,N \nTown Halls in,amenity,townhall,in,Y \nTown Hall near,amenity,townhall,near,N \nTown Halls near,amenity,townhall,near,Y \nUniversity,amenity,university,-,N \nUniversitys,amenity,university,-,Y \nUniversities,amenity,university,-,Y \nUniversity in,amenity,university,in,N \nUniversitys in,amenity,university,in,Y \nUniversities in,amenity,university,in,Y \nUniversity near,amenity,university,near,N \nUniversitys near,amenity,university,near,Y \nUniversities near,amenity,university,near,Y \nVending Machine,amenity,vending_machine,-,N \nVending Machines,amenity,vending_machine,-,Y \nVending Machine in,amenity,vending_machine,in,N \nVending Machines in,amenity,vending_machine,in,Y \nVending Machine near,amenity,vending_machine,near,N \nVending Machines near,amenity,vending_machine,near,Y \nVeterinary Surgery,amenity,veterinary,-,N \nVeterinary Surgeries,amenity,veterinary,-,Y \nVeterinary Surgery in,amenity,veterinary,in,N \nVeterinary Surgeries in,amenity,veterinary,in,Y \nVeterinary Surgery near,amenity,veterinary,near,N \nVeterinary Surgeries near,amenity,veterinary,near,Y \nWaste Basket,amenity,waste_basket,-,N \nWaste Baskets,amenity,waste_basket,-,Y \nWaste Basket in,amenity,waste_basket,in,N \nWaste Baskets in,amenity,waste_basket,in,Y \nWaste Basket near,amenity,waste_basket,near,N \nWaste Baskets near,amenity,waste_basket,near,Y \nRubbish Bin,amenity,waste_basket,-,N \nRubbish Bins,amenity,waste_basket,-,Y \nRubbish Bin in,amenity,waste_basket,in,N \nRubbish Bins in,amenity,waste_basket,in,Y \nRubbish Bin near,amenity,waste_basket,near,N \nRubbish Bins near,amenity,waste_basket,near,Y \nBin,amenity,waste_basket,-,N \nBins,amenity,waste_basket,-,Y \nBin in,amenity,waste_basket,in,N \nBins in,amenity,waste_basket,in,Y \nBin near,amenity,waste_basket,near,N \nBins near,amenity,waste_basket,near,Y \nMural,artwork_type,mural,-,N \nMurals,artwork_type,mural,-,Y \nMural in,artwork_type,mural,in,N \nMurals in,artwork_type,mural,in,Y \nMural near,artwork_type,mural,near,N \nMurals near,artwork_type,mural,near,Y \nSculpture,artwork_type,sculpture,-,N \nSculptures,artwork_type,sculpture,-,Y \nSculpture in,artwork_type,sculpture,in,N \nSculptures in,artwork_type,sculpture,in,Y \nSculpture near,artwork_type,sculpture,near,N \nSculptures near,artwork_type,sculpture,near,Y \nStatue,artwork_type,statue,-,N \nStatues,artwork_type,statue,-,Y \nStatue in,artwork_type,statue,in,N \nStatues in,artwork_type,statue,in,Y \nStatue near,artwork_type,statue,near,N \nStatues near,artwork_type,statue,near,Y \nATM,atm,yes,-,N \nATMs,atm,yes,-,Y \nATM in,atm,yes,in,N \nATMs in,atm,yes,in,Y \nATM near,atm,yes,near,N \nATMs near,atm,yes,near,Y \nNational Park,boundary,national_park,-,N \nNational Parks,boundary,national_park,-,Y \nNational Park in,boundary,national_park,in,N \nNational Parks in,boundary,national_park,in,Y \nNational Park near,boundary,national_park,near,N \nNational Parks near,boundary,national_park,near,Y \nApartment Block,building,apartments,-,N \nApartment Blocks,building,apartments,-,Y \nApartment Block in,building,apartments,in,N \nApartment Blocks in,building,apartments,in,Y \nApartment Block near,building,apartments,near,N \nApartment Blocks near,building,apartments,near,Y \nBuilding Block,building,block,-,N \nBuilding Blocks,building,block,-,Y \nBuilding Block in,building,block,in,N \nBuilding Blocks in,building,block,in,Y \nBuilding Block near,building,block,near,N \nBuilding Blocks near,building,block,near,Y \nBunker,building,bunker,-,N \nBunkers,building,bunker,-,Y \nBunker in,building,bunker,in,N \nBunkers in,building,bunker,in,Y \nBunker near,building,bunker,near,N \nBunkers near,building,bunker,near,Y \nCathedral,building,cathedral,-,N \nCathedrals,building,cathedral,-,Y \nCathedral in,building,cathedral,in,N \nCathedrals in,building,cathedral,in,Y \nCathedral near,building,cathedral,near,N \nCathedrals near,building,cathedral,near,Y \nChapel,building,chapel,-,N \nChapels,building,chapel,-,Y \nChapel in,building,chapel,in,N \nChapels in,building,chapel,in,Y \nChapel near,building,chapel,near,N \nChapels near,building,chapel,near,Y \nChurch,building,church,-,N \nChurchs,building,church,-,Y \nChurches,building,church,-,Y \nChurch in,building,church,in,N \nChurchs in,building,church,in,Y \nChurches in,building,church,in,Y \nChurch near,building,church,near,N \nChurchs near,building,church,near,Y \nChurches near,building,church,near,Y \nCity Hall,building,city_hall,-,N \nCity Halls,building,city_hall,-,Y \nCity Hall in,building,city_hall,in,N \nCity Halls in,building,city_hall,in,Y \nCity Hall near,building,city_hall,near,N \nCity Halls near,building,city_hall,near,Y \nCivic Building,building,civic,-,N \nCivic Buildings,building,civic,-,Y \nCivic Building in,building,civic,in,N \nCivic Buildings in,building,civic,in,Y \nCivic Building near,building,civic,near,N \nCivic Buildings near,building,civic,near,Y \nCommercial Building,building,commercial,-,N \nCommercial Buildings,building,commercial,-,Y \nCommercial Building in,building,commercial,in,N \nCommercial Buildings in,building,commercial,in,Y \nCommercial Building near,building,commercial,near,N \nCommercial Buildings near,building,commercial,near,Y \nDormitory,building,dormitory,-,N \nDormitorys,building,dormitory,-,Y \nDormitory in,building,dormitory,in,N \nDormitorys in,building,dormitory,in,Y \nDormitory near,building,dormitory,near,N \nDormitorys near,building,dormitory,near,Y \nBuilding Entrance,building,entrance,-,N \nBuilding Entrances,building,entrance,-,Y \nBuilding Entrance in,building,entrance,in,N \nBuilding Entrances in,building,entrance,in,Y \nBuilding Entrance near,building,entrance,near,N \nBuilding Entrances near,building,entrance,near,Y \nFaculty Building,building,faculty,-,N \nFaculty Buildings,building,faculty,-,Y \nFaculty Building in,building,faculty,in,N \nFaculty Buildings in,building,faculty,in,Y \nFaculty Building near,building,faculty,near,N \nFaculty Buildings near,building,faculty,near,Y \nFarm Building,building,farm_auxiliary,-,N \nFarm Buildings,building,farm_auxiliary,-,Y \nFarm Building in,building,farm_auxiliary,in,N \nFarm Buildings in,building,farm_auxiliary,in,Y \nFarm Building near,building,farm_auxiliary,near,N \nFarm Buildings near,building,farm_auxiliary,near,Y \nFarm Building,building,farm,-,N \nFarm Buildings,building,farm,-,Y \nFarm Building in,building,farm,in,N \nFarm Buildings in,building,farm,in,Y \nFarm Building near,building,farm,near,N \nFarm Buildings near,building,farm,near,Y \nFlats,building,flats,-,N \nFlats,building,flats,-,Y \nFlats in,building,flats,in,N \nFlats in,building,flats,in,Y \nFlats near,building,flats,near,N \nFlats near,building,flats,near,Y \nGlass House,building,greenhouse,-,N \nGlass Houses,building,greenhouse,-,Y \nGlass House in,building,greenhouse,in,N \nGlass Houses in,building,greenhouse,in,Y \nGlass House near,building,greenhouse,near,N \nGlass Houses near,building,greenhouse,near,Y \nGlasshouse,building,greenhouse,-,N \nGlasshouses,building,greenhouse,-,Y \nGlasshouse in,building,greenhouse,in,N \nGlasshouses in,building,greenhouse,in,Y \nGlasshouse near,building,greenhouse,near,N \nGlasshouses near,building,greenhouse,near,Y \nGreen House,building,greenhouse,-,N \nGreen Houses,building,greenhouse,-,Y \nGreen House in,building,greenhouse,in,N \nGreen Houses in,building,greenhouse,in,Y \nGreen House near,building,greenhouse,near,N \nGreen Houses near,building,greenhouse,near,Y \nGreenhouse,building,greenhouse,-,N \nGreenhouses,building,greenhouse,-,Y \nGreenhouse in,building,greenhouse,in,N \nGreenhouses in,building,greenhouse,in,Y \nGreenhouse near,building,greenhouse,near,N \nGreenhouses near,building,greenhouse,near,Y \nGarage,building,garage,-,N \nGarages,building,garage,-,Y \nGarage in,building,garage,in,N \nGarages in,building,garage,in,Y \nGarage near,building,garage,near,N \nGarages near,building,garage,near,Y \nHall,building,hall,-,N \nHalls,building,hall,-,Y \nHall in,building,hall,in,N \nHalls in,building,hall,in,Y \nHall near,building,hall,near,N \nHalls near,building,hall,near,Y \nHospital Building,building,hospital,-,N \nHospital Buildings,building,hospital,-,Y \nHospital Building in,building,hospital,in,N \nHospital Buildings in,building,hospital,in,Y \nHospital Building near,building,hospital,near,N \nHospital Buildings near,building,hospital,near,Y \nHotel,building,hotel,-,N \nHotels,building,hotel,-,Y \nHotel in,building,hotel,in,N \nHotels in,building,hotel,in,Y \nHotel near,building,hotel,near,N \nHotels near,building,hotel,near,Y \nHouse,building,house,-,N \nHouses,building,house,-,Y \nHouse in,building,house,in,N \nHouses in,building,house,in,Y \nHouse near,building,house,near,N \nHouses near,building,house,near,Y \nIndustrial Building,building,industrial,-,N \nIndustrial Buildings,building,industrial,-,Y \nIndustrial Building in,building,industrial,in,N \nIndustrial Buildings in,building,industrial,in,Y \nIndustrial Building near,building,industrial,near,N \nIndustrial Buildings near,building,industrial,near,Y \nMosque,building,mosque,-,N \nMosques,building,mosque,-,Y \nMosque in,building,mosque,in,N \nMosques in,building,mosque,in,Y \nMosque near,building,mosque,near,N \nMosques near,building,mosque,near,Y \nOffice Building,building,office,-,N \nOffice Buildings,building,office,-,Y \nOffice Building in,building,office,in,N \nOffice Buildings in,building,office,in,Y \nOffice Building near,building,office,near,N \nOffice Buildings near,building,office,near,Y \nPublic Building,building,public,-,N \nPublic Buildings,building,public,-,Y \nPublic Building in,building,public,in,N \nPublic Buildings in,building,public,in,Y \nPublic Building near,building,public,near,N \nPublic Buildings near,building,public,near,Y \nResidential Building,building,residential,-,N \nResidential Buildings,building,residential,-,Y \nResidential Building in,building,residential,in,N \nResidential Buildings in,building,residential,in,Y \nResidential Building near,building,residential,near,N \nResidential Buildings near,building,residential,near,Y \nRetail Building,building,retail,-,N \nRetail Buildings,building,retail,-,Y \nRetail Building in,building,retail,in,N \nRetail Buildings in,building,retail,in,Y \nRetail Building near,building,retail,near,N \nRetail Buildings near,building,retail,near,Y \nSchool Building,building,school,-,N \nSchool Buildings,building,school,-,Y \nSchool Building in,building,school,in,N \nSchool Buildings in,building,school,in,Y \nSchool Building near,building,school,near,N \nSchool Buildings near,building,school,near,Y \nShop,building,shop,-,N \nShops,building,shop,-,Y \nShop in,building,shop,in,N \nShops in,building,shop,in,Y \nShop near,building,shop,near,N \nShops near,building,shop,near,Y \nStadium,building,stadium,-,N \nStadiums,building,stadium,-,Y \nStadium in,building,stadium,in,N \nStadiums in,building,stadium,in,Y \nStadium near,building,stadium,near,N \nStadiums near,building,stadium,near,Y \nSynagogue,building,synagogue,-,N \nSynagogues,building,synagogue,-,Y \nSynagogue in,building,synagogue,in,N \nSynagogues in,building,synagogue,in,Y \nSynagogue near,building,synagogue,near,N \nSynagogues near,building,synagogue,near,Y \nStore,building,store,-,N \nStores,building,store,-,Y \nStore in,building,store,in,N \nStores in,building,store,in,Y \nStore near,building,store,near,N \nStores near,building,store,near,Y \nTerrace,building,terrace,-,N \nTerraces,building,terrace,-,Y \nTerrace in,building,terrace,in,N \nTerraces in,building,terrace,in,Y \nTerrace near,building,terrace,near,N \nTerraces near,building,terrace,near,Y \nTower,building,tower,-,N \nTowers,building,tower,-,Y \nTower in,building,tower,in,N \nTowers in,building,tower,in,Y \nTower near,building,tower,near,N \nTowers near,building,tower,near,Y \nRailway Station,building,train_station,-,N \nRailway Stations,building,train_station,-,Y \nRailway Station in,building,train_station,in,N \nRailway Stations in,building,train_station,in,Y \nRailway Station near,building,train_station,near,N \nRailway Stations near,building,train_station,near,Y \nStation,building,train_station,-,N \nStations,building,train_station,-,Y \nStation in,building,train_station,in,N \nStations in,building,train_station,in,Y \nStation near,building,train_station,near,N \nStations near,building,train_station,near,Y \nUniversity Building,building,university,-,N \nUniversity Buildings,building,university,-,Y \nUniversity Building in,building,university,in,N \nUniversity Buildings in,building,university,in,Y \nUniversity Building near,building,university,near,N \nUniversity Buildings near,building,university,near,Y \nBuilding,building,yes,-,N \nBuildings,building,yes,-,Y \nBuilding in,building,yes,in,N \nBuildings in,building,yes,in,Y \nBuilding near,building,yes,near,N \nBuildings near,building,yes,near,Y \nBridleway,highway,bridleway,-,N \nBridleways,highway,bridleway,-,Y \nBridleway in,highway,bridleway,in,N \nBridleways in,highway,bridleway,in,Y \nBridleway near,highway,bridleway,near,N \nBridleways near,highway,bridleway,near,Y \nGuided Bus Lane,highway,bus_guideway,-,N \nGuided Bus Lanes,highway,bus_guideway,-,Y \nGuided Bus Lane in,highway,bus_guideway,in,N \nGuided Bus Lanes in,highway,bus_guideway,in,Y \nGuided Bus Lane near,highway,bus_guideway,near,N \nGuided Bus Lanes near,highway,bus_guideway,near,Y \nBus Stop,highway,bus_stop,-,N \nBus Stops,highway,bus_stop,-,Y \nBus Stop in,highway,bus_stop,in,N \nBus Stops in,highway,bus_stop,in,Y \nBus Stop near,highway,bus_stop,near,N \nBus Stops near,highway,bus_stop,near,Y \nByway,highway,byway,-,N \nByways,highway,byway,-,Y \nByway in,highway,byway,in,N \nByways in,highway,byway,in,Y \nByway near,highway,byway,near,N \nByways near,highway,byway,near,Y \nChanging table,changing_table,yes,-,N \nChanging tables,changing_table,yes,-,Y \nChanging table in,changing_table,yes,in,N \nChanging tables in,changing_table,yes,in,Y \nChanging table near,changing_table,yes,near,N \nChanging tables near,changing_table,yes,near,Y \nBrewery,craft,brewery,-,N \nBrewerys,craft,brewery,-,Y \nBreweries,craft,brewery,-,Y \nBrewery in,craft,brewery,in,N \nBrewerys in,craft,brewery,in,Y \nBreweries in,craft,brewery,in,Y \nBrewery near,craft,brewery,near,N \nBrewerys near,craft,brewery,near,Y \nBreweries near,craft,brewery,near,Y \nCarpenter,craft,carpenter,-,N \nCarpenters,craft,carpenter,-,Y \nCarpenter in,craft,carpenter,in,N \nCarpenters in,craft,carpenter,in,Y \nCarpenter near,craft,carpenter,near,N \nCarpenters near,craft,carpenter,near,Y \nDistillery,craft,distillery,-,N \nDistillerys,craft,distillery,-,Y \nDistilleries,craft,distillery,-,Y \nDistillery in,craft,distillery,in,N \nDistillerys in,craft,distillery,in,Y \nDistilleries in,craft,distillery,in,Y \nDistillery near,craft,distillery,near,N \nDistillerys near,craft,distillery,near,Y \nDistilleries near,craft,distillery,near,Y \nKey Cutter,craft,key_cutter,-,N \nKey Cutters,craft,key_cutter,-,Y \nKey Cutter in,craft,key_cutter,in,N \nKey Cutters in,craft,key_cutter,in,Y \nKey Cutter near,craft,key_cutter,near,N \nKey Cutters near,craft,key_cutter,near,Y \nKey Duplication,craft,key_cutter,-,N \nKey Duplication in,craft,key_cutter,in,N \nKey Duplication near,craft,key_cutter,near,N \nElectrician,craft,electrician,-,N \nElectricians,craft,electrician,-,Y \nElectrician in,craft,electrician,in,N \nElectricians in,craft,electrician,in,Y \nElectrician near,craft,electrician,near,N \nElectricians near,craft,electrician,near,Y \nPhotographer,craft,photographer,-,N \nPhotographers,craft,photographer,-,Y \nPhotographer in,craft,photographer,in,N \nPhotographers in,craft,photographer,in,Y \nPhotographer near,craft,photographer,near,N \nPhotographers near,craft,photographer,near,Y \nShoe Maker,craft,shoemaker,-,N \nShoe Makers,craft,shoemaker,-,Y \nShoe Maker in,craft,shoemaker,in,N \nShoe Makers in,craft,shoemaker,in,Y \nShoe Maker near,craft,shoemaker,near,N \nShoe Makers near,craft,shoemaker,near,Y \nShoemaker,craft,shoemaker,-,N \nShoemakers,craft,shoemaker,-,Y \nShoemaker in,craft,shoemaker,in,N \nShoemakers in,craft,shoemaker,in,Y \nShoemaker near,craft,shoemaker,near,N \nShoemakers near,craft,shoemaker,near,Y \nTailor,craft,tailor,-,N \nTailors,craft,tailor,-,Y \nTailor in,craft,tailor,in,N \nTailors in,craft,tailor,in,Y \nTailor near,craft,tailor,near,N \nTailors near,craft,tailor,near,Y \nWinery,craft,winery,-,N \nWinerys,craft,winery,-,Y \nWineries,craft,winery,-,Y \nWinery in,craft,winery,in,N \nWinerys in,craft,winery,in,Y \nWineries in,craft,winery,in,Y \nWinery near,craft,winery,near,N \nWinerys near,craft,winery,near,Y \nWineries near,craft,winery,near,Y \nAmbulance Station,emergency,ambulance_station,-,N \nAmbulance Stations,emergency,ambulance_station,-,Y \nAmbulance Station in,emergency,ambulance_station,in,N \nAmbulance Stations in,emergency,ambulance_station,in,Y \nAmbulance Station near,emergency,ambulance_station,near,N \nAmbulance Stations near,emergency,ambulance_station,near,Y \nDefibrillator,emergency,defibrillator,-,N \nDefibrillators,emergency,defibrillator,-,Y \nDefibrillator in,emergency,defibrillator,in,N \nDefibrillators in,emergency,defibrillator,in,Y \nDefibrillator near,emergency,defibrillator,near,N \nDefibrillators near,emergency,defibrillator,near,Y \nFire Hydrant,emergency,fire_hydrant,-,N \nFire Hydrants,emergency,fire_hydrant,-,Y \nFire Hydrant in,emergency,fire_hydrant,in,N \nFire Hydrants in,emergency,fire_hydrant,in,Y \nFire Hydrant near,emergency,fire_hydrant,near,N \nFire Hydrants near,emergency,fire_hydrant,near,Y \nEmergency Phone,emergency,phone,-,N \nEmergency Phones,emergency,phone,-,Y \nEmergency Phone in,emergency,phone,in,N \nEmergency Phones in,emergency,phone,in,Y \nEmergency Phone near,emergency,phone,near,N \nEmergency Phones near,emergency,phone,near,Y \nHighway under Construction,highway,construction,-,N \nHighways under Construction,highway,construction,-,Y \nHighway under Construction in,highway,construction,in,N \nHighways under Construction in,highway,construction,in,Y \nHighway under Construction near,highway,construction,near,N \nHighways under Construction near,highway,construction,near,Y \nCycle Path,highway,cycleway,-,N \nCycle Paths,highway,cycleway,-,Y \nCycle Path in,highway,cycleway,in,N \nCycle Paths in,highway,cycleway,in,Y \nCycle Path near,highway,cycleway,near,N \nCycle Paths near,highway,cycleway,near,Y \nDistance Marker,highway,distance_marker,-,N \nDistance Markers,highway,distance_marker,-,Y \nDistance Marker in,highway,distance_marker,in,N \nDistance Markers in,highway,distance_marker,in,Y \nDistance Marker near,highway,distance_marker,near,N \nDistance Markers near,highway,distance_marker,near,Y \nEmergency Access Point,highway,emergency_access_point,-,N \nEmergency Access Points,highway,emergency_access_point,-,Y \nEmergency Access Point in,highway,emergency_access_point,in,N \nEmergency Access Points in,highway,emergency_access_point,in,Y \nEmergency Access Point near,highway,emergency_access_point,near,N \nEmergency Access Points near,highway,emergency_access_point,near,Y \nRadar Trap,highway,speed_camera,-,N \nRadar Traps,highway,speed_camera,-,Y \nRadar Trap in,highway,speed_camera,in,N \nRadar Traps in,highway,speed_camera,in,Y \nRadar Trap near,highway,speed_camera,near,N \nRadar Traps near,highway,speed_camera,near,Y \nSpeed Camera,highway,speed_camera,-,N \nSpeed Cameras,highway,speed_camera,-,Y \nSpeed Camera in,highway,speed_camera,in,N \nSpeed Cameras in,highway,speed_camera,in,Y \nSpeed Camera near,highway,speed_camera,near,N \nSpeed Cameras near,highway,speed_camera,near,Y \nSpeed Trap,highway,speed_camera,-,N \nSpeed Traps,highway,speed_camera,-,Y \nSpeed Trap in,highway,speed_camera,in,N \nSpeed Traps in,highway,speed_camera,in,Y \nSpeed Trap near,highway,speed_camera,near,N \nSpeed Traps near,highway,speed_camera,near,Y \nTraffic Enforcement Camera,highway,speed_camera,-,N \nTraffic Enforcement Cameras,highway,speed_camera,-,Y \nTraffic Enforcement Camera in,highway,speed_camera,in,N \nTraffic Enforcement Cameras in,highway,speed_camera,in,Y \nTraffic Enforcement Camera near,highway,speed_camera,near,N \nTraffic Enforcement Cameras near,highway,speed_camera,near,Y \nStoplights,highway,traffic_signals,-,Y \nStoplights in,highway,traffic_signals,in,Y \nStoplights near,highway,traffic_signals,near,Y \nTraffic Lights,highway,traffic_signals,-,Y \nTraffic Lights in,highway,traffic_signals,in,Y \nTraffic Lights near,highway,traffic_signals,near,Y \nTraffic Signals,highway,traffic_signals,-,Y \nTraffic Signals in,highway,traffic_signals,in,Y \nTraffic Signals near,highway,traffic_signals,near,Y \nFootpath,highway,footway,-,N \nFootpaths,highway,footway,-,Y \nFootpath in,highway,footway,in,N \nFootpaths in,highway,footway,in,Y \nFootpath near,highway,footway,near,N \nFootpaths near,highway,footway,near,Y \nFord,highway,ford,-,N \nFords,highway,ford,-,Y \nFord in,highway,ford,in,N \nFords in,highway,ford,in,Y \nFord near,highway,ford,near,N \nFords near,highway,ford,near,Y \nGate,highway,gate,-,N \nGates,highway,gate,-,Y \nGate in,highway,gate,in,N \nGates in,highway,gate,in,Y \nGate near,highway,gate,near,N \nGates near,highway,gate,near,Y \nLiving Street,highway,living_street,-,N \nLiving Streets,highway,living_street,-,Y \nLiving Street in,highway,living_street,in,N \nLiving Streets in,highway,living_street,in,Y \nLiving Street near,highway,living_street,near,N \nLiving Streets near,highway,living_street,near,Y \nMinor Road,highway,minor,-,N \nMinor Roads,highway,minor,-,Y \nMinor Road in,highway,minor,in,N \nMinor Roads in,highway,minor,in,Y \nMinor Road near,highway,minor,near,N \nMinor Roads near,highway,minor,near,Y \nMotorway,highway,motorway,-,N \nMotorways,highway,motorway,-,Y \nMotorway in,highway,motorway,in,N \nMotorways in,highway,motorway,in,Y \nMotorway near,highway,motorway,near,N \nMotorways near,highway,motorway,near,Y \nMotorway Junction,highway,motorway_junction,-,N \nMotorway Junctions,highway,motorway_junction,-,Y \nMotorway Junction in,highway,motorway_junction,in,N \nMotorway Junctions in,highway,motorway_junction,in,Y \nMotorway Junction near,highway,motorway_junction,near,N \nMotorway Junctions near,highway,motorway_junction,near,Y \nMotorway Road,highway,motorway_link,-,N \nMotorway Roads,highway,motorway_link,-,Y \nMotorway Road in,highway,motorway_link,in,N \nMotorway Roads in,highway,motorway_link,in,Y \nMotorway Road near,highway,motorway_link,near,N \nMotorway Roads near,highway,motorway_link,near,Y \nPath,highway,path,-,N \nPaths,highway,path,-,Y \nPath in,highway,path,in,N \nPaths in,highway,path,in,Y \nPath near,highway,path,near,N \nPaths near,highway,path,near,Y \nPedestrian Way,highway,pedestrian,-,N \nPedestrian Ways,highway,pedestrian,-,Y \nPedestrian Way in,highway,pedestrian,in,N \nPedestrian Ways in,highway,pedestrian,in,Y \nPedestrian Way near,highway,pedestrian,near,N \nPedestrian Ways near,highway,pedestrian,near,Y \nPlatform,highway,platform,-,N \nPlatforms,highway,platform,-,Y \nPlatform in,highway,platform,in,N \nPlatforms in,highway,platform,in,Y \nPlatform near,highway,platform,near,N \nPlatforms near,highway,platform,near,Y \nPrimary Road,highway,primary,-,N \nPrimary Roads,highway,primary,-,Y \nPrimary Road in,highway,primary,in,N \nPrimary Roads in,highway,primary,in,Y \nPrimary Road near,highway,primary,near,N \nPrimary Roads near,highway,primary,near,Y \nPrimary Road,highway,primary_link,-,N \nPrimary Roads,highway,primary_link,-,Y \nPrimary Road in,highway,primary_link,in,N \nPrimary Roads in,highway,primary_link,in,Y \nPrimary Road near,highway,primary_link,near,N \nPrimary Roads near,highway,primary_link,near,Y \nRaceway,highway,raceway,-,N \nRaceways,highway,raceway,-,Y \nRaceway in,highway,raceway,in,N \nRaceways in,highway,raceway,in,Y \nRaceway near,highway,raceway,near,N \nRaceways near,highway,raceway,near,Y \nResidential,highway,residential,-,N \nResidentials,highway,residential,-,Y \nResidential in,highway,residential,in,N \nResidentials in,highway,residential,in,Y \nResidential near,highway,residential,near,N \nResidentials near,highway,residential,near,Y \nResidential Road,highway,residential,-,N \nResidential Roads,highway,residential,-,Y \nResidential Road in,highway,residential,in,N \nResidential Roads in,highway,residential,in,Y \nResidential Road near,highway,residential,near,N \nResidential Roads near,highway,residential,near,Y \nRest Area,highway,rest_area,-,N \nRest Stop,highway,rest_area,-,N \nRoad,highway,road,-,N \nRoads,highway,road,-,Y \nRoad in,highway,road,in,N \nRoads in,highway,road,in,Y \nRoad near,highway,road,near,N \nRoads near,highway,road,near,Y \nSecondary Road,highway,secondary,-,N \nSecondary Roads,highway,secondary,-,Y \nSecondary Road in,highway,secondary,in,N \nSecondary Roads in,highway,secondary,in,Y \nSecondary Road near,highway,secondary,near,N \nSecondary Roads near,highway,secondary,near,Y \nSecondary Road,highway,secondary_link,-,N \nSecondary Roads,highway,secondary_link,-,Y \nSecondary Road in,highway,secondary_link,in,N \nSecondary Roads in,highway,secondary_link,in,Y \nSecondary Road near,highway,secondary_link,near,N \nSecondary Roads near,highway,secondary_link,near,Y \nService Road,highway,service,-,N \nService Roads,highway,service,-,Y \nService Road in,highway,service,in,N \nService Roads in,highway,service,in,Y \nService Road near,highway,service,near,N \nService Roads near,highway,service,near,Y \nService Area,highway,services,-,N \nMotorway Services,highway,services,-,N \nMotorway Services,highway,services,-,Y \nMotorway Services in,highway,services,in,N \nMotorway Services in,highway,services,in,Y \nMotorway Services near,highway,services,near,N \nMotorway Services near,highway,services,near,Y \nSteps,highway,steps,-,N \nSteps,highway,steps,-,Y \nSteps in,highway,steps,in,N \nSteps in,highway,steps,in,Y \nSteps near,highway,steps,near,N \nSteps near,highway,steps,near,Y \nStile,highway,stile,-,N \nStiles,highway,stile,-,Y \nStile in,highway,stile,in,N \nStiles in,highway,stile,in,Y \nStile near,highway,stile,near,N \nStiles near,highway,stile,near,Y \nTertiary Road,highway,tertiary,-,N \nTertiary Roads,highway,tertiary,-,Y \nTertiary Road in,highway,tertiary,in,N \nTertiary Roads in,highway,tertiary,in,Y \nTertiary Road near,highway,tertiary,near,N \nTertiary Roads near,highway,tertiary,near,Y \nTrack,highway,track,-,N \nTracks,highway,track,-,Y \nTrack in,highway,track,in,N \nTracks in,highway,track,in,Y \nTrack near,highway,track,near,N \nTracks near,highway,track,near,Y \nTrail,highway,trail,-,N \nTrails,highway,trail,-,Y \nTrail in,highway,trail,in,N \nTrails in,highway,trail,in,Y \nTrail near,highway,trail,near,N \nTrails near,highway,trail,near,Y \nTrunk Road,highway,trunk,-,N \nTrunk Roads,highway,trunk,-,Y \nTrunk Road in,highway,trunk,in,N \nTrunk Roads in,highway,trunk,in,Y \nTrunk Road near,highway,trunk,near,N \nTrunk Roads near,highway,trunk,near,Y \nTrunk Road,highway,trunk_link,-,N \nTrunk Roads,highway,trunk_link,-,Y \nTrunk Road in,highway,trunk_link,in,N \nTrunk Roads in,highway,trunk_link,in,Y \nTrunk Road near,highway,trunk_link,near,N \nTrunk Roads near,highway,trunk_link,near,Y \nUnclassified Road,highway,unclassified,-,N \nUnclassified Roads,highway,unclassified,-,Y \nUnclassified Road in,highway,unclassified,in,N \nUnclassified Roads in,highway,unclassified,in,Y \nUnclassified Road near,highway,unclassified,near,N \nUnclassified Roads near,highway,unclassified,near,Y \nUnsurfaced Road,highway,unsurfaced,-,N \nUnsurfaced Roads,highway,unsurfaced,-,Y \nUnsurfaced Road in,highway,unsurfaced,in,N \nUnsurfaced Roads in,highway,unsurfaced,in,Y \nUnsurfaced Road near,highway,unsurfaced,near,N \nUnsurfaced Roads near,highway,unsurfaced,near,Y \nArchaeological Site,historic,archaeological_site,-,N \nArchaeological Sites,historic,archaeological_site,-,Y \nArchaeological Site in,historic,archaeological_site,in,N \nArchaeological Sites in,historic,archaeological_site,in,Y \nArchaeological Site near,historic,archaeological_site,near,N \nArchaeological Sites near,historic,archaeological_site,near,Y \nBattlefield,historic,battlefield,-,N \nBattlefields,historic,battlefield,-,Y \nBattlefield in,historic,battlefield,in,N \nBattlefields in,historic,battlefield,in,Y \nBattlefield near,historic,battlefield,near,N \nBattlefields near,historic,battlefield,near,Y \nBoundary Stone,historic,boundary_stone,-,N \nBoundary Stones,historic,boundary_stone,-,Y \nBoundary Stone in,historic,boundary_stone,in,N \nBoundary Stones in,historic,boundary_stone,in,Y \nBoundary Stone near,historic,boundary_stone,near,N \nBoundary Stones near,historic,boundary_stone,near,Y \nHistoric Building,historic,building,-,N \nHistoric Buildings,historic,building,-,Y \nHistoric Building in,historic,building,in,N \nHistoric Buildings in,historic,building,in,Y \nHistoric Building near,historic,building,near,N \nHistoric Buildings near,historic,building,near,Y \nCastle,historic,castle,-,N \nCastles,historic,castle,-,Y \nCastle in,historic,castle,in,N \nCastles in,historic,castle,in,Y \nCastle near,historic,castle,near,N \nCastles near,historic,castle,near,Y \nManor,historic,manor,-,N \nManors,historic,manor,-,Y \nManor in,historic,manor,in,N \nManors in,historic,manor,in,Y \nManor near,historic,manor,near,N \nManors near,historic,manor,near,Y \nMemorial,historic,memorial,-,N \nMemorials,historic,memorial,-,Y \nMemorial in,historic,memorial,in,N \nMemorials in,historic,memorial,in,Y \nMemorial near,historic,memorial,near,N \nMemorials near,historic,memorial,near,Y \nMine,historic,mine,-,N \nMines,historic,mine,-,Y \nMine in,historic,mine,in,N \nMines in,historic,mine,in,Y \nMine near,historic,mine,near,N \nMines near,historic,mine,near,Y \nMonument,historic,monument,-,N \nMonuments,historic,monument,-,Y \nMonument in,historic,monument,in,N \nMonuments in,historic,monument,in,Y \nMonument near,historic,monument,near,N \nMonuments near,historic,monument,near,Y \nRuin,historic,ruins,-,N \nRuins,historic,ruins,-,Y \nRuin in,historic,ruins,in,N \nRuins in,historic,ruins,in,Y \nRuin near,historic,ruins,near,N \nRuins near,historic,ruins,near,Y \nWayside Cross,historic,wayside_cross,-,N \nWayside Crosses,historic,wayside_cross,-,Y \nWayside Cross in,historic,wayside_cross,in,N \nWayside Crosses in,historic,wayside_cross,in,Y \nWayside Cross near,historic,wayside_cross,near,N \nWayside Crosses near,historic,wayside_cross,near,Y \nWayside Shrine,historic,wayside_shrine,-,N \nWayside Shrines,historic,wayside_shrine,-,Y \nWayside Shrine in,historic,wayside_shrine,in,N \nWayside Shrines in,historic,wayside_shrine,in,Y \nWayside Shrine near,historic,wayside_shrine,near,N \nWayside Shrines near,historic,wayside_shrine,near,Y \nWreck,historic,wreck,-,N \nWrecks,historic,wreck,-,Y \nWreck in,historic,wreck,in,N \nWrecks in,historic,wreck,in,Y \nWreck near,historic,wreck,near,N \nWrecks near,historic,wreck,near,Y \nAllotment,landuse,allotments,-,N \nAllotments,landuse,allotments,-,Y \nAllotment in,landuse,allotments,in,N \nAllotments in,landuse,allotments,in,Y \nAllotment near,landuse,allotments,near,N \nAllotments near,landuse,allotments,near,Y \nRoundabout,junction,roundabout,-,N \nRoundabouts,junction,roundabout,-,Y \nRoundabout in,junction,roundabout,in,N \nRoundabouts in,junction,roundabout,in,Y \nRoundabout near,junction,roundabout,near,N \nRoundabouts near,junction,roundabout,near,Y \nBasin,landuse,basin,-,N \nBasins,landuse,basin,-,Y \nBasin in,landuse,basin,in,N \nBasins in,landuse,basin,in,Y \nBasin near,landuse,basin,near,N \nBasins near,landuse,basin,near,Y \nBrownfield Land,landuse,brownfield,-,N \nBrownfield Lands,landuse,brownfield,-,Y \nBrownfield Land in,landuse,brownfield,in,N \nBrownfield Lands in,landuse,brownfield,in,Y \nBrownfield Land near,landuse,brownfield,near,N \nBrownfield Lands near,landuse,brownfield,near,Y \nCemetery,landuse,cemetery,-,N \nCemeterys,landuse,cemetery,-,Y \nCemeteries,landuse,cemetery,-,Y \nCemetery in,landuse,cemetery,in,N \nCemeterys in,landuse,cemetery,in,Y \nCemeteries in,landuse,cemetery,in,Y \nCemetery near,landuse,cemetery,near,N \nCemeterys near,landuse,cemetery,near,Y \nCemeteries near,landuse,cemetery,near,Y \nCommercial Area,landuse,commercial,-,N \nCommercial Areas,landuse,commercial,-,Y \nCommercial Area in,landuse,commercial,in,N \nCommercial Areas in,landuse,commercial,in,Y \nCommercial Area near,landuse,commercial,near,N \nCommercial Areas near,landuse,commercial,near,Y \nConservation,landuse,conservation,-,N \nConservations,landuse,conservation,-,Y \nConservation in,landuse,conservation,in,N \nConservations in,landuse,conservation,in,Y \nConservation near,landuse,conservation,near,N \nConservations near,landuse,conservation,near,Y \nConstruction,landuse,construction,-,N \nConstructions,landuse,construction,-,Y \nConstruction in,landuse,construction,in,N \nConstructions in,landuse,construction,in,Y \nConstruction near,landuse,construction,near,N \nConstructions near,landuse,construction,near,Y \nFarm,landuse,farm,-,N \nFarms,landuse,farm,-,Y \nFarm in,landuse,farm,in,N \nFarms in,landuse,farm,in,Y \nFarm near,landuse,farm,near,N \nFarms near,landuse,farm,near,Y \nFarmland,landuse,farmland,-,N \nFarmlands,landuse,farmland,-,Y \nFarmland in,landuse,farmland,in,N \nFarmlands in,landuse,farmland,in,Y \nFarmland near,landuse,farmland,near,N \nFarmlands near,landuse,farmland,near,Y \nFarmyard,landuse,farmyard,-,N \nFarmyards,landuse,farmyard,-,Y \nFarmyard in,landuse,farmyard,in,N \nFarmyards in,landuse,farmyard,in,Y \nFarmyard near,landuse,farmyard,near,N \nFarmyards near,landuse,farmyard,near,Y \nForest,landuse,forest,-,N \nForests,landuse,forest,-,Y \nForest in,landuse,forest,in,N \nForests in,landuse,forest,in,Y \nForest near,landuse,forest,near,N \nForests near,landuse,forest,near,Y \nWood,landuse,forest,-,N \nWoods,landuse,forest,-,Y \nWood in,landuse,forest,in,N \nWoods in,landuse,forest,in,Y \nWood near,landuse,forest,near,N \nWoods near,landuse,forest,near,Y \nGrass,landuse,grass,-,N \nGrasses,landuse,grass,-,Y \nGrass in,landuse,grass,in,N \nGrasses in,landuse,grass,in,Y \nGrass near,landuse,grass,near,N \nGrasses near,landuse,grass,near,Y \nGreenfield Land,landuse,greenfield,-,N \nGreenfield Lands,landuse,greenfield,-,Y \nGreenfield Land in,landuse,greenfield,in,N \nGreenfield Lands in,landuse,greenfield,in,Y \nGreenfield Land near,landuse,greenfield,near,N \nGreenfield Lands near,landuse,greenfield,near,Y \nIndustrial Area,landuse,industrial,-,N \nIndustrial Areas,landuse,industrial,-,Y \nIndustrial Area in,landuse,industrial,in,N \nIndustrial Areas in,landuse,industrial,in,Y \nIndustrial Area near,landuse,industrial,near,N \nIndustrial Areas near,landuse,industrial,near,Y \nLandfill,landuse,landfill,-,N \nLandfills,landuse,landfill,-,Y \nLandfill in,landuse,landfill,in,N \nLandfills in,landuse,landfill,in,Y \nLandfill near,landuse,landfill,near,N \nLandfills near,landuse,landfill,near,Y \nMeadow,landuse,meadow,-,N \nMeadows,landuse,meadow,-,Y \nMeadow in,landuse,meadow,in,N \nMeadows in,landuse,meadow,in,Y \nMeadow near,landuse,meadow,near,N \nMeadows near,landuse,meadow,near,Y \nMilitary Area,landuse,military,-,N \nMilitary Areas,landuse,military,-,Y \nMilitary Area in,landuse,military,in,N \nMilitary Areas in,landuse,military,in,Y \nMilitary Area near,landuse,military,near,N \nMilitary Areas near,landuse,military,near,Y \nPiste,landuse,piste,-,N \nPistes,landuse,piste,-,Y \nPiste in,landuse,piste,in,N \nPistes in,landuse,piste,in,Y \nPiste near,landuse,piste,near,N \nPistes near,landuse,piste,near,Y \nQuarry,landuse,quarry,-,N \nQuarrys,landuse,quarry,-,Y \nQuarries,landuse,quarry,-,Y \nQuarry in,landuse,quarry,in,N \nQuarrys in,landuse,quarry,in,Y \nQuarries in,landuse,quarry,in,Y \nQuarry near,landuse,quarry,near,N \nQuarrys near,landuse,quarry,near,Y \nQuarries near,landuse,quarry,near,Y \nRailway,landuse,railway,-,N \nRailways,landuse,railway,-,Y \nRailway in,landuse,railway,in,N \nRailways in,landuse,railway,in,Y \nRailway near,landuse,railway,near,N \nRailways near,landuse,railway,near,Y \nRecreation Ground,landuse,recreation_ground,-,N \nRecreation Grounds,landuse,recreation_ground,-,Y \nRecreation Ground in,landuse,recreation_ground,in,N \nRecreation Grounds in,landuse,recreation_ground,in,Y \nRecreation Ground near,landuse,recreation_ground,near,N \nRecreation Grounds near,landuse,recreation_ground,near,Y \nReservoir,landuse,reservoir,-,N \nReservoirs,landuse,reservoir,-,Y \nReservoir in,landuse,reservoir,in,N \nReservoirs in,landuse,reservoir,in,Y \nReservoir near,landuse,reservoir,near,N \nReservoirs near,landuse,reservoir,near,Y \nResidential Area,landuse,residential,-,N \nResidential Areas,landuse,residential,-,Y \nResidential Area in,landuse,residential,in,N \nResidential Areas in,landuse,residential,in,Y \nResidential Area near,landuse,residential,near,N \nResidential Areas near,landuse,residential,near,Y \nRetail,landuse,retail,-,N \nRetails,landuse,retail,-,Y \nRetail in,landuse,retail,in,N \nRetails in,landuse,retail,in,Y \nRetail near,landuse,retail,near,N \nRetails near,landuse,retail,near,Y \nVillage Green,landuse,village_green,-,N \nVillage Greens,landuse,village_green,-,Y \nVillage Green in,landuse,village_green,in,N \nVillage Greens in,landuse,village_green,in,Y \nVillage Green near,landuse,village_green,near,N \nVillage Greens near,landuse,village_green,near,Y \nVineyard,landuse,vineyard,-,N \nVineyards,landuse,vineyard,-,Y \nVineyard in,landuse,vineyard,in,N \nVineyards in,landuse,vineyard,in,Y \nVineyard near,landuse,vineyard,near,N \nVineyards near,landuse,vineyard,near,Y \nBeach Resort,leisure,beach_resort,-,N \nBeach Resorts,leisure,beach_resort,-,Y \nBeach Resort in,leisure,beach_resort,in,N \nBeach Resorts in,leisure,beach_resort,in,Y \nBeach Resort near,leisure,beach_resort,near,N \nBeach Resorts near,leisure,beach_resort,near,Y \nCommon Land,leisure,common,-,N \nCommon Lands,leisure,common,-,Y \nCommon Land in,leisure,common,in,N \nCommon Lands in,leisure,common,in,Y \nCommon Land near,leisure,common,near,N \nCommon Lands near,leisure,common,near,Y \nFishing Area,leisure,fishing,-,N \nFishing Areas,leisure,fishing,-,Y \nFishing Area in,leisure,fishing,in,N \nFishing Areas in,leisure,fishing,in,Y \nFishing Area near,leisure,fishing,near,N \nFishing Areas near,leisure,fishing,near,Y \nGarden,leisure,garden,-,N \nGardens,leisure,garden,-,Y \nGarden in,leisure,garden,in,N \nGardens in,leisure,garden,in,Y \nGarden near,leisure,garden,near,N \nGardens near,leisure,garden,near,Y \nGolf Course,leisure,golf_course,-,N \nGolf Courses,leisure,golf_course,-,Y \nGolf Course in,leisure,golf_course,in,N \nGolf Courses in,leisure,golf_course,in,Y \nGolf Course near,leisure,golf_course,near,N \nGolf Courses near,leisure,golf_course,near,Y \nHackerspace,leisure,hackerspace,-,N \nHackerspaces,leisure,hackerspace,-,Y \nHackerspace in,leisure,hackerspace,in,N \nHackerspaces in,leisure,hackerspace,in,Y \nHackerspace near,leisure,hackerspace,near,N \nHackerspaces near,leisure,hackerspace,near,Y \nIce Rink,leisure,ice_rink,-,N \nIce Rinks,leisure,ice_rink,-,Y \nIce Rink in,leisure,ice_rink,in,N \nIce Rinks in,leisure,ice_rink,in,Y \nIce Rink near,leisure,ice_rink,near,N \nIce Rinks near,leisure,ice_rink,near,Y \nMarina,leisure,marina,-,N \nMarinas,leisure,marina,-,Y \nMarina in,leisure,marina,in,N \nMarinas in,leisure,marina,in,Y \nMarina near,leisure,marina,near,N \nMarinas near,leisure,marina,near,Y \nMiniature Golf,leisure,miniature_golf,-,N \nMiniature Golfs,leisure,miniature_golf,-,Y \nMiniature Golf in,leisure,miniature_golf,in,N \nMiniature Golfs in,leisure,miniature_golf,in,Y \nMiniature Golf near,leisure,miniature_golf,near,N \nMiniature Golfs near,leisure,miniature_golf,near,Y \nNature Reserve,leisure,nature_reserve,-,N \nNature Reserves,leisure,nature_reserve,-,Y \nNature Reserve in,leisure,nature_reserve,in,N \nNature Reserves in,leisure,nature_reserve,in,Y \nNature Reserve near,leisure,nature_reserve,near,N \nNature Reserves near,leisure,nature_reserve,near,Y \nPark,leisure,park,-,N \nParks,leisure,park,-,Y \nPark in,leisure,park,in,N \nParks in,leisure,park,in,Y \nPark near,leisure,park,near,N \nParks near,leisure,park,near,Y \nSports Pitch,leisure,pitch,-,N \nSports Pitches,leisure,pitch,-,Y \nSports Pitch in,leisure,pitch,in,N \nSports Pitches in,leisure,pitch,in,Y \nSports Pitch near,leisure,pitch,near,N \nSports Pitches near,leisure,pitch,near,Y \nPlayground,leisure,playground,-,N \nPlaygrounds,leisure,playground,-,Y \nPlayground in,leisure,playground,in,N \nPlaygrounds in,leisure,playground,in,Y \nPlayground near,leisure,playground,near,N \nPlaygrounds near,leisure,playground,near,Y \nRecreation Ground,leisure,recreation_ground,-,N \nRecreation Grounds,leisure,recreation_ground,-,Y \nRecreation Ground in,leisure,recreation_ground,in,N \nRecreation Grounds in,leisure,recreation_ground,in,Y \nRecreation Ground near,leisure,recreation_ground,near,N \nRecreation Grounds near,leisure,recreation_ground,near,Y \nSlipway,leisure,slipway,-,N \nSlipways,leisure,slipway,-,Y \nSlipway in,leisure,slipway,in,N \nSlipways in,leisure,slipway,in,Y \nSlipway near,leisure,slipway,near,N \nSlipways near,leisure,slipway,near,Y \nSports Centre,leisure,sports_centre,-,N \nSports Centres,leisure,sports_centre,-,Y \nSports Centre in,leisure,sports_centre,in,N \nSports Centres in,leisure,sports_centre,in,Y \nSports Centre near,leisure,sports_centre,near,N \nSports Centres near,leisure,sports_centre,near,Y \nSports Centre,leisure,sports_centre,-,N \nSports Centers,leisure,sports_centre,-,Y \nSports Center in,leisure,sports_centre,in,N \nSports Centers in,leisure,sports_centre,in,Y \nSports Center near,leisure,sports_centre,near,N \nSports Centers near,leisure,sports_centre,near,Y \nStadium,leisure,stadium,-,N \nStadiums,leisure,stadium,-,Y \nStadium in,leisure,stadium,in,N \nStadiums in,leisure,stadium,in,Y \nStadium near,leisure,stadium,near,N \nStadiums near,leisure,stadium,near,Y \nSwimming Pool,leisure,swimming_pool,-,N \nSwimming Pools,leisure,swimming_pool,-,Y \nSwimming Pool in,leisure,swimming_pool,in,N \nSwimming Pools in,leisure,swimming_pool,in,Y \nSwimming Pool near,leisure,swimming_pool,near,N \nSwimming Pools near,leisure,swimming_pool,near,Y \nRunning Track,leisure,track,-,N \nRunning Tracks,leisure,track,-,Y \nRunning Track in,leisure,track,in,N \nRunning Tracks in,leisure,track,in,Y \nRunning Track near,leisure,track,near,N \nRunning Tracks near,leisure,track,near,Y \nWater Park,leisure,water_park,-,N \nWater Parks,leisure,water_park,-,Y \nWater Park in,leisure,water_park,in,N \nWater Parks in,leisure,water_park,in,Y \nWater Park near,leisure,water_park,near,N \nWater Parks near,leisure,water_park,near,Y \nWater well,man_made,water_well,-,N \nWater wells,man_made,water_well,-,Y \nWater well in,man_made,water_well,in,N \nWater wells in,man_made,water_well,in,Y \nWater well near,man_made,water_well,near,N \nWater wells near,man_made,water_well,near,Y \nWindmill,man_made,windmill,-,N \nWindmills,man_made,windmill,-,Y \nWindmill in,man_made,windmill,in,N \nWindmills in,man_made,windmill,in,Y \nWindmill near,man_made,windmill,near,N \nWindmills near,man_made,windmill,near,Y \nMaypole,man_made,maypole,-,N \nMaypoles,man_made,maypole,-,Y \nMaypole in,man_made,maypole,in,N \nMaypoles in,man_made,maypole,in,Y \nMaypole near,man_made,maypole,near,N \nMaypoles near,man_made,maypole,near,Y \nPlaque,memorial,plaque,-,N \nPlaques,memorial,plaque,-,Y \nPlaque in,memorial,plaque,in,N \nPlaques in,memorial,plaque,in,Y \nPlaque near,memorial,plaque,near,N \nPlaques near,memorial,plaque,near,Y \nStatue,memorial,statue,-,N \nStatues,memorial,statue,-,Y \nStatue in,memorial,statue,in,N \nStatues in,memorial,statue,in,Y \nStatue near,memorial,statue,near,N \nStatues near,memorial,statue,near,Y \nStolperstein,memorial,stolperstein,-,N \nStolpersteins,memorial,stolperstein,-,Y \nStolpersteine,memorial,stolperstein,-,Y \nStolperstein in,memorial,stolperstein,in,N \nStolpersteins in,memorial,stolperstein,in,Y \nStolpersteine in,memorial,stolperstein,in,Y \nStolperstein near,memorial,stolperstein,near,N \nStolpersteins near,memorial,stolperstein,near,Y \nStolpersteine near,memorial,stolperstein,near,Y \nWar Memorial,memorial,war_memorial,-,N \nWar Memorials,memorial,war_memorial,-,Y \nWar Memorial in,memorial,war_memorial,in,N \nWar Memorials in,memorial,war_memorial,in,Y \nWar Memorial near,memorial,war_memorial,near,N \nWar Memorials near,memorial,war_memorial,near,Y \nBay,natural,bay,-,N \nBays,natural,bay,-,Y \nBay in,natural,bay,in,N \nBays in,natural,bay,in,Y \nBay near,natural,bay,near,N \nBays near,natural,bay,near,Y \nBeach,natural,beach,-,N \nBeachs,natural,beach,-,Y \nBeaches,natural,beach,-,Y \nBeach in,natural,beach,in,N \nBeachs in,natural,beach,in,Y \nBeaches in,natural,beach,in,Y \nBeach near,natural,beach,near,N \nBeachs near,natural,beach,near,Y \nBeaches near,natural,beach,near,Y \nCape,natural,cape,-,N \nCapes,natural,cape,-,Y \nCape in,natural,cape,in,N \nCapes in,natural,cape,in,Y \nCape near,natural,cape,near,N \nCapes near,natural,cape,near,Y \nCave Entrance,natural,cave_entrance,-,N \nCave Entrances,natural,cave_entrance,-,Y \nCave Entrance in,natural,cave_entrance,in,N \nCave Entrances in,natural,cave_entrance,in,Y \nCave Entrance near,natural,cave_entrance,near,N \nCave Entrances near,natural,cave_entrance,near,Y \nCliff,natural,cliff,-,N \nCliffs,natural,cliff,-,Y \nCliff in,natural,cliff,in,N \nCliffs in,natural,cliff,in,Y \nCliff near,natural,cliff,near,N \nCliffs near,natural,cliff,near,Y \nCoastline,natural,coastline,-,N \nCoastlines,natural,coastline,-,Y \nCoastline in,natural,coastline,in,N \nCoastlines in,natural,coastline,in,Y \nCoastline near,natural,coastline,near,N \nCoastlines near,natural,coastline,near,Y \nDesert,natural,desert,-,N \nDeserts,natural,desert,-,Y \nDesert in,natural,desert,in,N \nDeserts in,natural,desert,in,Y \nDesert near,natural,desert,near,N \nDeserts near,natural,desert,near,Y \nFell,natural,fell,-,N \nFells,natural,fell,-,Y \nFell in,natural,fell,in,N \nFells in,natural,fell,in,Y \nFell near,natural,fell,near,N \nFells near,natural,fell,near,Y \nGlacier,natural,glacier,-,N \nGlaciers,natural,glacier,-,Y \nGlacier in,natural,glacier,in,N \nGlaciers in,natural,glacier,in,Y \nGlacier near,natural,glacier,near,N \nGlaciers near,natural,glacier,near,Y \nHeath,natural,heath,-,N \nHeaths,natural,heath,-,Y \nHeath in,natural,heath,in,N \nHeaths in,natural,heath,in,Y \nHeath near,natural,heath,near,N \nHeaths near,natural,heath,near,Y \nLand,natural,land,-,N \nLands,natural,land,-,Y \nLand in,natural,land,in,N \nLands in,natural,land,in,Y \nLand near,natural,land,near,N \nLands near,natural,land,near,Y \nMarsh,natural,marsh,-,N \nMarshs,natural,marsh,-,Y \nMarshes,natural,marsh,-,Y \nMarsh in,natural,marsh,in,N \nMarshs in,natural,marsh,in,Y \nMarshes in,natural,marsh,in,Y \nMarsh near,natural,marsh,near,N \nMarshs near,natural,marsh,near,Y \nMarshes near,natural,marsh,near,Y \nMoor,natural,moor,-,N \nMoors,natural,moor,-,Y \nMoor in,natural,moor,in,N \nMoors in,natural,moor,in,Y \nMoor near,natural,moor,near,N \nMoors near,natural,moor,near,Y \nMud,natural,mud,-,N \nMuds,natural,mud,-,Y \nMud in,natural,mud,in,N \nMuds in,natural,mud,in,Y \nMud near,natural,mud,near,N \nMuds near,natural,mud,near,Y \nPeak,natural,peak,-,N \nPeaks,natural,peak,-,Y \nPeak in,natural,peak,in,N \nPeaks in,natural,peak,in,Y \nPeak near,natural,peak,near,N \nPeaks near,natural,peak,near,Y \nReef,natural,reef,-,N \nReefs,natural,reef,-,Y \nReef in,natural,reef,in,N \nReefs in,natural,reef,in,Y \nReef near,natural,reef,near,N \nReefs near,natural,reef,near,Y \nRidge,natural,ridge,-,N \nRidges,natural,ridge,-,Y \nRidge in,natural,ridge,in,N \nRidges in,natural,ridge,in,Y \nRidge near,natural,ridge,near,N \nRidges near,natural,ridge,near,Y \nRock,natural,rock,-,N \nRocks,natural,rock,-,Y \nRock in,natural,rock,in,N \nRocks in,natural,rock,in,Y \nRock near,natural,rock,near,N \nRocks near,natural,rock,near,Y \nScree,natural,scree,-,N \nScrees,natural,scree,-,Y \nScree in,natural,scree,in,N \nScrees in,natural,scree,in,Y \nScree near,natural,scree,near,N \nScrees near,natural,scree,near,Y \nScrub,natural,scrub,-,N \nScrubs,natural,scrub,-,Y \nScrub in,natural,scrub,in,N \nScrubs in,natural,scrub,in,Y \nScrub near,natural,scrub,near,N \nScrubs near,natural,scrub,near,Y \nShoal,natural,shoal,-,N \nShoals,natural,shoal,-,Y \nShoal in,natural,shoal,in,N \nShoals in,natural,shoal,in,Y \nShoal near,natural,shoal,near,N \nShoals near,natural,shoal,near,Y \nSpring,natural,spring,-,N \nSprings,natural,spring,-,Y \nSpring in,natural,spring,in,N \nSprings in,natural,spring,in,Y \nSpring near,natural,spring,near,N \nSprings near,natural,spring,near,Y \nTree,natural,tree,-,N \nTrees,natural,tree,-,Y \nTree in,natural,tree,in,N \nTrees in,natural,tree,in,Y \nTree near,natural,tree,near,N \nTrees near,natural,tree,near,Y \nValley,natural,valley,-,N \nValleys,natural,valley,-,Y \nValley in,natural,valley,in,N \nValleys in,natural,valley,in,Y \nValley near,natural,valley,near,N \nValleys near,natural,valley,near,Y \nVolcano,natural,volcano,-,N \nVolcanos,natural,volcano,-,Y \nVolcano in,natural,volcano,in,N \nVolcanos in,natural,volcano,in,Y \nVolcano near,natural,volcano,near,N \nVolcanos near,natural,volcano,near,Y \nWater,natural,water,-,N \nWaters,natural,water,-,Y \nWater in,natural,water,in,N \nWaters in,natural,water,in,Y \nWater near,natural,water,near,N \nWaters near,natural,water,near,Y \nWetland,natural,wetland,-,N \nWetlands,natural,wetland,-,Y \nWetland in,natural,wetland,in,N \nWetlands in,natural,wetland,in,Y \nWetland near,natural,wetland,near,N \nWetlands near,natural,wetland,near,Y \nWood,natural,wood,-,N \nWoods,natural,wood,-,Y \nWood in,natural,wood,in,N \nWoods in,natural,wood,in,Y \nWood near,natural,wood,near,N \nWoods near,natural,wood,near,Y \nCity,place,city,-,N \nCitys,place,city,-,Y \nCities,place,city,-,Y \nCity in,place,city,in,N \nCitys in,place,city,in,Y \nCities in,place,city,in,Y \nCity near,place,city,near,N \nCitys near,place,city,near,Y \nCities near,place,city,near,Y \nCountry,place,country,-,N \nCountrys,place,country,-,Y \nCountries,place,country,-,Y \nCountry in,place,country,in,N \nCountrys in,place,country,in,Y \nCountries in,place,country,in,Y \nCountry near,place,country,near,N \nCountrys near,place,country,near,Y \nCountries near,place,country,near,Y \nCounty,place,county,-,N \nCountys,place,county,-,Y \nCounties,place,county,-,Y \nCounty in,place,county,in,N \nCountys in,place,county,in,Y \nCounties in,place,county,in,Y \nCounty near,place,county,near,N \nCountys near,place,county,near,Y \nCounties near,place,county,near,Y \nFarm,place,farm,-,N \nFarms,place,farm,-,Y \nFarm in,place,farm,in,N \nFarms in,place,farm,in,Y \nFarm near,place,farm,near,N \nFarms near,place,farm,near,Y \nHamlet,place,hamlet,-,N \nHamlets,place,hamlet,-,Y \nHamlet in,place,hamlet,in,N \nHamlets in,place,hamlet,in,Y \nHamlet near,place,hamlet,near,N \nHamlets near,place,hamlet,near,Y \nHouses,place,houses,-,N \nHouses,place,houses,-,Y \nHouses in,place,houses,in,N \nHouses in,place,houses,in,Y \nHouses near,place,houses,near,N \nHouses near,place,houses,near,Y \nIsland,place,island,-,N \nIslands,place,island,-,Y \nIsland in,place,island,in,N \nIslands in,place,island,in,Y \nIsland near,place,island,near,N \nIslands near,place,island,near,Y \nIslet,place,islet,-,N \nIslets,place,islet,-,Y \nIslet in,place,islet,in,N \nIslets in,place,islet,in,Y \nIslet near,place,islet,near,N \nIslets near,place,islet,near,Y \nLocality,place,locality,-,N \nLocalitys,place,locality,-,Y \nLocalities,place,locality,-,Y \nLocality in,place,locality,in,N \nLocalitys in,place,locality,in,Y \nLocalities in,place,locality,in,Y \nLocality near,place,locality,near,N \nLocalitys near,place,locality,near,Y \nLocalities near,place,locality,near,Y \nMunicipality,place,municipality,-,N \nMunicipalitys,place,municipality,-,Y \nMunicipalities,place,municipality,-,Y \nMunicipality in,place,municipality,in,N \nMunicipalitys in,place,municipality,in,Y \nMunicipalities in,place,municipality,in,Y \nMunicipality near,place,municipality,near,N \nMunicipalitys near,place,municipality,near,Y \nMunicipalities near,place,municipality,near,Y \nRegion,place,region,-,N \nRegions,place,region,-,Y \nRegion in,place,region,in,N \nRegions in,place,region,in,Y \nRegion near,place,region,near,N \nRegions near,place,region,near,Y \nSea,place,sea,-,N \nSeas,place,sea,-,Y \nSea in,place,sea,in,N \nSeas in,place,sea,in,Y \nSea near,place,sea,near,N \nSeas near,place,sea,near,Y \nState,place,state,-,N \nStates,place,state,-,Y \nState in,place,state,in,N \nStates in,place,state,in,Y \nState near,place,state,near,N \nStates near,place,state,near,Y \nSuburb,place,suburb,-,N \nSuburbs,place,suburb,-,Y \nSuburb in,place,suburb,in,N \nSuburbs in,place,suburb,in,Y \nSuburb near,place,suburb,near,N \nSuburbs near,place,suburb,near,Y \nTown,place,town,-,N \nTowns,place,town,-,Y \nTown in,place,town,in,N \nTowns in,place,town,in,Y \nTown near,place,town,near,N \nTowns near,place,town,near,Y \nVillage,place,village,-,N \nVillages,place,village,-,Y \nVillage in,place,village,in,N \nVillages in,place,village,in,Y \nVillage near,place,village,near,N \nVillages near,place,village,near,Y \nAbandoned Railway,railway,abandoned,-,N \nAbandoned Railways,railway,abandoned,-,Y \nAbandoned Railway in,railway,abandoned,in,N \nAbandoned Railways in,railway,abandoned,in,Y \nAbandoned Railway near,railway,abandoned,near,N \nAbandoned Railways near,railway,abandoned,near,Y \nRailway under Construction,railway,construction,-,N \nRailway under Constructions,railway,construction,-,Y \nRailway under Construction in,railway,construction,in,N \nRailway under Constructions in,railway,construction,in,Y \nRailway under Construction near,railway,construction,near,N \nRailway under Constructions near,railway,construction,near,Y \nDisused Railway,railway,disused,-,N \nDisused Railways,railway,disused,-,Y \nDisused Railway in,railway,disused,in,N \nDisused Railways in,railway,disused,in,Y \nDisused Railway near,railway,disused,near,N \nDisused Railways near,railway,disused,near,Y \nFunicular Railway,railway,funicular,-,N \nFunicular Railways,railway,funicular,-,Y \nFunicular Railway in,railway,funicular,in,N \nFunicular Railways in,railway,funicular,in,Y \nFunicular Railway near,railway,funicular,near,N \nFunicular Railways near,railway,funicular,near,Y \nTrain Stop,railway,halt,-,N \nTrain Stops,railway,halt,-,Y \nTrain Stop in,railway,halt,in,N \nTrain Stops in,railway,halt,in,Y \nTrain Stop near,railway,halt,near,N \nTrain Stops near,railway,halt,near,Y \nLevel Crossing,railway,level_crossing,-,N \nLevel Crossings,railway,level_crossing,-,Y \nLevel Crossing in,railway,level_crossing,in,N \nLevel Crossings in,railway,level_crossing,in,Y \nLevel Crossing near,railway,level_crossing,near,N \nLevel Crossings near,railway,level_crossing,near,Y \nLight Rail,railway,light_rail,-,N \nLight Rails,railway,light_rail,-,Y \nLight Rail in,railway,light_rail,in,N \nLight Rails in,railway,light_rail,in,Y \nLight Rail near,railway,light_rail,near,N \nLight Rails near,railway,light_rail,near,Y \nMonorail,railway,monorail,-,N \nMonorails,railway,monorail,-,Y \nMonorail in,railway,monorail,in,N \nMonorails in,railway,monorail,in,Y \nMonorail near,railway,monorail,near,N \nMonorails near,railway,monorail,near,Y \nNarrow Gauge Railway,railway,narrow_gauge,-,N \nNarrow Gauge Railways,railway,narrow_gauge,-,Y \nNarrow Gauge Railway in,railway,narrow_gauge,in,N \nNarrow Gauge Railways in,railway,narrow_gauge,in,Y \nNarrow Gauge Railway near,railway,narrow_gauge,near,N \nNarrow Gauge Railways near,railway,narrow_gauge,near,Y \nRailway Platform,railway,platform,-,N \nRailway Platforms,railway,platform,-,Y \nRailway Platform in,railway,platform,in,N \nRailway Platforms in,railway,platform,in,Y \nRailway Platform near,railway,platform,near,N \nRailway Platforms near,railway,platform,near,Y \nPreserved Railway,railway,preserved,-,N \nPreserved Railways,railway,preserved,-,Y \nPreserved Railway in,railway,preserved,in,N \nPreserved Railways in,railway,preserved,in,Y \nPreserved Railway near,railway,preserved,near,N \nPreserved Railways near,railway,preserved,near,Y \nRailway Station,railway,station,-,N \nRailway Stations,railway,station,-,Y \nRailway Station in,railway,station,in,N \nRailway Stations in,railway,station,in,Y \nRailway Station near,railway,station,near,N \nRailway Stations near,railway,station,near,Y \nStation,railway,station,-,N \nStations,railway,station,-,Y \nStation in,railway,station,in,N \nStations in,railway,station,in,Y \nStation near,railway,station,near,N \nStations near,railway,station,near,Y \nSubway Station,railway,subway,-,N \nSubway Stations,railway,subway,-,Y \nSubway Station in,railway,subway,in,N \nSubway Stations in,railway,subway,in,Y \nSubway Station near,railway,subway,near,N \nSubway Stations near,railway,subway,near,Y \nSubway Entrance,railway,subway_entrance,-,N \nSubway Entrances,railway,subway_entrance,-,Y \nSubway Entrance in,railway,subway_entrance,in,N \nSubway Entrances in,railway,subway_entrance,in,Y \nSubway Entrance near,railway,subway_entrance,near,N \nSubway Entrances near,railway,subway_entrance,near,Y \nRailway Points,railway,switch,-,N \nRailway Points,railway,switch,-,Y \nRailway Points in,railway,switch,in,N \nRailway Points in,railway,switch,in,Y \nRailway Points near,railway,switch,near,N \nRailway Points near,railway,switch,near,Y \nTramway,railway,tram,-,N \nTramways,railway,tram,-,Y \nTramway in,railway,tram,in,N \nTramways in,railway,tram,in,Y \nTramway near,railway,tram,near,N \nTramways near,railway,tram,near,Y \nTram Stop,railway,tram_stop,-,N \nTram Stops,railway,tram_stop,-,Y \nTram Stop in,railway,tram_stop,in,N \nTram Stops in,railway,tram_stop,in,Y \nTram Stop near,railway,tram_stop,near,N \nTram Stops near,railway,tram_stop,near,Y \nOff Licence,shop,alcohol,-,N \nOff Licences,shop,alcohol,-,Y \nOff Licence in,shop,alcohol,in,N \nOff Licences in,shop,alcohol,in,Y \nOff Licence near,shop,alcohol,near,N \nOff Licences near,shop,alcohol,near,Y \nOff License,shop,alcohol,-,N \nOff Licenses,shop,alcohol,-,Y \nOff License in,shop,alcohol,in,N \nOff Licenses in,shop,alcohol,in,Y \nOff License near,shop,alcohol,near,N \nOff Licenses near,shop,alcohol,near,Y \nArt Shop,shop,art,-,N \nArt Shops,shop,art,-,Y \nArt Shop in,shop,art,in,N \nArt Shops in,shop,art,in,Y \nArt Shop near,shop,art,near,N \nArt Shops near,shop,art,near,Y \nBakery,shop,bakery,-,N \nBakerys,shop,bakery,-,Y \nBakeries,shop,bakery,-,Y \nBakery in,shop,bakery,in,N \nBakerys in,shop,bakery,in,Y \nBakeries in,shop,bakery,in,Y \nBakery near,shop,bakery,near,N \nBakerys near,shop,bakery,near,Y \nBakeries near,shop,bakery,near,Y \nBeauty Shop,shop,beauty,-,N \nBeauty Shops,shop,beauty,-,Y \nBeauty Shop in,shop,beauty,in,N \nBeauty Shops in,shop,beauty,in,Y \nBeauty Shop near,shop,beauty,near,N \nBeauty Shops near,shop,beauty,near,Y \nBeverages Shop,shop,beverages,-,N \nBeverages Shops,shop,beverages,-,Y \nBeverages Shop in,shop,beverages,in,N \nBeverages Shops in,shop,beverages,in,Y \nBeverages Shop near,shop,beverages,near,N \nBeverages Shops near,shop,beverages,near,Y \nBicycle Shop,shop,bicycle,-,N \nBicycle Shops,shop,bicycle,-,Y \nBicycle Shop in,shop,bicycle,in,N \nBicycle Shops in,shop,bicycle,in,Y \nBicycle Shop near,shop,bicycle,near,N \nBicycle Shops near,shop,bicycle,near,Y \nBook Shop,shop,books,-,N \nBook Shops,shop,books,-,Y \nBook Shop in,shop,books,in,N \nBook Shops in,shop,books,in,Y \nBook Shop near,shop,books,near,N \nBook Shops near,shop,books,near,Y \nButcher,shop,butcher,-,N \nButchers,shop,butcher,-,Y \nButcher in,shop,butcher,in,N \nButchers in,shop,butcher,in,Y \nButcher near,shop,butcher,near,N \nButchers near,shop,butcher,near,Y \nCar Shop,shop,car,-,N \nCar Shops,shop,car,-,Y \nCar Shop in,shop,car,in,N \nCar Shops in,shop,car,in,Y \nCar Shop near,shop,car,near,N \nCar Shops near,shop,car,near,Y \nCar Parts,shop,car_parts,-,N \nCar Parts,shop,car_parts,-,Y \nCar Parts in,shop,car_parts,in,N \nCar Parts in,shop,car_parts,in,Y \nCar Parts near,shop,car_parts,near,N \nCar Parts near,shop,car_parts,near,Y \nCarpet Shop,shop,carpet,-,N \nCarpet Shops,shop,carpet,-,Y \nCarpet Shop in,shop,carpet,in,N \nCarpet Shops in,shop,carpet,in,Y \nCarpet Shop near,shop,carpet,near,N \nCarpet Shops near,shop,carpet,near,Y \nCar Repair,shop,car_repair,-,N \nCar Repairs,shop,car_repair,-,Y \nCar Repair in,shop,car_repair,in,N \nCar Repairs in,shop,car_repair,in,Y \nCar Repair near,shop,car_repair,near,N \nCar Repairs near,shop,car_repair,near,Y \nCharity Shop,shop,charity,-,N \nCharity Shops,shop,charity,-,Y \nCharity Shop in,shop,charity,in,N \nCharity Shops in,shop,charity,in,Y \nCharity Shop near,shop,charity,near,N \nCharity Shops near,shop,charity,near,Y \nChemist,shop,chemist,-,N \nChemists,shop,chemist,-,Y \nChemist in,shop,chemist,in,N \nChemists in,shop,chemist,in,Y \nChemist near,shop,chemist,near,N \nChemists near,shop,chemist,near,Y \nClothes Shop,shop,clothes,-,N \nClothes Shops,shop,clothes,-,Y \nClothes Shop in,shop,clothes,in,N \nClothes Shops in,shop,clothes,in,Y \nClothes Shop near,shop,clothes,near,N \nClothes Shops near,shop,clothes,near,Y \nComputer Shop,shop,computer,-,N \nComputer Shops,shop,computer,-,Y \nComputer Shop in,shop,computer,in,N \nComputer Shops in,shop,computer,in,Y \nComputer Shop near,shop,computer,near,N \nComputer Shops near,shop,computer,near,Y \nConfectionery Shop,shop,confectionery,-,N \nConfectionery Shops,shop,confectionery,-,Y \nConfectionery Shop in,shop,confectionery,in,N \nConfectionery Shops in,shop,confectionery,in,Y \nConfectionery Shop near,shop,confectionery,near,N \nConfectionery Shops near,shop,confectionery,near,Y \nConvenience Store,shop,convenience,-,N \nConvenience Stores,shop,convenience,-,Y \nConvenience Store in,shop,convenience,in,N \nConvenience Stores in,shop,convenience,in,Y \nConvenience Store near,shop,convenience,near,N \nConvenience Stores near,shop,convenience,near,Y \nCopy Shop,shop,copyshop,-,N \nCopy Shops,shop,copyshop,-,Y \nCopy Shop in,shop,copyshop,in,N \nCopy Shops in,shop,copyshop,in,Y \nCopy Shop near,shop,copyshop,near,N \nCopy Shops near,shop,copyshop,near,Y \nCosmetics,shop,copyshop,-,Y \nCosmetics in,shop,copyshop,in,Y \nCosmetics near,shop,copyshop,near,Y \nCosmetics Shop,shop,cosmetics,-,N \nCosmetics Shops,shop,cosmetics,-,Y \nCosmetics Shop in,shop,cosmetics,in,N \nCosmetics Shops in,shop,cosmetics,in,Y \nCosmetics Shop near,shop,cosmetics,near,N \nCosmetics Shops near,shop,cosmetics,near,Y \nDelicatessen,shop,deli,-,N \nDelicatessen,shop,deli,-,Y \nDelicatessen in,shop,deli,in,N \nDelicatessen in,shop,deli,in,Y \nDelicatessen near,shop,deli,near,N \nDelicatessen near,shop,deli,near,Y \nDepartment Store,shop,department_store,-,N \nDepartment Stores,shop,department_store,-,Y \nDepartment Store in,shop,department_store,in,N \nDepartment Stores in,shop,department_store,in,Y \nDepartment Store near,shop,department_store,near,N \nDepartment Stores near,shop,department_store,near,Y \nFish Shop,shop,seafood,-,N \nFish Shops,shop,seafood,-,Y \nFish Shop in,shop,seafood,in,N \nFish Shops in,shop,seafood,in,Y \nFish Shop near,shop,seafood,near,N \nFish Shops near,shop,seafood,near,Y \nSeafood Shop,shop,seafood,-,N \nSeafood Shops,shop,seafood,-,Y \nSeafood Shop in,shop,seafood,in,N \nSeafood Shops in,shop,seafood,in,Y \nSeafood Shop near,shop,seafood,near,N \nSeafood Shops near,shop,seafood,near,Y \nDo-It-Yourself,shop,doityourself,-,N \nDo-It-Yourselfs,shop,doityourself,-,Y \nDo-It-Yourselves,shop,doityourself,-,Y \nDo-It-Yourself in,shop,doityourself,in,N \nDo-It-Yourselfs in,shop,doityourself,in,Y \nDo-It-Yourselves in,shop,doityourself,in,Y \nDo-It-Yourself near,shop,doityourself,near,N \nDo-It-Yourselfs near,shop,doityourself,near,Y \nDo-It-Yourselves near,shop,doityourself,near,Y \nDry Cleaning,shop,dry_cleaning,-,N \nDry Cleanings,shop,dry_cleaning,-,Y \nDry Cleaning in,shop,dry_cleaning,in,N \nDry Cleanings in,shop,dry_cleaning,in,Y \nDry Cleaning near,shop,dry_cleaning,near,N \nDry Cleanings near,shop,dry_cleaning,near,Y \nElectronics Shop,shop,electronics,-,N \nElectronics Shops,shop,electronics,-,Y \nElectronics Shop in,shop,electronics,in,N \nElectronics Shops in,shop,electronics,in,Y \nElectronics Shop near,shop,electronics,near,N \nElectronics Shops near,shop,electronics,near,Y \nErotic Shop,shop,erotic,-,N \nErotic Shops,shop,erotic,-,Y \nErotic Shop in,shop,erotic,in,N \nErotic Shops in,shop,erotic,in,Y \nErotic Shop near,shop,erotic,near,N \nErotic Shops near,shop,erotic,near,Y \nSex Shop,shop,erotic,-,N \nSex Shops,shop,erotic,-,Y \nSex Shop in,shop,erotic,in,N \nSex Shops in,shop,erotic,in,Y \nSex Shop near,shop,erotic,near,N \nSex Shops near,shop,erotic,near,Y \nEstate Agent,shop,estate_agent,-,N \nEstate Agents,shop,estate_agent,-,Y \nEstate Agent in,shop,estate_agent,in,N \nEstate Agents in,shop,estate_agent,in,Y \nEstate Agent near,shop,estate_agent,near,N \nEstate Agents near,shop,estate_agent,near,Y \nFarm Shop,shop,farm,-,N \nFarm Shops,shop,farm,-,Y \nFarm Shop in,shop,farm,in,N \nFarm Shops in,shop,farm,in,Y \nFarm Shop near,shop,farm,near,N \nFarm Shops near,shop,farm,near,Y \nFashion Shop,shop,fashion,-,N \nFashion Shops,shop,fashion,-,Y \nFashion Shop in,shop,fashion,in,N \nFashion Shops in,shop,fashion,in,Y \nFashion Shop near,shop,fashion,near,N \nFashion Shops near,shop,fashion,near,Y \nFlorist,shop,florist,-,N \nFlorists,shop,florist,-,Y \nFlorist in,shop,florist,in,N \nFlorists in,shop,florist,in,Y \nFlorist near,shop,florist,near,N \nFlorists near,shop,florist,near,Y \nFood Shop,shop,food,-,N \nFood Shops,shop,food,-,Y \nFood Shop in,shop,food,in,N \nFood Shops in,shop,food,in,Y \nFood Shop near,shop,food,near,N \nFood Shops near,shop,food,near,Y \nFuneral Director,shop,funeral_directors,-,N \nFuneral Directors,shop,funeral_directors,-,Y \nFuneral Director in,shop,funeral_directors,in,N \nFuneral Directors in,shop,funeral_directors,in,Y \nFuneral Director near,shop,funeral_directors,near,N \nFuneral Directors near,shop,funeral_directors,near,Y \nFurniture,shop,furniture,-,N \nFurnitures,shop,furniture,-,Y \nFurniture in,shop,furniture,in,N \nFurnitures in,shop,furniture,in,Y \nFurniture near,shop,furniture,near,N \nFurnitures near,shop,furniture,near,Y \nGarden Centre,shop,garden_centre,-,N \nGarden Centres,shop,garden_centre,-,Y \nGarden Centre in,shop,garden_centre,in,N \nGarden Centres in,shop,garden_centre,in,Y \nGarden Centre near,shop,garden_centre,near,N \nGarden Centres near,shop,garden_centre,near,Y \nGarden Center,shop,garden_centre,-,N \nGarden Centers,shop,garden_centre,-,Y \nGarden Center in,shop,garden_centre,in,N \nGarden Centers in,shop,garden_centre,in,Y \nGarden Center near,shop,garden_centre,near,N \nGarden Centers near,shop,garden_centre,near,Y \nGeneral Store,shop,general,-,N \nGeneral Stores,shop,general,-,Y \nGeneral Store in,shop,general,in,N \nGeneral Stores in,shop,general,in,Y \nGeneral Store near,shop,general,near,N \nGeneral Stores near,shop,general,near,Y \nGift Shop,shop,gift,-,N \nGift Shops,shop,gift,-,Y \nGift Shop in,shop,gift,in,N \nGift Shops in,shop,gift,in,Y \nGift Shop near,shop,gift,near,N \nGift Shops near,shop,gift,near,Y \nGreengrocer,shop,greengrocer,-,N \nGreengrocers,shop,greengrocer,-,Y \nGreengrocer in,shop,greengrocer,in,N \nGreengrocers in,shop,greengrocer,in,Y \nGreengrocer near,shop,greengrocer,near,N \nGreengrocers near,shop,greengrocer,near,Y \nHairdresser,shop,hairdresser,-,N \nHairdressers,shop,hairdresser,-,Y \nHairdresser in,shop,hairdresser,in,N \nHairdressers in,shop,hairdresser,in,Y \nHairdresser near,shop,hairdresser,near,N \nHairdressers near,shop,hairdresser,near,Y \nHardware Store,shop,hardware,-,N \nHardware Stores,shop,hardware,-,Y \nHardware Store in,shop,hardware,in,N \nHardware Stores in,shop,hardware,in,Y \nHardware Store near,shop,hardware,near,N \nHardware Stores near,shop,hardware,near,Y \nHi-Fi,shop,hifi,-,N \nHi-Fis,shop,hifi,-,Y \nHi-Fi in,shop,hifi,in,N \nHi-Fis in,shop,hifi,in,Y \nHi-Fi near,shop,hifi,near,N \nHi-Fis near,shop,hifi,near,Y \nInsurance,office,insurance,-,N \nInsurances,office,insurance,-,Y \nInsurance in,office,insurance,in,N \nInsurances in,office,insurance,in,Y \nInsurance near,office,insurance,near,N \nInsurances near,office,insurance,near,Y \nJewelry Shop,shop,jewelry,-,N \nJewelry Shops,shop,jewelry,-,Y \nJewelry Shop in,shop,jewelry,in,N \nJewelry Shops in,shop,jewelry,in,Y \nJewelry Shop near,shop,jewelry,near,N \nJewelry Shops near,shop,jewelry,near,Y \nKiosk Shop,shop,kiosk,-,N \nKiosk Shops,shop,kiosk,-,Y \nKiosk Shop in,shop,kiosk,in,N \nKiosk Shops in,shop,kiosk,in,Y \nKiosk Shop near,shop,kiosk,near,N \nKiosk Shops near,shop,kiosk,near,Y \nLaundry,shop,laundry,-,N \nLaundrys,shop,laundry,-,Y \nLaundries,shop,laundry,-,Y \nLaundry in,shop,laundry,in,N \nLaundrys in,shop,laundry,in,Y \nLaundries in,shop,laundry,in,Y \nLaundry near,shop,laundry,near,N \nLaundrys near,shop,laundry,near,Y \nLaundries near,shop,laundry,near,Y \nMall,shop,mall,-,N \nMalls,shop,mall,-,Y \nMall in,shop,mall,in,N \nMalls in,shop,mall,in,Y \nMall near,shop,mall,near,N \nMalls near,shop,mall,near,Y \nMassage Shop,shop,massage,-,N \nMassage Shops,shop,massage,-,Y \nMassage Shop in,shop,massage,in,N \nMassage Shops in,shop,massage,in,Y \nMassage Shop near,shop,massage,near,N \nMassage Shops near,shop,massage,near,Y \nMobile Phone Shop,shop,mobile_phone,-,N \nMobile Phone Shops,shop,mobile_phone,-,Y \nMobile Phone Shop in,shop,mobile_phone,in,N \nMobile Phone Shops in,shop,mobile_phone,in,Y \nMobile Phone Shop near,shop,mobile_phone,near,N \nMobile Phone Shops near,shop,mobile_phone,near,Y \nMotorcycle Shop,shop,motorcycle,-,N \nMotorcycle Shops,shop,motorcycle,-,Y \nMotorcycle Shop in,shop,motorcycle,in,N \nMotorcycle Shops in,shop,motorcycle,in,Y \nMotorcycle Shop near,shop,motorcycle,near,N \nMotorcycle Shops near,shop,motorcycle,near,Y \nMusic Shop,shop,music,-,N \nMusic Shops,shop,music,-,Y \nMusic Shop in,shop,music,in,N \nMusic Shops in,shop,music,in,Y \nMusic Shop near,shop,music,near,N \nMusic Shops near,shop,music,near,Y \nNewsagent,shop,newsagent,-,N \nNewsagents,shop,newsagent,-,Y \nNewsagent in,shop,newsagent,in,N \nNewsagents in,shop,newsagent,in,Y \nNewsagent near,shop,newsagent,near,N \nNewsagents near,shop,newsagent,near,Y \nOptician,shop,optician,-,N \nOpticians,shop,optician,-,Y \nOptician in,shop,optician,in,N \nOpticians in,shop,optician,in,Y \nOptician near,shop,optician,near,N \nOpticians near,shop,optician,near,Y \nOrganic Food Shop,shop,organic,-,N \nOrganic Food Shops,shop,organic,-,Y \nOrganic Food Shop in,shop,organic,in,N \nOrganic Food Shops in,shop,organic,in,Y \nOrganic Food Shop near,shop,organic,near,N \nOrganic Food Shops near,shop,organic,near,Y \nOutdoor Shop,shop,outdoor,-,N \nOutdoor Shops,shop,outdoor,-,Y \nOutdoor Shop in,shop,outdoor,in,N \nOutdoor Shops in,shop,outdoor,in,Y \nOutdoor Shop near,shop,outdoor,near,N \nOutdoor Shops near,shop,outdoor,near,Y \nPet Shop,shop,pet,-,N \nPet Shops,shop,pet,-,Y \nPet Shop in,shop,pet,in,N \nPet Shops in,shop,pet,in,Y \nPet Shop near,shop,pet,near,N \nPet Shops near,shop,pet,near,Y \nPhoto Shop,shop,photo,-,N \nPhoto Shops,shop,photo,-,Y \nPhoto Shop in,shop,photo,in,N \nPhoto Shops in,shop,photo,in,Y \nPhoto Shop near,shop,photo,near,N \nPhoto Shops near,shop,photo,near,Y \nSalon,shop,salon,-,N \nSalons,shop,salon,-,Y \nSalon in,shop,salon,in,N \nSalons in,shop,salon,in,Y \nSalon near,shop,salon,near,N \nSalons near,shop,salon,near,Y \nShoe Shop,shop,shoes,-,N \nShoe Shops,shop,shoes,-,Y \nShoe Shop in,shop,shoes,in,N \nShoe Shops in,shop,shoes,in,Y \nShoe Shop near,shop,shoes,near,N \nShoe Shops near,shop,shoes,near,Y \nShopping Centre,shop,shopping_centre,-,N \nShopping Centres,shop,shopping_centre,-,Y \nShopping Centre in,shop,shopping_centre,in,N \nShopping Centres in,shop,shopping_centre,in,Y \nShopping Centre near,shop,shopping_centre,near,N \nShopping Centres near,shop,shopping_centre,near,Y \nShopping Center,shop,shopping_centre,-,N \nShopping Centers,shop,shopping_centre,-,Y \nShopping Center in,shop,shopping_centre,in,N \nShopping Centers in,shop,shopping_centre,in,Y \nShopping Center near,shop,shopping_centre,near,N \nShopping Centers near,shop,shopping_centre,near,Y \nSports Shop,shop,sports,-,N \nSports Shops,shop,sports,-,Y \nSports Shop in,shop,sports,in,N \nSports Shops in,shop,sports,in,Y \nSports Shop near,shop,sports,near,N \nSports Shops near,shop,sports,near,Y \nStationery Shop,shop,stationery,-,N \nStationery Shops,shop,stationery,-,Y \nStationery Shop in,shop,stationery,in,N \nStationery Shops in,shop,stationery,in,Y \nStationery Shop near,shop,stationery,near,N \nStationery Shops near,shop,stationery,near,Y \nSupermarket,shop,supermarket,-,N \nSupermarkets,shop,supermarket,-,Y \nSupermarket in,shop,supermarket,in,N \nSupermarkets in,shop,supermarket,in,Y \nSupermarket near,shop,supermarket,near,N \nSupermarkets near,shop,supermarket,near,Y \nTattoo Studio,shop,tattoo,-,N \nTattoo Studios,shop,tattoo,-,Y \nTattoo Studio in,shop,tattoo,in,N \nTattoo Studios in,shop,tattoo,in,Y \nTattoo Studio near,shop,tattoo,near,N \nTattoo Studios near,shop,tattoo,near,Y \nTobacco Shop,shop,tobacco,-,N \nTobacco Shops,shop,tobacco,-,Y \nTobacco Shop in,shop,tobacco,in,N \nTobacco Shops in,shop,tobacco,in,Y \nTobacco Shop near,shop,tobacco,near,N \nTobacco Shops near,shop,tobacco,near,Y \nToy Shop,shop,toys,-,N \nToy Shops,shop,toys,-,Y \nToy Shop in,shop,toys,in,N \nToy Shops in,shop,toys,in,Y \nToy Shop near,shop,toys,near,N \nToy Shops near,shop,toys,near,Y \nTravel Agency,shop,travel_agency,-,N \nTravel Agencys,shop,travel_agency,-,Y \nTravel Agencies,shop,travel_agency,-,Y \nTravel Agency in,shop,travel_agency,in,N \nTravel Agencys in,shop,travel_agency,in,Y \nTravel Agencies in,shop,travel_agency,in,Y \nTravel Agency near,shop,travel_agency,near,N \nTravel Agencys near,shop,travel_agency,near,Y \nTravel Agencies near,shop,travel_agency,near,Y \nVideo Shop,shop,video,-,N \nVideo Shops,shop,video,-,Y \nVideo Shop in,shop,video,in,N \nVideo Shops in,shop,video,in,Y \nVideo Shop near,shop,video,near,N \nVideo Shops near,shop,video,near,Y \nOff Licence,shop,wine,-,N \nOff Licences,shop,wine,-,Y \nOff Licence in,shop,wine,in,N \nOff Licences in,shop,wine,in,Y \nOff Licence near,shop,wine,near,N \nOff Licences near,shop,wine,near,Y \nOff License,shop,wine,-,N \nOff Licenses,shop,wine,-,Y \nOff License in,shop,wine,in,N \nOff Licenses in,shop,wine,in,Y \nOff License near,shop,wine,near,N \nOff Licenses near,shop,wine,near,Y \nWine Shop,shop,wine,-,N \nWine Shops,shop,wine,-,Y \nWine Shop in,shop,wine,in,N \nWine Shops in,shop,wine,in,Y \nWine Shop near,shop,wine,near,N \nWine Shops near,shop,wine,near,Y \nNursing Home,social_facility,nursing_home,-,N \nNursing Homes,social_facility,nursing_home,-,Y \nNursing Home in,social_facility,nursing_home,in,N \nNursing Homes in,social_facility,nursing_home,in,Y \nNursing Home near,social_facility,nursing_home,near,N \nNursing Homes near,social_facility,nursing_home,near,Y \nAlpine Hut,tourism,alpine_hut,-,N \nAlpine Huts,tourism,alpine_hut,-,Y \nAlpine Hut in,tourism,alpine_hut,in,N \nAlpine Huts in,tourism,alpine_hut,in,Y \nAlpine Hut near,tourism,alpine_hut,near,N \nAlpine Huts near,tourism,alpine_hut,near,Y \nAquarium,tourism,aquarium,-,N \nAquariums,tourism,aquarium,-,Y \nAquarium in,tourism,aquarium,in,N \nAquariums in,tourism,aquarium,in,Y \nAquarium near,tourism,aquarium,near,N \nAquariums near,tourism,aquarium,near,Y \nArtwork,tourism,artwork,-,N \nArtworks,tourism,artwork,-,Y \nArtwork in,tourism,artwork,in,N \nArtworks in,tourism,artwork,in,Y \nArtwork near,tourism,artwork,near,N \nArtworks near,tourism,artwork,near,Y \nAttraction,tourism,attraction,-,N \nAttractions,tourism,attraction,-,Y \nAttraction in,tourism,attraction,in,N \nAttractions in,tourism,attraction,in,Y \nAttraction near,tourism,attraction,near,N \nAttractions near,tourism,attraction,near,Y \nCamp Site,tourism,camp_site,-,N \nCamp Sites,tourism,camp_site,-,Y \nCamp Site in,tourism,camp_site,in,N \nCamp Sites in,tourism,camp_site,in,Y \nCamp Site near,tourism,camp_site,near,N \nCamp Sites near,tourism,camp_site,near,Y \nCaravan Site,tourism,caravan_site,-,N \nCaravan Sites,tourism,caravan_site,-,Y \nCaravan Site in,tourism,caravan_site,in,N \nCaravan Sites in,tourism,caravan_site,in,Y \nCaravan Site near,tourism,caravan_site,near,N \nCaravan Sites near,tourism,caravan_site,near,Y \nChalet,tourism,chalet,-,N \nChalets,tourism,chalet,-,Y \nChalet in,tourism,chalet,in,N \nChalets in,tourism,chalet,in,Y \nChalet near,tourism,chalet,near,N \nChalets near,tourism,chalet,near,Y \nGuest House,tourism,guest_house,-,N \nGuest Houses,tourism,guest_house,-,Y \nGuest House in,tourism,guest_house,in,N \nGuest Houses in,tourism,guest_house,in,Y \nGuest House near,tourism,guest_house,near,N \nGuest Houses near,tourism,guest_house,near,Y \nHostel,tourism,hostel,-,N \nHostels,tourism,hostel,-,Y \nHostel in,tourism,hostel,in,N \nHostels in,tourism,hostel,in,Y \nHostel near,tourism,hostel,near,N \nHostels near,tourism,hostel,near,Y \nHotel,tourism,hotel,-,N \nHotels,tourism,hotel,-,Y \nHotel in,tourism,hotel,in,N \nHotels in,tourism,hotel,in,Y \nHotel near,tourism,hotel,near,N \nHotels near,tourism,hotel,near,Y \nInformation,tourism,information,-,N \nInformations,tourism,information,-,Y \nInformation in,tourism,information,in,N \nInformations in,tourism,information,in,Y \nInformation near,tourism,information,near,N \nInformations near,tourism,information,near,Y \nMotel,tourism,motel,-,N \nMotels,tourism,motel,-,Y \nMotel in,tourism,motel,in,N \nMotels in,tourism,motel,in,Y \nMotel near,tourism,motel,near,N \nMotels near,tourism,motel,near,Y \nMuseum,tourism,museum,-,N \nMuseums,tourism,museum,-,Y \nMuseum in,tourism,museum,in,N \nMuseums in,tourism,museum,in,Y \nMuseum near,tourism,museum,near,N \nMuseums near,tourism,museum,near,Y \nPicnic Site,tourism,picnic_site,-,N \nPicnic Sites,tourism,picnic_site,-,Y \nPicnic Site in,tourism,picnic_site,in,N \nPicnic Sites in,tourism,picnic_site,in,Y \nPicnic Site near,tourism,picnic_site,near,N \nPicnic Sites near,tourism,picnic_site,near,Y \nTheme Park,tourism,theme_park,-,N \nTheme Parks,tourism,theme_park,-,Y \nTheme Park in,tourism,theme_park,in,N \nTheme Parks in,tourism,theme_park,in,Y \nTheme Park near,tourism,theme_park,near,N \nTheme Parks near,tourism,theme_park,near,Y \nViewpoint,tourism,viewpoint,-,N \nViewpoints,tourism,viewpoint,-,Y \nViewpoint in,tourism,viewpoint,in,N \nViewpoints in,tourism,viewpoint,in,Y \nViewpoint near,tourism,viewpoint,near,N \nViewpoints near,tourism,viewpoint,near,Y \nZoo,tourism,zoo,-,N \nZoos,tourism,zoo,-,Y \nZoo in,tourism,zoo,in,N \nZoos in,tourism,zoo,in,Y \nZoo near,tourism,zoo,near,N \nZoos near,tourism,zoo,near,Y \nBoatyard,waterway,boatyard,-,N \nBoatyards,waterway,boatyard,-,Y \nBoatyard in,waterway,boatyard,in,N \nBoatyards in,waterway,boatyard,in,Y \nBoatyard near,waterway,boatyard,near,N \nBoatyards near,waterway,boatyard,near,Y \nBoat Ramp,leisure,slipway,-,N \nBoat Ramps,leisure,slipway,-,Y \nBoat Ramp in,leisure,slipway,in,N \nBoat Ramps in,leisure,slipway,in,Y \nBoat Ramp near,leisure,slipway,near,N \nBoat Ramps near,leisure,slipway,near,Y \nCanal,waterway,canal,-,N \nCanals,waterway,canal,-,Y \nCanal in,waterway,canal,in,N \nCanals in,waterway,canal,in,Y \nCanal near,waterway,canal,near,N \nCanals near,waterway,canal,near,Y \nDam,waterway,dam,-,N \nDams,waterway,dam,-,Y \nDam in,waterway,dam,in,N \nDams in,waterway,dam,in,Y \nDam near,waterway,dam,near,N \nDams near,waterway,dam,near,Y \nDerelict Canal,waterway,derelict_canal,-,N \nDerelict Canals,waterway,derelict_canal,-,Y \nDerelict Canal in,waterway,derelict_canal,in,N \nDerelict Canals in,waterway,derelict_canal,in,Y \nDerelict Canal near,waterway,derelict_canal,near,N \nDerelict Canals near,waterway,derelict_canal,near,Y \nDitch,waterway,ditch,-,N \nDitchs,waterway,ditch,-,Y \nDitches,waterway,ditch,-,Y \nDitch in,waterway,ditch,in,N \nDitchs in,waterway,ditch,in,Y \nDitches in,waterway,ditch,in,Y \nDitch near,waterway,ditch,near,N \nDitchs near,waterway,ditch,near,Y \nDitches near,waterway,ditch,near,Y \nDock,waterway,dock,-,N \nDocks,waterway,dock,-,Y \nDock in,waterway,dock,in,N \nDocks in,waterway,dock,in,Y \nDock near,waterway,dock,near,N \nDocks near,waterway,dock,near,Y \nDrain,waterway,drain,-,N \nDrains,waterway,drain,-,Y \nDrain in,waterway,drain,in,N \nDrains in,waterway,drain,in,Y \nDrain near,waterway,drain,near,N \nDrains near,waterway,drain,near,Y \nRapids,waterway,rapids,-,N \nRapids,waterway,rapids,-,Y \nRapids in,waterway,rapids,in,N \nRapids in,waterway,rapids,in,Y \nRapids near,waterway,rapids,near,N \nRapids near,waterway,rapids,near,Y \nRiver,waterway,river,-,N \nRivers,waterway,river,-,Y \nRiver in,waterway,river,in,N \nRivers in,waterway,river,in,Y \nRiver near,waterway,river,near,N \nRivers near,waterway,river,near,Y \nRiverbank,waterway,riverbank,-,N \nRiverbanks,waterway,riverbank,-,Y \nRiverbank in,waterway,riverbank,in,N \nRiverbanks in,waterway,riverbank,in,Y \nRiverbank near,waterway,riverbank,near,N \nRiverbanks near,waterway,riverbank,near,Y \nStream,waterway,stream,-,N \nStreams,waterway,stream,-,Y \nStream in,waterway,stream,in,N \nStreams in,waterway,stream,in,Y \nStream near,waterway,stream,near,N \nStreams near,waterway,stream,near,Y \nWadi,waterway,wadi,-,N \nWadis,waterway,wadi,-,Y \nWadi in,waterway,wadi,in,N \nWadis in,waterway,wadi,in,Y \nWadi near,waterway,wadi,near,N \nWadis near,waterway,wadi,near,Y \nWaterfall,waterway,waterfall,-,N \nWaterfalls,waterway,waterfall,-,Y \nWaterfall in,waterway,waterfall,in,N \nWaterfalls in,waterway,waterfall,in,Y \nWaterfall near,waterway,waterfall,near,N \nWaterfalls near,waterway,waterfall,near,Y \nWater Point,waterway,water_point,-,N \nWater Points,waterway,water_point,-,Y \nWater Point in,waterway,water_point,in,N \nWater Points in,waterway,water_point,in,Y \nWater Point near,waterway,water_point,near,N \nWater Points near,waterway,water_point,near,Y \nWeir,waterway,weir,-,N \nWeirs,waterway,weir,-,Y \nWeir in,waterway,weir,in,N \nWeirs in,waterway,weir,in,Y \nWeir near,waterway,weir,near,N \nWeirs near,waterway,weir,near,Y \nCoworking ,office ,coworking ,- ,N \nCoworkings ,office ,coworking ,- ,Y \nCoworking in ,office ,coworking ,in ,N \nCoworkings in ,office ,coworking ,in ,Y \nCoworking near ,office ,coworking ,near ,N \nCoworkings near ,office ,coworking ,near ,Y \nCoworking ,amenity ,coworking_space ,- ,N \nCoworkings ,amenity ,coworking_space ,- ,Y \nCoworking in ,amenity ,coworking_space ,in ,N \nCoworkings in ,amenity ,coworking_space ,in ,Y \nCoworking near ,amenity ,coworking_space ,near ,N \nCoworkings near ,amenity ,coworking_space ,near ,Y \n"
  },
  {
    "path": "test/testdb/tiger/01001.csv",
    "content": "from;to;interpolation;street;city;state;postcode;geometry\r\n1047;1075;all;Spring St;Autauga;AL;36067;LINESTRING(-86.466995 32.428956,-86.466923 32.428933,-86.466861 32.428877,-86.46681 32.428853,-86.466763 32.428832,-86.466712 32.428847,-86.466651 32.428865,-86.466432 32.428973,-86.466404 32.428984)\r\n199;101;odd;Glenbrooke Ln;Autauga;AL;36066;LINESTRING(-86.418881 32.490945,-86.420629 32.490954)\r\n198;100;even;Glenbrooke Ln;Autauga;AL;36066;LINESTRING(-86.418882 32.49078,-86.42063 32.490789)\r\n302;306;all;Golson Rd;Autauga;AL;36067;LINESTRING(-86.552128 32.453273,-86.552043 32.453338,-86.551757 32.453497,-86.551464 32.453648,-86.549523 32.454543)\r\n701;707;all;Silver Hills Dr;Autauga;AL;36066;LINESTRING(-86.42861 32.460465,-86.428572 32.460441,-86.428563 32.460251,-86.428637 32.459907)\r\n499;359;odd;Northington St;Autauga;AL;36067;LINESTRING(-86.465525 32.473644,-86.465681 32.473354,-86.465783 32.473154,-86.465815 32.473082,-86.465869 32.47294,-86.465928 32.472725,-86.466011 32.472371,-86.466257 32.471438)\r\n498;400;even;Northington St;Autauga;AL;36067;LINESTRING(-86.465348 32.473577,-86.465501 32.473288,-86.465599 32.473092,-86.465627 32.473028,-86.465675 32.472894,-86.465734 32.472689,-86.465819 32.472337,-86.466067 32.471402)\r\n1730;1798;even;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.444282 32.540893,-86.447057 32.542481)\r\n1729;1799;odd;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.444391 32.540757,-86.447166 32.542345)\r\n1400;1424;all;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.600436 32.59205,-86.600455 32.592076,-86.600496 32.592128)\r\n1319;1201;odd;Autauga County 112;Autauga;AL;36067;LINESTRING(-86.635429 32.607145,-86.635412 32.607163,-86.635215 32.607388,-86.635107 32.607492,-86.634988 32.607591,-86.634794 32.607735,-86.634396 32.608011,-86.633733 32.608478,-86.632929 32.609035,-86.632199 32.609546,-86.631664 32.609913,-86.629801 32.611208,-86.628363 32.612204,-86.627362 32.612896,-86.627026 32.613114,-86.626831 32.613259,-86.626642 32.613411,-86.626462 32.613575,-86.626406 32.613639,-86.626352 32.613706,-86.626307 32.613787,-86.626268 32.613841,-86.626198 32.613983,-86.626141 32.614129,-86.626105 32.614281,-86.626084 32.614435,-86.626074 32.614885,-86.626113 32.616555,-86.626118 32.617283,-86.626146 32.618695,-86.626138 32.618868)\r\n1298;1200;even;Autauga County 112;Autauga;AL;36067;LINESTRING(-86.635592 32.607235,-86.635576 32.607259,-86.635373 32.607496,-86.635253 32.60761,-86.635124 32.607715,-86.634922 32.607863,-86.63452 32.608139,-86.633857 32.608606,-86.633053 32.609163,-86.632323 32.609674,-86.631788 32.610041,-86.629925 32.611336,-86.628487 32.612332,-86.627486 32.613026,-86.627154 32.613244,-86.626965 32.613383,-86.626786 32.613529,-86.626618 32.613685,-86.62657 32.613737,-86.626528 32.613794,-86.626479 32.613863,-86.626452 32.613915,-86.626388 32.614043,-86.626339 32.614173,-86.626305 32.614309,-86.626286 32.614447,-86.62627 32.614885,-86.626309 32.616553,-86.626314 32.617281,-86.626342 32.618697,-86.626333 32.618875)\r\n399;301;odd;Sally Ridge Rd;Autauga;AL;36067;LINESTRING(-86.471406 32.453549,-86.471431 32.453531,-86.471545 32.453434,-86.471885 32.45322,-86.472175 32.453068,-86.472317 32.452976,-86.472389 32.452925,-86.472458 32.452865,-86.472515 32.452793,-86.472593 32.452646,-86.472643 32.452497,-86.472663 32.452349)\r\n100;376;even;Sally Ridge Rd;Autauga;AL;36067;LINESTRING(-86.471248 32.453453,-86.471271 32.453415,-86.471409 32.4533,-86.471771 32.453078,-86.472061 32.452926,-86.472191 32.452844,-86.472247 32.452801,-86.472294 32.452755,-86.472331 32.452707,-86.472397 32.452586,-86.472441 32.452459,-86.472471 32.452325)\r\n200;236;even;Autauga County 165;Autauga;AL;36003;LINESTRING(-86.64895 32.438478,-86.648994 32.438607,-86.649075 32.438827,-86.649122 32.438955,-86.649263 32.439327)\r\n201;207;odd;Autauga County 165;Autauga;AL;36003;LINESTRING(-86.649137 32.438431,-86.649182 32.438559,-86.649261 32.438779,-86.649308 32.438905,-86.649448 32.439277)\r\n208;298;even;Azalea Dr;Autauga;AL;36067;LINESTRING(-86.455651 32.476554,-86.456419 32.476545)\r\n205;299;odd;Azalea Dr;Autauga;AL;36067;LINESTRING(-86.455649 32.476389,-86.456417 32.47638)\r\n201;287;odd;Michelle Dr;Autauga;AL;36067;LINESTRING(-86.518738 32.47228,-86.518742 32.472171)\r\n290;200;even;Michelle Dr;Autauga;AL;36067;LINESTRING(-86.518543 32.472275,-86.518547 32.472166)\r\n2350;2598;even;Hilltop Farm Rd;Autauga;AL;36067;LINESTRING(-86.600785 32.498358,-86.600796 32.49852)\r\n2601;2799;odd;Hilltop Farm Rd;Autauga;AL;36067;LINESTRING(-86.600979 32.498348,-86.60099 32.49851)\r\n813;801;all;Dunvegan Dr;Autauga;AL;36067;LINESTRING(-86.477626 32.475455,-86.477626 32.475087,-86.47762 32.474869,-86.47763 32.474642,-86.477585 32.474506)\r\n1500;1530;even;Kimberly Ln;Autauga;AL;36066;LINESTRING(-86.451996 32.526546,-86.452033 32.52667,-86.452157 32.526799,-86.452286 32.526941,-86.45234 32.527049,-86.452374 32.527187,-86.452399 32.527366,-86.452427 32.527504)\r\n1501;1599;odd;Kimberly Ln;Autauga;AL;36066;LINESTRING(-86.45218 32.526493,-86.452229 32.526582,-86.452315 32.526693,-86.452482 32.526845,-86.452542 32.527003,-86.452574 32.527161,-86.452597 32.527344,-86.452619 32.527478)\r\n390;300;all;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.611035 32.403433,-86.611064 32.403794,-86.611122 32.405328,-86.611163 32.406786,-86.61119 32.408053,-86.611194 32.408242,-86.611286 32.414086,-86.611307 32.415182,-86.611365 32.418021,-86.611387 32.418304,-86.611407 32.418443,-86.611436 32.418581,-86.611477 32.418716,-86.611556 32.418917,-86.611586 32.418981,-86.611693 32.419173,-86.611815 32.419357,-86.611905 32.419473,-86.612004 32.419586,-86.61211 32.419692,-86.612284 32.419844,-86.612472 32.419989,-86.612667 32.420128,-86.613801 32.420902,-86.614144 32.421114,-86.614426 32.421274,-86.614789 32.421462,-86.615162 32.421634,-86.615544 32.421791,-86.615777 32.421878,-86.616093 32.421986,-86.616412 32.422083,-86.616735 32.422171,-86.617145 32.422265,-86.617558 32.422342,-86.617894 32.422394,-86.618316 32.422444,-86.618738 32.422478,-86.619076 32.422495,-86.619331 32.422501,-86.619647 32.422499,-86.621905 32.422476,-86.625342 32.42245,-86.626028 32.422441,-86.626375 32.422439,-86.626636 32.422451,-86.626759 32.422472)\r\n198;122;all;Kingswood Dr;Autauga;AL;36067;LINESTRING(-86.474468 32.443232,-86.474232 32.443128,-86.474082 32.443057)\r\n3358;3364;all;US Hwy 82;Autauga;AL;36006;LINESTRING(-86.739153 32.628713,-86.739346 32.628858,-86.739491 32.628956,-86.739573 32.629002)\r\n2919;2901;all;Hunter Loop Rd;Autauga;AL;36051;LINESTRING(-86.459716 32.689352,-86.459513 32.689365,-86.458685 32.689434,-86.458523 32.689441,-86.458361 32.689436,-86.457854 32.689393,-86.457174 32.689374,-86.456823 32.689352)\r\n2754;2758;all;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.489884 32.66343,-86.489978 32.663999,-86.490057 32.664422)\r\n399;345;odd;Autauga County 41;Autauga;AL;36067;LINESTRING(-86.562689 32.389122,-86.562677 32.389122,-86.56239 32.389238,-86.562086 32.389363,-86.561925 32.389445,-86.561783 32.389547,-86.561653 32.389657,-86.561537 32.389772,-86.561432 32.389897,-86.561342 32.390025,-86.560733 32.390908,-86.560527 32.391234,-86.560375 32.391499,-86.560307 32.391641,-86.560212 32.391847,-86.5601 32.392128,-86.560006 32.392414,-86.559927 32.392702,-86.559883 32.392923,-86.559838 32.393216,-86.559811 32.393439,-86.559794 32.393733,-86.559797 32.393839,-86.559797 32.394033,-86.559826 32.394472,-86.560085 32.397673,-86.560095 32.39803,-86.560086 32.39817,-86.560071 32.398312,-86.560039 32.398525,-86.559978 32.398805,-86.559893 32.399083,-86.559816 32.399287,-86.559693 32.399551,-86.559588 32.399742,-86.559468 32.399933,-86.55934 32.400114,-86.559198 32.40029,-86.558993 32.400517,-86.557885 32.401626,-86.557777 32.401744,-86.557674 32.401869,-86.557536 32.402061,-86.557456 32.402199,-86.557389 32.402342,-86.557332 32.402486,-86.557269 32.402707,-86.556945 32.403919,-86.556869 32.404214,-86.556843 32.404369,-86.55683 32.404526,-86.556834 32.404726,-86.556841 32.404765)\r\n426;300;even;Autauga County 41;Autauga;AL;36067;LINESTRING(-86.562758 32.389276,-86.562755 32.38928,-86.562476 32.389388,-86.562184 32.389513,-86.562047 32.389587,-86.561919 32.389675,-86.561801 32.389773,-86.561697 32.389878,-86.5616 32.389991,-86.56151 32.390111,-86.560905 32.39099,-86.560703 32.39131,-86.560557 32.391569,-86.560489 32.391703,-86.560398 32.391905,-86.56029 32.392178,-86.560198 32.392456,-86.560123 32.392736,-86.560079 32.392949,-86.560034 32.393236,-86.560009 32.393451,-86.559992 32.393737,-86.559991 32.393837,-86.559995 32.394027,-86.560022 32.394462,-86.560283 32.397665,-86.560291 32.398032,-86.560284 32.398182,-86.560269 32.39833,-86.560235 32.398551,-86.560174 32.398841,-86.560085 32.399129,-86.560006 32.399343,-86.559877 32.399619,-86.559766 32.399818,-86.559642 32.400015,-86.55951 32.400206,-86.55936 32.40039,-86.559149 32.400623,-86.558039 32.401732,-86.557937 32.401844,-86.557842 32.401961,-86.557714 32.402143,-86.55764 32.402269,-86.557577 32.4024,-86.557526 32.402534,-86.557461 32.402745,-86.557137 32.403955,-86.557067 32.404244,-86.557043 32.404387,-86.55703 32.40453,-86.557034 32.404718,-86.557034 32.404751)\r\n208;212;even;Doe Dr;Autauga;AL;36067;LINESTRING(-86.482886 32.454383,-86.482878 32.454261,-86.482896 32.45382,-86.482888 32.453443)\r\n207;299;odd;Doe Dr;Autauga;AL;36067;LINESTRING(-86.482692 32.454394,-86.48268 32.454263,-86.4827 32.453818,-86.482694 32.453446)\r\n1598;1500;all;Northington Ln;Autauga;AL;36067;LINESTRING(-86.51253 32.450204,-86.512519 32.450263,-86.512444 32.450554,-86.512429 32.450706,-86.512427 32.450932,-86.512439 32.451065)\r\n722;724;all;Autauga County 32;Autauga;AL;36091;LINESTRING(-86.578704 32.688139,-86.578762 32.68815,-86.578848 32.688144)\r\n2594;2526;even;Autauga County 121;Autauga;AL;36022;LINESTRING(-86.427842 32.644473,-86.427844 32.644667,-86.427834 32.645606,-86.427835 32.646256,-86.427847 32.647552)\r\n2501;2529;odd;Autauga County 121;Autauga;AL;36022;LINESTRING(-86.428037 32.644472,-86.42804 32.644667,-86.42803 32.645606,-86.428031 32.646256,-86.428042 32.647551)\r\n200;208;even;Brookhaven Dr;Autauga;AL;36066;LINESTRING(-86.442952 32.474001,-86.442911 32.473959,-86.442591 32.473717,-86.442285 32.473466,-86.442117 32.473335)\r\n201;209;odd;Brookhaven Dr;Autauga;AL;36066;LINESTRING(-86.442811 32.474114,-86.442769 32.474081,-86.442455 32.473839,-86.442149 32.473586,-86.441985 32.473455)\r\n1698;1600;all;Smithville Rd;Autauga;AL;36067;LINESTRING(-86.544292 32.39807,-86.54422 32.39812,-86.544167 32.39816,-86.544114 32.398209,-86.544013 32.39832,-86.543724 32.398676,-86.543694 32.398728,-86.543673 32.398788,-86.543644 32.398928,-86.543629 32.399007,-86.543596 32.399085,-86.543552 32.399159,-86.543161 32.399639,-86.542985 32.399884,-86.54286 32.400075,-86.542722 32.400269,-86.542611 32.400392,-86.54255 32.400459,-86.542416 32.400552,-86.542305 32.400645,-86.542255 32.400695,-86.541901 32.401112,-86.541837 32.401176,-86.541712 32.401265,-86.541602 32.401324,-86.541418 32.40137,-86.541237 32.401381,-86.540731 32.401409,-86.540622 32.401444,-86.54056 32.401488,-86.540524 32.401533,-86.540481 32.401634,-86.54044 32.401792,-86.540404 32.401876,-86.540348 32.40195,-86.540289 32.402022,-86.540276 32.402023)\r\n1599;1595;odd;Topaz St;Autauga;AL;36067;LINESTRING(-86.494578 32.525139,-86.495364 32.525349,-86.495516 32.525399,-86.495652 32.525462,-86.495695 32.525496,-86.495765 32.525591,-86.495783 32.525635,-86.495793 32.52585,-86.495801 32.525931,-86.495821 32.526016,-86.495901 32.526162,-86.495962 32.526228,-86.496076 32.526342,-86.496247 32.526503,-86.4963 32.526559,-86.496305 32.52656)\r\n1598;1592;even;Topaz St;Autauga;AL;36067;LINESTRING(-86.494636 32.524982,-86.495426 32.525191,-86.4956 32.525237,-86.495768 32.525312,-86.495861 32.525368,-86.495981 32.525521,-86.495989 32.525619,-86.495995 32.525838,-86.496005 32.525903,-86.496023 32.525958,-86.496085 32.526072,-86.496122 32.526124,-86.496226 32.526232,-86.496399 32.526393,-86.496452 32.526449,-86.496448 32.526448)\r\n136;128;all;Teri Ln;Autauga;AL;36066;LINESTRING(-86.431934 32.446263,-86.432198 32.446253,-86.432907 32.44624)\r\n399;301;odd;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.472063 32.467215,-86.472108 32.466751,-86.472178 32.466147)\r\n398;300;even;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.47187 32.467202,-86.471912 32.466737,-86.471985 32.466131)\r\n2400;2498;all;Autauga County 77;Autauga;AL;36006;LINESTRING(-86.701868 32.659845,-86.701867 32.659873,-86.701865 32.660005,-86.701841 32.660281,-86.701711 32.661467,-86.701699 32.661686)\r\n2230;2398;even;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.433766 32.565389,-86.433764 32.565395,-86.433718 32.566688,-86.433685 32.566973,-86.433661 32.567114,-86.433599 32.567395,-86.433518 32.567671,-86.433422 32.567942,-86.433367 32.568076,-86.433206 32.568412,-86.432693 32.569402,-86.432564 32.569672,-86.432449 32.569945,-86.432293 32.570362,-86.432224 32.570571,-86.432115 32.570996,-86.432031 32.571423,-86.431885 32.572277,-86.431762 32.573139,-86.431736 32.573428,-86.431716 32.573717,-86.431696 32.574298,-86.431698 32.574873,-86.431728 32.577037,-86.431744 32.57776,-86.431776 32.580133,-86.431781 32.580291)\r\n2237;2399;odd;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.43396 32.565401,-86.433962 32.565403,-86.43392 32.5667,-86.433881 32.566993,-86.433859 32.56714,-86.433795 32.567431,-86.43371 32.567715,-86.433612 32.567994,-86.433555 32.568136,-86.433388 32.568476,-86.432875 32.569466,-86.43275 32.569732,-86.432637 32.569999,-86.432483 32.57041,-86.432418 32.570611,-86.432311 32.571028,-86.432225 32.571449,-86.432081 32.572299,-86.43196 32.573155,-86.431932 32.57344,-86.431914 32.573725,-86.431894 32.5743,-86.431894 32.574871,-86.431924 32.577035,-86.43194 32.577758,-86.431972 32.580131,-86.431975 32.580288)\r\n400;568;even;Autauga County 15;Autauga;AL;36003;LINESTRING(-86.80941 32.497496,-86.809372 32.497625,-86.809112 32.498562,-86.808939 32.499131,-86.80884 32.49941,-86.808729 32.499684,-86.808544 32.500093,-86.808344 32.500495,-86.808129 32.500892,-86.807786 32.501563,-86.807718 32.501698,-86.807599 32.50198,-86.807499 32.502261,-86.807417 32.502548,-86.807379 32.502694,-86.807301 32.503126,-86.807052 32.504716,-86.806962 32.505219,-86.806635 32.506793,-86.806325 32.508226,-86.805717 32.511092,-86.805667 32.511317,-86.805621 32.511519,-86.805546 32.511799,-86.80546 32.512081,-86.805363 32.512357,-86.805252 32.512632,-86.805005 32.513177,-86.804267 32.514725,-86.804197 32.514856,-86.80412 32.514982,-86.803946 32.51523,-86.803852 32.515348,-86.803751 32.51546,-86.803642 32.515569,-86.803413 32.515772,-86.803237 32.515909,-86.803162 32.515964)\r\n401;407;odd;Autauga County 15;Autauga;AL;36003;LINESTRING(-86.809599 32.497536,-86.809562 32.497663,-86.809304 32.498602,-86.809131 32.499175,-86.80903 32.499462,-86.808915 32.499742,-86.808728 32.500155,-86.808524 32.500563,-86.808309 32.50096,-86.807966 32.501627,-86.807904 32.501758,-86.807789 32.502032,-86.807691 32.502305,-86.807609 32.502586,-86.807575 32.502724,-86.807495 32.50315,-86.807246 32.50474,-86.807156 32.505245,-86.806827 32.506823,-86.806517 32.508256,-86.805909 32.511122,-86.805859 32.511347,-86.805815 32.511553,-86.805738 32.511839,-86.805652 32.512125,-86.805553 32.512409,-86.805438 32.51269,-86.805187 32.513237,-86.804449 32.514791,-86.804377 32.51493,-86.804296 32.515064,-86.804116 32.51532,-86.804014 32.515446,-86.803907 32.515566,-86.803792 32.515681,-86.803555 32.515894,-86.803367 32.516037,-86.803287 32.516091)\r\n334;326;all;Summer Hill Rd;Autauga;AL;36067;LINESTRING(-86.45855 32.446668,-86.458926 32.446368,-86.458987 32.446326,-86.459119 32.446248,-86.459182 32.44622,-86.459328 32.446176,-86.459401 32.44616,-86.459477 32.446153,-86.459556 32.446147,-86.460332 32.44614,-86.460537 32.446129)\r\n398;336;all;Summer Hill Rd;Autauga;AL;36067;LINESTRING(-86.458416 32.446548,-86.458792 32.446242,-86.458863 32.44619,-86.459011 32.4461,-86.459098 32.44606,-86.459272 32.446006,-86.459367 32.445994,-86.459459 32.445981,-86.45955 32.445981,-86.460326 32.445972,-86.460527 32.445965)\r\n199;101;all;N McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.418235 32.467537,-86.418235 32.467417)\r\n619;699;all;Castle Brook Dr;Autauga;AL;36066;LINESTRING(-86.413214 32.470749,-86.413308 32.470792)\r\n109;199;all;Adell Pl;Autauga;AL;36066;LINESTRING(-86.44312 32.465779,-86.44313 32.465725,-86.443147 32.465637)\r\n309;399;all;First St;Autauga;AL;36067;LINESTRING(-86.466031 32.457806,-86.465124 32.457742,-86.46504 32.457735,-86.464996 32.457731)\r\n1063;1099;all;Hill St;Autauga;AL;36067;LINESTRING(-86.468613 32.429208,-86.468618 32.429186)\r\n556;814;even;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.466932 32.447259,-86.466585 32.445542,-86.466554 32.4454,-86.466456 32.444824,-86.466426 32.444538,-86.466423 32.444256,-86.466467 32.443975,-86.466525 32.443771,-86.466576 32.443638,-86.46664 32.443509,-86.466798 32.443261,-86.46694 32.443089,-86.467161 32.44288,-86.467412 32.442689,-86.467808 32.442414,-86.468147 32.442189,-86.468521 32.441928)\r\n601;781;odd;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.46674 32.447287,-86.466391 32.445572,-86.466358 32.445428,-86.466258 32.444844,-86.466224 32.444548,-86.466217 32.444246,-86.466265 32.443943,-86.466331 32.443723,-86.466388 32.44358,-86.466454 32.443435,-86.466622 32.443169,-86.466778 32.442981,-86.467017 32.442756,-86.467284 32.442561,-86.467686 32.442284,-86.468023 32.442059,-86.468398 32.441801)\r\n100;142;even;Valley Creek Dr;Autauga;AL;36066;LINESTRING(-86.437326 32.473282,-86.437331 32.473266,-86.437283 32.473148,-86.437243 32.472944,-86.437249 32.472817,-86.437301 32.472613,-86.437344 32.472463,-86.437342 32.472233,-86.437327 32.472151,-86.437265 32.471934,-86.437163 32.471652,-86.437021 32.471389,-86.436961 32.471234,-86.436942 32.471137,-86.436943 32.47091)\r\n101;121;odd;Valley Creek Dr;Autauga;AL;36066;LINESTRING(-86.43717 32.473381,-86.437123 32.47335,-86.437087 32.473184,-86.437035 32.472958,-86.437035 32.472793,-86.437107 32.472575,-86.437132 32.472445,-86.437136 32.472245,-86.437127 32.472183,-86.437071 32.47198,-86.436971 32.471714,-86.436835 32.471453,-86.436753 32.471276,-86.436738 32.471147,-86.436749 32.470907)\r\n2521;2515;odd;Stanton;Autauga;AL;36066;LINESTRING(-86.414642 32.444438,-86.415779 32.444436)\r\n2598;2510;even;Stanton;Autauga;AL;36066;LINESTRING(-86.414642 32.444274,-86.415779 32.444272)\r\n535;481;odd;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.679617 32.385561,-86.679502 32.385666,-86.679 32.386049,-86.678423 32.386489,-86.678053 32.38679,-86.677735 32.387035,-86.677537 32.387187,-86.677416 32.387309,-86.677305 32.387439,-86.677229 32.387587,-86.677177 32.387733,-86.677107 32.387943,-86.677051 32.38807,-86.676981 32.388193,-86.6769 32.388313,-86.67662 32.388678,-86.676437 32.388931,-86.676263 32.389188,-86.676185 32.389325,-86.676118 32.389465,-86.676062 32.38961,-86.676018 32.389756,-86.675945 32.390041,-86.675896 32.390173,-86.675832 32.390293,-86.675749 32.390408,-86.67565 32.39052,-86.675427 32.390745,-86.675326 32.390873,-86.675236 32.391005,-86.675158 32.391144,-86.675094 32.391287,-86.675045 32.391432,-86.675006 32.391581,-86.67498 32.391731,-86.674965 32.391879,-86.6749 32.392609,-86.67489 32.392683)\r\n512;460;even;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.679765 32.385667,-86.67965 32.38579,-86.67913 32.386173,-86.678557 32.386611,-86.678187 32.386912,-86.677867 32.387157,-86.677685 32.387307,-86.677578 32.387413,-86.677489 32.387527,-86.677421 32.387649,-86.677367 32.387781,-86.677299 32.387995,-86.677239 32.388138,-86.677159 32.388273,-86.67707 32.388401,-86.676786 32.388768,-86.676607 32.389015,-86.676441 32.389266,-86.676369 32.389393,-86.676306 32.389523,-86.676254 32.389658,-86.676212 32.389794,-86.676141 32.390083,-86.67609 32.390233,-86.676016 32.390377,-86.675915 32.390508,-86.675804 32.390624,-86.675589 32.390849,-86.675496 32.390963,-86.675414 32.391085,-86.675344 32.39121,-86.675286 32.391341,-86.675239 32.391474,-86.675204 32.391611,-86.675178 32.391751,-86.675161 32.391893,-86.675104 32.392631,-86.675081 32.392712)\r\n3600;3614;all;Red Cross Rd;Autauga;AL;36703;LINESTRING(-86.794067 32.460427,-86.794046 32.460482,-86.794023 32.460628,-86.793996 32.460921,-86.793988 32.46121,-86.793965 32.461345,-86.793918 32.461462,-86.793839 32.461567,-86.793731 32.461669,-86.793464 32.461877,-86.793415 32.461975)\r\n800;898;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.45 32.458488,-86.449899 32.458384,-86.449292 32.457782,-86.448971 32.457442,-86.44892 32.457379,-86.448826 32.457286)\r\n254;298;even;Clubview Dr;Autauga;AL;36067;LINESTRING(-86.469762 32.444122,-86.469746 32.444603,-86.469793 32.444838,-86.469862 32.444914,-86.469936 32.444981,-86.470025 32.445032,-86.470126 32.445072,-86.470321 32.445087,-86.471826 32.44508)\r\n201;299;odd;Clubview Dr;Autauga;AL;36067;LINESTRING(-86.469957 32.444125,-86.469956 32.444587,-86.470005 32.444764,-86.470026 32.444802,-86.470074 32.444843,-86.470127 32.444874,-86.470184 32.444892,-86.470333 32.444913,-86.471826 32.444915)\r\n912;998;even;Skidmore Ave;Autauga;AL;36066;LINESTRING(-86.450401 32.475265,-86.450241 32.475264,-86.449114 32.475279,-86.448823 32.475326,-86.448727 32.475403,-86.448657 32.475492,-86.448618 32.475734,-86.448639 32.476102,-86.448639 32.476125)\r\n909;999;odd;Skidmore Ave;Autauga;AL;36066;LINESTRING(-86.450401 32.475429,-86.450243 32.47543,-86.44914 32.475457,-86.448931 32.475504,-86.448895 32.475525,-86.448871 32.475562,-86.448824 32.475746,-86.448835 32.4761,-86.448834 32.476128)\r\n714;798;even;Briarcliff Pl;Autauga;AL;36066;LINESTRING(-86.419018 32.470782,-86.419025 32.470833,-86.419175 32.471462,-86.419376 32.471963)\r\n711;799;odd;Briarcliff Pl;Autauga;AL;36066;LINESTRING(-86.41921 32.470756,-86.419221 32.470803,-86.419373 32.471418,-86.419561 32.471911)\r\n500;598;even;Autauga County 33;Autauga;AL;36067;LINESTRING(-86.734476 32.499924,-86.73436 32.500087,-86.734114 32.500424,-86.733976 32.500602,-86.733879 32.500716,-86.733673 32.500939,-86.733566 32.501044,-86.733452 32.501144,-86.733211 32.501331,-86.73302 32.501461,-86.732962 32.501497,-86.732778 32.501605,-86.732765 32.501614)\r\n701;769;odd;Autauga County 33;Autauga;AL;36067;LINESTRING(-86.734643 32.500009,-86.734528 32.500173,-86.73428 32.500514,-86.73414 32.500696,-86.734039 32.500816,-86.733827 32.501047,-86.733712 32.501156,-86.733594 32.501264,-86.733343 32.501461,-86.73314 32.501591,-86.73308 32.501633,-86.732888 32.501745,-86.732869 32.501753)\r\n1100;1108;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.485028 32.433272,-86.485314 32.433141,-86.485798 32.432929)\r\n527;501;odd;Sheila Blvd;Autauga;AL;36066;LINESTRING(-86.426138 32.455433,-86.426134 32.454142,-86.426125 32.453826)\r\n522;500;even;Sheila Blvd;Autauga;AL;36066;LINESTRING(-86.425943 32.455434,-86.425938 32.454144,-86.42593 32.45383)\r\n637;505;odd;Durden Rd;Autauga;AL;36067;LINESTRING(-86.489115 32.485992,-86.489079 32.485189,-86.489069 32.48504,-86.489026 32.484673,-86.488997 32.484476,-86.488852 32.483611)\r\n698;600;even;Durden Rd;Autauga;AL;36067;LINESTRING(-86.488921 32.485999,-86.488883 32.485197,-86.488871 32.485054,-86.48883 32.484691,-86.488803 32.484498,-86.488659 32.483634)\r\n625;601;odd;Woodvale Rd;Autauga;AL;36067;LINESTRING(-86.454532 32.478362,-86.454533 32.47817,-86.454515 32.476612)\r\n634;600;even;Woodvale Rd;Autauga;AL;36067;LINESTRING(-86.454337 32.478361,-86.454337 32.47817,-86.45432 32.476613)\r\n1947;1987;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.597627 32.437277,-86.597757 32.437279,-86.598103 32.437278,-86.598362 32.437272)\r\n2599;2511;odd;Autauga County 131;Autauga;AL;36051;LINESTRING(-86.416729 32.673387,-86.417281 32.673425,-86.41771 32.673437,-86.418649 32.673451,-86.419754 32.673493,-86.420093 32.673516,-86.420858 32.673557,-86.421616 32.67361,-86.422203 32.673669,-86.422536 32.673716,-86.423286 32.673847,-86.423615 32.673914,-86.423938 32.673992,-86.424587 32.674172,-86.424922 32.674253,-86.425343 32.674338,-86.425681 32.674393,-86.426023 32.674442,-86.427466 32.674586,-86.428054 32.674667,-86.428553 32.674754,-86.428795 32.674808,-86.429032 32.674876,-86.429105 32.674901,-86.429253 32.674962,-86.429543 32.675099,-86.429749 32.675214,-86.429946 32.675342,-86.430391 32.675669,-86.430697 32.675916,-86.430919 32.676105)\r\n2758;2734;even;Autauga County 131;Autauga;AL;36051;LINESTRING(-86.416744 32.673223,-86.417293 32.673257,-86.417716 32.673271,-86.418655 32.673285,-86.419766 32.673325,-86.420107 32.67335,-86.420872 32.673391,-86.421636 32.673444,-86.422231 32.673503,-86.422572 32.67355,-86.42333 32.673685,-86.423665 32.673752,-86.423996 32.673832,-86.424645 32.674012,-86.424972 32.674091,-86.425385 32.674174,-86.425717 32.674229,-86.426051 32.674276,-86.427494 32.67442,-86.42809 32.674501,-86.428599 32.67459,-86.428853 32.674644,-86.429104 32.674716,-86.429187 32.674747,-86.429345 32.674812,-86.429649 32.674953,-86.429867 32.675076,-86.430074 32.675212,-86.430527 32.675545,-86.430835 32.675798,-86.431058 32.675989)\r\n1620;1648;even;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.659601 32.599812,-86.659882 32.59994,-86.660095 32.600052,-86.660228 32.600135,-86.660352 32.600224,-86.66047 32.600321,-86.660636 32.600475,-86.660789 32.600639,-86.66098 32.60087,-86.661161 32.601114,-86.661446 32.60148,-86.662322 32.602552,-86.662736 32.603013,-86.662844 32.603126,-86.663132 32.603392,-86.663572 32.603749,-86.663928 32.604055)\r\n1619;1649;odd;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.659692 32.599667,-86.659982 32.599792,-86.660209 32.59991,-86.660354 32.600001,-86.660488 32.600098,-86.660614 32.600203,-86.66079 32.600365,-86.660949 32.600539,-86.661146 32.600776,-86.661327 32.601024,-86.66161 32.601386,-86.662484 32.602454,-86.662892 32.602909,-86.662996 32.603016,-86.663276 32.603274,-86.663712 32.603631,-86.664068 32.60394)\r\n1723;1721;all;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.667946 32.524205,-86.666844 32.524187)\r\n1201;1205;all;Autauga County 111;Autauga;AL;36067;LINESTRING(-86.608897 32.601054,-86.608872 32.601092,-86.608838 32.60115,-86.608809 32.60121,-86.608788 32.601273,-86.608773 32.601338,-86.608764 32.601402,-86.608757 32.601543,-86.608767 32.601833,-86.608773 32.602194,-86.608785 32.602492)\r\n1452;1510;even;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.685786 32.5593,-86.685798 32.559346,-86.686312 32.561091,-86.686361 32.561298,-86.686396 32.561507,-86.686414 32.561714,-86.686409 32.561923,-86.686393 32.562061,-86.686351 32.562265,-86.686289 32.562471,-86.686214 32.562672,-86.686092 32.562936,-86.686021 32.563062,-86.68594 32.563184,-86.685802 32.56336,-86.685648 32.563533,-86.68527 32.56393,-86.685067 32.564172,-86.684929 32.564363,-86.684844 32.564494,-86.684736 32.5647,-86.684563 32.565113,-86.684265 32.565875,-86.683764 32.567269,-86.683616 32.567712)\r\n1401;1493;odd;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.685975 32.559262,-86.685988 32.559306,-86.686506 32.561055,-86.686557 32.56127,-86.686596 32.561489,-86.686614 32.56171,-86.686611 32.561933,-86.686593 32.562083,-86.686549 32.562301,-86.686481 32.562517,-86.686404 32.562728,-86.686276 32.563004,-86.686201 32.56314,-86.686112 32.563274,-86.685966 32.563458,-86.685804 32.563635,-86.68543 32.564032,-86.685235 32.564266,-86.685103 32.564447,-86.685026 32.56457,-86.684924 32.564764,-86.684749 32.565167,-86.684453 32.565925,-86.683952 32.567315,-86.683803 32.567757)\r\n1408;1400;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.425707 32.438046,-86.425944 32.438238,-86.426204 32.43844)\r\n126;198;even;Warwick Dr;Autauga;AL;36066;LINESTRING(-86.43927 32.471512,-86.439248 32.47143,-86.439199 32.47122,-86.439188 32.471154,-86.439147 32.470779)\r\n129;199;odd;Warwick Dr;Autauga;AL;36066;LINESTRING(-86.439082 32.471553,-86.439054 32.471468,-86.439003 32.47125,-86.438988 32.471174,-86.438953 32.470793)\r\n1200;1298;all;Autauga County 24;Autauga;AL;36006;LINESTRING(-86.642423 32.688912,-86.642515 32.688912,-86.642692 32.688896,-86.642866 32.688871,-86.643038 32.688843,-86.643212 32.688811,-86.643382 32.688767,-86.643548 32.688716,-86.64371 32.688654,-86.64387 32.688591,-86.64417 32.688435,-86.644313 32.688343,-86.644448 32.688251,-86.64458 32.688151,-86.646045 32.686922,-86.647104 32.686027,-86.647208 32.685931)\r\n100;198;even;Sequoia Ct;Autauga;AL;36067;LINESTRING(-86.547833 32.576796,-86.547776 32.576797,-86.54734 32.576794,-86.546311 32.5768,-86.545469 32.576815,-86.545324 32.576812)\r\n101;199;odd;Sequoia Ct;Autauga;AL;36067;LINESTRING(-86.547841 32.57696,-86.547778 32.576963,-86.54734 32.576958,-86.546313 32.576966,-86.545469 32.576979,-86.54532 32.576976)\r\n1900;2298;even;E Main St;Autauga;AL;36066;LINESTRING(-86.417989 32.460398,-86.417879 32.460388)\r\n2301;2599;odd;E Main St;Autauga;AL;36066;LINESTRING(-86.417967 32.460561,-86.417857 32.460551)\r\n217;201;odd;Toby Ln;Autauga;AL;36067;LINESTRING(-86.508982 32.469227,-86.508947 32.46924,-86.508896 32.469326,-86.508869 32.469393,-86.508798 32.469523,-86.508691 32.469726,-86.508514 32.470117)\r\n280;200;even;Toby Ln;Autauga;AL;36067;LINESTRING(-86.509113 32.46935,-86.509121 32.469358,-86.509086 32.4694,-86.509057 32.469461,-86.508978 32.469593,-86.508875 32.46979,-86.508695 32.470177)\r\n885;899;all;Autauga County 113;Autauga;AL;36067;LINESTRING(-86.592954 32.52761,-86.593002 32.527625,-86.593418 32.52787,-86.59356 32.527956,-86.593749 32.528115,-86.593808 32.52818,-86.593904 32.528308,-86.593946 32.528379,-86.593983 32.52845,-86.594173 32.528928,-86.594223 32.529061,-86.594312 32.529255,-86.594346 32.529313,-86.594383 32.529368,-86.594427 32.529417,-86.594476 32.529463,-86.594596 32.529549,-86.595009 32.529793,-86.595085 32.529835)\r\n2046;2098;even;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.551215 32.583113,-86.550246 32.585759,-86.549997 32.586452,-86.549902 32.586731,-86.549795 32.587082,-86.549716 32.587368,-86.549575 32.587938,-86.549515 32.58823,-86.549439 32.588669)\r\n2001;2093;odd;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.551401 32.583161,-86.550432 32.585807,-86.550185 32.586498,-86.550092 32.586775,-86.549987 32.587122,-86.549908 32.587404,-86.549769 32.58797,-86.549709 32.588256,-86.549632 32.588693)\r\n1672;1698;even;S McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.418032 32.43306,-86.418024 32.432618)\r\n1601;1699;odd;S McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.417838 32.433063,-86.41783 32.432621)\r\n2834;2898;even;State Rte 143;Autauga;AL;36022;LINESTRING(-86.452556 32.679793,-86.452564 32.680277,-86.452592 32.680858,-86.452624 32.681147,-86.452671 32.681435,-86.452758 32.681794,-86.452844 32.682079,-86.452941 32.682358,-86.453049 32.682635,-86.453169 32.682909,-86.453233 32.683047,-86.454172 32.684826,-86.454996 32.686422,-86.455449 32.687279,-86.455926 32.688203,-86.456447 32.689195,-86.456522 32.689343)\r\n2819;2899;odd;State Rte 143;Autauga;AL;36022;LINESTRING(-86.452751 32.67979,-86.452762 32.680273,-86.452792 32.680846,-86.452822 32.681127,-86.452869 32.681407,-86.452952 32.681756,-86.453036 32.682035,-86.453131 32.682308,-86.453237 32.682581,-86.453353 32.682849,-86.453417 32.682981,-86.454352 32.68476,-86.455176 32.686356,-86.455629 32.687213,-86.456106 32.688137,-86.456627 32.689129,-86.456702 32.689278)\r\n1399;1317;odd;Huckleberry Ln;Autauga;AL;36067;LINESTRING(-86.613817 32.541421,-86.61382 32.541397,-86.613804 32.54125,-86.613787 32.540883,-86.613738 32.540303,-86.613712 32.54008,-86.613693 32.540023)\r\n1398;1334;even;Huckleberry Ln;Autauga;AL;36067;LINESTRING(-86.613622 32.541416,-86.61362 32.541401,-86.613606 32.54126,-86.613589 32.540893,-86.61354 32.540319,-86.61351 32.540106,-86.613503 32.540055)\r\n2700;2738;all;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.50731 32.643675,-86.507471 32.644564,-86.507529 32.64485,-86.507654 32.645416,-86.507817 32.646199,-86.50787 32.646415,-86.507916 32.64656,-86.508001 32.646772,-86.508098 32.646978,-86.508795 32.648301,-86.50913 32.648951,-86.50916 32.649002)\r\n400;498;even;S Washington St;Autauga;AL;36067;LINESTRING(-86.470244 32.457911,-86.470358 32.457353)\r\n401;499;odd;S Washington St;Autauga;AL;36067;LINESTRING(-86.470052 32.457883,-86.470166 32.457325)\r\n198;100;all;Hawthorn Ln;Autauga;AL;36066;LINESTRING(-86.424645 32.471801,-86.424718 32.471749)\r\n128;162;even;Laurel Hill Dr;Autauga;AL;36066;LINESTRING(-86.455058 32.560531,-86.455007 32.560566,-86.45468 32.560806,-86.454375 32.561069,-86.454018 32.561388,-86.453904 32.561505,-86.453846 32.561574,-86.453768 32.561724,-86.453755 32.56181,-86.453736 32.561962,-86.453725 32.562127,-86.453756 32.56224,-86.453826 32.562339,-86.453986 32.562351,-86.454246 32.562355,-86.455443 32.562363,-86.456123 32.562366,-86.456307 32.562354,-86.456486 32.562304,-86.456577 32.56227,-86.456623 32.562238)\r\n129;167;odd;Laurel Hill Dr;Autauga;AL;36066;LINESTRING(-86.455183 32.560657,-86.455135 32.560692,-86.454818 32.56093,-86.454517 32.561185,-86.45417 32.5615,-86.454068 32.561607,-86.454032 32.561658,-86.453974 32.561776,-86.453955 32.561834,-86.453938 32.561974,-86.453939 32.562107,-86.45396 32.562162,-86.453966 32.562159,-86.454008 32.562177,-86.45425 32.562189,-86.455443 32.562197,-86.456113 32.562194,-86.456265 32.562178,-86.456412 32.562142,-86.456477 32.562116,-86.456516 32.562101)\r\n1816;1898;even;Buckeye Dr;Autauga;AL;36067;LINESTRING(-86.697862 32.590097,-86.697673 32.590098,-86.697148 32.590111,-86.696991 32.590113,-86.696566 32.59013,-86.696143 32.590138,-86.696126 32.590139)\r\n3001;3099;odd;Buckeye Dr;Autauga;AL;36067;LINESTRING(-86.697864 32.590262,-86.697677 32.590264,-86.697152 32.590275,-86.696997 32.590279,-86.696572 32.590296,-86.696145 32.590304,-86.696126 32.590303)\r\n1300;1336;all;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.694489 32.541457,-86.694365 32.5417,-86.694099 32.542151,-86.694 32.542312)\r\n1800;1808;even;Autauga County 117;Autauga;AL;36067;LINESTRING(-86.651936 32.596838,-86.651949 32.596988,-86.651959 32.597662,-86.651947 32.598241,-86.651954 32.598625)\r\n1801;1813;odd;Autauga County 117;Autauga;AL;36067;LINESTRING(-86.65213 32.596822,-86.652153 32.596978,-86.652155 32.597662,-86.652143 32.598241,-86.652148 32.598622)\r\n1032;1068;even;Autauga County 49;Autauga;AL;36051;LINESTRING(-86.587677 32.634921,-86.587741 32.635086,-86.587813 32.635225,-86.587979 32.635482,-86.589377 32.637293,-86.589653 32.637659,-86.590357 32.638559,-86.590681 32.638982,-86.591711 32.640309,-86.592124 32.640842)\r\n1023;1099;odd;Autauga County 49;Autauga;AL;36051;LINESTRING(-86.587861 32.634867,-86.587929 32.635024,-86.587995 32.635149,-86.588153 32.635394,-86.589541 32.637203,-86.589817 32.637569,-86.590521 32.638469,-86.590845 32.638892,-86.591875 32.640219,-86.592287 32.640752)\r\n500;598;even;Partridge Ln;Autauga;AL;36067;LINESTRING(-86.455364 32.455888,-86.454274 32.45591)\r\n501;599;odd;Partridge Ln;Autauga;AL;36067;LINESTRING(-86.455368 32.456052,-86.454278 32.456074)\r\n1800;1898;even;W Autumn Ct;Autauga;AL;36066;LINESTRING(-86.424752 32.454587,-86.424732 32.454583,-86.424651 32.454572,-86.424211 32.454569,-86.424046 32.45458)\r\n1801;1899;odd;W Autumn Ct;Autauga;AL;36066;LINESTRING(-86.424756 32.454752,-86.424718 32.454757,-86.424633 32.454746,-86.424215 32.454737,-86.424059 32.454744)\r\n462;498;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.520155 32.569084,-86.520274 32.569085,-86.520945 32.56908,-86.522389 32.569087,-86.523243 32.569111,-86.523759 32.569134,-86.524141 32.56916)\r\n451;499;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.520157 32.56892,-86.520274 32.568921,-86.520945 32.568916,-86.522393 32.568921,-86.523251 32.568945,-86.523773 32.568968,-86.524157 32.568996)\r\n500;526;even;Weatherby Trl;Autauga;AL;36067;LINESTRING(-86.471866 32.44834,-86.470737 32.448342,-86.470681 32.448344)\r\n521;525;odd;Weatherby Trl;Autauga;AL;36067;LINESTRING(-86.471866 32.448505,-86.470739 32.448508,-86.470685 32.448508)\r\n701;791;all;Old Ridge Rd N;Autauga;AL;36066;LINESTRING(-86.420218 32.482822,-86.420248 32.483036,-86.420235 32.483275,-86.420132 32.483573,-86.420008 32.483749,-86.419857 32.483958,-86.419686 32.484141,-86.419456 32.48429,-86.419176 32.484431,-86.418944 32.484555,-86.418782 32.484652,-86.418644 32.484758,-86.418467 32.484928,-86.418362 32.485085,-86.418347 32.485104)\r\n700;720;even;Pinetuckett Pkwy;Autauga;AL;36022;LINESTRING(-86.464426 32.601332,-86.465084 32.601341,-86.46548 32.601347,-86.466331 32.601363,-86.466774 32.601295,-86.46727 32.601163,-86.467681 32.601003,-86.467889 32.600971)\r\n701;799;odd;Pinetuckett Pkwy;Autauga;AL;36022;LINESTRING(-86.464429 32.601168,-86.465088 32.601177,-86.465484 32.601183,-86.466313 32.601187,-86.466724 32.601125,-86.467194 32.600999,-86.467619 32.600821,-86.467867 32.600808)\r\n500;698;even;N Pickett St;Autauga;AL;36003;LINESTRING(-86.663069 32.444165,-86.663396 32.444389,-86.664158 32.444934,-86.664666 32.445319,-86.665117 32.445663,-86.665814 32.446219,-86.666176 32.446526)\r\n501;557;odd;N Pickett St;Autauga;AL;36003;LINESTRING(-86.663192 32.444037,-86.663522 32.444261,-86.664288 32.444808,-86.664796 32.445197,-86.665251 32.445541,-86.665952 32.446099,-86.666314 32.44641)\r\n250;248;all;Teri Ln;Autauga;AL;36066;LINESTRING(-86.427052 32.448579,-86.427047 32.448364)\r\n584;698;even;Autauga County 64;Autauga;AL;36022;LINESTRING(-86.427672 32.644151,-86.427448 32.644164,-86.427276 32.644177,-86.426766 32.644243,-86.426348 32.644302,-86.42525 32.644427,-86.424994 32.644456,-86.424822 32.644492,-86.424652 32.644535,-86.424408 32.644622,-86.424252 32.644697,-86.423965 32.644854,-86.423683 32.645013,-86.423614 32.645046,-86.423468 32.645108,-86.423394 32.645132,-86.423322 32.645152,-86.423164 32.64518,-86.42292 32.645203,-86.422072 32.645241,-86.420651 32.645334)\r\n601;699;odd;Autauga County 64;Autauga;AL;36022;LINESTRING(-86.427686 32.644315,-86.427464 32.64433,-86.4273 32.644345,-86.426798 32.644407,-86.426378 32.644468,-86.425278 32.644591,-86.425034 32.644624,-86.424876 32.644656,-86.424722 32.644697,-86.424498 32.644778,-86.424356 32.644843,-86.424073 32.644994,-86.423791 32.645153,-86.423712 32.645198,-86.42355 32.64526,-86.423466 32.645294,-86.423374 32.645318,-86.423196 32.645352,-86.422934 32.645371,-86.422084 32.645407,-86.420666 32.645499)\r\n1098;1090;all;Copper Ridge Rd;Autauga;AL;36067;LINESTRING(-86.528817 32.458538,-86.528905 32.458559,-86.529401 32.458684,-86.529742 32.458749,-86.529889 32.458767)\r\n599;501;all;Covered Bridge Pkwy;Autauga;AL;36066;LINESTRING(-86.415069 32.476268,-86.415053 32.476201)\r\n3074;3106;even;Autauga County 57;Autauga;AL;36091;LINESTRING(-86.554049 32.699407,-86.554146 32.699762,-86.554404 32.700601,-86.555056 32.702693,-86.555171 32.703039,-86.55525 32.703247,-86.555311 32.703385,-86.555406 32.703587,-86.55555 32.70385,-86.555711 32.704101,-86.555857 32.704314)\r\n3073;3105;odd;Autauga County 57;Autauga;AL;36091;LINESTRING(-86.554239 32.69937,-86.554338 32.699722,-86.554594 32.700559,-86.555246 32.702649,-86.555361 32.702991,-86.555438 32.703193,-86.555495 32.703325,-86.55559 32.703519,-86.55573 32.703774,-86.555885 32.704021,-86.556026 32.704232)\r\n1600;1698;even;Pine Lake Dr;Autauga;AL;36067;LINESTRING(-86.477291 32.541423,-86.477267 32.541579,-86.477189 32.542009,-86.477173 32.542151,-86.477148 32.542287,-86.47713 32.542345,-86.477102 32.5424,-86.477065 32.542442,-86.47703 32.542465,-86.476978 32.542486,-86.476481 32.542556,-86.476316 32.542572)\r\n1601;1699;odd;Pine Lake Dr;Autauga;AL;36067;LINESTRING(-86.477484 32.541442,-86.477463 32.541601,-86.477387 32.542029,-86.477371 32.542171,-86.47735 32.542321,-86.477326 32.542399,-86.47729 32.542478,-86.477237 32.542566,-86.477138 32.542635,-86.477026 32.542658,-86.476507 32.542724,-86.476335 32.542735)\r\n113;105;odd;Sycamore Dr;Autauga;AL;36066;LINESTRING(-86.444628 32.47675,-86.444626 32.476643,-86.444625 32.476358,-86.444629 32.476048)\r\n116;110;even;Sycamore Dr;Autauga;AL;36066;LINESTRING(-86.444433 32.476754,-86.444428 32.476645,-86.444429 32.476356,-86.444435 32.476045)\r\n1099;1037;all;Orton St;Autauga;AL;36067;LINESTRING(-86.463704 32.428585,-86.463712 32.428507,-86.463706 32.428293,-86.463648 32.427709,-86.463598 32.427346,-86.463466 32.426253,-86.463466 32.42622)\r\n100;198;even;Lori St;Autauga;AL;36066;LINESTRING(-86.432213 32.44803,-86.432218 32.447958,-86.432165 32.447665,-86.432086 32.447303,-86.431971 32.446953,-86.431925 32.446749,-86.4319 32.446539,-86.431895 32.44647)\r\n101;199;odd;Lori St;Autauga;AL;36066;LINESTRING(-86.432019 32.448033,-86.432012 32.447972,-86.431969 32.447693,-86.431888 32.447341,-86.431775 32.446993,-86.431723 32.446773,-86.431702 32.446549,-86.431701 32.446477)\r\n905;911;odd;Running Brook Dr;Autauga;AL;36066;LINESTRING(-86.432526 32.45701,-86.432546 32.456984,-86.432583 32.456927,-86.432772 32.456691,-86.433124 32.456297,-86.433204 32.456226)\r\n904;912;even;Running Brook Dr;Autauga;AL;36066;LINESTRING(-86.432348 32.456945,-86.432362 32.456904,-86.432413 32.456835,-86.43261 32.456593,-86.432966 32.456177,-86.433074 32.456104)\r\n1599;1503;odd;Onyx Dr;Autauga;AL;36067;LINESTRING(-86.493792 32.528085,-86.493799 32.528073,-86.493822 32.527782,-86.493942 32.526268,-86.493963 32.526131,-86.493998 32.525999,-86.494021 32.525939,-86.494052 32.525881,-86.494132 32.525761,-86.494268 32.525578,-86.494448 32.525337,-86.494523 32.525268,-86.494533 32.525162)\r\n1598;1512;even;Onyx Dr;Autauga;AL;36067;LINESTRING(-86.4936 32.528058,-86.493597 32.528053,-86.493626 32.52777,-86.493744 32.526252,-86.493763 32.526103,-86.4938 32.525953,-86.493831 32.525877,-86.49387 32.525801,-86.493962 32.525673,-86.494102 32.52549,-86.49428 32.525241,-86.494311 32.525188,-86.494343 32.525128)\r\n1700;1752;even;US Hwy 31;Autauga;AL;36066;LINESTRING(-86.459257 32.555457,-86.459437 32.555849,-86.45974 32.556524,-86.460053 32.557197,-86.460807 32.558859)\r\n1701;1747;odd;US Hwy 31;Autauga;AL;36067;LINESTRING(-86.459439 32.555397,-86.459619 32.555789,-86.459922 32.556464,-86.460235 32.557137,-86.460989 32.5588)\r\n900;950;all;Washington Ferry Rd;Autauga;AL;36067;LINESTRING(-86.464954 32.435812,-86.464983 32.434462,-86.465019 32.433001,-86.465051 32.43123)\r\n400;498;all;W 6th St;Autauga;AL;36067;LINESTRING(-86.482272 32.466524,-86.482523 32.466485,-86.483019 32.46646)\r\n201;299;all;Lamar Estates Rd;Autauga;AL;36067;LINESTRING(-86.847083 32.447306,-86.846962 32.447486,-86.846892 32.447737,-86.846843 32.447898,-86.846946 32.448088,-86.84708 32.448377,-86.847182 32.448603,-86.847309 32.448879,-86.847351 32.44896,-86.847378 32.449064,-86.847383 32.44924,-86.847448 32.449376,-86.847476 32.449509,-86.847532 32.449739,-86.847581 32.45001,-86.847679 32.450187,-86.847789 32.45044,-86.847871 32.45066,-86.848007 32.450841,-86.848247 32.450962,-86.848568 32.45118,-86.848856 32.451385,-86.849118 32.451548,-86.849242 32.451651,-86.849453 32.452005,-86.849504 32.45212,-86.849419 32.4522,-86.849235 32.452346,-86.849119 32.452688,-86.849106 32.452724)\r\n801;899;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.449745 32.458681,-86.449728 32.458666,-86.449394 32.458315,-86.448682 32.457555,-86.448589 32.457444)\r\n322;398;even;Marlette Dr;Autauga;AL;36067;LINESTRING(-86.459932 32.447381,-86.459912 32.447376,-86.459815 32.447415,-86.459732 32.447461,-86.459585 32.447556,-86.459397 32.447705,-86.459362 32.447722,-86.459361 32.447714,-86.459331 32.447703,-86.459287 32.447646,-86.459259 32.447617)\r\n323;499;odd;Marlette Dr;Autauga;AL;36067;LINESTRING(-86.459967 32.447543,-86.459976 32.44755,-86.459913 32.447571,-86.459848 32.447603,-86.459719 32.447688,-86.459529 32.447845,-86.459418 32.44791,-86.459237 32.447904,-86.459165 32.447801,-86.459121 32.44774,-86.459101 32.447712)\r\n798;774;all;2nd St;Autauga;AL;36703;LINESTRING(-86.797707 32.371182,-86.797668 32.371457,-86.797557 32.372037,-86.797398 32.372758,-86.797073 32.374196,-86.796995 32.374558)\r\n1826;1838;even;Tara Dr;Autauga;AL;36066;LINESTRING(-86.421783 32.453682,-86.421325 32.453683,-86.420899 32.453691,-86.420472 32.453688,-86.420152 32.453704)\r\n1825;1839;odd;Tara Dr;Autauga;AL;36066;LINESTRING(-86.421784 32.453847,-86.421327 32.453849,-86.420901 32.453857,-86.420476 32.453856,-86.420162 32.453868)\r\n1656;1508;all;Fairview Ave;Autauga;AL;36066;LINESTRING(-86.424728 32.482391,-86.425597 32.482353,-86.426272 32.482317,-86.42672 32.482284,-86.427339 32.482263,-86.427816 32.482252,-86.428557 32.482226)\r\n1000;1098;all;Honeysuckle Dr;Autauga;AL;36067;LINESTRING(-86.450616 32.454781,-86.450614 32.454636,-86.450616 32.45448,-86.450615 32.454401,-86.450605 32.454335)\r\n973;901;all;Tremontana Dr;Autauga;AL;36067;LINESTRING(-86.48259 32.446442,-86.482568 32.44645,-86.482556 32.446462)\r\n701;899;all;Green Springs Dr;Autauga;AL;36067;LINESTRING(-86.452193 32.476575,-86.452307 32.476574,-86.452471 32.476574,-86.452893 32.476593,-86.453076 32.476602,-86.453189 32.476582,-86.453206 32.476559)\r\n2370;2384;even;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.49107 32.607168,-86.491051 32.607231,-86.491 32.607523,-86.490983 32.60782,-86.490986 32.608113,-86.491038 32.608837,-86.491101 32.609557,-86.491131 32.609991,-86.491195 32.610785,-86.491205 32.611069,-86.491196 32.611427,-86.491182 32.611639,-86.491169 32.611763)\r\n2375;2445;odd;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.49126 32.607202,-86.491249 32.607261,-86.491202 32.607541,-86.491181 32.607824,-86.491186 32.608107,-86.491234 32.608827,-86.491297 32.609547,-86.491327 32.609981,-86.491393 32.610777,-86.491401 32.611069,-86.491394 32.611433,-86.49138 32.611653,-86.491363 32.61178)\r\n2300;2356;even;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.609759 32.703514,-86.609749 32.703581)\r\n2301;2357;odd;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.609953 32.703535,-86.609943 32.703602)\r\n1301;1499;odd;Hatcher Rd;Autauga;AL;36749;LINESTRING(-86.794669 32.598642,-86.794666 32.598794,-86.794687 32.599237,-86.794684 32.599741,-86.794721 32.600325,-86.79472 32.600465,-86.794706 32.600603,-86.794677 32.600736,-86.794634 32.600869,-86.794489 32.601209,-86.794463 32.601282,-86.794433 32.601432,-86.794426 32.601511,-86.794427 32.60159,-86.794436 32.601668,-86.794451 32.601746,-86.794535 32.602027,-86.794556 32.602157,-86.794559 32.602216,-86.794549 32.602277,-86.794531 32.602339,-86.794504 32.602398,-86.79447 32.60245,-86.794324 32.602623,-86.794267 32.602692,-86.79423 32.602779,-86.794216 32.602867,-86.794217 32.602954,-86.794344 32.603609,-86.794387 32.6039,-86.794423 32.604046,-86.794452 32.604123,-86.794492 32.604197,-86.79454 32.604269,-86.7947 32.604449,-86.794961 32.604741,-86.795752 32.605677,-86.795812 32.605737,-86.795878 32.605792,-86.79595 32.605841,-86.796026 32.605885,-86.796108 32.60592,-86.796197 32.605955,-86.796379 32.605984,-86.796471 32.605986,-86.796564 32.605991,-86.796734 32.605967,-86.796818 32.605955,-86.796903 32.605928,-86.796973 32.605916,-86.79703 32.605921,-86.79708 32.605937,-86.797129 32.605967,-86.797176 32.606013,-86.797482 32.606447,-86.797554 32.606572,-86.7977 32.606909,-86.797776 32.607047,-86.797945 32.6073,-86.798212 32.607669,-86.798372 32.607919,-86.79848 32.608111,-86.798541 32.60824,-86.798644 32.608511,-86.798707 32.608652,-86.798803 32.608779,-86.798948 32.608959,-86.799141 32.609186,-86.799181 32.609242,-86.799215 32.6093,-86.799245 32.609363,-86.799295 32.609501,-86.799325 32.609574,-86.799364 32.609648,-86.799463 32.609779,-86.799522 32.609843,-86.799702 32.610014,-86.799835 32.610118,-86.79998 32.610215,-86.800138 32.61029,-86.800593 32.610495,-86.800881 32.610635,-86.801018 32.610712,-86.801078 32.610752,-86.801191 32.610845,-86.801239 32.610892,-86.80133 32.611006,-86.801449 32.611192,-86.801666 32.611582,-86.80176 32.611773,-86.801787 32.611837,-86.801805 32.611902,-86.801816 32.611964,-86.801821 32.612027,-86.801778 32.612461,-86.801779 32.612537,-86.801787 32.612615,-86.8018 32.612692,-86.801822 32.612767,-86.801883 32.612906,-86.801925 32.61298,-86.801991 32.613054,-86.802084 32.613106,-86.802181 32.613139,-86.802281 32.613163,-86.802468 32.613171,-86.80306 32.613171,-86.803125 32.613182,-86.803172 32.6132,-86.803205 32.613225,-86.803221 32.613252,-86.803219 32.613276,-86.803201 32.613306,-86.803157 32.613344,-86.802789 32.613529,-86.802655 32.613614,-86.802649 32.61362)\r\n1300;1498;even;Hatcher Rd;Autauga;AL;36749;LINESTRING(-86.794864 32.598643,-86.794864 32.598792,-86.794885 32.599233,-86.794884 32.599737,-86.794921 32.600321,-86.794922 32.600471,-86.794908 32.600625,-86.794875 32.600774,-86.794826 32.600921,-86.794681 32.601261,-86.794663 32.60132,-86.794635 32.601454,-86.794628 32.601517,-86.794629 32.60158,-86.794636 32.601646,-86.794649 32.60171,-86.794735 32.601993,-86.794764 32.602143,-86.794763 32.602226,-86.794753 32.602309,-86.794729 32.602391,-86.794692 32.60247,-86.794646 32.602544,-86.794492 32.602719,-86.794459 32.602772,-86.794436 32.602823,-86.794424 32.602879,-86.794425 32.60294,-86.794538 32.603585,-86.794587 32.60387,-86.794621 32.604002,-86.794644 32.604061,-86.794674 32.604119,-86.794712 32.604175,-86.794858 32.604351,-86.795119 32.604643,-86.795912 32.605571,-86.795962 32.605621,-86.796014 32.605664,-86.79607 32.605703,-86.79613 32.605735,-86.796194 32.605764,-86.796259 32.605783,-86.796407 32.60581,-86.796481 32.605818,-86.796552 32.605817,-86.796698 32.605801,-86.796762 32.605787,-86.796843 32.605764,-86.796949 32.605736,-86.797074 32.605737,-86.797192 32.605773,-86.797285 32.605841,-86.797346 32.605915,-86.79766 32.606365,-86.797742 32.606504,-86.797888 32.606843,-86.797956 32.606969,-86.798117 32.607216,-86.798386 32.607585,-86.79855 32.607843,-86.798666 32.608043,-86.798729 32.608184,-86.798834 32.608453,-86.798895 32.608574,-86.798971 32.608689,-86.79911 32.608863,-86.799311 32.609092,-86.799359 32.60916,-86.799401 32.60923,-86.799435 32.609307,-86.799485 32.609447,-86.799513 32.609508,-86.799546 32.609564,-86.799631 32.609681,-86.799678 32.609735,-86.799848 32.609894,-86.799967 32.609988,-86.800096 32.610071,-86.800236 32.610144,-86.800689 32.610349,-86.800987 32.610491,-86.801136 32.610574,-86.80121 32.610622,-86.801343 32.610725,-86.801403 32.61079,-86.801504 32.610918,-86.801629 32.611116,-86.801846 32.611514,-86.80195 32.611711,-86.801979 32.611787,-86.802007 32.611866,-86.802022 32.611948,-86.802021 32.612031,-86.80198 32.612467,-86.801981 32.612529,-86.801987 32.612595,-86.802 32.612658,-86.802018 32.612715,-86.802071 32.612836,-86.802103 32.612882,-86.802141 32.612918,-86.802188 32.612948,-86.802249 32.612973,-86.802317 32.612987,-86.802476 32.613001,-86.803072 32.612997,-86.803177 32.613004,-86.803284 32.613036,-86.803381 32.613101,-86.803449 32.613204,-86.803449 32.613332,-86.803369 32.613438,-86.803267 32.613488,-86.802901 32.613673,-86.802773 32.613748,-86.802767 32.61375)\r\n1506;1510;all;Clear Branch Rd;Autauga;AL;36022;LINESTRING(-86.419118 32.507138,-86.419908 32.507129)\r\n3000;3040;all;Autauga County 535;Autauga;AL;36051;LINESTRING(-86.467742 32.701399,-86.467628 32.701647,-86.467513 32.701917)\r\n198;100;all;N McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.418053 32.469064,-86.418056 32.468908,-86.418054 32.468361)\r\n1728;1798;even;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.574672 32.503372,-86.57507 32.503424,-86.577109 32.503717,-86.577155 32.503721)\r\n1717;1727;odd;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.574701 32.503209,-86.575102 32.50326,-86.577139 32.503551,-86.577182 32.503558)\r\n799;701;odd;Autauga County 6;Autauga;AL;36067;LINESTRING(-86.556282 32.541007,-86.55619 32.541008,-86.556097 32.541046,-86.55471 32.541628,-86.554403 32.541766,-86.553954 32.541976,-86.553803 32.542041,-86.553493 32.542163,-86.553014 32.542328,-86.552852 32.542389,-86.552697 32.542463,-86.552548 32.542548,-86.552409 32.542647,-86.552283 32.542753,-86.552167 32.542867,-86.552067 32.542991,-86.551313 32.543971,-86.551075 32.544274,-86.550982 32.544394,-86.550883 32.544514,-86.550789 32.544636,-86.550692 32.544752,-86.55059 32.544865,-86.550481 32.544974,-86.550367 32.545075,-86.550244 32.54517,-86.550113 32.545258,-86.54928 32.545772,-86.549141 32.545851,-86.548998 32.545921,-86.54885 32.545979,-86.548695 32.546027,-86.548535 32.546068,-86.547871 32.546212,-86.547535 32.546289,-86.547041 32.546418,-86.546713 32.546509,-86.5459 32.546751,-86.545575 32.546834,-86.54533 32.546878,-86.545191 32.546897)\r\n798;700;even;Autauga County 6;Autauga;AL;36067;LINESTRING(-86.556308 32.54117,-86.556246 32.541186,-86.556179 32.541202,-86.5548 32.541776,-86.554497 32.541912,-86.554046 32.542124,-86.553889 32.542191,-86.553573 32.542317,-86.553092 32.542482,-86.552944 32.542541,-86.552803 32.542609,-86.55267 32.542686,-86.552545 32.542773,-86.552431 32.542869,-86.552327 32.542973,-86.552231 32.543085,-86.551477 32.544061,-86.551239 32.544364,-86.551148 32.544488,-86.551047 32.544608,-86.550953 32.54473,-86.550852 32.54485,-86.550748 32.544971,-86.550631 32.545088,-86.550507 32.545197,-86.550374 32.5453,-86.550231 32.545392,-86.549394 32.545908,-86.549249 32.545995,-86.549092 32.546073,-86.548928 32.546139,-86.548757 32.546187,-86.548589 32.54623,-86.547921 32.546372,-86.547591 32.546449,-86.547101 32.546576,-86.546777 32.546667,-86.545962 32.546909,-86.545627 32.547,-86.545364 32.547046,-86.545218 32.54706)\r\n500;548;all;Riverchase North Blvd;Autauga;AL;36066;LINESTRING(-86.422576 32.486362,-86.422561 32.485727)\r\n1600;1662;all;Autauga County 103;Autauga;AL;36758;LINESTRING(-86.909674 32.647385,-86.909679 32.647585,-86.909655 32.648352,-86.909637 32.648638,-86.909491 32.650368,-86.909298 32.652541,-86.909283 32.652834,-86.909282 32.653128,-86.909286 32.65342,-86.909299 32.653713,-86.909316 32.653934,-86.909341 32.65415,-86.909533 32.655661,-86.90957 32.656094,-86.909578 32.656308,-86.909574 32.656592,-86.909528 32.657388,-86.909386 32.65906,-86.909349 32.659352,-86.909285 32.65972,-86.909262 32.659836)\r\n2901;2955;all;Old Hwy 143;Autauga;AL;36051;LINESTRING(-86.460182 32.694679,-86.460367 32.694794,-86.460426 32.694845,-86.460553 32.694936,-86.46075 32.695077,-86.461005 32.695274,-86.461131 32.695383,-86.461186 32.695446,-86.461562 32.695917,-86.461666 32.696043,-86.461819 32.696214,-86.461924 32.696336,-86.461969 32.696404,-86.462193 32.696797,-86.462294 32.697001,-86.462408 32.697277,-86.462513 32.697627,-86.462647 32.697982,-86.462641 32.698138)\r\n462;498;even;Autauga County 4;Autauga;AL;36067;LINESTRING(-86.46096 32.426922,-86.460715 32.426774,-86.460687 32.426756,-86.460556 32.426674)\r\n443;499;odd;Autauga County 4;Autauga;AL;36067;LINESTRING(-86.460848 32.427057,-86.460603 32.42691,-86.460569 32.426892,-86.460438 32.426804)\r\n459;407;all;Autauga County 70;Autauga;AL;36022;LINESTRING(-86.444419 32.656052,-86.444468 32.656052,-86.445058 32.656071,-86.445233 32.656071,-86.445843 32.656042,-86.446165 32.656029,-86.446326 32.656033,-86.446484 32.656047,-86.44664 32.656075,-86.447043 32.656177,-86.447623 32.656291,-86.448127 32.656384,-86.448306 32.656397,-86.44924 32.656418,-86.449573 32.656441,-86.450742 32.656564,-86.450985 32.656603,-86.451471 32.656714,-86.451952 32.656846,-86.452513 32.657022,-86.452682 32.657066,-86.452938 32.657115,-86.453193 32.657155,-86.453452 32.657185,-86.453752 32.657209)\r\n100;198;even;Glasglow Pl;Autauga;AL;36066;LINESTRING(-86.423243 32.476013,-86.423258 32.476204,-86.423263 32.476262)\r\n101;199;odd;Glasglow Pl;Autauga;AL;36066;LINESTRING(-86.423437 32.476001,-86.423456 32.476194,-86.423457 32.476255)\r\n3699;3601;odd;Autauga County 22;Autauga;AL;36758;LINESTRING(-86.813416 32.618276,-86.812058 32.618553,-86.810408 32.618855,-86.809915 32.618973,-86.808963 32.619201,-86.808242 32.619386,-86.807795 32.619542,-86.806438 32.620044,-86.805813 32.620425,-86.805532 32.620658,-86.804932 32.621253,-86.80466 32.621874)\r\n3698;3622;even;Autauga County 22;Autauga;AL;36758;LINESTRING(-86.813462 32.618436,-86.812102 32.618715,-86.810456 32.619019,-86.809967 32.619131,-86.809019 32.619361,-86.80831 32.619548,-86.807873 32.619696,-86.806544 32.6202,-86.805947 32.620561,-86.805682 32.620776,-86.805124 32.621349,-86.804842 32.621934)\r\n1300;1398;all;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.639139 32.562934,-86.639104 32.563118,-86.639101 32.563196,-86.639117 32.563338,-86.639147 32.563479,-86.639215 32.563695,-86.639373 32.563956,-86.639946 32.564852,-86.640664 32.566002,-86.641032 32.566655,-86.641208 32.566982,-86.641638 32.567849,-86.642029 32.568569,-86.642357 32.569165,-86.642597 32.569561,-86.642769 32.569826,-86.642928 32.570022,-86.64307 32.570182)\r\n110;198;even;Oakland Dr;Autauga;AL;36067;LINESTRING(-86.458156 32.461304,-86.458104 32.4613,-86.457924 32.461336,-86.457504 32.461431,-86.457334 32.461477,-86.457169 32.461532,-86.456915 32.461626,-86.456771 32.461761,-86.456764 32.461804)\r\n109;199;odd;Oakland Dr;Autauga;AL;36067;LINESTRING(-86.458163 32.461469,-86.45813 32.461476,-86.45797 32.4615,-86.45756 32.461593,-86.457402 32.461637,-86.457251 32.461688,-86.457051 32.46178,-86.456961 32.461863,-86.456944 32.461868)\r\n2201;2299;odd;Ollies Rd;Autauga;AL;36067;LINESTRING(-86.622473 32.507925,-86.622525 32.508329)\r\n2200;2298;even;Ollies Rd;Autauga;AL;36067;LINESTRING(-86.622667 32.507907,-86.622719 32.508311)\r\n1699;1693;odd;Cumberland Dr;Autauga;AL;36066;LINESTRING(-86.425131 32.468892,-86.425344 32.468952,-86.425419 32.468978,-86.425635 32.469071,-86.425752 32.469148,-86.425904 32.469301,-86.425957 32.469381,-86.426034 32.469559,-86.426056 32.469632,-86.42606 32.469636)\r\n1698;1686;even;Cumberland Dr;Autauga;AL;36066;LINESTRING(-86.425192 32.468735,-86.42541 32.468794,-86.425499 32.46882,-86.425745 32.468919,-86.425902 32.469016,-86.426078 32.469201,-86.426147 32.469307,-86.426234 32.469511,-86.426254 32.469602,-86.426253 32.469614)\r\n199;185;all;Autauga County 20;Autauga;AL;36051;LINESTRING(-86.476057 32.701246,-86.476081 32.701253)\r\n2016;2018;even;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.4642 32.584735,-86.464203 32.585058)\r\n2013;2017;odd;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.464395 32.584734,-86.464398 32.585057)\r\n1812;1872;even;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.60079 32.634974,-86.600778 32.634987,-86.600695 32.63512,-86.600622 32.635255,-86.600559 32.635393,-86.600502 32.635531,-86.600453 32.635673,-86.60041 32.635815,-86.600373 32.63596,-86.600346 32.636109,-86.600316 32.636401,-86.600315 32.636695,-86.600353 32.638792,-86.600365 32.639154,-86.600384 32.640601,-86.600404 32.641732)\r\n1801;1827;odd;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.600957 32.635059,-86.600952 32.635071,-86.600875 32.635194,-86.600806 32.635321,-86.600745 32.635451,-86.600692 32.635583,-86.600645 32.635717,-86.600604 32.635853,-86.600571 32.63599,-86.600546 32.636129,-86.600518 32.636409,-86.600509 32.636695,-86.600549 32.638788,-86.600561 32.63915,-86.60058 32.640599,-86.600599 32.641729)\r\n2698;2600;even;Taylor St;Autauga;AL;36003;LINESTRING(-86.654426 32.428468,-86.654437 32.428484,-86.65448 32.428503,-86.654571 32.428587,-86.654667 32.428707,-86.655157 32.429305,-86.655343 32.429525)\r\n2601;2699;odd;Taylor St;Autauga;AL;36003;LINESTRING(-86.654437 32.428304,-86.654517 32.428292,-86.65463 32.428367,-86.654735 32.428485,-86.654831 32.428613,-86.655317 32.429209,-86.655502 32.42943)\r\n2398;2300;even;Line St;Autauga;AL;36003;LINESTRING(-86.646668 32.428224,-86.646941 32.428462,-86.647072 32.428572,-86.647162 32.428627,-86.647274 32.428662,-86.647397 32.428663,-86.647509 32.428639,-86.647671 32.428562,-86.647746 32.428518,-86.648171 32.428268,-86.648608 32.42802)\r\n2301;2319;odd;Line St;Autauga;AL;36003;LINESTRING(-86.646807 32.428109,-86.647079 32.428342,-86.647202 32.428434,-86.64726 32.428463,-86.647316 32.428478,-86.647373 32.428483,-86.647431 32.428469,-86.647569 32.428414,-86.647636 32.42838,-86.648061 32.42813,-86.6485 32.427883)\r\n132;128;all;Guilford Ln;Autauga;AL;36066;LINESTRING(-86.43807 32.470589,-86.438511 32.470592,-86.43889 32.470584)\r\n116;130;even;Patrick St;Autauga;AL;36067;LINESTRING(-86.45439 32.452619,-86.454518 32.452617,-86.454949 32.452601,-86.455143 32.452598)\r\n115;135;odd;Patrick St;Autauga;AL;36067;LINESTRING(-86.454386 32.452454,-86.454512 32.452451,-86.454943 32.452433,-86.455141 32.452434)\r\n706;710;all;Autauga County 95;Autauga;AL;36749;LINESTRING(-86.827049 32.534609,-86.826944 32.534554,-86.826811 32.534476,-86.826616 32.534338,-86.826392 32.534197,-86.826276 32.534185,-86.826172 32.534185,-86.826072 32.5342,-86.825974 32.534227,-86.825885 32.534272,-86.825809 32.534327,-86.825717 32.534408)\r\n899;855;odd;Autauga County 150;Autauga;AL;36051;LINESTRING(-86.583953 32.60539,-86.58327 32.605382,-86.583005 32.605392,-86.582645 32.605423,-86.582448 32.605468,-86.582267 32.60557,-86.58217 32.605706,-86.582095 32.605837,-86.581956 32.6061,-86.58173 32.606567,-86.581672 32.606707,-86.58162 32.606847,-86.581581 32.606981)\r\n898;862;even;Autauga County 150;Autauga;AL;36051;LINESTRING(-86.583951 32.605555,-86.583274 32.60555,-86.583021 32.605562,-86.582687 32.605597,-86.582544 32.605638,-86.582429 32.605706,-86.582348 32.605794,-86.582275 32.605909,-86.582138 32.606166,-86.581916 32.606627,-86.58186 32.606759,-86.581812 32.606893,-86.58177 32.607022)\r\n2100;2116;even;Big Springs Church Rd;Autauga;AL;36006;LINESTRING(-86.713186 32.632661,-86.713215 32.632661,-86.713524 32.632658,-86.713945 32.632659,-86.71438 32.632673,-86.714457 32.632682,-86.714532 32.632699,-86.7146 32.632724,-86.714658 32.632754,-86.714708 32.632788,-86.714752 32.632829,-86.714795 32.632875,-86.714881 32.63299,-86.714956 32.633109,-86.71515 32.633497,-86.715292 32.633764,-86.715385 32.633894,-86.715486 32.63402,-86.715821 32.634356,-86.716034 32.634585,-86.716183 32.634759,-86.716322 32.634942,-86.716488 32.635193,-86.716799 32.635623,-86.71692 32.63581,-86.717025 32.636005,-86.717084 32.636136,-86.717135 32.636272,-86.717262 32.636679,-86.71736 32.637025,-86.717448 32.637312,-86.717508 32.637457,-86.717547 32.637528,-86.717591 32.637597,-86.71764 32.637667,-86.717698 32.637728,-86.71781 32.637847,-86.717937 32.637956,-86.718208 32.638164,-86.718343 32.638254,-86.718392 32.638295,-86.718441 32.638353,-86.718495 32.638413,-86.71862 32.638591,-86.718648 32.638642,-86.718665 32.638688,-86.718696 32.638803,-86.718704 32.638862,-86.718711 32.639006)\r\n2201;2283;odd;Big Springs Church Rd;Autauga;AL;36006;LINESTRING(-86.71319 32.632496,-86.713215 32.632497,-86.713522 32.632492,-86.713949 32.632493,-86.714394 32.632501,-86.714497 32.63251,-86.7146 32.632533,-86.714696 32.632568,-86.71478 32.632612,-86.714848 32.632662,-86.714912 32.632717,-86.714963 32.632781,-86.715053 32.632904,-86.71514 32.633035,-86.715332 32.633429,-86.715474 32.633684,-86.715555 32.633802,-86.715648 32.633916,-86.715975 32.634252,-86.716194 32.634483,-86.716347 32.634665,-86.716494 32.634854,-86.71666 32.635109,-86.716971 32.635539,-86.7171 32.635734,-86.717211 32.635939,-86.717276 32.63608,-86.717325 32.636226,-86.717452 32.636639,-86.717552 32.636985,-86.717642 32.637262,-86.717696 32.637393,-86.717727 32.637452,-86.717765 32.637513,-86.717808 32.637569,-86.717854 32.637624,-86.717962 32.637733,-86.718077 32.637834,-86.718338 32.63803,-86.718493 32.638122,-86.718552 32.638191,-86.718601 32.638249,-86.718667 32.638313,-86.718802 32.638511,-86.718836 32.638578,-86.718865 32.63864,-86.718898 32.638777,-86.718906 32.638852,-86.718906 32.639003)\r\n1183;1199;all;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.597014 32.560248,-86.597015 32.560288,-86.597017 32.56052,-86.597034 32.560881,-86.597063 32.561165,-86.597107 32.561446,-86.597166 32.561726,-86.597251 32.562076,-86.597359 32.562424,-86.597509 32.562837,-86.597621 32.563111,-86.597742 32.56338,-86.597841 32.563575,-86.5979 32.563684)\r\n298;220;all;State Rte 14 E;Autauga;AL;36066;LINESTRING(-86.449605 32.467756,-86.449957 32.467163)\r\n318;398;even;E Poplar St;Autauga;AL;36066;LINESTRING(-86.436735 32.464812,-86.436694 32.464799,-86.436645 32.464781,-86.436534 32.464708,-86.436431 32.464603,-86.43637 32.464535,-86.43621 32.464443,-86.436115 32.464415,-86.436021 32.464389,-86.435947 32.464393)\r\n319;399;odd;E Poplar St;Autauga;AL;36066;LINESTRING(-86.436717 32.464975,-86.436644 32.464979,-86.436533 32.464945,-86.436378 32.464834,-86.436275 32.464711,-86.436226 32.464673,-86.436108 32.464603,-86.436049 32.464579,-86.435985 32.464567,-86.435935 32.464557)\r\n100;198;even;Autauga County 100;Autauga;AL;36022;LINESTRING(-86.462278 32.598447,-86.461603 32.598443,-86.460838 32.598452,-86.460667 32.598447,-86.460494 32.598452,-86.457943 32.598485,-86.457261 32.598482,-86.45692 32.598487,-86.456157 32.598486,-86.455478 32.598468,-86.45437 32.598446,-86.453941 32.598447,-86.453764 32.598454,-86.453669 32.598462,-86.453573 32.598483,-86.453478 32.59851,-86.453388 32.598559,-86.453305 32.598616,-86.453248 32.598689,-86.453195 32.598757,-86.453154 32.598836,-86.453106 32.598988,-86.453084 32.599139,-86.453001 32.600148,-86.452967 32.600353,-86.452948 32.600414,-86.452922 32.600469,-86.452887 32.600519,-86.452845 32.600561,-86.452796 32.600596,-86.452738 32.600624,-86.452673 32.600645,-86.452607 32.600656,-86.452538 32.600662,-86.452381 32.600646,-86.452221 32.600619,-86.451563 32.600465,-86.451384 32.600438,-86.451291 32.600432,-86.451198 32.600432,-86.451105 32.600436,-86.451012 32.600448,-86.450921 32.600465,-86.450829 32.60049,-86.450665 32.600554,-86.450585 32.600598,-86.450437 32.600679,-86.449899 32.601037,-86.449216 32.601465,-86.449018 32.601607,-86.448825 32.601751,-86.448533 32.60198)\r\n113;173;odd;Autauga County 100;Autauga;AL;36022;LINESTRING(-86.462277 32.598612,-86.461603 32.598609,-86.460836 32.598618,-86.460667 32.598611,-86.4605 32.598618,-86.457943 32.598651,-86.457263 32.598648,-86.456922 32.598653,-86.456153 32.598654,-86.455472 32.598634,-86.454368 32.598612,-86.453947 32.598615,-86.453782 32.598624,-86.453707 32.598634,-86.453635 32.598649,-86.453572 32.598672,-86.453512 32.598701,-86.453463 32.59874,-86.453416 32.598785,-86.453379 32.598839,-86.45335 32.598894,-86.453308 32.599022,-86.453284 32.599157,-86.453201 32.600166,-86.453167 32.600385,-86.453146 32.600466,-86.45311 32.600545,-86.453061 32.600619,-86.452997 32.600689,-86.452914 32.600744,-86.452826 32.600784,-86.452731 32.600815,-86.452631 32.600832,-86.452532 32.600832,-86.452349 32.600816,-86.452175 32.600785,-86.451517 32.600633,-86.451358 32.600608,-86.451281 32.600602,-86.451204 32.6006,-86.451127 32.600606,-86.45105 32.600616,-86.450977 32.600631,-86.450905 32.600652,-86.450761 32.600708,-86.450691 32.60074,-86.450555 32.600817,-86.450019 32.601169,-86.44934 32.601597,-86.449146 32.601733,-86.448957 32.601875,-86.448665 32.602101)\r\n2399;2301;odd;Ellis Dr;Autauga;AL;36003;LINESTRING(-86.658653 32.448336,-86.658649 32.44834,-86.65875 32.448591,-86.65886 32.448873,-86.659004 32.449054,-86.659061 32.449128,-86.658974 32.449247,-86.658848 32.44945,-86.65878 32.449527,-86.658731 32.44956,-86.658556 32.449561,-86.658051 32.449566,-86.657713 32.449595,-86.657683 32.449599)\r\n2398;2334;even;Ellis Dr;Autauga;AL;36003;LINESTRING(-86.658829 32.448266,-86.658841 32.448276,-86.658936 32.448537,-86.659054 32.448791,-86.659194 32.44897,-86.659247 32.449136,-86.659148 32.449323,-86.659024 32.449534,-86.65895 32.449655,-86.658801 32.449752,-86.658552 32.449729,-86.658063 32.449736,-86.657735 32.449761,-86.657707 32.449763)\r\n3701;3799;odd;Cherry Hill Rd;Autauga;AL;36703;LINESTRING(-86.820023 32.454715,-86.819996 32.454663,-86.819974 32.454614,-86.819951 32.454483,-86.819952 32.454341,-86.819952 32.454263,-86.819872 32.45353,-86.81982 32.453093,-86.819783 32.452662,-86.819748 32.452154,-86.819748 32.452015,-86.819777 32.451809,-86.819831 32.451598,-86.81985 32.451516,-86.819843 32.451282,-86.819822 32.451201,-86.819749 32.450982,-86.819545 32.450499,-86.819473 32.450289,-86.819417 32.450143,-86.819367 32.450064,-86.819243 32.44994,-86.818979 32.449745,-86.818744 32.449539,-86.81865 32.449433,-86.818581 32.449318,-86.81854 32.449194,-86.81852 32.449059,-86.818497 32.448407,-86.818507 32.448272,-86.818539 32.448147,-86.818674 32.44789,-86.818758 32.447764,-86.818838 32.44763,-86.818974 32.447359,-86.819039 32.447214,-86.819079 32.447062,-86.819094 32.446901,-86.819058 32.446723,-86.818917 32.446595,-86.818803 32.446496,-86.818726 32.44639,-86.818661 32.446257,-86.818583 32.446119,-86.81849 32.445994,-86.818376 32.445811,-86.818354 32.445757,-86.818303 32.445472,-86.818204 32.445188,-86.818127 32.444981,-86.818088 32.444898,-86.817994 32.444807,-86.817842 32.4448,-86.817704 32.444831,-86.817619 32.444919,-86.817575 32.445012,-86.817562 32.445102,-86.817561 32.445258,-86.817562 32.445333,-86.817553 32.445474,-86.817536 32.445613,-86.817519 32.445675,-86.817468 32.445798,-86.817391 32.445912,-86.817346 32.445962,-86.817171 32.446115,-86.816983 32.446257,-86.816854 32.446341,-86.816791 32.446372,-86.816656 32.446416,-86.816511 32.446441,-86.816356 32.446421,-86.816188 32.446395,-86.816011 32.44637,-86.815909 32.446369,-86.815799 32.446384,-86.815611 32.44646,-86.815426 32.446643,-86.815381 32.44671,-86.815282 32.446811,-86.815166 32.446889,-86.815028 32.44695,-86.814798 32.447019,-86.814729 32.447029,-86.814587 32.447029,-86.814457 32.446989,-86.814328 32.446919,-86.8142 32.446825,-86.814059 32.446735,-86.813918 32.446652,-86.813854 32.446609,-86.813596 32.446407,-86.813422 32.446327,-86.813231 32.44629,-86.813038 32.446286,-86.812849 32.44631,-86.812672 32.446363,-86.812506 32.446426,-86.812337 32.446518,-86.812232 32.446675,-86.811679 32.448905,-86.811635 32.449036,-86.811575 32.449154,-86.81149 32.44925,-86.811377 32.44932,-86.811234 32.44937,-86.811072 32.449407,-86.810148 32.449573,-86.809896 32.449612,-86.809731 32.44963,-86.809562 32.449643,-86.809394 32.449649,-86.809053 32.449651,-86.807674 32.44964,-86.807155 32.449645,-86.806466 32.44967,-86.806459 32.449671)\r\n3800;3874;even;Cherry Hill Rd;Autauga;AL;36703;LINESTRING(-86.81986 32.454805,-86.819798 32.454743,-86.819768 32.454652,-86.819749 32.454491,-86.819758 32.454341,-86.819752 32.454273,-86.819678 32.453546,-86.819624 32.453107,-86.819587 32.452672,-86.81955 32.45216,-86.819544 32.452007,-86.819575 32.451779,-86.819635 32.451566,-86.819644 32.451504,-86.819635 32.451302,-86.819624 32.451239,-86.819557 32.451034,-86.819353 32.450551,-86.819283 32.450341,-86.819225 32.450215,-86.819191 32.450164,-86.819093 32.450062,-86.818841 32.449867,-86.81859 32.449653,-86.818472 32.449531,-86.818381 32.449384,-86.818332 32.449226,-86.81832 32.449069,-86.818301 32.448407,-86.818297 32.448252,-86.818333 32.448089,-86.818496 32.447812,-86.818582 32.447684,-86.818656 32.447558,-86.818788 32.447297,-86.818841 32.447166,-86.818875 32.447036,-86.818888 32.446913,-86.818848 32.446811,-86.818767 32.446715,-86.818627 32.446612,-86.81854 32.446464,-86.818477 32.446325,-86.818405 32.446201,-86.81832 32.446078,-86.81818 32.445883,-86.81815 32.445797,-86.818101 32.445508,-86.818014 32.445238,-86.817935 32.445047,-86.817904 32.445006,-86.817878 32.444991,-86.817862 32.444974,-86.817838 32.444995,-86.817807 32.445019,-86.817783 32.445062,-86.817768 32.445118,-86.817757 32.44526,-86.817758 32.445335,-86.817755 32.445486,-86.817734 32.445637,-86.817721 32.445719,-86.817662 32.445874,-86.817561 32.446014,-86.817498 32.446076,-86.817309 32.446237,-86.817111 32.446387,-86.816972 32.446479,-86.816891 32.44653,-86.81671 32.446596,-86.816511 32.446605,-86.816324 32.446589,-86.816156 32.446561,-86.815997 32.446546,-86.815929 32.446547,-86.815869 32.44656,-86.815749 32.446614,-86.815594 32.446751,-86.815547 32.446808,-86.815438 32.446941,-86.815278 32.447041,-86.81511 32.447112,-86.814854 32.447187,-86.814753 32.447207,-86.814551 32.447215,-86.814355 32.447153,-86.814202 32.447055,-86.814072 32.446957,-86.813941 32.446871,-86.8138 32.446788,-86.813726 32.446741,-86.813472 32.446557,-86.813344 32.446499,-86.813201 32.446468,-86.81305 32.44646,-86.812899 32.446482,-86.812748 32.446523,-86.812612 32.44658,-86.812507 32.44665,-86.81244 32.446743,-86.811873 32.448945,-86.811829 32.44909,-86.811767 32.449242,-86.811648 32.449384,-86.811479 32.449484,-86.811294 32.449536,-86.811116 32.449571,-86.810186 32.449737,-86.809928 32.44978,-86.809751 32.449798,-86.809574 32.449809,-86.8094 32.449817,-86.809053 32.449817,-86.807674 32.449804,-86.807161 32.449811,-86.806472 32.449836,-86.806463 32.449835)\r\n699;559;odd;W 4th St;Autauga;AL;36067;LINESTRING(-86.494683 32.465784,-86.492307 32.46503,-86.491503 32.46477,-86.491017 32.46462,-86.490712 32.464529)\r\n698;600;even;W 4th St;Autauga;AL;36067;LINESTRING(-86.494614 32.465938,-86.492239 32.465184,-86.491435 32.464926,-86.490951 32.464776,-86.490647 32.464684)\r\n2599;2501;odd;Tyus St;Autauga;AL;36003;LINESTRING(-86.657132 32.434125,-86.657006 32.4342,-86.656792 32.434321,-86.656645 32.434398,-86.656357 32.434561,-86.656082 32.434707)\r\n2598;2500;even;Tyus St;Autauga;AL;36003;LINESTRING(-86.657245 32.434259,-86.657118 32.434336,-86.6569 32.434463,-86.656751 32.43454,-86.656463 32.434701,-86.656185 32.434847)\r\n2776;2898;even;Autauga County 99;Autauga;AL;36051;LINESTRING(-86.495772 32.66706,-86.495309 32.668193,-86.495101 32.668659,-86.494879 32.669128,-86.494824 32.66927,-86.494788 32.669418,-86.494776 32.669498,-86.494776 32.669651,-86.494817 32.670084,-86.494869 32.670871,-86.494863 32.670935,-86.494855 32.671,-86.49484 32.671064,-86.494795 32.671194,-86.494681 32.671462,-86.494343 32.6722,-86.494087 32.672734,-86.493822 32.67334,-86.49372 32.673532,-86.493642 32.673649,-86.493548 32.673762,-86.493443 32.673867,-86.493328 32.673965,-86.493204 32.674056,-86.49314 32.674096,-86.493005 32.674169,-86.492938 32.674199,-86.492867 32.674221,-86.492796 32.674236,-86.492639 32.674253,-86.492477 32.674257,-86.491967 32.674234,-86.491541 32.674223,-86.491212 32.674228)\r\n2763;2999;odd;Autauga County 99;Autauga;AL;36051;LINESTRING(-86.495957 32.667113,-86.495495 32.668249,-86.495285 32.668719,-86.495069 32.669186,-86.495022 32.669314,-86.494988 32.669446,-86.49498 32.66951,-86.494976 32.669645,-86.495013 32.670074,-86.495065 32.670869,-86.495065 32.670947,-86.495055 32.671026,-86.495038 32.671104,-86.494987 32.671248,-86.494865 32.67152,-86.494525 32.67226,-86.494271 32.672794,-86.494008 32.673404,-86.493904 32.67361,-86.493814 32.673743,-86.493708 32.673866,-86.493593 32.673981,-86.493466 32.674091,-86.49333 32.674186,-86.493258 32.674236,-86.493107 32.674319,-86.493022 32.674353,-86.492933 32.674387,-86.492834 32.67441,-86.492651 32.674425,-86.492473 32.674425,-86.491959 32.6744,-86.491539 32.674389,-86.491215 32.674392)\r\n4298;4200;all;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.864453 32.595572,-86.864185 32.595532,-86.864018 32.595513,-86.86376 32.595492,-86.863677 32.595486)\r\n100;298;even;Tew Ct;Autauga;AL;36066;LINESTRING(-86.449225 32.468829,-86.449279 32.468854,-86.449426 32.468923,-86.449878 32.469126,-86.449918 32.469144)\r\n101;299;odd;Tew Ct;Autauga;AL;36066;LINESTRING(-86.449307 32.46868,-86.449373 32.468702,-86.449522 32.468777,-86.449976 32.46898,-86.450017 32.469002)\r\n528;598;even;Weatherby Trl;Autauga;AL;36067;LINESTRING(-86.470382 32.44836,-86.470142 32.448364,-86.469982 32.448489,-86.469898 32.448683,-86.469907 32.449049,-86.469903 32.449913,-86.469896 32.450467)\r\n527;599;odd;Weatherby Trl;Autauga;AL;36067;LINESTRING(-86.470402 32.448523,-86.470242 32.448554,-86.470176 32.448601,-86.47012 32.448719,-86.470103 32.449051,-86.470099 32.449915,-86.470091 32.450469)\r\n420;498;even;Sydney Dr N;Autauga;AL;36066;LINESTRING(-86.422204 32.494928,-86.42219 32.495074,-86.422189 32.495328,-86.422185 32.495435,-86.422218 32.495547,-86.422239 32.495631,-86.422334 32.495722,-86.422419 32.495795,-86.422555 32.495829,-86.422665 32.495864,-86.422763 32.495867,-86.422783 32.495863)\r\n419;499;odd;Sydney Dr N;Autauga;AL;36066;LINESTRING(-86.422398 32.494938,-86.42239 32.49508,-86.422385 32.495326,-86.422395 32.495413,-86.422414 32.495503,-86.422439 32.495541,-86.422486 32.4956,-86.422537 32.495631,-86.422621 32.495669,-86.422707 32.495686,-86.422771 32.495695,-86.422783 32.495699)\r\n1439;1469;all;Autauga County 73;Autauga;AL;36006;LINESTRING(-86.730657 32.569975,-86.730624 32.569975)\r\n217;201;odd;Kendrick Way;Autauga;AL;36066;LINESTRING(-86.425384 32.492267,-86.42547 32.492157,-86.425548 32.492048,-86.425567 32.491958,-86.425577 32.491817,-86.425557 32.49125,-86.425552 32.49116,-86.425531 32.491037,-86.425472 32.490903,-86.425375 32.490764,-86.425345 32.490728)\r\n218;202;even;Kendrick Way;Autauga;AL;36066;LINESTRING(-86.425219 32.49218,-86.425296 32.492071,-86.425342 32.491984,-86.425361 32.491932,-86.425377 32.491813,-86.425359 32.491258,-86.42535 32.49118,-86.425327 32.491083,-86.425282 32.490977,-86.425203 32.49085,-86.425181 32.490816)\r\n1476;1498;even;Autauga County 112;Autauga;AL;36067;LINESTRING(-86.647933 32.604205,-86.648031 32.604203,-86.648603 32.604203,-86.650063 32.60418,-86.651765 32.604183,-86.651979 32.604169)\r\n1475;1499;odd;Autauga County 112;Autauga;AL;36067;LINESTRING(-86.647927 32.60404,-86.648029 32.604037,-86.648601 32.604037,-86.650061 32.604014,-86.651759 32.604013,-86.651967 32.604005)\r\n399;231;odd;Autauga County 68 W;Autauga;AL;36022;LINESTRING(-86.527012 32.658425,-86.526703 32.658393,-86.526098 32.658352,-86.525581 32.658339,-86.525323 32.658337,-86.525061 32.658341,-86.523266 32.658458,-86.521559 32.658576,-86.520709 32.658646,-86.519013 32.658763,-86.516295 32.658973,-86.513294 32.659181,-86.513145 32.65921)\r\n398;290;even;Autauga County 68 W;Autauga;AL;36022;LINESTRING(-86.526989 32.658588,-86.526683 32.658559,-86.526086 32.65852,-86.525577 32.658505,-86.525325 32.658503,-86.525071 32.658509,-86.523282 32.658622,-86.521577 32.658742,-86.520727 32.658812,-86.519029 32.658927,-86.516313 32.659137,-86.513322 32.659353,-86.513182 32.659371)\r\n199;189;all;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.477805 32.57219,-86.47716 32.572693)\r\n1900;1920;even;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.513947 32.550538,-86.513765 32.551674,-86.513671 32.552325,-86.513622 32.55276,-86.513587 32.553194,-86.513571 32.553486,-86.513563 32.553921,-86.513564 32.554434,-86.513609 32.555229,-86.513693 32.556534,-86.513733 32.557257,-86.513888 32.559564,-86.513913 32.559854,-86.513953 32.560144,-86.514004 32.560433,-86.514067 32.56072,-86.514133 32.560941)\r\n1701;1799;odd;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.51414 32.55056,-86.513959 32.551696,-86.513867 32.552343,-86.513818 32.552774,-86.513783 32.553204,-86.513769 32.553492,-86.513759 32.553923,-86.513762 32.55443,-86.513805 32.555221,-86.513889 32.556526,-86.513929 32.557249,-86.514084 32.559552,-86.514111 32.559838,-86.514149 32.560122,-86.5142 32.560405,-86.514263 32.560684,-86.514322 32.560903)\r\n621;699;all;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.739324 32.493813,-86.739368 32.493825,-86.739703 32.49392,-86.740196 32.494074,-86.740518 32.494194,-86.74083 32.494324,-86.741133 32.494471,-86.741287 32.494552,-86.741575 32.494728,-86.741718 32.494818,-86.741986 32.495005,-86.742112 32.495101,-86.742357 32.49531,-86.743181 32.496052,-86.744554 32.497304)\r\n1324;1350;even;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.599086 32.574228,-86.598683 32.575044,-86.598558 32.575317,-86.598441 32.575593,-86.598347 32.575874,-86.598303 32.576019,-86.598242 32.576307,-86.598196 32.576596,-86.598178 32.576744,-86.598168 32.576891,-86.598161 32.577328,-86.598173 32.578343,-86.598199 32.579791,-86.598217 32.580512,-86.598219 32.581235,-86.598253 32.582747)\r\n1321;1343;odd;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.599266 32.574292,-86.598867 32.575106,-86.598744 32.575375,-86.598633 32.575645,-86.598539 32.575918,-86.598499 32.576055,-86.598438 32.576333,-86.598392 32.576616,-86.598376 32.576758,-86.598366 32.576897,-86.598357 32.577328,-86.598369 32.578341,-86.598395 32.579789,-86.598413 32.58051,-86.598415 32.581233,-86.598448 32.582744)\r\n1216;1298;even;Kingston Green Dr;Autauga;AL;36067;LINESTRING(-86.476348 32.491155,-86.476341 32.491201,-86.476339 32.491278)\r\n1215;1299;odd;Kingston Green Dr;Autauga;AL;36067;LINESTRING(-86.476541 32.491169,-86.476539 32.491211,-86.476533 32.491285)\r\n1846;1898;even;Rodock Rd;Autauga;AL;36067;LINESTRING(-86.560563 32.552329,-86.560363 32.552398,-86.559635 32.552592,-86.559453 32.552634)\r\n1693;1899;odd;Rodock Rd;Autauga;AL;36067;LINESTRING(-86.560641 32.55248,-86.560435 32.55256,-86.559689 32.552754,-86.559502 32.552793)\r\n399;301;odd;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.475823 32.466991,-86.475793 32.466945,-86.475474 32.466431,-86.475395 32.466308,-86.475334 32.466196,-86.475297 32.466109,-86.475283 32.466091)\r\n398;300;even;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.475657 32.467077,-86.475619 32.467029,-86.4753 32.466511,-86.475215 32.466386,-86.475146 32.466262,-86.475109 32.466173,-86.475106 32.466158)\r\n300;408;even;Autauga County 101;Autauga;AL;36003;LINESTRING(-86.781973 32.468769,-86.781987 32.468786,-86.782037 32.468836,-86.782128 32.468947,-86.782213 32.469064,-86.782464 32.469437,-86.782728 32.469816,-86.782914 32.470067,-86.783121 32.470308,-86.783344 32.470539,-86.783921 32.471086,-86.784024 32.471197,-86.784117 32.471312,-86.78429 32.471562,-86.784445 32.471819,-86.784588 32.472082,-86.784825 32.47255,-86.785073 32.473088,-86.785242 32.473498,-86.785498 32.474193,-86.785714 32.474822,-86.785887 32.475387,-86.785962 32.475668,-86.786023 32.475948,-86.786087 32.476378,-86.7861 32.476522,-86.786118 32.476958,-86.786168 32.477764,-86.78619 32.477917,-86.78623 32.478071,-86.786265 32.478149,-86.786307 32.478225,-86.786413 32.478354,-86.786474 32.478414,-86.786598 32.478526,-86.786734 32.478626,-86.786877 32.478723,-86.78703 32.478806,-86.787342 32.478939,-86.787404 32.478974,-86.78752 32.479057,-86.787561 32.4791,-86.787594 32.479152,-86.787618 32.479207,-86.787637 32.479268,-86.787677 32.479475,-86.78774 32.479767,-86.787826 32.480054,-86.787884 32.480199,-86.787951 32.480338,-86.788095 32.48061,-86.788177 32.480742,-86.788595 32.48138,-86.788832 32.481767,-86.788903 32.481896,-86.789034 32.482163,-86.789215 32.48257,-86.789315 32.482845,-86.789421 32.483195,-86.789465 32.483401,-86.789479 32.483537,-86.789481 32.483678,-86.789466 32.483966,-86.789415 32.484692,-86.789407 32.484987,-86.789409 32.485284,-86.789421 32.485434,-86.789501 32.486087,-86.789476 32.486205,-86.789418 32.486297,-86.78932 32.486361,-86.789269 32.486378,-86.789117 32.48639,-86.788611 32.486388,-86.788346 32.486398,-86.78816 32.486413,-86.788061 32.486439,-86.787961 32.486474,-86.787805 32.486581,-86.78774 32.486654,-86.787692 32.486731,-86.78766 32.48681,-86.78764 32.48689,-86.787623 32.486968,-86.787611 32.487118,-86.787605 32.487849,-86.78759 32.488432,-86.787591 32.488728,-86.787597 32.488877,-86.787623 32.489138)\r\n201;299;odd;Autauga County 101;Autauga;AL;36003;LINESTRING(-86.782108 32.46865,-86.782137 32.468668,-86.782199 32.468732,-86.782296 32.468855,-86.782383 32.46898,-86.782634 32.469353,-86.782896 32.469728,-86.78308 32.469971,-86.783279 32.470204,-86.783496 32.470429,-86.784075 32.470978,-86.784184 32.471097,-86.784289 32.47122,-86.784466 32.471482,-86.784623 32.471747,-86.784768 32.472014,-86.785007 32.472486,-86.785259 32.47303,-86.78543 32.473446,-86.785686 32.474145,-86.785904 32.474778,-86.786079 32.475347,-86.786156 32.475634,-86.786221 32.475922,-86.786285 32.476362,-86.786298 32.476512,-86.786314 32.47695,-86.786368 32.477748,-86.78639 32.477887,-86.786428 32.478021,-86.786453 32.478081,-86.786487 32.478137,-86.786575 32.47825,-86.786624 32.478302,-86.786738 32.478402,-86.786862 32.478496,-86.786995 32.478583,-86.787132 32.478656,-86.787436 32.478791,-86.787524 32.478828,-86.787676 32.478931,-86.787739 32.479006,-86.787784 32.479082,-86.787816 32.479159,-86.787833 32.479236,-86.787871 32.479447,-86.787936 32.479731,-86.78802 32.480006,-86.788072 32.480141,-86.788133 32.480272,-86.788275 32.480536,-86.788351 32.480664,-86.788769 32.481302,-86.78901 32.481693,-86.789085 32.481828,-86.789218 32.482101,-86.789405 32.482516,-86.789507 32.482799,-86.789617 32.483157,-86.789669 32.483379,-86.789679 32.483531,-86.789679 32.483682,-86.789662 32.483974,-86.789613 32.4847,-86.789603 32.484989,-86.789609 32.485278,-86.789619 32.48542,-86.789697 32.486085,-86.789696 32.486259,-86.789596 32.486425,-86.789418 32.486535,-86.789303 32.486554,-86.789123 32.48656,-86.788615 32.486556,-86.788362 32.486568,-86.788202 32.486587,-86.788135 32.486603,-86.788075 32.48663,-86.787959 32.486709,-86.787916 32.486752,-86.787882 32.486803,-86.787856 32.48686,-86.787836 32.486924,-86.787825 32.486988,-86.787811 32.487126,-86.787801 32.487851,-86.787786 32.488434,-86.787789 32.488724,-86.787795 32.488867,-86.787817 32.489126)\r\n954;998;even;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.696122 32.493824,-86.69615 32.493859,-86.696809 32.494517,-86.697016 32.494744,-86.697111 32.494859,-86.6972 32.49498,-86.697283 32.495103,-86.697361 32.495229,-86.697432 32.495356,-86.697561 32.49562,-86.697667 32.49589,-86.697751 32.496166,-86.697786 32.496306,-86.697954 32.497092,-86.699055 32.502479,-86.69915 32.503052,-86.699186 32.503343,-86.699228 32.503775,-86.699261 32.504356,-86.69937 32.507643,-86.699383 32.508369,-86.699361 32.509895,-86.699366 32.510352)\r\n1001;1099;odd;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.696277 32.493724,-86.696306 32.493753,-86.696963 32.494411,-86.697176 32.494644,-86.697277 32.494767,-86.69737 32.494894,-86.697457 32.495023,-86.697539 32.495155,-86.697614 32.495288,-86.697751 32.49556,-86.697859 32.495842,-86.697945 32.496128,-86.69798 32.496274,-86.698146 32.497064,-86.699251 32.502453,-86.699346 32.503032,-86.699382 32.503327,-86.699426 32.503765,-86.699457 32.50435,-86.699566 32.507639,-86.699577 32.508369,-86.699557 32.509895,-86.69956 32.510351)\r\n724;748;even;Summer Ln;Autauga;AL;36066;LINESTRING(-86.425687 32.458242,-86.425628 32.458198,-86.425381 32.458114,-86.425228 32.458053,-86.425 32.457954,-86.424854 32.457884,-86.424651 32.457771,-86.42454 32.457683,-86.424447 32.457578,-86.424249 32.457265,-86.424166 32.457134,-86.424025 32.456948,-86.423753 32.456657,-86.423632 32.456546,-86.423373 32.456361)\r\n727;749;odd;Summer Ln;Autauga;AL;36066;LINESTRING(-86.425576 32.458377,-86.425524 32.458356,-86.425299 32.458266,-86.42514 32.458203,-86.424906 32.458102,-86.424752 32.45803,-86.424521 32.457913,-86.424384 32.457801,-86.424269 32.457672,-86.424075 32.457343,-86.423994 32.457222,-86.423859 32.457048,-86.423599 32.456769,-86.42349 32.45667,-86.423245 32.456485)\r\n1624;1628;all;Autauga County 87;Autauga;AL;36022;LINESTRING(-86.431436 32.539477,-86.431519 32.539632,-86.431539 32.539669)\r\n916;904;all;N Memorial Dr;Autauga;AL;36067;LINESTRING(-86.451772 32.481481,-86.451733 32.481252,-86.451722 32.481119,-86.451723 32.480995)\r\n779;767;odd;Glenbrooke Blvd;Autauga;AL;36066;LINESTRING(-86.420892 32.492723,-86.42103 32.492774,-86.421171 32.492833,-86.421296 32.492888,-86.421421 32.492886,-86.421567 32.492884,-86.421678 32.49286,-86.421784 32.49283,-86.42187 32.492792,-86.422446 32.492436)\r\n778;770;even;Glenbrooke Blvd;Autauga;AL;36066;LINESTRING(-86.420965 32.492571,-86.421114 32.492618,-86.421255 32.492679,-86.42135 32.492704,-86.421423 32.49272,-86.421537 32.492708,-86.42162 32.492694,-86.421702 32.492668,-86.421762 32.492642,-86.422333 32.492302)\r\n298;200;all;Taylor St;Autauga;AL;36003;LINESTRING(-86.655508 32.429726,-86.655638 32.42989,-86.655773 32.43005)\r\n598;500;even;Pine Level Run;Autauga;AL;36022;LINESTRING(-86.469521 32.58676,-86.469526 32.58622)\r\n599;501;odd;Pine Level Run;Autauga;AL;36022;LINESTRING(-86.469326 32.586759,-86.469331 32.586219)\r\n2024;2026;even;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.464227 32.586132,-86.464229 32.586311,-86.464228 32.586567)\r\n2029;2031;odd;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.464422 32.58613,-86.464425 32.586311,-86.464423 32.586568)\r\n200;298;even;Pine St;Autauga;AL;36067;LINESTRING(-86.468701 32.46576,-86.468643 32.465978,-86.468575 32.466268,-86.468499 32.466551,-86.468475 32.466635)\r\n201;299;odd;Pine St;Autauga;AL;36067;LINESTRING(-86.468891 32.465795,-86.468835 32.466012,-86.468767 32.466302,-86.468693 32.466591,-86.468663 32.466678)\r\n1574;1590;all;Rolling Hills Dr;Autauga;AL;36067;LINESTRING(-86.547255 32.447233,-86.547343 32.447232,-86.547704 32.447228,-86.547848 32.447227)\r\n699;617;odd;Marlyn Dr;Autauga;AL;36067;LINESTRING(-86.48617 32.484968,-86.486253 32.484932,-86.486287 32.484817,-86.486314 32.484724,-86.486339 32.484585,-86.486351 32.484289,-86.486357 32.483714)\r\n698;616;even;Marlyn Dr;Autauga;AL;36067;LINESTRING(-86.486049 32.484839,-86.486057 32.484814,-86.486091 32.484767,-86.486114 32.48469,-86.486135 32.484569,-86.486153 32.484285,-86.486162 32.483713)\r\n1700;1788;even;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.680313 32.590133,-86.680309 32.592158,-86.6803 32.592443,-86.680288 32.592586,-86.680269 32.592725,-86.680226 32.592934,-86.680149 32.59321,-86.680078 32.593415,-86.679999 32.593604,-86.679909 32.593788,-86.679756 32.594053,-86.679716 32.594111,-86.679667 32.594171,-86.679576 32.594304,-86.679433 32.594488,-86.678332 32.595804,-86.678275 32.595872)\r\n1701;1745;odd;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.680508 32.590134,-86.680507 32.59216,-86.680498 32.592451,-86.680486 32.5926,-86.680469 32.592749,-86.680422 32.592968,-86.680343 32.593254,-86.680268 32.593467,-86.680185 32.593664,-86.680093 32.593858,-86.679934 32.594133,-86.679888 32.594203,-86.679837 32.594263,-86.679746 32.594394,-86.679595 32.594582,-86.678492 32.5959,-86.678433 32.595968)\r\n900;998;even;Wright St;Autauga;AL;36066;LINESTRING(-86.45055 32.465052,-86.450369 32.465071,-86.44889 32.465406,-86.448589 32.465483)\r\n901;999;odd;Wright St;Autauga;AL;36066;LINESTRING(-86.45058 32.465214,-86.450411 32.465241,-86.448944 32.465566,-86.448645 32.465641)\r\n2301;2321;all;Autauga County 40;Autauga;AL;36006;LINESTRING(-86.750206 32.554601,-86.751174 32.554855,-86.751753 32.554992,-86.752163 32.555056,-86.752494 32.55508,-86.752659 32.555085,-86.752908 32.555076,-86.753156 32.555057,-86.753401 32.555024,-86.753645 32.554978,-86.753888 32.554922,-86.754123 32.554855,-86.754196 32.554832)\r\n2162;2298;even;Autauga County 66;Autauga;AL;36067;LINESTRING(-86.488726 32.591056,-86.490448 32.59104,-86.491136 32.591046,-86.492251 32.591033,-86.492428 32.591014,-86.492685 32.590974,-86.493018 32.590899,-86.494087 32.590643,-86.494163 32.59063,-86.49424 32.590625,-86.494311 32.590626,-86.494381 32.590634,-86.49445 32.59065,-86.494514 32.590675,-86.494576 32.590705,-86.49463 32.590743,-86.494739 32.590837,-86.494783 32.590885,-86.494865 32.590999,-86.494937 32.59112,-86.495161 32.59158,-86.495429 32.592113,-86.495646 32.592583,-86.496167 32.593803,-86.496212 32.593937,-86.496245 32.59407,-86.496265 32.594205,-86.496276 32.594341,-86.496252 32.594916,-86.496258 32.595639,-86.496249 32.596075,-86.496258 32.596512,-86.496287 32.59688,-86.496331 32.597281)\r\n2181;2299;odd;Autauga County 66;Autauga;AL;36067;LINESTRING(-86.488724 32.590891,-86.490448 32.590876,-86.491136 32.59088,-86.492237 32.590861,-86.492398 32.590846,-86.492641 32.590808,-86.492966 32.590739,-86.494041 32.590475,-86.494133 32.590462,-86.494228 32.590451,-86.494325 32.59045,-86.494425 32.590462,-86.49452 32.590488,-86.49461 32.590519,-86.494692 32.590563,-86.49477 32.590611,-86.494897 32.590725,-86.494951 32.590789,-86.495043 32.590917,-86.495121 32.59105,-86.495343 32.591516,-86.495613 32.592049,-86.49583 32.592525,-86.496357 32.593751,-86.496408 32.593895,-86.496443 32.594042,-86.496469 32.594189,-86.496472 32.594341,-86.49645 32.594918,-86.496454 32.595641,-86.496443 32.596075,-86.496456 32.596504,-86.496483 32.596868,-86.496525 32.597267)\r\n700;798;even;Sweet Ridge Rd;Autauga;AL;36066;LINESTRING(-86.427375 32.457357,-86.427426 32.457217,-86.427474 32.457071,-86.427479 32.456989,-86.427484 32.456841,-86.427485 32.456694,-86.427475 32.456544,-86.427418 32.456183,-86.427361 32.455829,-86.427336 32.455547,-86.427325 32.45519,-86.427328 32.454249,-86.427336 32.453954,-86.427331 32.453859,-86.427329 32.453822)\r\n709;799;odd;Sweet Ridge Rd;Autauga;AL;36066;LINESTRING(-86.427189 32.45731,-86.427234 32.457173,-86.427268 32.457041,-86.427279 32.456979,-86.427286 32.456839,-86.427285 32.456698,-86.427275 32.45656,-86.427224 32.456205,-86.427161 32.455847,-86.427138 32.455555,-86.427129 32.455192,-86.427132 32.454247,-86.42714 32.453956,-86.427137 32.453865,-86.427135 32.453829)\r\n500;524;all;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.896487 32.536845,-86.896447 32.537203,-86.896191 32.539366,-86.896082 32.540239)\r\n1299;1253;all;Cygnus Ln;Autauga;AL;36067;LINESTRING(-86.537286 32.500475,-86.537777 32.500081,-86.538888 32.499097,-86.539058 32.498962,-86.539273 32.498832,-86.539515 32.498748,-86.539853 32.498744,-86.540408 32.498773,-86.54083 32.498742,-86.540957 32.498714,-86.54106 32.49866,-86.541064 32.4987)\r\n3012;3032;all;Mushat Ln;Autauga;AL;36051;LINESTRING(-86.468293 32.700073,-86.468494 32.700184,-86.468625 32.700265,-86.468882 32.700448,-86.468997 32.700544,-86.469038 32.700588,-86.469067 32.700636,-86.469092 32.700673,-86.469077 32.700722)\r\n1599;1565;all;Quinneboquin Rd;Autauga;AL;36067;LINESTRING(-86.45753 32.523951,-86.457534 32.523953,-86.457561 32.524027,-86.457569 32.524053)\r\n443;499;all;Robbins Dr;Autauga;AL;36067;LINESTRING(-86.482227 32.441911,-86.482226 32.441894)\r\n114;198;all;Deer Trce;Autauga;AL;36067;LINESTRING(-86.472074 32.45366,-86.472238 32.453588,-86.472636 32.453395)\r\n2126;2162;even;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.440452 32.548739,-86.440308 32.548874,-86.440258 32.548942,-86.440165 32.549068,-86.440036 32.549263,-86.439862 32.549597,-86.439019 32.551263,-86.438786 32.551729,-86.438724 32.551865,-86.438669 32.552005,-86.438619 32.552147,-86.43856 32.552362,-86.438513 32.552652,-86.438496 32.552875,-86.438498 32.553095,-86.438522 32.553316,-86.43856 32.553535,-86.438656 32.553941)\r\n2127;2157;odd;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.4406 32.548845,-86.440472 32.54898,-86.440424 32.549034,-86.440337 32.549154,-86.440218 32.549339,-86.440042 32.549663,-86.439199 32.551327,-86.43897 32.551791,-86.438912 32.551921,-86.438859 32.552055,-86.438813 32.552189,-86.43876 32.552392,-86.438713 32.55267,-86.438696 32.552879,-86.4387 32.553087,-86.43872 32.553296,-86.438756 32.553507,-86.438847 32.553909)\r\n400;466;even;Jason Rd;Autauga;AL;36067;LINESTRING(-86.63588 32.478818,-86.635914 32.47894,-86.635935 32.479067,-86.635917 32.4792,-86.635883 32.479329,-86.635827 32.479453,-86.635753 32.479573,-86.635662 32.479692,-86.635356 32.480042,-86.635202 32.480222,-86.635056 32.480411,-86.635011 32.480479,-86.634931 32.480614,-86.634862 32.480756,-86.634801 32.480901,-86.634742 32.481122,-86.634695 32.481343,-86.634671 32.481573,-86.634677 32.481733,-86.634716 32.48189,-86.634785 32.482039,-86.634834 32.482112,-86.634938 32.48224,-86.635559 32.482852,-86.63566 32.482964,-86.635753 32.483081,-86.635835 32.483202,-86.635909 32.483329,-86.636448 32.484404,-86.636623 32.484739,-86.636878 32.485266)\r\n401;625;odd;Jason Rd;Autauga;AL;36067;LINESTRING(-86.636065 32.478769,-86.636126 32.478906,-86.636129 32.479067,-86.636123 32.479226,-86.636083 32.479381,-86.636015 32.479527,-86.635925 32.479659,-86.635828 32.479788,-86.635514 32.48014,-86.635366 32.480316,-86.635228 32.480499,-86.635187 32.480559,-86.635115 32.480684,-86.63505 32.480816,-86.634997 32.480949,-86.634938 32.481156,-86.634895 32.481367,-86.634869 32.481577,-86.634883 32.481709,-86.634916 32.48184,-86.634973 32.481965,-86.635008 32.482022,-86.6351 32.482134,-86.635713 32.482746,-86.635824 32.482864,-86.635923 32.482991,-86.636013 32.483122,-86.636091 32.483259,-86.636628 32.484338,-86.636805 32.484673,-86.637058 32.485204)\r\n100;104;even;Spanish Oak Dr;Autauga;AL;36067;LINESTRING(-86.474465 32.473395,-86.47457 32.473416,-86.474831 32.473449,-86.47498 32.47345,-86.47512 32.473434,-86.475213 32.473412,-86.475349 32.473376)\r\n101;105;odd;Spanish Oak Dr;Autauga;AL;36067;LINESTRING(-86.474505 32.473234,-86.474604 32.473248,-86.474847 32.473275,-86.474968 32.473276,-86.475082 32.473264,-86.475161 32.47325,-86.475293 32.473218)\r\n1500;1598;even;Sugar Creek Ct;Autauga;AL;36066;LINESTRING(-86.433246 32.455934,-86.433223 32.455899,-86.433107 32.455781,-86.433042 32.455725,-86.432973 32.455674,-86.432901 32.455626,-86.432833 32.455586,-86.432666 32.455456,-86.432605 32.455356,-86.432573 32.455251,-86.432584 32.455215)\r\n1501;1599;odd;Sugar Creek Ct;Autauga;AL;36066;LINESTRING(-86.433085 32.456026,-86.433061 32.456003,-86.432957 32.455895,-86.432904 32.455849,-86.432845 32.455804,-86.432783 32.455764,-86.432709 32.455724,-86.432486 32.455576,-86.432393 32.455414,-86.432373 32.455241,-86.432397 32.455171)\r\n1249;1201;all;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.466891 32.49109,-86.467003 32.490664,-86.467101 32.490313,-86.467308 32.489539,-86.467367 32.489343)\r\n466;498;even;Fig Tree St;Autauga;AL;36749;LINESTRING(-86.847674 32.5079,-86.847667 32.507924,-86.847671 32.50808,-86.84769 32.508237,-86.847758 32.508457,-86.84782 32.508601,-86.847886 32.508739,-86.848224 32.509332,-86.848263 32.509391,-86.848329 32.509512,-86.848347 32.509527)\r\n489;499;odd;Fig Tree St;Autauga;AL;36749;LINESTRING(-86.847867 32.507917,-86.847869 32.507932,-86.847873 32.508068,-86.847894 32.508205,-86.847952 32.508407,-86.848006 32.508541,-86.84807 32.508671,-86.848402 32.509254,-86.848441 32.509313,-86.848509 32.509428,-86.848511 32.509439)\r\n277;213;odd;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.829589 32.449894,-86.829558 32.450034,-86.82952 32.450328,-86.829495 32.450625,-86.829487 32.45092,-86.829489 32.451217,-86.829507 32.451513,-86.82954 32.451807,-86.829591 32.4521,-86.82969 32.452533,-86.829773 32.452822,-86.829926 32.453247,-86.830047 32.453524,-86.830176 32.453799,-86.830691 32.454807,-86.831034 32.455472,-86.8312 32.455806,-86.831322 32.456075,-86.83143 32.456349,-86.831573 32.456766,-86.831653 32.457047,-86.831718 32.457332,-86.831742 32.457455)\r\n276;204;even;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.829781 32.449921,-86.829756 32.450058,-86.829718 32.450344,-86.829693 32.450633,-86.829683 32.450922,-86.829687 32.451211,-86.829705 32.451501,-86.829738 32.451787,-86.829787 32.452072,-86.829884 32.452497,-86.829965 32.452778,-86.830116 32.453193,-86.830231 32.453464,-86.830358 32.453735,-86.830869 32.454741,-86.831214 32.455406,-86.831382 32.455744,-86.83151 32.456017,-86.83162 32.456299,-86.831765 32.456722,-86.831847 32.457011,-86.831914 32.457304,-86.831934 32.457431)\r\n3599;3501;odd;Netezen Pl;Autauga;AL;36749;LINESTRING(-86.785951 32.586567,-86.785746 32.586439,-86.785552 32.586316,-86.785491 32.58605,-86.785439 32.585675,-86.785401 32.585322,-86.785202 32.585068,-86.784892 32.584641,-86.784436 32.584501,-86.783988 32.584426,-86.783854 32.584408)\r\n3598;3500;even;Netezen Pl;Autauga;AL;36749;LINESTRING(-86.785837 32.5867,-86.785634 32.586579,-86.785334 32.586432,-86.785295 32.58607,-86.785245 32.585695,-86.785183 32.585386,-86.785034 32.585158,-86.784738 32.584801,-86.784376 32.584671,-86.78395 32.58459,-86.783821 32.58457)\r\n898;804;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.490611 32.452723,-86.490268 32.452167,-86.490271 32.452167)\r\n479;435;odd;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.674407 32.393572,-86.67427 32.393799,-86.674146 32.39398,-86.674053 32.394093,-86.673896 32.394255,-86.673735 32.394399)\r\n438;434;even;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.674581 32.393645,-86.674446 32.393879,-86.674316 32.39407,-86.674215 32.394197,-86.674046 32.394369,-86.673874 32.394514)\r\n125;101;odd;Primrose Dr;Autauga;AL;36067;LINESTRING(-86.453508 32.470226,-86.453685 32.470099,-86.454322 32.469753,-86.454547 32.469626,-86.454691 32.469509,-86.454813 32.469279,-86.454808 32.469112,-86.454773 32.468602)\r\n130;100;even;Primrose Dr;Autauga;AL;36067;LINESTRING(-86.453377 32.470103,-86.453559 32.469957,-86.454212 32.469613,-86.454411 32.46949,-86.454505 32.469401,-86.454591 32.469235,-86.454612 32.469112,-86.454579 32.468611)\r\n276;278;even;Teri Ln;Autauga;AL;36066;LINESTRING(-86.428897 32.450783,-86.428983 32.450762,-86.429073 32.450727,-86.429285 32.450587,-86.429419 32.450484,-86.429497 32.450406)\r\n265;273;odd;Teri Ln;Autauga;AL;36066;LINESTRING(-86.428832 32.450628,-86.428903 32.450602,-86.428961 32.450575,-86.429155 32.450455,-86.429275 32.450362,-86.429354 32.450295)\r\n2020;2044;all;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.551975 32.576129,-86.552074 32.577273,-86.552118 32.577849,-86.552133 32.578134,-86.552141 32.578421,-86.552139 32.578707,-86.552129 32.578993,-86.552092 32.57957,-86.552048 32.579998,-86.552017 32.580211,-86.55193 32.580706,-86.551825 32.581198,-86.551675 32.581758,-86.551546 32.582172,-86.551471 32.582385,-86.551402 32.582591,-86.5513 32.582877)\r\n2600;2698;even;Chavers Ln;Autauga;AL;36067;LINESTRING(-86.539783 32.600822,-86.539785 32.600268,-86.539778 32.598959,-86.539758 32.598016,-86.539768 32.597812,-86.539779 32.597754,-86.539799 32.597705,-86.539829 32.597664,-86.539858 32.597648,-86.539846 32.597635)\r\n2601;2699;odd;Chavers Ln;Autauga;AL;36067;LINESTRING(-86.539588 32.600821,-86.539591 32.600268,-86.539582 32.598961,-86.539562 32.598016,-86.539564 32.597798,-86.539575 32.597716,-86.539601 32.597635,-86.539653 32.597548,-86.539748 32.597468,-86.539806 32.597473)\r\n900;998;even;Coburn Ln;Autauga;AL;36051;LINESTRING(-86.587794 32.622787,-86.588024 32.622786,-86.588376 32.622791,-86.589494 32.622791,-86.591194 32.622809,-86.591536 32.622795,-86.591708 32.622782,-86.592213 32.622718,-86.592375 32.622709,-86.593483 32.622711,-86.594499 32.622688,-86.59509 32.622688,-86.595598 32.622695,-86.595847 32.622693,-86.595913 32.622702,-86.595964 32.622716,-86.595996 32.622737,-86.596027 32.622769,-86.596052 32.622824,-86.596066 32.622888,-86.596078 32.623031,-86.596084 32.62426,-86.596075 32.625277,-86.596093 32.625555,-86.596119 32.625757,-86.596149 32.625923,-86.596192 32.626072,-86.596242 32.626207,-86.596316 32.626372,-86.596578 32.626382,-86.597449 32.626372,-86.598401 32.626354)\r\n901;999;odd;Coburn Ln;Autauga;AL;36051;LINESTRING(-86.587793 32.622622,-86.588026 32.62262,-86.588378 32.622625,-86.589496 32.622625,-86.59119 32.622641,-86.591522 32.622627,-86.591684 32.622614,-86.592191 32.622548,-86.592369 32.622539,-86.593481 32.622545,-86.594497 32.622522,-86.595092 32.622522,-86.595598 32.622531,-86.595851 32.622527,-86.595943 32.622524,-86.59605 32.622542,-86.596162 32.622597,-86.596225 32.622693,-86.596254 32.622784,-86.59627 32.622868,-86.596278 32.623027,-86.59628 32.62426,-86.596275 32.625273,-86.596293 32.625541,-86.596317 32.625735,-86.596347 32.625889,-86.596386 32.626026,-86.596434 32.626145,-86.596472 32.62619,-86.596586 32.62621,-86.597445 32.626206,-86.598397 32.626189)\r\n1399;1301;odd;Wood Ln;Autauga;AL;36066;LINESTRING(-86.453632 32.515966,-86.453624 32.5159,-86.453658 32.515616,-86.453692 32.515106,-86.453688 32.515023,-86.453671 32.514944,-86.453648 32.514863,-86.453627 32.514844)\r\n1398;1300;even;Wood Ln;Autauga;AL;36066;LINESTRING(-86.453438 32.515982,-86.45343 32.5159,-86.45346 32.515604,-86.453496 32.515108,-86.453486 32.515045,-86.453473 32.514984,-86.45345 32.514929,-86.453453 32.514918)\r\n699;419;odd;Pickett Mill Rd;Autauga;AL;36003;LINESTRING(-86.642471 32.424311,-86.642484 32.424329,-86.64324 32.425094,-86.64391 32.42576,-86.644717 32.426518,-86.644792 32.426586)\r\n498;448;even;Pickett Mill Rd;Autauga;AL;36003;LINESTRING(-86.642594 32.424183,-86.642634 32.424201,-86.64339 32.424988,-86.644058 32.42565,-86.644861 32.426406,-86.644935 32.426474)\r\n299;273;odd;Meadowview Ln;Autauga;AL;36066;LINESTRING(-86.418863 32.491805,-86.420282 32.491805,-86.42038 32.491821,-86.420451 32.491776,-86.420513 32.491722,-86.420772 32.491164,-86.420835 32.491059,-86.420839 32.49101)\r\n298;200;even;Meadowview Ln;Autauga;AL;36066;LINESTRING(-86.418863 32.491641,-86.420282 32.491641,-86.420314 32.491625,-86.420311 32.491634,-86.420323 32.49162,-86.42059 32.491098,-86.420633 32.491003,-86.420649 32.490975)\r\n638;642;all;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.617299 32.50598,-86.617268 32.506069,-86.617212 32.506198,-86.617141 32.506321,-86.617057 32.506439,-86.616856 32.506669,-86.616486 32.507057)\r\n1300;1368;all;Paula St;Autauga;AL;36067;LINESTRING(-86.458076 32.511177,-86.457866 32.511519,-86.457791 32.511674)\r\n114;198;even;Thames Dr;Autauga;AL;36066;LINESTRING(-86.425568 32.444923,-86.425041 32.445569,-86.4249 32.445768,-86.424837 32.445999,-86.424818 32.446227,-86.424828 32.447316,-86.424821 32.448109,-86.424813 32.448398,-86.424814 32.448463)\r\n113;199;odd;Thames Dr;Autauga;AL;36066;LINESTRING(-86.425729 32.445016,-86.425213 32.445659,-86.425104 32.445836,-86.425043 32.446027,-86.42502 32.446233,-86.425022 32.447316,-86.425017 32.448111,-86.425009 32.4484,-86.425009 32.448462)\r\n524;598;all;McGriff St;Autauga;AL;36067;LINESTRING(-86.468743 32.438733,-86.468745 32.438659)\r\n134;142;even;Guilford Ln;Autauga;AL;36066;LINESTRING(-86.43778 32.470584,-86.437574 32.470578,-86.437399 32.470584,-86.43693 32.470596,-86.436896 32.470642)\r\n135;199;odd;Guilford Ln;Autauga;AL;36066;LINESTRING(-86.437774 32.470748,-86.437576 32.470744,-86.437409 32.47075,-86.437024 32.470788,-86.437023 32.470767)\r\n200;298;even;Chalet Wood Dr;Autauga;AL;36066;LINESTRING(-86.440045 32.477059,-86.440112 32.477235,-86.440348 32.478108,-86.440729 32.479025)\r\n101;199;odd;Chalet Wood Dr;Autauga;AL;36066;LINESTRING(-86.440229 32.477005,-86.440308 32.477187,-86.440544 32.47806,-86.440913 32.478971)\r\n201;205;all;Spruce St;Autauga;AL;36067;LINESTRING(-86.480197 32.454918,-86.480194 32.454709)\r\n2900;2986;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.691417 32.581802,-86.69223 32.582513,-86.694625 32.584588,-86.695816 32.585631,-86.696918 32.586585)\r\n2899;2981;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.691558 32.581688,-86.69237 32.582399,-86.694765 32.584474,-86.695956 32.585517,-86.697058 32.58647)\r\n183;153;odd;Autauga County 20;Autauga;AL;36051;LINESTRING(-86.476235 32.701307,-86.476265 32.701321,-86.477158 32.701576,-86.477569 32.701687,-86.477908 32.701752,-86.478252 32.701788,-86.478597 32.701807,-86.478774 32.701809,-86.479035 32.701796,-86.479377 32.701756,-86.479633 32.701717,-86.480272 32.701593)\r\n198;188;even;Autauga County 20;Autauga;AL;36051;LINESTRING(-86.476311 32.701155,-86.476337 32.701161,-86.47722 32.701418,-86.477621 32.701521,-86.477944 32.701582,-86.478272 32.70162,-86.478605 32.701639,-86.478768 32.701641,-86.479015 32.701626,-86.479347 32.70159,-86.479593 32.701553,-86.480229 32.701432)\r\n3001;2939;all;Hunter Loop Rd;Autauga;AL;36051;LINESTRING(-86.471303 32.693508,-86.471306 32.693414,-86.47129 32.693126,-86.471293 32.692693,-86.471288 32.692607,-86.471239 32.692495,-86.471035 32.692409,-86.470837 32.692398,-86.47065 32.692391,-86.470536 32.692407,-86.470433 32.692464,-86.470372 32.692539,-86.470274 32.692652,-86.470228 32.692691,-86.470174 32.692719,-86.470116 32.692738,-86.470048 32.692748,-86.469886 32.692753,-86.469466 32.692742,-86.469395 32.692732,-86.469328 32.692716,-86.469266 32.69269,-86.469206 32.692658,-86.46915 32.692617,-86.468914 32.692406,-86.468773 32.692309,-86.468342 32.692072,-86.468284 32.692032,-86.468173 32.691938,-86.468073 32.691832,-86.46803 32.691776,-86.467948 32.691653,-86.467873 32.691523,-86.467781 32.691391,-86.467669 32.691271,-86.46738 32.690999,-86.467151 32.690788,-86.467101 32.690736,-86.467058 32.690683,-86.46702 32.690626,-86.466989 32.690567,-86.466906 32.690364,-86.466874 32.690291,-86.466829 32.690217,-86.466773 32.690151,-86.466605 32.689986,-86.46656 32.689933,-86.466521 32.689877,-86.466489 32.689819,-86.466403 32.689617,-86.466366 32.689541,-86.466312 32.689469,-86.466238 32.689408,-86.466155 32.68936,-86.46607 32.689319,-86.465981 32.689296,-86.465894 32.689273,-86.46563 32.689237,-86.46545 32.689232,-86.465018 32.689244,-86.464759 32.689241,-86.464162 32.689255,-86.463313 32.689256,-86.463247 32.68926)\r\n200;298;even;Echlin Blvd;Autauga;AL;36067;LINESTRING(-86.477711 32.434137,-86.477714 32.4339,-86.477711 32.433168,-86.477698 32.432439,-86.477688 32.431356,-86.47769 32.431261,-86.477692 32.431137)\r\n199;101;odd;Echlin Blvd;Autauga;AL;36067;LINESTRING(-86.477516 32.434136,-86.477518 32.4339,-86.477515 32.43317,-86.477502 32.432441,-86.477494 32.431356,-86.477494 32.431259,-86.477498 32.431134)\r\n598;500;even;Wesson Dr;Autauga;AL;36067;LINESTRING(-86.528574 32.465371,-86.528516 32.465615,-86.528514 32.465638)\r\n599;521;odd;Wesson Dr;Autauga;AL;36067;LINESTRING(-86.528765 32.465402,-86.528712 32.465643,-86.528707 32.465661)\r\n300;398;even;Pratt St;Autauga;AL;36067;LINESTRING(-86.464786 32.459149,-86.464876 32.458292,-86.464938 32.457773)\r\n301;399;odd;Pratt St;Autauga;AL;36067;LINESTRING(-86.464592 32.459135,-86.464682 32.458276,-86.464745 32.457756)\r\n672;680;all;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.891203 32.558564,-86.890974 32.559768)\r\n199;159;odd;Northington St;Autauga;AL;36067;LINESTRING(-86.467539 32.465623,-86.467534 32.465556,-86.467524 32.465412,-86.467504 32.46521)\r\n198;142;even;Northington St;Autauga;AL;36067;LINESTRING(-86.467345 32.465637,-86.467336 32.465568,-86.467328 32.465424,-86.46731 32.465224)\r\n2023;2001;odd;Autauga County 38;Autauga;AL;36067;LINESTRING(-86.723449 32.524195,-86.723359 32.524237,-86.723291 32.524265,-86.72314 32.524313,-86.722983 32.524352,-86.722652 32.524416,-86.722491 32.524437,-86.722335 32.524446,-86.722262 32.524438,-86.72219 32.524425,-86.72212 32.524406,-86.722057 32.52438,-86.722002 32.524348,-86.721956 32.52431,-86.721917 32.524264,-86.721803 32.524075,-86.72175 32.524006,-86.721689 32.523939,-86.721615 32.523882,-86.721534 32.523832,-86.721446 32.523795,-86.721359 32.523764,-86.721265 32.523737,-86.721085 32.523715,-86.72082 32.5237,-86.720054 32.523675,-86.719893 32.52366,-86.719739 32.523631,-86.71967 32.523612,-86.719531 32.523552,-86.719472 32.523519,-86.719353 32.52343,-86.719247 32.523331,-86.71899 32.523046,-86.71867 32.522705,-86.718504 32.522534,-86.718374 32.522424,-86.718296 32.522372,-86.718214 32.522333,-86.718131 32.522295,-86.717965 32.522236,-86.717792 32.522193,-86.717536 32.522146,-86.716947 32.522039,-86.716768 32.522018,-86.716673 32.52202,-86.716496 32.522028,-86.716236 32.522054,-86.715893 32.5221,-86.715718 32.52214,-86.71555 32.522194,-86.71539 32.522262,-86.715235 32.522341,-86.715018 32.522469,-86.714818 32.52261,-86.714624 32.522758,-86.714499 32.522871,-86.714445 32.522935,-86.714393 32.523002,-86.714308 32.523137,-86.714212 32.523349,-86.714133 32.523554,-86.714069 32.523677,-86.714033 32.523732,-86.713989 32.523783,-86.713884 32.523883,-86.713829 32.523927,-86.713768 32.523966,-86.713707 32.523996,-86.713645 32.524022,-86.713573 32.524041,-86.713 32.524155,-86.712747 32.524214,-86.712501 32.524296,-86.712268 32.524402,-86.711978 32.524551,-86.711686 32.524681,-86.711539 32.524736,-86.711468 32.524756,-86.711395 32.524771,-86.711322 32.524778,-86.711166 32.524781,-86.711009 32.524769,-86.710515 32.524701,-86.709595 32.52457,-86.709331 32.524552,-86.709154 32.524554,-86.708895 32.524573)\r\n2044;1904;even;Autauga County 38;Autauga;AL;36067;LINESTRING(-86.723551 32.524335,-86.723457 32.524389,-86.723371 32.524423,-86.723204 32.524475,-86.723033 32.524516,-86.722692 32.524582,-86.722513 32.524611,-86.722329 32.524614,-86.722232 32.524608,-86.722138 32.524593,-86.722046 32.524568,-86.721955 32.524534,-86.72187 32.524486,-86.721796 32.524426,-86.721737 32.524356,-86.721625 32.524161,-86.721584 32.524106,-86.721537 32.524059,-86.721485 32.524018,-86.721424 32.523982,-86.72136 32.523951,-86.721289 32.523926,-86.721217 32.523909,-86.721061 32.523885,-86.72081 32.523868,-86.72004 32.523845,-86.719861 32.523832,-86.719681 32.523801,-86.71959 32.52377,-86.719425 32.523704,-86.719344 32.523655,-86.719209 32.523552,-86.719089 32.523441,-86.718834 32.523148,-86.718518 32.522811,-86.718354 32.52265,-86.718238 32.522554,-86.71818 32.522516,-86.718116 32.522481,-86.718045 32.522451,-86.717895 32.522398,-86.71774 32.522357,-86.717494 32.522308,-86.716913 32.522207,-86.716754 32.522192,-86.716677 32.522188,-86.716514 32.522196,-86.716264 32.52222,-86.715937 32.522268,-86.715782 32.522304,-86.715632 32.522352,-86.715486 32.522412,-86.715345 32.522483,-86.71514 32.522605,-86.714948 32.522738,-86.714766 32.52288,-86.714657 32.522981,-86.714611 32.523031,-86.714569 32.523088,-86.714494 32.523209,-86.714402 32.523405,-86.714325 32.523614,-86.714253 32.523755,-86.714205 32.523824,-86.714151 32.523891,-86.71403 32.524005,-86.713959 32.524057,-86.713886 32.524106,-86.713805 32.524154,-86.713715 32.524182,-86.713627 32.524207,-86.71305 32.524319,-86.712813 32.524378,-86.712587 32.524454,-86.712366 32.52455,-86.712076 32.524697,-86.711774 32.524835,-86.711613 32.524896,-86.711524 32.524922,-86.711433 32.524939,-86.711338 32.524952,-86.711158 32.524953,-86.710983 32.524937,-86.710483 32.524863,-86.709571 32.52474,-86.709325 32.524722,-86.709162 32.524724,-86.70891 32.524737)\r\n100;108;all;Thomas Ln;Autauga;AL;36067;LINESTRING(-86.477468 32.455357,-86.477467 32.45525,-86.477474 32.455026,-86.477475 32.454728,-86.477465 32.454663)\r\n2600;2648;even;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.487278 32.644887,-86.487227 32.645437,-86.48715 32.646374,-86.487132 32.646738,-86.487127 32.647171,-86.487135 32.647464,-86.487151 32.647826,-86.487176 32.648117,-86.487199 32.648334,-86.48729 32.648985,-86.487328 32.649202,-86.487441 32.649701,-86.487514 32.649985,-86.487616 32.65034,-86.48787 32.651111,-86.4881 32.65174,-86.488408 32.652642,-86.488535 32.653042,-86.488596 32.653267,-86.488662 32.653551,-86.488718 32.653833,-86.488754 32.654046,-86.488826 32.654547,-86.48888 32.655047,-86.488918 32.655478,-86.488953 32.655991)\r\n2647;2699;odd;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.487473 32.644899,-86.487423 32.645449,-86.487348 32.646384,-86.48733 32.646742,-86.487323 32.647171,-86.487331 32.647458,-86.487349 32.647816,-86.487372 32.648103,-86.487395 32.648316,-86.487486 32.648963,-86.487524 32.649174,-86.487635 32.649667,-86.487706 32.649947,-86.487808 32.650298,-86.48806 32.651065,-86.488288 32.651692,-86.488598 32.652598,-86.488727 32.653002,-86.48879 32.653233,-86.488856 32.653521,-86.488912 32.653807,-86.48895 32.654024,-86.489024 32.654529,-86.489076 32.655033,-86.489114 32.655468,-86.489147 32.655982)\r\n1380;1384;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.509114 32.470523,-86.510266 32.470891)\r\n1383;1385;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.509183 32.470369,-86.510335 32.470737)\r\n1800;1938;even;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.565654 32.433,-86.572053 32.432837)\r\n1901;1931;odd;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.565648 32.432835,-86.572047 32.432672)\r\n100;198;even;E Teri Ct;Autauga;AL;36066;LINESTRING(-86.427349 32.449954,-86.427141 32.450115,-86.427048 32.450268,-86.427027 32.450431,-86.427019 32.450651,-86.427016 32.450708)\r\n101;199;odd;E Teri Ct;Autauga;AL;36066;LINESTRING(-86.427486 32.45007,-86.427321 32.450225,-86.42726 32.450326,-86.427231 32.450447,-86.427217 32.450661,-86.42721 32.45072)\r\n2501;2599;all;Ell Dr;Autauga;AL;36067;LINESTRING(-86.659033 32.570014,-86.65855 32.569868,-86.658295 32.569806,-86.658029 32.569773,-86.657765 32.569759,-86.657577 32.569758,-86.657476 32.569771,-86.657377 32.569792,-86.657278 32.569826,-86.657187 32.569878,-86.657116 32.569942,-86.657061 32.570011,-86.656928 32.5702,-86.656882 32.570249,-86.65683 32.57029,-86.656775 32.570322,-86.656714 32.570347,-86.656645 32.570369,-86.656479 32.570419,-86.656384 32.570456,-86.656295 32.570515,-86.656219 32.570589,-86.656174 32.570672,-86.65615 32.570751,-86.656135 32.570826,-86.656077 32.571203,-86.656051 32.571263,-86.65603 32.571287,-86.656005 32.571302,-86.655954 32.571315,-86.655886 32.571322,-86.655489 32.57131,-86.65498 32.571313,-86.654211 32.571296,-86.653359 32.57131,-86.652848 32.571301,-86.652506 32.571286,-86.651912 32.571237,-86.651056 32.57115,-86.650793 32.571127,-86.650525 32.571128,-86.649841 32.571167,-86.648906 32.571197,-86.647371 32.57122,-86.644855 32.571234,-86.644758 32.571231,-86.644633 32.571233)\r\n400;498;even;Doster St;Autauga;AL;36067;LINESTRING(-86.464853 32.456288,-86.464462 32.456259,-86.46429 32.456245,-86.464266 32.456243)\r\n401;499;odd;Doster St;Autauga;AL;36067;LINESTRING(-86.464837 32.456452,-86.464444 32.456425,-86.46427 32.456409,-86.464244 32.456406)\r\n310;554;even;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.469274 32.453646,-86.469192 32.453526,-86.468394 32.452316,-86.468273 32.452125,-86.468158 32.451931,-86.468015 32.451667,-86.467886 32.4514,-86.467806 32.451198,-86.467648 32.450707,-86.467557 32.450353,-86.467385 32.449565,-86.466981 32.447503)\r\n301;563;odd;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.469106 32.453729,-86.469022 32.453608,-86.468222 32.452396,-86.468099 32.452201,-86.46798 32.452003,-86.467833 32.451735,-86.467698 32.45146,-86.467614 32.451246,-86.467454 32.450747,-86.467363 32.450385,-86.467191 32.449593,-86.466789 32.44753)\r\n1855;1831;odd;Sanford Dr;Autauga;AL;36066;LINESTRING(-86.418972 32.45664,-86.420014 32.456633,-86.420857 32.456613,-86.421185 32.45665,-86.421511 32.45671,-86.421745 32.456775,-86.421971 32.456861,-86.422191 32.456961,-86.422321 32.457028,-86.422378 32.457059)\r\n1858;1830;even;Sanford Dr;Autauga;AL;36066;LINESTRING(-86.41897 32.456476,-86.42001 32.456467,-86.420867 32.456441,-86.421219 32.456482,-86.421565 32.456542,-86.421821 32.456613,-86.422059 32.456711,-86.422291 32.456813,-86.422431 32.456888,-86.422489 32.456924)\r\n1038;1054;all;Loren St;Autauga;AL;36067;LINESTRING(-86.462795 32.426497,-86.462761 32.426209)\r\n453;405;odd;State Rte 14 E;Autauga;AL;36066;LINESTRING(-86.448796 32.469432,-86.449153 32.468849)\r\n498;406;even;State Rte 14 E;Autauga;AL;36066;LINESTRING(-86.448623 32.469357,-86.44898 32.468774)\r\n101;199;all;Autauga County 9;Autauga;AL;36003;LINESTRING(-86.776838 32.456638,-86.776921 32.457477,-86.776943 32.457772,-86.776943 32.457922,-86.776932 32.458073,-86.776915 32.458222,-86.776881 32.45837,-86.776842 32.458517,-86.776765 32.458734,-86.776701 32.458874,-86.776558 32.459141,-86.776514 32.459211)\r\n200;214;even;Radburn Way;Autauga;AL;36066;LINESTRING(-86.442112 32.473268,-86.442343 32.473046,-86.442405 32.472928,-86.442432 32.47277,-86.442435 32.472652,-86.442419 32.472531,-86.442378 32.472372,-86.442273 32.472233,-86.442141 32.472124,-86.44193 32.471957)\r\n201;211;odd;Radburn Way;Autauga;AL;36066;LINESTRING(-86.441962 32.473163,-86.442157 32.472948,-86.442197 32.472874,-86.442226 32.472752,-86.442233 32.47266,-86.442217 32.472563,-86.442174 32.472446,-86.442103 32.472343,-86.442001 32.472244,-86.441796 32.472077)\r\n699;501;odd;Co Rd 135;Autauga;AL;36003;LINESTRING(-86.597087 32.38571,-86.596906 32.385679,-86.595273 32.385689,-86.594799 32.385701,-86.593114 32.385739,-86.591833 32.385769,-86.59132 32.385772,-86.590552 32.385758,-86.589949 32.385757,-86.589077 32.38578,-86.588977 32.38579,-86.588865 32.385812,-86.588742 32.385881,-86.588685 32.386011,-86.588669 32.386092,-86.588665 32.386169,-86.588665 32.386316,-86.588669 32.386433,-86.588702 32.387914,-86.588751 32.389445,-86.588784 32.390175,-86.588818 32.391202,-86.5889 32.392733,-86.588907 32.393021,-86.588897 32.393084,-86.588879 32.393139,-86.588852 32.393184,-86.588814 32.393222,-86.588766 32.393254,-86.588709 32.393273,-86.588646 32.393286,-86.588571 32.393292,-86.588235 32.393288,-86.587292 32.393295,-86.586774 32.393317,-86.585832 32.393376,-86.58532 32.393397,-86.584544 32.393403,-86.584181 32.393409,-86.584062 32.393431,-86.583964 32.393499,-86.583907 32.393578,-86.583864 32.393653,-86.583838 32.393729,-86.583556 32.394569,-86.583376 32.395132,-86.583163 32.395837,-86.582848 32.396897,-86.582792 32.39702,-86.582794 32.397035)\r\n698;500;even;Co Rd 135;Autauga;AL;36067;LINESTRING(-86.597055 32.385873,-86.59689 32.385855,-86.595277 32.385855,-86.594805 32.385865,-86.59312 32.385903,-86.591837 32.385935,-86.591318 32.385938,-86.59055 32.385924,-86.589953 32.385925,-86.589095 32.385952,-86.589021 32.385962,-86.588963 32.385982,-86.588928 32.386009,-86.588889 32.386065,-86.588873 32.386116,-86.588865 32.386177,-86.588861 32.386316,-86.588863 32.386429,-86.588898 32.38791,-86.588947 32.389439,-86.58898 32.390169,-86.589014 32.391196,-86.589096 32.392727,-86.589107 32.393025,-86.589103 32.393112,-86.589081 32.393199,-86.589034 32.393284,-86.588962 32.393358,-86.58887 32.39341,-86.588771 32.393449,-86.588668 32.393458,-86.588575 32.39346,-86.588235 32.393454,-86.587298 32.393463,-86.586786 32.393483,-86.585844 32.393542,-86.585326 32.393565,-86.584548 32.393571,-86.584213 32.393589,-86.584164 32.393605,-86.584126 32.393627,-86.584087 32.393666,-86.584056 32.393719,-86.584028 32.393779,-86.583744 32.394613,-86.583566 32.395174,-86.583353 32.395877,-86.583042 32.396945,-86.582988 32.397102,-86.582956 32.397126)\r\n944;998;even;E Main St;Autauga;AL;36066;LINESTRING(-86.448757 32.460225,-86.447592 32.460239)\r\n945;999;odd;E Main St;Autauga;AL;36066;LINESTRING(-86.44876 32.460389,-86.447595 32.460403)\r\n799;677;all;Wyatt Loop Rd;Autauga;AL;36067;LINESTRING(-86.521593 32.507172,-86.521364 32.507176,-86.52111 32.507171,-86.520939 32.507175,-86.520859 32.507173,-86.520612 32.507162,-86.520529 32.507155,-86.520272 32.507143,-86.519937 32.50714,-86.519002 32.507104,-86.518482 32.507104,-86.518225 32.507108,-86.517801 32.507094,-86.51772 32.507091)\r\n2232;2234;even;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.467933 32.607661,-86.468059 32.607716,-86.468241 32.607798)\r\n2227;2239;odd;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.46802 32.607514,-86.468151 32.607568,-86.468334 32.607653)\r\n200;232;all;E 3rd St;Autauga;AL;36067;LINESTRING(-86.469612 32.460973,-86.469506 32.460963,-86.468603 32.460905)\r\n1900;1998;all;Briarwood St;Autauga;AL;36066;LINESTRING(-86.41738 32.464238,-86.417289 32.46427,-86.416878 32.464509,-86.41679 32.464564)\r\n999;901;all;Avalon Dr;Autauga;AL;36067;LINESTRING(-86.46127 32.486995,-86.461267 32.486735)\r\n700;724;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.55199 32.574081,-86.552363 32.574143,-86.552689 32.574217,-86.553663 32.574485,-86.554154 32.574614,-86.554482 32.574693,-86.555638 32.57494,-86.556204 32.575073,-86.556582 32.57517)\r\n721;751;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.552026 32.573919,-86.552409 32.573977,-86.552747 32.574055,-86.553723 32.574327,-86.55421 32.574454,-86.554534 32.574531,-86.555688 32.57478,-86.55626 32.574913,-86.556639 32.575012)\r\n985;901;all;2nd St;Autauga;AL;36703;LINESTRING(-86.796266 32.348554,-86.796354 32.349699,-86.796388 32.350222)\r\n1026;1056;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.478351 32.436222,-86.478652 32.436091,-86.478746 32.436057,-86.479204 32.435848,-86.481909 32.434658)\r\n700;798;even;Doster Rd;Autauga;AL;36067;LINESTRING(-86.463533 32.446384,-86.463489 32.446255,-86.463406 32.446037,-86.463366 32.445958)\r\n719;723;odd;Doster Rd;Autauga;AL;36067;LINESTRING(-86.463347 32.446431,-86.463301 32.446305,-86.463218 32.446095,-86.463185 32.446019)\r\n699;637;all;Prairieview Dr;Autauga;AL;36067;LINESTRING(-86.477352 32.499675,-86.477567 32.499678,-86.477736 32.49966,-86.477757 32.499587)\r\n815;801;all;Autauga County 153;Autauga;AL;36703;LINESTRING(-86.803193 32.383015,-86.803193 32.383216,-86.803156 32.384237)\r\n201;303;all;Macon Pl;Autauga;AL;36003;LINESTRING(-86.803764 32.482934,-86.803775 32.48297,-86.803881 32.483323,-86.803888 32.483354)\r\n899;833;all;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.599781 32.523121,-86.599789 32.523163,-86.59985 32.523513,-86.599859 32.523587,-86.599938 32.524022,-86.600007 32.524264)\r\n1374;1434;even;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.518053 32.498104,-86.518069 32.498187,-86.518181 32.49854,-86.518301 32.498873,-86.518482 32.499277,-86.518617 32.49955,-86.518765 32.499817,-86.518922 32.500081,-86.519094 32.500336,-86.519823 32.501329,-86.519993 32.501581,-86.520148 32.501838,-86.520289 32.502102,-86.52035 32.502233,-86.520461 32.502507,-86.521315 32.504964,-86.5214 32.505244,-86.521437 32.505384,-86.521503 32.505671,-86.521576 32.506102,-86.52161 32.506387,-86.521639 32.50682,-86.521645 32.506961,-86.521645 32.507128)\r\n1395;1641;odd;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.518243 32.498072,-86.518265 32.498149,-86.518371 32.498494,-86.518491 32.498819,-86.518666 32.499215,-86.518799 32.499482,-86.518943 32.499743,-86.519098 32.500001,-86.519264 32.50025,-86.519993 32.501243,-86.520167 32.501501,-86.520328 32.501764,-86.520471 32.502036,-86.520538 32.502175,-86.520651 32.502457,-86.521505 32.50492,-86.521592 32.505204,-86.521631 32.50535,-86.521699 32.505643,-86.521774 32.506082,-86.521808 32.506373,-86.521837 32.506812,-86.521841 32.506959,-86.521839 32.507129)\r\n2013;2099;all;Regent Rd;Autauga;AL;36066;LINESTRING(-86.414531 32.465903,-86.414676 32.466016,-86.414876 32.466254,-86.414965 32.466392)\r\n322;398;even;N Pickett St;Autauga;AL;36003;LINESTRING(-86.656035 32.437527,-86.656914 32.438672,-86.657314 32.439167)\r\n321;399;odd;N Pickett St;Autauga;AL;36003;LINESTRING(-86.656198 32.437438,-86.657078 32.43858,-86.657474 32.439075)\r\n2000;2056;all;Calvin Loop;Autauga;AL;36006;LINESTRING(-86.715866 32.660089,-86.715844 32.660077)\r\n195;175;all;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.510056 32.421025,-86.509 32.42204,-86.508887 32.422155,-86.508727 32.422335,-86.508531 32.422579,-86.508399 32.422773,-86.508348 32.42286)\r\n1436;1498;even;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.521645 32.507376,-86.521645 32.50801,-86.521653 32.508081,-86.521662 32.50844,-86.521657 32.508612,-86.521687 32.508911,-86.521714 32.509423,-86.521749 32.509718,-86.521825 32.510156,-86.521911 32.510518,-86.522016 32.510874,-86.522137 32.511226,-86.522249 32.511506,-86.522639 32.512318,-86.522757 32.51255)\r\n1643;1651;odd;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.521839 32.507375,-86.521847 32.508002,-86.521853 32.508073,-86.521858 32.50844,-86.521859 32.508606,-86.521885 32.508901,-86.521914 32.509411,-86.521947 32.509698,-86.522021 32.510128,-86.522105 32.510482,-86.522208 32.51083,-86.522327 32.511176,-86.522437 32.511448,-86.522821 32.512254,-86.522936 32.512485)\r\n604;610;even;River Birch Dr;Autauga;AL;36067;LINESTRING(-86.472026 32.570452,-86.471974 32.570473,-86.471865 32.570516,-86.471754 32.570559,-86.471643 32.570602,-86.471528 32.570644,-86.471412 32.570686,-86.471296 32.570725,-86.471196 32.570758)\r\n601;603;odd;River Birch Dr;Autauga;AL;36067;LINESTRING(-86.472112 32.5706,-86.472058 32.570623,-86.471947 32.570666,-86.471836 32.570711,-86.471721 32.570752,-86.471606 32.570796,-86.471488 32.570838,-86.471368 32.570883,-86.471262 32.570913)\r\n300;398;even;S Chestnut St;Autauga;AL;36067;LINESTRING(-86.472885 32.459584,-86.472903 32.459436,-86.472934 32.459072,-86.473001 32.458492,-86.473025 32.458295,-86.472921 32.458233)\r\n301;399;odd;S Chestnut St;Autauga;AL;36067;LINESTRING(-86.472692 32.459568,-86.472707 32.459422,-86.472738 32.459058,-86.472803 32.45848,-86.472795 32.458377,-86.47279 32.458356)\r\n1499;1401;odd;Autauga County 52;Autauga;AL;36006;LINESTRING(-86.678905 32.693132,-86.67867 32.692878,-86.678572 32.692765,-86.678485 32.692651,-86.678413 32.692534,-86.678295 32.69226,-86.678236 32.692186,-86.678107 32.692069,-86.677956 32.691979,-86.677669 32.691815,-86.677396 32.691645,-86.677252 32.691559,-86.677099 32.691477,-86.676927 32.691411,-86.676741 32.691374,-86.676556 32.691368,-86.676206 32.691369,-86.675519 32.691394,-86.675344 32.691404,-86.675171 32.691419,-86.674996 32.691438,-86.674821 32.69147,-86.673509 32.691781,-86.673339 32.691827,-86.673172 32.691883,-86.673009 32.691948,-86.672855 32.692023,-86.672706 32.692102,-86.67235 32.692309,-86.671791 32.692643,-86.67152 32.692818,-86.671124 32.693091,-86.670852 32.693261,-86.670427 32.693498,-86.670264 32.693597)\r\n1498;1400;even;Autauga County 52;Autauga;AL;36006;LINESTRING(-86.678752 32.693234,-86.678512 32.69298,-86.678408 32.692861,-86.678309 32.692739,-86.678223 32.692606,-86.678103 32.692342,-86.67807 32.692296,-86.677965 32.692201,-86.67784 32.692117,-86.677553 32.691953,-86.67728 32.691781,-86.677142 32.691701,-86.677003 32.691633,-86.676859 32.691581,-86.676709 32.69155,-86.67655 32.691538,-86.67621 32.691537,-86.675529 32.69156,-86.675362 32.69157,-86.675195 32.691585,-86.67503 32.691606,-86.674869 32.691634,-86.673567 32.691941,-86.673407 32.691987,-86.673252 32.692039,-86.673101 32.6921,-86.672957 32.692167,-86.672816 32.692242,-86.672462 32.692445,-86.671909 32.692777,-86.671642 32.69295,-86.671246 32.693223,-86.670968 32.693399,-86.670539 32.693636,-86.670377 32.693732)\r\n300;398;even;Autauga County 122;Autauga;AL;36022;LINESTRING(-86.431736 32.58033,-86.431522 32.580328,-86.430657 32.580333,-86.430477 32.580347,-86.430302 32.580381,-86.430214 32.580404,-86.430127 32.580432,-86.429965 32.580501,-86.429886 32.58055,-86.429812 32.580602,-86.429745 32.580661,-86.429684 32.580727,-86.429599 32.580863,-86.429483 32.581055,-86.429359 32.581233)\r\n301;399;odd;Autauga County 122;Autauga;AL;36022;LINESTRING(-86.431734 32.580494,-86.431522 32.580492,-86.430669 32.580505,-86.430509 32.580519,-86.430354 32.580547,-86.43028 32.580566,-86.430211 32.58059,-86.430073 32.580651,-86.43001 32.580686,-86.429952 32.580728,-86.429901 32.580773,-86.429858 32.580823,-86.429775 32.580941,-86.429661 32.581139,-86.429525 32.581319)\r\n799;701;odd;State Rte 111;Autauga;AL;36022;LINESTRING(-86.416203 32.648966,-86.416261 32.648966,-86.420868 32.64896,-86.421778 32.648949)\r\n798;700;even;State Rte 111;Autauga;AL;36022;LINESTRING(-86.416197 32.648801,-86.416257 32.648798,-86.420866 32.648794,-86.421776 32.648784)\r\n199;101;odd;Edgewood Ave;Autauga;AL;36066;LINESTRING(-86.447637 32.47442,-86.447329 32.474419,-86.447187 32.474395,-86.446991 32.474327,-86.446723 32.4742)\r\n198;100;even;Edgewood Ave;Autauga;AL;36066;LINESTRING(-86.447641 32.474584,-86.447313 32.474595,-86.447125 32.474569,-86.446899 32.474481,-86.446626 32.474343)\r\n1440;1498;all;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.494535 32.510331,-86.494861 32.510619,-86.495325 32.51104,-86.495774 32.511471,-86.49621 32.51191,-86.496527 32.512248,-86.496885 32.512647,-86.497131 32.512937,-86.49733 32.513175,-86.497429 32.513303)\r\n1517;1501;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.639277 32.530811,-86.639263 32.530846,-86.638743 32.532683,-86.638536 32.533388,-86.638485 32.533537)\r\n1518;1500;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.639464 32.530856,-86.639455 32.530888,-86.638933 32.532721,-86.63873 32.533434,-86.638671 32.533585)\r\n1598;1590;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.537879 32.430543,-86.537684 32.430542,-86.536739 32.430542,-86.536682 32.430541)\r\n3683;3699;all;Bledsoe Rd;Autauga;AL;36003;LINESTRING(-86.806346 32.479835,-86.806356 32.479831,-86.806686 32.479772,-86.806847 32.479735,-86.807175 32.479646,-86.807667 32.479496,-86.80809 32.479387,-86.808266 32.479352,-86.808451 32.479327,-86.808544 32.479327)\r\n1299;1201;odd;Bell Ln;Autauga;AL;36067;LINESTRING(-86.508184 32.460005,-86.508196 32.460038,-86.50823 32.460145,-86.508303 32.460257,-86.508414 32.460309,-86.508663 32.460342,-86.508916 32.460364,-86.509063 32.460386,-86.50925 32.460425,-86.509396 32.460459,-86.509562 32.460524,-86.509589 32.460545,-86.509621 32.460578,-86.509667 32.460672,-86.509695 32.460756,-86.509684 32.460838,-86.509659 32.460952,-86.509637 32.461029,-86.509618 32.461055,-86.509608 32.461067,-86.509599 32.461079,-86.509544 32.461116,-86.509437 32.461165,-86.509356 32.461247,-86.509254 32.461306,-86.509166 32.461377,-86.509129 32.461457,-86.509146 32.46154,-86.509141 32.461586,-86.509166 32.461647,-86.509186 32.461694,-86.509195 32.461728,-86.509205 32.461764,-86.509213 32.461803,-86.509222 32.461841,-86.509237 32.461917,-86.508996 32.46302)\r\n1298;1200;even;Bell Ln;Autauga;AL;36067;LINESTRING(-86.508362 32.459938,-86.508388 32.459976,-86.508428 32.460069,-86.508469 32.460115,-86.508494 32.460131,-86.508693 32.460172,-86.508944 32.460196,-86.509105 32.46022,-86.509296 32.460263,-86.509462 32.460289,-86.509678 32.460366,-86.509759 32.460421,-86.509805 32.460498,-86.509867 32.460616,-86.509899 32.460746,-86.509884 32.460862,-86.509857 32.46099,-86.509825 32.461075,-86.509816 32.461129,-86.50978 32.461183,-86.509729 32.461219,-86.509652 32.461254,-86.509585 32.461303,-86.509504 32.461387,-86.50939 32.461446,-86.509354 32.461483,-86.509347 32.461489,-86.50934 32.461528,-86.509351 32.461558,-86.509358 32.461601,-86.509372 32.461646,-86.509389 32.461684,-86.509401 32.46173,-86.509409 32.461769,-86.509422 32.461811,-86.509435 32.461921,-86.509187 32.46305)\r\n209;211;all;Autauga County 165;Autauga;AL;36003;LINESTRING(-86.649529 32.43949,-86.649565 32.439586)\r\n300;398;even;Moncrief St;Autauga;AL;36067;LINESTRING(-86.46613 32.459102,-86.466152 32.458985,-86.466244 32.45811,-86.466256 32.457964,-86.466267 32.457866)\r\n329;399;odd;Moncrief St;Autauga;AL;36067;LINESTRING(-86.465937 32.459079,-86.465954 32.458965,-86.466048 32.458096,-86.46606 32.45795,-86.466073 32.457849)\r\n100;154;even;Narrow Rd;Autauga;AL;36749;LINESTRING(-86.861606 32.475841,-86.861656 32.475906,-86.861693 32.47596,-86.861788 32.476147,-86.861834 32.476278,-86.861892 32.476417,-86.861921 32.476494,-86.861989 32.476691,-86.862131 32.477169,-86.862144 32.477228,-86.86213 32.477273,-86.862137 32.477288)\r\n113;155;odd;Narrow Rd;Autauga;AL;36749;LINESTRING(-86.861762 32.475743,-86.861828 32.47581,-86.861877 32.475882,-86.861984 32.476089,-86.862026 32.476228,-86.86208 32.476365,-86.862109 32.476446,-86.862181 32.476647,-86.862325 32.477131,-86.862348 32.477218,-86.862348 32.477321,-86.862314 32.477356)\r\n2006;2000;all;Glenforest Dr;Autauga;AL;36067;LINESTRING(-86.541237 32.575726,-86.541218 32.575558,-86.541211 32.57541,-86.54121 32.575118,-86.541197 32.574827,-86.541187 32.574465,-86.541156 32.573743,-86.541136 32.573027,-86.541102 32.572593,-86.54108 32.57194,-86.541079 32.571718,-86.541098 32.571566)\r\n500;628;even;Autauga County 95;Autauga;AL;36749;LINESTRING(-86.830553 32.521533,-86.830562 32.521574,-86.830626 32.521643,-86.830751 32.521741,-86.830858 32.521844,-86.830901 32.521893,-86.830936 32.521948,-86.830962 32.522004,-86.830979 32.522063,-86.830988 32.522123,-86.830988 32.522186,-86.830958 32.522464,-86.830902 32.522744,-86.830883 32.522802,-86.830586 32.523395,-86.830489 32.523601,-86.830439 32.523749,-86.830427 32.523829,-86.83042 32.523907,-86.830417 32.524055,-86.830425 32.524207,-86.830455 32.524425,-86.830505 32.524715,-86.830689 32.525499,-86.830814 32.525922,-86.830847 32.526059,-86.830868 32.526194,-86.830885 32.526403,-86.830879 32.52654,-86.830861 32.526676,-86.830827 32.526809,-86.830804 32.52687,-86.830777 32.526929,-86.830741 32.52699,-86.830487 32.527367,-86.830412 32.527503,-86.830345 32.527644,-86.830296 32.52779,-86.830257 32.527935,-86.830225 32.528083,-86.830181 32.528514,-86.830168 32.528576,-86.830148 32.528638,-86.830121 32.528698,-86.830052 32.528821,-86.82984 32.529132,-86.829718 32.529329,-86.829473 32.529797,-86.829353 32.530071,-86.829168 32.530523)\r\n601;665;odd;Autauga County 95;Autauga;AL;36749;LINESTRING(-86.830733 32.521471,-86.83075 32.521484,-86.830784 32.521527,-86.830893 32.521625,-86.83102 32.521732,-86.831075 32.521801,-86.831122 32.521874,-86.831158 32.52195,-86.831183 32.522031,-86.831192 32.522113,-86.831192 32.522194,-86.831156 32.522486,-86.831106 32.522786,-86.831071 32.522862,-86.83077 32.523457,-86.830683 32.523655,-86.830641 32.523785,-86.830627 32.523849,-86.83062 32.523915,-86.830615 32.524053,-86.830625 32.524193,-86.830651 32.524403,-86.830701 32.524687,-86.830883 32.525463,-86.831006 32.525884,-86.831045 32.526029,-86.83107 32.526178,-86.831083 32.526399,-86.831083 32.526552,-86.831061 32.526704,-86.831023 32.526853,-86.830996 32.526928,-86.830959 32.526999,-86.830919 32.52707,-86.830667 32.527445,-86.830596 32.527571,-86.830537 32.5277,-86.83049 32.527832,-86.830453 32.527969,-86.830427 32.528105,-86.830383 32.528536,-86.830366 32.528614,-86.83034 32.52869,-86.830309 32.528764,-86.830232 32.528901,-86.830014 32.529214,-86.829898 32.529403,-86.829659 32.529861,-86.829539 32.530127,-86.829352 32.530578)\r\n1821;1899;all;Autauga County 117;Autauga;AL;36067;LINESTRING(-86.652156 32.598867,-86.652166 32.599042,-86.652171 32.599776,-86.652168 32.599958)\r\n543;553;all;Jasmine Trl;Autauga;AL;36066;LINESTRING(-86.427554 32.473592,-86.427566 32.4736,-86.427685 32.473703,-86.427896 32.47385,-86.428126 32.474054,-86.42823 32.474193,-86.428284 32.47432,-86.42831 32.474515)\r\n110;198;even;Thomas Ln;Autauga;AL;36067;LINESTRING(-86.477459 32.454425,-86.477463 32.454364,-86.477457 32.454207,-86.477418 32.454051,-86.477294 32.453841,-86.477175 32.453754)\r\n101;115;odd;Thomas Ln;Autauga;AL;36067;LINESTRING(-86.477265 32.45442,-86.477265 32.454366,-86.477249 32.454233,-86.477214 32.454113,-86.477114 32.453951,-86.477037 32.453871)\r\n1800;1898;all;Barn Cut;Autauga;AL;36066;LINESTRING(-86.412382 32.451256,-86.412453 32.451186)\r\n799;709;odd;Shadow Ln;Autauga;AL;36066;LINESTRING(-86.44768 32.475333,-86.447749 32.475237,-86.447875 32.475027,-86.447889 32.474862,-86.447893 32.474709,-86.447887 32.474634,-86.447883 32.474623)\r\n798;710;even;Shadow Ln;Autauga;AL;36066;LINESTRING(-86.447511 32.475251,-86.447569 32.475159,-86.447661 32.474975,-86.447687 32.47485,-86.447693 32.474713,-86.447685 32.474642,-86.447689 32.474624)\r\n213;159;odd;State Rte 14 E;Autauga;AL;36066;LINESTRING(-86.450264 32.46702,-86.450414 32.466785)\r\n218;146;even;State Rte 14 E;Autauga;AL;36066;LINESTRING(-86.450092 32.466942,-86.450242 32.466707)\r\n1500;1512;even;Trolley Rd;Autauga;AL;36066;LINESTRING(-86.426238 32.485756,-86.42618 32.485784,-86.426085 32.485829,-86.426029 32.485852,-86.425974 32.485881,-86.425915 32.485908,-86.425853 32.485939,-86.425795 32.485974,-86.42574 32.486013,-86.425693 32.486059,-86.42565 32.486106,-86.42561 32.486156,-86.425574 32.48621,-86.425537 32.486262,-86.425502 32.486316,-86.425488 32.486341)\r\n1501;1509;odd;Trolley Rd;Autauga;AL;36066;LINESTRING(-86.426336 32.485898,-86.426278 32.485928,-86.426179 32.485975,-86.426127 32.486,-86.426072 32.486027,-86.426015 32.486054,-86.425965 32.486081,-86.425921 32.486108,-86.425884 32.486137,-86.425847 32.486169,-86.425812 32.486206,-86.425778 32.486248,-86.425742 32.486294,-86.425709 32.486344,-86.425676 32.486394,-86.425661 32.486417)\r\n861;865;all;Autauga County 113;Autauga;AL;36067;LINESTRING(-86.590669 32.522508,-86.590655 32.522632,-86.590546 32.523202,-86.590507 32.523483,-86.590493 32.523835)\r\n799;701;odd;Buena Vis Lp;Autauga;AL;36067;LINESTRING(-86.44936 32.425405,-86.449204 32.425384,-86.449117 32.425389,-86.449029 32.425388,-86.448852 32.425393,-86.448767 32.425394,-86.448684 32.425395,-86.448604 32.425393,-86.448542 32.425394,-86.448452 32.42537,-86.44844 32.425363,-86.448435 32.425355,-86.448409 32.425276,-86.448402 32.42522,-86.448402 32.425152,-86.448402 32.425082,-86.448404 32.425008,-86.448404 32.424861,-86.448404 32.424791,-86.448405 32.424721,-86.448408 32.424655,-86.44842 32.424544,-86.448431 32.424511,-86.448446 32.424495,-86.448457 32.424487,-86.448476 32.424479,-86.448593 32.424467,-86.448672 32.42447,-86.448761 32.424471,-86.448944 32.424471,-86.449032 32.424469,-86.449117 32.424471,-86.449203 32.424475,-86.44937 32.424487,-86.449509 32.424508,-86.449514 32.424503)\r\n1698;1600;even;Buena Vis Lp;Autauga;AL;36067;LINESTRING(-86.449337 32.425568,-86.449192 32.425558,-86.449117 32.425553,-86.449031 32.425554,-86.448858 32.425557,-86.448771 32.42556,-86.448686 32.425561,-86.44861 32.425563,-86.448526 32.42557,-86.448364 32.425546,-86.448282 32.425501,-86.448221 32.425431,-86.448203 32.425294,-86.448206 32.425222,-86.448206 32.42515,-86.448208 32.42508,-86.448208 32.425008,-86.448208 32.424861,-86.44821 32.424789,-86.448211 32.424719,-86.44821 32.424649,-86.448212 32.42452,-86.448227 32.424451,-86.448266 32.424375,-86.448347 32.424317,-86.44844 32.424295,-86.448595 32.424301,-86.448678 32.424304,-86.448763 32.424305,-86.448942 32.424305,-86.449032 32.424305,-86.449123 32.424305,-86.449215 32.424307,-86.449394 32.424317,-86.449555 32.424336,-86.449571 32.424346)\r\n453;499;all;Autauga County 101;Autauga;AL;36003;LINESTRING(-86.787444 32.492692,-86.787445 32.492753,-86.787433 32.493332,-86.78744 32.493535)\r\n1324;1320;all;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.47319 32.49686,-86.47327 32.496795)\r\n589;501;odd;2nd St;Autauga;AL;36703;LINESTRING(-86.791985 32.398992,-86.791988 32.399068,-86.792034 32.399343,-86.792085 32.399554,-86.79213 32.399698,-86.792179 32.39984,-86.792298 32.400124,-86.79245 32.400393,-86.792809 32.400975,-86.793829 32.402588,-86.794161 32.403104,-86.794421 32.403497,-86.794556 32.40367,-86.794613 32.403751,-86.794912 32.404096,-86.795099 32.404334,-86.79518 32.404455,-86.795246 32.404578,-86.795297 32.404706,-86.795331 32.404837,-86.795349 32.40497,-86.795345 32.405102,-86.795325 32.405232,-86.795287 32.405363,-86.795233 32.405493,-86.795168 32.405621,-86.795096 32.405751,-86.794316 32.407052,-86.794246 32.407194,-86.794187 32.407338,-86.794142 32.407487,-86.794112 32.40764,-86.794095 32.407792,-86.794092 32.407945,-86.794099 32.408101,-86.794122 32.40825,-86.794156 32.408402,-86.794203 32.408552,-86.794267 32.408694,-86.794342 32.408835,-86.794428 32.408969,-86.794523 32.4091,-86.794629 32.409221,-86.795185 32.40984)\r\n558;500;even;2nd St;Autauga;AL;36703;LINESTRING(-86.792179 32.39898,-86.792188 32.39905,-86.792232 32.399315,-86.792279 32.399516,-86.79232 32.399652,-86.792369 32.399788,-86.792486 32.400058,-86.792628 32.400319,-86.792981 32.400897,-86.794001 32.40251,-86.794333 32.403024,-86.794593 32.403409,-86.79472 32.403582,-86.794779 32.403655,-86.795074 32.404,-86.795269 32.404244,-86.79536 32.404375,-86.795436 32.404514,-86.795495 32.40466,-86.795533 32.404809,-86.795551 32.404962,-86.795549 32.405114,-86.795529 32.405264,-86.795481 32.405413,-86.795419 32.405555,-86.795348 32.405691,-86.795272 32.405825,-86.794498 32.407124,-86.794434 32.407254,-86.794381 32.407386,-86.79434 32.407523,-86.794312 32.407662,-86.794295 32.407802,-86.794288 32.407943,-86.794299 32.408085,-86.79432 32.408224,-86.794352 32.408364,-86.794397 32.4085,-86.794453 32.40863,-86.794522 32.408759,-86.794602 32.408885,-86.794691 32.409006,-86.794787 32.409121,-86.79534 32.409741)\r\n3001;3099;all;Co Rd 177;Autauga;AL;36051;LINESTRING(-86.450669 32.70437,-86.45056 32.704599,-86.450348 32.705076,-86.450158 32.705481,-86.450122 32.705553,-86.450074 32.705624,-86.450017 32.705692,-86.449952 32.705748,-86.449887 32.705807,-86.449741 32.705895,-86.449461 32.706058,-86.449398 32.706099,-86.449345 32.706142,-86.449293 32.706188,-86.449251 32.706238,-86.449212 32.706292,-86.44918 32.70635,-86.449093 32.706548,-86.448808 32.707302,-86.448718 32.707575,-86.448645 32.707855,-86.44861 32.708008)\r\n500;598;even;Vindale Rd;Autauga;AL;36067;LINESTRING(-86.46365 32.45246,-86.463643 32.45244,-86.463527 32.452193)\r\n501;599;odd;Vindale Rd;Autauga;AL;36067;LINESTRING(-86.463468 32.452516,-86.463459 32.4525,-86.463346 32.452253)\r\n308;398;all;Autauga County 20;Autauga;AL;36051;LINESTRING(-86.460505 32.701479,-86.45813 32.7029,-86.457435 32.703322,-86.457083 32.703522,-86.456798 32.703669,-86.456579 32.703768,-86.456353 32.70386,-86.456121 32.703941,-86.455886 32.704013,-86.455662 32.704072)\r\n601;799;odd;Commerce Ct;Autauga;AL;36066;LINESTRING(-86.418253 32.45849,-86.418611 32.458488,-86.419546 32.458492,-86.419721 32.458485,-86.419986 32.458467,-86.420152 32.458427,-86.420308 32.458406,-86.420469 32.458397,-86.4209 32.458403,-86.421081 32.458394,-86.4211 32.458378)\r\n600;798;even;Commerce Ct;Autauga;AL;36066;LINESTRING(-86.418251 32.458326,-86.418611 32.458322,-86.419542 32.458324,-86.419707 32.458317,-86.419948 32.458293,-86.420108 32.458259,-86.420286 32.45823,-86.420467 32.458231,-86.420892 32.458231,-86.421029 32.458214,-86.421029 32.458224)\r\n707;601;all;Autauga County 20;Autauga;AL;36051;LINESTRING(-86.557196 32.659005,-86.554001 32.659436,-86.553318 32.659529)\r\n138;198;even;Shady Oak Ln;Autauga;AL;36066;LINESTRING(-86.435891 32.464343,-86.435862 32.462125,-86.435865 32.46169,-86.435859 32.461541,-86.435849 32.461377,-86.435771 32.461261,-86.435677 32.461175,-86.435514 32.461023,-86.435487 32.460976,-86.435475 32.460926,-86.435467 32.460581)\r\n139;199;odd;Shady Oak Ln;Autauga;AL;36066;LINESTRING(-86.435696 32.464345,-86.435666 32.462125,-86.435667 32.461694,-86.435659 32.461555,-86.435631 32.461433,-86.435593 32.461363,-86.435529 32.461291,-86.435322 32.461129,-86.435277 32.461022,-86.435269 32.460938,-86.435273 32.460582)\r\n1299;1201;odd;Sadie Cir;Autauga;AL;36066;LINESTRING(-86.415155 32.478574,-86.414995 32.478529,-86.414599 32.478395,-86.414416 32.478345,-86.414193 32.47835,-86.414028 32.478483,-86.413948 32.478633,-86.413889 32.478776,-86.413836 32.478936,-86.413859 32.479129,-86.413949 32.479176,-86.414027 32.479252,-86.414206 32.47931,-86.414688 32.479464,-86.414783 32.479487)\r\n1298;1200;even;Sadie Cir;Autauga;AL;36066;LINESTRING(-86.415099 32.478731,-86.414927 32.478691,-86.414531 32.478557,-86.414394 32.478523,-86.414291 32.478542,-86.414208 32.478599,-86.414136 32.478703,-86.414079 32.47883,-86.414034 32.478944,-86.414073 32.479027,-86.414081 32.479054,-86.414151 32.479094,-86.414282 32.479154,-86.414754 32.479304,-86.414843 32.479331)\r\n1086;1098;even;E Poplar St;Autauga;AL;36066;LINESTRING(-86.422508 32.474939,-86.422275 32.474955,-86.42168 32.474965,-86.421402 32.474981)\r\n1085;1093;odd;E Poplar St;Autauga;AL;36066;LINESTRING(-86.422527 32.475103,-86.422287 32.475125,-86.421688 32.475133,-86.421413 32.475145)\r\n700;798;even;Fountain Ln;Autauga;AL;36067;LINESTRING(-86.487218 32.454698,-86.487142 32.454887,-86.4871 32.455038,-86.487099 32.455194,-86.487113 32.455414,-86.48713 32.455562,-86.487182 32.455852,-86.487199 32.456057,-86.487199 32.456058)\r\n701;799;odd;Fountain Ln;Autauga;AL;36067;LINESTRING(-86.487403 32.454749,-86.487338 32.454931,-86.487308 32.45506,-86.487295 32.455192,-86.487311 32.4554,-86.487328 32.45554,-86.487386 32.455834,-86.487395 32.456059,-86.487393 32.45607)\r\n1334;1406;even;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.504906 32.430868,-86.505779 32.430852,-86.507351 32.430822)\r\n1401;1499;odd;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.504902 32.430703,-86.505775 32.430688,-86.507347 32.430658)\r\n254;398;even;Autauga County 40;Autauga;AL;36022;LINESTRING(-86.440214 32.591294,-86.440132 32.591291,-86.438528 32.591288,-86.43826 32.59128,-86.437387 32.591279,-86.43681 32.591281,-86.435617 32.591272,-86.435361 32.591275,-86.433746 32.591257,-86.432877 32.591227)\r\n301;417;odd;Autauga County 40;Autauga;AL;36022;LINESTRING(-86.440208 32.591458,-86.440128 32.591457,-86.438524 32.591456,-86.438256 32.591448,-86.437387 32.591443,-86.43681 32.591445,-86.435617 32.591436,-86.435361 32.591439,-86.43374 32.591425,-86.432869 32.591392)\r\n599;501;odd;Goose Pointe Ln;Autauga;AL;36067;LINESTRING(-86.542002 32.505514,-86.542001 32.50552,-86.542077 32.505575,-86.542166 32.505704,-86.542183 32.505797,-86.542173 32.506289,-86.5422 32.506555,-86.54224 32.506798,-86.54224 32.507206)\r\n598;500;even;Goose Pointe Ln;Autauga;AL;36067;LINESTRING(-86.542092 32.505369,-86.542109 32.50537,-86.542247 32.505441,-86.542396 32.505652,-86.542377 32.505799,-86.542375 32.506283,-86.5424 32.506535,-86.542446 32.506786,-86.542434 32.507208)\r\n100;198;even;Virginia St;Autauga;AL;36066;LINESTRING(-86.44111 32.460299,-86.441105 32.460171,-86.441121 32.459975,-86.441174 32.459785,-86.441274 32.459602,-86.441359 32.45948,-86.441504 32.459282,-86.441581 32.459056,-86.441608 32.458902,-86.441612 32.458739)\r\n101;199;odd;Virginia St;Autauga;AL;36066;LINESTRING(-86.440915 32.460304,-86.440911 32.460171,-86.440911 32.459951,-86.440972 32.459725,-86.441094 32.459518,-86.441189 32.459394,-86.441306 32.45921,-86.441379 32.459018,-86.441404 32.458884,-86.441418 32.458731)\r\n200;298;even;Malone Ct;Autauga;AL;36067;LINESTRING(-86.486028 32.446612,-86.485783 32.446762,-86.485577 32.446897,-86.485378 32.447038,-86.484709 32.447494,-86.484503 32.447624,-86.484371 32.44771,-86.484264 32.447774)\r\n201;299;odd;Malone Ct;Autauga;AL;36067;LINESTRING(-86.486143 32.446745,-86.485901 32.446896,-86.485701 32.447027,-86.485502 32.447166,-86.484831 32.447628,-86.484623 32.447756,-86.484489 32.447846,-86.484374 32.44791)\r\n1592;1594;even;Rolling Hills Dr;Autauga;AL;36067;LINESTRING(-86.54814 32.447227,-86.549506 32.447223,-86.549846 32.447239,-86.550101 32.447261,-86.550432 32.447317,-86.550664 32.447383,-86.550963 32.44751,-86.551026 32.447539)\r\n1591;1595;odd;Rolling Hills Dr;Autauga;AL;36067;LINESTRING(-86.548139 32.447062,-86.54951 32.447055,-86.54986 32.447071,-86.550129 32.447091,-86.550484 32.447147,-86.550746 32.447221,-86.551057 32.447364,-86.551121 32.447395)\r\n1522;1598;all;Indian Hills Rd;Autauga;AL;36067;LINESTRING(-86.521175 32.46452,-86.521646 32.464655,-86.52199 32.464712,-86.522335 32.464744,-86.522769 32.464767,-86.523971 32.464785,-86.526209 32.464806,-86.526546 32.464817,-86.526969 32.464844,-86.52722 32.464875,-86.527542 32.464934,-86.527693 32.464971,-86.527838 32.465012)\r\n301;399;odd;Kingston Garden Rd;Autauga;AL;36067;LINESTRING(-86.476161 32.489892,-86.476082 32.489899,-86.475976 32.489907,-86.475719 32.489914,-86.475204 32.489945,-86.474863 32.489957,-86.474607 32.489954,-86.474523 32.489966,-86.474416 32.49,-86.474401 32.490124,-86.474397 32.490207,-86.474416 32.490965)\r\n300;398;even;Kingston Garden Rd;Autauga;AL;36067;LINESTRING(-86.476188 32.490055,-86.476106 32.490067,-86.475988 32.490077,-86.475729 32.490082,-86.475214 32.490111,-86.474869 32.490123,-86.474629 32.490132,-86.474591 32.49014,-86.474622 32.490136,-86.474605 32.490148,-86.474597 32.490211,-86.474611 32.490962)\r\n2937;2921;all;Hunter Loop Rd;Autauga;AL;36051;LINESTRING(-86.462955 32.689267,-86.462727 32.689273,-86.462229 32.68926,-86.461805 32.68924,-86.461201 32.689239,-86.460434 32.689288,-86.460178 32.689308,-86.460003 32.689327)\r\n109;199;all;Ivey Ln;Autauga;AL;36066;LINESTRING(-86.433026 32.447171,-86.432999 32.447083,-86.432983 32.447005,-86.432952 32.446781,-86.432957 32.446443)\r\n2542;2598;even;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.489792 32.623819,-86.48997 32.623895,-86.490201 32.623987,-86.490488 32.624123,-86.490886 32.624368,-86.491217 32.624591,-86.491474 32.624776,-86.491916 32.625111,-86.492098 32.625259,-86.492333 32.625464,-86.4925 32.625621,-86.493316 32.626448,-86.493522 32.626671,-86.493722 32.626902,-86.493915 32.627137,-86.494056 32.627315,-86.494515 32.62792,-86.494923 32.628474,-86.495212 32.628837,-86.495725 32.629417,-86.496363 32.630182,-86.496553 32.630419,-86.496685 32.6306,-86.496804 32.630785,-86.496877 32.630911,-86.497298 32.631702,-86.497724 32.632568,-86.4982 32.633418,-86.498233 32.63349,-86.498364 32.633688,-86.498504 32.633881,-86.498669 32.634061,-86.498848 32.634226,-86.499157 32.634471,-86.499386 32.634676,-86.499595 32.634896,-86.499688 32.63501,-86.499819 32.635198,-86.49997 32.635395)\r\n2501;2599;odd;Autauga County 59;Autauga;AL;36022;LINESTRING(-86.489879 32.623672,-86.490056 32.623745,-86.490291 32.623835,-86.4906 32.623975,-86.491008 32.624236,-86.491343 32.624463,-86.491604 32.62465,-86.492052 32.624989,-86.492238 32.625141,-86.492477 32.62535,-86.49265 32.625511,-86.49347 32.626344,-86.49368 32.626571,-86.493882 32.626806,-86.494077 32.627043,-86.49422 32.627225,-86.494681 32.627832,-86.495089 32.628382,-86.495374 32.628739,-86.495885 32.629319,-86.496525 32.630088,-86.496719 32.630327,-86.496859 32.630514,-86.496982 32.630709,-86.497057 32.630841,-86.49748 32.631636,-86.497906 32.6325,-86.498382 32.63335,-86.498417 32.633414,-86.498536 32.633602,-86.498672 32.633783,-86.498825 32.633951,-86.498992 32.634106,-86.499297 32.634351,-86.49954 32.634562,-86.499757 32.634794,-86.499858 32.63492,-86.499989 32.63511,-86.500135 32.635307)\r\n800;998;even;Autauga County 68;Autauga;AL;36051;LINESTRING(-86.428265 32.685348,-86.428182 32.685422,-86.42803 32.685591,-86.427871 32.685753,-86.427759 32.685859,-86.427584 32.686011,-86.427464 32.686107,-86.427338 32.6862,-86.427208 32.686288,-86.427005 32.68641,-86.42672 32.68656,-86.426499 32.686664,-86.426353 32.686725,-86.426047 32.686836,-86.425892 32.686883,-86.425655 32.686942,-86.425413 32.686988,-86.42475 32.687091,-86.418259 32.687927,-86.417869 32.687973)\r\n801;899;odd;Autauga County 68;Autauga;AL;36051;LINESTRING(-86.42841 32.685458,-86.428338 32.68553,-86.428184 32.685695,-86.428021 32.685863,-86.427905 32.685973,-86.427724 32.686131,-86.427598 32.686231,-86.427466 32.68633,-86.427328 32.686422,-86.427117 32.686552,-86.42682 32.686704,-86.426593 32.686812,-86.426439 32.686879,-86.426121 32.686994,-86.425954 32.687045,-86.425705 32.687106,-86.425453 32.687152,-86.424782 32.687255,-86.418287 32.688091,-86.417895 32.688136)\r\n1568;1576;all;Fuller Rd;Autauga;AL;36067;LINESTRING(-86.508697 32.536934,-86.508737 32.537065,-86.508766 32.537198,-86.508789 32.537416,-86.508829 32.537569,-86.508956 32.53784,-86.509005 32.537973,-86.509014 32.537997)\r\n1261;1299;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.440117 32.448779,-86.439773 32.448515,-86.439197 32.44809,-86.438966 32.447925,-86.438419 32.447535,-86.438159 32.447352)\r\n217;201;odd;Deerwood Dr;Autauga;AL;36067;LINESTRING(-86.480133 32.455891,-86.479883 32.455896,-86.479288 32.4559,-86.478868 32.455889,-86.478736 32.45586,-86.478713 32.455843,-86.478667 32.455764,-86.478651 32.455604)\r\n214;200;even;Deerwood Dr;Autauga;AL;36067;LINESTRING(-86.480138 32.456056,-86.479887 32.456062,-86.479288 32.456064,-86.478844 32.456069,-86.478646 32.456036,-86.478531 32.455973,-86.478441 32.455806,-86.478457 32.455604)\r\n110;120;all;Live Oak;Autauga;AL;36067;LINESTRING(-86.474882 32.475977,-86.474907 32.475982,-86.475066 32.476005,-86.475291 32.476075,-86.475582 32.476217,-86.475944 32.476415,-86.476274 32.476575)\r\n400;498;even;Doster Rd;Autauga;AL;36067;LINESTRING(-86.465242 32.45313,-86.465172 32.453001,-86.464838 32.45233,-86.464745 32.452125,-86.464587 32.451816)\r\n501;599;odd;Doster Rd;Autauga;AL;36067;LINESTRING(-86.465065 32.4532,-86.464992 32.453069,-86.464654 32.452392,-86.464561 32.452189,-86.464408 32.451881)\r\n117;115;odd;White Oak Ct;Autauga;AL;36067;LINESTRING(-86.472687 32.473754,-86.472689 32.473749,-86.472661 32.473462,-86.472667 32.473263,-86.472691 32.4732,-86.472719 32.473168,-86.472756 32.473141,-86.472808 32.47312,-86.472882 32.473103)\r\n198;130;even;White Oak Ct;Autauga;AL;36067;LINESTRING(-86.472494 32.47378,-86.472489 32.473769,-86.472461 32.47347,-86.472445 32.473229,-86.472503 32.47312,-86.472549 32.473048,-86.472636 32.472981,-86.47275 32.472942,-86.472857 32.472939)\r\n100;108;all;Ball Enwright Rd;Autauga;AL;36022;LINESTRING(-86.467685 32.607591,-86.467567 32.607735,-86.467462 32.607839,-86.467409 32.607878,-86.467352 32.607906,-86.467293 32.607926,-86.466969 32.607976,-86.466714 32.607996,-86.466538 32.608029,-86.466446 32.608053,-86.466358 32.608084,-86.466277 32.608128,-86.466201 32.608172,-86.466129 32.608222,-86.465945 32.608368,-86.465885 32.608408,-86.465819 32.608444,-86.465753 32.608471,-86.465606 32.608518,-86.465357 32.608572,-86.465267 32.608604,-86.465182 32.608644,-86.465104 32.608692,-86.464918 32.608842,-86.464888 32.608865,-86.464862 32.608876,-86.464798 32.608905,-86.464729 32.608928,-86.464402 32.609003,-86.464235 32.609056,-86.463927 32.609183,-86.463908 32.609192)\r\n1550;1612;even;US Hwy 31;Autauga;AL;36066;LINESTRING(-86.455352 32.531248,-86.455442 32.532114,-86.455497 32.532694,-86.455575 32.533367)\r\n1555;1565;odd;US Hwy 31;Autauga;AL;36067;LINESTRING(-86.455546 32.531234,-86.455636 32.5321,-86.455693 32.53268,-86.455769 32.533351)\r\n1799;1701;odd;Timber Rd;Autauga;AL;36067;LINESTRING(-86.567094 32.539216,-86.56706 32.538662,-86.56702 32.537662,-86.567015 32.537306,-86.567003 32.536947,-86.566999 32.536584,-86.566981 32.536072,-86.566913 32.535269,-86.566903 32.535048,-86.56689 32.534982,-86.566904 32.534878)\r\n1798;1700;even;Timber Rd;Autauga;AL;36067;LINESTRING(-86.566899 32.539225,-86.566864 32.53867,-86.566824 32.537666,-86.566819 32.53731,-86.566807 32.536951,-86.566803 32.536588,-86.566783 32.53608,-86.566717 32.535279,-86.566703 32.535062,-86.566696 32.534982,-86.566711 32.53486)\r\n3799;3701;odd;Autauga County 44;Autauga;AL;36003;LINESTRING(-86.806005 32.496147,-86.805921 32.49614,-86.805571 32.496117,-86.805394 32.496115,-86.805216 32.496116,-86.805038 32.496126,-86.804859 32.496139,-86.804511 32.496185,-86.804334 32.496215,-86.804159 32.49625,-86.803821 32.496339,-86.803493 32.496449,-86.803176 32.496573,-86.802399 32.496898,-86.802087 32.497033,-86.801779 32.497184,-86.80163 32.497269,-86.801334 32.49744,-86.801287 32.497475)\r\n3798;3700;even;Autauga County 44;Autauga;AL;36003;LINESTRING(-86.805988 32.496311,-86.805905 32.496306,-86.805561 32.496285,-86.805394 32.496281,-86.805224 32.496284,-86.805054 32.496292,-86.804883 32.496307,-86.804545 32.496351,-86.804376 32.496379,-86.804213 32.496414,-86.803889 32.496499,-86.803571 32.496605,-86.80326 32.496723,-86.802487 32.497046,-86.802183 32.497181,-86.801885 32.497328,-86.80174 32.497407,-86.801454 32.497576,-86.801409 32.497604)\r\n300;398;even;First St;Autauga;AL;36067;LINESTRING(-86.467369 32.457735,-86.466552 32.457676,-86.466338 32.457662)\r\n301;307;odd;First St;Autauga;AL;36067;LINESTRING(-86.467352 32.457899,-86.466536 32.45784,-86.466323 32.457826)\r\n2798;2700;all;State Rte 14;Autauga;AL;36003;LINESTRING(-86.662521 32.430781,-86.661733 32.430899,-86.658586 32.431368)\r\n700;798;even;Emerald Dr;Autauga;AL;36067;LINESTRING(-86.488397 32.454607,-86.488506 32.454708,-86.488549 32.454757,-86.488627 32.454883,-86.488804 32.455204,-86.488886 32.455405,-86.488976 32.455761,-86.489009 32.455976,-86.489024 32.45619,-86.489026 32.456479,-86.489055 32.45664,-86.489152 32.456793,-86.489318 32.4569,-86.489508 32.456931,-86.489606 32.45693)\r\n701;799;odd;Emerald Dr;Autauga;AL;36067;LINESTRING(-86.488532 32.454489,-86.488676 32.454594,-86.488725 32.454673,-86.488805 32.454809,-86.488992 32.455138,-86.489086 32.455359,-86.489174 32.455733,-86.489211 32.45596,-86.489222 32.456184,-86.489234 32.456461,-86.489265 32.456576,-86.489326 32.456665,-86.489416 32.456724,-86.489538 32.456755,-86.489619 32.456766)\r\n1878;1898;even;Autauga County 107;Autauga;AL;36066;LINESTRING(-86.458961 32.577627,-86.458931 32.577716,-86.458879 32.577847,-86.45854 32.578586,-86.458418 32.578862,-86.458349 32.579077,-86.45831 32.579219,-86.458281 32.579317)\r\n1879;1899;odd;Autauga County 107;Autauga;AL;36066;LINESTRING(-86.45915 32.577665,-86.459127 32.577764,-86.459065 32.577905,-86.458724 32.578644,-86.45861 32.578914,-86.458541 32.579119,-86.458502 32.579259,-86.458469 32.579359)\r\n554;598;all;Booth St;Autauga;AL;36067;LINESTRING(-86.459781 32.466846,-86.459755 32.466847,-86.459339 32.466892,-86.459176 32.466903,-86.458929 32.466899,-86.458677 32.466878,-86.458586 32.466877,-86.458476 32.466879)\r\n208;216;even;Camellia Dr;Autauga;AL;36067;LINESTRING(-86.456417 32.474161,-86.457094 32.474454)\r\n211;217;odd;Camellia Dr;Autauga;AL;36067;LINESTRING(-86.456505 32.474015,-86.457182 32.474308)\r\n1315;1303;all;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.481973 32.498615,-86.481952 32.498581,-86.481775 32.498305,-86.48144 32.497799,-86.481413 32.497758)\r\n1354;1394;even;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.413107 32.51776,-86.413028 32.517858,-86.412993 32.517928,-86.412912 32.518054,-86.412837 32.518187,-86.412731 32.518388,-86.412606 32.518662,-86.412499 32.518943,-86.412412 32.519226,-86.412354 32.519442,-86.412312 32.519657,-86.412278 32.519877,-86.412248 32.52017,-86.412238 32.520537,-86.41224 32.520693)\r\n1377;1399;odd;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.413272 32.517847,-86.41321 32.51794,-86.413173 32.518004,-86.41309 32.518132,-86.413017 32.518257,-86.412915 32.518452,-86.412794 32.518718,-86.412691 32.518991,-86.412604 32.519266,-86.41255 32.519474,-86.412508 32.519681,-86.412476 32.519895,-86.412448 32.52018,-86.412434 32.520539,-86.412434 32.520692)\r\n307;313;all;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.473367 32.539214,-86.473525 32.539295,-86.473685 32.539376)\r\n1600;1698;all;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.457788 32.551492,-86.457792 32.551541,-86.457906 32.552158,-86.457977 32.552446,-86.458109 32.552867,-86.458189 32.553077,-86.458275 32.553283,-86.458449 32.553685)\r\n108;126;even;Laurel Hill Dr;Autauga;AL;36066;LINESTRING(-86.459094 32.558971,-86.458423 32.55897,-86.456713 32.558955,-86.456454 32.558938,-86.456346 32.558932,-86.456228 32.558963,-86.456133 32.559024,-86.456062 32.559095,-86.456009 32.559176,-86.455932 32.559387,-86.455755 32.559865,-86.455693 32.559988,-86.455615 32.560101,-86.455569 32.560151,-86.455459 32.560246,-86.455283 32.560373)\r\n109;127;odd;Laurel Hill Dr;Autauga;AL;36066;LINESTRING(-86.459094 32.559136,-86.458421 32.559134,-86.456705 32.559125,-86.456448 32.559108,-86.456382 32.559116,-86.456328 32.559131,-86.456279 32.559158,-86.456236 32.559199,-86.456203 32.559248,-86.45612 32.559439,-86.455947 32.559923,-86.455881 32.560068,-86.455783 32.560199,-86.455725 32.560265,-86.455597 32.560374,-86.455407 32.5605)\r\n1057;1001;odd;Arrowhead Dr;Autauga;AL;36067;LINESTRING(-86.52592 32.455307,-86.525894 32.455249,-86.525453 32.454362,-86.525408 32.4543)\r\n1060;1000;even;Arrowhead Dr;Autauga;AL;36067;LINESTRING(-86.525739 32.455368,-86.525712 32.455313,-86.525269 32.454436,-86.525237 32.454379)\r\n2200;2276;even;Cyrus St;Autauga;AL;36003;LINESTRING(-86.645701 32.438056,-86.646364 32.43821,-86.646945 32.438348,-86.647281 32.43842,-86.647539 32.438465,-86.647715 32.438485,-86.647892 32.438496,-86.64807 32.4385,-86.648422 32.438489,-86.6486 32.438474,-86.648874 32.438436)\r\n2201;2299;odd;Cyrus St;Autauga;AL;36003;LINESTRING(-86.645752 32.437897,-86.646416 32.43805,-86.646995 32.438186,-86.647325 32.438256,-86.647573 32.438297,-86.647737 32.438317,-86.647904 32.438328,-86.64807 32.438336,-86.648408 32.438321,-86.648574 32.438306,-86.648844 32.438273)\r\n1002;1098;all;Deramus St;Autauga;AL;36066;LINESTRING(-86.444826 32.457584,-86.444832 32.45697)\r\n700;798;even;Percy Dr;Autauga;AL;36022;LINESTRING(-86.434145 32.586339,-86.434145 32.586319,-86.434077 32.586337,-86.434015 32.586338,-86.433948 32.586342,-86.433881 32.586345,-86.433808 32.586343,-86.433651 32.586341,-86.433567 32.586338,-86.433481 32.586338,-86.433392 32.586337,-86.4333 32.586338,-86.433206 32.586338,-86.433109 32.586338,-86.433013 32.586337,-86.432921 32.586339,-86.432832 32.586336,-86.43274 32.586335,-86.43265 32.586336,-86.432562 32.586334,-86.432474 32.586331,-86.432386 32.586333,-86.432303 32.586332,-86.432221 32.586331,-86.432148 32.58633,-86.432082 32.586329,-86.432075 32.586329)\r\n701;799;odd;Percy Dr;Autauga;AL;36022;LINESTRING(-86.434258 32.586473,-86.434227 32.586511,-86.434085 32.586505,-86.434023 32.586506,-86.433956 32.58651,-86.433881 32.586509,-86.433804 32.586509,-86.433647 32.586505,-86.433565 32.586504,-86.433479 32.586504,-86.43339 32.586503,-86.4333 32.586502,-86.433206 32.586502,-86.433109 32.586502,-86.433015 32.586503,-86.432919 32.586505,-86.432826 32.586502,-86.432738 32.586501,-86.43265 32.5865,-86.432558 32.586502,-86.43247 32.586499,-86.432386 32.586497,-86.432301 32.586498,-86.432219 32.586497,-86.432144 32.586498,-86.432074 32.586495,-86.432065 32.586494)\r\n2500;2598;even;Autauga County 46;Autauga;AL;36067;LINESTRING(-86.63716 32.521258,-86.637346 32.521246,-86.637508 32.521243,-86.637669 32.521256,-86.637999 32.521306,-86.639648 32.521647,-86.640057 32.521742,-86.641467 32.522031,-86.641889 32.522096,-86.642065 32.52211,-86.64224 32.522112,-86.642667 32.522098,-86.643177 32.522065,-86.643427 32.522061,-86.643674 32.522077,-86.643835 32.522098,-86.64416 32.522165,-86.644316 32.522208,-86.644472 32.522259,-86.644622 32.522316,-86.644845 32.522416,-86.645212 32.522599,-86.646817 32.523428,-86.647461 32.523777,-86.647659 32.523893)\r\n2559;2599;odd;Autauga County 46;Autauga;AL;36067;LINESTRING(-86.637141 32.521094,-86.637334 32.521074,-86.637516 32.521073,-86.637697 32.521086,-86.638041 32.52114,-86.639698 32.521485,-86.640107 32.52158,-86.641509 32.521865,-86.641917 32.521926,-86.642077 32.52194,-86.642238 32.521946,-86.642655 32.52193,-86.643167 32.521895,-86.643433 32.521893,-86.643698 32.521905,-86.643875 32.521932,-86.644216 32.522001,-86.644384 32.522048,-86.644548 32.522103,-86.64471 32.522162,-86.644943 32.52227,-86.645314 32.522457,-86.646921 32.523288,-86.647573 32.523637,-86.647772 32.523759)\r\n225;299;all;Givens Ct;Autauga;AL;36022;LINESTRING(-86.484136 32.58859,-86.484074 32.588594,-86.484005 32.588592,-86.483947 32.588591)\r\n1006;1000;all;Old Ridge Rd;Autauga;AL;36066;LINESTRING(-86.447246 32.493628,-86.447327 32.493619)\r\n200;298;even;Moncrief St;Autauga;AL;36067;LINESTRING(-86.46597 32.460637,-86.465976 32.460617,-86.46596 32.460576,-86.46597 32.460508,-86.466057 32.45978,-86.466098 32.459343)\r\n201;327;odd;Moncrief St;Autauga;AL;36067;LINESTRING(-86.465811 32.460731,-86.465748 32.460683,-86.465756 32.460568,-86.465772 32.460488,-86.465861 32.459764,-86.465904 32.459329)\r\n2200;2298;all;Jocks;Autauga;AL;36067;LINESTRING(-86.637687 32.485212,-86.637794 32.485188,-86.637849 32.48518,-86.638005 32.485198,-86.638335 32.485276,-86.638542 32.485284,-86.638946 32.485124,-86.639017 32.485106,-86.63928 32.485074,-86.63946 32.485004,-86.639614 32.484901,-86.639834 32.48467,-86.639885 32.48463,-86.64001 32.484563,-86.64022 32.484506,-86.640359 32.484512,-86.640505 32.484542,-86.640819 32.48465,-86.640989 32.484693,-86.641243 32.484747,-86.64142 32.484761,-86.6415 32.484767,-86.641543 32.484784,-86.641568 32.4848,-86.641598 32.48484,-86.641685 32.485123,-86.641738 32.485227,-86.641867 32.485282,-86.641986 32.485279,-86.642086 32.485277,-86.642524 32.48521,-86.642633 32.485178,-86.642723 32.485105,-86.642783 32.485011,-86.642787 32.484905,-86.642701 32.484681,-86.642687 32.484619,-86.642679 32.484554,-86.642678 32.484333,-86.642674 32.484256,-86.642661 32.484174,-86.642591 32.483962,-86.642581 32.4839,-86.642577 32.483838,-86.642586 32.483775,-86.642661 32.48349,-86.642675 32.483409,-86.642674 32.483324,-86.642666 32.483245,-86.642648 32.483166,-86.642557 32.482884,-86.642529 32.482748,-86.642518 32.482687,-86.64252 32.482671)\r\n2401;2499;all;Autauga County 77;Autauga;AL;36006;LINESTRING(-86.701055 32.657807,-86.701145 32.657931,-86.701157 32.657954)\r\n107;101;odd;Laurel Hill Dr;Autauga;AL;36066;LINESTRING(-86.459384 32.559138,-86.460282 32.559151,-86.460458 32.559148,-86.460555 32.559143,-86.460798 32.559092,-86.460851 32.559068)\r\n106;100;even;Laurel Hill Dr;Autauga;AL;36066;LINESTRING(-86.459388 32.558974,-86.46028 32.558985,-86.460444 32.558978,-86.460519 32.558969,-86.460734 32.558924,-86.460778 32.558915)\r\n2146;2198;all;Autauga County 61;Autauga;AL;36067;LINESTRING(-86.496423 32.581327,-86.496385 32.581336,-86.496352 32.581354)\r\n600;698;even;Hatty Ln;Autauga;AL;36067;LINESTRING(-86.462172 32.451367,-86.46216 32.451123,-86.462131 32.450906,-86.462045 32.449888,-86.461979 32.449162,-86.461968 32.449082)\r\n601;699;odd;Hatty Ln;Autauga;AL;36067;LINESTRING(-86.461978 32.451376,-86.46196 32.451137,-86.461933 32.45092,-86.461851 32.4499,-86.461783 32.449178,-86.461774 32.449099)\r\n2298;2310;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.615732 32.521609,-86.616411 32.521712,-86.61739 32.521871)\r\n301;399;odd;Fig Tree Pl;Autauga;AL;36749;LINESTRING(-86.843569 32.503128,-86.843421 32.503226,-86.843288 32.5033,-86.843158 32.503344,-86.843087 32.503358)\r\n300;398;even;Fig Tree Pl;Autauga;AL;36749;LINESTRING(-86.843691 32.503256,-86.843541 32.50336,-86.843396 32.503458,-86.843208 32.503532,-86.843094 32.503523)\r\n2056;2098;even;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.447754 32.545598,-86.447612 32.545719,-86.447489 32.545809,-86.447355 32.545892,-86.447145 32.546001,-86.446921 32.546097,-86.445903 32.54647,-86.444444 32.546977)\r\n2047;2099;odd;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.447896 32.545711,-86.447754 32.545845,-86.447613 32.545943,-86.447469 32.546034,-86.447243 32.546151,-86.447005 32.546251,-86.445979 32.546622,-86.444518 32.547129)\r\n361;355;odd;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.668046 32.399627,-86.667874 32.399875,-86.667784 32.400025,-86.667625 32.400284,-86.667605 32.400328)\r\n336;300;even;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.668214 32.399709,-86.668048 32.399955,-86.667958 32.400101,-86.667805 32.400358,-86.667782 32.400396)\r\n129;105;all;N Memorial Dr;Autauga;AL;36067;LINESTRING(-86.451076 32.466236,-86.451048 32.465606,-86.451052 32.465218)\r\n1199;1101;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.616852 32.571734,-86.616255 32.571978,-86.613945 32.57294,-86.613709 32.57303,-86.613472 32.57311,-86.612984 32.573255,-86.612778 32.57331)\r\n1128;1100;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.616937 32.571882,-86.616341 32.572126,-86.614029 32.573092,-86.613787 32.573184,-86.613542 32.573268,-86.613046 32.573415,-86.612834 32.573467)\r\n1301;1337;all;Indian Hills Rd;Autauga;AL;36067;LINESTRING(-86.496583 32.461049,-86.496824 32.46089,-86.49719 32.460641)\r\n500;598;all;Cottrell;Autauga;AL;36003;LINESTRING(-86.640231 32.413991,-86.640223 32.41399,-86.639178 32.413991,-86.636597 32.414009,-86.63557 32.414019,-86.635167 32.414022)\r\n1670;1550;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.413696 32.428142,-86.414501 32.428925,-86.415302 32.429701,-86.415474 32.429872,-86.415801 32.430184)\r\n1600;1698;even;Twelve Oaks Ln;Autauga;AL;36066;LINESTRING(-86.426172 32.463579,-86.425881 32.463488,-86.425652 32.463389,-86.425513 32.463348,-86.425478 32.463348)\r\n1601;1699;odd;Twelve Oaks Ln;Autauga;AL;36066;LINESTRING(-86.426107 32.463735,-86.425799 32.463648,-86.42557 32.463551,-86.425459 32.463518,-86.425442 32.46351)\r\n399;339;odd;Bedford Ter;Autauga;AL;36066;LINESTRING(-86.443149 32.474101,-86.443156 32.474099,-86.443255 32.473973,-86.443391 32.473708,-86.443441 32.473578,-86.443493 32.47341,-86.443508 32.47311,-86.443501 32.472815,-86.443482 32.4726,-86.443491 32.471806,-86.443481 32.47166,-86.443479 32.471636)\r\n398;342;even;Bedford Ter;Autauga;AL;36066;LINESTRING(-86.442996 32.473999,-86.44299 32.473999,-86.443071 32.473889,-86.443201 32.473646,-86.443247 32.47353,-86.443285 32.473384,-86.44331 32.473108,-86.443301 32.472823,-86.443282 32.472606,-86.443293 32.47181,-86.443283 32.471666,-86.443284 32.471639)\r\n225;201;odd;Teri Ln;Autauga;AL;36066;LINESTRING(-86.427523 32.446521,-86.427684 32.446498,-86.428522 32.446471,-86.42937 32.446462,-86.43022 32.446443,-86.430734 32.446434)\r\n228;200;even;Teri Ln;Autauga;AL;36066;LINESTRING(-86.42748 32.446361,-86.427658 32.44632,-86.428518 32.446305,-86.429366 32.446296,-86.430216 32.446277,-86.43073 32.44627)\r\n2499;2401;odd;Woodview Ct;Autauga;AL;36022;LINESTRING(-86.478587 32.626775,-86.478587 32.626661,-86.478616 32.626081,-86.478631 32.625575,-86.478637 32.625144,-86.478646 32.624979)\r\n2498;2400;even;Woodview Ct;Autauga;AL;36022;LINESTRING(-86.478393 32.626778,-86.478389 32.626659,-86.47842 32.626075,-86.478435 32.625573,-86.478437 32.625138,-86.478451 32.624969)\r\n1800;1898;even;Aspen Way;Autauga;AL;36067;LINESTRING(-86.472724 32.573934,-86.472719 32.573917,-86.472682 32.5738,-86.472671 32.573756,-86.472662 32.573706,-86.472656 32.57365,-86.47265 32.57359,-86.472648 32.573526,-86.472645 32.573458,-86.472644 32.573312,-86.472644 32.573234,-86.472642 32.573154,-86.472641 32.572995,-86.47264 32.572913,-86.472641 32.572831,-86.472642 32.572667,-86.47264 32.5725,-86.47264 32.572417,-86.472639 32.572251,-86.472638 32.572166,-86.47264 32.572081,-86.472635 32.571916,-86.472619 32.571827,-86.472556 32.571672,-86.472531 32.571598,-86.472515 32.57153,-86.472495 32.571383,-86.472491 32.571309,-86.472491 32.571232,-86.472492 32.571075,-86.472493 32.570994,-86.47249 32.570907,-86.472444 32.570751,-86.472408 32.570683,-86.472381 32.570627,-86.472359 32.57058,-86.472346 32.570555)\r\n1801;1899;odd;Aspen Way;Autauga;AL;36067;LINESTRING(-86.472537 32.573979,-86.472531 32.573963,-86.472484 32.573842,-86.472471 32.573784,-86.472464 32.573724,-86.472458 32.573662,-86.472456 32.573598,-86.47245 32.573532,-86.472449 32.57346,-86.472448 32.573312,-86.472448 32.573234,-86.472448 32.573156,-86.472445 32.572995,-86.472446 32.572913,-86.472445 32.572831,-86.472448 32.572667,-86.472446 32.572502,-86.472444 32.572419,-86.472443 32.572251,-86.472444 32.572166,-86.472442 32.572085,-86.472431 32.571934,-86.472417 32.571867,-86.47237 32.571722,-86.472337 32.571644,-86.472309 32.57156,-86.472293 32.571393,-86.472295 32.571309,-86.472295 32.571232,-86.472296 32.571075,-86.472293 32.571002,-86.472282 32.570935,-86.472246 32.570803,-86.472224 32.570745,-86.472195 32.570689,-86.472175 32.57064,-86.472165 32.570617)\r\n808;898;even;Mountain Lake Ct;Autauga;AL;36067;LINESTRING(-86.488507 32.454381,-86.488534 32.454339,-86.488561 32.454263,-86.488573 32.454179,-86.488562 32.45408)\r\n807;899;odd;Mountain Lake Ct;Autauga;AL;36067;LINESTRING(-86.488328 32.454316,-86.48834 32.454281,-86.488359 32.454225,-86.488373 32.454171,-86.488368 32.454092)\r\n1540;1536;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.415996 32.430369,-86.416151 32.430512,-86.416206 32.430553,-86.416298 32.430657,-86.416353 32.430703,-86.4164 32.430763,-86.416445 32.430813,-86.416557 32.430927,-86.417068 32.431416,-86.417671 32.431959,-86.417774 32.43205,-86.417887 32.432146,-86.417932 32.432187)\r\n2899;2801;odd;Redwood Rd;Autauga;AL;36067;LINESTRING(-86.677031 32.621134,-86.676962 32.621137,-86.676911 32.621132,-86.676778 32.621119,-86.676694 32.621105,-86.676603 32.621108,-86.676513 32.621105,-86.67642 32.621098,-86.676326 32.621097,-86.676242 32.621092,-86.676155 32.62108,-86.676073 32.621082,-86.676008 32.62108,-86.675951 32.62107,-86.675876 32.62106,-86.675794 32.621038,-86.675712 32.621015,-86.675627 32.620989,-86.67553 32.62095,-86.675426 32.620946,-86.675336 32.620949,-86.675259 32.620965,-86.67517 32.620977,-86.675068 32.620997,-86.674957 32.621023,-86.674857 32.621061,-86.674776 32.621082,-86.674706 32.621093,-86.67463 32.621102,-86.674552 32.621097,-86.674484 32.621094,-86.674455 32.621096)\r\n2800;2898;even;Redwood Rd;Autauga;AL;36067;LINESTRING(-86.677043 32.621298,-86.676964 32.621303,-86.676893 32.621304,-86.67675 32.621283,-86.676678 32.621279,-86.676601 32.621274,-86.676503 32.621277,-86.676408 32.621268,-86.676316 32.621265,-86.676222 32.621258,-86.676143 32.621254,-86.676067 32.621252,-86.675992 32.621246,-86.675913 32.621246,-86.675824 32.621218,-86.675734 32.6212,-86.675644 32.621173,-86.675557 32.621143,-86.675478 32.621126,-86.675422 32.621112,-86.675366 32.621121,-86.675295 32.621131,-86.67521 32.621143,-86.67512 32.621161,-86.675027 32.621187,-86.674931 32.621221,-86.67483 32.621252,-86.67473 32.621269,-86.67463 32.621266,-86.674548 32.621265,-86.674472 32.621268,-86.674431 32.621259)\r\n2001;2099;all;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.667947 32.628635,-86.667896 32.628693,-86.667687 32.628938,-86.667594 32.62906,-86.667337 32.629439,-86.667183 32.629696,-86.66705 32.629958,-86.666939 32.630227,-86.666841 32.630502,-86.666353 32.632032,-86.666229 32.632449,-86.666155 32.632728,-86.666096 32.63298)\r\n147;135;odd;E Poplar St;Autauga;AL;36066;LINESTRING(-86.437354 32.469656,-86.437005 32.469663,-86.436581 32.469661,-86.436411 32.469663)\r\n144;138;even;E Poplar St;Autauga;AL;36066;LINESTRING(-86.437359 32.46982,-86.437007 32.469829,-86.436581 32.469827,-86.436413 32.469828)\r\n701;773;odd;Stapleford Trce;Autauga;AL;36066;LINESTRING(-86.417618 32.471641,-86.416944 32.471767)\r\n700;798;even;Stapleford Trce;Autauga;AL;36066;LINESTRING(-86.417659 32.471802,-86.416985 32.471928)\r\n1099;1001;all;Lower Kingston Rd;Autauga;AL;36067;LINESTRING(-86.495856 32.4777,-86.495053 32.477254)\r\n100;198;even;Aberdeen Ct;Autauga;AL;36066;LINESTRING(-86.424611 32.476716,-86.424712 32.476727,-86.424893 32.476724,-86.425323 32.476678,-86.425574 32.476648,-86.425654 32.476642,-86.425744 32.476638)\r\n101;199;odd;Aberdeen Ct;Autauga;AL;36066;LINESTRING(-86.42463 32.476552,-86.42472 32.476557,-86.424879 32.476552,-86.425297 32.476512,-86.42555 32.47648,-86.425642 32.476472,-86.42574 32.476473)\r\n1899;1857;odd;Sanford Dr;Autauga;AL;36066;LINESTRING(-86.418277 32.456654,-86.418389 32.456658,-86.418684 32.456647)\r\n1898;1860;even;Sanford Dr;Autauga;AL;36066;LINESTRING(-86.418285 32.45649,-86.418389 32.456494,-86.418675 32.456482)\r\n1110;1198;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.486371 32.432672,-86.486453 32.432633,-86.486603 32.432568,-86.486742 32.432518)\r\n199;117;odd;Overlook Dr;Autauga;AL;36066;LINESTRING(-86.434913 32.449092,-86.435 32.449072,-86.435244 32.44903,-86.435511 32.448962,-86.435751 32.448809,-86.435897 32.448579,-86.435893 32.448328,-86.435846 32.448177,-86.435836 32.44815)\r\n198;116;even;Overlook Dr;Autauga;AL;36066;LINESTRING(-86.434848 32.448937,-86.434944 32.448902,-86.435192 32.448862,-86.435407 32.448794,-86.435575 32.448683,-86.435669 32.448529,-86.435681 32.448346,-86.435654 32.448215,-86.435648 32.448191)\r\n233;101;odd;Autauga County 133;Autauga;AL;36003;LINESTRING(-86.675373 32.414794,-86.675392 32.415477,-86.675401 32.416206,-86.675409 32.419852,-86.67542 32.422768,-86.675444 32.423204,-86.675457 32.423354,-86.675488 32.423505,-86.675542 32.423658,-86.675624 32.423803,-86.675719 32.423938,-86.675822 32.424063,-86.676037 32.424302,-86.676468 32.424765,-86.676773 32.425114,-86.677161 32.425589,-86.677544 32.426072,-86.678107 32.426802,-86.678338 32.427111,-86.678797 32.427706,-86.678881 32.427824,-86.678958 32.427946,-86.67902 32.428073,-86.679065 32.428203,-86.679096 32.42834,-86.679114 32.428477,-86.679123 32.428619,-86.679114 32.429353,-86.679137 32.430674,-86.679202 32.432448,-86.679229 32.433217,-86.679269 32.433938,-86.679287 32.4342,-86.679286 32.434374)\r\n232;100;even;Autauga County 133;Autauga;AL;36003;LINESTRING(-86.675568 32.41479,-86.675588 32.415475,-86.675597 32.416206,-86.675603 32.419852,-86.675618 32.422764,-86.675642 32.423192,-86.675659 32.423332,-86.675688 32.423465,-86.675736 32.423596,-86.675804 32.423723,-86.675889 32.423846,-86.675984 32.423965,-86.676193 32.4242,-86.676626 32.424663,-86.676933 32.425018,-86.677323 32.425495,-86.677708 32.42598,-86.678271 32.426712,-86.678502 32.427021,-86.678963 32.427616,-86.679055 32.42774,-86.67914 32.427872,-86.679216 32.428015,-86.679263 32.428165,-86.679296 32.428314,-86.679316 32.428465,-86.679319 32.428617,-86.679308 32.429353,-86.679333 32.43067,-86.679396 32.432442,-86.679425 32.433211,-86.679465 32.43393,-86.679485 32.434196,-86.67948 32.434377)\r\n146;150;all;E Poplar St;Autauga;AL;36066;LINESTRING(-86.437648 32.469817,-86.438373 32.469817,-86.438564 32.469814)\r\n132;100;all;Autauga County 9;Autauga;AL;36003;LINESTRING(-86.763926 32.449394,-86.76393 32.449609,-86.763955 32.451355)\r\n124;198;even;Goldsmith St;Autauga;AL;36067;LINESTRING(-86.470899 32.474669,-86.471272 32.474698,-86.471388 32.474719,-86.471405 32.474714)\r\n107;199;odd;Goldsmith St;Autauga;AL;36067;LINESTRING(-86.470916 32.474505,-86.471294 32.47453,-86.47145 32.474539,-86.471486 32.474565)\r\n271;201;all;Meadowview Ln;Autauga;AL;36066;LINESTRING(-86.420879 32.490753,-86.420915 32.490129)\r\n1700;1736;all;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.670301 32.609128,-86.671903 32.609535,-86.673067 32.609839,-86.673498 32.609956,-86.673565 32.60997)\r\n1473;1401;odd;Autauga County 112;Autauga;AL;36067;LINESTRING(-86.647636 32.604046,-86.646691 32.604064)\r\n1474;1400;even;Autauga County 112;Autauga;AL;36067;LINESTRING(-86.64764 32.604211,-86.646695 32.604229)\r\n1115;1199;all;Honeysuckle Dr;Autauga;AL;36067;LINESTRING(-86.450219 32.452049,-86.45019 32.452016,-86.450146 32.451963,-86.450076 32.451905,-86.449792 32.451454,-86.449735 32.451382)\r\n398;300;all;Lower Kingston Rd;Autauga;AL;36067;LINESTRING(-86.479936 32.464749,-86.478897 32.463866,-86.478777 32.463749,-86.478727 32.463679,-86.478681 32.463608,-86.478646 32.463532,-86.478608 32.463443,-86.478617 32.463414)\r\n199;169;odd;Laurel Hill Dr;Autauga;AL;36066;LINESTRING(-86.459145 32.5615,-86.459156 32.561159,-86.459156 32.560331,-86.458996 32.560178,-86.458866 32.560162,-86.45877 32.560157,-86.458675 32.560156,-86.458581 32.560162,-86.458488 32.560171,-86.458391 32.560189,-86.458145 32.560281,-86.45799 32.560353,-86.457913 32.560392,-86.457696 32.560521,-86.457614 32.560601)\r\n198;174;even;Laurel Hill Dr;Autauga;AL;36066;LINESTRING(-86.45895 32.561496,-86.45896 32.561159,-86.458924 32.560407,-86.45887 32.560354,-86.458832 32.560336,-86.458758 32.560327,-86.458681 32.560324,-86.458603 32.56033,-86.458526 32.560341,-86.458457 32.560357,-86.458233 32.560435,-86.45809 32.560499,-86.458025 32.560534,-86.457834 32.560655,-86.457754 32.560716)\r\n299;101;odd;W 4th St;Autauga;AL;36067;LINESTRING(-86.47857 32.463197,-86.477875 32.463156,-86.477023 32.463096,-86.476316 32.463051,-86.475675 32.463007,-86.475526 32.462992)\r\n198;100;even;W 4th St;Autauga;AL;36067;LINESTRING(-86.478557 32.463362,-86.477861 32.463322,-86.477007 32.46326,-86.476302 32.463215,-86.475653 32.463175,-86.475499 32.463155)\r\n1749;1797;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.556713 32.490234,-86.559097 32.490192,-86.562276 32.490142,-86.562452 32.490143,-86.562792 32.490137,-86.562849 32.490135)\r\n100;198;even;Ridgewood Rd;Autauga;AL;36067;LINESTRING(-86.461009 32.486673,-86.460974 32.486717,-86.460885 32.486819,-86.460827 32.486876,-86.460708 32.486967,-86.460579 32.487046,-86.460443 32.487105,-86.46022 32.487156,-86.460078 32.487155,-86.459857 32.487099,-86.459715 32.48704,-86.459494 32.486929,-86.459334 32.486856,-86.459074 32.486785,-86.458891 32.48677,-86.458601 32.486766)\r\n101;179;odd;Ridgewood Rd;Autauga;AL;36067;LINESTRING(-86.461174 32.48676,-86.46114 32.486809,-86.461047 32.486929,-86.460969 32.486996,-86.460838 32.487101,-86.460691 32.487196,-86.460523 32.487273,-86.46025 32.48734,-86.460044 32.487341,-86.459775 32.487263,-86.459617 32.487186,-86.459398 32.487077,-86.459254 32.48702,-86.45903 32.486961,-86.458875 32.486942,-86.458595 32.486931)\r\n501;599;all;Kelly Botton Rd;Autauga;AL;36022;LINESTRING(-86.442643 32.641706,-86.442525 32.641763,-86.441904 32.642018,-86.441784 32.642052)\r\n199;107;odd;Rosewood Dr;Autauga;AL;36066;LINESTRING(-86.43663 32.475237,-86.436626 32.475306,-86.436666 32.475368,-86.436672 32.475404,-86.436755 32.475492,-86.436862 32.475535,-86.43699 32.475564,-86.437446 32.475562)\r\n198;110;even;Rosewood Dr;Autauga;AL;36066;LINESTRING(-86.436824 32.475223,-86.43684 32.475264,-86.436848 32.475306,-86.43686 32.475306,-86.436899 32.475342,-86.43694 32.475365,-86.43702 32.475382,-86.43745 32.475398)\r\n2598;2500;all;Houser St;Autauga;AL;36003;LINESTRING(-86.65637 32.433147,-86.656308 32.433185,-86.655372 32.433702,-86.655318 32.433733)\r\n299;201;all;Birdsong St;Autauga;AL;36067;LINESTRING(-86.490342 32.4764,-86.490339 32.476344,-86.490335 32.476298,-86.490338 32.476248,-86.490346 32.47622,-86.490328 32.476243,-86.490346 32.476248,-86.490417 32.47626,-86.490532 32.476264,-86.490598 32.476257,-86.490657 32.476248,-86.490716 32.476239,-86.490803 32.476222,-86.490926 32.476204,-86.490948 32.476144)\r\n198;100;even;Scarlet Oak Ct;Autauga;AL;36066;LINESTRING(-86.429129 32.47229,-86.429063 32.472255,-86.428777 32.472125,-86.428708 32.472091)\r\n101;199;odd;Scarlet Oak Ct;Autauga;AL;36066;LINESTRING(-86.429032 32.472432,-86.428967 32.472403,-86.428671 32.472275,-86.428597 32.472226)\r\n1749;1701;odd;Autauga County 87;Autauga;AL;36022;LINESTRING(-86.439055 32.548299,-86.438945 32.548328,-86.438479 32.548517,-86.438247 32.548623,-86.4381 32.548706,-86.437887 32.548832,-86.437617 32.549019,-86.436808 32.549663,-86.436422 32.549939,-86.436352 32.54998,-86.436287 32.550027,-86.436084 32.550149,-86.435947 32.550217,-86.435802 32.550274,-86.435732 32.550296,-86.435572 32.550328,-86.435411 32.550346,-86.435347 32.550345,-86.435211 32.550334,-86.435198 32.55033,-86.435124 32.550317,-86.434969 32.550281,-86.434816 32.550236,-86.434784 32.550228)\r\n1798;1700;even;Autauga County 87;Autauga;AL;36022;LINESTRING(-86.43912 32.548454,-86.439023 32.548488,-86.438569 32.548667,-86.438351 32.548769,-86.438212 32.548844,-86.438009 32.548968,-86.437749 32.549147,-86.436942 32.549789,-86.436546 32.550077,-86.436474 32.550118,-86.436409 32.550161,-86.436196 32.550293,-86.436043 32.550369,-86.43588 32.550436,-86.43579 32.55046,-86.43561 32.5505,-86.435421 32.550518,-86.435333 32.550517,-86.435187 32.550498,-86.435164 32.550498,-86.435076 32.550483,-86.434909 32.550443,-86.434744 32.550396,-86.434707 32.550379)\r\n199;129;odd;Magnolia Dr;Autauga;AL;36067;LINESTRING(-86.45644 32.471568,-86.456051 32.471389,-86.45522 32.471033)\r\n198;132;even;Magnolia Dr;Autauga;AL;36067;LINESTRING(-86.456347 32.471713,-86.455959 32.471537,-86.455132 32.471179)\r\n100;198;even;Autauga County 15;Autauga;AL;36003;LINESTRING(-86.804532 32.464481,-86.804591 32.467421,-86.80462 32.468662,-86.804648 32.469101,-86.804688 32.46954,-86.804771 32.470121,-86.804823 32.470411,-86.804922 32.470843,-86.805037 32.471274,-86.805167 32.471698,-86.805265 32.471981,-86.805423 32.472399,-86.805603 32.472813,-86.805797 32.473218,-86.805934 32.473487,-86.80608 32.473753,-86.806392 32.474277,-86.806647 32.474665,-86.806827 32.474917,-86.807013 32.475164,-86.807754 32.476131)\r\n101;199;odd;Autauga County 15;Autauga;AL;36003;LINESTRING(-86.804727 32.464478,-86.804785 32.467417,-86.804818 32.468656,-86.804844 32.469091,-86.804886 32.469524,-86.804967 32.470099,-86.805019 32.470383,-86.805116 32.470809,-86.805229 32.471234,-86.805357 32.471654,-86.805453 32.471933,-86.805611 32.472345,-86.805787 32.472753,-86.805979 32.473154,-86.806114 32.473419,-86.806258 32.473681,-86.806568 32.474199,-86.806819 32.474581,-86.806995 32.474829,-86.807177 32.475074,-86.807917 32.476042)\r\n1500;1566;even;Fuller Rd;Autauga;AL;36067;LINESTRING(-86.506779 32.534495,-86.506719 32.534575,-86.506639 32.534707,-86.506577 32.534846,-86.506519 32.534985,-86.50646 32.535129,-86.506428 32.535286,-86.506433 32.535365,-86.506435 32.535512,-86.506451 32.535735,-86.506467 32.535809,-86.506491 32.53603,-86.506531 32.53622,-86.506745 32.536321,-86.506863 32.53631,-86.507287 32.536295,-86.50763 32.536293,-86.507897 32.536274,-86.508064 32.536246,-86.508126 32.536242,-86.508256 32.536273,-86.508368 32.53633,-86.508459 32.536417,-86.508531 32.53653,-86.508592 32.536659,-86.50861 32.536701)\r\n1401;1599;odd;Fuller Rd;Autauga;AL;36067;LINESTRING(-86.506946 32.53458,-86.506895 32.534657,-86.506825 32.534777,-86.506763 32.534904,-86.506707 32.535039,-86.506662 32.535171,-86.506636 32.535302,-86.506627 32.535365,-86.506633 32.535504,-86.506653 32.535715,-86.506665 32.535787,-86.506695 32.536,-86.506735 32.53609,-86.506811 32.536129,-86.506863 32.536146,-86.507281 32.536127,-86.50762 32.536123,-86.507867 32.536102,-86.508036 32.53607,-86.508146 32.536066,-86.508338 32.536101,-86.508514 32.536184,-86.508641 32.536317,-86.508719 32.536462,-86.508778 32.536603,-86.508795 32.536649)\r\n100;198;even;Priscilla Ct;Autauga;AL;36067;LINESTRING(-86.458113 32.450952,-86.458172 32.450927,-86.458278 32.45085)\r\n101;199;odd;Priscilla Ct;Autauga;AL;36067;LINESTRING(-86.458011 32.450812,-86.458054 32.450785,-86.458156 32.450722)\r\n601;699;all;Gillespie St;Autauga;AL;36067;LINESTRING(-86.455509 32.462835,-86.45542 32.462835)\r\n1312;1318;even;Crows Pass;Autauga;AL;36067;LINESTRING(-86.471036 32.504776,-86.47112 32.504775,-86.472393 32.504796,-86.472464 32.504806,-86.472532 32.504824,-86.472598 32.504851,-86.472657 32.504885,-86.472767 32.504974,-86.472812 32.505021,-86.472849 32.505075,-86.472877 32.505134,-86.472895 32.505193,-86.472906 32.505255,-86.472897 32.505972,-86.47289 32.506117,-86.472892 32.506426)\r\n1311;1323;odd;Crows Pass;Autauga;AL;36067;LINESTRING(-86.471031 32.504612,-86.47112 32.504609,-86.472411 32.504622,-86.472512 32.504634,-86.47261 32.50466,-86.472702 32.504699,-86.472787 32.504747,-86.472925 32.504854,-86.472984 32.504925,-86.473033 32.504999,-86.473073 32.505076,-86.473101 32.505161,-86.473108 32.505247,-86.473095 32.505976,-86.473088 32.506121,-86.473086 32.506426)\r\n599;497;odd;Greystone Way;Autauga;AL;36066;LINESTRING(-86.425455 32.460623,-86.425466 32.461155,-86.425461 32.461588,-86.425449 32.4618,-86.425441 32.461889)\r\n598;500;even;Greystone Way;Autauga;AL;36066;LINESTRING(-86.425649 32.46062,-86.425662 32.461155,-86.425659 32.461592,-86.425647 32.461812,-86.425635 32.461904)\r\n740;798;even;Autauga County 68;Autauga;AL;36051;LINESTRING(-86.431593 32.680508,-86.431562 32.680694,-86.431506 32.680974,-86.431434 32.681248,-86.431297 32.681663,-86.431216 32.68186,-86.431053 32.682186,-86.430861 32.682503,-86.43065 32.682808,-86.430464 32.683041,-86.430105 32.683443,-86.429789 32.683777,-86.429454 32.684109,-86.428874 32.684735,-86.428453 32.685163)\r\n741;799;odd;Autauga County 68;Autauga;AL;36051;LINESTRING(-86.431786 32.680531,-86.431756 32.680718,-86.431704 32.681006,-86.431628 32.68129,-86.431489 32.681713,-86.431404 32.68192,-86.431237 32.682258,-86.431037 32.682585,-86.43082 32.682898,-86.430626 32.683139,-86.430261 32.683545,-86.429941 32.683883,-86.429608 32.684215,-86.429028 32.684839,-86.428603 32.685269)\r\n122;118;all;Holly Ln;Autauga;AL;36066;LINESTRING(-86.446315 32.480334,-86.446306 32.480332,-86.446322 32.480271,-86.446304 32.480197,-86.446275 32.480094,-86.446215 32.479919)\r\n833;899;all;Loder St;Autauga;AL;36067;LINESTRING(-86.450933 32.45622,-86.450914 32.456207,-86.450724 32.455997)\r\n201;247;all;Autauga County 4;Autauga;AL;36067;LINESTRING(-86.470034 32.431178,-86.470022 32.431181,-86.469947 32.431186)\r\n699;101;odd;Pinecrest Rd;Autauga;AL;36067;LINESTRING(-86.457538 32.464312,-86.45753 32.464061,-86.457532 32.46333,-86.457529 32.462745,-86.457533 32.462568,-86.457545 32.462561,-86.457585 32.462545,-86.457926 32.462534,-86.458148 32.462533)\r\n698;100;even;Pinecrest Rd;Autauga;AL;36067;LINESTRING(-86.457344 32.464317,-86.457332 32.464063,-86.457338 32.46333,-86.457331 32.462749,-86.457303 32.462498,-86.457425 32.462381,-86.457563 32.462367,-86.457924 32.462368,-86.458148 32.462369)\r\n2129;2137;all;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.662817 32.648889,-86.66236 32.651101,-86.662341 32.651178)\r\n1221;1201;odd;Kenner Creek Cir;Autauga;AL;36022;LINESTRING(-86.4291 32.585895,-86.429075 32.585942,-86.429083 32.586019,-86.42908 32.586094,-86.429079 32.586174,-86.429076 32.586255,-86.429067 32.58642,-86.429062 32.586502,-86.429059 32.586577,-86.429054 32.586656,-86.429052 32.586744,-86.429076 32.586829,-86.429127 32.586911,-86.429214 32.586972,-86.429313 32.587012,-86.429424 32.587028,-86.42953 32.587029,-86.429633 32.587032,-86.429742 32.587035,-86.429853 32.58704,-86.429968 32.587047,-86.43005 32.58705,-86.430086 32.587052,-86.430209 32.587057,-86.430331 32.587061,-86.430451 32.587064,-86.430572 32.587069,-86.430694 32.587072,-86.430814 32.587077,-86.430933 32.587083,-86.431051 32.587086,-86.431163 32.587091,-86.431272 32.587093,-86.431665 32.58711,-86.431773 32.587101,-86.431874 32.587061,-86.431957 32.586988,-86.432001 32.5869,-86.432016 32.586812,-86.432015 32.586759,-86.43202 32.586732,-86.432019 32.586659,-86.432021 32.586596,-86.432024 32.586543,-86.432021 32.586528)\r\n1216;1200;even;Kenner Creek Cir;Autauga;AL;36022;LINESTRING(-86.429288 32.585939,-86.429289 32.585968,-86.429277 32.586023,-86.429276 32.586096,-86.429275 32.586178,-86.429272 32.586261,-86.429263 32.586428,-86.429258 32.58651,-86.429253 32.586585,-86.42925 32.586656,-86.429262 32.586716,-86.429278 32.586761,-86.429301 32.586791,-86.429334 32.586818,-86.429383 32.586838,-86.429452 32.586854,-86.42954 32.586863,-86.429641 32.586866,-86.42975 32.586871,-86.429865 32.586874,-86.42998 32.586881,-86.43006 32.586884,-86.430098 32.586886,-86.430217 32.586891,-86.430337 32.586895,-86.430459 32.586898,-86.43058 32.586903,-86.430702 32.586908,-86.430824 32.586911,-86.430943 32.586917,-86.431059 32.586922,-86.431169 32.586925,-86.431278 32.586927,-86.431653 32.586936,-86.431707 32.586923,-86.431742 32.586907,-86.431771 32.586882,-86.431795 32.586844,-86.431812 32.58679,-86.431821 32.586747,-86.43182 32.586726,-86.431823 32.586659,-86.431821 32.586592,-86.431824 32.586539,-86.431827 32.586528)\r\n1401;1447;all;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.534598 32.498059,-86.534816 32.49826,-86.53722 32.500473)\r\n2500;2598;all;N Washington St;Autauga;AL;36003;LINESTRING(-86.656431 32.433157,-86.656537 32.433298,-86.657064 32.433966,-86.657144 32.434065)\r\n1788;1786;all;Windermere Ave;Autauga;AL;36066;LINESTRING(-86.423485 32.475952,-86.423564 32.475945,-86.423774 32.475928,-86.424031 32.475903,-86.424242 32.475876)\r\n623;817;all;E Main St;Autauga;AL;36067;LINESTRING(-86.45661 32.460227,-86.456021 32.460302,-86.455497 32.460366,-86.454501 32.460443,-86.454239 32.460461,-86.453977 32.460466,-86.453805 32.46046,-86.452611 32.460487)\r\n440;400;even;Harvest Loop;Autauga;AL;36066;LINESTRING(-86.424787 32.451905,-86.424773 32.452315,-86.424746 32.452511,-86.424693 32.452607,-86.424665 32.452629,-86.42455 32.452667,-86.424129 32.452683,-86.424005 32.452721)\r\n453;401;odd;Harvest Loop;Autauga;AL;36066;LINESTRING(-86.424982 32.451909,-86.424971 32.452323,-86.424966 32.452557,-86.424879 32.452719,-86.424787 32.452795,-86.424592 32.452851,-86.424163 32.452863,-86.424058 32.452879)\r\n1191;1199;all;E Main St;Autauga;AL;36066;LINESTRING(-86.442607 32.460466,-86.442207 32.46047)\r\n1364;1360;all;Indian Hills Rd;Autauga;AL;36067;LINESTRING(-86.50787 32.459244,-86.507849 32.459253,-86.507808 32.459262,-86.507595 32.459317,-86.507342 32.459374,-86.507087 32.459429,-86.506885 32.459461)\r\n2698;2600;all;Pine St;Autauga;AL;36003;LINESTRING(-86.659818 32.435167,-86.659799 32.43523,-86.659659 32.435334,-86.659515 32.435416,-86.65879 32.435823)\r\n647;501;odd;Lower Kingston Rd;Autauga;AL;36067;LINESTRING(-86.485562 32.469309,-86.485488 32.469243,-86.485431 32.469195,-86.485333 32.469112,-86.482281 32.4665)\r\n654;500;even;Lower Kingston Rd;Autauga;AL;36067;LINESTRING(-86.485421 32.469423,-86.485348 32.469359,-86.485293 32.469311,-86.485195 32.469228,-86.482142 32.466616)\r\n199;101;all;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.62822 32.423416,-86.628222 32.423424,-86.628268 32.423479,-86.628311 32.423542,-86.628389 32.423667,-86.628456 32.423797,-86.628511 32.423929,-86.628555 32.424065,-86.628572 32.424133,-86.628597 32.424274,-86.628613 32.424415,-86.628617 32.424456,-86.628634 32.424856,-86.628679 32.425888,-86.628691 32.426164,-86.628905 32.431401,-86.628918 32.431983,-86.628907 32.432271,-86.628875 32.432556,-86.628809 32.432911,-86.628756 32.433124,-86.628287 32.434676,-86.627594 32.43692,-86.627567 32.437013)\r\n2582;2400;all;Autauga County 66;Autauga;AL;36067;LINESTRING(-86.539252 32.603413,-86.539203 32.604167,-86.539186 32.60432,-86.539162 32.604403,-86.53912 32.604484,-86.539064 32.604557,-86.538991 32.604618,-86.538912 32.604668,-86.538477 32.604877,-86.538191 32.605026,-86.537413 32.605462,-86.53665 32.605921,-86.536013 32.606298,-86.535858 32.606376,-86.53577 32.606406,-86.535603 32.606452,-86.535431 32.606483,-86.535176 32.606515,-86.534916 32.60653,-86.534654 32.606533,-86.534478 32.60653,-86.534214 32.606506,-86.533533 32.606408,-86.533275 32.606361,-86.532536 32.60617,-86.532213 32.606098,-86.531972 32.606058,-86.531646 32.606022,-86.531486 32.606012,-86.531328 32.606019,-86.531167 32.606036,-86.531094 32.60605,-86.531019 32.606069,-86.53102 32.606066)\r\n101;199;odd;Holly Ct;Autauga;AL;36066;LINESTRING(-86.447703 32.481539,-86.447713 32.481515,-86.44771 32.481365,-86.447695 32.481147,-86.447687 32.480777,-86.447662 32.480604,-86.447583 32.480508,-86.447474 32.48044,-86.447335 32.480438,-86.447216 32.48047,-86.447077 32.480544)\r\n100;118;even;Holly Ct;Autauga;AL;36066;LINESTRING(-86.447511 32.481518,-86.447507 32.481503,-86.44751 32.481369,-86.447499 32.481153,-86.447481 32.480795,-86.447448 32.480678,-86.447421 32.480642,-86.447392 32.480628,-86.447359 32.480616,-86.447302 32.480634,-86.447172 32.480688)\r\n1438;1462;even;Autauga County 43;Autauga;AL;36067;LINESTRING(-86.614452 32.593832,-86.614496 32.59401,-86.61478 32.595284,-86.614803 32.595422,-86.614833 32.595708,-86.61484 32.595849,-86.61484 32.595989,-86.61482 32.596272,-86.614784 32.596554,-86.614699 32.597059)\r\n1453;1495;odd;Autauga County 43;Autauga;AL;36067;LINESTRING(-86.614642 32.593798,-86.614688 32.593978,-86.614978 32.595256,-86.615001 32.595404,-86.615031 32.595696,-86.61504 32.595845,-86.61504 32.595995,-86.615018 32.596286,-86.614982 32.596576,-86.614892 32.597083)\r\n274;292;all;Golson Rd;Autauga;AL;36067;LINESTRING(-86.553485 32.449326,-86.553513 32.449476,-86.553522 32.449687,-86.553523 32.449899,-86.553505 32.450191,-86.553462 32.450484,-86.55338 32.450994,-86.553286 32.451501,-86.55324 32.451718,-86.5532 32.451866,-86.553155 32.452011,-86.55311 32.452099)\r\n3698;3600;even;Andrews Dr;Autauga;AL;36003;LINESTRING(-86.803486 32.482756,-86.803456 32.482757,-86.803279 32.482752,-86.802406 32.482758,-86.801544 32.482771,-86.799907 32.4828)\r\n3699;3601;odd;Andrews Dr;Autauga;AL;36003;LINESTRING(-86.803496 32.482921,-86.803458 32.482923,-86.803277 32.482918,-86.802408 32.482924,-86.801548 32.482935,-86.799911 32.482965)\r\n392;498;even;Autauga County 9;Autauga;AL;36003;LINESTRING(-86.772397 32.491841,-86.772394 32.491841,-86.772322 32.49197,-86.772242 32.492095,-86.772155 32.492215,-86.77206 32.492332,-86.77196 32.492445,-86.771854 32.492553,-86.771741 32.492656,-86.771618 32.492754,-86.77149 32.492843,-86.771355 32.492927,-86.771069 32.493086,-86.770924 32.493163,-86.770179 32.493532,-86.769739 32.493761,-86.76945 32.49392,-86.769169 32.494091,-86.769031 32.494183,-86.768898 32.494281,-86.768647 32.494487,-86.768527 32.494597,-86.768414 32.494711,-86.768304 32.494827,-86.768199 32.494947,-86.7681 32.495072,-86.767922 32.495329,-86.767758 32.495591,-86.767536 32.495989,-86.767266 32.496448,-86.766683 32.49746,-86.766651 32.497513)\r\n401;499;odd;Autauga County 9;Autauga;AL;36003;LINESTRING(-86.772576 32.491905,-86.772576 32.491909,-86.7725 32.492046,-86.772416 32.492179,-86.772321 32.492307,-86.77222 32.49243,-86.772116 32.492549,-86.772006 32.492665,-86.771883 32.492776,-86.77175 32.49288,-86.771614 32.492977,-86.771469 32.493067,-86.771175 32.493226,-86.771026 32.493305,-86.770281 32.493674,-86.769845 32.493901,-86.769562 32.494058,-86.769289 32.494225,-86.769159 32.494313,-86.769034 32.494405,-86.768789 32.494605,-86.768675 32.494709,-86.768566 32.494817,-86.768462 32.494929,-86.768363 32.495043,-86.76827 32.495162,-86.768096 32.495411,-86.767936 32.495667,-86.767712 32.496061,-86.767442 32.49652,-86.766859 32.497536,-86.766823 32.497591)\r\n397;331;odd;2nd St;Autauga;AL;36703;LINESTRING(-86.800191 32.420674,-86.800697 32.421832,-86.800929 32.422382,-86.801027 32.422654,-86.801105 32.422935,-86.801136 32.423074,-86.801162 32.423216,-86.801181 32.423358,-86.801205 32.423646,-86.801219 32.424079,-86.801221 32.424517,-86.801239 32.424957,-86.801257 32.425108,-86.801306 32.425404,-86.801343 32.425551,-86.801385 32.425698,-86.801434 32.425842,-86.801491 32.425983,-86.801609 32.426258,-86.802743 32.428706,-86.802808 32.428843)\r\n400;330;even;2nd St;Autauga;AL;36703;LINESTRING(-86.800373 32.420617,-86.800881 32.421776,-86.801117 32.422328,-86.801221 32.42261,-86.801299 32.422901,-86.801332 32.423046,-86.801358 32.423194,-86.801379 32.423342,-86.801403 32.423638,-86.801415 32.424077,-86.801419 32.424513,-86.801439 32.424945,-86.801455 32.425088,-86.801504 32.425374,-86.801537 32.425515,-86.801577 32.425654,-86.801624 32.425792,-86.801677 32.425929,-86.801793 32.4262,-86.802925 32.428646,-86.802988 32.428782)\r\n1299;1201;all;Broadway Ln;Autauga;AL;36067;LINESTRING(-86.537288 32.467853,-86.537144 32.467943,-86.537028 32.468132,-86.536895 32.468302,-86.536794 32.468404,-86.53662 32.468539,-86.536416 32.468661,-86.536207 32.468805,-86.536084 32.468926,-86.536035 32.468989)\r\n264;266;even;Teri Ln;Autauga;AL;36066;LINESTRING(-86.427558 32.45007,-86.427741 32.450222,-86.427799 32.450264)\r\n261;263;odd;Teri Ln;Autauga;AL;36066;LINESTRING(-86.427693 32.449952,-86.427877 32.4501,-86.427929 32.450141)\r\n298;224;all;Lewis St;Autauga;AL;36067;LINESTRING(-86.468512 32.434477,-86.468549 32.434482,-86.468622 32.434503,-86.468756 32.434529,-86.468912 32.434546,-86.469249 32.434548,-86.469679 32.434551,-86.469934 32.43454,-86.470278 32.434528,-86.470305 32.434528)\r\n968;908;all;Lower Kingston Rd;Autauga;AL;36067;LINESTRING(-86.492269 32.47549,-86.491628 32.474916)\r\n1720;1790;even;Autauga County 163;Autauga;AL;36051;LINESTRING(-86.587548 32.622828,-86.587543 32.623162,-86.587574 32.623591,-86.587596 32.624088,-86.587599 32.62552,-86.587572 32.626957,-86.587558 32.628396,-86.587554 32.62957,-86.587576 32.629858)\r\n1747;1799;odd;Autauga County 163;Autauga;AL;36051;LINESTRING(-86.587743 32.622829,-86.587743 32.623158,-86.58777 32.623583,-86.587794 32.624084,-86.587795 32.625522,-86.587768 32.626959,-86.587754 32.628396,-86.587754 32.629566,-86.587771 32.629848)\r\n599;501;odd;Autauga County 70;Autauga;AL;36022;LINESTRING(-86.430985 32.654066,-86.431189 32.654027,-86.431427 32.653991,-86.432261 32.65385,-86.432929 32.653751,-86.433431 32.653694,-86.433767 32.653669,-86.434188 32.653652,-86.43444 32.653653,-86.434602 32.653662,-86.434763 32.653681,-86.435003 32.653726,-86.435161 32.653766,-86.435316 32.653814,-86.435465 32.65387,-86.435761 32.654001,-86.435903 32.654073,-86.436079 32.654172,-86.436596 32.654488,-86.436743 32.654568,-86.43697 32.654676,-86.438553 32.655382,-86.438788 32.65548,-86.438955 32.655536,-86.439206 32.655601,-86.439867 32.655755,-86.440359 32.655883,-86.440618 32.655929,-86.440877 32.65596,-86.441139 32.655981,-86.441911 32.656,-86.442679 32.656006,-86.443357 32.656028,-86.444042 32.656056,-86.444127 32.656054)\r\n598;500;even;Autauga County 70;Autauga;AL;36022;LINESTRING(-86.430939 32.653906,-86.431149 32.653861,-86.431391 32.653827,-86.432225 32.653686,-86.432899 32.653585,-86.433409 32.653526,-86.433753 32.653501,-86.434184 32.653484,-86.434446 32.653483,-86.434622 32.653492,-86.434799 32.653511,-86.435055 32.653562,-86.435225 32.653606,-86.43539 32.653658,-86.435553 32.653716,-86.435861 32.653853,-86.436011 32.653931,-86.436193 32.654034,-86.436708 32.654348,-86.436847 32.654424,-86.437066 32.65453,-86.438643 32.655232,-86.43887 32.655324,-86.439023 32.655376,-86.439262 32.655441,-86.439921 32.655595,-86.440409 32.655717,-86.440654 32.655761,-86.440901 32.655792,-86.441151 32.655811,-86.441915 32.655834,-86.442683 32.65584,-86.443365 32.655862,-86.444046 32.655888,-86.444125 32.655889)\r\n101;199;all;Fleetwood Rd;Autauga;AL;36067;LINESTRING(-86.461759 32.449052,-86.46166 32.449054)\r\n2398;2224;even;Luzella Rd;Autauga;AL;36067;LINESTRING(-86.624452 32.496421,-86.624504 32.4965,-86.624664 32.496754,-86.62477 32.496946,-86.624822 32.497072,-86.624854 32.497202,-86.624867 32.497337,-86.624859 32.498354,-86.624858 32.498794,-86.624876 32.499022,-86.6249 32.499106,-86.624972 32.499246,-86.625313 32.49992,-86.625399 32.500058,-86.625513 32.500183,-86.625636 32.500284,-86.625708 32.500379,-86.625746 32.500484,-86.625727 32.500607,-86.62569 32.50074,-86.625635 32.500862,-86.625558 32.500974,-86.625404 32.501137,-86.625228 32.5013,-86.625066 32.50149,-86.625026 32.501575,-86.624995 32.501736,-86.625011 32.502031,-86.624996 32.502163,-86.624966 32.502294,-86.624918 32.50242,-86.624851 32.502526,-86.624755 32.502609,-86.624545 32.502719,-86.624398 32.502813,-86.624275 32.502929,-86.624167 32.503039,-86.623932 32.503246,-86.623299 32.503823,-86.623179 32.503895,-86.623037 32.503953,-86.622884 32.503998,-86.622534 32.504068,-86.622361 32.504161,-86.622285 32.504233,-86.622198 32.504376,-86.622085 32.50458,-86.621994 32.504784,-86.621924 32.504884,-86.621831 32.504943,-86.621783 32.504967,-86.621694 32.504983,-86.621358 32.505031,-86.621178 32.505066,-86.62101 32.505129,-86.620852 32.505197,-86.620706 32.50527,-86.620646 32.505298,-86.620478 32.505377,-86.620308 32.505452)\r\n2399;2301;odd;Luzella Rd;Autauga;AL;36067;LINESTRING(-86.624621 32.496339,-86.624678 32.49642,-86.62484 32.496678,-86.624958 32.496878,-86.625024 32.497024,-86.62506 32.49718,-86.625065 32.497333,-86.625053 32.498354,-86.62506 32.498786,-86.625082 32.498994,-86.625098 32.499052,-86.625154 32.499182,-86.625495 32.499844,-86.625575 32.499962,-86.625669 32.500065,-86.625794 32.500166,-86.625922 32.500301,-86.625946 32.500476,-86.625931 32.500637,-86.625888 32.50079,-86.625825 32.500938,-86.62573 32.501076,-86.625554 32.501245,-86.62539 32.501408,-86.625256 32.501576,-86.625232 32.501625,-86.625203 32.501748,-86.625209 32.502033,-86.625202 32.502187,-86.625164 32.502338,-86.62511 32.502482,-86.625037 32.502636,-86.624887 32.502755,-86.624661 32.502863,-86.624538 32.502945,-86.624425 32.503041,-86.624317 32.503153,-86.624076 32.50336,-86.623441 32.503959,-86.623283 32.504051,-86.623113 32.504113,-86.622942 32.504162,-86.622622 32.50424,-86.622501 32.504303,-86.622461 32.504339,-86.622378 32.504454,-86.622271 32.504646,-86.62218 32.50485,-86.622106 32.505012,-86.621929 32.505115,-86.621835 32.505125,-86.621738 32.505153,-86.621398 32.505199,-86.621244 32.505234,-86.621094 32.505283,-86.620946 32.505345,-86.620802 32.505412,-86.620742 32.505442,-86.620572 32.505525,-86.620396 32.505599)\r\n703;701;odd;Ethan Ln;Autauga;AL;36067;LINESTRING(-86.548539 32.551349,-86.548264 32.551372,-86.54743 32.551486,-86.546652 32.551555,-86.546145 32.551651)\r\n702;700;even;Ethan Ln;Autauga;AL;36067;LINESTRING(-86.548561 32.551512,-86.54829 32.55154,-86.547456 32.551654,-86.546684 32.551725,-86.546186 32.551812)\r\n3101;3199;all;Watchman Cir W;Autauga;AL;36091;LINESTRING(-86.557384 32.703897,-86.557389 32.703852,-86.557381 32.703784,-86.557375 32.703722,-86.55738 32.703661,-86.55739 32.703602,-86.55741 32.703546,-86.557437 32.703494,-86.557473 32.703446,-86.55752 32.703404,-86.557573 32.703367,-86.557631 32.70334,-86.557694 32.703321,-86.55776 32.70331,-86.557829 32.703308,-86.557899 32.703316,-86.55797 32.703331,-86.558039 32.703352,-86.558351 32.703477,-86.558441 32.703503,-86.558534 32.703525,-86.558715 32.703541,-86.558894 32.703541,-86.559149 32.70353,-86.559229 32.703531,-86.559476 32.703549,-86.559543 32.703563,-86.559601 32.703584,-86.559658 32.703612,-86.560043 32.70389,-86.560264 32.704007,-86.560392 32.704091,-86.560444 32.704132,-86.560485 32.704179,-86.560518 32.70423,-86.560544 32.704288,-86.56056 32.704348,-86.560581 32.704483,-86.560582 32.704543,-86.560568 32.704595,-86.560544 32.704643,-86.560508 32.704683,-86.560465 32.704716,-86.560408 32.704743,-86.560341 32.704764,-86.560267 32.704778,-86.560189 32.704787,-86.560015 32.704793,-86.559905 32.704804,-86.55979 32.704855,-86.559717 32.704947,-86.559688 32.705042,-86.559689 32.705127,-86.559719 32.705927,-86.559725 32.706363,-86.559719 32.706554,-86.559719 32.706565)\r\n133;101;odd;E Poplar St;Autauga;AL;36066;LINESTRING(-86.436118 32.469668,-86.435956 32.469671,-86.434988 32.469675,-86.434975 32.469903,-86.434967 32.469989)\r\n136;100;even;E Poplar St;Autauga;AL;36066;LINESTRING(-86.436123 32.469833,-86.43596 32.469837,-86.435178 32.469843,-86.435173 32.469915,-86.435161 32.470005)\r\n204;298;all;Fisk St;Autauga;AL;36067;LINESTRING(-86.472131 32.479264,-86.471773 32.479262,-86.471675 32.479258,-86.471589 32.479234)\r\n631;601;odd;Mimosa Rd;Autauga;AL;36067;LINESTRING(-86.458281 32.478184,-86.458192 32.477957,-86.457993 32.477478,-86.457914 32.47727,-86.457827 32.477067,-86.457785 32.476935,-86.457737 32.476658,-86.457728 32.47658)\r\n630;600;even;Mimosa Rd;Autauga;AL;36067;LINESTRING(-86.458096 32.478236,-86.458006 32.478011,-86.457807 32.477532,-86.457726 32.477324,-86.457637 32.477121,-86.457581 32.476973,-86.457535 32.476674,-86.457534 32.476588)\r\n100;144;even;Lawrence St;Autauga;AL;36067;LINESTRING(-86.454338 32.452415,-86.454336 32.452119,-86.454322 32.451899,-86.454327 32.451759,-86.454345 32.451622,-86.454414 32.451343,-86.45462 32.450708,-86.45464 32.450634,-86.454655 32.450552,-86.454654 32.450467,-86.454641 32.450384,-86.454611 32.450299,-86.454516 32.450154,-86.454377 32.450031,-86.454206 32.449955,-86.45414 32.449939)\r\n101;143;odd;Lawrence St;Autauga;AL;36067;LINESTRING(-86.454143 32.452416,-86.454138 32.452125,-86.454124 32.451903,-86.454125 32.451749,-86.454141 32.451594,-86.45422 32.451303,-86.454426 32.450668,-86.454442 32.450604,-86.454451 32.450542,-86.454448 32.450481,-86.454437 32.450424,-86.454415 32.450371,-86.454342 32.450264,-86.454243 32.450179,-86.454116 32.450113,-86.454069 32.450092)\r\n249;299;all;Magnolia Dr;Autauga;AL;36067;LINESTRING(-86.462411 32.47417,-86.462553 32.474225,-86.462897 32.47437)\r\n182;100;all;Barkley;Autauga;AL;36066;LINESTRING(-86.424437 32.495249,-86.424446 32.495255,-86.424513 32.495347,-86.424571 32.495414)\r\n203;201;all;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.510525 32.420575,-86.510462 32.420635)\r\n1687;1699;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.412042 32.426601,-86.411942 32.42644,-86.411916 32.426382,-86.411879 32.426327,-86.411812 32.426135,-86.411782 32.426075,-86.411704 32.425847)\r\n2106;2112;all;Autauga County 66;Autauga;AL;36022;LINESTRING(-86.472082 32.582426,-86.472188 32.582648,-86.47292 32.584094,-86.473113 32.584499,-86.473225 32.584698,-86.473309 32.584832,-86.473407 32.584957,-86.473514 32.585077,-86.47369 32.585242,-86.473985 32.585504,-86.474236 32.585707,-86.474432 32.585852,-86.474702 32.586034,-86.474917 32.586162,-86.475138 32.586275,-86.475369 32.586381,-86.47553 32.586445,-86.475775 32.586522,-86.475946 32.586564,-86.476204 32.586609,-86.476463 32.586638,-86.47664 32.586647,-86.476901 32.586645,-86.477159 32.586633,-86.477668 32.586602,-86.477832 32.586601,-86.477994 32.586611,-86.478154 32.586632,-86.478397 32.586678,-86.478555 32.586716,-86.478708 32.586765,-86.478779 32.586792,-86.478843 32.586826,-86.478899 32.586862,-86.478949 32.586906,-86.478992 32.586955,-86.479025 32.587009,-86.479052 32.587068,-86.479071 32.587131,-86.479096 32.587269,-86.479141 32.587703,-86.479216 32.58871,-86.479236 32.588802)\r\n499;401;all;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.475936 32.46716,-86.47592 32.467131)\r\n199;111;all;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.709954 32.436152,-86.709955 32.436222,-86.709949 32.436574,-86.70995 32.437156,-86.709993 32.438035,-86.709986 32.439025,-86.709986 32.439055,-86.709949 32.440888,-86.709947 32.44126,-86.709949 32.441718,-86.709954 32.441793)\r\n172;198;even;Lawrence St;Autauga;AL;36067;LINESTRING(-86.452926 32.451482,-86.452948 32.452011,-86.452956 32.452089,-86.45297 32.452169,-86.452996 32.45225,-86.45304 32.452329,-86.453094 32.452405,-86.45316 32.452445)\r\n173;199;odd;Lawrence St;Autauga;AL;36067;LINESTRING(-86.45312 32.451475,-86.453148 32.451999,-86.453156 32.452067,-86.45317 32.452131,-86.453192 32.452188,-86.453222 32.452243,-86.45326 32.452287,-86.453293 32.452326)\r\n112;198;even;Andiron Ct;Autauga;AL;36067;LINESTRING(-86.480595 32.447328,-86.48074 32.447206,-86.480827 32.447173,-86.481073 32.44717,-86.481379 32.447179)\r\n111;199;odd;Andiron Ct;Autauga;AL;36067;LINESTRING(-86.480446 32.447223,-86.480602 32.447042,-86.480791 32.446987,-86.481079 32.447006,-86.481386 32.447015)\r\n800;1844;even;Rodock Rd;Autauga;AL;36067;LINESTRING(-86.564916 32.550261,-86.564099 32.550248,-86.563321 32.550228,-86.563144 32.550229,-86.562964 32.550236,-86.56278 32.550259,-86.562604 32.550309,-86.562439 32.55038,-86.562286 32.55046,-86.56165 32.550841,-86.561369 32.551012,-86.56123 32.551101,-86.561087 32.551197,-86.560959 32.551318,-86.560861 32.551464,-86.560826 32.551629,-86.560827 32.551786,-86.560842 32.551933,-86.560833 32.552058,-86.560789 32.552162,-86.560761 32.552209)\r\n901;1691;odd;Rodock Rd;Autauga;AL;36067;LINESTRING(-86.564912 32.550425,-86.564095 32.550414,-86.563319 32.550394,-86.563152 32.550397,-86.562986 32.550408,-86.56283 32.550431,-86.562682 32.550471,-86.562537 32.55053,-86.562396 32.550602,-86.561764 32.550975,-86.561487 32.551146,-86.561354 32.551233,-86.561233 32.551323,-86.561135 32.551422,-86.561069 32.551528,-86.561036 32.551649,-86.561029 32.55178,-86.561044 32.551925,-86.561053 32.552088,-86.560989 32.55226,-86.560906 32.552319)\r\n269;213;all;Gardner Rd;Autauga;AL;36067;LINESTRING(-86.472089 32.489191,-86.471429 32.489214,-86.470923 32.48923)\r\n2;98;even;Stricklands Trailer Park;Autauga;AL;36003;LINESTRING(-86.636602 32.403818,-86.636616 32.403699)\r\n1;999;odd;Stricklands Trailer Park;Autauga;AL;36003;LINESTRING(-86.636408 32.403802,-86.636422 32.403683)\r\n801;899;odd;Johnson St;Autauga;AL;36067;LINESTRING(-86.467245 32.436581,-86.46723 32.436753,-86.46721 32.436899,-86.467214 32.43691)\r\n898;892;even;Johnson St;Autauga;AL;36067;LINESTRING(-86.467439 32.436591,-86.467428 32.436767,-86.467412 32.436911,-86.467408 32.436915)\r\n121;101;odd;Guilford Ln;Autauga;AL;36066;LINESTRING(-86.439185 32.470744,-86.441147 32.470724,-86.441743 32.470726,-86.442142 32.470721)\r\n126;100;even;Guilford Ln;Autauga;AL;36066;LINESTRING(-86.439183 32.470579,-86.441147 32.470558,-86.441743 32.47056,-86.44214 32.470556)\r\n1100;1164;all;Autauga County 24;Autauga;AL;36006;LINESTRING(-86.626067 32.684898,-86.627038 32.685195,-86.628256 32.68556,-86.63402 32.687304,-86.635515 32.687753,-86.63712 32.688245,-86.638419 32.68864,-86.638752 32.688728,-86.639088 32.688804,-86.639431 32.68886,-86.639772 32.688909,-86.640118 32.688937,-86.640291 32.688944,-86.640636 32.688945,-86.641657 32.688925,-86.642128 32.688918)\r\n971;999;all;Autauga County 1;Autauga;AL;36749;LINESTRING(-86.805968 32.565152,-86.805806 32.566219,-86.805751 32.566509,-86.805719 32.566654,-86.805641 32.566941,-86.805568 32.567152,-86.805458 32.567433,-86.805327 32.567706,-86.80522 32.567906,-86.805103 32.568104,-86.804928 32.568359,-86.803377 32.570536,-86.802935 32.571148,-86.802497 32.57177,-86.802065 32.572373)\r\n1500;1598;even;Autauga County 7;Autauga;AL;36758;LINESTRING(-86.85703 32.609707,-86.857825 32.610084,-86.858211 32.610249,-86.858445 32.610342,-86.858684 32.610427,-86.858927 32.610499,-86.859094 32.610541,-86.859506 32.610619,-86.859665 32.610658,-86.859818 32.610708,-86.859964 32.610767,-86.860106 32.610838,-86.860239 32.610917,-86.860363 32.611005,-86.860479 32.611104,-86.860642 32.611265,-86.860898 32.611552,-86.861038 32.611728,-86.861212 32.611974,-86.861327 32.612161,-86.86143 32.612351,-86.861745 32.613019,-86.86196 32.613415,-86.862257 32.613927,-86.862357 32.614121,-86.862444 32.614318,-86.86254 32.614589,-86.862694 32.615147,-86.862808 32.615638,-86.862861 32.615917,-86.862887 32.616122,-86.862896 32.616257,-86.862892 32.616396,-86.86288 32.616534,-86.862834 32.616824,-86.862832 32.616976,-86.862844 32.617129,-86.86288 32.61728,-86.86293 32.617426,-86.863018 32.617635,-86.863157 32.617904,-86.863339 32.618233,-86.863503 32.618493,-86.863638 32.618682,-86.863782 32.618866,-86.863942 32.619043,-86.864216 32.619326,-86.86444 32.619544,-86.864664 32.61976,-86.864769 32.619868,-86.864971 32.620098,-86.865111 32.620274,-86.865191 32.620388)\r\n1501;1599;odd;Autauga County 7;Autauga;AL;36758;LINESTRING(-86.857125 32.609563,-86.857919 32.609936,-86.858297 32.610099,-86.858525 32.610188,-86.858756 32.610269,-86.858989 32.610339,-86.859144 32.610377,-86.859556 32.610455,-86.859729 32.610496,-86.859898 32.61055,-86.86006 32.610617,-86.860216 32.610694,-86.860363 32.610781,-86.860501 32.610879,-86.860629 32.610988,-86.860798 32.611159,-86.86106 32.611454,-86.861208 32.611638,-86.861386 32.611892,-86.861507 32.612087,-86.861614 32.612285,-86.861929 32.612953,-86.862138 32.613343,-86.862437 32.613857,-86.862543 32.614057,-86.862636 32.614264,-86.862734 32.614545,-86.862888 32.615113,-86.863004 32.615608,-86.863059 32.615895,-86.863089 32.616108,-86.863094 32.616255,-86.863092 32.616404,-86.863078 32.616552,-86.863038 32.616836,-86.863032 32.616972,-86.863048 32.617105,-86.863078 32.61724,-86.863122 32.617374,-86.863206 32.617573,-86.863337 32.617836,-86.863517 32.618157,-86.863677 32.618409,-86.863806 32.618592,-86.863946 32.618768,-86.864098 32.618939,-86.864368 32.619218,-86.864588 32.619436,-86.864814 32.619652,-86.864927 32.619764,-86.865133 32.620002,-86.865283 32.620184,-86.865361 32.620307)\r\n395;335;all;N Autauga St;Autauga;AL;36003;LINESTRING(-86.657533 32.436593,-86.657618 32.436713,-86.657864 32.437107,-86.658152 32.43764,-86.658306 32.437898,-86.658564 32.438273,-86.658657 32.438403,-86.658667 32.438463)\r\n1600;1612;all;Autauga County 87;Autauga;AL;36022;LINESTRING(-86.431086 32.538848,-86.431122 32.538915)\r\n1616;1620;even;Guiding Way;Autauga;AL;36067;LINESTRING(-86.507028 32.460672,-86.507046 32.460676,-86.507121 32.460647)\r\n1615;1619;odd;Guiding Way;Autauga;AL;36067;LINESTRING(-86.506917 32.460537,-86.50695 32.460504,-86.507069 32.460488)\r\n1710;1798;even;E Bank Rd;Autauga;AL;36067;LINESTRING(-86.507312 32.54449,-86.507344 32.544644,-86.507518 32.544938,-86.507757 32.545115,-86.507849 32.545319,-86.507951 32.54583,-86.507971 32.546349,-86.50788 32.546543,-86.507661 32.546787,-86.507633 32.547064,-86.507868 32.547671,-86.507988 32.548523)\r\n1711;1799;odd;E Bank Rd;Autauga;AL;36067;LINESTRING(-86.507502 32.544453,-86.507548 32.54458,-86.507698 32.544818,-86.507957 32.545001,-86.508053 32.545277,-86.508157 32.545812,-86.508191 32.546381,-86.50807 32.546631,-86.507881 32.546861,-86.507841 32.547046,-86.508078 32.547633,-86.508182 32.548505)\r\n698;600;all;Autauga County 32;Autauga;AL;36051;LINESTRING(-86.576012 32.687689,-86.575909 32.687638,-86.575768 32.68758,-86.575538 32.687518,-86.575377 32.68749,-86.575025 32.687453,-86.574909 32.687439,-86.574843 32.687383)\r\n206;298;even;Kay St;Autauga;AL;36066;LINESTRING(-86.440811 32.468569,-86.439803 32.468586,-86.438698 32.468608,-86.438692 32.468609)\r\n209;299;odd;Kay St;Autauga;AL;36066;LINESTRING(-86.440815 32.468734,-86.439807 32.46875,-86.438706 32.468774,-86.438703 32.468773)\r\n405;401;odd;Mockingbird St;Autauga;AL;36067;LINESTRING(-86.488066 32.478781,-86.48787 32.478787,-86.487751 32.478789,-86.487413 32.478774,-86.487033 32.478738,-86.486961 32.478739)\r\n408;400;even;Mockingbird St;Autauga;AL;36067;LINESTRING(-86.488073 32.478945,-86.487876 32.478951,-86.487749 32.478955,-86.487397 32.478944,-86.487019 32.478908,-86.486955 32.478903)\r\n400;448;even;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.728561 32.488648,-86.728736 32.488823,-86.730297 32.490476,-86.73052 32.490698,-86.730638 32.490808,-86.73076 32.490915,-86.730885 32.491019,-86.731146 32.491213,-86.731417 32.491398,-86.731559 32.491486,-86.731849 32.491648,-86.732148 32.491803,-86.73246 32.49194,-86.732781 32.492056,-86.733108 32.492165,-86.734728 32.49264,-86.735161 32.492764,-86.735188 32.492771)\r\n401;467;odd;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.728709 32.488541,-86.728888 32.488717,-86.730449 32.49037,-86.730668 32.490588,-86.730782 32.490694,-86.7309 32.490797,-86.731021 32.490895,-86.731274 32.491085,-86.731539 32.491264,-86.731673 32.491348,-86.731955 32.491506,-86.732246 32.491655,-86.732546 32.491786,-86.732857 32.491902,-86.733176 32.492007,-86.734792 32.492484,-86.735227 32.492606,-86.735256 32.492617)\r\n699;415;odd;Autauga County 20;Autauga;AL;36051;LINESTRING(-86.418721 32.691008,-86.418983 32.691726,-86.419277 32.692553,-86.419771 32.693861,-86.419883 32.694137,-86.419976 32.694343,-86.420115 32.694613,-86.420326 32.694935,-86.420429 32.69506,-86.420775 32.695395,-86.421181 32.695674,-86.421337 32.695757,-86.42157 32.695858,-86.423639 32.696726,-86.425174 32.697363,-86.425562 32.697519,-86.42604 32.697685,-86.42645 32.697799,-86.426944 32.697918,-86.427277 32.697988,-86.427614 32.69805,-86.429541 32.698357,-86.430128 32.698447,-86.430547 32.698517,-86.431293 32.698657,-86.431618 32.698733,-86.43202 32.698845,-86.432257 32.69892,-86.43257 32.699027,-86.432956 32.699176,-86.43349 32.699403,-86.43446 32.699845,-86.434675 32.699952,-86.435023 32.700146,-86.435352 32.700364,-86.435779 32.700703,-86.435951 32.700858,-86.436338 32.701234,-86.436675 32.701597,-86.437019 32.701969,-86.437925 32.702928,-86.43824 32.70327,-86.438403 32.703441,-86.43852 32.703552,-86.438765 32.703762,-86.439046 32.70394,-86.43942 32.704132,-86.439746 32.70425,-86.440168 32.704344,-86.4406 32.704396,-86.440946 32.704408,-86.441803 32.704395,-86.444872 32.704317,-86.445044 32.704319,-86.447091 32.704277,-86.447431 32.704275,-86.448369 32.704289,-86.449563 32.704299,-86.450328 32.704309,-86.450488 32.704308)\r\n672;400;even;Autauga County 20;Autauga;AL;36051;LINESTRING(-86.418907 32.69096,-86.419171 32.691678,-86.419465 32.692503,-86.419959 32.693809,-86.420069 32.694079,-86.42016 32.694279,-86.420297 32.694537,-86.4205 32.694843,-86.420591 32.694952,-86.420921 32.695267,-86.421303 32.695534,-86.421439 32.695609,-86.42166 32.69571,-86.423725 32.696578,-86.42526 32.697213,-86.425642 32.697365,-86.42611 32.697525,-86.426508 32.697639,-86.426996 32.697756,-86.427323 32.697826,-86.427654 32.697886,-86.429577 32.698195,-86.430164 32.698285,-86.430587 32.698355,-86.431341 32.698493,-86.431676 32.698573,-86.432086 32.698687,-86.432329 32.698764,-86.43265 32.698873,-86.433042 32.699026,-86.433582 32.699255,-86.434556 32.699699,-86.434781 32.699808,-86.435141 32.700008,-86.435484 32.700234,-86.435923 32.700583,-86.436099 32.700746,-86.436492 32.701126,-86.436829 32.701495,-86.437173 32.701867,-86.438079 32.702826,-86.438394 32.703166,-86.438555 32.703331,-86.438666 32.703436,-86.438901 32.70363,-86.43916 32.703796,-86.439516 32.703976,-86.439814 32.704084,-86.44021 32.704174,-86.44062 32.704224,-86.44095 32.70424,-86.441799 32.704229,-86.44487 32.704151,-86.445042 32.704153,-86.447087 32.704111,-86.447433 32.704109,-86.448371 32.704123,-86.449565 32.704133,-86.45033 32.704143,-86.450487 32.704143)\r\n201;207;odd;Norris Rd;Autauga;AL;36067;LINESTRING(-86.51548 32.472377,-86.515504 32.472308)\r\n200;206;even;Norris Rd;Autauga;AL;36067;LINESTRING(-86.515293 32.472331,-86.515317 32.472262)\r\n112;198;all;Richmond Way;Autauga;AL;36066;LINESTRING(-86.442383 32.470513,-86.442379 32.470107,-86.442378 32.469807)\r\n200;204;even;Kay St;Autauga;AL;36066;LINESTRING(-86.441799 32.468549,-86.441651 32.468555,-86.441103 32.468565)\r\n201;207;odd;Kay St;Autauga;AL;36066;LINESTRING(-86.44181 32.468714,-86.441659 32.468723,-86.441107 32.468729)\r\n199;101;odd;Rushton Ct;Autauga;AL;36022;LINESTRING(-86.418847 32.506651,-86.41885 32.506677,-86.41886 32.506778,-86.418865 32.506832,-86.418867 32.506888,-86.41887 32.506936)\r\n100;198;even;Rushton Ct;Autauga;AL;36022;LINESTRING(-86.419041 32.506634,-86.419044 32.506661,-86.419056 32.506766,-86.419059 32.506822,-86.419065 32.50688,-86.419065 32.506932)\r\n1100;1198;even;Whirley Rd;Autauga;AL;36067;LINESTRING(-86.58037 32.550056,-86.580513 32.550166,-86.580916 32.550457,-86.581071 32.550541,-86.581237 32.550611,-86.582141 32.550888,-86.582311 32.550934,-86.582486 32.550971,-86.582823 32.551021,-86.583144 32.551108,-86.583317 32.551152,-86.583498 32.55118,-86.58368 32.551184,-86.583852 32.551183,-86.584015 32.551194,-86.584171 32.551218,-86.584313 32.551263,-86.584442 32.55133,-86.584556 32.551418,-86.584651 32.551522,-86.584688 32.551575,-86.584714 32.551631,-86.584737 32.551696,-86.584764 32.551774,-86.584802 32.551849,-86.584901 32.551982,-86.584962 32.552041,-86.585023 32.552102,-86.585143 32.552198,-86.585175 32.552241,-86.585198 32.552277,-86.585181 32.552315,-86.585158 32.552356,-86.58499 32.552511,-86.584854 32.552702,-86.584808 32.552746,-86.58476 32.552783,-86.584542 32.552897,-86.584394 32.552983,-86.584189 32.553122,-86.584103 32.553187)\r\n1101;1199;odd;Whirley Rd;Autauga;AL;36067;LINESTRING(-86.580501 32.549933,-86.580643 32.55004,-86.581038 32.550317,-86.581173 32.550391,-86.581317 32.550451,-86.582205 32.550728,-86.582365 32.55077,-86.582526 32.550803,-86.582873 32.550849,-86.583204 32.550948,-86.583363 32.550984,-86.58352 32.551006,-86.583684 32.551016,-86.583858 32.551015,-86.584039 32.551022,-86.584225 32.551046,-86.584407 32.551099,-86.58457 32.551188,-86.584712 32.551298,-86.584825 32.551426,-86.584872 32.551499,-86.584914 32.551575,-86.584931 32.55165,-86.584956 32.551712,-86.584986 32.551767,-86.585069 32.55188,-86.585114 32.551931,-86.585169 32.55198,-86.585305 32.552078,-86.585375 32.552159,-86.585402 32.552263,-86.585395 32.552371,-86.585338 32.552464,-86.585158 32.552621,-86.585022 32.5528,-86.584964 32.552872,-86.58488 32.552927,-86.58465 32.553039,-86.584514 32.553119,-86.584315 32.553252,-86.58423 32.553312)\r\n2201;2299;odd;Lone Star Ln;Autauga;AL;36067;LINESTRING(-86.590432 32.493179,-86.590987 32.493377,-86.591888 32.493667,-86.592141 32.493726,-86.592362 32.493774,-86.59302 32.493738,-86.593448 32.493729,-86.593491 32.49371)\r\n2298;2200;even;Lone Star Ln;Autauga;AL;36067;LINESTRING(-86.590507 32.493028,-86.591061 32.493221,-86.591952 32.493505,-86.592191 32.493564,-86.59238 32.493598,-86.59301 32.493574,-86.593414 32.493549,-86.593439 32.493552)\r\n3300;3318;all;Autauga County 98;Autauga;AL;36006;LINESTRING(-86.730078 32.643304,-86.73054 32.643302,-86.730891 32.643296,-86.731229 32.643269,-86.731392 32.643279,-86.731558 32.643298,-86.731894 32.643354,-86.732446 32.643424,-86.732487 32.643421)\r\n672;698;all;Autery Rd;Autauga;AL;36067;LINESTRING(-86.508646 32.529316,-86.508556 32.529398,-86.508538 32.529422,-86.508543 32.529455,-86.508681 32.529713,-86.508719 32.52987,-86.508727 32.530042,-86.508696 32.530134,-86.508672 32.53016)\r\n214;298;even;Spring Valley Dr;Autauga;AL;36066;LINESTRING(-86.450383 32.517606,-86.450316 32.517607,-86.449656 32.517615,-86.449572 32.517612,-86.449542 32.517614)\r\n201;219;odd;Spring Valley Dr;Autauga;AL;36066;LINESTRING(-86.450394 32.51777,-86.450322 32.517775,-86.449652 32.517783,-86.44957 32.517778,-86.44955 32.517778)\r\n366;390;even;Autauga County 9;Autauga;AL;36003;LINESTRING(-86.773453 32.487887,-86.773417 32.48808,-86.773345 32.488446,-86.773279 32.488809,-86.773036 32.490037,-86.772967 32.49032,-86.772889 32.490606,-86.772798 32.490886,-86.772642 32.491305,-86.772525 32.491577,-86.77251 32.491613)\r\n367;399;odd;Autauga County 9;Autauga;AL;36003;LINESTRING(-86.773645 32.487911,-86.773611 32.488106,-86.773539 32.488472,-86.773473 32.488835,-86.77323 32.490067,-86.773159 32.490356,-86.773081 32.490646,-86.772988 32.490934,-86.77283 32.491359,-86.772711 32.491639,-86.772689 32.491677)\r\n1301;1329;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.436549 32.446214,-86.436456 32.446153,-86.436388 32.446116,-86.435282 32.445315,-86.43489 32.44504,-86.433455 32.444019)\r\n1358;1374;even;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.693864 32.542531,-86.693267 32.543493,-86.692943 32.543996,-86.692504 32.544613,-86.691875 32.545473,-86.691706 32.54573,-86.691591 32.545928,-86.691486 32.546128,-86.691363 32.546406,-86.691261 32.546686,-86.691148 32.547037,-86.690867 32.548024,-86.6905 32.549365,-86.690342 32.550004,-86.690333 32.55004)\r\n1301;1357;odd;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.694037 32.542608,-86.693441 32.543571,-86.693115 32.54408,-86.692672 32.544699,-86.692047 32.545559,-86.691882 32.545808,-86.691771 32.545998,-86.691672 32.546192,-86.691553 32.54646,-86.691451 32.546732,-86.69134 32.547079,-86.691057 32.548062,-86.690692 32.549401,-86.690534 32.55004,-86.690522 32.550078)\r\n1701;1799;all;Solomon Ct;Autauga;AL;36067;LINESTRING(-86.571056 32.544591,-86.571083 32.544692,-86.571079 32.544847,-86.571077 32.544998,-86.57105 32.545222,-86.570978 32.545517,-86.570929 32.545667,-86.570849 32.545813,-86.570737 32.545946,-86.57053 32.546103,-86.570236 32.546263,-86.570114 32.546349,-86.570018 32.546446,-86.569983 32.546496,-86.569959 32.546554,-86.569925 32.546685,-86.56991 32.54682,-86.569913 32.546885,-86.569943 32.547093,-86.569978 32.54723,-86.570093 32.547581,-86.570126 32.547729,-86.57019 32.548162,-86.57025 32.548444,-86.570324 32.548726,-86.570382 32.548946,-86.570395 32.549099,-86.570396 32.54939,-86.570413 32.549525,-86.570452 32.549655,-86.570478 32.549716,-86.570672 32.550043,-86.570779 32.550268)\r\n107;199;all;Hillwood Rd;Autauga;AL;36067;LINESTRING(-86.461934 32.451574,-86.461761 32.451573,-86.461163 32.451511,-86.460982 32.451491,-86.46088 32.451466,-86.460777 32.451419,-86.460703 32.451344,-86.460242 32.450719,-86.460177 32.450639)\r\n400;418;all;Autauga County 165;Autauga;AL;36003;LINESTRING(-86.642616 32.458692,-86.642406 32.459184,-86.642097 32.459864)\r\n1562;1654;even;Autauga County 85;Autauga;AL;36067;LINESTRING(-86.492848 32.522178,-86.492818 32.522201,-86.492697 32.522295,-86.492569 32.522382,-86.492434 32.522462,-86.492294 32.522534,-86.492149 32.522599,-86.491998 32.522656,-86.491843 32.522705,-86.491686 32.522745,-86.491527 32.522776,-86.491365 32.522798,-86.491202 32.522809,-86.491037 32.522814,-86.490873 32.522808,-86.490542 32.522778,-86.489198 32.522599,-86.488856 32.522562,-86.488675 32.522563,-86.488498 32.522576,-86.488322 32.522601,-86.48815 32.522641,-86.487983 32.522697,-86.487823 32.522763,-86.487745 32.522802,-86.487597 32.522886,-86.487394 32.523026,-86.487199 32.523166,-86.486565 32.523653,-86.486007 32.524098,-86.485275 32.524701,-86.485151 32.5248,-86.485031 32.524905,-86.484912 32.525011,-86.484691 32.525232,-86.484542 32.525411,-86.484489 32.525482)\r\n1581;1679;odd;Autauga County 85;Autauga;AL;36067;LINESTRING(-86.492991 32.52229,-86.492962 32.522321,-86.492829 32.522425,-86.492689 32.522518,-86.492544 32.522604,-86.492392 32.522682,-86.492237 32.522751,-86.492074 32.522812,-86.491907 32.522867,-86.491738 32.522909,-86.491565 32.522944,-86.491389 32.522966,-86.491212 32.522979,-86.491037 32.52298,-86.490859 32.522978,-86.490516 32.522944,-86.489172 32.522765,-86.488844 32.522736,-86.488683 32.522735,-86.488524 32.522746,-86.488366 32.522769,-86.488214 32.522805,-86.488065 32.522853,-86.487919 32.522913,-86.487853 32.522946,-86.487717 32.523024,-86.48752 32.523154,-86.487329 32.523292,-86.486699 32.523775,-86.486143 32.524218,-86.485411 32.524819,-86.485291 32.524918,-86.485173 32.525019,-86.485062 32.525123,-86.484851 32.525336,-86.484706 32.525505,-86.484652 32.525572)\r\n2018;2022;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.585776 32.505487,-86.585794 32.505533)\r\n1399;1377;odd;Bluejays Pl;Autauga;AL;36067;LINESTRING(-86.420165 32.432121,-86.420169 32.431974,-86.420167 32.431952)\r\n1398;1376;even;Bluejays Pl;Autauga;AL;36067;LINESTRING(-86.419971 32.432118,-86.419973 32.431976,-86.419973 32.431958)\r\n100;198;even;Sweetbriar Ct;Autauga;AL;36067;LINESTRING(-86.458621 32.48592,-86.459153 32.485937,-86.459418 32.485944,-86.459608 32.48593,-86.459719 32.485888,-86.459839 32.485798,-86.459926 32.485702,-86.459984 32.485541,-86.459996 32.485385,-86.460004 32.485011,-86.459989 32.484963)\r\n101;199;odd;Sweetbriar Ct;Autauga;AL;36067;LINESTRING(-86.458628 32.485755,-86.459159 32.485771,-86.459406 32.485772,-86.459548 32.48575,-86.459601 32.48573,-86.459681 32.485674,-86.459728 32.485616,-86.459774 32.485505,-86.459794 32.485375,-86.459796 32.485023,-86.459796 32.484989)\r\n1500;1538;even;Hawthorne Ln;Autauga;AL;36066;LINESTRING(-86.421392 32.474025,-86.421399 32.474037,-86.42149 32.474071,-86.42158 32.474094,-86.42167 32.474118,-86.421852 32.474139,-86.422116 32.47414,-86.422384 32.474127)\r\n1501;1535;odd;Hawthorne Ln;Autauga;AL;36066;LINESTRING(-86.421504 32.47389,-86.421505 32.473883,-86.421566 32.473909,-86.421638 32.473932,-86.421712 32.473946,-86.421868 32.473965,-86.422112 32.473974,-86.422373 32.473963)\r\n2440;2450;even;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.490095 32.615909,-86.490097 32.616213,-86.490143 32.617314)\r\n2447;2453;odd;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.49029 32.615908,-86.490295 32.616209,-86.490337 32.617309)\r\n900;998;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.448641 32.457094,-86.448481 32.456929,-86.447212 32.455574,-86.446838 32.455181,-86.4467 32.455034)\r\n332;498;even;Hidden Valley Rd;Autauga;AL;36022;LINESTRING(-86.414178 32.500775,-86.414155 32.500769,-86.413208 32.500764,-86.413039 32.50076,-86.412835 32.500766)\r\n379;499;odd;Hidden Valley Rd;Autauga;AL;36022;LINESTRING(-86.414159 32.500939,-86.414143 32.500941,-86.413204 32.50093,-86.413039 32.500924,-86.412841 32.50093)\r\n1842;1856;even;US Hwy 31;Autauga;AL;36067;LINESTRING(-86.463887 32.568015,-86.463943 32.568307,-86.464053 32.56902,-86.464108 32.569451,-86.464148 32.56988,-86.464171 32.570312,-86.46418 32.570688)\r\n1837;1853;odd;US Hwy 31;Autauga;AL;36067;LINESTRING(-86.464079 32.567988,-86.464139 32.568283,-86.464249 32.569,-86.464304 32.569435,-86.464346 32.56987,-86.464369 32.570306,-86.464375 32.570685)\r\n1798;1700;even;Lakepoint Cir;Autauga;AL;36067;LINESTRING(-86.512702 32.542619,-86.512582 32.542619)\r\n1799;1701;odd;Lakepoint Cir;Autauga;AL;36067;LINESTRING(-86.512702 32.542783,-86.512582 32.542783)\r\n599;539;all;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.509248 32.539454,-86.509222 32.539447,-86.509059 32.539453,-86.508801 32.539477,-86.508628 32.539502,-86.508458 32.539542,-86.50829 32.539587,-86.508126 32.539639,-86.507019 32.540016,-86.506702 32.540117,-86.506544 32.540162,-86.506384 32.540202,-86.506224 32.540233,-86.505892 32.540279,-86.505722 32.540295,-86.505634 32.540303)\r\n1400;1428;even;Longview Heights Rd;Autauga;AL;36067;LINESTRING(-86.424559 32.437143,-86.42471 32.437011,-86.425182 32.436573,-86.425518 32.436259,-86.425625 32.436195,-86.425631 32.436184,-86.425691 32.436212,-86.425901 32.436355,-86.425942 32.436357)\r\n1401;1415;odd;Longview Heights Rd;Autauga;AL;36067;LINESTRING(-86.424419 32.437029,-86.424566 32.436897,-86.425036 32.436463,-86.425372 32.436135,-86.425525 32.436009,-86.425675 32.436002,-86.425805 32.436068,-86.426007 32.436191,-86.426008 32.436202)\r\n2216;2200;even;Luzella Rd;Autauga;AL;36067;LINESTRING(-86.61792 32.505559,-86.617825 32.505482,-86.617654 32.50532,-86.617627 32.505309)\r\n2299;2201;odd;Luzella Rd;Autauga;AL;36067;LINESTRING(-86.617792 32.505682,-86.617681 32.505606,-86.61751 32.505448,-86.617503 32.505436)\r\n1108;1100;even;Hines Dr;Autauga;AL;36067;LINESTRING(-86.612901 32.581136,-86.614056 32.581135,-86.614483 32.581132,-86.614898 32.581122,-86.615069 32.581122,-86.615422 32.581108,-86.615938 32.581107,-86.616106 32.581103,-86.616788 32.581115,-86.616987 32.581114)\r\n1101;1111;odd;Hines Dr;Autauga;AL;36067;LINESTRING(-86.612901 32.580971,-86.614056 32.580969,-86.614479 32.580966,-86.614894 32.580954,-86.615065 32.580954,-86.615418 32.58094,-86.615936 32.580941,-86.616106 32.580939,-86.61679 32.580949,-86.616987 32.580949)\r\n1626;1630;all;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.652026 32.524219,-86.652134 32.524219,-86.653824 32.524249)\r\n1100;1498;even;Mill Rd;Autauga;AL;36067;LINESTRING(-86.577278 32.503801,-86.577283 32.503848,-86.577377 32.503915,-86.577739 32.504046,-86.577898 32.504165,-86.578016 32.504328,-86.578259 32.504811,-86.578528 32.505204,-86.578675 32.50538,-86.578956 32.505666,-86.579106 32.505766,-86.579298 32.505921,-86.579402 32.506066,-86.579443 32.506189,-86.579418 32.506276,-86.579414 32.506447,-86.5793 32.506905,-86.579157 32.507391,-86.579058 32.507407,-86.578602 32.50741,-86.578552 32.50747)\r\n1401;1499;odd;Mill Rd;Autauga;AL;36067;LINESTRING(-86.577458 32.503739,-86.577473 32.503734,-86.577497 32.503755,-86.577859 32.503886,-86.578072 32.504047,-86.5782 32.50425,-86.578443 32.504733,-86.5787 32.505112,-86.578835 32.505276,-86.579104 32.50554,-86.579234 32.50564,-86.579464 32.505801,-86.579618 32.505996,-86.579635 32.506189,-86.579626 32.50629,-86.579628 32.506467,-86.57949 32.506941,-86.579337 32.507563,-86.579072 32.507575,-86.578696 32.507604,-86.578683 32.507592)\r\n320;398;even;Marlette Dr;Autauga;AL;36067;LINESTRING(-86.460513 32.446643,-86.460237 32.446644,-86.459796 32.446647,-86.459606 32.446677,-86.459445 32.446765,-86.45937 32.446813,-86.459166 32.446954,-86.459104 32.447003,-86.458923 32.447134)\r\n323;399;odd;Marlette Dr;Autauga;AL;36067;LINESTRING(-86.460514 32.446808,-86.460239 32.44681,-86.45982 32.446825,-86.459686 32.446853,-86.459557 32.446909,-86.459492 32.446947,-86.459296 32.447082,-86.459234 32.447129,-86.459049 32.44726)\r\n401;499;all;Doster Rd;Autauga;AL;36067;LINESTRING(-86.466271 32.455076,-86.4652 32.453425)\r\n999;919;odd;Wilberforce Ave;Autauga;AL;36067;LINESTRING(-86.469706 32.482023,-86.470355 32.482024,-86.470778 32.482033,-86.471043 32.48205,-86.471254 32.482037,-86.471377 32.48197,-86.471443 32.481859,-86.471451 32.481617,-86.471447 32.481267)\r\n998;914;even;Wilberforce Ave;Autauga;AL;36067;LINESTRING(-86.469706 32.481859,-86.470357 32.481858,-86.470788 32.481865,-86.471037 32.481882,-86.471172 32.481853,-86.471201 32.481836,-86.471221 32.481807,-86.471249 32.481611,-86.471253 32.481267)\r\n400;498;even;Ceresa Dr;Autauga;AL;36067;LINESTRING(-86.45613 32.447633,-86.456107 32.447615,-86.455906 32.447508,-86.455766 32.44741,-86.455666 32.447366,-86.455615 32.447377)\r\n401;499;odd;Ceresa Dr;Autauga;AL;36067;LINESTRING(-86.456076 32.447791,-86.456009 32.447787,-86.45579 32.447642,-86.455656 32.447566,-86.455612 32.447554,-86.455606 32.447541)\r\n498;400;all;Lower Kingston Rd;Autauga;AL;36067;LINESTRING(-86.481937 32.466441,-86.480142 32.464924)\r\n1598;1500;even;Delmar Dr;Autauga;AL;36067;LINESTRING(-86.487857 32.539346,-86.487868 32.539232,-86.48792 32.539023,-86.487932 32.538688,-86.487982 32.538422,-86.487947 32.538011,-86.487958 32.537723,-86.488003 32.537409,-86.488069 32.53727,-86.488225 32.537076,-86.488303 32.537008)\r\n1599;1401;odd;Delmar Dr;Autauga;AL;36067;LINESTRING(-86.487662 32.539343,-86.487656 32.539212,-86.48771 32.539001,-86.487726 32.53867,-86.48778 32.538414,-86.487749 32.538015,-86.487756 32.537713,-86.487787 32.537361,-86.487883 32.537186,-86.488061 32.536952,-86.488178 32.536882)\r\n299;201;odd;Larry St;Autauga;AL;36067;LINESTRING(-86.488459 32.435469,-86.488438 32.43543,-86.488362 32.435299,-86.487896 32.43451,-86.48777 32.434336)\r\n298;200;even;Larry St;Autauga;AL;36067;LINESTRING(-86.488292 32.435554,-86.488256 32.435512,-86.488184 32.435371,-86.48772 32.434592,-86.487603 32.43442)\r\n1100;1198;even;Honeysuckle Dr;Autauga;AL;36067;LINESTRING(-86.450592 32.452958,-86.45059 32.452343,-86.450559 32.452282)\r\n1101;1113;odd;Honeysuckle Dr;Autauga;AL;36067;LINESTRING(-86.450397 32.452961,-86.450374 32.452369,-86.450371 32.452326)\r\n460;498;all;Nummy Rd;Autauga;AL;36022;LINESTRING(-86.438301 32.542824,-86.43832 32.542932,-86.438352 32.543211,-86.438358 32.543222)\r\n1432;1498;even;Autauga Heights Rd;Autauga;AL;36066;LINESTRING(-86.452859 32.517747,-86.452735 32.518243,-86.452664 32.518603,-86.452649 32.518825,-86.452648 32.519117,-86.452651 32.519386,-86.452651 32.519697,-86.452712 32.52056,-86.452739 32.520778,-86.452764 32.520925,-86.452798 32.521013)\r\n1431;1499;odd;Autauga Heights Rd;Autauga;AL;36066;LINESTRING(-86.45305 32.517781,-86.452931 32.518273,-86.452866 32.518623,-86.452849 32.518831,-86.452842 32.519117,-86.452845 32.519384,-86.452851 32.519691,-86.45291 32.520546,-86.452937 32.520756,-86.452964 32.520889,-86.452986 32.520969)\r\n2316;2398;even;Maul Dr;Autauga;AL;36006;LINESTRING(-86.70474 32.677753,-86.705346 32.678697,-86.706018 32.679749,-86.70621 32.68007,-86.70635 32.680333,-86.706415 32.680466,-86.706533 32.680736,-86.706697 32.681149,-86.707415 32.683073,-86.707577 32.683483,-86.707594 32.683515,-86.707759 32.68389,-86.707889 32.684158,-86.708438 32.685227,-86.708904 32.686158,-86.709086 32.68656,-86.709188 32.686819,-86.70929 32.687116)\r\n2311;2399;odd;Maul Dr;Autauga;AL;36006;LINESTRING(-86.704911 32.677674,-86.705518 32.678619,-86.706194 32.679671,-86.70639 32.679998,-86.706532 32.680267,-86.706601 32.680404,-86.706719 32.680682,-86.706885 32.681097,-86.707603 32.683021,-86.707765 32.683427,-86.707776 32.683457,-86.707943 32.68383,-86.708071 32.684094,-86.708618 32.685161,-86.709088 32.686096,-86.709272 32.686504,-86.70938 32.686769,-86.709477 32.687072)\r\n812;600;even;Running Brook Dr;Autauga;AL;36066;LINESTRING(-86.4313 32.45893,-86.431078 32.459203,-86.430931 32.459374,-86.430827 32.459476,-86.430775 32.459518,-86.430649 32.459595,-86.430589 32.459625,-86.430522 32.459646,-86.430293 32.459693,-86.430053 32.459712,-86.429803 32.459714,-86.429546 32.459706,-86.429287 32.459707,-86.428945 32.459721,-86.428907 32.459721)\r\n873;601;odd;Running Brook Dr;Autauga;AL;36066;LINESTRING(-86.43146 32.459022,-86.43124 32.459299,-86.431091 32.459478,-86.430977 32.459596,-86.430907 32.45965,-86.430761 32.459745,-86.430675 32.459779,-86.430588 32.459814,-86.430327 32.459869,-86.430061 32.459882,-86.429799 32.459882,-86.429542 32.459874,-86.429291 32.459875,-86.428947 32.459887,-86.428902 32.459885)\r\n100;198;even;Debra Dr;Autauga;AL;36066;LINESTRING(-86.43076 32.447173,-86.430758 32.447171,-86.43052 32.447189,-86.43027 32.447197,-86.428569 32.447218,-86.427457 32.447224,-86.427282 32.447232)\r\n101;199;odd;Debra Dr;Autauga;AL;36066;LINESTRING(-86.43079 32.447336,-86.430782 32.447339,-86.430532 32.447357,-86.430274 32.447363,-86.428571 32.447384,-86.427461 32.447392,-86.42729 32.447396)\r\n500;598;even;Sandstone Trl;Autauga;AL;36066;LINESTRING(-86.42835 32.467237,-86.428355 32.467185,-86.428359 32.467115)\r\n101;199;odd;Sandstone Trl;Autauga;AL;36066;LINESTRING(-86.428156 32.467234,-86.428153 32.467175,-86.428165 32.4671)\r\n1058;1098;even;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.482378 32.43445,-86.484769 32.433388)\r\n1009;1051;odd;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.482288 32.434305,-86.484679 32.433243)\r\n1099;1001;odd;N Memorial Dr;Autauga;AL;36067;LINESTRING(-86.45366 32.489218,-86.453663 32.489054,-86.453655 32.488549,-86.453667 32.487319,-86.453662 32.48674,-86.45364 32.486086,-86.453598 32.485721,-86.453526 32.485383,-86.453512 32.485316)\r\n1098;1000;even;N Memorial Dr;Autauga;AL;36067;LINESTRING(-86.453466 32.489215,-86.453469 32.489054,-86.453459 32.488549,-86.453473 32.487319,-86.453466 32.486744,-86.45344 32.486098,-86.453398 32.485743,-86.453334 32.485411,-86.453321 32.485343)\r\n601;1599;all;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.509536 32.539486,-86.509612 32.539491,-86.509957 32.539552,-86.510458 32.539661,-86.511017 32.539789)\r\n1500;1552;even;Autauga County 50;Autauga;AL;36067;LINESTRING(-86.539389 32.40488,-86.539555 32.404882,-86.543527 32.405001,-86.545155 32.405049,-86.5473 32.405112,-86.548163 32.405124,-86.549026 32.405115,-86.549884 32.405099)\r\n1501;1599;odd;Autauga County 50;Autauga;AL;36067;LINESTRING(-86.539389 32.404716,-86.539559 32.404714,-86.543533 32.404837,-86.545161 32.404885,-86.547306 32.404946,-86.548163 32.40496,-86.549022 32.404949,-86.54988 32.404934)\r\n1301;1399;odd;Edgefield Ct;Autauga;AL;36067;LINESTRING(-86.459598 32.513643,-86.459584 32.513956,-86.459529 32.514401)\r\n1300;1398;even;Edgefield Ct;Autauga;AL;36067;LINESTRING(-86.459792 32.513648,-86.459786 32.513968,-86.459722 32.51442)\r\n1699;1601;odd;Dominik Rd;Autauga;AL;36067;LINESTRING(-86.552222 32.401695,-86.551209 32.401711,-86.550485 32.401711,-86.550177 32.401839,-86.550017 32.401995,-86.549954 32.402173,-86.549895 32.402359,-86.54991 32.40254,-86.549926 32.402712,-86.549919 32.402886,-86.549947 32.40308,-86.550075 32.40324,-86.550224 32.403359,-86.550488 32.403514,-86.550869 32.403566,-86.551207 32.403562)\r\n1698;1600;even;Dominik Rd;Autauga;AL;36067;LINESTRING(-86.552226 32.40186,-86.551213 32.401875,-86.550539 32.401901,-86.550317 32.401993,-86.550213 32.402093,-86.550148 32.402223,-86.550105 32.402377,-86.550108 32.40253,-86.550126 32.402706,-86.550125 32.402874,-86.550161 32.40301,-86.550241 32.403124,-86.550356 32.403219,-86.550574 32.403334,-86.550889 32.403388,-86.551209 32.403397)\r\n500;598;even;Seasons Ct;Autauga;AL;36066;LINESTRING(-86.424883 32.455692,-86.42483 32.456075)\r\n501;599;odd;Seasons Ct;Autauga;AL;36066;LINESTRING(-86.425076 32.455711,-86.425023 32.456094)\r\n1600;1676;all;Rambling Brook Ln;Autauga;AL;36066;LINESTRING(-86.429884 32.46486,-86.429776 32.464857,-86.429624 32.464955,-86.429411 32.465056,-86.428966 32.46521)\r\n205;201;odd;Hickory Ln;Autauga;AL;36066;LINESTRING(-86.447781 32.476071,-86.447789 32.47593,-86.447782 32.475779,-86.447758 32.475627,-86.447722 32.475526,-86.447677 32.475469)\r\n204;200;even;Hickory Ln;Autauga;AL;36066;LINESTRING(-86.447587 32.476064,-86.447593 32.475932,-86.44758 32.475797,-86.447554 32.475667,-86.447526 32.475594,-86.447505 32.475547)\r\n337;301;odd;Bedford Ter;Autauga;AL;36066;LINESTRING(-86.443474 32.471389,-86.443467 32.470876,-86.443487 32.470795,-86.44353 32.47073,-86.443513 32.470722)\r\n340;300;even;Bedford Ter;Autauga;AL;36066;LINESTRING(-86.443279 32.471392,-86.443263 32.470868,-86.443273 32.470741,-86.44335 32.470598,-86.443405 32.470585)\r\n200;240;all;Autauga County 1;Autauga;AL;36749;LINESTRING(-86.853261 32.483921,-86.852467 32.485583,-86.852266 32.485982,-86.852195 32.48611,-86.852118 32.486238,-86.852035 32.486364,-86.851947 32.486485,-86.851855 32.486605,-86.851758 32.48672,-86.851654 32.486834,-86.851545 32.486945,-86.851433 32.487051,-86.851316 32.487153,-86.851194 32.487253,-86.851069 32.487348,-86.850802 32.487529,-86.849845 32.48812)\r\n2000;2008;even;Vonica Rose St;Autauga;AL;36022;LINESTRING(-86.418426 32.509242,-86.419903 32.509218,-86.419999 32.509214)\r\n2001;2009;odd;Vonica Rose St;Autauga;AL;36022;LINESTRING(-86.418422 32.509077,-86.419897 32.509052,-86.419991 32.50905)\r\n330;398;even;N Taylor St;Autauga;AL;36003;LINESTRING(-86.659804 32.435168,-86.659803 32.435172,-86.659885 32.435274,-86.65993 32.435337,-86.660111 32.43558,-86.660144 32.435645,-86.660165 32.435703,-86.660147 32.435733,-86.660122 32.435768,-86.660046 32.435815,-86.659744 32.435918,-86.659411 32.435993,-86.659309 32.43602,-86.659163 32.436125,-86.659109 32.436165,-86.659076 32.436193)\r\n221;399;odd;N Taylor St;Autauga;AL;36003;LINESTRING(-86.659957 32.435067,-86.659967 32.435072,-86.660053 32.435184,-86.660098 32.435249,-86.660295 32.435496,-86.660344 32.435587,-86.660369 32.435693,-86.660369 32.435805,-86.66028 32.435904,-86.660146 32.435977,-86.659806 32.436082,-86.659475 32.436157,-86.659419 32.436182,-86.659301 32.436255,-86.659243 32.436313,-86.659172 32.436336)\r\n500;598;even;Langford Way;Autauga;AL;36067;LINESTRING(-86.459992 32.428836,-86.459873 32.428903)\r\n501;599;odd;Langford Way;Autauga;AL;36067;LINESTRING(-86.4601 32.428972,-86.459981 32.429039)\r\n1300;1398;even;Cubs Pl;Autauga;AL;36067;LINESTRING(-86.417084 32.430099,-86.416792 32.430412)\r\n1301;1399;odd;Cubs Pl;Autauga;AL;36067;LINESTRING(-86.417237 32.430201,-86.416945 32.430514)\r\n2740;2816;even;Autauga County 59;Autauga;AL;36022;LINESTRING(-86.509594 32.64951,-86.50974 32.649629,-86.510001 32.649811,-86.510309 32.650048,-86.510789 32.650444,-86.51116 32.650748,-86.511364 32.650889,-86.511982 32.651282,-86.512195 32.651415,-86.512347 32.651495,-86.512432 32.651535,-86.512604 32.651594,-86.512784 32.651628,-86.512963 32.651641,-86.513728 32.651658,-86.513974 32.651677,-86.514216 32.651715,-86.514374 32.65175,-86.514693 32.65184,-86.514928 32.651915,-86.515319 32.652054,-86.515935 32.652295,-86.516241 32.652425,-86.516944 32.652693,-86.518747 32.653357,-86.519857 32.653732,-86.520248 32.653879,-86.520862 32.654124,-86.521312 32.654328,-86.521527 32.654438,-86.521673 32.65452)\r\n2769;2803;odd;Autauga County 59;Autauga;AL;36022;LINESTRING(-86.509726 32.64939,-86.509872 32.649501,-86.510133 32.649685,-86.510445 32.649926,-86.510925 32.650326,-86.511294 32.65062,-86.511488 32.650757,-86.5121 32.651148,-86.512307 32.651273,-86.512447 32.651347,-86.512518 32.651377,-86.512666 32.651426,-86.512818 32.651456,-86.512975 32.651471,-86.51374 32.651488,-86.514002 32.651507,-86.514262 32.651547,-86.514432 32.651588,-86.514759 32.651682,-86.515002 32.651759,-86.515399 32.6519,-86.516021 32.652145,-86.516327 32.652273,-86.517024 32.652541,-86.518823 32.653203,-86.519935 32.653578,-86.52033 32.653727,-86.520952 32.653974,-86.52141 32.654182,-86.521635 32.654296,-86.521783 32.654384)\r\n224;276;even;Autauga County 33;Autauga;AL;36003;LINESTRING(-86.744566 32.46269,-86.744551 32.465377,-86.744534 32.466913,-86.744527 32.467054,-86.744501 32.467344,-86.744465 32.467631,-86.744418 32.46792,-86.744361 32.468205,-86.744293 32.468487,-86.744214 32.468769,-86.744121 32.469049,-86.744119 32.469061)\r\n181;277;odd;Autauga County 33;Autauga;AL;36003;LINESTRING(-86.744761 32.462691,-86.744745 32.465379,-86.744732 32.466917,-86.744723 32.467064,-86.744699 32.46736,-86.744661 32.467651,-86.744612 32.467946,-86.744555 32.468235,-86.744487 32.468523,-86.744406 32.468811,-86.744311 32.469097,-86.744304 32.46911)\r\n205;207;all;Winchester Way;Autauga;AL;36067;LINESTRING(-86.474316 32.449557,-86.475003 32.449551)\r\n500;502;all;Hallmark Dr;Autauga;AL;36067;LINESTRING(-86.46264 32.454747,-86.462651 32.454703,-86.462694 32.454334,-86.462718 32.454188,-86.462726 32.454038)\r\n799;701;odd;Dozier Ave;Autauga;AL;36067;LINESTRING(-86.446095 32.458819,-86.446303 32.458801,-86.446566 32.458765,-86.446817 32.458693,-86.446983 32.458638,-86.447213 32.458528,-86.447364 32.458448,-86.447563 32.458307,-86.447649 32.458241)\r\n1098;700;even;Dozier Ave;Autauga;AL;36067;LINESTRING(-86.446073 32.458655,-86.446275 32.458633,-86.446516 32.458595,-86.446747 32.458533,-86.446895 32.45848,-86.447111 32.458382,-86.447244 32.458308,-86.447435 32.458179,-86.447521 32.458117)\r\n1822;1898;all;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.677896 32.611028,-86.677901 32.611035,-86.678122 32.611228,-86.678305 32.611376,-86.678449 32.611472,-86.678604 32.611556,-86.67907 32.611764,-86.679134 32.611799,-86.679194 32.611838,-86.679248 32.611881,-86.67941 32.612033,-86.679835 32.612484,-86.680121 32.612765,-86.680311 32.612919,-86.680511 32.613064,-86.680786 32.613244,-86.681557 32.613709,-86.681826 32.61388,-86.682084 32.614065,-86.682392 32.614313,-86.682711 32.614555,-86.68283 32.614654,-86.682945 32.61476,-86.682998 32.614814,-86.683093 32.614929,-86.683134 32.614986,-86.683167 32.615046,-86.683196 32.615108,-86.683218 32.615169,-86.683236 32.615233,-86.683261 32.615367,-86.683276 32.615504,-86.683285 32.615714,-86.683282 32.615998,-86.683261 32.616439,-86.683266 32.616592,-86.683278 32.616674,-86.683316 32.616827,-86.683348 32.616905,-86.683421 32.617045,-86.683624 32.617365,-86.683923 32.617886,-86.684119 32.618213,-86.684252 32.618403,-86.684447 32.618647,-86.684553 32.61877,-86.68474 32.618932,-86.68519 32.619267,-86.685432 32.619467,-86.685722 32.619733,-86.685991 32.620009,-86.686657 32.620761,-86.687038 32.621166,-86.687081 32.62122,-86.687119 32.621278,-86.68715 32.621339,-86.687173 32.621398,-86.687207 32.621532,-86.687226 32.621666,-86.687238 32.621877,-86.687225 32.622451,-86.687209 32.622887,-86.687208 32.623248,-86.687191 32.624189,-86.687166 32.625149,-86.687169 32.625305,-86.687194 32.625465,-86.687232 32.625577)\r\n1500;1698;even;Autauga County 79;Autauga;AL;36067;LINESTRING(-86.710061 32.557224,-86.710042 32.557323,-86.710015 32.557615,-86.710009 32.557837,-86.710014 32.558061,-86.710037 32.558282,-86.710079 32.558501,-86.710132 32.558719,-86.710252 32.559073,-86.710313 32.559214,-86.710796 32.560143,-86.71118 32.560948,-86.711324 32.561286,-86.711423 32.561558,-86.711505 32.561836,-86.711587 32.562187,-86.711622 32.562397,-86.711644 32.562609,-86.711657 32.562895,-86.711675 32.563762,-86.711695 32.565281,-86.711722 32.566658,-86.711744 32.567381,-86.711749 32.567963,-86.711767 32.568186,-86.711795 32.568337,-86.71184 32.568486,-86.711904 32.568631,-86.712028 32.568833,-86.712126 32.568962,-86.712541 32.569427,-86.712683 32.569602,-86.71286 32.569845,-86.712899 32.569905,-86.712999 32.570081)\r\n1501;1635;odd;Autauga County 79;Autauga;AL;36006;LINESTRING(-86.710254 32.557247,-86.710242 32.557341,-86.710215 32.557625,-86.710205 32.557837,-86.710214 32.558051,-86.710237 32.558262,-86.710275 32.558471,-86.710328 32.558677,-86.710444 32.559021,-86.710499 32.55915,-86.710978 32.560079,-86.711366 32.560888,-86.711512 32.561232,-86.711617 32.561512,-86.711699 32.5618,-86.711783 32.562159,-86.711822 32.562377,-86.711844 32.562599,-86.711853 32.562891,-86.711871 32.56376,-86.711891 32.565279,-86.711918 32.566654,-86.71194 32.567379,-86.711949 32.567955,-86.711969 32.568166,-86.711995 32.568301,-86.712036 32.568434,-86.712092 32.568561,-86.712204 32.568747,-86.712292 32.568864,-86.712701 32.569329,-86.712851 32.56951,-86.713034 32.569761,-86.713077 32.569829,-86.713175 32.570011)\r\n1799;1601;odd;Whippoorwill Ct;Autauga;AL;36022;LINESTRING(-86.438649 32.553947,-86.438614 32.553943,-86.438407 32.553959,-86.438286 32.553964,-86.438147 32.553966,-86.437447 32.553964,-86.437355 32.553969,-86.437176 32.553979,-86.437086 32.553986,-86.437 32.554003,-86.436922 32.554022,-86.436847 32.554038,-86.436718 32.554076,-86.436715 32.554081)\r\n1798;1700;even;Whippoorwill Ct;Autauga;AL;36022;LINESTRING(-86.438622 32.55411,-86.43861 32.554109,-86.438421 32.554127,-86.438292 32.554132,-86.438147 32.554132,-86.437453 32.554132,-86.437367 32.554135,-86.437194 32.554147,-86.437118 32.554156,-86.437046 32.554167,-86.436974 32.554182,-86.436907 32.5542,-86.436794 32.554234,-86.436794 32.554231)\r\n699;601;odd;Madison Dr;Autauga;AL;36066;LINESTRING(-86.424545 32.493829,-86.425302 32.49384,-86.425343 32.493845,-86.425366 32.49386,-86.425349 32.493854,-86.425352 32.493834,-86.425361 32.493896,-86.42533 32.494634,-86.425321 32.495232,-86.425326 32.495662)\r\n626;602;even;Madison Dr;Autauga;AL;36066;LINESTRING(-86.424545 32.493664,-86.425346 32.49365,-86.425413 32.493683,-86.425472 32.49369,-86.425555 32.49374,-86.425568 32.49381,-86.425559 32.4939,-86.425526 32.494638,-86.425517 32.495232,-86.42552 32.495661)\r\n700;840;even;Autauga County 165;Autauga;AL;36067;LINESTRING(-86.609649 32.468646,-86.609413 32.468788,-86.608841 32.469109,-86.608411 32.46936,-86.608269 32.469449,-86.608132 32.469546,-86.608002 32.46965,-86.60788 32.469761,-86.607764 32.469875,-86.607656 32.469996,-86.607555 32.47012,-86.607463 32.470249,-86.607376 32.47038,-86.607299 32.470519,-86.607231 32.470655,-86.607169 32.470797,-86.606994 32.471288,-86.606877 32.471638,-86.606807 32.471847,-86.606682 32.472196,-86.606323 32.473247,-86.606207 32.473598,-86.60537 32.476051,-86.605219 32.476465,-86.605102 32.476733,-86.604969 32.476995,-86.604895 32.477123,-86.604733 32.477373,-86.604555 32.477617,-86.604363 32.477849,-86.603935 32.478302,-86.598204 32.484133,-86.597654 32.484696,-86.59744 32.48493,-86.597239 32.485172,-86.597051 32.48542,-86.596872 32.48567,-86.596704 32.485929,-86.596547 32.486193,-86.596484 32.486317)\r\n601;833;odd;Autauga County 165;Autauga;AL;36067;LINESTRING(-86.609763 32.468779,-86.609525 32.468926,-86.608951 32.469247,-86.608527 32.469496,-86.608393 32.469581,-86.608266 32.469672,-86.608144 32.46977,-86.608028 32.469873,-86.60792 32.469981,-86.607818 32.470094,-86.607723 32.470212,-86.607635 32.470333,-86.607554 32.470458,-86.607481 32.470587,-86.607417 32.470717,-86.607359 32.470851,-86.607182 32.471334,-86.607065 32.471682,-86.606997 32.471893,-86.60687 32.472244,-86.606511 32.473293,-86.606395 32.473644,-86.605558 32.476099,-86.605409 32.476519,-86.605288 32.476795,-86.605149 32.477065,-86.605071 32.477201,-86.604905 32.477457,-86.604723 32.477709,-86.604523 32.477951,-86.604087 32.478408,-86.598354 32.484239,-86.597808 32.4848,-86.5976 32.48503,-86.597403 32.485266,-86.597219 32.485508,-86.597044 32.485754,-86.59688 32.486007,-86.596727 32.486265,-86.596661 32.486384)\r\n1299;1253;all;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.418338 32.50695,-86.418325 32.50639)\r\n501;599;all;E Poplar St;Autauga;AL;36066;LINESTRING(-86.429497 32.471247,-86.429408 32.471208,-86.429192 32.4711,-86.429026 32.471029,-86.428837 32.470991,-86.428567 32.470985,-86.428393 32.470986,-86.427453 32.471001)\r\n299;201;odd;Deer Trce;Autauga;AL;36067;LINESTRING(-86.477209 32.454467,-86.476965 32.454472,-86.476626 32.454459,-86.47655 32.45445,-86.476475 32.454435,-86.476403 32.454413,-86.47625 32.454355,-86.476024 32.454255,-86.475958 32.454219,-86.475893 32.454179,-86.475835 32.454135,-86.475779 32.454087,-86.475671 32.453978,-86.475462 32.453741,-86.475342 32.453625,-86.47521 32.45352,-86.475003 32.453379,-86.47432 32.452958,-86.474257 32.452929)\r\n298;208;even;Deer Trce;Autauga;AL;36067;LINESTRING(-86.477214 32.454632,-86.476965 32.454638,-86.476608 32.454631,-86.476512 32.45462,-86.476417 32.454599,-86.476325 32.454573,-86.476162 32.454505,-86.475924 32.454403,-86.475842 32.454361,-86.475767 32.454311,-86.475695 32.454259,-86.475629 32.454201,-86.475515 32.454082,-86.475306 32.453849,-86.475196 32.453745,-86.475076 32.453648,-86.474881 32.453513,-86.474208 32.4531,-86.474155 32.453069)\r\n127;101;odd;Magnolia Dr;Autauga;AL;36067;LINESTRING(-86.454957 32.470922,-86.454591 32.470769,-86.453775 32.470398,-86.453567 32.470284,-86.453509 32.470251)\r\n130;100;even;Magnolia Dr;Autauga;AL;36067;LINESTRING(-86.454872 32.47107,-86.454501 32.470919,-86.453671 32.470546,-86.453455 32.470422,-86.453397 32.470385)\r\n701;799;all;Clay Dr;Autauga;AL;36067;LINESTRING(-86.70697 32.519942,-86.70679 32.520019)\r\n1500;2498;even;Ada Ln;Autauga;AL;36067;LINESTRING(-86.639561 32.53079,-86.640133 32.530767,-86.640284 32.530785,-86.640539 32.530831,-86.640816 32.530842,-86.641093 32.530871,-86.641917 32.530941,-86.642171 32.530954,-86.642563 32.530932,-86.642845 32.530919,-86.642966 32.5309,-86.643128 32.530919,-86.643447 32.530967,-86.643683 32.530991,-86.643922 32.531032,-86.644168 32.531096,-86.6444 32.531168,-86.64453 32.531181,-86.644651 32.531195,-86.644724 32.531194,-86.644805 32.531183,-86.644867 32.531128,-86.644908 32.531108,-86.64496 32.531095,-86.645161 32.530922,-86.645223 32.53088)\r\n2301;2499;odd;Ada Ln;Autauga;AL;36067;LINESTRING(-86.63955 32.530626,-86.640143 32.530595,-86.640318 32.530621,-86.640565 32.530657,-86.640834 32.530672,-86.641115 32.530705,-86.641933 32.530775,-86.642171 32.53079,-86.642549 32.530768,-86.642823 32.530749,-86.642964 32.530734,-86.643158 32.530753,-86.643477 32.530799,-86.643715 32.530823,-86.643974 32.530864,-86.64423 32.530938,-86.644452 32.530996,-86.64456 32.531017,-86.644653 32.531029,-86.644684 32.53102,-86.644699 32.531009,-86.644747 32.530988,-86.64481 32.530952,-86.644832 32.530937,-86.645027 32.530778,-86.645123 32.530739)\r\n2429;2445;all;Autauga County 65;Autauga;AL;36091;LINESTRING(-86.5578 32.64765,-86.557853 32.647778,-86.558009 32.648118,-86.558166 32.648467,-86.558246 32.648685,-86.558266 32.648765,-86.558294 32.648914,-86.558298 32.649137,-86.558261 32.649353,-86.558184 32.649783,-86.558163 32.649992,-86.558175 32.650341,-86.558175 32.650388)\r\n1815;1801;odd;Pendlebrook Dr;Autauga;AL;36066;LINESTRING(-86.422452 32.494897,-86.42298 32.494913,-86.424119 32.494901)\r\n1814;1800;even;Pendlebrook Dr;Autauga;AL;36066;LINESTRING(-86.422459 32.494732,-86.422982 32.494747,-86.424117 32.494736)\r\n900;998;even;Evelyn Dr;Autauga;AL;36003;LINESTRING(-86.765389 32.523343,-86.765435 32.523347,-86.765699 32.523342,-86.765867 32.523336,-86.766015 32.523357,-86.76607 32.523373,-86.766081 32.52337)\r\n901;999;odd;Evelyn Dr;Autauga;AL;36003;LINESTRING(-86.765402 32.523178,-86.765441 32.523179,-86.765693 32.523176,-86.765871 32.523168,-86.766067 32.523175,-86.76617 32.523213,-86.766189 32.523233)\r\n498;450;all;Bob Owens Dr;Autauga;AL;36067;LINESTRING(-86.482849 32.528935,-86.482868 32.528995,-86.482883 32.529049,-86.482894 32.529185,-86.482889 32.529761,-86.48289 32.530049,-86.482872 32.53048,-86.482861 32.531059,-86.482867 32.531348,-86.482859 32.531779,-86.482876 32.532504,-86.482879 32.532526)\r\n499;401;odd;West Dr;Autauga;AL;36067;LINESTRING(-86.488873 32.48063,-86.48886 32.48058,-86.488814 32.480505,-86.488684 32.480316,-86.488589 32.480126,-86.488556 32.479997,-86.488552 32.479774,-86.488498 32.479616,-86.488414 32.479484,-86.488336 32.479292,-86.488315 32.479094,-86.488313 32.478982)\r\n498;400;even;West Dr;Autauga;AL;36067;LINESTRING(-86.488688 32.480681,-86.488668 32.480646,-86.488636 32.480585,-86.488502 32.480396,-86.488383 32.480182,-86.488348 32.480017,-86.488338 32.479802,-86.4883 32.479682,-86.488228 32.479554,-86.488118 32.47933,-86.488117 32.479098,-86.488118 32.478983)\r\n998;892;even;Co Rd 108;Autauga;AL;36051;LINESTRING(-86.603617 32.704747,-86.603492 32.704674,-86.603432 32.704635,-86.603376 32.70459,-86.60332 32.70454,-86.603274 32.704488,-86.603231 32.704433,-86.603198 32.704377,-86.603169 32.704318,-86.603147 32.704254,-86.603058 32.703901,-86.603012 32.703757,-86.602979 32.703683,-86.602935 32.703611,-86.602886 32.703543,-86.602827 32.703483,-86.602767 32.703424,-86.602696 32.70337,-86.602624 32.70332,-86.602474 32.703236,-86.602242 32.703129,-86.601856 32.702973,-86.601473 32.702817,-86.601386 32.70279,-86.6013 32.702769,-86.60121 32.70275,-86.601115 32.70274,-86.601022 32.702742,-86.600929 32.70275,-86.600839 32.70277,-86.600432 32.702903,-86.599779 32.703092,-86.599534 32.703175,-86.599371 32.703241,-86.599223 32.703331,-86.59915 32.703381,-86.599083 32.703437,-86.598961 32.70355,-86.598857 32.703675,-86.598771 32.703809,-86.59858 32.704132,-86.598542 32.704186,-86.598494 32.704237,-86.598263 32.704445,-86.598149 32.704557,-86.597993 32.704736,-86.59717 32.705853,-86.596985 32.706089,-86.596838 32.706252,-86.596732 32.706346,-86.596704 32.706372)\r\n1099;801;odd;Co Rd 108;Autauga;AL;36091;LINESTRING(-86.603511 32.704885,-86.603372 32.704814,-86.6033 32.704763,-86.603232 32.70471,-86.60317 32.70465,-86.603106 32.70459,-86.603055 32.704519,-86.60301 32.704449,-86.602977 32.704372,-86.602951 32.704296,-86.602862 32.703941,-86.602818 32.703811,-86.602791 32.703753,-86.602757 32.703695,-86.602718 32.703643,-86.602673 32.703591,-86.602621 32.703544,-86.602564 32.703498,-86.602504 32.703458,-86.602368 32.703382,-86.60215 32.703279,-86.601772 32.703123,-86.601393 32.702975,-86.601322 32.702952,-86.601248 32.702933,-86.601174 32.70292,-86.601105 32.702912,-86.601036 32.702914,-86.600967 32.702922,-86.600901 32.702936,-86.6005 32.703059,-86.599849 32.70325,-86.599618 32.703331,-86.599477 32.703393,-86.599345 32.703467,-86.599286 32.703509,-86.599229 32.703555,-86.599123 32.703658,-86.599031 32.703767,-86.598949 32.703887,-86.59876 32.704216,-86.598708 32.704282,-86.598652 32.704349,-86.598411 32.704559,-86.598307 32.704663,-86.598161 32.704832,-86.597336 32.705943,-86.597149 32.706187,-86.596996 32.706362,-86.596874 32.706476,-86.596825 32.706501)\r\n1599;1549;odd;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.548962 32.502543,-86.547975 32.50252,-86.54737 32.502514,-86.547021 32.502524,-86.546758 32.502549,-86.546556 32.502576)\r\n1544;1540;even;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.548957 32.502707,-86.547971 32.502686,-86.547372 32.50268,-86.547035 32.502694,-86.546784 32.502715,-86.546585 32.502739)\r\n1658;1698;even;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.664343 32.606259,-86.664351 32.606351,-86.664382 32.606496,-86.664449 32.606711,-86.664483 32.606785,-86.66452 32.606856,-86.664568 32.606923,-86.664623 32.606989,-86.664687 32.607046,-86.664753 32.6071,-86.664825 32.607149,-86.664903 32.607191,-86.66513 32.607298,-86.666129 32.607691,-86.667012 32.60806,-86.667091 32.608095)\r\n1659;1699;odd;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.664536 32.606241,-86.664551 32.606327,-86.66458 32.606458,-86.664643 32.606659,-86.664669 32.606719,-86.664702 32.606776,-86.664738 32.606829,-86.664783 32.606879,-86.664831 32.606926,-86.664887 32.60697,-86.664945 32.607009,-86.665007 32.607045,-86.665222 32.607146,-86.666215 32.607541,-86.667106 32.60791,-86.667188 32.607952)\r\n2000;2016;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.58481 32.502966,-86.584862 32.503101,-86.585569 32.504963,-86.585584 32.505)\r\n2058;2098;even;Calvin Loop;Autauga;AL;36006;LINESTRING(-86.715696 32.659999,-86.715382 32.659835,-86.71517 32.659725,-86.71514 32.659716,-86.715088 32.659692,-86.715 32.659665,-86.714908 32.659636,-86.71473 32.659622,-86.71456 32.659613,-86.714383 32.659611,-86.713265 32.659612,-86.712915 32.659602,-86.712816 32.659605,-86.71255 32.659646,-86.712207 32.659728,-86.712119 32.659759,-86.711949 32.659822,-86.711866 32.65987,-86.711665 32.659988,-86.711549 32.660022,-86.711399 32.660027,-86.711218 32.660018,-86.711022 32.660011,-86.710894 32.660041,-86.710782 32.660125,-86.710778 32.660188)\r\n2001;2099;odd;Calvin Loop;Autauga;AL;36006;LINESTRING(-86.715593 32.660139,-86.71528 32.659977,-86.715076 32.659879,-86.715054 32.659868,-86.715006 32.65985,-86.714934 32.659825,-86.714862 32.65981,-86.714712 32.65979,-86.714552 32.659781,-86.714381 32.659777,-86.713263 32.659778,-86.712919 32.65977,-86.712842 32.659777,-86.712596 32.659814,-86.712273 32.659892,-86.712197 32.659915,-86.712049 32.659976,-86.711982 32.66001,-86.711769 32.660154,-86.711583 32.660206,-86.711391 32.660195,-86.711212 32.660186,-86.711056 32.660195,-86.71101 32.660211,-86.710984 32.660233,-86.710964 32.660236)\r\n1691;1601;odd;Cumberland Dr;Autauga;AL;36066;LINESTRING(-86.426084 32.469873,-86.426096 32.470188)\r\n1684;1600;even;Cumberland Dr;Autauga;AL;36066;LINESTRING(-86.426278 32.469868,-86.42629 32.470183)\r\n1216;1298;even;Old Ridge Rd;Autauga;AL;36066;LINESTRING(-86.43304 32.505114,-86.43292 32.50515,-86.432771 32.505183,-86.432697 32.505192,-86.432364 32.505208,-86.431855 32.505209,-86.431606 32.5052,-86.431442 32.505187,-86.431283 32.505164,-86.431127 32.505132,-86.430971 32.505091,-86.430344 32.504896)\r\n1217;1299;odd;Old Ridge Rd;Autauga;AL;36066;LINESTRING(-86.433115 32.505266,-86.432986 32.505318,-86.432809 32.505353,-86.432715 32.505362,-86.43237 32.505378,-86.431851 32.505377,-86.431592 32.50537,-86.431416 32.505355,-86.431243 32.505332,-86.431071 32.505296,-86.430905 32.505249,-86.430276 32.50505)\r\n489;331;odd;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.516927 32.392024,-86.517326 32.392482,-86.518123 32.393348,-86.519151 32.394419,-86.519414 32.394704,-86.51956 32.394879,-86.519738 32.395121,-86.51986 32.395311,-86.519972 32.395503,-86.520039 32.395633,-86.52013 32.395832,-86.520184 32.395966,-86.520255 32.396173,-86.520332 32.396451,-86.520376 32.396659,-86.520415 32.396945,-86.520427 32.397088,-86.520443 32.397452,-86.520466 32.399395,-86.520479 32.400611,-86.520481 32.401072)\r\n490;330;even;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.517084 32.391926,-86.517482 32.392382,-86.518277 32.393244,-86.519305 32.394315,-86.519574 32.394604,-86.519728 32.394785,-86.51991 32.395037,-86.520036 32.395233,-86.52015 32.395433,-86.520223 32.395567,-86.520318 32.395774,-86.520372 32.395916,-86.520447 32.396129,-86.520528 32.396417,-86.520576 32.396635,-86.520613 32.396931,-86.520623 32.39708,-86.520639 32.397448,-86.52066 32.399393,-86.520675 32.400609,-86.520676 32.401071)\r\n3679;3787;all;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.794944 32.598516,-86.795028 32.598557,-86.79519 32.598629,-86.795517 32.598747,-86.795678 32.598794,-86.795842 32.598833,-86.796171 32.59889,-86.796425 32.598918,-86.797201 32.598975,-86.798051 32.599029,-86.79891 32.599089,-86.798968 32.599093)\r\n200;398;even;Driver Rd;Autauga;AL;36022;LINESTRING(-86.435933 32.527718,-86.436059 32.527831,-86.436108 32.52788,-86.436309 32.528113,-86.436468 32.528284,-86.436672 32.528513,-86.436816 32.528687,-86.437087 32.529054,-86.437188 32.529176,-86.437398 32.529402,-86.437437 32.529455,-86.437469 32.52951,-86.437489 32.529566,-86.437503 32.529623,-86.437511 32.529684,-86.437491 32.529894,-86.437469 32.530325,-86.437433 32.530758,-86.437421 32.531049,-86.437425 32.531202,-86.437452 32.531353,-86.437495 32.531501,-86.437548 32.531644,-86.437612 32.531783,-86.437845 32.532173,-86.438173 32.532681,-86.438285 32.532872,-86.438346 32.532999,-86.438393 32.533129,-86.438428 32.533263,-86.438537 32.53383,-86.438644 32.534328,-86.438692 32.534608,-86.438704 32.534747,-86.438706 32.534885,-86.43869 32.535095,-86.438604 32.535739,-86.438573 32.536104,-86.438561 32.536464,-86.438547 32.536603,-86.438523 32.53674,-86.438455 32.537024,-86.438428 32.537173,-86.438414 32.537347)\r\n201;399;odd;Driver Rd;Autauga;AL;36022;LINESTRING(-86.436072 32.527602,-86.436211 32.527715,-86.436268 32.527776,-86.436467 32.528013,-86.436624 32.528182,-86.43683 32.528415,-86.436984 32.528593,-86.437253 32.52896,-86.437348 32.529074,-86.437564 32.529302,-86.437617 32.529369,-86.437659 32.529444,-86.437693 32.529522,-86.437707 32.529605,-86.437707 32.529686,-86.437689 32.529904,-86.437665 32.530335,-86.437631 32.530766,-86.437617 32.531049,-86.437629 32.531186,-86.437652 32.531321,-86.437689 32.531455,-86.437738 32.531588,-86.437798 32.531713,-86.438021 32.532095,-86.438349 32.532603,-86.438469 32.5328,-86.438538 32.532941,-86.438589 32.533087,-86.438624 32.533233,-86.438731 32.533802,-86.43884 32.5343,-86.438892 32.53459,-86.438906 32.534741,-86.438906 32.534891,-86.438888 32.535111,-86.438802 32.535755,-86.438771 32.536112,-86.438759 32.536472,-86.438747 32.536623,-86.438719 32.53677,-86.438651 32.537054,-86.438628 32.537193,-86.438608 32.537361)\r\n834;884;even;Autauga County 113;Autauga;AL;36067;LINESTRING(-86.590307 32.524087,-86.590316 32.524209,-86.590395 32.524639,-86.590448 32.525066,-86.590468 32.525356,-86.59051 32.525649,-86.590541 32.525797,-86.590582 32.525944,-86.5907 32.526227,-86.590771 32.526367,-86.590852 32.526503,-86.590904 32.526572,-86.591016 32.526693,-86.591083 32.52675,-86.591153 32.526801,-86.591292 32.526897,-86.591586 32.527044,-86.592211 32.52741,-86.592379 32.527504)\r\n867;883;odd;Autauga County 113;Autauga;AL;36067;LINESTRING(-86.590501 32.524073,-86.590516 32.524189,-86.590593 32.524617,-86.590646 32.525052,-86.590668 32.52534,-86.590708 32.525625,-86.590737 32.525761,-86.590778 32.525896,-86.590888 32.526165,-86.590953 32.526295,-86.591028 32.526417,-86.59107 32.526472,-86.59117 32.526579,-86.591223 32.526626,-86.591281 32.526671,-86.59141 32.526753,-86.591696 32.526902,-86.592321 32.527272,-86.592487 32.527367)\r\n500;504;all;Mockingbird Ct;Autauga;AL;36067;LINESTRING(-86.486661 32.478742,-86.486584 32.478743,-86.486286 32.478744,-86.486263 32.478747)\r\n100;198;even;E 5th St;Autauga;AL;36067;LINESTRING(-86.472151 32.464154,-86.470185 32.464012,-86.469585 32.463965)\r\n101;199;odd;E 5th St;Autauga;AL;36067;LINESTRING(-86.472134 32.464318,-86.470167 32.464176,-86.469567 32.464128)\r\n199;101;odd;N Wildwood Dr;Autauga;AL;36067;LINESTRING(-86.455556 32.465921,-86.455542 32.465752,-86.455528 32.46517,-86.455511 32.464709)\r\n198;100;even;N Wildwood Dr;Autauga;AL;36067;LINESTRING(-86.455362 32.465935,-86.455342 32.46576,-86.455332 32.465174,-86.455316 32.464714)\r\n900;998;all;Nobles Ln;Autauga;AL;36067;LINESTRING(-86.48346 32.444693,-86.483434 32.444714,-86.483316 32.444809,-86.483257 32.444862,-86.482944 32.445117,-86.482828 32.445224,-86.482711 32.445318,-86.482603 32.445423,-86.482491 32.445522,-86.48248 32.445517)\r\n200;298;all;Cherry Hill Rd;Autauga;AL;36703;LINESTRING(-86.820432 32.455051,-86.820518 32.455109,-86.821462 32.455728,-86.821735 32.455912,-86.821991 32.456112,-86.822357 32.456424,-86.822603 32.456623,-86.822857 32.456815,-86.822986 32.456904,-86.82312 32.456986,-86.823482 32.457178,-86.823701 32.4573,-86.823921 32.457428,-86.824055 32.457538,-86.824174 32.457664,-86.824258 32.457809,-86.824312 32.457958,-86.824346 32.458109,-86.824357 32.458188,-86.824375 32.458405,-86.824401 32.458536,-86.824451 32.458655,-86.824484 32.4587,-86.824649 32.458847,-86.824708 32.458888,-86.824842 32.458964,-86.824909 32.458993,-86.825058 32.459043,-86.825212 32.45908,-86.82554 32.459139,-86.826201 32.45924,-86.826366 32.459259,-86.8267 32.459287,-86.827037 32.4593,-86.827203 32.459299,-86.827369 32.459292,-86.827534 32.45928,-86.827697 32.459261,-86.828027 32.459208,-86.828355 32.459148,-86.828854 32.45904,-86.829027 32.45901,-86.829203 32.458992,-86.829551 32.458979,-86.830061 32.458964,-86.831159 32.458889,-86.831556 32.458863)\r\n100;198;all;Antelope Cir;Autauga;AL;36067;LINESTRING(-86.474231 32.454603,-86.474237 32.454557,-86.474258 32.454388)\r\n3258;3298;even;State Rte 14;Autauga;AL;36003;LINESTRING(-86.733688 32.451004,-86.73456 32.451058,-86.735412 32.451097,-86.736268 32.451125,-86.737726 32.451162,-86.739571 32.45118)\r\n3259;3299;odd;State Rte 14;Autauga;AL;36003;LINESTRING(-86.733702 32.45084,-86.734572 32.450892,-86.735422 32.450931,-86.736274 32.450959,-86.73773 32.450996,-86.739573 32.451015)\r\n1256;1298;even;Cross Creek Rd;Autauga;AL;36067;LINESTRING(-86.47227 32.493187,-86.472073 32.493193,-86.471809 32.493187,-86.471524 32.493212,-86.471429 32.493273,-86.471352 32.49333,-86.471288 32.493412,-86.471253 32.493498,-86.471243 32.493586,-86.471223 32.496061,-86.471211 32.496118,-86.471172 32.496237)\r\n1201;1299;odd;Cross Creek Rd;Autauga;AL;36067;LINESTRING(-86.472279 32.493352,-86.472077 32.493361,-86.471823 32.493361,-86.471606 32.493396,-86.471559 32.493413,-86.471518 32.493448,-86.471482 32.493494,-86.471461 32.49354,-86.471449 32.493598,-86.471429 32.496075,-86.471417 32.49616,-86.471357 32.496289)\r\n2330;2398;all;Autauga County 77;Autauga;AL;36006;LINESTRING(-86.700077 32.656373,-86.700088 32.656418,-86.700152 32.656594,-86.700186 32.656697,-86.700292 32.656942,-86.700366 32.657111,-86.700445 32.657247,-86.700572 32.657431,-86.700739 32.657677)\r\n501;497;odd;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.513239 32.386929,-86.513285 32.387133,-86.513359 32.387347,-86.513473 32.387628,-86.513581 32.387833,-86.513661 32.387965,-86.513829 32.388225,-86.514018 32.388473,-86.514869 32.389515)\r\n598;544;even;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.51343 32.386896,-86.513481 32.387093,-86.513549 32.387295,-86.513661 32.387566,-86.513761 32.387761,-86.513835 32.387887,-86.514001 32.388139,-86.514182 32.388381,-86.515029 32.389422)\r\n498;400;all;Autauga County 9;Autauga;AL;36003;LINESTRING(-86.761234 32.42363,-86.761196 32.423791,-86.761149 32.423933,-86.761097 32.424074,-86.761037 32.424212,-86.760902 32.424472,-86.76079 32.424648,-86.76078 32.424659)\r\n699;603;odd;Sheila Blvd;Autauga;AL;36066;LINESTRING(-86.425906 32.458311,-86.425988 32.458194,-86.426087 32.457983,-86.426131 32.457832,-86.426151 32.457609,-86.42615 32.457393,-86.426155 32.457239)\r\n698;610;even;Sheila Blvd;Autauga;AL;36066;LINESTRING(-86.425736 32.458232,-86.425802 32.45812,-86.425889 32.457931,-86.425925 32.457804,-86.425949 32.457601,-86.425952 32.457389,-86.42596 32.457233)\r\n100;198;even;Winchester Ct;Autauga;AL;36067;LINESTRING(-86.475054 32.449756,-86.47506 32.450263)\r\n101;199;odd;Winchester Ct;Autauga;AL;36067;LINESTRING(-86.475249 32.449755,-86.475255 32.450262)\r\n420;498;even;Utah Ct;Autauga;AL;36067;LINESTRING(-86.489362 32.477797,-86.489442 32.477797)\r\n419;499;odd;Utah Ct;Autauga;AL;36067;LINESTRING(-86.489362 32.477633,-86.489442 32.477633)\r\n1227;1205;all;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.416661 32.503506,-86.416654 32.5035,-86.416306 32.503473,-86.415963 32.503459,-86.415277 32.503454,-86.414762 32.503465,-86.414081 32.503497,-86.412882 32.503567)\r\n1649;1699;all;Autauga County 79;Autauga;AL;36006;LINESTRING(-86.712958 32.571384,-86.712418 32.572089,-86.712148 32.572457,-86.711852 32.572894,-86.711738 32.573084,-86.711638 32.573279,-86.711555 32.573478,-86.711513 32.573612,-86.711483 32.573748,-86.711452 32.573957,-86.711331 32.575101,-86.711294 32.575535,-86.71126 32.575826,-86.711157 32.5764,-86.711047 32.576903,-86.710991 32.577117,-86.710937 32.577261,-86.71084 32.57747,-86.710729 32.577671,-86.710555 32.577928,-86.710456 32.578053,-86.710348 32.578172,-86.710248 32.578267)\r\n1266;1298;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.633555 32.563432,-86.633665 32.563326,-86.633838 32.563177,-86.634025 32.563039,-86.634224 32.562915,-86.634363 32.562841,-86.634505 32.562776,-86.634735 32.562689,-86.635051 32.562596,-86.635209 32.562563,-86.635455 32.562528,-86.635702 32.562505,-86.635948 32.562496,-86.636279 32.56251,-86.636607 32.562548,-86.639096 32.562885)\r\n1249;1251;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.633406 32.563327,-86.633515 32.563212,-86.633698 32.563051,-86.633899 32.562907,-86.63411 32.562773,-86.634261 32.562693,-86.634417 32.562624,-86.634659 32.562529,-86.634993 32.56243,-86.635169 32.562397,-86.635427 32.56236,-86.635688 32.562333,-86.63595 32.56233,-86.636299 32.562338,-86.636637 32.562384,-86.639127 32.562722)\r\n2399;2301;odd;Family Rd;Autauga;AL;36003;LINESTRING(-86.651905 32.439453,-86.651418 32.439426,-86.651133 32.439403,-86.650769 32.43938,-86.650707 32.439363,-86.650597 32.439333,-86.650465 32.439305,-86.650332 32.439298,-86.650211 32.439315,-86.650184 32.439329)\r\n2398;2300;even;Family Rd;Autauga;AL;36003;LINESTRING(-86.651892 32.439617,-86.651402 32.439592,-86.651119 32.439571,-86.650713 32.439568,-86.650629 32.439525,-86.650541 32.439499,-86.650433 32.439479,-86.650342 32.43947,-86.650267 32.439485,-86.650251 32.439484)\r\n600;610;even;McQueen Village Rd;Autauga;AL;36066;LINESTRING(-86.418185 32.463172,-86.418278 32.463174)\r\n601;611;odd;McQueen Village Rd;Autauga;AL;36066;LINESTRING(-86.418189 32.463007,-86.418282 32.463009)\r\n700;706;all;S McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.418177 32.460393,-86.418179 32.460383,-86.418177 32.460309)\r\n2897;2899;all;Autauga County 65;Autauga;AL;36091;LINESTRING(-86.554032 32.694128,-86.553959 32.694162,-86.553878 32.694146)\r\n119;101;odd;Quail Run;Autauga;AL;36067;LINESTRING(-86.474135 32.454698,-86.474129 32.454694,-86.474056 32.454706,-86.473889 32.45474,-86.473393 32.454845,-86.473327 32.454856,-86.473267 32.454841,-86.473204 32.454824,-86.473148 32.454796,-86.4731 32.454761,-86.473062 32.45472,-86.473035 32.454675,-86.47302 32.454624,-86.473011 32.454573,-86.473021 32.454517,-86.473055 32.454388,-86.473126 32.454189,-86.473261 32.45391,-86.473276 32.453732,-86.473254 32.453623,-86.473073 32.453431,-86.472938 32.453332,-86.472887 32.45329)\r\n120;100;even;Quail Run;Autauga;AL;36067;LINESTRING(-86.474196 32.454855,-86.474177 32.454866,-86.474094 32.454874,-86.473935 32.454902,-86.473429 32.455019,-86.473323 32.455022,-86.473215 32.455017,-86.473118 32.454984,-86.473028 32.454944,-86.472948 32.454887,-86.47288 32.454818,-86.472835 32.454737,-86.472808 32.454652,-86.472809 32.454565,-86.472821 32.454485,-86.472861 32.454344,-86.472934 32.454133,-86.473049 32.453866,-86.47307 32.453744,-86.473048 32.453707,-86.472917 32.453551,-86.472802 32.453452,-86.47275 32.453407)\r\n400;498;even;Mt Airy Dr;Autauga;AL;36067;LINESTRING(-86.462097 32.47428,-86.461979 32.47455,-86.461903 32.474761,-86.46187 32.474916,-86.461872 32.475139,-86.461877 32.475355,-86.461868 32.475715,-86.461869 32.475933,-86.461879 32.47622,-86.46188 32.476271)\r\n401;499;odd;Mt Airy Dr;Autauga;AL;36067;LINESTRING(-86.46228 32.474336,-86.462169 32.474602,-86.462103 32.474801,-86.462078 32.474932,-86.462066 32.475139,-86.462071 32.475355,-86.462064 32.475717,-86.462065 32.475931,-86.462075 32.476218,-86.462075 32.47627)\r\n101;199;odd;Lisa Ct;Autauga;AL;36022;LINESTRING(-86.415242 32.588091,-86.415168 32.588085,-86.415082 32.588105)\r\n100;198;even;Lisa Ct;Autauga;AL;36022;LINESTRING(-86.415244 32.588256,-86.415188 32.588263,-86.415117 32.588267)\r\n299;219;odd;Toby Ln;Autauga;AL;36067;LINESTRING(-86.50905 32.469038,-86.509054 32.469124)\r\n298;282;even;Toby Ln;Autauga;AL;36067;LINESTRING(-86.509244 32.469031,-86.509248 32.469117)\r\n329;399;all;Autauga County 104;Autauga;AL;36022;LINESTRING(-86.43481 32.565285,-86.434519 32.565105,-86.434178 32.564883,-86.434043 32.564792,-86.434023 32.564777)\r\n1424;1498;even;Mims Ln;Autauga;AL;36066;LINESTRING(-86.449343 32.516489,-86.449271 32.516519,-86.449291 32.516642,-86.4493 32.516923,-86.449302 32.517578)\r\n1425;1499;odd;Mims Ln;Autauga;AL;36066;LINESTRING(-86.449454 32.516624,-86.449497 32.516611,-86.449489 32.516634,-86.449496 32.516921,-86.449497 32.517577)\r\n310;316;even;E Poplar St;Autauga;AL;36066;LINESTRING(-86.438138 32.465476,-86.438154 32.465424,-86.438041 32.465253,-86.437805 32.465126,-86.437464 32.464891,-86.437272 32.46483,-86.437022 32.464829)\r\n315;317;odd;E Poplar St;Autauga;AL;36066;LINESTRING(-86.437944 32.465464,-86.437932 32.465468,-86.437871 32.465385,-86.437687 32.46526,-86.437356 32.465055,-86.437226 32.465014,-86.437012 32.464994)\r\n1600;1698;even;Crawford Ln;Autauga;AL;36022;LINESTRING(-86.420776 32.53403,-86.420776 32.534022,-86.420747 32.533954,-86.420729 32.533887,-86.420704 32.533851)\r\n1699;1601;odd;Crawford Ln;Autauga;AL;36022;LINESTRING(-86.4206 32.534101,-86.42059 32.53409,-86.420551 32.534006,-86.420531 32.533943,-86.420524 32.533914)\r\n600;698;even;E 6th St;Autauga;AL;36067;LINESTRING(-86.457305 32.468384,-86.457138 32.468363,-86.456878 32.468339,-86.456616 32.468341,-86.455768 32.468358,-86.455087 32.468364,-86.454911 32.468373,-86.454801 32.468386)\r\n623;699;odd;E 6th St;Autauga;AL;36067;LINESTRING(-86.457278 32.468547,-86.457114 32.468529,-86.456868 32.468511,-86.456618 32.468507,-86.455772 32.468524,-86.455095 32.468532,-86.454929 32.468541,-86.454825 32.46855)\r\n949;501;all;Langford Ct;Autauga;AL;36067;LINESTRING(-86.458667 32.429218,-86.458635 32.42924,-86.458552 32.429377,-86.45848 32.429514,-86.458451 32.429593,-86.458416 32.429744,-86.458392 32.429893,-86.458392 32.429972,-86.458407 32.430264,-86.458403 32.43033,-86.45836 32.430686,-86.458346 32.430751,-86.458327 32.430814,-86.458273 32.430938,-86.458277 32.430944)\r\n2899;2801;odd;Wyatt Rd;Autauga;AL;36067;LINESTRING(-86.681206 32.575952,-86.681129 32.575947,-86.679733 32.575942,-86.679134 32.575928,-86.678965 32.575926,-86.678551 32.575913,-86.678459 32.575906,-86.678322 32.575947)\r\n2898;2800;even;Wyatt Rd;Autauga;AL;36067;LINESTRING(-86.681196 32.576116,-86.681123 32.576115,-86.679729 32.576108,-86.67913 32.576094,-86.678959 32.576092,-86.678549 32.576079,-86.678489 32.576088,-86.678374 32.576106)\r\n901;999;odd;Seamon St;Autauga;AL;36067;LINESTRING(-86.491027 32.475287,-86.490863 32.475304,-86.490785 32.47531,-86.490617 32.475309,-86.490267 32.475319,-86.490103 32.475332,-86.489957 32.475311,-86.489814 32.475268,-86.489668 32.475202,-86.489449 32.475084,-86.489366 32.475047,-86.48928 32.475015,-86.489185 32.474985,-86.488934 32.474949,-86.488895 32.474944)\r\n998;900;even;Seamon St;Autauga;AL;36067;LINESTRING(-86.491056 32.475449,-86.490885 32.475474,-86.490791 32.475478,-86.490619 32.475475,-86.490279 32.475487,-86.490103 32.475496,-86.489905 32.475493,-86.489726 32.475424,-86.489566 32.475348,-86.489347 32.475232,-86.489278 32.475201,-86.489206 32.475175,-86.489135 32.475157,-86.488876 32.475125,-86.48882 32.475096)\r\n1000;1092;even;Doster Rd;Autauga;AL;36067;LINESTRING(-86.449965 32.438701,-86.449791 32.438707,-86.448249 32.438882,-86.447739 32.438922,-86.447051 32.438958,-86.446708 32.438968,-86.446194 32.438975,-86.444474 32.438976,-86.44404 32.438986,-86.443866 32.438999,-86.443691 32.439017,-86.443518 32.43904,-86.443343 32.439072,-86.443181 32.439121,-86.443012 32.439166,-86.442768 32.439246,-86.442607 32.439306,-86.442504 32.439352)\r\n1001;1099;odd;Doster Rd;Autauga;AL;36067;LINESTRING(-86.449978 32.438865,-86.449811 32.438877,-86.448271 32.439048,-86.447755 32.439088,-86.447061 32.439124,-86.446712 32.439134,-86.446196 32.439141,-86.444478 32.439142,-86.444052 32.439154,-86.443886 32.439165,-86.443719 32.439183,-86.443556 32.439206,-86.443397 32.439238,-86.443241 32.439277,-86.44308 32.439324,-86.442844 32.439402,-86.442693 32.439458,-86.442592 32.439499)\r\n3620;3600;all;Autauga County 22;Autauga;AL;36758;LINESTRING(-86.80474 32.622163,-86.804626 32.622435,-86.804025 32.623995,-86.803956 32.6242,-86.80388 32.624473,-86.803846 32.624675,-86.803839 32.624713)\r\n699;601;all;Autauga County 32;Autauga;AL;36091;LINESTRING(-86.587463 32.688285,-86.5875 32.68828,-86.587609 32.688253)\r\n3550;3598;even;US Hwy 82;Autauga;AL;36006;LINESTRING(-86.760728 32.645055,-86.760749 32.645069,-86.76109 32.645284,-86.761292 32.645417,-86.761551 32.645601,-86.761803 32.645793,-86.762046 32.645992,-86.762284 32.646203,-86.762625 32.64653,-86.762808 32.64672)\r\n3529;3599;odd;US Hwy 82;Autauga;AL;36006;LINESTRING(-86.76084 32.64492,-86.760865 32.644933,-86.76121 32.645152,-86.761418 32.645287,-86.761681 32.645475,-86.761939 32.645671,-86.762188 32.645874,-86.76243 32.646089,-86.762777 32.646422,-86.76296 32.646617)\r\n2706;2766;even;Autauga County 65;Autauga;AL;36091;LINESTRING(-86.5635 32.670739,-86.563541 32.670862,-86.563602 32.671069,-86.563614 32.671133,-86.563622 32.671195,-86.563613 32.671258,-86.563602 32.671319,-86.563584 32.671379,-86.563556 32.671443,-86.563426 32.671704,-86.563165 32.672154,-86.562952 32.672555,-86.562858 32.672766,-86.562812 32.672913,-86.562663 32.673547,-86.562639 32.673606,-86.562609 32.673661,-86.562571 32.673715,-86.562526 32.673765,-86.562418 32.673866,-86.56217 32.674056,-86.56204 32.674142,-86.561549 32.674426,-86.5612 32.674638,-86.561063 32.674737,-86.560998 32.674797,-86.560939 32.674859,-86.560856 32.674986,-86.560701 32.675237,-86.560388 32.675754,-86.560143 32.676131,-86.56001 32.676311,-86.559559 32.676844,-86.559357 32.677067,-86.558747 32.677664,-86.558579 32.677839,-86.558482 32.677971,-86.5584 32.67811,-86.558332 32.678255,-86.558282 32.678404,-86.55824 32.67861,-86.558172 32.678876,-86.558126 32.679007,-86.558042 32.679204,-86.557878 32.679564)\r\n2707;2767;odd;Autauga County 65;Autauga;AL;36091;LINESTRING(-86.563686 32.670692,-86.563733 32.670816,-86.563804 32.671035,-86.563816 32.671115,-86.563818 32.671193,-86.563819 32.671276,-86.563802 32.671357,-86.563774 32.671431,-86.563744 32.671505,-86.563608 32.671774,-86.563345 32.672226,-86.563138 32.672619,-86.563052 32.672818,-86.563008 32.672951,-86.562863 32.673591,-86.562831 32.673672,-86.562789 32.673743,-86.562739 32.673811,-86.562684 32.673875,-86.562562 32.673988,-86.5623 32.674186,-86.56216 32.67428,-86.561663 32.674562,-86.561326 32.674772,-86.561205 32.674861,-86.561154 32.674907,-86.561111 32.674957,-86.56103 32.675068,-86.560875 32.675313,-86.560562 32.675832,-86.560317 32.676217,-86.560176 32.676405,-86.559717 32.676942,-86.559513 32.677173,-86.558901 32.677772,-86.558747 32.677939,-86.55866 32.678055,-86.558586 32.67818,-86.558526 32.678311,-86.55848 32.678444,-86.558434 32.678642,-86.558368 32.678918,-86.558318 32.679061,-86.558226 32.679262,-86.55806 32.679624)\r\n1774;1700;even;Edinburgh St;Autauga;AL;36066;LINESTRING(-86.431679 32.478084,-86.431972 32.478069,-86.433668 32.478015,-86.433686 32.47801)\r\n1777;1761;odd;Edinburgh St;Autauga;AL;36066;LINESTRING(-86.431667 32.477919,-86.431962 32.477903,-86.433652 32.477845,-86.433662 32.477847)\r\n200;298;even;Hummingbird Dr;Autauga;AL;36022;LINESTRING(-86.480125 32.61661,-86.480067 32.616618,-86.479652 32.616665,-86.479387 32.616676,-86.479107 32.616753,-86.478907 32.616943,-86.478803 32.617161,-86.478811 32.617178)\r\n207;299;odd;Hummingbird Dr;Autauga;AL;36022;LINESTRING(-86.480171 32.61677,-86.480105 32.616788,-86.479672 32.616831,-86.479433 32.616856,-86.479237 32.616919,-86.479097 32.617045,-86.479013 32.617209,-86.479004 32.617202)\r\n8999;8901;all;Autauga County 153;Autauga;AL;36703;LINESTRING(-86.803142 32.379752,-86.803146 32.37993,-86.803159 32.380295,-86.803167 32.380951,-86.803164 32.381684,-86.803189 32.382769)\r\n853;833;all;Simuel Ln;Autauga;AL;36067;LINESTRING(-86.580319 32.561366,-86.580293 32.56137,-86.580136 32.561394,-86.579992 32.561435,-86.579865 32.5615,-86.579762 32.561586,-86.57968 32.561693,-86.579619 32.561816,-86.579574 32.56195,-86.579559 32.562015,-86.579538 32.562155,-86.579504 32.562508,-86.57946 32.563014)\r\n1058;1076;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.445636 32.453879,-86.445363 32.45359,-86.44516 32.453371)\r\n1000;1098;even;Autauga County 1;Autauga;AL;36749;LINESTRING(-86.801746 32.572497,-86.801432 32.572921,-86.801101 32.573345,-86.800807 32.573704,-86.798312 32.576656,-86.797815 32.577251)\r\n1001;1053;odd;Autauga County 1;Autauga;AL;36749;LINESTRING(-86.801911 32.572584,-86.801598 32.573011,-86.801265 32.573439,-86.800967 32.5738,-86.798472 32.576752,-86.797974 32.577346)\r\n2500;2652;even;Autauga County 67;Autauga;AL;36006;LINESTRING(-86.68454 32.681767,-86.684505 32.681787,-86.684084 32.682041,-86.683942 32.682131,-86.683805 32.682232,-86.683681 32.682344,-86.683571 32.682463,-86.683471 32.682585,-86.683208 32.682961,-86.682952 32.68334,-86.682871 32.683471,-86.682759 32.683669,-86.682694 32.683807,-86.682639 32.683949,-86.68259 32.684091,-86.682427 32.684656,-86.682204 32.685356,-86.682139 32.685642,-86.682093 32.685929,-86.682081 32.686074,-86.682069 32.686503,-86.68206 32.686639,-86.682007 32.687053,-86.68198 32.687193,-86.681942 32.687333,-86.681808 32.68791,-86.681762 32.688126,-86.681749 32.688201,-86.681739 32.688352,-86.681742 32.688505,-86.681767 32.688655,-86.681953 32.689362,-86.681966 32.689427,-86.681985 32.689564,-86.681992 32.689701,-86.681976 32.689837,-86.681964 32.689903,-86.681926 32.690037,-86.681877 32.690167,-86.681815 32.690296,-86.681742 32.690419,-86.681659 32.690537,-86.681568 32.690652,-86.681468 32.690764,-86.681364 32.690869,-86.681136 32.691078,-86.680595 32.69153,-86.680244 32.69185,-86.679746 32.692343,-86.679243 32.692832,-86.67894 32.693133)\r\n2501;2631;odd;Autauga County 67;Autauga;AL;36006;LINESTRING(-86.684663 32.681895,-86.684627 32.681923,-86.684202 32.682175,-86.68407 32.682263,-86.683947 32.682356,-86.683835 32.682456,-86.683733 32.682563,-86.683641 32.682677,-86.683378 32.683045,-86.683126 32.68342,-86.683049 32.683545,-86.682943 32.683737,-86.682882 32.683865,-86.682829 32.683999,-86.682782 32.684135,-86.682617 32.684698,-86.6824 32.685394,-86.682337 32.68567,-86.682293 32.685947,-86.682281 32.686082,-86.682267 32.686509,-86.68226 32.686653,-86.682205 32.687075,-86.682178 32.687227,-86.682136 32.687369,-86.682002 32.68794,-86.681958 32.688152,-86.681949 32.688217,-86.681937 32.688354,-86.681946 32.688491,-86.681967 32.688625,-86.682147 32.689328,-86.682164 32.689401,-86.682187 32.68955,-86.682192 32.689705,-86.682176 32.689857,-86.682162 32.689935,-86.682122 32.690083,-86.682067 32.690225,-86.681999 32.690366,-86.681918 32.690501,-86.681829 32.690627,-86.68173 32.690748,-86.681626 32.69087,-86.681512 32.690981,-86.68128 32.691194,-86.680739 32.691646,-86.680392 32.691962,-86.679894 32.692451,-86.679391 32.69294,-86.679088 32.693239)\r\n115;199;all;Hills & Hollows Ln;Autauga;AL;36066;LINESTRING(-86.452065 32.534666,-86.451911 32.534572,-86.451591 32.534402,-86.451163 32.534248,-86.450675 32.53413,-86.450312 32.534125,-86.449939 32.534164,-86.449608 32.534195,-86.449316 32.534157,-86.449135 32.534031,-86.448894 32.533908,-86.448771 32.533857)\r\n2463;2401;odd;Fox Ridge Dr;Autauga;AL;36067;LINESTRING(-86.488885 32.619479,-86.488843 32.616888,-86.488842 32.616832)\r\n2498;2400;even;Fox Ridge Dr;Autauga;AL;36067;LINESTRING(-86.488691 32.619482,-86.488649 32.61689,-86.488648 32.616835)\r\n301;399;odd;Winslow Rd;Autauga;AL;36003;LINESTRING(-86.76982 32.516204,-86.769737 32.516249,-86.76966 32.516286,-86.769507 32.516375,-86.769433 32.516427,-86.769363 32.516479,-86.769237 32.516591,-86.769123 32.516714,-86.768997 32.516919,-86.768962 32.516993,-86.768845 32.517272,-86.768689 32.51769,-86.768633 32.517823,-86.768569 32.517954,-86.768497 32.518081,-86.768337 32.518335,-86.768251 32.518469,-86.768185 32.518619,-86.768148 32.518851,-86.768165 32.519147,-86.768148 32.519281,-86.768114 32.519416,-86.768063 32.519552,-86.768006 32.519688,-86.767912 32.51989,-86.767842 32.520017,-86.767602 32.520404,-86.76727 32.52091,-86.767096 32.521158,-86.767005 32.521278,-86.766908 32.521393,-86.766277 32.522067,-86.766164 32.522182)\r\n3298;3244;even;Winslow Rd;Autauga;AL;36003;LINESTRING(-86.769935 32.516337,-86.769849 32.516397,-86.769766 32.516434,-86.769627 32.516513,-86.769563 32.516555,-86.769505 32.516601,-86.769393 32.516703,-86.769299 32.51681,-86.769181 32.516993,-86.769148 32.517055,-86.769033 32.517326,-86.768877 32.517742,-86.768819 32.517883,-86.768751 32.518022,-86.768675 32.518157,-86.768511 32.518413,-86.768441 32.518539,-86.768391 32.518663,-86.768352 32.518861,-86.768361 32.519149,-86.768358 32.519309,-86.768306 32.519462,-86.768251 32.519606,-86.768192 32.519746,-86.768096 32.519956,-86.768022 32.520093,-86.767774 32.520482,-86.767442 32.520994,-86.767264 32.521246,-86.767169 32.52137,-86.76707 32.521495,-86.766429 32.522173,-86.766313 32.522288)\r\n1098;918;all;State Rte 14 E;Autauga;AL;36066;LINESTRING(-86.438644 32.47802,-86.438667 32.478001,-86.438839 32.47789,-86.43887 32.477867,-86.439082 32.47771,-86.439344 32.477504,-86.439529 32.477344)\r\n359;349;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.504377 32.570189,-86.50428 32.570196,-86.503513 32.570245,-86.501309 32.570396,-86.501257 32.570401)\r\n362;352;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.504396 32.570353,-86.504296 32.570362,-86.503529 32.570409,-86.501327 32.570562,-86.501276 32.570565)\r\n1282;1348;even;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.516562 32.487131,-86.516718 32.487379,-86.516858 32.487641,-86.51692 32.487773,-86.516976 32.487908,-86.517025 32.488046,-86.517106 32.488324,-86.517165 32.488605,-86.517186 32.488747,-86.517208 32.489036,-86.517225 32.489693,-86.517229 32.489906,-86.517232 32.490271,-86.517262 32.491658,-86.517314 32.492606,-86.517358 32.493117,-86.517392 32.493408,-86.517397 32.493481,-86.517485 32.494165)\r\n1257;1299;odd;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.516732 32.487052,-86.5169 32.487303,-86.517042 32.487575,-86.517106 32.487715,-86.517164 32.487856,-86.517217 32.488,-86.517304 32.488288,-86.517363 32.488581,-86.517384 32.488731,-86.517408 32.489028,-86.517419 32.489689,-86.517425 32.489904,-86.517428 32.490269,-86.51746 32.491652,-86.51751 32.492596,-86.517554 32.493103,-86.51759 32.493394,-86.517595 32.493467,-86.517678 32.494148)\r\n600;698;even;Avery Loop;Autauga;AL;36022;LINESTRING(-86.428589 32.58474,-86.42864 32.584743,-86.428701 32.584745,-86.428769 32.584746,-86.428841 32.584747,-86.428918 32.584749,-86.428997 32.584752,-86.42908 32.584754,-86.429164 32.584758,-86.429251 32.58476,-86.429336 32.584762,-86.429422 32.584765,-86.429511 32.584766,-86.429598 32.584769,-86.429688 32.584772,-86.429778 32.584773,-86.429867 32.584776,-86.429955 32.584776,-86.430041 32.584776,-86.430058 32.584777,-86.430121 32.584778,-86.430204 32.584779,-86.430289 32.584782,-86.430375 32.584785,-86.430463 32.584786,-86.43055 32.584788,-86.430637 32.584788,-86.430729 32.584791,-86.430829 32.584786,-86.430929 32.58477,-86.431029 32.58474,-86.431114 32.584688,-86.431179 32.584627,-86.431207 32.584566)\r\n601;699;odd;Avery Loop;Autauga;AL;36022;LINESTRING(-86.428599 32.584576,-86.428648 32.584577,-86.428707 32.584579,-86.428773 32.58458,-86.428847 32.584583,-86.428924 32.584585,-86.429005 32.584586,-86.429088 32.58459,-86.42917 32.584592,-86.429255 32.584594,-86.429342 32.584594,-86.42943 32.584599,-86.429517 32.584602,-86.429604 32.584603,-86.429694 32.584606,-86.429784 32.584609,-86.429871 32.58461,-86.429955 32.584612,-86.430039 32.58461,-86.430062 32.584609,-86.430127 32.584612,-86.43021 32.584615,-86.430295 32.584616,-86.430381 32.584619,-86.430467 32.58462,-86.430552 32.584622,-86.430639 32.584622,-86.430723 32.584621,-86.430799 32.584614,-86.430869 32.5846,-86.430925 32.584578,-86.43097 32.584552,-86.431003 32.584521,-86.431036 32.584487)\r\n298;200;even;Holly Ct;Autauga;AL;36066;LINESTRING(-86.444082 32.481693,-86.444234 32.481705,-86.444514 32.481698,-86.44462 32.481656,-86.444727 32.481597,-86.44483 32.481369,-86.444916 32.48118,-86.444996 32.48109,-86.445182 32.480973,-86.445323 32.480901,-86.445543 32.4808,-86.445691 32.480741,-86.445841 32.480693,-86.445988 32.480667,-86.446052 32.480665,-86.446122 32.480675,-86.446134 32.480673)\r\n299;201;odd;Holly Ct;Autauga;AL;36066;LINESTRING(-86.444099 32.481529,-86.444236 32.481539,-86.44446 32.481514,-86.444512 32.481498,-86.444541 32.481471,-86.444642 32.481307,-86.44472 32.481092,-86.444842 32.480954,-86.445074 32.480829,-86.445225 32.480757,-86.445451 32.48065,-86.445611 32.480585,-86.445779 32.480525,-86.445964 32.480485,-86.446072 32.480487,-86.446174 32.480505,-86.446196 32.480517)\r\n299;225;odd;Woodvale Rd;Autauga;AL;36067;LINESTRING(-86.456676 32.471628,-86.456767 32.471483,-86.456882 32.471284,-86.456958 32.471136)\r\n298;232;even;Woodvale Rd;Autauga;AL;36067;LINESTRING(-86.456503 32.471552,-86.456591 32.471407,-86.456702 32.471214,-86.456781 32.471069)\r\n700;798;even;Wetumpka St;Autauga;AL;36067;LINESTRING(-86.455253 32.46452,-86.455138 32.464529,-86.454462 32.46457,-86.45387 32.464599,-86.453193 32.464619,-86.452343 32.464615,-86.451746 32.464603,-86.451088 32.464601)\r\n701;799;odd;Wetumpka St;Autauga;AL;36067;LINESTRING(-86.455275 32.464684,-86.455156 32.464697,-86.454474 32.464736,-86.45388 32.464765,-86.453195 32.464785,-86.452341 32.464781,-86.451744 32.464769,-86.451087 32.464766)\r\n839;835;odd;Heather Dr;Autauga;AL;36066;LINESTRING(-86.412386 32.454381,-86.4124 32.454458,-86.412435 32.454739,-86.412445 32.454851)\r\n840;836;even;Heather Dr;Autauga;AL;36066;LINESTRING(-86.412576 32.454347,-86.412602 32.454432,-86.412633 32.454725,-86.412639 32.454841)\r\n100;198;even;Strodes Creek Cir;Autauga;AL;36066;LINESTRING(-86.415165 32.491356,-86.414942 32.491469,-86.414722 32.491568,-86.414638 32.491596,-86.414599 32.491624)\r\n101;199;odd;Strodes Creek Cir;Autauga;AL;36066;LINESTRING(-86.415266 32.491497,-86.415042 32.491615,-86.41481 32.491722,-86.414736 32.491752,-86.414704 32.491762)\r\n2500;2598;all;Ell Dr;Autauga;AL;36067;LINESTRING(-86.659305 32.570087,-86.659363 32.570095,-86.659524 32.570163,-86.659682 32.570229,-86.659837 32.570313,-86.659992 32.570402,-86.660069 32.570462,-86.660155 32.570545,-86.660167 32.570697,-86.659954 32.570832,-86.659721 32.570805,-86.659566 32.570693,-86.65945 32.570574,-86.659241 32.570347,-86.65917 32.570279)\r\n1699;1697;all;Autauga County 87;Autauga;AL;36022;LINESTRING(-86.434514 32.550131,-86.434346 32.55007,-86.434102 32.549992,-86.433767 32.549907,-86.433595 32.549871,-86.433344 32.549827,-86.433185 32.549792,-86.433119 32.549769,-86.433065 32.549739,-86.432964 32.549666)\r\n499;401;odd;Lower Grainesville Rd;Autauga;AL;36067;LINESTRING(-86.544656 32.473303,-86.544567 32.473309,-86.544177 32.473309,-86.543152 32.473265,-86.542195 32.473209,-86.541963 32.47319)\r\n498;414;even;Lower Grainesville Rd;Autauga;AL;36067;LINESTRING(-86.544686 32.473465,-86.544581 32.473485,-86.544171 32.473477,-86.54314 32.473431,-86.542177 32.473377,-86.541941 32.473353)\r\n125;101;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.46949 32.579443,-86.469476 32.57945,-86.469206 32.579618,-86.468925 32.579775,-86.468637 32.579919,-86.468338 32.58005,-86.468031 32.580165,-86.467715 32.580271,-86.466346 32.580703,-86.466031 32.580808,-86.465718 32.580942,-86.465421 32.581102,-86.465134 32.581277,-86.46482 32.581536,-86.464703 32.581643,-86.464275 32.582002)\r\n116;100;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.469615 32.57957,-86.4696 32.579584,-86.46932 32.579756,-86.469031 32.579917,-86.468735 32.580067,-86.468424 32.580202,-86.468107 32.580321,-86.467785 32.580425,-86.466418 32.580859,-86.466115 32.580964,-86.465818 32.581092,-86.465535 32.581242,-86.465268 32.581411,-86.464962 32.581654,-86.464845 32.581759,-86.464412 32.582119)\r\n1330;1350;even;Hare Cir;Autauga;AL;36067;LINESTRING(-86.424732 32.434219,-86.424853 32.434184,-86.425475 32.433645,-86.425481 32.433595)\r\n1331;1351;odd;Hare Cir;Autauga;AL;36067;LINESTRING(-86.424649 32.434071,-86.424721 32.434028,-86.425281 32.433541,-86.425299 32.433536)\r\n400;498;even;Dogwood Dr;Autauga;AL;36022;LINESTRING(-86.41809 32.509656,-86.417965 32.509639,-86.417009 32.509518,-86.41595 32.509383,-86.41581 32.509783,-86.415753 32.509909,-86.415718 32.509958,-86.415675 32.509998,-86.415624 32.510027,-86.415568 32.510044,-86.415501 32.510054,-86.415423 32.510054,-86.415262 32.510043,-86.414509 32.509939,-86.413501 32.509803,-86.413418 32.509795,-86.413372 32.509791)\r\n401;499;odd;Dogwood Dr;Autauga;AL;36022;LINESTRING(-86.41806 32.509819,-86.417935 32.509803,-86.416979 32.509682,-86.41608 32.509551,-86.416004 32.509833,-86.415945 32.509983,-86.415892 32.510064,-86.415817 32.510134,-86.415724 32.510191,-86.415614 32.510224,-86.415509 32.510226,-86.415415 32.510226,-86.415236 32.510213,-86.414477 32.510103,-86.413475 32.509969,-86.413392 32.509961,-86.413345 32.509954)\r\n100;162;all;Golson Rd;Autauga;AL;36067;LINESTRING(-86.539431 32.430606,-86.539779 32.431156,-86.540093 32.431453,-86.540355 32.431714,-86.5409 32.432173,-86.542011 32.433101,-86.542949 32.43397,-86.544061 32.435024,-86.544994 32.43594,-86.545763 32.436717,-86.546264 32.437169,-86.546534 32.437381)\r\n419;413;odd;Durden Rd;Autauga;AL;36067;LINESTRING(-86.486565 32.476887,-86.486495 32.47678,-86.48634 32.476598,-86.485954 32.476202,-86.485646 32.475893)\r\n424;404;even;Durden Rd;Autauga;AL;36067;LINESTRING(-86.486397 32.47697,-86.486325 32.476874,-86.48618 32.476702,-86.485804 32.476308,-86.485498 32.475999)\r\n338;326;all;Autauga County 27;Autauga;AL;36067;LINESTRING(-86.533099 32.39819,-86.534695 32.398756,-86.535524 32.399051,-86.536317 32.399337,-86.538533 32.400122,-86.538849 32.400246,-86.538901 32.400275)\r\n115;199;all;Griffith Ave;Autauga;AL;36066;LINESTRING(-86.448585 32.47633,-86.448262 32.476325,-86.447918 32.47633,-86.447812 32.476332,-86.44778 32.476311)\r\n550;598;even;E 6th St;Autauga;AL;36067;LINESTRING(-86.459849 32.46703,-86.459853 32.467144,-86.459847 32.467355,-86.459831 32.46749,-86.459816 32.467551,-86.459747 32.467747,-86.459685 32.467868,-86.45956 32.468039,-86.459461 32.468138,-86.459282 32.468276,-86.459153 32.468354,-86.459016 32.468419,-86.45887 32.46847,-86.458719 32.468506,-86.458563 32.468528,-86.458484 32.468534,-86.458322 32.468538,-86.458164 32.468525,-86.457921 32.468487,-86.45767 32.46843,-86.457596 32.468423)\r\n547;599;odd;E 6th St;Autauga;AL;36067;LINESTRING(-86.460044 32.467025,-86.460049 32.467142,-86.460049 32.467365,-86.460031 32.467514,-86.460016 32.467591,-86.459941 32.467805,-86.459871 32.467948,-86.45973 32.468143,-86.459609 32.46826,-86.45941 32.468412,-86.459263 32.4685,-86.459106 32.468575,-86.458938 32.468634,-86.458763 32.468676,-86.458587 32.468696,-86.458496 32.468702,-86.458318 32.468706,-86.458136 32.468699,-86.457875 32.468651,-86.457628 32.468598,-86.457563 32.468585)\r\n1615;1699;all;Autauga County 111;Autauga;AL;36067;LINESTRING(-86.608965 32.609925,-86.608967 32.60995,-86.60897 32.609991,-86.608972 32.610139,-86.608953 32.610432,-86.608918 32.610724,-86.608892 32.610871,-86.608824 32.611155,-86.608798 32.611293,-86.60876 32.611573,-86.608751 32.61171,-86.608748 32.611995,-86.608764 32.61228,-86.608857 32.613214,-86.608871 32.613433,-86.60888 32.613796,-86.60889 32.614884,-86.608909 32.615967,-86.608925 32.616329,-86.60894 32.617411,-86.608959 32.618131,-86.608963 32.618488,-86.608962 32.618835,-86.608957 32.618952)\r\n528;552;even;Booth St;Autauga;AL;36067;LINESTRING(-86.461518 32.46702,-86.461426 32.466978,-86.46119 32.466893,-86.460958 32.466795,-86.460862 32.466774,-86.460769 32.466759,-86.460591 32.46675,-86.460331 32.466753,-86.460082 32.466767)\r\n529;599;odd;Booth St;Autauga;AL;36067;LINESTRING(-86.46143 32.467167,-86.461342 32.467132,-86.461108 32.467045,-86.460884 32.466961,-86.460816 32.466942,-86.460743 32.466931,-86.460585 32.46692,-86.460337 32.466921,-86.460093 32.466931)\r\n1798;1790;even;Windermere Ave;Autauga;AL;36066;LINESTRING(-86.421214 32.476194,-86.421313 32.476187,-86.421831 32.47613,-86.422048 32.476102)\r\n1795;1791;odd;Windermere Ave;Autauga;AL;36066;LINESTRING(-86.421194 32.476031,-86.421291 32.476021,-86.421803 32.475966,-86.422019 32.475939)\r\n599;501;odd;Autauga County 56;Autauga;AL;36051;LINESTRING(-86.417903 32.683533,-86.417941 32.683511,-86.417947 32.683501)\r\n598;500;even;Autauga County 56;Autauga;AL;36051;LINESTRING(-86.417773 32.68341,-86.417813 32.683373,-86.417839 32.683365)\r\n1400;1498;all;Northington Rd;Autauga;AL;36067;LINESTRING(-86.499251 32.453107,-86.499303 32.453069,-86.49981 32.452567,-86.499912 32.452477,-86.499989 32.452416,-86.500114 32.452331,-86.50018 32.452294,-86.50025 32.452263,-86.500398 32.452211,-86.500472 32.452191,-86.500721 32.452147,-86.501628 32.452037,-86.501797 32.452013,-86.501891 32.45199,-86.502226 32.451887,-86.502471 32.451795,-86.502629 32.451717,-86.502782 32.451636,-86.502928 32.451542,-86.50306 32.451439,-86.503184 32.451333,-86.503528 32.450981,-86.503659 32.45081,-86.504393 32.449994,-86.504446 32.449943,-86.504561 32.449845,-86.504622 32.449803,-86.504686 32.449767,-86.504754 32.449736,-86.504824 32.44971,-86.504899 32.449691,-86.504975 32.449676,-86.505054 32.449666,-86.505132 32.44966,-86.505207 32.449665,-86.505366 32.449685,-86.505774 32.449786,-86.506196 32.449879,-86.50654 32.449932,-86.506972 32.44998,-86.507147 32.449994,-86.507723 32.450012,-86.507829 32.450019)\r\n1500;1540;even;Autauga County 111;Autauga;AL;36067;LINESTRING(-86.608601 32.602744,-86.608607 32.602917,-86.608617 32.60342,-86.608611 32.603708,-86.608561 32.605082,-86.60856 32.605804,-86.608569 32.606602,-86.608572 32.606627)\r\n1501;1599;odd;Autauga County 111;Autauga;AL;36067;LINESTRING(-86.608795 32.602739,-86.608803 32.602913,-86.608811 32.60342,-86.608807 32.603712,-86.608759 32.605084,-86.608756 32.605804,-86.608767 32.606598,-86.608766 32.606622)\r\n2;36;all;Grand Park Dr;Autauga;AL;36022;LINESTRING(-86.412641 32.503884,-86.412637 32.503949,-86.412652 32.504184)\r\n2236;2298;even;Autauga County 123;Autauga;AL;36051;LINESTRING(-86.57478 32.699815,-86.574741 32.699853,-86.574178 32.700391,-86.573881 32.70065,-86.573714 32.700813,-86.573601 32.700934,-86.573447 32.701124,-86.573331 32.701334,-86.573144 32.701732,-86.572914 32.702196,-86.572471 32.703049,-86.572294 32.703378,-86.572031 32.703915,-86.571713 32.704581,-86.571357 32.705373,-86.57129 32.7055,-86.571213 32.705619,-86.571023 32.705848,-86.570802 32.706063,-86.570623 32.706214,-86.570387 32.706399,-86.570303 32.706462,-86.570108 32.706596,-86.570033 32.706642)\r\n2227;2299;odd;Autauga County 123;Autauga;AL;36051;LINESTRING(-86.574929 32.699921,-86.574891 32.699961,-86.574324 32.700505,-86.574029 32.700764,-86.573868 32.700921,-86.573765 32.701034,-86.573627 32.701212,-86.573515 32.701402,-86.573326 32.701794,-86.573096 32.702262,-86.572651 32.703117,-86.572476 32.703444,-86.572213 32.703977,-86.571897 32.704641,-86.571543 32.705437,-86.571472 32.705574,-86.571389 32.705711,-86.571185 32.705956,-86.570948 32.706179,-86.570759 32.706334,-86.570519 32.706521,-86.570433 32.706588,-86.570232 32.706738,-86.570138 32.706782)\r\n1331;1253;all;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.640713 32.560708,-86.640689 32.560714,-86.640527 32.56077,-86.640365 32.560828,-86.640209 32.560902,-86.640058 32.560986,-86.639793 32.561183,-86.63967 32.561298,-86.639565 32.561424,-86.63948 32.56156,-86.639373 32.561768,-86.639362 32.561828)\r\n1099;1013;odd;Thistle Rd;Autauga;AL;36066;LINESTRING(-86.416754 32.472011,-86.416815 32.472288,-86.41686 32.472534,-86.416784 32.472651,-86.416316 32.473074,-86.415891 32.473363,-86.41587 32.473383,-86.414631 32.473214,-86.414427 32.473194)\r\n1098;1014;even;Thistle Rd;Autauga;AL;36066;LINESTRING(-86.416945 32.47198,-86.417009 32.472258,-86.41707 32.472558,-86.416968 32.472759,-86.416456 32.4732,-86.415991 32.473549,-86.41587 32.473547,-86.414603 32.47338,-86.414403 32.473357)\r\n3000;3098;even;Higgins Pl;Autauga;AL;36051;LINESTRING(-86.465621 32.702819,-86.46564 32.702817,-86.465779 32.702783,-86.465995 32.702795,-86.466221 32.702855,-86.466378 32.70291,-86.466548 32.702961,-86.466726 32.702994,-86.466905 32.703018,-86.466984 32.703012)\r\n3001;3099;odd;Higgins Pl;Autauga;AL;36051;LINESTRING(-86.465537 32.702671,-86.465564 32.702655,-86.465751 32.702601,-86.466039 32.702611,-86.466293 32.702697,-86.46645 32.702752,-86.466604 32.702795,-86.466762 32.702826,-86.466919 32.702842,-86.466984 32.702848)\r\n100;110;all;Old Autaugaville Rd;Autauga;AL;36067;LINESTRING(-86.502768 32.431447,-86.502689 32.431535)\r\n298;200;all;Gray Dr;Autauga;AL;36067;LINESTRING(-86.47457 32.448011,-86.47465 32.447859,-86.47472 32.447596,-86.474686 32.447337,-86.4747 32.44713,-86.474633 32.446847,-86.474549 32.44668,-86.474438 32.446521,-86.474432 32.446303,-86.47454 32.446081,-86.474693 32.445944,-86.474868 32.445742,-86.474915 32.445656,-86.474889 32.445553,-86.474801 32.445392,-86.474515 32.445218)\r\n1399;1379;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.645188 32.548338,-86.645147 32.548465,-86.645108 32.548612,-86.645076 32.548758,-86.645051 32.548907,-86.645036 32.549055,-86.645028 32.549204,-86.64503 32.549355,-86.645038 32.549502,-86.645125 32.550157,-86.645238 32.550987,-86.645272 32.551245,-86.645293 32.551358)\r\n1498;1388;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.645376 32.548379,-86.645339 32.548505,-86.645302 32.548646,-86.645272 32.548784,-86.645249 32.548927,-86.645234 32.549067,-86.645226 32.549206,-86.645228 32.549349,-86.645238 32.549488,-86.645319 32.550139,-86.645432 32.550969,-86.645468 32.551223,-86.645486 32.551334)\r\n1901;1913;all;Regent Rd;Autauga;AL;36066;LINESTRING(-86.417006 32.466431,-86.416785 32.466435,-86.416067 32.466439)\r\n200;298;even;Willow Oak Ct;Autauga;AL;36067;LINESTRING(-86.47501 32.474751,-86.475077 32.474779,-86.475383 32.474916,-86.475618 32.475006,-86.475662 32.475023)\r\n201;299;odd;Willow Oak Ct;Autauga;AL;36067;LINESTRING(-86.475088 32.4746,-86.475165 32.474625,-86.475471 32.474764,-86.475704 32.474854,-86.475751 32.474876)\r\n1301;1399;all;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.464701 32.50032,-86.464685 32.500386,-86.464579 32.500666,-86.464421 32.501007,-86.464311 32.501208,-86.464113 32.501531,-86.463726 32.502125)\r\n998;900;all;M & M Dr;Autauga;AL;36749;LINESTRING(-86.900402 32.586105,-86.900395 32.586098,-86.900337 32.586117,-86.900271 32.586127,-86.900029 32.586142,-86.899775 32.586149,-86.899169 32.586171,-86.898732 32.586207,-86.898476 32.58624,-86.898325 32.586256)\r\n3217;3299;odd;Winslow Rd;Autauga;AL;36003;LINESTRING(-86.765096 32.523323,-86.765016 32.52345,-86.764748 32.523913,-86.764661 32.524025,-86.764558 32.524117,-86.764435 32.524186,-86.764216 32.524249,-86.764063 32.524267,-86.76399 32.524259,-86.763657 32.524212,-86.763472 32.524193,-86.763268 32.524204,-86.763086 32.524306,-86.762999 32.524479,-86.762768 32.52565,-86.762701 32.526005,-86.762663 32.52614,-86.762615 32.526276,-86.762473 32.526617,-86.762375 32.526896,-86.762327 32.527041,-86.762309 32.527119,-86.762297 32.527277,-86.762306 32.5273)\r\n3242;300;even;Winslow Rd;Autauga;AL;36003;LINESTRING(-86.765269 32.523399,-86.765192 32.523526,-86.764928 32.523997,-86.764829 32.524133,-86.7647 32.524255,-86.764533 32.524354,-86.764258 32.524427,-86.764065 32.524433,-86.763966 32.524433,-86.763625 32.524378,-86.763474 32.524357,-86.763352 32.524388,-86.763268 32.524438,-86.763207 32.524535,-86.762962 32.525676,-86.762899 32.526037,-86.762857 32.526184,-86.762803 32.526328,-86.762663 32.526669,-86.762565 32.526942,-86.762525 32.527079,-86.762513 32.527141,-86.762501 32.527267,-86.762497 32.527268)\r\n199;101;odd;Gail St;Autauga;AL;36066;LINESTRING(-86.438431 32.467429,-86.438403 32.467275,-86.438372 32.466997,-86.438392 32.466866,-86.438409 32.466812,-86.438476 32.466688,-86.438631 32.466452)\r\n198;100;even;Gail St;Autauga;AL;36066;LINESTRING(-86.43824 32.467458,-86.438201 32.467297,-86.438178 32.466997,-86.438182 32.466834,-86.438213 32.466748,-86.438298 32.466608,-86.438461 32.466371)\r\n199;101;odd;N Chestnut St;Autauga;AL;36067;LINESTRING(-86.472397 32.46413,-86.472404 32.464066,-86.472504 32.46327,-86.472528 32.463003)\r\n198;100;even;N Chestnut St;Autauga;AL;36067;LINESTRING(-86.472203 32.464116,-86.472208 32.46405,-86.472308 32.463254,-86.472334 32.462989)\r\n100;198;even;Leigh Dr;Autauga;AL;36067;LINESTRING(-86.447546 32.454823,-86.447547 32.454641,-86.447525 32.452962,-86.447535 32.452827,-86.447547 32.452771,-86.447573 32.452722,-86.447575 32.452704)\r\n101;199;odd;Leigh Dr;Autauga;AL;36067;LINESTRING(-86.447351 32.454822,-86.447351 32.454641,-86.447329 32.452962,-86.447325 32.452807,-86.447347 32.452723,-86.447381 32.452636,-86.447417 32.452609)\r\n801;899;all;Fairview Ave;Autauga;AL;36066;LINESTRING(-86.439838 32.477299,-86.439901 32.477235)\r\n500;506;even;Daniel Dr;Autauga;AL;36067;LINESTRING(-86.460916 32.476181,-86.460794 32.476419,-86.460728 32.476559,-86.460657 32.476782,-86.460664 32.476796)\r\n501;505;odd;Daniel Dr;Autauga;AL;36067;LINESTRING(-86.461095 32.476246,-86.460978 32.476481,-86.460924 32.476611,-86.460867 32.47681,-86.460859 32.476807)\r\n307;301;odd;N Autauga St;Autauga;AL;36003;LINESTRING(-86.651683 32.429439,-86.651734 32.429507,-86.651778 32.42957,-86.651835 32.429638)\r\n302;300;even;N Autauga St;Autauga;AL;36003;LINESTRING(-86.651842 32.429345,-86.651904 32.429415,-86.651948 32.42948,-86.651997 32.429547)\r\n4198;4100;all;State Rte 14;Autauga;AL;36703;LINESTRING(-86.861173 32.475405,-86.859231 32.476148,-86.857591 32.476795,-86.856664 32.477177,-86.854639 32.478048)\r\n100;198;even;Bluebird Ct;Autauga;AL;36022;LINESTRING(-86.480302 32.616513,-86.480286 32.616481,-86.480185 32.61629,-86.480128 32.616158)\r\n199;101;odd;Bluebird Ct;Autauga;AL;36022;LINESTRING(-86.480133 32.616595,-86.480102 32.616559,-86.479997 32.616352,-86.479943 32.616211)\r\n1665;1699;all;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.511479 32.532951,-86.511485 32.533087,-86.511516 32.533443,-86.511553 32.533727,-86.511618 32.534081,-86.51227 32.536919,-86.512374 32.537342,-86.512492 32.537761,-86.512632 32.538173,-86.51271 32.538376,-86.512943 32.538916,-86.513115 32.539271)\r\n1940;1998;even;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.572345 32.43283,-86.574991 32.432763)\r\n1933;1945;odd;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.572339 32.432665,-86.574985 32.432598)\r\n349;363;all;Hazel St;Autauga;AL;36067;LINESTRING(-86.46719 32.431188,-86.46679 32.431181,-86.466747 32.431181)\r\n299;275;odd;Autauga County 70;Autauga;AL;36022;LINESTRING(-86.456083 32.656465,-86.456318 32.656425,-86.45657 32.656369,-86.456815 32.656285,-86.457203 32.656128,-86.457655 32.655926,-86.457804 32.655868,-86.457957 32.65582,-86.458609 32.655662,-86.459434 32.65548,-86.460016 32.655358,-86.460263 32.655315,-86.460426 32.655296,-86.460849 32.655262,-86.461187 32.655247,-86.461697 32.655237,-86.462037 32.655235,-86.462376 32.655242,-86.462884 32.65527,-86.463648 32.655337,-86.463996 32.65535,-86.464174 32.655349,-86.464436 32.655331,-86.464696 32.6553,-86.465039 32.655246,-86.465295 32.655198,-86.465722 32.655096,-86.46587 32.655057,-86.466481 32.654905)\r\n384;312;even;Autauga County 70;Autauga;AL;36022;LINESTRING(-86.456042 32.656305,-86.45627 32.656261,-86.456504 32.656205,-86.456735 32.656129,-86.457113 32.655978,-86.457565 32.655774,-86.457726 32.65571,-86.457893 32.655656,-86.458557 32.655502,-86.459386 32.65532,-86.459972 32.655194,-86.460229 32.655147,-86.460404 32.65513,-86.460835 32.655094,-86.461179 32.655079,-86.461695 32.655071,-86.462039 32.655069,-86.462384 32.655074,-86.4629 32.655102,-86.463664 32.655169,-86.463998 32.655184,-86.464164 32.655179,-86.464414 32.655163,-86.464664 32.655134,-86.464999 32.655082,-86.465247 32.655034,-86.465666 32.654936,-86.465812 32.654897,-86.466426 32.654747)\r\n3059;3085;all;State Rte 14;Autauga;AL;36003;LINESTRING(-86.702505 32.444294,-86.70386 32.444751,-86.704109 32.444833,-86.704259 32.444881,-86.705733 32.445378)\r\n1225;1245;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.429193 32.438335,-86.428988 32.438347,-86.428596 32.43837)\r\n2600;2698;even;Hanna Dr;Autauga;AL;36022;LINESTRING(-86.487806 32.638272,-86.487514 32.638254,-86.487263 32.638206,-86.48699 32.638054,-86.486595 32.637795,-86.486216 32.637569,-86.4859 32.637433,-86.485608 32.637306,-86.48532 32.637182,-86.484907 32.637035,-86.484611 32.636962)\r\n2633;2699;odd;Hanna Dr;Autauga;AL;36022;LINESTRING(-86.487796 32.638436,-86.48749 32.638428,-86.487171 32.638388,-86.486872 32.638188,-86.486477 32.637931,-86.486108 32.637717,-86.48581 32.637579,-86.48552 32.637454,-86.485236 32.637336,-86.484837 32.637197,-86.484554 32.63712)\r\n1886;1898;all;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.674742 32.609622,-86.674672 32.609938,-86.674658 32.610017)\r\n799;763;odd;Criddle Rd;Autauga;AL;36067;LINESTRING(-86.570805 32.580856,-86.570785 32.580889,-86.570713 32.581013,-86.57043 32.581452,-86.57035 32.581585,-86.570308 32.58166,-86.570269 32.581806,-86.570265 32.581885,-86.570245 32.582164,-86.570196 32.582269,-86.570109 32.582356,-86.569987 32.582425,-86.569834 32.582481,-86.569665 32.582549,-86.569514 32.582651,-86.569406 32.582771,-86.569297 32.582856,-86.569177 32.582911,-86.568951 32.582948,-86.568705 32.582955,-86.568108 32.582944,-86.567594 32.582946,-86.565729 32.582966,-86.565226 32.582958,-86.564718 32.582939,-86.564506 32.582937,-86.564205 32.582933,-86.563948 32.582925,-86.561475 32.582898,-86.560287 32.582907,-86.560123 32.582901,-86.559959 32.582888,-86.559451 32.582821,-86.559186 32.582806,-86.559007 32.58281,-86.558914 32.582815,-86.558733 32.58284,-86.558559 32.582896,-86.558399 32.58297,-86.558257 32.583045,-86.558115 32.5831,-86.557968 32.583135,-86.55781 32.583152,-86.557643 32.583159,-86.557471 32.583155,-86.557206 32.583158,-86.556861 32.583194,-86.556358 32.583268,-86.556146 32.583294)\r\n842;732;even;Criddle Rd;Autauga;AL;36067;LINESTRING(-86.570983 32.580922,-86.570967 32.580959,-86.570889 32.581091,-86.570606 32.58153,-86.570532 32.581657,-86.570508 32.581714,-86.570475 32.581834,-86.570465 32.581895,-86.570465 32.582202,-86.570388 32.582367,-86.570253 32.5825,-86.570081 32.582583,-86.569918 32.582637,-86.569781 32.582701,-86.569666 32.582779,-86.569558 32.582885,-86.569431 32.583006,-86.569249 32.583089,-86.568969 32.583124,-86.568703 32.583121,-86.568106 32.58311,-86.567596 32.583112,-86.565729 32.583132,-86.56522 32.583124,-86.564712 32.583105,-86.564504 32.583101,-86.564201 32.583099,-86.563944 32.583091,-86.561475 32.583062,-86.560285 32.583073,-86.560109 32.583071,-86.559933 32.583054,-86.559429 32.582991,-86.559182 32.582974,-86.559019 32.582978,-86.558942 32.582985,-86.558789 32.583012,-86.558643 32.583056,-86.558501 32.583118,-86.558357 32.583197,-86.558189 32.583268,-86.558008 32.583309,-86.557824 32.583324,-86.557643 32.583323,-86.557471 32.583321,-86.55722 32.58333,-86.556889 32.583362,-86.556388 32.583434,-86.556172 32.583457)\r\n701;799;all;Franklin St;Autauga;AL;36067;LINESTRING(-86.487839 32.471225,-86.487901 32.471221,-86.488071 32.471291,-86.488546 32.471466,-86.488863 32.471578,-86.489285 32.471718)\r\n134;174;even;Woodland Acres;Autauga;AL;36067;LINESTRING(-86.479856 32.473983,-86.4809 32.473558,-86.481897 32.473136,-86.481979 32.473102)\r\n101;199;odd;Woodland Acres;Autauga;AL;36067;LINESTRING(-86.479771 32.473834,-86.480814 32.47341,-86.481811 32.472986,-86.481896 32.472953)\r\n2998;2900;all;McGee Rd Exn;Autauga;AL;36067;LINESTRING(-86.685818 32.604121,-86.685823 32.604084,-86.685821 32.604027,-86.685821 32.603973,-86.685823 32.603919,-86.685836 32.603812,-86.685845 32.603765,-86.685862 32.603726,-86.685877 32.603691,-86.68593 32.603606,-86.685966 32.603554,-86.685996 32.603492,-86.686017 32.603428,-86.68602 32.603365,-86.686034 32.603308,-86.686032 32.603244,-86.686026 32.603178,-86.686012 32.60311,-86.686001 32.603051,-86.685992 32.602998,-86.68599 32.60296,-86.686001 32.602896,-86.686023 32.602834,-86.686041 32.602798,-86.686088 32.60275,-86.686132 32.602704,-86.686207 32.602655,-86.686275 32.602577,-86.686318 32.602529,-86.686366 32.602425,-86.686358 32.602328,-86.68634 32.602239,-86.686288 32.602143,-86.686255 32.602093,-86.686219 32.602045,-86.68619 32.602,-86.686157 32.601951,-86.686119 32.60189,-86.68608 32.601831,-86.686031 32.601776,-86.685982 32.601717,-86.685886 32.601617,-86.68585 32.601577,-86.685826 32.601532,-86.685803 32.601501,-86.685894 32.601371,-86.68593 32.601323,-86.685973 32.601271,-86.686121 32.601103,-86.686174 32.601051,-86.686288 32.600949,-86.686346 32.600897,-86.686404 32.600847,-86.686461 32.600794,-86.686512 32.600749,-86.686554 32.600712,-86.686611 32.600654,-86.686671 32.600597,-86.686721 32.600513,-86.686719 32.6004,-86.6866 32.600304,-86.686499 32.600285,-86.686427 32.600277)\r\n699;601;odd;Walker St;Autauga;AL;36066;LINESTRING(-86.450646 32.475225,-86.450653 32.474931,-86.450627 32.474578)\r\n698;600;even;Walker St;Autauga;AL;36066;LINESTRING(-86.450452 32.475222,-86.450455 32.474935,-86.450433 32.474587)\r\n134;140;all;Melmar Dr;Autauga;AL;36067;LINESTRING(-86.483921 32.484499,-86.484008 32.484531,-86.484108 32.484548,-86.484211 32.484548,-86.48431 32.484532,-86.484404 32.484508,-86.484491 32.484471,-86.484576 32.484435,-86.484656 32.484387,-86.484729 32.484322)\r\n1400;1410;even;Autauga County 161;Autauga;AL;36051;LINESTRING(-86.594953 32.593864,-86.594951 32.593884,-86.595011 32.59395,-86.5952 32.594096,-86.595339 32.594193,-86.595621 32.594359,-86.595727 32.594446,-86.595832 32.5946,-86.595867 32.594713,-86.595883 32.594849,-86.595889 32.594989,-86.595881 32.595704,-86.595858 32.596287)\r\n901;1417;odd;Autauga County 161;Autauga;AL;36051;LINESTRING(-86.595135 32.593805,-86.595143 32.593796,-86.595171 32.593832,-86.595334 32.593968,-86.595461 32.594057,-86.595747 32.594223,-86.595901 32.594326,-86.59604 32.594532,-86.596073 32.594689,-86.596083 32.594841,-86.596085 32.594987,-86.596079 32.595708,-86.596053 32.596293)\r\n516;598;even;Breckinridge Ln;Autauga;AL;36066;LINESTRING(-86.431343 32.477027,-86.430919 32.477051,-86.430581 32.477076,-86.429986 32.477092,-86.429476 32.477117,-86.428969 32.477135,-86.428749 32.477141)\r\n517;599;odd;Breckinridge Ln;Autauga;AL;36066;LINESTRING(-86.431356 32.477191,-86.430935 32.477217,-86.430593 32.477246,-86.429994 32.477258,-86.429486 32.477283,-86.428975 32.477301,-86.428755 32.477306)\r\n1630;1686;even;Autauga County 87;Autauga;AL;36022;LINESTRING(-86.431621 32.539898,-86.431673 32.540097,-86.431703 32.540301,-86.431711 32.540441,-86.43171 32.540804,-86.431728 32.541028,-86.43177 32.541177,-86.431798 32.541255,-86.431836 32.541329,-86.43193 32.54146,-86.432043 32.541579,-86.432112 32.541634,-86.432256 32.541728,-86.432895 32.542093,-86.433166 32.542264,-86.433353 32.542403,-86.433465 32.542504,-86.433514 32.542556,-86.433606 32.54267,-86.433684 32.542789,-86.433751 32.542915,-86.433806 32.543045,-86.433845 32.543177,-86.43389 32.543461,-86.434029 32.544611,-86.434056 32.544969,-86.434059 32.54511,-86.434046 32.545321,-86.43402 32.545533,-86.433992 32.54567,-86.433955 32.545806,-86.433908 32.54594,-86.433824 32.546143,-86.433417 32.547019,-86.433366 32.547158,-86.4333 32.547369,-86.433269 32.547514,-86.433257 32.547677)\r\n1623;1671;odd;Autauga County 87;Autauga;AL;36022;LINESTRING(-86.43181 32.539858,-86.431877 32.540067,-86.431903 32.540287,-86.431911 32.540437,-86.431912 32.540798,-86.431934 32.541002,-86.431966 32.541133,-86.43199 32.541193,-86.43202 32.541249,-86.4321 32.54136,-86.432195 32.541461,-86.432246 32.541504,-86.432374 32.54159,-86.433009 32.541957,-86.433294 32.54213,-86.433495 32.542279,-86.433617 32.542392,-86.433676 32.542454,-86.433778 32.54258,-86.433866 32.542713,-86.433939 32.542851,-86.433998 32.542995,-86.434049 32.543143,-86.434086 32.543443,-86.434227 32.544597,-86.434256 32.544963,-86.434257 32.545112,-86.434246 32.545333,-86.434218 32.545555,-86.43419 32.545704,-86.434149 32.54585,-86.434098 32.545992,-86.43401 32.546201,-86.433607 32.547075,-86.433558 32.547204,-86.433498 32.547405,-86.433471 32.547536,-86.433451 32.547691)\r\n298;200;even;Easy Ct;Autauga;AL;36067;LINESTRING(-86.47672 32.468985,-86.476698 32.468986,-86.476543 32.469009,-86.476369 32.469014,-86.476166 32.469039,-86.475986 32.469155,-86.475909 32.469319,-86.475876 32.469495,-86.475986 32.469741)\r\n699;601;odd;Easy Ct;Autauga;AL;36067;LINESTRING(-86.476781 32.469142,-86.476748 32.469156,-86.476565 32.469183,-86.476393 32.46919,-86.476262 32.469219,-86.476172 32.469279,-86.476113 32.469375,-86.476078 32.469481,-86.476168 32.469682)\r\n310;318;even;Marlette Dr;Autauga;AL;36067;LINESTRING(-86.462183 32.446636,-86.46209 32.446639,-86.461234 32.446625,-86.460974 32.446627,-86.4608 32.446636)\r\n307;321;odd;Marlette Dr;Autauga;AL;36067;LINESTRING(-86.462196 32.4468,-86.462094 32.446807,-86.461234 32.446791,-86.46098 32.446795,-86.46081 32.446801)\r\n735;701;all;Glennbrooke Blvd;Autauga;AL;36066;LINESTRING(-86.427392 32.493549,-86.427572 32.493629,-86.427839 32.493713,-86.428136 32.493775)\r\n99;1;odd;S Pickett St;Autauga;AL;36003;LINESTRING(-86.652061 32.432449,-86.652082 32.432479,-86.652379 32.432844,-86.652469 32.432966,-86.652772 32.433353)\r\n104;2;even;S Pickett St;Autauga;AL;36003;LINESTRING(-86.652225 32.43236,-86.652246 32.432387,-86.652545 32.432752,-86.652635 32.432876,-86.652934 32.433263)\r\n499;411;odd;Marlette Dr;Autauga;AL;36067;LINESTRING(-86.456979 32.447879,-86.456977 32.447933,-86.45697 32.44808,-86.45696 32.448169,-86.45701 32.4483,-86.45719 32.448312,-86.457304 32.448305,-86.4574 32.448281,-86.457894 32.448146,-86.457963 32.448128)\r\n498;414;even;Marlette Dr;Autauga;AL;36067;LINESTRING(-86.457173 32.447879,-86.457175 32.447937,-86.457168 32.448082,-86.45718 32.448135,-86.457182 32.448128,-86.457196 32.448144,-86.457266 32.448133,-86.457344 32.448119,-86.457836 32.447988,-86.457907 32.44797)\r\n701;807;all;Gillespie St;Autauga;AL;36067;LINESTRING(-86.455181 32.462831,-86.454891 32.462822,-86.454556 32.462816,-86.454516 32.462817)\r\n499;401;odd;Autauga County 41;Autauga;AL;36067;LINESTRING(-86.570016 32.386342,-86.569631 32.386368,-86.569445 32.386399,-86.569265 32.386459,-86.569181 32.386507,-86.569106 32.386553,-86.569029 32.386605,-86.568905 32.386722,-86.568704 32.38696,-86.568547 32.387126,-86.568437 32.387228,-86.568256 32.387374,-86.568065 32.387511,-86.567247 32.388033,-86.56711 32.388106,-86.566968 32.388163,-86.566897 32.388187,-86.566819 32.388204,-86.566662 32.388227,-86.566508 32.388235,-86.56635 32.388221,-86.56602 32.388165,-86.56584 32.388144,-86.565657 32.388141,-86.565476 32.38814,-86.565298 32.388164,-86.565205 32.388178,-86.565029 32.388218,-86.564858 32.388271,-86.564617 32.388361,-86.56296 32.389031,-86.562962 32.389034)\r\n476;428;even;Autauga County 41;Autauga;AL;36067;LINESTRING(-86.570034 32.386506,-86.569661 32.38654,-86.569505 32.386569,-86.569359 32.386619,-86.569293 32.386649,-86.56923 32.386687,-86.569173 32.386731,-86.569063 32.386832,-86.568862 32.387062,-86.568701 32.387238,-86.568579 32.387346,-86.56839 32.3875,-86.568189 32.387643,-86.567363 32.388173,-86.56721 32.388258,-86.567046 32.388325,-86.566955 32.388347,-86.566867 32.38837,-86.566686 32.388403,-86.566502 32.388405,-86.56632 32.388391,-86.565986 32.388333,-86.565822 32.388316,-86.565655 32.388307,-86.565492 32.388314,-86.56533 32.38833,-86.565251 32.388344,-86.565089 32.388382,-86.564932 32.388429,-86.564699 32.388513,-86.56304 32.389189,-86.563031 32.389188)\r\n100;114;even;St Francis Pl;Autauga;AL;36066;LINESTRING(-86.455541 32.533398,-86.454976 32.533391,-86.454483 32.533375,-86.454201 32.533367,-86.453722 32.533491,-86.453414 32.533624)\r\n101;155;odd;St Francis Pl;Autauga;AL;36066;LINESTRING(-86.455539 32.533563,-86.454972 32.533557,-86.454479 32.533543,-86.454233 32.533551,-86.453798 32.533657,-86.453499 32.533772)\r\n100;198;even;Westbrook Ct;Autauga;AL;36066;LINESTRING(-86.415841 32.494243,-86.415911 32.493758,-86.41597 32.493529)\r\n101;199;odd;Westbrook Ct;Autauga;AL;36066;LINESTRING(-86.415647 32.494225,-86.415707 32.493728,-86.415781 32.493491)\r\n152;198;even;Averhart St;Autauga;AL;36067;LINESTRING(-86.471341 32.486576,-86.471336 32.486431,-86.471347 32.485779,-86.471353 32.485665)\r\n101;199;odd;Averhart St;Autauga;AL;36067;LINESTRING(-86.471147 32.486583,-86.471138 32.486433,-86.471147 32.485773,-86.471159 32.485654)\r\n718;898;even;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.746073 32.498466,-86.746358 32.49859,-86.746838 32.49876,-86.74748 32.498971,-86.748995 32.499482,-86.749148 32.499541,-86.749447 32.499674,-86.749589 32.499745,-86.749868 32.499906,-86.75013 32.500078,-86.750378 32.50027,-86.750496 32.500371,-86.750608 32.500477,-86.750825 32.500702,-86.751132 32.501051,-86.751585 32.501588,-86.751742 32.501771,-86.752091 32.502179,-86.753091 32.503358,-86.753705 32.504088,-86.754833 32.505426,-86.755843 32.506619,-86.756089 32.506918,-86.756747 32.507685,-86.756859 32.507802,-86.756973 32.507914,-86.757097 32.508021,-86.757226 32.508123,-86.757361 32.508219,-86.757502 32.508309,-86.757649 32.508391,-86.757803 32.508466,-86.75796 32.508536,-86.758124 32.508594,-86.758288 32.508648,-86.758458 32.50869,-86.758629 32.508723,-86.758803 32.508748,-86.758979 32.50877,-86.759327 32.50879,-86.759675 32.50879,-86.76155 32.508782,-86.76171 32.508786,-86.761967 32.508804,-86.761973 32.508802)\r\n719;899;odd;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.74616 32.498319,-86.746442 32.498436,-86.746912 32.498606,-86.747552 32.498817,-86.749073 32.499328,-86.749236 32.499389,-86.749545 32.499526,-86.749697 32.499603,-86.749986 32.499768,-86.750262 32.499948,-86.750518 32.50015,-86.75064 32.500257,-86.750758 32.500367,-86.750983 32.500598,-86.75129 32.500953,-86.751743 32.501492,-86.7519 32.501675,-86.752249 32.502083,-86.753249 32.503262,-86.753863 32.503992,-86.754991 32.50533,-86.756003 32.506523,-86.756249 32.506822,-86.756905 32.507583,-86.757011 32.507694,-86.757121 32.5078,-86.757237 32.507901,-86.757358 32.507997,-86.757485 32.508087,-86.757618 32.508171,-86.757755 32.508247,-86.757899 32.508318,-86.758046 32.508382,-86.758198 32.508438,-86.758352 32.508486,-86.758508 32.508526,-86.758669 32.508557,-86.758833 32.508582,-86.758999 32.5086,-86.759335 32.50862,-86.759675 32.508626,-86.761552 32.508616,-86.76172 32.508618,-86.761991 32.508634,-86.762004 32.508639)\r\n799;707;odd;English Hill Dr;Autauga;AL;36067;LINESTRING(-86.534026 32.464832,-86.533912 32.464899)\r\n798;700;even;English Hill Dr;Autauga;AL;36067;LINESTRING(-86.534137 32.464967,-86.534023 32.465034)\r\n699;601;odd;Japonica Rd;Autauga;AL;36067;LINESTRING(-86.459818 32.479172,-86.459137 32.477497,-86.458741 32.476508)\r\n698;600;even;Japonica Rd;Autauga;AL;36067;LINESTRING(-86.459635 32.479225,-86.458953 32.477551,-86.458557 32.476561)\r\n195;199;all;Riverview Ct;Autauga;AL;36003;LINESTRING(-86.659419 32.383923,-86.659519 32.384008)\r\n101;199;odd;Carrie Lee Ln;Autauga;AL;36022;LINESTRING(-86.471519 32.581392,-86.471233 32.581492)\r\n100;198;even;Carrie Lee Ln;Autauga;AL;36022;LINESTRING(-86.471593 32.581544,-86.471307 32.581644)\r\n200;206;all;Amanda Ln;Autauga;AL;36066;LINESTRING(-86.425668 32.44473,-86.425041 32.444351,-86.425016 32.444345)\r\n1532;1584;even;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.500724 32.517816,-86.500762 32.517868,-86.500933 32.518106,-86.501272 32.518603,-86.501341 32.518714,-86.501509 32.518988,-86.50173 32.519381,-86.502381 32.520647,-86.502532 32.520916,-86.502618 32.521047,-86.502753 32.521237,-86.502903 32.521422,-86.503063 32.521598,-86.503237 32.521769,-86.503716 32.52219,-86.505046 32.523335,-86.505419 32.523645,-86.50575 32.52389,-86.505865 32.523967)\r\n1523;1599;odd;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.500885 32.517724,-86.50093 32.517776,-86.501101 32.518022,-86.501446 32.518523,-86.501515 32.518638,-86.501687 32.518914,-86.50191 32.519311,-86.502561 32.520577,-86.50271 32.520838,-86.50279 32.520963,-86.502921 32.521145,-86.503065 32.521322,-86.503219 32.521492,-86.503385 32.521655,-86.503856 32.522074,-86.505184 32.523217,-86.505555 32.523521,-86.505878 32.523762,-86.505987 32.523838)\r\n151;101;all;Autauga County 20;Autauga;AL;36051;LINESTRING(-86.48356 32.701021,-86.483698 32.701019,-86.483943 32.70103,-86.48402 32.701034)\r\n3498;3400;all;Autauga County 78;Autauga;AL;36003;LINESTRING(-86.759323 32.435779,-86.759066 32.435793,-86.75828 32.435813,-86.757414 32.435829,-86.756204 32.435832,-86.755158 32.435805,-86.754653 32.435793,-86.75406 32.435791,-86.753364 32.435799,-86.753013 32.435793,-86.752664 32.435779,-86.752491 32.435763,-86.752322 32.435753,-86.752151 32.435748,-86.751761 32.435752)\r\n999;981;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.600977 32.57412,-86.599881 32.574074,-86.59938 32.574066)\r\n948;928;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.600967 32.574284,-86.599875 32.57424,-86.599376 32.574231)\r\n1130;1198;even;Peoples Rd;Autauga;AL;36749;LINESTRING(-86.864035 32.576507,-86.864029 32.576516,-86.864048 32.576572,-86.864057 32.576638,-86.864064 32.576704,-86.864047 32.576912,-86.864023 32.577046,-86.863941 32.577323,-86.863922 32.577399,-86.863909 32.577475,-86.863895 32.57777,-86.863903 32.577922,-86.86399 32.578274,-86.864048 32.578628,-86.864059 32.578669)\r\n1101;1199;odd;Peoples Rd;Autauga;AL;36749;LINESTRING(-86.864214 32.576443,-86.864235 32.576464,-86.864246 32.576546,-86.864257 32.576624,-86.864258 32.576704,-86.864249 32.57693,-86.864223 32.57708,-86.864135 32.577361,-86.86412 32.577427,-86.864111 32.577491,-86.864091 32.577768,-86.864107 32.577898,-86.864188 32.578246,-86.864244 32.578602,-86.86425 32.578639)\r\n1901;1911;all;Cedar Ridge Loop;Autauga;AL;36067;LINESTRING(-86.47371 32.573912,-86.473623 32.573933,-86.473528 32.573957,-86.473428 32.573984,-86.473221 32.574034,-86.473118 32.574057,-86.473017 32.574081,-86.472913 32.574107,-86.472837 32.574123)\r\n199;101;all;Martin Hill Dr;Autauga;AL;36703;LINESTRING(-86.874069 32.48148,-86.874029 32.481535,-86.873868 32.48163,-86.873697 32.481687,-86.873534 32.481727,-86.873396 32.481776,-86.873298 32.481837,-86.873233 32.481896,-86.873303 32.482056,-86.873413 32.482244,-86.87364 32.482705,-86.873714 32.482835,-86.873816 32.483034,-86.873865 32.483175,-86.873884 32.483251,-86.873909 32.483403,-86.873906 32.483566,-86.873852 32.483725,-86.873758 32.483863,-86.873677 32.483988,-86.873618 32.484114,-86.873576 32.48425,-86.873544 32.484393,-86.87349 32.484611,-86.873442 32.484755,-86.873415 32.484822,-86.873324 32.485096,-86.87327 32.4853,-86.873247 32.485437,-86.873236 32.485575,-86.873259 32.486159,-86.873235 32.486315,-86.873206 32.486399,-86.873156 32.486482,-86.873085 32.48655,-86.873001 32.486605,-86.872843 32.486682,-86.872696 32.486751,-86.872571 32.486827,-86.872468 32.486918,-86.872397 32.48702,-86.872358 32.487136,-86.872342 32.48727,-86.87234 32.48756,-86.872322 32.487855,-86.872297 32.488152,-86.872296 32.488204,-86.87233 32.488309,-86.872399 32.488391,-86.872513 32.488448,-86.872662 32.488483,-86.873003 32.488525,-86.873264 32.488563,-86.873687 32.488644,-86.873852 32.48867,-86.874021 32.48869,-86.874534 32.488763,-86.874706 32.488804,-86.874877 32.488849,-86.875118 32.488945,-86.8752 32.488985,-86.87542 32.48912,-86.87561 32.489281,-86.87573 32.489392,-86.875844 32.489512,-86.875945 32.489642,-86.876026 32.489784,-86.876084 32.489933,-86.876123 32.490087,-86.876131 32.490246,-86.876114 32.490404,-86.876078 32.490551,-86.876036 32.490697,-86.87599 32.490845,-86.875922 32.490991,-86.875834 32.491125,-86.875466 32.491625,-86.875358 32.49175,-86.875234 32.491864,-86.875102 32.491966,-86.874691 32.492258)\r\n701;735;all;Happy Trails Rd;Autauga;AL;36067;LINESTRING(-86.51341 32.539771,-86.514047 32.53935,-86.514201 32.539262,-86.514382 32.539206,-86.51457 32.539182,-86.514759 32.539183,-86.51494 32.53921,-86.515271 32.539284,-86.51543 32.539305,-86.515857 32.539337,-86.516117 32.539374,-86.516291 32.539411,-86.516455 32.539463,-86.516938 32.539622,-86.517573 32.539858,-86.51802 32.540076,-86.518167 32.540142,-86.51847 32.540258,-86.518782 32.540352,-86.519275 32.540464,-86.519447 32.540516,-86.519608 32.54059,-86.519746 32.540675,-86.519882 32.54074,-86.520027 32.54079,-86.520178 32.540825,-86.520335 32.540845,-86.520678 32.540856,-86.520864 32.540881,-86.521046 32.540944,-86.521194 32.541046,-86.5217 32.541441,-86.522004 32.541693,-86.522124 32.541772,-86.522124 32.541782)\r\n1201;1299;all;Oates Rd;Autauga;AL;36066;LINESTRING(-86.442178 32.456957,-86.442021 32.45696,-86.441842 32.456942)\r\n899;801;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.495111 32.459485,-86.492603 32.455324,-86.492206 32.454679,-86.49182 32.454031,-86.491115 32.452863)\r\n701;799;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.450508 32.459901,-86.4505 32.459904,-86.450429 32.459703,-86.450371 32.459571,-86.450267 32.459378,-86.450058 32.45907,-86.44991 32.45887)\r\n299;101;odd;Autauga County 9;Autauga;AL;36003;LINESTRING(-86.761002 32.437606,-86.761188 32.438008,-86.761238 32.438142,-86.761281 32.438281,-86.761315 32.43842,-86.761342 32.438561,-86.76138 32.438847,-86.761399 32.439133,-86.761404 32.439336,-86.761413 32.440156,-86.761429 32.440598,-86.761443 32.440748,-86.761465 32.440894,-86.761493 32.441042,-86.76157 32.441332,-86.761618 32.441475,-86.761729 32.441756,-86.761793 32.441894,-86.761864 32.442032,-86.761942 32.442166,-86.762027 32.442298,-86.762208 32.442551,-86.762906 32.443474,-86.763079 32.44372,-86.763235 32.443973,-86.763367 32.444236,-86.763476 32.444509,-86.76352 32.444643,-86.763595 32.444926,-86.763623 32.445065,-86.763644 32.445209,-86.763659 32.445351,-86.763673 32.445641,-86.763687 32.446957,-86.763728 32.44915)\r\n298;134;even;Autauga County 9;Autauga;AL;36003;LINESTRING(-86.761182 32.437545,-86.761378 32.43795,-86.76143 32.438096,-86.761475 32.438243,-86.761511 32.43839,-86.76154 32.438537,-86.76158 32.438833,-86.761597 32.439127,-86.761598 32.439334,-86.761609 32.440152,-86.761627 32.440588,-86.761641 32.44073,-86.761661 32.44087,-86.761689 32.44101,-86.761764 32.44129,-86.761808 32.441425,-86.761917 32.441698,-86.761977 32.44183,-86.762044 32.441962,-86.762118 32.442088,-86.762199 32.442214,-86.762376 32.442463,-86.763072 32.443386,-86.763255 32.443636,-86.763417 32.443901,-86.763555 32.444176,-86.763668 32.444459,-86.763714 32.444603,-86.763791 32.444894,-86.763819 32.445041,-86.763842 32.445191,-86.763857 32.445341,-86.763871 32.445637,-86.763883 32.446955,-86.763922 32.449147)\r\n599;501;odd;Riverview Rd;Autauga;AL;36003;LINESTRING(-86.656279 32.380533,-86.656278 32.380616,-86.656309 32.381202,-86.656329 32.381347,-86.65638 32.382144,-86.656374 32.38228,-86.656357 32.382325,-86.65634 32.382339,-86.656233 32.382378,-86.656036 32.382394,-86.655846 32.382528,-86.655819 32.382717,-86.655831 32.382875,-86.655845 32.382955,-86.655869 32.383034,-86.655898 32.383109,-86.655936 32.383183,-86.655978 32.383255,-86.656078 32.383382,-86.656271 32.38362,-86.656351 32.383738,-86.656414 32.383861,-86.656437 32.383923,-86.65647 32.384058,-86.656487 32.384195,-86.65649 32.384489,-86.656487 32.38458,-86.656527 32.384684,-86.65662 32.384771,-86.656744 32.384816,-86.656804 32.384807)\r\n598;504;even;Riverview Rd;Autauga;AL;36003;LINESTRING(-86.656473 32.380532,-86.656476 32.380612,-86.656509 32.381188,-86.656527 32.381333,-86.65658 32.38214,-86.656586 32.382298,-86.656569 32.382399,-86.656488 32.382509,-86.656279 32.382548,-86.656136 32.382578,-86.65606 32.382634,-86.656023 32.382727,-86.656033 32.382857,-86.656045 32.382921,-86.656063 32.382986,-86.656088 32.383049,-86.656118 32.383111,-86.656154 32.383169,-86.656242 32.38329,-86.656439 32.383528,-86.656537 32.383658,-86.656606 32.383803,-86.656633 32.383881,-86.656672 32.384032,-86.656689 32.384187,-86.65669 32.384483,-86.656703 32.384544,-86.656723 32.384584,-86.656754 32.384613,-86.656796 32.38463,-86.656814 32.384643)\r\n300;398;even;Autauga County 96;Autauga;AL;36051;LINESTRING(-86.460569 32.701361,-86.460555 32.701354,-86.460215 32.701292,-86.459529 32.701199,-86.459098 32.701153,-86.458835 32.701135,-86.458569 32.701137,-86.458391 32.701152,-86.458215 32.701178,-86.458044 32.701219,-86.457876 32.701269,-86.457716 32.70133,-86.457487 32.701434,-86.457191 32.701574,-86.457121 32.701602,-86.45705 32.701624,-86.456981 32.701637,-86.456822 32.701652,-86.456484 32.701654,-86.45546 32.701682,-86.45512 32.701708,-86.454785 32.70174,-86.454364 32.701758,-86.454266 32.701769,-86.454161 32.701799,-86.454063 32.701865,-86.45401 32.701956,-86.453994 32.702044,-86.453981 32.702124,-86.453976 32.702348,-86.454024 32.703285,-86.454037 32.703641,-86.454031 32.703855,-86.454011 32.704124)\r\n301;399;odd;Autauga County 96;Autauga;AL;36051;LINESTRING(-86.460513 32.701519,-86.460505 32.70152,-86.460177 32.701458,-86.459501 32.701365,-86.459078 32.701321,-86.458829 32.701305,-86.458581 32.701309,-86.458419 32.701322,-86.458259 32.701346,-86.458104 32.701381,-86.457952 32.701427,-86.457804 32.701482,-86.457583 32.70158,-86.457285 32.701724,-86.457203 32.70176,-86.457112 32.70179,-86.457015 32.701811,-86.456832 32.701824,-86.456486 32.70182,-86.455472 32.70185,-86.45514 32.701874,-86.454803 32.701908,-86.454388 32.70193,-86.454322 32.701943,-86.454273 32.701963,-86.454241 32.701987,-86.454216 32.70202,-86.454194 32.702074,-86.454185 32.702138,-86.454172 32.702348,-86.45422 32.703279,-86.454233 32.703639,-86.454231 32.703863,-86.454206 32.704136)\r\n833;801;odd;Heather Dr;Autauga;AL;36066;LINESTRING(-86.412445 32.455087,-86.412424 32.455386,-86.412425 32.455616,-86.412493 32.455855,-86.412836 32.456187)\r\n834;800;even;Heather Dr;Autauga;AL;36066;LINESTRING(-86.41264 32.455097,-86.41262 32.455388,-86.412637 32.45559,-86.412699 32.455765,-86.412987 32.456082)\r\n448;400;all;Bob Owens Dr;Autauga;AL;36067;LINESTRING(-86.482886 32.532768,-86.482865 32.533672,-86.482962 32.533839,-86.483101 32.534003,-86.483268 32.534211,-86.483543 32.534432,-86.483839 32.534557,-86.483927 32.53462,-86.48393 32.534604)\r\n2301;2315;all;Autauga County 65;Autauga;AL;36051;LINESTRING(-86.559207 32.62996,-86.559185 32.630163,-86.559177 32.630296,-86.559186 32.630672,-86.559045 32.631114,-86.558738 32.6314,-86.558291 32.63179)\r\n1099;1017;odd;Sandy Ridge Rd;Autauga;AL;36067;LINESTRING(-86.612613 32.58257,-86.604059 32.582562)\r\n1098;1018;even;Sandy Ridge Rd;Autauga;AL;36067;LINESTRING(-86.612613 32.582734,-86.604059 32.582726)\r\n700;760;all;Autauga County 49;Autauga;AL;36051;LINESTRING(-86.545771 32.622913,-86.546089 32.623199,-86.546323 32.623421,-86.546577 32.623628,-86.546782 32.623775,-86.547063 32.623951,-86.547362 32.624109,-86.54775 32.624276,-86.548154 32.62441,-86.549717 32.624899,-86.549966 32.625,-86.550317 32.62511,-86.550631 32.625236,-86.55125 32.625507,-86.551549 32.625648,-86.552577 32.626177,-86.553215 32.626525)\r\n152;156;all;Ball Enwright Rd;Autauga;AL;36022;LINESTRING(-86.459243 32.609691,-86.459238 32.609679,-86.459105 32.609617,-86.459055 32.609589)\r\n1245;1201;odd;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.47632 32.494585,-86.476466 32.494462,-86.47664 32.494292,-86.476903 32.493995,-86.47712 32.49367,-86.477266 32.4934,-86.4774 32.493127,-86.477522 32.492851,-86.477796 32.492158,-86.478107 32.4914,-86.478346 32.490854,-86.478502 32.490515,-86.478669 32.490183,-86.478746 32.490083,-86.47873 32.490075)\r\n1236;1100;even;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.47618 32.49447,-86.476318 32.494348,-86.476482 32.494186,-86.476731 32.493899,-86.47694 32.493592,-86.477084 32.493332,-86.477216 32.493065,-86.477336 32.492795,-86.477612 32.492104,-86.477921 32.491344,-86.478162 32.490796,-86.478318 32.490453,-86.478487 32.490111,-86.478568 32.489953,-86.478617 32.489941)\r\n1899;1823;all;High Valley Rd;Autauga;AL;36067;LINESTRING(-86.703377 32.595807,-86.703362 32.595765,-86.703346 32.595725,-86.70328 32.595566,-86.703248 32.595508,-86.703219 32.59545,-86.703168 32.59534,-86.70314 32.595291,-86.703111 32.595245,-86.703084 32.595204,-86.703032 32.595125)\r\n1000;1056;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.446521 32.45484,-86.445845 32.454096,-86.445819 32.45407)\r\n707;705;all;Cranbrook Dr;Autauga;AL;36067;LINESTRING(-86.462312 32.447875,-86.462348 32.447831,-86.462385 32.447755,-86.462428 32.447672,-86.462425 32.447545)\r\n100;898;even;Doss Ct;Autauga;AL;36066;LINESTRING(-86.41591 32.45574,-86.416083 32.455777,-86.4161 32.455792,-86.416122 32.455822,-86.416137 32.455878,-86.416125 32.45609,-86.416127 32.456125)\r\n105;899;odd;Doss Ct;Autauga;AL;36066;LINESTRING(-86.415943 32.455578,-86.416157 32.455599,-86.41629 32.455654,-86.416336 32.455784,-86.416335 32.455876,-86.416323 32.456094,-86.416321 32.456126)\r\n399;301;all;G S Rd;Autauga;AL;36067;LINESTRING(-86.465161 32.42695,-86.468134 32.426911)\r\n1200;1246;all;Cross Creek Rd;Autauga;AL;36067;LINESTRING(-86.473791 32.493183,-86.47365 32.493186)\r\n854;898;all;Jensen Rd;Autauga;AL;36067;LINESTRING(-86.468482 32.434433,-86.468642 32.433987,-86.468751 32.433708,-86.468815 32.433574,-86.469122 32.432889,-86.469223 32.432675)\r\n100;108;even;Lake Haven Way;Autauga;AL;36066;LINESTRING(-86.43353 32.46964,-86.433527 32.469535,-86.433503 32.469412,-86.433447 32.46919,-86.433375 32.469046,-86.433333 32.468972,-86.433191 32.468784,-86.433071 32.468677)\r\n101;199;odd;Lake Haven Way;Autauga;AL;36066;LINESTRING(-86.433336 32.46965,-86.433325 32.469553,-86.433305 32.469444,-86.433247 32.469242,-86.433191 32.469116,-86.433155 32.469058,-86.433025 32.46889,-86.432925 32.468785)\r\n2054;2098;all;Fairview Ave;Autauga;AL;36066;LINESTRING(-86.412103 32.485404,-86.411987 32.485387,-86.411962 32.485424)\r\n325;301;all;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.666558 32.40349,-86.666189 32.404935,-86.666105 32.405238)\r\n1599;1501;odd;Jennifer Cir;Autauga;AL;36022;LINESTRING(-86.420576 32.534177,-86.420327 32.53431,-86.42027 32.534292,-86.420255 32.534286,-86.420231 32.534233,-86.420201 32.534115,-86.420227 32.534084,-86.420253 32.53405,-86.420301 32.534011,-86.420488 32.533904)\r\n1598;1504;even;Jennifer Cir;Autauga;AL;36022;LINESTRING(-86.420684 32.534314,-86.420377 32.534494,-86.420124 32.534474,-86.420055 32.534356,-86.420033 32.534271,-86.420003 32.534107,-86.420023 32.534,-86.420097 32.53392,-86.420183 32.533871,-86.420383 32.533766)\r\n801;807;all;Sweet Ridge Rd;Autauga;AL;36066;LINESTRING(-86.42713 32.453578,-86.427129 32.45354,-86.427114 32.453315,-86.42713 32.453177,-86.427203 32.453052,-86.427362 32.452939,-86.4274 32.452933)\r\n100;198;even;Rose;Autauga;AL;36091;LINESTRING(-86.60813 32.698139,-86.607865 32.698153,-86.607512 32.698139,-86.606812 32.698136,-86.606288 32.698122)\r\n101;199;odd;Rose;Autauga;AL;36091;LINESTRING(-86.608142 32.698303,-86.607867 32.698319,-86.607508 32.698307,-86.606808 32.698302,-86.606282 32.698286)\r\n201;249;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.450597 32.464086,-86.450594 32.463946,-86.450602 32.463585,-86.450601 32.463476)\r\n116;120;even;Old Autaugaville Rd;Autauga;AL;36067;LINESTRING(-86.501671 32.43265,-86.501453 32.4329,-86.501109 32.433282)\r\n199;117;odd;Old Autaugaville Rd;Autauga;AL;36067;LINESTRING(-86.501828 32.432747,-86.501611 32.433,-86.501264 32.433382)\r\n100;198;even;Glen Meadow Ct;Autauga;AL;36066;LINESTRING(-86.416981 32.467111,-86.416881 32.467107)\r\n101;199;odd;Glen Meadow Ct;Autauga;AL;36066;LINESTRING(-86.416971 32.467276,-86.416871 32.467272)\r\n280;298;even;Teri Ln;Autauga;AL;36066;LINESTRING(-86.429694 32.450224,-86.429938 32.450003,-86.430121 32.449848,-86.430301 32.449678,-86.430386 32.449553,-86.430436 32.449457,-86.430462 32.449296,-86.430463 32.448563,-86.430462 32.448413,-86.43045 32.448308)\r\n275;299;odd;Teri Ln;Autauga;AL;36066;LINESTRING(-86.429552 32.450113,-86.429796 32.449887,-86.429973 32.449732,-86.430129 32.449574,-86.4302 32.449475,-86.430228 32.449409,-86.430254 32.449282,-86.430267 32.448563,-86.430262 32.448421,-86.430256 32.44832)\r\n646;698;even;Autauga County 95;Autauga;AL;36749;LINESTRING(-86.82894 32.53198,-86.828987 32.532291,-86.828999 32.532429,-86.829 32.532788,-86.828985 32.533075,-86.828963 32.533288,-86.828935 32.533422,-86.828916 32.533483,-86.828887 32.533542,-86.828813 32.533662,-86.828773 32.533714,-86.828723 32.533764,-86.828608 32.533863,-86.828416 32.534009,-86.828105 32.534263,-86.827817 32.53453,-86.827762 32.534572,-86.827702 32.534608,-86.827639 32.534635,-86.827495 32.534679,-86.827427 32.534689,-86.827361 32.53469,-86.82729 32.534685)\r\n675;699;odd;Autauga County 95;Autauga;AL;36749;LINESTRING(-86.829133 32.531958,-86.829185 32.532273,-86.829201 32.532423,-86.829198 32.532792,-86.829183 32.533085,-86.829163 32.533308,-86.829137 32.53346,-86.829108 32.533537,-86.829075 32.533614,-86.828991 32.533752,-86.828933 32.533818,-86.828873 32.53388,-86.828746 32.533985,-86.828552 32.534131,-86.828249 32.534381,-86.827961 32.534652,-86.82789 32.534706,-86.827814 32.534754,-86.827727 32.534799,-86.827549 32.534849,-86.827449 32.534867,-86.827343 32.534868,-86.827253 32.534846)\r\n4351;4301;all;Autauga County 60;Autauga;AL;36749;LINESTRING(-86.875176 32.575143,-86.875132 32.575146,-86.874795 32.575173,-86.874545 32.575186,-86.874381 32.575184,-86.874131 32.57517,-86.873541 32.575113,-86.873105 32.575096,-86.872842 32.575096,-86.872239 32.575134,-86.871814 32.575144,-86.871389 32.57514,-86.870681 32.575105)\r\n100;198;even;Heritage Hills Dr;Autauga;AL;36067;LINESTRING(-86.451979 32.480016,-86.452294 32.480024,-86.452628 32.480089,-86.45282 32.48018,-86.455366 32.480225,-86.456218 32.480119,-86.457287 32.480062)\r\n101;199;odd;Heritage Hills Dr;Autauga;AL;36067;LINESTRING(-86.451979 32.479852,-86.452318 32.479844,-86.452704 32.479915,-86.45288 32.479988,-86.455354 32.480051,-86.456198 32.479949,-86.457276 32.479898)\r\n400;464;even;Fig Tree St;Autauga;AL;36749;LINESTRING(-86.847728 32.504734,-86.847714 32.504807,-86.847683 32.505029,-86.847672 32.505177,-86.847667 32.505328,-86.847723 32.506128,-86.847754 32.506708,-86.847768 32.506856,-86.847791 32.507,-86.847804 32.507138,-86.847797 32.507273,-86.847774 32.507407,-86.847734 32.507549,-86.847716 32.50765)\r\n401;487;odd;Fig Tree St;Autauga;AL;36749;LINESTRING(-86.847921 32.504758,-86.84791 32.504829,-86.847881 32.505045,-86.84787 32.505185,-86.847865 32.505326,-86.847919 32.50612,-86.847952 32.506698,-86.847966 32.506838,-86.847989 32.506982,-86.848004 32.507134,-86.848001 32.507289,-86.847974 32.507441,-86.84793 32.507585,-86.847907 32.507679)\r\n20800;20898;even;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.651621 32.66237,-86.651521 32.662617,-86.651387 32.662883,-86.651234 32.663139,-86.650596 32.664098,-86.64973 32.66534,-86.649554 32.665578)\r\n2301;2499;odd;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.651806 32.662421,-86.651711 32.662677,-86.651569 32.662955,-86.65141 32.663219,-86.650766 32.66418,-86.649898 32.665426,-86.649719 32.665665)\r\n154;198;all;First St;Autauga;AL;36067;LINESTRING(-86.470904 32.457995,-86.470402 32.45796,-86.470278 32.45795)\r\n1101;1111;all;Valridge W;Autauga;AL;36066;LINESTRING(-86.435528 32.501266,-86.435597 32.501265,-86.435653 32.501265)\r\n1200;1256;even;Huie St;Autauga;AL;36066;LINESTRING(-86.443155 32.464486,-86.443144 32.464483,-86.442971 32.464493,-86.442018 32.464518)\r\n1201;1257;odd;Huie St;Autauga;AL;36066;LINESTRING(-86.443155 32.46465,-86.44315 32.464653,-86.442981 32.464661,-86.442024 32.464683)\r\n2700;2798;even;Jared Rd;Autauga;AL;36022;LINESTRING(-86.512918 32.659435,-86.512906 32.659553,-86.512877 32.659689,-86.512833 32.659828,-86.512754 32.660031,-86.512629 32.660297,-86.512206 32.661089,-86.512058 32.661347,-86.511851 32.661659,-86.511589 32.662017,-86.511495 32.662125,-86.511102 32.662502,-86.51099 32.662622,-86.510901 32.662753,-86.510827 32.662888,-86.510177 32.664145,-86.510062 32.664333,-86.509935 32.664512,-86.50984 32.664622,-86.509789 32.664669,-86.509672 32.664758,-86.509612 32.664796,-86.509549 32.664826,-86.509482 32.66485,-86.509412 32.664867,-86.509339 32.664876,-86.508656 32.664896,-86.50779 32.66492,-86.507601 32.664946)\r\n2701;2799;odd;Jared Rd;Autauga;AL;36022;LINESTRING(-86.513113 32.65944,-86.513116 32.659575,-86.513069 32.659729,-86.513025 32.659876,-86.512944 32.660089,-86.512811 32.660363,-86.512384 32.661159,-86.512238 32.661425,-86.512021 32.661745,-86.511757 32.662111,-86.511655 32.662233,-86.511258 32.66261,-86.511162 32.66272,-86.511081 32.662833,-86.511007 32.662958,-86.510359 32.664217,-86.510238 32.664415,-86.510105 32.664608,-86.509998 32.66473,-86.509935 32.664791,-86.509802 32.664892,-86.509724 32.66494,-86.509641 32.664982,-86.50955 32.665014,-86.509456 32.665037,-86.509357 32.66505,-86.508662 32.665062,-86.507808 32.665092,-86.507627 32.665109)\r\n498;400;all;N Autauga St;Autauga;AL;36003;LINESTRING(-86.650034 32.426953,-86.65005 32.426982,-86.650065 32.427018)\r\n198;100;all;Woodvale Rd;Autauga;AL;36067;LINESTRING(-86.457334 32.468363,-86.457319 32.468032,-86.457306 32.467527,-86.457277 32.466734,-86.457275 32.466627,-86.457215 32.464735,-86.457218 32.464564)\r\n730;798;even;Kingsley Dr;Autauga;AL;36066;LINESTRING(-86.420014 32.470668,-86.420087 32.47103,-86.420156 32.471278,-86.420206 32.471379)\r\n729;799;odd;Kingsley Dr;Autauga;AL;36066;LINESTRING(-86.420205 32.470639,-86.420283 32.470996,-86.420352 32.471226,-86.420389 32.47132)\r\n2399;1301;odd;Key Dr;Autauga;AL;36003;LINESTRING(-86.650758 32.457168,-86.650748 32.457133,-86.650678 32.45707,-86.650614 32.45701,-86.650535 32.456957,-86.650451 32.456916,-86.650361 32.456879,-86.650267 32.456856,-86.650175 32.456839,-86.65008 32.456827,-86.649987 32.456826,-86.64981 32.456825,-86.64955 32.456841,-86.648775 32.45687,-86.648597 32.456877,-86.648406 32.456901,-86.64823 32.456978,-86.648077 32.457082,-86.647961 32.457212,-86.647876 32.457341,-86.647785 32.457459,-86.647686 32.457574,-86.647582 32.457682,-86.647469 32.457784,-86.64735 32.457878,-86.647086 32.458054,-86.646316 32.458505,-86.646176 32.458578,-86.646031 32.458642,-86.645888 32.458687,-86.645743 32.458709,-86.645583 32.458708,-86.645421 32.458697,-86.645337 32.458686,-86.64508 32.458663,-86.643874 32.458636,-86.643533 32.458623,-86.643027 32.458586,-86.642958 32.458573,-86.642928 32.45857)\r\n2398;2300;even;Key Dr;Autauga;AL;36003;LINESTRING(-86.650584 32.457242,-86.650568 32.457233,-86.650528 32.457184,-86.650474 32.45714,-86.650417 32.457101,-86.650355 32.457068,-86.650287 32.457043,-86.650215 32.457022,-86.650139 32.457007,-86.650062 32.456999,-86.649983 32.456994,-86.649816 32.456995,-86.64956 32.457007,-86.648787 32.457036,-86.648623 32.457049,-86.648476 32.457077,-86.648346 32.45713,-86.648231 32.45721,-86.648133 32.45731,-86.648046 32.457431,-86.647947 32.457555,-86.647846 32.457676,-86.647734 32.457794,-86.647611 32.457904,-86.647484 32.458008,-86.647204 32.45819,-86.646426 32.458647,-86.646276 32.458726,-86.646117 32.458796,-86.645948 32.458865,-86.645755 32.458883,-86.645573 32.458878,-86.645397 32.458865,-86.645311 32.458854,-86.645066 32.458833,-86.643866 32.458802,-86.643521 32.458789,-86.642999 32.458758,-86.642902 32.458743,-86.64286 32.458724)\r\n1208;1224;even;Conestoga Wagon Trl;Autauga;AL;36067;LINESTRING(-86.501067 32.502378,-86.501081 32.502376,-86.501171 32.502355,-86.501423 32.502278,-86.50151 32.502239,-86.501589 32.502195,-86.501734 32.502102,-86.50176 32.502071)\r\n1203;1225;odd;Conestoga Wagon Trl;Autauga;AL;36067;LINESTRING(-86.501002 32.502223,-86.501019 32.502216,-86.501107 32.502193,-86.501339 32.502118,-86.501408 32.502089,-86.501471 32.502055,-86.501594 32.501972,-86.501618 32.501958)\r\n500;598;even;Mt Airy Dr;Autauga;AL;36067;LINESTRING(-86.461876 32.476515,-86.46187 32.476562,-86.46178 32.477274,-86.461749 32.477563,-86.461726 32.477852,-86.46167 32.478662,-86.461774 32.478981,-86.462065 32.479187,-86.462349 32.479358,-86.462623 32.479517,-86.46289 32.479751,-86.462941 32.479852,-86.462963 32.479978,-86.462965 32.480987,-86.462976 32.481421,-86.462975 32.481648)\r\n501;599;odd;Mt Airy Dr;Autauga;AL;36067;LINESTRING(-86.46207 32.47652,-86.462072 32.476574,-86.461976 32.47729,-86.461945 32.477577,-86.461922 32.477862,-86.461884 32.47864,-86.461976 32.478873,-86.462193 32.479053,-86.462461 32.47922,-86.462757 32.479377,-86.463082 32.479645,-86.463153 32.479808,-86.463167 32.47997,-86.463161 32.480985,-86.463172 32.481419,-86.46317 32.481649)\r\n2998;3036;even;Autauga County 57;Autauga;AL;36091;LINESTRING(-86.54954 32.688776,-86.549635 32.688895,-86.55014 32.689487,-86.552115 32.69185,-86.553055 32.692957,-86.553288 32.69325,-86.553415 32.69343,-86.5536 32.693747,-86.553657 32.693875,-86.553686 32.693952)\r\n2993;3037;odd;Autauga County 57;Autauga;AL;36091;LINESTRING(-86.549701 32.688683,-86.549797 32.688799,-86.5503 32.689391,-86.552275 32.691754,-86.553217 32.692861,-86.553456 32.69316,-86.553593 32.693348,-86.553788 32.693679,-86.553849 32.693823,-86.553874 32.693907)\r\n500;544;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.450984 32.461206,-86.450985 32.461086)\r\n500;468;all;Durden Rd;Autauga;AL;36067;LINESTRING(-86.488386 32.482124,-86.488307 32.481861,-86.488232 32.481659,-86.488172 32.481527,-86.487993 32.481204)\r\n120;198;all;Holly Ct;Autauga;AL;36066;LINESTRING(-86.446897 32.480798,-86.446786 32.480844,-86.446623 32.480838,-86.446445 32.480787,-86.446394 32.480761)\r\n1598;1500;even;Delma Woods;Autauga;AL;36067;LINESTRING(-86.490617 32.538762,-86.490644 32.537811,-86.490658 32.536732)\r\n1599;1501;odd;Delma Woods;Autauga;AL;36067;LINESTRING(-86.490422 32.538758,-86.490448 32.537809,-86.490463 32.53673)\r\n399;319;odd;Tapia Ln;Autauga;AL;36067;LINESTRING(-86.552397 32.404291,-86.552441 32.404265,-86.552448 32.404153,-86.552445 32.404099,-86.552449 32.40404,-86.552448 32.403976,-86.552446 32.403912,-86.552446 32.403845,-86.552444 32.403771,-86.552441 32.403697,-86.552438 32.403619,-86.552437 32.403586)\r\n398;312;even;Tapia Ln;Autauga;AL;36067;LINESTRING(-86.55224 32.404194,-86.552223 32.404189,-86.552244 32.404137,-86.552251 32.404093,-86.552251 32.404038,-86.552252 32.403978,-86.552252 32.403914,-86.55225 32.403847,-86.552248 32.403775,-86.552245 32.403701,-86.552244 32.403623,-86.552243 32.403589)\r\n1500;1566;even;Rolling Hills Dr;Autauga;AL;36067;LINESTRING(-86.534919 32.447,-86.535159 32.44702,-86.535829 32.447055,-86.536089 32.447061)\r\n1501;1567;odd;Rolling Hills Dr;Autauga;AL;36067;LINESTRING(-86.534937 32.446836,-86.535175 32.446854,-86.535839 32.446889,-86.536095 32.446897)\r\n1700;1748;all;Autauga County 103;Autauga;AL;36758;LINESTRING(-86.908082 32.662291,-86.908022 32.662338,-86.907901 32.662424,-86.907773 32.662496,-86.907558 32.662591,-86.907409 32.662642,-86.907254 32.662683,-86.906842 32.66277,-86.905494 32.663009,-86.905046 32.663105)\r\n378;598;all;Sally Ridge Rd;Autauga;AL;36067;LINESTRING(-86.472518 32.452103,-86.472543 32.452009)\r\n210;298;even;Leigh Dr;Autauga;AL;36067;LINESTRING(-86.447744 32.451462,-86.447692 32.450217,-86.447691 32.450034)\r\n201;299;odd;Leigh Dr;Autauga;AL;36067;LINESTRING(-86.44755 32.451468,-86.447494 32.450219,-86.447497 32.450033)\r\n1846;1860;even;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.545961 32.551896,-86.545997 32.552036,-86.546168 32.552594,-86.546305 32.553087,-86.546513 32.553789,-86.546709 32.554491,-86.54702 32.555534,-86.547072 32.555736,-86.547104 32.555846)\r\n1837;1851;odd;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.54615 32.551859,-86.546189 32.551996,-86.54636 32.552554,-86.546495 32.553049,-86.546703 32.553749,-86.546899 32.554451,-86.547214 32.555496,-86.547264 32.5557,-86.547294 32.555808)\r\n500;524;even;Overton Dr;Autauga;AL;36066;LINESTRING(-86.42113 32.486635,-86.421146 32.486643,-86.421637 32.486619,-86.422147 32.486597,-86.422234 32.486601,-86.422348 32.48659,-86.422539 32.486576)\r\n501;529;odd;Overton Dr;Autauga;AL;36066;LINESTRING(-86.421045 32.486487,-86.421092 32.486453,-86.421629 32.486453,-86.422145 32.486431,-86.422228 32.486431,-86.422332 32.486426,-86.422522 32.486412)\r\n4499;4401;odd;Autauga County 14;Autauga;AL;36749;LINESTRING(-86.918913 32.658727,-86.918885 32.658715,-86.918623 32.658679,-86.918446 32.658663,-86.918268 32.65866,-86.918088 32.658668,-86.917994 32.658675,-86.917649 32.65874,-86.91756 32.658763,-86.917393 32.658818,-86.91723 32.658881,-86.917003 32.658991,-86.916054 32.659479,-86.915835 32.659583,-86.91561 32.659676,-86.915457 32.659727,-86.91522 32.659788,-86.915061 32.659817,-86.914899 32.659835,-86.914649 32.659849,-86.914225 32.659846,-86.913367 32.659826,-86.913172 32.659825,-86.91317 32.659826)\r\n4498;4430;even;Autauga County 14;Autauga;AL;36758;LINESTRING(-86.918856 32.658885,-86.918837 32.658885,-86.918595 32.658847,-86.918432 32.658833,-86.91827 32.658826,-86.918106 32.658836,-86.918028 32.658845,-86.917701 32.658906,-86.917626 32.658925,-86.917471 32.658974,-86.917322 32.659033,-86.917103 32.659135,-86.916154 32.659623,-86.915929 32.659733,-86.915692 32.659832,-86.915525 32.659887,-86.91527 32.659956,-86.915095 32.659983,-86.914919 32.660005,-86.914653 32.660017,-86.914221 32.660012,-86.913363 32.659992,-86.91317 32.659991,-86.913167 32.65999)\r\n1477;1301;odd;Autauga County 24;Autauga;AL;36006;LINESTRING(-86.670738 32.671325,-86.670583 32.671409,-86.67043 32.671501,-86.670223 32.671655,-86.669917 32.671927,-86.66875 32.673004,-86.668168 32.67353,-86.66793 32.673729,-86.66768 32.673924,-86.667422 32.674113,-86.667159 32.674295,-86.666822 32.674514,-86.666123 32.674943,-86.665863 32.675104,-86.665783 32.675153,-86.665322 32.675423,-86.665095 32.675577,-86.663589 32.676503,-86.663308 32.676663,-86.663019 32.676814,-86.662725 32.676956,-86.662278 32.677151,-86.661813 32.677325,-86.660705 32.677696,-86.660546 32.677752,-86.660389 32.677816,-86.660236 32.677883,-86.660085 32.677957,-86.659938 32.678036,-86.659796 32.678123,-86.659521 32.678303,-86.65939 32.678402,-86.659264 32.678502,-86.659143 32.678613,-86.659028 32.678725,-86.657954 32.67986,-86.657734 32.680082,-86.657621 32.680187,-86.657383 32.680391,-86.657261 32.680487,-86.657134 32.680579,-86.656868 32.680752,-86.656588 32.680907,-86.656445 32.680976,-86.656296 32.681041,-86.655991 32.681159,-86.655837 32.68121,-86.655516 32.681302,-86.654375 32.681596,-86.653727 32.681773,-86.653241 32.681917,-86.652597 32.682123,-86.651883 32.682363,-86.651643 32.682447,-86.651409 32.682541,-86.651179 32.682642,-86.650955 32.682755,-86.650737 32.682875,-86.650592 32.682959,-86.650181 32.683227,-86.649802 32.683523,-86.648533 32.684591,-86.647934 32.685097,-86.647273 32.68564)\r\n1484;1300;even;Autauga County 24;Autauga;AL;36006;LINESTRING(-86.670845 32.671463,-86.670697 32.671547,-86.670558 32.671635,-86.670363 32.671779,-86.670061 32.672041,-86.668894 32.673116,-86.66831 32.673646,-86.668066 32.673849,-86.667812 32.674048,-86.66755 32.674241,-86.667281 32.674425,-86.66694 32.674648,-86.666239 32.675077,-86.665979 32.675238,-86.665897 32.675287,-86.665442 32.675559,-86.665215 32.675711,-86.663703 32.676641,-86.663416 32.676803,-86.663121 32.676958,-86.662821 32.677104,-86.662364 32.677305,-86.661889 32.677479,-86.660781 32.67785,-86.660628 32.677906,-86.660477 32.677966,-86.660332 32.678031,-86.660189 32.678101,-86.66005 32.678176,-86.659916 32.678257,-86.659649 32.678433,-86.659524 32.678526,-86.659406 32.678622,-86.659291 32.678725,-86.65918 32.678833,-86.658106 32.679966,-86.657884 32.680192,-86.657767 32.680303,-86.657521 32.680513,-86.657393 32.680611,-86.657262 32.680709,-86.656986 32.680892,-86.656692 32.681051,-86.656539 32.681124,-86.656384 32.681193,-86.656069 32.681315,-86.655905 32.681368,-86.655576 32.68146,-86.654435 32.681754,-86.653791 32.681931,-86.653309 32.682073,-86.652669 32.682277,-86.651957 32.682517,-86.651725 32.682601,-86.651497 32.682691,-86.651277 32.68279,-86.651059 32.682897,-86.650847 32.683013,-86.65071 32.683095,-86.650313 32.683357,-86.64994 32.683645,-86.648671 32.684707,-86.648072 32.685215,-86.647409 32.685758)\r\n510;598;even;Hallmark Dr;Autauga;AL;36067;LINESTRING(-86.462636 32.452987,-86.462639 32.452921,-86.462628 32.452699,-86.462633 32.452436)\r\n509;599;odd;Hallmark Dr;Autauga;AL;36067;LINESTRING(-86.462441 32.452982,-86.462443 32.452921,-86.462432 32.452701,-86.462438 32.452433)\r\n451;421;odd;Durden Rd;Autauga;AL;36067;LINESTRING(-86.486902 32.47869,-86.486898 32.478616,-86.486869 32.477821,-86.486848 32.477595,-86.486796 32.477371,-86.486749 32.477224,-86.486717 32.477155)\r\n466;426;even;Durden Rd;Autauga;AL;36067;LINESTRING(-86.486707 32.478698,-86.486702 32.478624,-86.486669 32.477831,-86.486646 32.477619,-86.4866 32.477409,-86.486557 32.477274,-86.486533 32.47721)\r\n307;301;odd;S Washington St;Autauga;AL;36003;LINESTRING(-86.65267 32.428316,-86.653106 32.42888)\r\n308;300;even;S Washington St;Autauga;AL;36003;LINESTRING(-86.652832 32.428226,-86.653268 32.42879)\r\n1600;1676;all;Alt Rte Route Cord 39;Autauga;AL;36022;LINESTRING(-86.439854 32.538421,-86.439843 32.538482,-86.439875 32.538569,-86.440257 32.539465,-86.440325 32.539606,-86.440464 32.539801,-86.440524 32.539861,-86.44064 32.539975,-86.440773 32.540083,-86.440996 32.540211,-86.44116 32.540277,-86.441244 32.540306,-86.441412 32.540347,-86.441441 32.540353)\r\n750;700;all;Strickland Landing Rd;Autauga;AL;36003;LINESTRING(-86.6415 32.415194,-86.641532 32.415208,-86.641679 32.415274,-86.641906 32.41536,-86.642222 32.41546,-86.643206 32.415719,-86.643534 32.415824,-86.643851 32.415942,-86.644021 32.416012,-86.645861 32.416763,-86.646488 32.416996,-86.646644 32.417044,-86.64672 32.417063,-86.646798 32.417078,-86.646872 32.417086,-86.646948 32.417087)\r\n100;198;even;Colonial Ct;Autauga;AL;36066;LINESTRING(-86.448914 32.471741,-86.449165 32.471825,-86.44925 32.471856)\r\n101;199;odd;Colonial Ct;Autauga;AL;36066;LINESTRING(-86.448984 32.471587,-86.449243 32.471669,-86.449332 32.471707)\r\n3498;3548;even;US Hwy 82;Autauga;AL;36006;LINESTRING(-86.752617 32.639897,-86.752839 32.64012,-86.753151 32.640405,-86.753403 32.640619,-86.753796 32.640919,-86.753998 32.641065,-86.754069 32.641108,-86.754272 32.641248,-86.754834 32.641595,-86.755117 32.641765,-86.757232 32.643001,-86.758635 32.643833,-86.760047 32.644655,-86.760488 32.644914)\r\n3501;3527;odd;US Hwy 82;Autauga;AL;36006;LINESTRING(-86.752766 32.639791,-86.752987 32.640008,-86.753295 32.640289,-86.753541 32.640497,-86.753926 32.640793,-86.754122 32.640931,-86.754191 32.640974,-86.754394 32.641114,-86.75495 32.641461,-86.755229 32.641629,-86.757344 32.642865,-86.758747 32.643697,-86.760159 32.644519,-86.7606 32.644779)\r\n198;100;all;Riverview Rd;Autauga;AL;36003;LINESTRING(-86.663184 32.38739,-86.663193 32.387413,-86.663237 32.387543,-86.663291 32.387669,-86.663323 32.387729,-86.663445 32.387908,-86.663537 32.388022,-86.663587 32.388074,-86.663697 32.388177,-86.663879 32.388328,-86.664006 32.38842,-86.664415 32.388684,-86.664621 32.388825,-86.664812 32.388981,-86.66493 32.389096,-86.665038 32.389213,-86.665092 32.389276,-86.665138 32.389345,-86.665218 32.389476,-86.665361 32.389745,-86.665446 32.389956,-86.666495 32.392732,-86.666659 32.393144,-86.666873 32.393621,-86.667239 32.394411)\r\n798;700;all;W 4th St;Autauga;AL;36067;LINESTRING(-86.501722 32.46817,-86.501546 32.46813,-86.500259 32.467713,-86.49945 32.467463,-86.499262 32.467399)\r\n1749;1799;all;US Hwy 31;Autauga;AL;36067;LINESTRING(-86.462127 32.56175,-86.462845 32.563919)\r\n223;299;all;S Court St;Autauga;AL;36067;LINESTRING(-86.47546 32.460646,-86.475502 32.460217,-86.475508 32.460104,-86.475493 32.460041,-86.475493 32.460036,-86.475459 32.460017,-86.475368 32.459988)\r\n498;490;all;Greystone Way;Autauga;AL;36066;LINESTRING(-86.425386 32.463542,-86.425378 32.463617,-86.425341 32.463686,-86.425208 32.46388,-86.425108 32.464003,-86.424847 32.464297,-86.424814 32.464328)\r\n1513;1539;all;Monfee Rd;Autauga;AL;36067;LINESTRING(-86.500686 32.510938,-86.501547 32.510918,-86.502581 32.510907,-86.50349 32.510889)\r\n1567;1575;all;US Hwy 31;Autauga;AL;36067;LINESTRING(-86.45579 32.533601,-86.455793 32.533618,-86.455804 32.533743)\r\n700;798;even;Blueberry Hill Rd;Autauga;AL;36067;LINESTRING(-86.596968 32.505485,-86.596983 32.505483,-86.597057 32.505461,-86.597133 32.505444,-86.597477 32.505389,-86.597578 32.505361,-86.597654 32.505312,-86.597713 32.505294,-86.597763 32.505279,-86.59783 32.505283,-86.597902 32.505293,-86.598307 32.505387,-86.598548 32.50545,-86.598617 32.505475,-86.598683 32.505503,-86.598736 32.505538,-86.59878 32.505575,-86.598815 32.50562,-86.598846 32.505674,-86.598868 32.505734,-86.598888 32.505799,-86.598978 32.506219,-86.59901 32.506426,-86.599034 32.506708,-86.599045 32.507067,-86.599047 32.507714,-86.59904 32.508216,-86.599005 32.508941,-86.599006 32.509306,-86.599025 32.509667,-86.599028 32.509954,-86.599043 32.510532,-86.599043 32.513205,-86.599038 32.513779,-86.599017 32.514279,-86.599006 32.514713,-86.599007 32.514934,-86.599025 32.515084,-86.599056 32.515235,-86.599113 32.515381,-86.59918 32.51552,-86.59929 32.515715,-86.599315 32.515774,-86.599351 32.515902,-86.599369 32.516037,-86.599371 32.516101,-86.599321 32.516742,-86.599287 32.516946,-86.599252 32.517077,-86.599179 32.517276,-86.59913 32.517388)\r\n701;799;odd;Blueberry Hill Rd;Autauga;AL;36067;LINESTRING(-86.596893 32.505333,-86.596911 32.505323,-86.596999 32.505299,-86.597087 32.505278,-86.597421 32.505219,-86.597482 32.505197,-86.59755 32.505166,-86.597639 32.505114,-86.597753 32.505107,-86.597854 32.505111,-86.597948 32.505125,-86.598363 32.505227,-86.598612 32.50529,-86.598701 32.505315,-86.598787 32.505355,-86.598874 32.505398,-86.598946 32.505463,-86.599001 32.505536,-86.599036 32.505616,-86.599064 32.50569,-86.599082 32.505765,-86.599174 32.506193,-86.59921 32.506408,-86.599234 32.5067,-86.599241 32.507065,-86.599243 32.507714,-86.599238 32.50822,-86.599203 32.508945,-86.599204 32.509302,-86.599223 32.509663,-86.599224 32.509952,-86.599239 32.51053,-86.599239 32.513205,-86.599236 32.513783,-86.599213 32.514285,-86.5992 32.514713,-86.599209 32.514924,-86.599225 32.51506,-86.599256 32.515193,-86.599303 32.515323,-86.599364 32.515452,-86.599476 32.515647,-86.599513 32.515722,-86.599555 32.515872,-86.599573 32.516027,-86.599571 32.516107,-86.599521 32.51676,-86.599485 32.516976,-86.599448 32.517121,-86.599371 32.517334,-86.59931 32.51745)\r\n1163;1175;all;Valridge W;Autauga;AL;36066;LINESTRING(-86.438698 32.501247,-86.438947 32.501245)\r\n1901;1925;all;Tara Dr;Autauga;AL;36066;LINESTRING(-86.417997 32.454238,-86.417654 32.454241,-86.417127 32.454265,-86.416858 32.454244,-86.41649 32.454164,-86.416432 32.454129)\r\n2600;2698;even;Dove Ln;Autauga;AL;36022;LINESTRING(-86.433214 32.547706,-86.433118 32.54769,-86.432947 32.547656,-86.432767 32.547643,-86.43208 32.547625,-86.431566 32.54762,-86.431223 32.547635,-86.430965 32.547653,-86.430198 32.547728,-86.429696 32.547795,-86.429656 32.547807)\r\n2601;2699;odd;Dove Ln;Autauga;AL;36022;LINESTRING(-86.433182 32.547868,-86.43308 32.547856,-86.432915 32.547828,-86.432753 32.547813,-86.432076 32.547791,-86.43157 32.547788,-86.431237 32.547801,-86.430985 32.547819,-86.430226 32.547894,-86.429736 32.547963,-86.429701 32.547967)\r\n927;999;all;Raines Dr;Autauga;AL;36067;LINESTRING(-86.607697 32.652742,-86.607834 32.652834,-86.608859 32.653283,-86.608875 32.653297,-86.608967 32.653284,-86.609338 32.65322,-86.609363 32.653201,-86.609457 32.653185,-86.609461 32.653181,-86.609475 32.653116,-86.60959 32.652959,-86.609692 32.652818,-86.609821 32.652725,-86.610048 32.652602,-86.610437 32.652458,-86.610787 32.652445,-86.610974 32.652476,-86.61117 32.652548,-86.611441 32.652623,-86.611588 32.652632,-86.61181 32.652539,-86.611913 32.652445,-86.612198 32.652342,-86.612558 32.652144,-86.613284 32.651878,-86.613544 32.651784,-86.61359 32.651793)\r\n1601;1603;all;Autauga County 81;Autauga;AL;36067;LINESTRING(-86.569872 32.521519,-86.569877 32.52152,-86.569863 32.521658,-86.569868 32.521799,-86.569867 32.52182)\r\n901;947;all;Washington Ferry Rd;Autauga;AL;36067;LINESTRING(-86.468549 32.405043,-86.469968 32.404311)\r\n2198;2100;all;Bear Dr;Autauga;AL;36006;LINESTRING(-86.704471 32.657992,-86.704489 32.657997,-86.704636 32.658076,-86.704848 32.6582,-86.705168 32.658441,-86.70542 32.658639,-86.705972 32.659093,-86.706162 32.659242,-86.706358 32.659379,-86.706493 32.659462,-86.706636 32.659538,-86.706782 32.659605,-86.706934 32.659664,-86.707008 32.659688,-86.707166 32.659732,-86.707327 32.659769,-86.707656 32.659826,-86.708165 32.659897,-86.708397 32.659925)\r\n635;601;odd;Prairieview Dr;Autauga;AL;36067;LINESTRING(-86.477835 32.499318,-86.477858 32.498182)\r\n698;632;even;Prairieview Dr;Autauga;AL;36067;LINESTRING(-86.47764 32.499315,-86.477663 32.498179)\r\n599;589;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.4869 32.447247,-86.486862 32.447204,-86.486818 32.447154)\r\n598;588;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.486744 32.447345,-86.486706 32.447302,-86.486662 32.447253)\r\n100;198;even;Irma Ln;Autauga;AL;36066;LINESTRING(-86.424683 32.444422,-86.424652 32.444457,-86.424502 32.444631,-86.42421 32.444989,-86.424058 32.445165,-86.423909 32.445352,-86.42383 32.445498,-86.423776 32.445725,-86.423768 32.445877,-86.423752 32.446083,-86.423687 32.446261,-86.423495 32.446506)\r\n101;199;odd;Irma Ln;Autauga;AL;36066;LINESTRING(-86.42485 32.444506,-86.424822 32.444553,-86.424662 32.444729,-86.42437 32.445085,-86.424222 32.445261,-86.424093 32.445436,-86.424034 32.445554,-86.423982 32.445749,-86.423966 32.445885,-86.423968 32.446111,-86.423889 32.446345,-86.423653 32.446602)\r\n200;208;even;Stewart St;Autauga;AL;36067;LINESTRING(-86.476022 32.439566,-86.47545 32.440433,-86.475417 32.440482)\r\n201;209;odd;Stewart St;Autauga;AL;36067;LINESTRING(-86.476192 32.439646,-86.47562 32.440515,-86.475585 32.440565)\r\n1620;1698;even;Martin Dr;Autauga;AL;36022;LINESTRING(-86.444284 32.547239,-86.444298 32.547314,-86.444348 32.547749,-86.444406 32.548037,-86.444546 32.548676,-86.444614 32.548958,-86.444658 32.549101,-86.444675 32.549117)\r\n1601;1699;odd;Martin Dr;Autauga;AL;36022;LINESTRING(-86.444474 32.547202,-86.444504 32.547286,-86.444548 32.547727,-86.4446 32.548009,-86.44474 32.548644,-86.44481 32.548918,-86.444854 32.549039,-86.444851 32.549047)\r\n199;101;odd;Winchester Way;Autauga;AL;36067;LINESTRING(-86.472856 32.449565,-86.472834 32.449563,-86.472672 32.449555,-86.472575 32.449545,-86.472531 32.449536,-86.472457 32.449508,-86.472355 32.44948,-86.472277 32.449449,-86.471979 32.449451,-86.471458 32.449468)\r\n198;100;even;Winchester Way;Autauga;AL;36067;LINESTRING(-86.472841 32.449729,-86.47282 32.449729,-86.472662 32.449721,-86.472543 32.449725,-86.472455 32.449704,-86.472377 32.449668,-86.472291 32.449638,-86.472239 32.449633,-86.471979 32.449615,-86.471466 32.449632)\r\n900;952;all;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.689645 32.487278,-86.689759 32.487405,-86.690344 32.488038,-86.690832 32.488549,-86.691186 32.48891)\r\n1274;1280;all;E Main St;Autauga;AL;36066;LINESTRING(-86.438506 32.460365,-86.438178 32.460368,-86.437601 32.460369)\r\n100;198;even;Broken Arrow Ct;Autauga;AL;36067;LINESTRING(-86.457795 32.524917,-86.457856 32.52492,-86.458015 32.524931,-86.458103 32.524938,-86.458193 32.524945,-86.458285 32.524954,-86.458376 32.524965,-86.458474 32.524981,-86.458578 32.524994,-86.458679 32.525001,-86.458775 32.525011,-86.458873 32.525021,-86.458975 32.525034,-86.459078 32.525035,-86.459169 32.525041,-86.459261 32.52505,-86.459361 32.525052,-86.459455 32.525051,-86.459546 32.525052,-86.45964 32.52505,-86.459729 32.525049,-86.45982 32.525045,-86.45991 32.525043,-86.459998 32.525042,-86.460084 32.525042,-86.460169 32.525042,-86.460253 32.525042,-86.46033 32.52504,-86.460395 32.525041,-86.460451 32.525043,-86.460511 32.525048,-86.460633 32.525064,-86.460686 32.525072,-86.460785 32.525097,-86.460866 32.525099,-86.461017 32.525121,-86.461055 32.525078)\r\n101;199;odd;Broken Arrow Ct;Autauga;AL;36067;LINESTRING(-86.457793 32.524752,-86.457866 32.524748,-86.458035 32.524767,-86.458121 32.524774,-86.458211 32.524781,-86.458307 32.524786,-86.45841 32.524797,-86.458508 32.524815,-86.458602 32.524826,-86.458701 32.524835,-86.458799 32.524847,-86.458897 32.524857,-86.458991 32.524864,-86.459086 32.524869,-86.459185 32.524871,-86.459277 32.52488,-86.459365 32.524884,-86.459457 32.524885,-86.459546 32.524888,-86.459634 32.524886,-86.459723 32.524883,-86.459812 32.524881,-86.459904 32.524877,-86.459996 32.524876,-86.460086 32.524876,-86.460169 32.524878,-86.460249 32.524876,-86.460326 32.524874,-86.460401 32.524871,-86.460469 32.524877,-86.460535 32.524884,-86.460667 32.524896,-86.46073 32.524908,-86.460821 32.524923,-86.460888 32.524933,-86.460939 32.524933,-86.460914 32.524965)\r\n1308;1398;even;Carson Dr;Autauga;AL;36067;LINESTRING(-86.479297 32.497276,-86.479584 32.497279,-86.479742 32.497288,-86.479858 32.497306,-86.479974 32.49734,-86.480061 32.49738,-86.480144 32.497432,-86.48023 32.497499,-86.480301 32.497574,-86.480362 32.497652,-86.480435 32.497766,-86.480518 32.49789,-86.48052 32.497892)\r\n1307;1399;odd;Carson Dr;Autauga;AL;36067;LINESTRING(-86.479297 32.497111,-86.47959 32.497109,-86.479764 32.497118,-86.479908 32.497132,-86.48006 32.497178,-86.480175 32.497234,-86.480276 32.4973,-86.480374 32.497379,-86.480477 32.497468,-86.480534 32.497574,-86.480607 32.497686,-86.480688 32.497808,-86.480689 32.497811)\r\n198;100;even;Pine Level Ct;Autauga;AL;36022;LINESTRING(-86.468181 32.586773,-86.468169 32.585768)\r\n101;299;odd;Pine Level Ct;Autauga;AL;36022;LINESTRING(-86.467986 32.586774,-86.467974 32.585769)\r\n212;200;all;Shady Valley Rd;Autauga;AL;36003;LINESTRING(-86.79165 32.446569,-86.791678 32.446984,-86.79168 32.449097,-86.791689 32.449925)\r\n220;298;even;Brookhaven Dr;Autauga;AL;36066;LINESTRING(-86.44092 32.47249,-86.440811 32.472442,-86.440537 32.472409,-86.44036 32.472402,-86.440098 32.472399,-86.439833 32.472417,-86.439638 32.472447,-86.439568 32.472463)\r\n219;299;odd;Brookhaven Dr;Autauga;AL;36066;LINESTRING(-86.440845 32.472642,-86.440751 32.472618,-86.440515 32.472581,-86.440352 32.47257,-86.440106 32.472569,-86.439859 32.472587,-86.439678 32.472613,-86.439613 32.472624)\r\n2043;2053;all;Maul Dr;Autauga;AL;36006;LINESTRING(-86.715831 32.660256,-86.715801 32.660263)\r\n100;798;even;Taylor St;Autauga;AL;36067;LINESTRING(-86.46855 32.473821,-86.468556 32.474076,-86.468625 32.474437,-86.468628 32.474453)\r\n101;799;odd;Taylor St;Autauga;AL;36067;LINESTRING(-86.468744 32.473815,-86.46876 32.47406,-86.468819 32.474415,-86.468821 32.474432)\r\n2499;2411;odd;Wyncove Way;Autauga;AL;36067;LINESTRING(-86.519864 32.445893,-86.519715 32.445891,-86.519388 32.445894,-86.519052 32.445882,-86.51888 32.44587,-86.518445 32.44586,-86.518178 32.44586,-86.51799 32.445874,-86.517713 32.445943,-86.517543 32.446043,-86.517363 32.446238,-86.517291 32.446398,-86.517259 32.446634,-86.51726 32.44679,-86.517271 32.446863)\r\n2498;2412;even;Wyncove Way;Autauga;AL;36067;LINESTRING(-86.519861 32.446057,-86.519715 32.446055,-86.519386 32.44606,-86.51904 32.44605,-86.518868 32.446038,-86.518443 32.446026,-86.51819 32.446032,-86.518032 32.44605,-86.517811 32.446111,-86.517695 32.446179,-86.517555 32.44633,-86.517501 32.446444,-86.517465 32.446646,-86.517462 32.446784,-86.517464 32.44685)\r\n949;999;all;Washington Ferry Rd;Autauga;AL;36067;LINESTRING(-86.470217 32.404184,-86.472006 32.403291,-86.472444 32.403137,-86.473088 32.403082,-86.477287 32.403351,-86.477442 32.403333)\r\n626;898;all;Jason Rd;Autauga;AL;36067;LINESTRING(-86.636103 32.506054,-86.636184 32.506444,-86.636226 32.506731,-86.636247 32.507016,-86.63625 32.507304,-86.636242 32.507743,-86.636241 32.508182,-86.636302 32.510005,-86.636324 32.510369,-86.636397 32.511312,-86.636408 32.511598,-86.636401 32.51174,-86.636388 32.51188,-86.636252 32.512892,-86.636219 32.513256,-86.636174 32.514129,-86.636148 32.514417,-86.63601 32.51543,-86.635955 32.515941,-86.635883 32.516814,-86.63585 32.517103,-86.635803 32.517388,-86.63574 32.517672,-86.635699 32.517808,-86.635646 32.517938,-86.635579 32.518062,-86.635498 32.51818,-86.635405 32.518298,-86.635304 32.518414,-86.635206 32.51854,-86.63511 32.51867,-86.635034 32.518812,-86.634985 32.518961,-86.634947 32.51911,-86.634935 32.519262,-86.634939 32.519415,-86.635017 32.519997,-86.635039 32.520141,-86.635054 32.520282,-86.635062 32.520423,-86.635062 32.52068)\r\n201;299;odd;Harlem St;Autauga;AL;36067;LINESTRING(-86.462397 32.467155,-86.462385 32.466972,-86.462371 32.46668,-86.462379 32.46639,-86.462381 32.466335)\r\n200;298;even;Harlem St;Autauga;AL;36067;LINESTRING(-86.462203 32.467165,-86.462189 32.46698,-86.462175 32.466682,-86.462177 32.466382,-86.462187 32.466321)\r\n1386;1398;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.510532 32.470983,-86.510658 32.471032,-86.510706 32.471044,-86.511399 32.471259,-86.511407 32.471261)\r\n1387;1399;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.51061 32.470832,-86.510732 32.470874,-86.510774 32.47089,-86.511465 32.471103,-86.51147 32.471105)\r\n699;601;odd;Boxwood Rd;Autauga;AL;36067;LINESTRING(-86.455607 32.478348,-86.455611 32.477213,-86.455601 32.476996,-86.455597 32.476779,-86.4556 32.476597)\r\n698;600;even;Boxwood Rd;Autauga;AL;36067;LINESTRING(-86.455413 32.478347,-86.455413 32.477217,-86.455403 32.477,-86.455403 32.476779,-86.455405 32.476596)\r\n1496;1498;even;Autauga County 73;Autauga;AL;36006;LINESTRING(-86.713796 32.57065,-86.713744 32.57066,-86.71364 32.570687,-86.713471 32.570749,-86.713322 32.570843,-86.713189 32.570942,-86.712998 32.571092)\r\n1497;1499;odd;Autauga County 73;Autauga;AL;36006;LINESTRING(-86.713848 32.570809,-86.713802 32.570822,-86.713714 32.570849,-86.713577 32.570905,-86.713448 32.570979,-86.713321 32.571068,-86.71313 32.571213)\r\n400;418;even;Utah Ct;Autauga;AL;36067;LINESTRING(-86.488955 32.477797,-86.489073 32.477797,-86.489137 32.477797)\r\n401;417;odd;Utah Ct;Autauga;AL;36067;LINESTRING(-86.488955 32.477633,-86.489073 32.477633,-86.489137 32.477633)\r\n1874;1898;even;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.600409 32.641979,-86.600429 32.643139,-86.600439 32.6435,-86.600466 32.645306,-86.600506 32.647465,-86.600514 32.648039)\r\n1839;1879;odd;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.600604 32.641976,-86.600625 32.643135,-86.600635 32.643498,-86.600662 32.645304,-86.600702 32.647463,-86.600709 32.648038)\r\n399;215;odd;Durden Rd;Autauga;AL;36067;LINESTRING(-86.484883 32.475121,-86.48488 32.475116,-86.484773 32.475007,-86.484673 32.474893,-86.484583 32.474776,-86.484471 32.47459,-86.48437 32.474328,-86.484328 32.474049,-86.484335 32.473914,-86.484389 32.473638,-86.4845 32.473377,-86.484663 32.473134,-86.485011 32.472719,-86.485753 32.471856)\r\n402;152;even;Durden Rd;Autauga;AL;36067;LINESTRING(-86.48474 32.475233,-86.48473 32.475226,-86.484617 32.475111,-86.484509 32.474991,-86.484407 32.474864,-86.484277 32.47466,-86.48416 32.474366,-86.484126 32.474055,-86.484129 32.473898,-86.484185 32.473594,-86.484308 32.473301,-86.484493 32.47304,-86.484853 32.472623,-86.485596 32.471759)\r\n1113;1127;all;Valridge W;Autauga;AL;36066;LINESTRING(-86.435926 32.501261,-86.436707 32.501254,-86.436904 32.501253)\r\n801;899;all;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.6828 32.478833,-86.682918 32.478998,-86.683194 32.479365,-86.683337 32.479544,-86.684079 32.480438,-86.68483 32.481327,-86.686322 32.483118,-86.686567 32.483417,-86.686819 32.483713,-86.688063 32.485202,-86.688414 32.485615,-86.68913 32.486433,-86.689623 32.486982)\r\n3099;3037;odd;Hunter Loop Rd;Autauga;AL;36051;LINESTRING(-86.471489 32.701333,-86.471465 32.701233,-86.471407 32.700951,-86.471384 32.70081,-86.47136 32.700599,-86.471348 32.700385,-86.471343 32.700025,-86.471328 32.699377,-86.471304 32.698803,-86.471294 32.698303,-86.4713 32.697007,-86.471299 32.696504,-86.471313 32.69578,-86.471313 32.695488,-86.471292 32.69498,-86.471267 32.694762,-86.47123 32.694548,-86.471222 32.694482,-86.471232 32.694277,-86.471251 32.694142,-86.471284 32.693999,-86.471304 32.693849,-86.4713 32.693754)\r\n2900;2998;even;Hunter Loop Rd;Autauga;AL;36051;LINESTRING(-86.4713 32.701371,-86.471267 32.701267,-86.471211 32.700977,-86.471186 32.70083,-86.47116 32.700611,-86.47115 32.700389,-86.471147 32.700027,-86.471132 32.699381,-86.471106 32.698807,-86.471098 32.698303,-86.471104 32.697007,-86.471103 32.696502,-86.471117 32.695778,-86.471115 32.695492,-86.471092 32.694992,-86.471069 32.694782,-86.47103 32.694568,-86.471022 32.694488,-86.471026 32.694263,-86.471055 32.694114,-86.471084 32.693975,-86.4711 32.693839,-86.471105 32.693753)\r\n834;898;even;Bluegrass Dr;Autauga;AL;36066;LINESTRING(-86.417392 32.492621,-86.417728 32.492638)\r\n831;899;odd;Bluegrass Dr;Autauga;AL;36066;LINESTRING(-86.417404 32.492457,-86.41774 32.492474)\r\n1800;1824;even;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.544986 32.547131,-86.545411 32.549456)\r\n1799;1817;odd;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.545179 32.547105,-86.545604 32.54943)\r\n2601;2699;all;Autauga County 53;Autauga;AL;36006;LINESTRING(-86.663382 32.689942,-86.663099 32.690139,-86.662682 32.690416,-86.662351 32.690649,-86.662162 32.690792,-86.661858 32.691037,-86.661722 32.691134,-86.661558 32.691208,-86.661466 32.691235,-86.661374 32.691256,-86.661196 32.691281,-86.661021 32.691299,-86.660843 32.691306,-86.660075 32.691309,-86.659222 32.691319,-86.657848 32.691312,-86.657501 32.6913,-86.656476 32.691241,-86.654011 32.69107,-86.653761 32.691058,-86.653599 32.691068,-86.653437 32.691085,-86.653274 32.691112,-86.653114 32.691146,-86.652791 32.691232,-86.652153 32.691429,-86.651986 32.691474,-86.651816 32.691508,-86.651792 32.69151)\r\n100;190;even;Autauga County 33;Autauga;AL;36003;LINESTRING(-86.73961 32.451216,-86.739362 32.453881,-86.739289 32.454611,-86.739173 32.455853,-86.739168 32.456154,-86.739176 32.456308,-86.739199 32.45646,-86.739234 32.456615,-86.739289 32.456763,-86.739354 32.456904,-86.739428 32.457044,-86.739518 32.457177,-86.739616 32.457305,-86.739659 32.457347,-86.739727 32.457424,-86.739848 32.457535,-86.739978 32.457641,-86.740117 32.457738,-86.740264 32.457825,-86.740417 32.457903,-86.740579 32.457972,-86.740748 32.458026,-86.740916 32.458072,-86.741256 32.458139,-86.742697 32.458344,-86.742861 32.458375,-86.743024 32.458414,-86.743185 32.458462,-86.743339 32.458519,-86.743488 32.458587,-86.74363 32.458669,-86.743795 32.458784)\r\n101;179;odd;Autauga County 33;Autauga;AL;36003;LINESTRING(-86.739804 32.451228,-86.739556 32.453895,-86.739483 32.454625,-86.739373 32.455861,-86.739366 32.456152,-86.739376 32.456292,-86.739397 32.456432,-86.739432 32.456573,-86.739479 32.456707,-86.739538 32.456838,-86.739608 32.456966,-86.73969 32.457089,-86.73978 32.457205,-86.739813 32.457245,-86.739881 32.457314,-86.739992 32.457417,-86.740112 32.457513,-86.740239 32.457602,-86.740374 32.457683,-86.740513 32.457753,-86.740661 32.457814,-86.740814 32.457866,-86.74097 32.457908,-86.741296 32.457973,-86.742735 32.458178,-86.742911 32.458209,-86.743084 32.458254,-86.743257 32.458302,-86.743429 32.458363,-86.743592 32.458441,-86.743756 32.458529,-86.743924 32.458661)\r\n498;400;all;Carver St;Autauga;AL;36067;LINESTRING(-86.473474 32.479612,-86.473466 32.479603,-86.473472 32.479318)\r\n1725;1751;all;Lakeview Dr;Autauga;AL;36067;LINESTRING(-86.512905 32.542832,-86.512841 32.543526,-86.512694 32.543788,-86.512625 32.544834)\r\n199;139;all;Cosby Ct;Autauga;AL;36067;LINESTRING(-86.469012 32.472067,-86.46904 32.47206,-86.469073 32.47197,-86.469131 32.47183,-86.46922 32.471636)\r\n1700;1798;even;Autauga County 31;Autauga;AL;36758;LINESTRING(-86.845451 32.633705,-86.845363 32.633954,-86.845301 32.634171,-86.845289 32.634253,-86.84529 32.634336,-86.845301 32.634415,-86.845318 32.634494,-86.845371 32.634637,-86.845627 32.635256,-86.845695 32.635461,-86.845726 32.635598,-86.845744 32.635739,-86.845761 32.636026,-86.845793 32.637181,-86.845811 32.63747,-86.845814 32.63768,-86.845802 32.638105,-86.845812 32.638256,-86.845854 32.638473,-86.845871 32.638549,-86.845895 32.638625,-86.845928 32.638701,-86.845973 32.638773,-86.846028 32.638845,-86.846099 32.638908,-86.846182 32.638958,-86.846271 32.638998,-86.846367 32.639023,-86.846462 32.639039,-86.846639 32.639054,-86.84707 32.639076,-86.847317 32.639096,-86.847391 32.639108,-86.847462 32.639128,-86.847528 32.639154,-86.847592 32.639187,-86.84772 32.639272,-86.847966 32.639468,-86.848197 32.639676,-86.84836 32.63984,-86.848786 32.640292,-86.849097 32.640633,-86.849293 32.640865,-86.849427 32.641045,-86.849588 32.641293,-86.849955 32.64193,-86.850013 32.642061,-86.850056 32.642198,-86.850087 32.642338,-86.850127 32.642623,-86.850183 32.64335,-86.850223 32.643571,-86.850399 32.64435,-86.85043 32.644555,-86.850439 32.644694,-86.850433 32.644836,-86.850416 32.645056,-86.850417 32.64535,-86.850422 32.645714,-86.85041 32.645926,-86.850362 32.646357,-86.850246 32.647217,-86.850244 32.647302,-86.850259 32.647387,-86.85029 32.647468,-86.850333 32.647545,-86.850392 32.647614,-86.850455 32.647675,-86.850646 32.647829,-86.85109 32.648164,-86.851205 32.648262,-86.851254 32.648313,-86.851293 32.648364,-86.851323 32.648418,-86.851346 32.648478,-86.85136 32.648539,-86.851367 32.648604,-86.851365 32.648819,-86.851326 32.649326,-86.851289 32.649688,-86.851245 32.650048,-86.851227 32.650267,-86.851223 32.6507,-86.85123 32.650989,-86.851253 32.651348,-86.851243 32.651627,-86.851226 32.651762,-86.851195 32.651896,-86.850963 32.652589,-86.850926 32.652737,-86.850915 32.652818,-86.850915 32.652897,-86.850926 32.653121,-86.850955 32.653341,-86.851019 32.653628,-86.851039 32.653767,-86.851051 32.653908,-86.851055 32.654201,-86.851079 32.654353,-86.85112 32.654501,-86.851172 32.654645,-86.851322 32.654989,-86.851424 32.655192,-86.851546 32.655389,-86.851681 32.655577,-86.851781 32.655696,-86.851893 32.655814,-86.852019 32.655923,-86.852283 32.656119,-86.852565 32.656295,-86.853127 32.656624,-86.853187 32.656665,-86.853306 32.656759,-86.853472 32.656915,-86.853571 32.657026,-86.853894 32.657447,-86.853997 32.657561,-86.854106 32.657672,-86.854172 32.657718,-86.854281 32.657803)\r\n1759;1871;odd;Autauga County 31;Autauga;AL;36758;LINESTRING(-86.845638 32.63375,-86.845557 32.633996,-86.845503 32.634201,-86.845495 32.634263,-86.845494 32.634326,-86.845501 32.634389,-86.845516 32.634452,-86.845561 32.634585,-86.845817 32.635204,-86.845893 32.635421,-86.845928 32.635574,-86.845944 32.635727,-86.845957 32.63602,-86.845991 32.637175,-86.846011 32.637464,-86.84601 32.637682,-86.846002 32.638101,-86.846014 32.638238,-86.84605 32.638443,-86.846067 32.638509,-86.846089 32.638571,-86.846116 32.638629,-86.846149 32.638683,-86.846192 32.638733,-86.846239 32.638774,-86.846292 32.638808,-86.846353 32.638834,-86.846421 32.638855,-86.846494 32.638869,-86.846657 32.638886,-86.847084 32.63891,-86.847345 32.638924,-86.847441 32.63894,-86.847536 32.638964,-86.847628 32.639,-86.84771 32.639047,-86.847854 32.639142,-86.848108 32.639348,-86.848347 32.639564,-86.848514 32.639734,-86.84894 32.64019,-86.849257 32.640533,-86.849459 32.640771,-86.849601 32.640959,-86.849764 32.641217,-86.850143 32.641862,-86.850207 32.642009,-86.850254 32.64216,-86.850287 32.642312,-86.850325 32.642607,-86.850385 32.643332,-86.850419 32.643543,-86.850597 32.644322,-86.850634 32.644541,-86.850633 32.644694,-86.850631 32.644844,-86.850616 32.645062,-86.850613 32.64535,-86.85062 32.645716,-86.85061 32.645938,-86.850556 32.646375,-86.85045 32.647227,-86.850452 32.647288,-86.850463 32.647347,-86.850484 32.647404,-86.850515 32.647457,-86.850554 32.647508,-86.850603 32.647557,-86.850782 32.647707,-86.851226 32.648042,-86.851353 32.648146,-86.851418 32.648207,-86.851475 32.648278,-86.851517 32.648356,-86.851546 32.648436,-86.851562 32.648517,-86.851569 32.648598,-86.851565 32.648825,-86.851522 32.649338,-86.851485 32.649704,-86.851443 32.650062,-86.851427 32.650273,-86.851419 32.6507,-86.851428 32.650983,-86.851451 32.651346,-86.851445 32.651637,-86.851428 32.651788,-86.851393 32.651936,-86.851159 32.652629,-86.851126 32.652765,-86.851117 32.65283,-86.851111 32.652895,-86.851126 32.653107,-86.851155 32.653317,-86.851215 32.653602,-86.851241 32.653751,-86.851249 32.653902,-86.851259 32.654189,-86.851279 32.654323,-86.851314 32.654457,-86.851362 32.654591,-86.851508 32.654927,-86.851606 32.655118,-86.851722 32.655305,-86.851849 32.655483,-86.851941 32.655594,-86.852045 32.6557,-86.852159 32.655799,-86.852411 32.655987,-86.852681 32.656159,-86.853243 32.656488,-86.853319 32.656533,-86.853452 32.656639,-86.85363 32.656807,-86.853737 32.65693,-86.85406 32.657349,-86.854153 32.657455,-86.854254 32.657552,-86.854304 32.657596,-86.854414 32.657683)\r\n199;135;odd;W 6th St;Autauga;AL;36067;LINESTRING(-86.474997 32.46592,-86.473416 32.465807)\r\n198;126;even;W 6th St;Autauga;AL;36067;LINESTRING(-86.47498 32.466084,-86.473399 32.465971)\r\n1757;1761;all;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.678263 32.596168,-86.677991 32.596488,-86.677312 32.597324,-86.677226 32.597445,-86.677033 32.597763,-86.676934 32.597958,-86.676848 32.598156,-86.676772 32.598359,-86.676753 32.598424,-86.676689 32.598701,-86.676644 32.598989,-86.676629 32.599063,-86.676546 32.599665,-86.676533 32.599785)\r\n1700;1736;all;Big Springs Church Rd;Autauga;AL;36006;LINESTRING(-86.707674 32.587125,-86.70767 32.587179,-86.707646 32.587431,-86.707647 32.587504)\r\n100;116;even;Edgefield Mnr;Autauga;AL;36067;LINESTRING(-86.457302 32.513471,-86.457447 32.513476,-86.457619 32.513478,-86.458385 32.513504,-86.458548 32.513518,-86.459047 32.513594,-86.459223 32.513608,-86.459481 32.51361,-86.459556 32.513608)\r\n105;113;odd;Edgefield Mnr;Autauga;AL;36067;LINESTRING(-86.457309 32.513306,-86.457451 32.51331,-86.457623 32.513312,-86.458399 32.513334,-86.458576 32.513348,-86.459075 32.513424,-86.459235 32.513438,-86.459481 32.513444,-86.45955 32.513443)\r\n219;205;odd;Cherry Dr;Autauga;AL;36067;LINESTRING(-86.456445 32.478384,-86.456227 32.478386,-86.455888 32.478382,-86.455654 32.478386)\r\n218;212;even;Cherry Dr;Autauga;AL;36067;LINESTRING(-86.456447 32.478548,-86.456227 32.47855,-86.455888 32.478548,-86.455658 32.478551)\r\n300;398;even;New Moon Dr;Autauga;AL;36067;LINESTRING(-86.462729 32.459286,-86.462731 32.458637,-86.46264 32.458432,-86.462524 32.458265,-86.462395 32.458118,-86.462312 32.458004)\r\n101;399;odd;New Moon Dr;Autauga;AL;36067;LINESTRING(-86.462535 32.459289,-86.462511 32.458671,-86.462448 32.458506,-86.462352 32.458361,-86.462223 32.458214,-86.462143 32.458086)\r\n332;398;even;Autauga County 56;Autauga;AL;36051;LINESTRING(-86.454682 32.692347,-86.453759 32.692299,-86.452654 32.692213,-86.452403 32.692186,-86.452074 32.692135,-86.45153 32.692027)\r\n329;345;odd;Autauga County 56;Autauga;AL;36051;LINESTRING(-86.45467 32.692512,-86.453743 32.692465,-86.452634 32.692379,-86.452373 32.692354,-86.452032 32.692299,-86.451485 32.692187)\r\n2001;2099;all;Cedar Ridge Loop;Autauga;AL;36067;LINESTRING(-86.473899 32.570364,-86.473877 32.57044,-86.473866 32.570482,-86.473856 32.570529,-86.473846 32.570585,-86.473835 32.570647,-86.473828 32.570704,-86.473831 32.570841,-86.473836 32.57091,-86.473847 32.570983,-86.47386 32.571059,-86.473874 32.571136,-86.4739 32.571294,-86.473908 32.571377,-86.47391 32.571457,-86.473921 32.571623,-86.473922 32.571707,-86.473923 32.57179,-86.473923 32.571956,-86.473922 32.57204,-86.473922 32.572127,-86.473924 32.572308,-86.473923 32.572401,-86.473924 32.572494,-86.473925 32.572677,-86.473926 32.57277,-86.473926 32.572859,-86.473926 32.573034,-86.473925 32.573203,-86.473925 32.573285,-86.473923 32.573442,-86.473922 32.573517,-86.473923 32.573585,-86.473924 32.573648,-86.473924 32.573678)\r\n100;198;even;Cypress Creek Way;Autauga;AL;36067;LINESTRING(-86.466041 32.446352,-86.465874 32.446427,-86.465638 32.44652,-86.46549 32.446596,-86.465324 32.44667)\r\n101;199;odd;Cypress Creek Way;Autauga;AL;36067;LINESTRING(-86.466134 32.446496,-86.465964 32.446577,-86.465734 32.446672,-86.465588 32.446746,-86.465411 32.446817)\r\n500;698;even;Autauga County 4;Autauga;AL;36067;LINESTRING(-86.458697 32.425463,-86.45817 32.425086,-86.457896 32.424906,-86.457753 32.424821,-86.457457 32.424667,-86.457315 32.424601,-86.457104 32.424527)\r\n501;615;odd;Autauga County 4;Autauga;AL;36067;LINESTRING(-86.458572 32.425589,-86.458046 32.425216,-86.457778 32.425042,-86.457643 32.424963,-86.457357 32.424813,-86.457227 32.424755,-86.457027 32.424678)\r\n151;199;all;Autauga County 40;Autauga;AL;36022;LINESTRING(-86.455234 32.58845,-86.454505 32.588823,-86.453706 32.589238,-86.451515 32.590351,-86.450485 32.590864,-86.450257 32.590975,-86.449941 32.591102,-86.449775 32.591154,-86.449361 32.591267,-86.449024 32.591342,-86.448679 32.591395,-86.448416 32.591417,-86.44807 32.591423,-86.444738 32.591443,-86.443883 32.591443,-86.442177 32.591452,-86.441324 32.591452,-86.44056 32.591458,-86.440506 32.591459)\r\n1906;1936;even;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.67461 32.610259,-86.674501 32.61076,-86.674347 32.611644,-86.674279 32.612078,-86.674241 32.612367,-86.674216 32.612512,-86.674131 32.613237,-86.674088 32.613745)\r\n1901;1925;odd;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.674802 32.610288,-86.674697 32.610788,-86.674541 32.611666,-86.674475 32.612098,-86.674437 32.612387,-86.674414 32.612532,-86.674327 32.613251,-86.674283 32.613757)\r\n168;100;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.476003 32.439508,-86.47586 32.43944,-86.475787 32.439409,-86.475641 32.439355,-86.475535 32.439312)\r\n2900;2998;even;Unity Rd;Autauga;AL;36051;LINESTRING(-86.482185 32.693028,-86.482466 32.693717,-86.482673 32.694191,-86.482804 32.694532,-86.482869 32.694736,-86.482902 32.694872,-86.482958 32.695227,-86.483077 32.696237,-86.483106 32.696388,-86.483153 32.696535,-86.483217 32.696677,-86.483331 32.696879,-86.483498 32.697131,-86.483778 32.697576,-86.483961 32.697896,-86.484021 32.698023,-86.484041 32.698084,-86.48407 32.698217,-86.484094 32.698426,-86.484105 32.69871,-86.484099 32.699215,-86.484106 32.699866,-86.484098 32.700579,-86.484085 32.700837)\r\n2801;2999;odd;Unity Rd;Autauga;AL;36051;LINESTRING(-86.482369 32.692974,-86.482652 32.693661,-86.482861 32.694137,-86.482994 32.694484,-86.483067 32.694696,-86.4831 32.694844,-86.483154 32.695207,-86.483277 32.696215,-86.483306 32.696352,-86.483347 32.696483,-86.483403 32.696611,-86.483509 32.696801,-86.483672 32.697051,-86.483954 32.6975,-86.484147 32.697826,-86.484213 32.697967,-86.484241 32.698044,-86.484272 32.698195,-86.484294 32.698416,-86.484301 32.698708,-86.484295 32.699215,-86.484302 32.699866,-86.484298 32.700583,-86.48428 32.700845)\r\n901;999;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.471928 32.439312,-86.472092 32.439203,-86.472562 32.438876,-86.472732 32.43878)\r\n100;132;even;Scott Ln;Autauga;AL;36066;LINESTRING(-86.43566 32.466326,-86.435135 32.466341,-86.435057 32.466338,-86.434963 32.466322,-86.434909 32.466298,-86.434852 32.466245,-86.434804 32.466139,-86.434786 32.466012,-86.434783 32.465795,-86.434766 32.465505,-86.434763 32.465363,-86.434775 32.464929,-86.434774 32.464711,-86.434767 32.464592)\r\n101;147;odd;Scott Ln;Autauga;AL;36066;LINESTRING(-86.435668 32.46649,-86.435139 32.466509,-86.435045 32.466512,-86.434899 32.466504,-86.434773 32.466452,-86.434658 32.466345,-86.434586 32.466177,-86.434588 32.466016,-86.434585 32.465801,-86.434568 32.465511,-86.434567 32.465363,-86.434579 32.464927,-86.434576 32.464715,-86.434572 32.464599)\r\n389;223;odd;Autauga County 27;Autauga;AL;36067;LINESTRING(-86.538952 32.405322,-86.538295 32.40714,-86.538102 32.407703,-86.53806 32.407849,-86.537951 32.408283,-86.537923 32.40843,-86.537901 32.408579,-86.537875 32.4088,-86.537858 32.409095,-86.537849 32.40939,-86.537844 32.410708,-86.537846 32.411381,-86.537841 32.413632,-86.537845 32.414363,-86.537846 32.416621)\r\n298;200;even;Autauga County 27;Autauga;AL;36067;LINESTRING(-86.539138 32.40537,-86.538483 32.407188,-86.538294 32.407747,-86.538252 32.407887,-86.538147 32.408313,-86.538119 32.408454,-86.538097 32.408597,-86.538073 32.408812,-86.538054 32.409101,-86.538045 32.409392,-86.538038 32.410708,-86.53804 32.411381,-86.538035 32.413632,-86.538039 32.414363,-86.53804 32.416621)\r\n9100;9198;even;Patrick St;Autauga;AL;36067;LINESTRING(-86.458598 32.452508,-86.45901 32.452507,-86.459038 32.452505)\r\n155;199;odd;Patrick St;Autauga;AL;36067;LINESTRING(-86.458597 32.452344,-86.459006 32.452341,-86.459031 32.452341)\r\n1399;1301;odd;Mets Ct;Autauga;AL;36067;LINESTRING(-86.419285 32.430863,-86.4193 32.429982,-86.419301 32.429935)\r\n1356;1300;even;Mets Ct;Autauga;AL;36067;LINESTRING(-86.419091 32.430861,-86.419102 32.429978,-86.419106 32.429928)\r\n2164;2198;even;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.438719 32.554185,-86.438784 32.554424,-86.438852 32.554704,-86.439122 32.555759,-86.439191 32.556114,-86.439206 32.556252,-86.43921 32.556394,-86.439196 32.556531,-86.439171 32.556669,-86.439135 32.556804,-86.439064 32.557004,-86.439036 32.557065,-86.438966 32.557193,-86.438885 32.557314,-86.438742 32.557487,-86.438581 32.557652,-86.438223 32.557986,-86.437299 32.558835)\r\n2159;2205;odd;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.438908 32.554147,-86.438976 32.554388,-86.439044 32.55467,-86.439318 32.555727,-86.439391 32.556092,-86.439408 32.556242,-86.43941 32.556398,-86.439398 32.556551,-86.439369 32.556701,-86.439331 32.556848,-86.439254 32.55706,-86.439222 32.557131,-86.439146 32.557271,-86.439059 32.557406,-86.438902 32.557591,-86.438731 32.557762,-86.438367 32.558098,-86.437443 32.558947)\r\n1299;1273;odd;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.480518 32.496062,-86.480478 32.495973,-86.480329 32.49564,-86.480232 32.495414)\r\n1298;1280;even;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.480338 32.496123,-86.480294 32.496033,-86.480145 32.495698,-86.480049 32.49547)\r\n1099;1001;odd;Ridge Point Dr;Autauga;AL;36022;LINESTRING(-86.420622 32.593813,-86.420855 32.593548,-86.420901 32.593433,-86.420914 32.59337,-86.420901 32.591502,-86.420899 32.591414)\r\n1098;1000;even;Ridge Point Dr;Autauga;AL;36022;LINESTRING(-86.420463 32.593719,-86.420661 32.593462,-86.420697 32.593387,-86.420704 32.593354,-86.420705 32.591504,-86.420704 32.591416)\r\n1850;1868;all;Autauga County 107;Autauga;AL;36066;LINESTRING(-86.460024 32.573201,-86.459977 32.57333,-86.459681 32.574383,-86.459456 32.575202)\r\n1620;1698;even;Buena Vista Blvd;Autauga;AL;36067;LINESTRING(-86.450548 32.427399,-86.450975 32.427794,-86.451232 32.428009,-86.451308 32.428108,-86.451351 32.428257,-86.451381 32.430392)\r\n1623;1699;odd;Buena Vista Blvd;Autauga;AL;36067;LINESTRING(-86.450691 32.427287,-86.451119 32.427676,-86.45139 32.427891,-86.451522 32.428028,-86.451561 32.428239,-86.451576 32.430391)\r\n100;198;even;Main St;Autauga;AL;36067;LINESTRING(-86.472638 32.459607,-86.47009 32.459429)\r\n101;199;odd;Main St;Autauga;AL;36067;LINESTRING(-86.472622 32.459771,-86.470074 32.459593)\r\n2800;2808;all;Whitwood Ln;Autauga;AL;36067;LINESTRING(-86.648845 32.661429,-86.648875 32.66175)\r\n600;698;even;Dupree Dr;Autauga;AL;36022;LINESTRING(-86.436444 32.66129,-86.436392 32.661364,-86.43646 32.663562)\r\n699;601;odd;Dupree Dr;Autauga;AL;36022;LINESTRING(-86.436624 32.661355,-86.436616 32.6614,-86.436655 32.663559)\r\n174;178;all;Seaside Rd;Autauga;AL;36003;LINESTRING(-86.656475 32.445753,-86.656522 32.445805,-86.657824 32.44721,-86.658137 32.447555,-86.65816 32.447581,-86.658235 32.447669)\r\n247;201;odd;Magnolia Dr;Autauga;AL;36067;LINESTRING(-86.462154 32.474062,-86.461071 32.473585,-86.459555 32.472927,-86.458049 32.472255,-86.45728 32.471941,-86.457058 32.471844,-86.456911 32.471771,-86.456696 32.471681)\r\n298;200;even;Magnolia Dr;Autauga;AL;36067;LINESTRING(-86.462064 32.474208,-86.460981 32.473731,-86.459465 32.473073,-86.457959 32.472405,-86.457192 32.472091,-86.456962 32.471992,-86.456815 32.471919,-86.456608 32.471828)\r\n2272;2298;even;Blossom Rd;Autauga;AL;36003;LINESTRING(-86.645796 32.437451,-86.64589 32.437431,-86.646217 32.437325,-86.646378 32.437264,-86.646537 32.4372,-86.646844 32.437057,-86.647133 32.436891,-86.647897 32.436453,-86.64805 32.436366,-86.648136 32.436319)\r\n2273;2299;odd;Blossom Rd;Autauga;AL;36003;LINESTRING(-86.645741 32.437293,-86.645826 32.437269,-86.646141 32.437169,-86.646296 32.437112,-86.646445 32.43705,-86.646738 32.436911,-86.647025 32.436753,-86.647787 32.436317,-86.647942 32.436226,-86.648032 32.436179)\r\n3673;3699;odd;Red Cross Rd;Autauga;AL;36003;LINESTRING(-86.800082 32.464491,-86.800194 32.46449,-86.801911 32.464481,-86.802772 32.464485,-86.803633 32.464478,-86.804419 32.464463,-86.804493 32.464452)\r\n3672;3698;even;Red Cross Rd;Autauga;AL;36703;LINESTRING(-86.800078 32.464327,-86.800192 32.464324,-86.801911 32.464317,-86.802772 32.464319,-86.803629 32.464312,-86.804405 32.464291,-86.804471 32.464288)\r\n735;701;odd;Dawson-Williams Rd;Autauga;AL;36067;LINESTRING(-86.516906 32.527373,-86.516857 32.527409,-86.516536 32.527648,-86.516079 32.527979,-86.515817 32.528153,-86.515274 32.528493,-86.513997 32.529213,-86.513567 32.52946,-86.513426 32.529545,-86.513287 32.52962,-86.513145 32.529685,-86.512851 32.5298,-86.5127 32.529847,-86.512401 32.529921)\r\n734;700;even;Dawson-Williams Rd;Autauga;AL;36067;LINESTRING(-86.517033 32.527498,-86.516985 32.527533,-86.516664 32.527772,-86.516205 32.528109,-86.515937 32.528285,-86.51539 32.528631,-86.514107 32.529351,-86.513681 32.529596,-86.51354 32.529685,-86.513389 32.529766,-86.513235 32.529837,-86.512929 32.529958,-86.512762 32.530011,-86.512453 32.530079)\r\n1116;1136;even;Perrydale Loop;Autauga;AL;36066;LINESTRING(-86.442035 32.454882,-86.442009 32.454779,-86.441952 32.454642,-86.441661 32.453808,-86.441634 32.453722,-86.441567 32.453633,-86.441456 32.453573,-86.441343 32.453554,-86.440993 32.453544,-86.440566 32.453546)\r\n1115;1139;odd;Perrydale Loop;Autauga;AL;36066;LINESTRING(-86.441847 32.454922,-86.441815 32.454827,-86.441764 32.454692,-86.441471 32.45386,-86.44144 32.453806,-86.441407 32.453771,-86.441366 32.453747,-86.441313 32.453732,-86.440987 32.453712,-86.440566 32.453711)\r\n1599;1543;all;Indian Hills Rd;Autauga;AL;36067;LINESTRING(-86.502797 32.459266,-86.502594 32.459254,-86.502522 32.459255)\r\n1668;1684;even;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.440297 32.538593,-86.441069 32.539038,-86.442473 32.539856,-86.443182 32.540263,-86.443324 32.540342,-86.443446 32.540413)\r\n1669;1687;odd;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.440406 32.538457,-86.441179 32.538902,-86.442583 32.53972,-86.44329 32.540125,-86.443434 32.540204,-86.443557 32.540278)\r\n1599;1401;odd;Autauga County 42;Autauga;AL;36067;LINESTRING(-86.652954 32.621022,-86.652943 32.620997,-86.652828 32.620888,-86.652595 32.620763,-86.65228 32.620657,-86.652134 32.620597,-86.651846 32.620465,-86.651555 32.620317,-86.651027 32.620071,-86.650885 32.619998,-86.65075 32.619917,-86.650623 32.619831,-86.650504 32.619738,-86.650269 32.619534,-86.650159 32.619427,-86.650057 32.619316,-86.649962 32.619202,-86.649872 32.619081,-86.649788 32.618957,-86.649631 32.618704,-86.64949 32.618441,-86.64943 32.61831,-86.649375 32.618173,-86.6493 32.617961,-86.649243 32.617806,-86.649086 32.617593,-86.648908 32.617505,-86.648733 32.617471,-86.648569 32.617444,-86.648401 32.617422,-86.648228 32.617405,-86.648054 32.617396,-86.647709 32.617385,-86.647021 32.617345,-86.646843 32.617346,-86.646327 32.617371,-86.645901 32.617383,-86.645735 32.617379,-86.645302 32.617357,-86.645104 32.617359,-86.644831 32.617461,-86.644694 32.617583,-86.644591 32.617706,-86.644207 32.618183,-86.644103 32.618286,-86.643988 32.618376,-86.643861 32.618453,-86.643724 32.618513,-86.643577 32.618555,-86.643421 32.618583,-86.64326 32.618602,-86.642936 32.618628,-86.642775 32.618636,-86.641164 32.618673,-86.639796 32.618699,-86.63895 32.618727,-86.63647 32.618792,-86.633039 32.618854,-86.632192 32.618863,-86.630066 32.618872,-86.629211 32.618883,-86.628787 32.618894,-86.627935 32.618902,-86.627506 32.6189,-86.626375 32.618911)\r\n1498;1400;even;Autauga County 42;Autauga;AL;36067;LINESTRING(-86.652793 32.621114,-86.652779 32.621107,-86.652688 32.621028,-86.652497 32.620921,-86.652198 32.620811,-86.652042 32.620747,-86.651748 32.620611,-86.651455 32.620463,-86.650929 32.620217,-86.650775 32.62014,-86.650628 32.620053,-86.650491 32.619959,-86.650364 32.619858,-86.650121 32.619648,-86.650005 32.619535,-86.649895 32.619416,-86.649796 32.619294,-86.649702 32.619167,-86.649614 32.619037,-86.649451 32.618778,-86.649306 32.618507,-86.649242 32.618366,-86.649187 32.618223,-86.64911 32.618013,-86.649049 32.617886,-86.648924 32.617733,-86.64882 32.617675,-86.648687 32.617637,-86.648533 32.61761,-86.648375 32.617588,-86.64821 32.617573,-86.648044 32.617562,-86.647699 32.617551,-86.647015 32.617515,-86.646849 32.617514,-86.646335 32.617537,-86.645903 32.617549,-86.645727 32.617547,-86.645304 32.617523,-86.64516 32.617543,-86.644959 32.617619,-86.644852 32.617699,-86.644753 32.617804,-86.644371 32.618287,-86.644253 32.618406,-86.644118 32.61851,-86.643971 32.618601,-86.643806 32.618677,-86.643629 32.618725,-86.643453 32.618751,-86.643282 32.618768,-86.64295 32.618796,-86.642783 32.618802,-86.641168 32.618837,-86.639802 32.618865,-86.638956 32.618893,-86.636476 32.618958,-86.633043 32.61902,-86.632194 32.619029,-86.630068 32.619038,-86.629215 32.619049,-86.628791 32.61906,-86.627935 32.619068,-86.627506 32.619066,-86.626377 32.619076)\r\n100;198;even;Taxi Ct;Autauga;AL;36022;LINESTRING(-86.437558 32.599284,-86.437561 32.599447,-86.437533 32.599791,-86.437481 32.599881,-86.437424 32.599919,-86.437324 32.599944,-86.437167 32.599954,-86.43692 32.599954)\r\n101;199;odd;Taxi Ct;Autauga;AL;36022;LINESTRING(-86.437753 32.599281,-86.437757 32.599449,-86.437755 32.599833,-86.437667 32.600013,-86.437516 32.600091,-86.437354 32.600126,-86.437169 32.60012,-86.43692 32.600119)\r\n1043;1001;odd;Autauga County 42;Autauga;AL;36051;LINESTRING(-86.58572 32.609888,-86.585495 32.609952,-86.585332 32.610007,-86.585015 32.610122,-86.584708 32.610255,-86.584407 32.610398,-86.584114 32.610547,-86.584038 32.61059,-86.583897 32.610689,-86.583781 32.610813,-86.58373 32.610888,-86.583663 32.611034,-86.58364 32.611112,-86.58361 32.611262,-86.583587 32.61141,-86.58357 32.611558,-86.58347 32.612714,-86.583428 32.613348)\r\n1042;1000;even;Autauga County 42;Autauga;AL;36051;LINESTRING(-86.585784 32.610044,-86.585563 32.61011,-86.585408 32.610161,-86.585101 32.610276,-86.584802 32.610403,-86.584507 32.610542,-86.584224 32.610689,-86.584164 32.610726,-86.584049 32.610813,-86.583953 32.610913,-86.583918 32.610964,-86.583859 32.611088,-86.583838 32.61115,-86.583806 32.611288,-86.583783 32.61143,-86.583766 32.611572,-86.583666 32.612724,-86.583623 32.613357)\r\n899;801;odd;Shadow Ln;Autauga;AL;36066;LINESTRING(-86.444685 32.475999,-86.445416 32.47597,-86.445677 32.47593,-86.445853 32.475896,-86.446103 32.47582,-86.446494 32.475674,-86.446725 32.475604,-86.446879 32.475573,-86.447123 32.475548,-86.447294 32.475543,-86.447401 32.475542,-86.447425 32.475522)\r\n898;800;even;Shadow Ln;Autauga;AL;36066;LINESTRING(-86.444675 32.475834,-86.445392 32.475798,-86.445637 32.475764,-86.445795 32.47573,-86.446029 32.475662,-86.446418 32.475516,-86.446667 32.475438,-86.446843 32.475403,-86.447107 32.475376,-86.447282 32.475373,-86.447347 32.47536,-86.447351 32.47537)\r\n2699;2617;odd;Smutty St;Autauga;AL;36003;LINESTRING(-86.655332 32.429584,-86.655093 32.429728,-86.654811 32.429888,-86.654362 32.430115)\r\n2698;2600;even;Smutty St;Autauga;AL;36003;LINESTRING(-86.655446 32.429717,-86.655207 32.429866,-86.654919 32.430032,-86.654461 32.430257)\r\n3700;3798;all;Autauga County 22;Autauga;AL;36758;LINESTRING(-86.813745 32.618381,-86.815011 32.618144,-86.815342 32.618092,-86.815505 32.618074,-86.815667 32.618064,-86.815827 32.618072,-86.81599 32.61809,-86.816066 32.618103,-86.81622 32.618142,-86.816373 32.618193,-86.816759 32.618347,-86.817156 32.618486,-86.81756 32.618611,-86.817794 32.618681)\r\n336;340;even;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.477516 32.541425,-86.477762 32.54149,-86.477933 32.541526,-86.478104 32.541557,-86.478444 32.541601,-86.478636 32.54162)\r\n333;343;odd;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.477573 32.541267,-86.477816 32.541328,-86.477977 32.541362,-86.47814 32.541391,-86.478472 32.541435,-86.47866 32.541456)\r\n198;100;all;N Court St;Autauga;AL;36067;LINESTRING(-86.475252 32.463168,-86.47521 32.463401,-86.475149 32.464122,-86.475128 32.464334)\r\n1700;1710;even;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.573509 32.503243,-86.573704 32.503257,-86.574042 32.503289,-86.574382 32.503333)\r\n1711;1715;odd;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.573524 32.503079,-86.573722 32.503091,-86.574068 32.503121,-86.574414 32.503171)\r\n1540;1576;even;Hawthorne Ln;Autauga;AL;36066;LINESTRING(-86.422682 32.474103,-86.423374 32.474028,-86.423712 32.474012,-86.424309 32.473951,-86.424581 32.473915,-86.424825 32.473792,-86.424899 32.473723,-86.425 32.473583,-86.425036 32.473475,-86.425059 32.473345,-86.425054 32.473104)\r\n1537;1689;odd;Hawthorne Ln;Autauga;AL;36066;LINESTRING(-86.422656 32.47394,-86.423354 32.473858,-86.423694 32.473842,-86.424277 32.473783,-86.424501 32.473737,-86.424689 32.473646,-86.424729 32.473613,-86.424802 32.473509,-86.424832 32.473435,-86.424851 32.473331,-86.42486 32.473103)\r\n799;743;all;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.470864 32.476535,-86.470867 32.476533,-86.47092 32.476316,-86.470929 32.47624,-86.47094 32.476089,-86.470938 32.476016,-86.470943 32.475951,-86.470973 32.475734,-86.470967 32.475657)\r\n1612;1614;even;Guiding Way;Autauga;AL;36067;LINESTRING(-86.506287 32.461161,-86.506307 32.46115,-86.506811 32.460809)\r\n1609;1613;odd;Guiding Way;Autauga;AL;36067;LINESTRING(-86.506152 32.461042,-86.506173 32.46102,-86.50669 32.46068)\r\n2618;2698;even;Autauga County 57;Autauga;AL;36051;LINESTRING(-86.530712 32.643858,-86.530604 32.644078,-86.530447 32.644571,-86.530391 32.644936,-86.530391 32.645309,-86.530443 32.645681,-86.530532 32.645968,-86.530601 32.646184,-86.530729 32.64646,-86.530806 32.646595,-86.531791 32.648122,-86.531902 32.648313,-86.532037 32.648575,-86.532124 32.648774,-86.532224 32.649046,-86.532325 32.649392,-86.532486 32.650169,-86.53274 32.651524,-86.532886 32.652234,-86.532993 32.652788,-86.533036 32.653073)\r\n2593;2699;odd;Autauga County 57;Autauga;AL;36051;LINESTRING(-86.530893 32.643918,-86.5308 32.644132,-86.530651 32.644605,-86.530597 32.644948,-86.530597 32.645299,-86.530647 32.645649,-86.530724 32.645926,-86.530795 32.64613,-86.530915 32.646392,-86.530984 32.646519,-86.531967 32.648044,-86.532084 32.648241,-86.532223 32.648513,-86.532314 32.64872,-86.532418 32.649,-86.532523 32.649358,-86.53268 32.650143,-86.532934 32.651496,-86.53308 32.652206,-86.533189 32.652764,-86.53323 32.653052)\r\n900;938;even;Autauga County 42;Autauga;AL;36051;LINESTRING(-86.573474 32.610505,-86.573974 32.610649,-86.574204 32.610726,-86.574582 32.61088,-86.575024 32.611085,-86.575315 32.611232,-86.575596 32.611388,-86.576562 32.611973,-86.576985 32.612222,-86.577419 32.612459,-86.577716 32.612617,-86.577948 32.61272,-86.578267 32.612846,-86.578434 32.612905,-86.578605 32.612952,-86.578865 32.613005,-86.57888 32.613006)\r\n901;935;odd;Autauga County 42;Autauga;AL;36051;LINESTRING(-86.573536 32.610349,-86.574042 32.610491,-86.574286 32.610568,-86.574674 32.61073,-86.575122 32.610941,-86.575421 32.611088,-86.575708 32.61125,-86.576676 32.611837,-86.577095 32.612084,-86.577525 32.612319,-86.577816 32.612469,-86.578038 32.61257,-86.578347 32.612692,-86.578504 32.612745,-86.578661 32.612788,-86.578909 32.612841,-86.578918 32.612844)\r\n200;298;all;Merrill Ln;Autauga;AL;36022;LINESTRING(-86.486284 32.631413,-86.485871 32.631255,-86.485509 32.631253,-86.481245 32.631142,-86.480936 32.631315,-86.48008 32.632169)\r\n399;387;odd;Sydney Dr S;Autauga;AL;36066;LINESTRING(-86.422511 32.492149,-86.422473 32.492093,-86.422408 32.491987,-86.422371 32.491901,-86.422347 32.49181,-86.422333 32.491684,-86.42234 32.49159,-86.422358 32.491502,-86.422393 32.491412,-86.422461 32.4913,-86.422567 32.491181,-86.422685 32.491095,-86.422849 32.491024,-86.422982 32.49099)\r\n398;384;even;Sydney Dr S;Autauga;AL;36066;LINESTRING(-86.422347 32.492237,-86.422299 32.492179,-86.422222 32.492059,-86.422169 32.491951,-86.422141 32.491834,-86.422135 32.491688,-86.422134 32.491574,-86.422156 32.49146,-86.422199 32.491342,-86.422285 32.491208,-86.422407 32.491055,-86.422567 32.490947,-86.422773 32.490848,-86.422942 32.490829)\r\n1070;1104;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.437946 32.437552,-86.437769 32.437583,-86.43762 32.437605,-86.435938 32.437773,-86.435131 32.437865)\r\n3399;3301;odd;State Rte 14;Autauga;AL;36003;LINESTRING(-86.74873 32.449906,-86.748678 32.4499,-86.748503 32.449895,-86.748152 32.449895,-86.747803 32.449909,-86.747453 32.449934,-86.747108 32.449974,-86.746933 32.450001,-86.74659 32.450063,-86.746252 32.450137,-86.744926 32.450476,-86.74427 32.450636,-86.743772 32.450747,-86.743607 32.45078,-86.743273 32.450838,-86.742769 32.450911,-86.742261 32.450968,-86.741922 32.450995,-86.741412 32.451021,-86.741074 32.451029,-86.740561 32.45103,-86.739866 32.451019)\r\n3398;3300;even;State Rte 14;Autauga;AL;36003;LINESTRING(-86.748713 32.45007,-86.748666 32.450068,-86.748499 32.450063,-86.748156 32.450063,-86.747817 32.450077,-86.747475 32.450102,-86.747138 32.45014,-86.746971 32.450165,-86.746636 32.450227,-86.746306 32.450299,-86.744982 32.450634,-86.744322 32.450796,-86.74382 32.450909,-86.743649 32.450942,-86.743309 32.451002,-86.742799 32.451077,-86.742283 32.451134,-86.741938 32.451161,-86.74142 32.451189,-86.741076 32.451195,-86.740559 32.451196,-86.739862 32.451184)\r\n603;601;odd;Webb Dr;Autauga;AL;36067;LINESTRING(-86.483027 32.504879,-86.482982 32.50486,-86.482928 32.504837)\r\n602;600;even;Webb Dr;Autauga;AL;36067;LINESTRING(-86.482941 32.505027,-86.482896 32.505008,-86.482841 32.504985)\r\n1556;1598;all;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.604317 32.609894,-86.604321 32.610515,-86.604315 32.61088,-86.60432 32.611772,-86.604319 32.611823)\r\n2600;2698;even;Duffey Dr;Autauga;AL;36067;LINESTRING(-86.645561 32.551545,-86.646066 32.551529,-86.647401 32.551524,-86.648394 32.551545,-86.64875 32.551532,-86.649252 32.551514)\r\n2601;2699;odd;Duffey Dr;Autauga;AL;36067;LINESTRING(-86.645553 32.551381,-86.646062 32.551361,-86.647403 32.551358,-86.648392 32.551379,-86.648742 32.551368,-86.649244 32.55135)\r\n600;698;even;Doster Rd;Autauga;AL;36067;LINESTRING(-86.463923 32.448953,-86.463836 32.448021,-86.463784 32.447507,-86.463772 32.447437)\r\n675;713;odd;Doster Rd;Autauga;AL;36067;LINESTRING(-86.46373 32.448966,-86.463642 32.448035,-86.463588 32.447525,-86.463579 32.447458)\r\n2600;2698;even;Norrell St;Autauga;AL;36006;LINESTRING(-86.718641 32.660708,-86.718828 32.660817,-86.719332 32.661129)\r\n2601;2699;odd;Norrell St;Autauga;AL;36006;LINESTRING(-86.718751 32.660572,-86.718942 32.660681,-86.719448 32.660997)\r\n234;298;even;E Main St;Autauga;AL;36067;LINESTRING(-86.468501 32.459312,-86.468485 32.45931,-86.467508 32.459237)\r\n235;299;odd;E Main St;Autauga;AL;36067;LINESTRING(-86.46849 32.459476,-86.468471 32.459476,-86.467491 32.459401)\r\n615;603;odd;Marlyn Dr;Autauga;AL;36067;LINESTRING(-86.486356 32.483465,-86.486335 32.482418,-86.486333 32.48184,-86.486328 32.481643)\r\n614;608;even;Marlyn Dr;Autauga;AL;36067;LINESTRING(-86.486161 32.483468,-86.486139 32.48242,-86.486137 32.481842,-86.486133 32.481646)\r\n199;101;odd;Berry Ln;Autauga;AL;36066;LINESTRING(-86.452983 32.521252,-86.453058 32.521311,-86.453216 32.521389,-86.453302 32.521422,-86.453623 32.521529,-86.453789 32.52158,-86.45419 32.521687,-86.454334 32.521741,-86.454402 32.521774,-86.454536 32.521851,-86.454602 32.521897,-86.454678 32.521941,-86.454765 32.521986,-86.454818 32.521989)\r\n198;100;even;Berry Ln;Autauga;AL;36066;LINESTRING(-86.453106 32.521124,-86.453178 32.521167,-86.453312 32.521237,-86.453382 32.521266,-86.453693 32.521373,-86.453851 32.52142,-86.454264 32.521523,-86.454426 32.521589,-86.45451 32.521628,-86.454656 32.521715,-86.454722 32.521759,-86.454784 32.521793,-86.454845 32.521816,-86.45487 32.521831)\r\n1098;1000;all;Burt Ln;Autauga;AL;36067;LINESTRING(-86.527952 32.464838,-86.527961 32.464793,-86.528052 32.464584,-86.528122 32.464375,-86.528216 32.464026,-86.528248 32.463817,-86.52826 32.463678,-86.528249 32.463537,-86.528239 32.463469,-86.528178 32.463189,-86.527975 32.462489,-86.527954 32.462408,-86.527952 32.462322,-86.527962 32.462235,-86.528001 32.462106,-86.528012 32.462049,-86.527999 32.461988,-86.52798 32.461925,-86.527918 32.461798,-86.527761 32.461543,-86.527633 32.461357,-86.527497 32.461177,-86.527237 32.46089,-86.527139 32.460755)\r\n1313;1303;all;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.470804 32.499015,-86.471928 32.498087,-86.47252 32.497614)\r\n1798;1700;even;Tony Dr;Autauga;AL;36067;LINESTRING(-86.656501 32.495595,-86.656421 32.49569,-86.656362 32.495918,-86.656385 32.496016,-86.656404 32.496109,-86.656479 32.496247,-86.657224 32.49757)\r\n1799;1701;odd;Tony Dr;Autauga;AL;36067;LINESTRING(-86.656668 32.49568,-86.656621 32.495764,-86.65655 32.495918,-86.656581 32.495974,-86.656606 32.496055,-86.656661 32.496179,-86.6574 32.497499)\r\n1293;1291;all;Tallant Dr;Autauga;AL;36067;LINESTRING(-86.520541 32.485534,-86.520599 32.485209)\r\n1906;1998;even;Rushmore Dr;Autauga;AL;36022;LINESTRING(-86.420856 32.508149,-86.421498 32.508143)\r\n1901;1999;odd;Rushmore Dr;Autauga;AL;36022;LINESTRING(-86.420854 32.507984,-86.421496 32.507978)\r\n247;227;odd;Teri Ln;Autauga;AL;36066;LINESTRING(-86.427234 32.447194,-86.42723 32.447001,-86.427247 32.446873,-86.427314 32.446692,-86.427359 32.446616)\r\n238;230;even;Teri Ln;Autauga;AL;36066;LINESTRING(-86.427039 32.447198,-86.427032 32.446999,-86.427033 32.446841,-86.427114 32.446612,-86.427197 32.446525)\r\n1591;1519;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.64678 32.52395,-86.646694 32.523952,-86.646098 32.523943,-86.645668 32.523933,-86.64472 32.523919,-86.6442 32.523918,-86.644021 32.523925,-86.643845 32.523938,-86.643668 32.52396,-86.643323 32.524016,-86.64315 32.524058,-86.642982 32.524103,-86.642814 32.524151,-86.64265 32.524207,-86.642489 32.524267,-86.642329 32.524335,-86.642175 32.524405,-86.642022 32.524483,-86.641872 32.524564,-86.641591 32.524745,-86.641458 32.524846,-86.64133 32.524948,-86.641205 32.525054,-86.641083 32.525163,-86.640858 32.525392,-86.640753 32.525515,-86.640656 32.52564,-86.640566 32.525767,-86.640481 32.525897,-86.640402 32.52603,-86.64033 32.526168,-86.640264 32.526306,-86.640202 32.526446,-86.640148 32.526587,-86.640101 32.526734,-86.640033 32.527023,-86.639964 32.527459,-86.639777 32.528757,-86.639707 32.529187,-86.639616 32.529611,-86.639543 32.529892,-86.63935 32.530576)\r\n1598;1520;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.646784 32.524115,-86.646694 32.524116,-86.646094 32.524109,-86.645664 32.524099,-86.644718 32.524085,-86.644204 32.524086,-86.644035 32.524093,-86.643869 32.524106,-86.643702 32.524126,-86.643369 32.524182,-86.643206 32.524218,-86.643044 32.524261,-86.642884 32.524309,-86.642726 32.524361,-86.642573 32.524419,-86.642421 32.524483,-86.642273 32.524551,-86.642128 32.524625,-86.641988 32.524704,-86.641719 32.524877,-86.641592 32.52497,-86.641468 32.525068,-86.641347 32.52517,-86.641233 32.525275,-86.641016 32.525496,-86.640917 32.525611,-86.640824 32.52573,-86.640738 32.525851,-86.640657 32.525975,-86.640582 32.526102,-86.640512 32.526234,-86.640448 32.526366,-86.64039 32.5265,-86.64034 32.526635,-86.640297 32.526772,-86.640231 32.527051,-86.640158 32.527481,-86.639971 32.528779,-86.639903 32.529213,-86.63981 32.529645,-86.639735 32.52993,-86.639539 32.530614)\r\n3908;3916;all;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.822353 32.600075,-86.823866 32.600577,-86.824011 32.60062)\r\n1799;1701;odd;Fairview Ave;Autauga;AL;36066;LINESTRING(-86.420256 32.482785,-86.420539 32.482775,-86.421452 32.482705,-86.421848 32.482684,-86.422494 32.482653,-86.422807 32.482639,-86.424446 32.482568)\r\n1798;1658;even;Fairview Ave;Autauga;AL;36066;LINESTRING(-86.420246 32.482621,-86.420525 32.482607,-86.421438 32.482539,-86.421836 32.48252,-86.422484 32.482489,-86.422797 32.482475,-86.424436 32.482403)\r\n1200;1272;even;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.601036 32.570718,-86.601042 32.5715,-86.601034 32.572957,-86.60102 32.573787,-86.601021 32.574085)\r\n11101;11199;odd;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.60123 32.570717,-86.601238 32.5715,-86.60123 32.572959,-86.601216 32.573789,-86.601215 32.574085)\r\n604;698;even;Blakeley;Autauga;AL;36066;LINESTRING(-86.414336 32.443208,-86.414339 32.443159,-86.414224 32.443106,-86.414049 32.443138,-86.4132 32.443588)\r\n607;699;odd;Blakeley;Autauga;AL;36066;LINESTRING(-86.414149 32.443253,-86.414135 32.443269,-86.414184 32.443274,-86.414139 32.443304,-86.413301 32.443729)\r\n707;701;odd;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.82288 32.397027,-86.823021 32.397377,-86.823274 32.398016)\r\n706;700;even;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.823064 32.396974,-86.823205 32.397325,-86.823459 32.397964)\r\n199;101;odd;Faulk Quarters;Autauga;AL;36067;LINESTRING(-86.473315 32.468074,-86.472633 32.468035)\r\n198;100;even;Faulk Quarters;Autauga;AL;36067;LINESTRING(-86.473302 32.468238,-86.47262 32.468199)\r\n1113;1111;all;2nd St;Autauga;AL;36703;LINESTRING(-86.791932 32.332196,-86.792087 32.33223,-86.792341 32.332269)\r\n599;537;all;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.681228 32.379432,-86.681203 32.379519,-86.681173 32.379816,-86.681172 32.379896,-86.681182 32.380048,-86.681227 32.380336,-86.681238 32.380473,-86.681237 32.38054,-86.68122 32.380754,-86.680965 32.382922,-86.68092 32.383208,-86.680887 32.383342,-86.680837 32.383475,-86.68074 32.383673,-86.6802 32.384602,-86.680009 32.38495,-86.679868 32.385223,-86.679791 32.38535,-86.67978 32.385372)\r\n400;454;even;Autauga County 56;Autauga;AL;36051;LINESTRING(-86.45124 32.691974,-86.451072 32.691946,-86.450651 32.691886,-86.45039 32.691869,-86.450216 32.691868,-86.449791 32.691878,-86.44954 32.691868,-86.448772 32.691807,-86.448594 32.691809,-86.448417 32.691813,-86.448249 32.691838)\r\n347;381;odd;Autauga County 56;Autauga;AL;36051;LINESTRING(-86.451203 32.692136,-86.451038 32.69211,-86.450627 32.692056,-86.45038 32.692039,-86.450216 32.692034,-86.449789 32.692044,-86.449526 32.692036,-86.448762 32.691979,-86.448598 32.691977,-86.448437 32.691985,-86.448278 32.692001)\r\n1100;1198;even;Josephine Ave;Autauga;AL;36066;LINESTRING(-86.444594 32.458494,-86.444405 32.458494,-86.443555 32.458509,-86.443044 32.458507,-86.442886 32.458509)\r\n1101;1199;odd;Josephine Ave;Autauga;AL;36066;LINESTRING(-86.444596 32.458658,-86.444407 32.45866,-86.443557 32.458675,-86.443044 32.458673,-86.442888 32.458674)\r\n110;126;all;Seaside Rd;Autauga;AL;36003;LINESTRING(-86.650699 32.438327,-86.650744 32.43833,-86.651085 32.43836,-86.65125 32.438385,-86.651329 32.438399,-86.651478 32.438441,-86.651536 32.43847,-86.651588 32.438506,-86.651686 32.43861,-86.651769 32.438727,-86.651837 32.438852,-86.651865 32.438916,-86.651913 32.43905,-86.651929 32.439114,-86.651949 32.439248,-86.651955 32.439385,-86.651955 32.439415)\r\n799;701;all;Graham Run Rd;Autauga;AL;36091;LINESTRING(-86.564019 32.670027,-86.564035 32.670018,-86.564249 32.670015,-86.564596 32.670109,-86.564994 32.670225,-86.565565 32.670339,-86.565983 32.670412,-86.566144 32.670433,-86.566222 32.670437,-86.566299 32.67044,-86.566373 32.670432,-86.566444 32.670421,-86.566518 32.670402,-86.56667 32.670349,-86.567048 32.670193,-86.567499 32.670012,-86.567522 32.670005)\r\n1899;1801;all;Siesta Dr;Autauga;AL;36067;LINESTRING(-86.527007 32.555675,-86.526928 32.553999,-86.525963 32.5528,-86.524103 32.55219,-86.523275 32.552276,-86.522897 32.551941)\r\n2236;2294;even;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.470291 32.608794,-86.470366 32.608829,-86.470736 32.609008,-86.47148 32.609357,-86.476676 32.611838,-86.477415 32.612197,-86.477629 32.612312,-86.477772 32.612393)\r\n2257;2301;odd;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.470383 32.608649,-86.470462 32.608683,-86.470832 32.608864,-86.471576 32.609213,-86.476772 32.611694,-86.477519 32.612053,-86.477739 32.612172,-86.477883 32.612257)\r\n915;829;all;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.481043 32.481431,-86.481161 32.480596,-86.481244 32.479941,-86.481277 32.47965,-86.481301 32.479355,-86.481309 32.479145)\r\n900;934;even;Peachtree St;Autauga;AL;36066;LINESTRING(-86.447574 32.457842,-86.447311 32.457563,-86.447104 32.457334,-86.446987 32.457214)\r\n901;943;odd;Peachtree St;Autauga;AL;36066;LINESTRING(-86.447422 32.457945,-86.447157 32.457665,-86.44695 32.457438,-86.446836 32.457319)\r\n1716;1798;even;Pebble Creek Dr;Autauga;AL;36066;LINESTRING(-86.424019 32.462249,-86.423841 32.462237,-86.423754 32.462228,-86.423406 32.462222,-86.423164 32.462217,-86.423096 32.462206,-86.423099 32.462197,-86.423077 32.462157,-86.423067 32.462094,-86.423069 32.462027,-86.423071 32.461964)\r\n1717;1799;odd;Pebble Creek Dr;Autauga;AL;36066;LINESTRING(-86.424006 32.462413,-86.423823 32.462405,-86.42374 32.462398,-86.423404 32.462388,-86.423142 32.462397,-86.423036 32.462376,-86.422899 32.462341,-86.422869 32.462181,-86.422869 32.462098,-86.422869 32.462021,-86.422877 32.461953)\r\n799;701;odd;Japonica Rd;Autauga;AL;36067;LINESTRING(-86.460071 32.480796,-86.460067 32.480643,-86.460061 32.480065,-86.46005 32.479914,-86.460027 32.479764,-86.459957 32.479549,-86.459908 32.479411)\r\n798;700;even;Japonica Rd;Autauga;AL;36067;LINESTRING(-86.459876 32.4808,-86.459871 32.480647,-86.459861 32.480071,-86.45985 32.479932,-86.459825 32.479798,-86.459767 32.479593,-86.459721 32.479456)\r\n624;640;even;Little Farm Rd;Autauga;AL;36066;LINESTRING(-86.415904 32.468265,-86.415763 32.468254,-86.415533 32.468208,-86.415383 32.468161,-86.414844 32.467948,-86.414608 32.467856,-86.414366 32.467777,-86.414136 32.467706)\r\n633;653;odd;Little Farm Rd;Autauga;AL;36066;LINESTRING(-86.415898 32.46843,-86.415733 32.468434,-86.415469 32.468376,-86.415303 32.468315,-86.414762 32.468098,-86.41453 32.468012,-86.414296 32.467933,-86.414068 32.46786)\r\n1020;1098;even;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.613539 32.535554,-86.613831 32.535596,-86.614345 32.535664,-86.614522 32.535673,-86.615122 32.535701,-86.615894 32.535744,-86.616499 32.535759,-86.617186 32.535751,-86.617528 32.535754,-86.617865 32.535769,-86.618028 32.535787,-86.618187 32.535816,-86.618677 32.535941,-86.618837 32.535987,-86.619159 32.536087,-86.619506 32.536192,-86.620473 32.536455,-86.621138 32.536616,-86.621477 32.536688,-86.622153 32.536808,-86.622492 32.53686,-86.622993 32.536952,-86.623318 32.537026,-86.623474 32.53707,-86.623623 32.537124,-86.623765 32.537187,-86.623903 32.537262,-86.624036 32.537345,-86.624162 32.537434,-86.624282 32.53753,-86.624631 32.537845,-86.624987 32.53816,-86.625475 32.538576,-86.625728 32.538778,-86.626119 32.53907,-86.626391 32.539257,-86.62653 32.539348,-86.627232 32.539774,-86.627503 32.53995,-86.627681 32.54008)\r\n1021;1123;odd;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.613571 32.535391,-86.613861 32.535432,-86.614367 32.535494,-86.614534 32.535507,-86.615134 32.535535,-86.615904 32.535576,-86.616501 32.535593,-86.617186 32.535585,-86.617534 32.535586,-86.617883 32.535599,-86.618062 32.535617,-86.618239 32.53565,-86.618737 32.535783,-86.618903 32.535829,-86.619225 32.535931,-86.61957 32.536034,-86.620531 32.536295,-86.62119 32.536454,-86.621521 32.536524,-86.622191 32.536644,-86.62253 32.536696,-86.623039 32.536788,-86.623376 32.536862,-86.623544 32.536912,-86.623711 32.536966,-86.623869 32.537041,-86.624017 32.537124,-86.624158 32.537211,-86.624296 32.537306,-86.624424 32.53741,-86.624773 32.537731,-86.625127 32.538044,-86.625613 32.538456,-86.625862 32.538654,-86.626247 32.538942,-86.626513 32.539127,-86.626648 32.539214,-86.627348 32.53964,-86.627631 32.539818,-86.627811 32.539957)\r\n2901;2999;all;Marbury Hts;Autauga;AL;36051;LINESTRING(-86.475485 32.692933,-86.475556 32.69279,-86.475647 32.692545,-86.475564 32.692407,-86.475326 32.692398,-86.475181 32.692406,-86.475086 32.692533,-86.475116 32.692723,-86.475183 32.692863,-86.475206 32.69292)\r\n400;498;all;Riverview Ln;Autauga;AL;36003;LINESTRING(-86.659056 32.386166,-86.658897 32.386145,-86.658832 32.386153,-86.658768 32.386167,-86.65871 32.38619,-86.658654 32.386221,-86.658605 32.386264,-86.658564 32.38631,-86.658531 32.386365,-86.658506 32.386424,-86.658468 32.386562,-86.658352 32.38714,-86.658311 32.38729,-86.65823 32.387508,-86.658077 32.387778,-86.657993 32.387899,-86.657969 32.387952,-86.657934 32.38808,-86.657924 32.388146,-86.657908 32.388437,-86.657908 32.388799,-86.657936 32.389311,-86.657929 32.389463,-86.657869 32.390048,-86.65784 32.390269,-86.657813 32.390417,-86.657778 32.390565,-86.657734 32.390709,-86.657568 32.391199,-86.657528 32.391336,-86.657481 32.391545,-86.657456 32.391689,-86.657407 32.391908,-86.657339 32.392124,-86.657202 32.392475,-86.656976 32.392948,-86.656896 32.393149,-86.656827 32.393358,-86.65671 32.39378,-86.656585 32.394275,-86.65656 32.39441,-86.656533 32.394693,-86.656518 32.394841,-86.656493 32.394986,-86.656489 32.394995)\r\n307;311;all;Landcaster Dr;Autauga;AL;36022;LINESTRING(-86.439526 32.601881,-86.438414 32.601882)\r\n2500;2598;even;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.488256 32.629678,-86.48826 32.629935,-86.488259 32.630299,-86.48825 32.630709,-86.488251 32.631099,-86.48821 32.633275,-86.488136 32.634868,-86.488088 32.635467)\r\n2507;2547;odd;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.488451 32.629675,-86.488456 32.629933,-86.488455 32.630301,-86.488446 32.630711,-86.488447 32.631101,-86.488408 32.633279,-86.488334 32.634878,-86.488282 32.635479)\r\n2041;2099;all;Autauga County 63;Autauga;AL;36067;LINESTRING(-86.577953 32.568643,-86.577983 32.569025,-86.578 32.569169,-86.57801 32.569282)\r\n100;198;even;Coleman Dr;Autauga;AL;36067;LINESTRING(-86.479232 32.500229,-86.479871 32.500229)\r\n701;799;odd;Coleman Dr;Autauga;AL;36067;LINESTRING(-86.479232 32.500065,-86.479871 32.500065)\r\n1500;1558;even;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.522872 32.512777,-86.523315 32.513659,-86.523658 32.514326,-86.524296 32.515596,-86.52452 32.51599,-86.524688 32.51625,-86.524867 32.516502,-86.525053 32.516749,-86.525251 32.51699,-86.525348 32.517101)\r\n1653;1657;odd;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.523051 32.512712,-86.523495 32.513593,-86.523838 32.51426,-86.524478 32.515526,-86.524698 32.515914,-86.52486 32.516166,-86.525035 32.516414,-86.525219 32.516657,-86.525411 32.516894,-86.525505 32.517005)\r\n199;101;odd;Lilac Dr;Autauga;AL;36067;LINESTRING(-86.459604 32.479279,-86.45941 32.479338,-86.458926 32.479478,-86.458872 32.479498)\r\n198;100;even;Lilac Dr;Autauga;AL;36067;LINESTRING(-86.45967 32.479434,-86.459476 32.479494,-86.458994 32.479636,-86.458942 32.479651)\r\n1084;1076;even;2nd St;Autauga;AL;36703;LINESTRING(-86.796059 32.335792,-86.796092 32.336647,-86.796133 32.337825)\r\n1085;1077;odd;2nd St;Autauga;AL;36703;LINESTRING(-86.796253 32.335787,-86.796286 32.336641,-86.796327 32.33782)\r\n1699;1625;odd;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.570788 32.502837,-86.570629 32.502806,-86.569966 32.502665,-86.565341 32.501553,-86.564271 32.501282,-86.562878 32.500903,-86.561896 32.50063,-86.561566 32.500542,-86.561229 32.500461,-86.5608 32.500384,-86.560541 32.500349,-86.560277 32.500326,-86.559928 32.500306,-86.559579 32.500307,-86.559229 32.500321,-86.55746 32.500459)\r\n1656;1646;even;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.570745 32.502998,-86.570583 32.502968,-86.569914 32.502827,-86.565285 32.501713,-86.564213 32.50144,-86.562818 32.501061,-86.561836 32.500788,-86.56151 32.500702,-86.561181 32.500625,-86.560764 32.50055,-86.560515 32.500517,-86.560261 32.500494,-86.559922 32.500476,-86.559583 32.500475,-86.559243 32.500489,-86.557477 32.500623)\r\n433;403;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.484579 32.444946,-86.484286 32.444686)\r\n432;402;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.484439 32.44506,-86.484146 32.4448)\r\n424;498;even;Oregon Ct;Autauga;AL;36067;LINESTRING(-86.489378 32.47682,-86.489435 32.476821)\r\n425;499;odd;Oregon Ct;Autauga;AL;36067;LINESTRING(-86.489382 32.476656,-86.489439 32.476657)\r\n999;901;odd;Greencrest St;Autauga;AL;36067;LINESTRING(-86.45593 32.488394,-86.455929 32.488182,-86.455947 32.486592,-86.455939 32.486376,-86.455945 32.486182)\r\n932;700;even;Greencrest St;Autauga;AL;36067;LINESTRING(-86.455735 32.488395,-86.455733 32.488182,-86.455751 32.486594,-86.455745 32.486376,-86.45575 32.486178)\r\n618;606;all;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.827122 32.407475,-86.82715 32.407615,-86.827187 32.407909,-86.827211 32.408202,-86.827232 32.408927)\r\n1664;1700;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.659995 32.524339,-86.661911 32.52431,-86.662085 32.524312,-86.662826 32.524303,-86.663029 32.524301,-86.664057 32.524306,-86.666548 32.524347)\r\n1663;1701;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.659991 32.524175,-86.661911 32.524146,-86.662085 32.524148,-86.662824 32.524137,-86.663029 32.524137,-86.664059 32.52414,-86.666552 32.524182)\r\n1100;1198;even;Florida St;Autauga;AL;36067;LINESTRING(-86.486517 32.436559,-86.48798 32.435917,-86.48813 32.435848,-86.488365 32.435746)\r\n1101;1199;odd;Florida St;Autauga;AL;36067;LINESTRING(-86.486428 32.436413,-86.487888 32.435771,-86.488038 32.4357,-86.488277 32.435599)\r\n808;818;even;Joan Ln;Autauga;AL;36067;LINESTRING(-86.462929 32.481686,-86.462713 32.481681,-86.462456 32.481687,-86.461605 32.481667,-86.4608 32.481686)\r\n801;817;odd;Joan Ln;Autauga;AL;36067;LINESTRING(-86.462923 32.481851,-86.462713 32.481845,-86.462456 32.481851,-86.461605 32.481831,-86.460806 32.481851)\r\n116;198;even;Autauga County 165;Autauga;AL;36003;LINESTRING(-86.648157 32.436325,-86.648611 32.437563,-86.648866 32.438243)\r\n101;199;odd;Autauga County 165;Autauga;AL;36003;LINESTRING(-86.648343 32.436276,-86.648797 32.437513,-86.649052 32.438193)\r\n3300;3356;even;US Hwy 82;Autauga;AL;36006;LINESTRING(-86.728897 32.616314,-86.732137 32.617981,-86.732864 32.618361,-86.733363 32.618633,-86.733569 32.618752,-86.733776 32.618878,-86.733976 32.619008,-86.734173 32.619143,-86.734364 32.619284,-86.73461 32.619482,-86.734728 32.619582,-86.734957 32.61979,-86.735171 32.620011,-86.735375 32.620238,-86.73567 32.620595,-86.735853 32.620841,-86.736023 32.621094,-86.73618 32.621352,-86.736321 32.621611,-86.736505 32.622011,-86.736615 32.622281,-86.73671 32.622557,-86.736831 32.622972,-86.736953 32.623465,-86.737539 32.626021,-86.737628 32.626372,-86.737657 32.626518,-86.737753 32.626799,-86.737858 32.627084,-86.737988 32.627357,-86.738129 32.627616,-86.738212 32.627745,-86.7383 32.627871,-86.738482 32.628101,-86.738686 32.628324,-86.738733 32.628359)\r\n3301;3357;odd;US Hwy 82;Autauga;AL;36006;LINESTRING(-86.728998 32.616174,-86.732239 32.617841,-86.73297 32.618221,-86.733471 32.618495,-86.733683 32.618616,-86.733894 32.618744,-86.734098 32.618878,-86.734301 32.619015,-86.734498 32.61916,-86.734748 32.619362,-86.73487 32.619466,-86.735109 32.619678,-86.735327 32.619909,-86.735535 32.620138,-86.735836 32.620501,-86.736025 32.620755,-86.736197 32.621014,-86.73636 32.621278,-86.736505 32.621545,-86.736691 32.621953,-86.736805 32.622229,-86.736902 32.622513,-86.737025 32.622936,-86.737145 32.623433,-86.737731 32.625987,-86.737822 32.62634,-86.737855 32.62648,-86.737943 32.626751,-86.738048 32.627026,-86.738172 32.627291,-86.738309 32.62754,-86.738386 32.627663,-86.73847 32.627781,-86.738646 32.628001,-86.73884 32.62821,-86.738873 32.628245)\r\n818;898;even;Autauga County 42;Autauga;AL;36051;LINESTRING(-86.563197 32.605115,-86.563243 32.605113,-86.563308 32.605113,-86.563376 32.605122,-86.56352 32.605158,-86.563665 32.605208,-86.563805 32.605268,-86.563933 32.605339,-86.564056 32.605422,-86.564171 32.605515,-86.564457 32.605777,-86.56474 32.606049,-86.56518 32.606499,-86.565385 32.606731,-86.565524 32.606907,-86.56569 32.60715,-86.565762 32.607273,-86.565824 32.6074,-86.566056 32.607938,-86.566151 32.608143,-86.566412 32.608606,-86.566505 32.608739,-86.566615 32.60886,-86.566683 32.608922,-86.566761 32.608974,-86.566846 32.609018,-86.566927 32.60904,-86.567021 32.609073,-86.567197 32.609115,-86.567375 32.609143,-86.567954 32.609215,-86.568212 32.609228,-86.568635 32.609234,-86.568796 32.609244,-86.568952 32.609266,-86.569027 32.609281,-86.569103 32.609302,-86.569253 32.609353,-86.569398 32.609413,-86.569538 32.609483,-86.569884 32.609679,-86.570498 32.610065,-86.570651 32.610146,-86.570815 32.610211,-86.570904 32.61024,-86.571081 32.610275,-86.571174 32.610287,-86.571351 32.610295,-86.571526 32.610294,-86.572203 32.610271,-86.572367 32.610275,-86.572531 32.610286,-86.572692 32.610307,-86.572933 32.610355,-86.573196 32.610427)\r\n817;899;odd;Autauga County 42;Autauga;AL;36051;LINESTRING(-86.563156 32.604954,-86.563223 32.604935,-86.563328 32.604939,-86.563422 32.604952,-86.563588 32.604996,-86.563749 32.605052,-86.563907 32.605118,-86.564055 32.605199,-86.564188 32.605296,-86.564315 32.605395,-86.564603 32.605667,-86.56489 32.605941,-86.565336 32.606395,-86.565549 32.606633,-86.565694 32.606817,-86.565868 32.60707,-86.565946 32.607203,-86.56601 32.60734,-86.56624 32.607878,-86.566335 32.608075,-86.566592 32.608524,-86.566675 32.608641,-86.566771 32.608748,-86.566823 32.608792,-86.566879 32.60883,-86.56694 32.60886,-86.566999 32.608886,-86.567085 32.608911,-86.567243 32.608949,-86.567409 32.608977,-86.567976 32.609045,-86.56822 32.60906,-86.568643 32.609066,-86.568818 32.609074,-86.568996 32.609096,-86.569085 32.609119,-86.569171 32.609144,-86.569337 32.609195,-86.569494 32.609265,-86.569644 32.609339,-86.569998 32.609541,-86.570612 32.609923,-86.570749 32.609994,-86.570895 32.610053,-86.570964 32.610074,-86.571121 32.610107,-86.571196 32.610117,-86.571357 32.610127,-86.571522 32.610126,-86.572201 32.610105,-86.572377 32.610107,-86.572553 32.610118,-86.57273 32.610137,-86.572989 32.610191,-86.573259 32.610271)\r\n199;101;odd;W Main St;Autauga;AL;36067;LINESTRING(-86.475111 32.459786,-86.474308 32.459718,-86.473884 32.459693)\r\n198;100;even;W Main St;Autauga;AL;36067;LINESTRING(-86.475092 32.45995,-86.474292 32.459884,-86.473869 32.459857)\r\n150;198;all;Maple St;Autauga;AL;36067;LINESTRING(-86.474128 32.457656,-86.472807 32.456797,-86.471894 32.456171,-86.470756 32.455465,-86.470407 32.455334,-86.470299 32.45536)\r\n2999;2901;all;Miller Nursery Rd;Autauga;AL;36003;LINESTRING(-86.679527 32.414534,-86.67674 32.414575,-86.675753 32.414593,-86.675615 32.41459)\r\n2020;2022;even;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.464208 32.585306,-86.464222 32.585886)\r\n2019;2025;odd;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.464403 32.585303,-86.464417 32.585883)\r\n3788;3898;even;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.799245 32.599275,-86.800592 32.599358,-86.802278 32.599478,-86.80313 32.599515,-86.803988 32.599499,-86.80655 32.599312,-86.807408 32.599241,-86.808265 32.599164,-86.808609 32.599116,-86.808948 32.599063,-86.809202 32.599018,-86.809704 32.598907,-86.811027 32.598609,-86.811356 32.598547,-86.81152 32.598523,-86.811684 32.598506,-86.81202 32.598486,-86.812186 32.59848,-86.812528 32.598495,-86.81287 32.598521,-86.81439 32.59867,-86.814902 32.598718,-86.815077 32.59873,-86.815251 32.598736,-86.815601 32.598733,-86.815946 32.598716,-86.816117 32.598706,-86.816962 32.598637,-86.817217 32.598631,-86.817553 32.598645,-86.817801 32.59867,-86.818053 32.598712,-86.818291 32.59877,-86.818695 32.598888,-86.820008 32.599319,-86.820064 32.599335)\r\n3789;3899;odd;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.799259 32.599111,-86.800608 32.599194,-86.802292 32.599312,-86.803132 32.599349,-86.803976 32.599329,-86.806532 32.599148,-86.807388 32.599077,-86.808239 32.598996,-86.808575 32.598952,-86.80891 32.598899,-86.809156 32.598854,-86.809654 32.598747,-86.810979 32.598447,-86.811316 32.598381,-86.81149 32.598355,-86.811666 32.598338,-86.81201 32.598318,-86.812188 32.598314,-86.812542 32.598327,-86.81289 32.598355,-86.814412 32.598506,-86.81492 32.598552,-86.815089 32.598562,-86.815255 32.598568,-86.815595 32.598565,-86.815934 32.59855,-86.816101 32.59854,-86.81695 32.598465,-86.817219 32.598465,-86.817569 32.598475,-86.817833 32.5985,-86.818101 32.598546,-86.818353 32.598608,-86.818763 32.598732,-86.820078 32.599163,-86.820131 32.59918)\r\n100;198;even;Kentucky Ct;Autauga;AL;36066;LINESTRING(-86.417153 32.492653,-86.41713 32.493266,-86.417122 32.49332)\r\n101;199;odd;Kentucky Ct;Autauga;AL;36066;LINESTRING(-86.417347 32.492656,-86.417348 32.493296,-86.417307 32.493371)\r\n100;198;all;Kingston Ct;Autauga;AL;36067;LINESTRING(-86.48277 32.476888,-86.48305 32.476692)\r\n300;304;even;E Poplar St;Autauga;AL;36066;LINESTRING(-86.439381 32.466536,-86.43925 32.466483,-86.438792 32.466287)\r\n301;303;odd;E Poplar St;Autauga;AL;36066;LINESTRING(-86.4393 32.466685,-86.439164 32.466633,-86.438704 32.466433)\r\n100;114;even;Patrick St;Autauga;AL;36067;LINESTRING(-86.453437 32.452589,-86.453449 32.452595,-86.453543 32.45262,-86.45364 32.452639,-86.45374 32.452644,-86.454007 32.452634,-86.454102 32.452628)\r\n101;113;odd;Patrick St;Autauga;AL;36067;LINESTRING(-86.453503 32.452435,-86.453511 32.452435,-86.453593 32.452454,-86.453672 32.452467,-86.453746 32.452476,-86.453997 32.452468,-86.454091 32.452464)\r\n2124;2138;all;Autauga County 66;Autauga;AL;36022;LINESTRING(-86.479304 32.589054,-86.479307 32.589083,-86.479353 32.589153,-86.4794 32.589223,-86.47946 32.589286,-86.479523 32.589343,-86.479594 32.589396,-86.479671 32.589443,-86.479973 32.589592,-86.480204 32.589697,-86.480366 32.589759,-86.480614 32.589836,-86.480861 32.589902,-86.481938 32.590143,-86.482585 32.590302,-86.483065 32.5904)\r\n446;440;all;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.494135 32.538822,-86.49391 32.538824,-86.492967 32.538836,-86.492963 32.538835)\r\n401;403;odd;Oak Valley Rd;Autauga;AL;36022;LINESTRING(-86.440377 32.538373,-86.440422 32.538291,-86.440461 32.538236,-86.440503 32.538194,-86.440552 32.538162,-86.440603 32.538148,-86.440742 32.538139,-86.440811 32.538147,-86.440887 32.538166,-86.44096 32.538189,-86.441188 32.53828,-86.441349 32.538335,-86.441517 32.538384,-86.441612 32.5384,-86.441799 32.538412,-86.441925 32.538398,-86.442081 32.538279,-86.442231 32.538094,-86.44228 32.53805,-86.442337 32.53801,-86.442762 32.537778,-86.442906 32.537711,-86.442977 32.537683,-86.443131 32.537634,-86.443379 32.537573,-86.443463 32.537537,-86.443545 32.537502,-86.443621 32.537457,-86.443697 32.537413,-86.443769 32.537349)\r\n4000;4098;even;Oak Valley Rd;Autauga;AL;36022;LINESTRING(-86.440198 32.538309,-86.440238 32.538219,-86.440281 32.538138,-86.440351 32.538062,-86.440444 32.538004,-86.440555 32.53796,-86.440762 32.537961,-86.440859 32.537983,-86.440949 32.538004,-86.441038 32.538031,-86.441268 32.538124,-86.441419 32.538175,-86.441571 32.538216,-86.44164 32.538228,-86.441783 32.538238,-86.441819 32.53822,-86.441921 32.538155,-86.442069 32.537982,-86.44214 32.53792,-86.442219 32.53787,-86.442658 32.537632,-86.442814 32.537559,-86.442899 32.537525,-86.443067 32.537474,-86.443305 32.537409,-86.443375 32.537385,-86.443441 32.537354,-86.443507 32.537319,-86.443565 32.537279,-86.443636 32.537229)\r\n3000;3062;even;State Rte 14;Autauga;AL;36003;LINESTRING(-86.692762 32.441173,-86.693314 32.441382,-86.694194 32.441683,-86.695182 32.442013,-86.696996 32.44262,-86.697391 32.442758,-86.698193 32.443028,-86.698596 32.443157,-86.700186 32.443698,-86.701204 32.444036,-86.701388 32.444097,-86.702162 32.444356)\r\n3001;3057;odd;State Rte 14;Autauga;AL;36003;LINESTRING(-86.692841 32.441023,-86.693392 32.441228,-86.694266 32.441529,-86.695254 32.441859,-86.69707 32.442466,-86.697465 32.442604,-86.698265 32.442874,-86.698668 32.443003,-86.700258 32.443544,-86.701276 32.443882,-86.70146 32.443943,-86.702233 32.444203)\r\n1198;1156;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.430863 32.43826,-86.431399 32.438204,-86.431933 32.438164)\r\n800;834;even;Autauga County 1;Autauga;AL;36749;LINESTRING(-86.823374 32.543263,-86.823352 32.543266,-86.823275 32.543295,-86.823194 32.54332,-86.822952 32.543403,-86.822796 32.543475,-86.822642 32.543547,-86.822421 32.543662,-86.822281 32.543749,-86.822206 32.54379,-86.822001 32.543932,-86.82181 32.544083,-86.821684 32.544189,-86.821512 32.544359,-86.821257 32.544654,-86.82116 32.544778,-86.82107 32.544908,-86.820988 32.545042,-86.820913 32.545178,-86.819346 32.548237,-86.818931 32.549035,-86.818788 32.549294,-86.818629 32.549545,-86.818455 32.54979,-86.81836 32.549909,-86.818161 32.550138,-86.817998 32.55031)\r\n701;843;odd;Autauga County 1;Autauga;AL;36749;LINESTRING(-86.823434 32.543419,-86.823422 32.543426,-86.823347 32.543451,-86.823266 32.543476,-86.823038 32.543559,-86.82289 32.543621,-86.822744 32.543691,-86.822531 32.543804,-86.822393 32.543883,-86.822328 32.543926,-86.822133 32.54406,-86.821948 32.544203,-86.821832 32.544305,-86.82167 32.544465,-86.821421 32.54475,-86.82133 32.544868,-86.821244 32.54499,-86.821166 32.545116,-86.821093 32.545246,-86.819524 32.548303,-86.819111 32.549103,-86.818968 32.54937,-86.818801 32.549629,-86.818623 32.549882,-86.818522 32.550005,-86.818319 32.550242,-86.818149 32.550414)\r\n1248;1254;all;Cross Creek Rd;Autauga;AL;36067;LINESTRING(-86.473365 32.493187,-86.472742 32.493178,-86.472564 32.49318)\r\n234;298;all;E 3rd St;Autauga;AL;36067;LINESTRING(-86.468317 32.460881,-86.468185 32.460865,-86.467415 32.460815,-86.467334 32.460809)\r\n701;759;all;Bel Ru Lndg;Autauga;AL;36067;LINESTRING(-86.594574 32.37683,-86.594393 32.376109,-86.594245 32.375393,-86.594244 32.375177,-86.594234 32.374829,-86.594221 32.374431,-86.594205 32.37413,-86.594178 32.373991,-86.594133 32.373853,-86.594078 32.37373,-86.594007 32.373516,-86.593943 32.373398,-86.593721 32.373102,-86.593573 32.372933,-86.593428 32.3728,-86.593266 32.372697,-86.593075 32.372636,-86.592878 32.372617,-86.592726 32.372569,-86.592581 32.37248,-86.592521 32.372417,-86.592406 32.372323,-86.592273 32.372203,-86.592183 32.372036,-86.592181 32.371907,-86.592235 32.371756,-86.592262 32.371697,-86.592275 32.371624,-86.592222 32.37142,-86.592148 32.371156,-86.591955 32.370539,-86.591869 32.370223,-86.591722 32.369976,-86.591548 32.369766,-86.590935 32.369214,-86.5909 32.369133)\r\n512;514;even;Mossy Oak Ridge;Autauga;AL;36066;LINESTRING(-86.429394 32.467521,-86.429401 32.467677,-86.429459 32.467825,-86.429579 32.468102)\r\n515;517;odd;Mossy Oak Ridge;Autauga;AL;36066;LINESTRING(-86.429588 32.467507,-86.429611 32.467643,-86.429649 32.467773,-86.429762 32.468046)\r\n2800;2898;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.676106 32.568496,-86.680232 32.572086,-86.681389 32.573098)\r\n2799;2833;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.676246 32.568381,-86.680372 32.571972,-86.68153 32.572984)\r\n3000;3010;even;Mushat Ln;Autauga;AL;36051;LINESTRING(-86.466588 32.698477,-86.46656 32.698495,-86.466551 32.69874,-86.466602 32.698969,-86.466655 32.69912,-86.466792 32.699328,-86.466991 32.699498,-86.467309 32.699642,-86.467545 32.69973,-86.46792 32.69989,-86.468047 32.699948)\r\n201;3015;odd;Mushat Ln;Autauga;AL;36051;LINESTRING(-86.466761 32.698553,-86.466782 32.698547,-86.466755 32.69873,-86.466802 32.698927,-86.466851 32.699048,-86.466966 32.699216,-86.467125 32.69935,-86.467401 32.699488,-86.467631 32.699578,-86.468014 32.699742,-86.468142 32.699805)\r\n2228;2234;all;Autauga County 123;Autauga;AL;36051;LINESTRING(-86.575831 32.6988,-86.575311 32.699313,-86.574974 32.699626)\r\n1800;1814;even;Buckeye Dr;Autauga;AL;36067;LINESTRING(-86.699956 32.589325,-86.699876 32.589638,-86.699812 32.58974,-86.69971 32.589819,-86.699653 32.589849,-86.6995 32.589896,-86.699175 32.58997,-86.698846 32.590031,-86.698682 32.590053,-86.698264 32.590083,-86.69815 32.590089)\r\n1801;1815;odd;Buckeye Dr;Autauga;AL;36067;LINESTRING(-86.700147 32.589355,-86.700084 32.589698,-86.699992 32.589858,-86.699832 32.589973,-86.699733 32.590007,-86.699562 32.590062,-86.699221 32.590132,-86.698884 32.590197,-86.698708 32.590225,-86.698276 32.590249,-86.69816 32.590253)\r\n131;101;odd;Autauga County 64;Autauga;AL;36022;LINESTRING(-86.484576 32.627367,-86.484757 32.627346,-86.484922 32.627331,-86.485085 32.627322,-86.485327 32.627333,-86.485482 32.627354,-86.48571 32.627412,-86.485848 32.627468,-86.485975 32.62754,-86.486158 32.627676,-86.486332 32.627827,-86.486442 32.627932,-86.486546 32.628041,-86.486899 32.628446,-86.487439 32.629044)\r\n128;106;even;Autauga County 64;Autauga;AL;36022;LINESTRING(-86.484547 32.627204,-86.484731 32.62718,-86.484906 32.627161,-86.485083 32.627156,-86.485347 32.627159,-86.485528 32.627182,-86.485786 32.627246,-86.485952 32.627316,-86.486103 32.627402,-86.486298 32.627554,-86.486478 32.627713,-86.486594 32.627824,-86.486704 32.627937,-86.487057 32.628346,-86.487594 32.628944)\r\n1900;1910;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.575535 32.492982,-86.575592 32.493012,-86.576173 32.493324,-86.576452 32.493483,-86.577154 32.493903,-86.57743 32.494076,-86.577971 32.49443,-86.578366 32.494705,-86.578754 32.494991,-86.579259 32.495383,-86.579754 32.495783,-86.580113 32.496092,-86.580409 32.49636)\r\n1901;1907;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.575634 32.492841,-86.575696 32.49287,-86.576281 32.493184,-86.576564 32.493347,-86.57727 32.493769,-86.577548 32.493944,-86.578095 32.4943,-86.578494 32.494577,-86.578886 32.494867,-86.579393 32.495261,-86.579892 32.495665,-86.580255 32.495976,-86.580552 32.496248)\r\n1168;1128;all;Autauga County 6;Autauga;AL;36067;LINESTRING(-86.586012 32.547238,-86.585944 32.547237,-86.584308 32.547181,-86.583623 32.547167,-86.583371 32.547174,-86.583207 32.547187,-86.58313 32.547198,-86.582973 32.547231,-86.582827 32.547279,-86.582691 32.547344,-86.582562 32.547425,-86.582437 32.547518,-86.581706 32.548128,-86.581596 32.548231,-86.581491 32.548341,-86.581396 32.548455,-86.58131 32.548574,-86.581231 32.548699,-86.580777 32.549486,-86.580694 32.549617,-86.580553 32.54981,-86.580494 32.549866)\r\n581;505;odd;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.827105 32.411393,-86.827146 32.413305,-86.827135 32.413591,-86.827121 32.413733,-86.8271 32.413874,-86.827039 32.414158,-86.827001 32.414297,-86.826956 32.414437,-86.826904 32.414573,-86.826846 32.414707,-86.826715 32.414974,-86.826642 32.415105,-86.826564 32.415229,-86.826478 32.415353,-86.826386 32.415475,-86.826291 32.415591,-86.826189 32.415704,-86.82597 32.415922,-86.825736 32.416131,-86.824807 32.416884,-86.824396 32.417221)\r\n580;504;even;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.8273 32.41139,-86.82734 32.413305,-86.827335 32.413601,-86.827319 32.413751,-86.827296 32.4139,-86.827235 32.414192,-86.827193 32.414339,-86.827146 32.414485,-86.827092 32.414627,-86.827032 32.414769,-86.826897 32.415042,-86.826822 32.415181,-86.826736 32.415311,-86.826646 32.415441,-86.826552 32.415567,-86.826453 32.415691,-86.826343 32.41581,-86.82612 32.416036,-86.825876 32.416249,-86.824943 32.417002,-86.824531 32.417339)\r\n2000;2014;even;Red Hawk Rd;Autauga;AL;36067;LINESTRING(-86.470794 32.504822,-86.470796 32.504894,-86.47077 32.505756,-86.470755 32.50686)\r\n2001;2005;odd;Red Hawk Rd;Autauga;AL;36067;LINESTRING(-86.470988 32.504819,-86.47099 32.504894,-86.470966 32.50576,-86.470949 32.506862)\r\n2380;2498;even;Big Springs Church Rd;Autauga;AL;36006;LINESTRING(-86.713409 32.654836,-86.713414 32.654876,-86.713442 32.654951,-86.713501 32.655094,-86.713576 32.655231,-86.713659 32.655364,-86.713803 32.65555,-86.713901 32.655672,-86.714006 32.655788,-86.714322 32.656126,-86.7146 32.656405,-86.714831 32.656627,-86.715273 32.657012,-86.715716 32.657412,-86.716043 32.657734,-86.716232 32.657916)\r\n2441;2499;odd;Big Springs Church Rd;Autauga;AL;36006;LINESTRING(-86.7136 32.654805,-86.713612 32.654836,-86.713632 32.654899,-86.713689 32.65503,-86.713756 32.655157,-86.713833 32.655278,-86.713967 32.655458,-86.714063 32.655574,-86.714162 32.655686,-86.714476 32.65602,-86.71475 32.656297,-86.714977 32.656513,-86.715415 32.656898,-86.715864 32.6573,-86.716191 32.657626,-86.716379 32.657808)\r\n745;799;all;Gin Shop Hill Rd;Autauga;AL;36067;LINESTRING(-86.486077 32.453923,-86.486149 32.453838,-86.48654 32.453371,-86.48688 32.452939,-86.486983 32.452821)\r\n999;801;odd;N Memorial Dr;Autauga;AL;36067;LINESTRING(-86.453451 32.485068,-86.453371 32.484792,-86.453298 32.484581,-86.45316 32.484237,-86.453037 32.483962,-86.452836 32.483567,-86.452624 32.483098,-86.452194 32.482157,-86.452023 32.481687)\r\n998;918;even;N Memorial Dr;Autauga;AL;36067;LINESTRING(-86.453262 32.485108,-86.453179 32.484836,-86.453108 32.484631,-86.452974 32.484293,-86.452853 32.484026,-86.452652 32.483629,-86.452442 32.483158,-86.452002 32.482213,-86.451837 32.481734)\r\n2100;2198;even;Forest Ridge Rd N;Autauga;AL;36067;LINESTRING(-86.585233 32.497528,-86.585181 32.49766,-86.584984 32.498157,-86.584862 32.498426,-86.584857 32.498597,-86.584935 32.498783,-86.585143 32.498996,-86.58577 32.499635,-86.586228 32.500132,-86.586451 32.500424)\r\n2101;2199;odd;Forest Ridge Rd N;Autauga;AL;36067;LINESTRING(-86.585418 32.49758,-86.585367 32.497712,-86.585168 32.498211,-86.58508 32.49846,-86.585077 32.498567,-86.585131 32.498693,-86.585297 32.498892,-86.585924 32.499531,-86.586394 32.500032,-86.586615 32.500336)\r\n380;498;all;Bozie Rd;Autauga;AL;36022;LINESTRING(-86.427152 32.529345,-86.427154 32.529349,-86.42718 32.52978,-86.427172 32.530067,-86.427188 32.530638,-86.427221 32.531,-86.427225 32.531362,-86.427227 32.531867,-86.427236 32.532085,-86.427231 32.532231,-86.427238 32.532448,-86.42723 32.532736,-86.427236 32.53324,-86.427232 32.53353,-86.427243 32.533746,-86.427247 32.533962,-86.427238 32.534112,-86.427205 32.534326,-86.427189 32.534472,-86.427169 32.534607)\r\n940;970;even;Autauga County 42;Autauga;AL;36051;LINESTRING(-86.579172 32.613049,-86.579796 32.613128,-86.580261 32.613188,-86.580554 32.613228,-86.581231 32.613335,-86.581462 32.613366)\r\n945;981;odd;Autauga County 42;Autauga;AL;36051;LINESTRING(-86.579201 32.612886,-86.579826 32.612966,-86.580291 32.613026,-86.580588 32.613062,-86.581265 32.613171,-86.581493 32.613203)\r\n2400;2498;even;Rocky Hollow Ln;Autauga;AL;36022;LINESTRING(-86.471824 32.625804,-86.472098 32.6258,-86.472257 32.62581,-86.472326 32.62582,-86.472356 32.62584,-86.472368 32.625851,-86.472386 32.62589,-86.472387 32.626099,-86.472376 32.626467,-86.472342 32.627538,-86.47232 32.628472,-86.472315 32.628905,-86.472299 32.629411,-86.472303 32.629491,-86.472311 32.629574,-86.47234 32.629658,-86.472389 32.629738,-86.472456 32.629813,-86.472626 32.629914,-86.472818 32.629946,-86.472993 32.629963,-86.473341 32.629994,-86.473854 32.630025,-86.474176 32.630037)\r\n2449;2499;odd;Rocky Hollow Ln;Autauga;AL;36022;LINESTRING(-86.47182 32.625639,-86.4721 32.625634,-86.472279 32.625634,-86.472378 32.62565,-86.472504 32.625674,-86.47259 32.625781,-86.47259 32.625882,-86.472583 32.626103,-86.47257 32.626471,-86.472538 32.627542,-86.472516 32.628474,-86.472511 32.628907,-86.472497 32.629409,-86.472503 32.629475,-86.472517 32.629538,-86.472536 32.62959,-86.472567 32.62964,-86.472606 32.629677,-86.472718 32.62974,-86.472856 32.629776,-86.473017 32.629797,-86.473359 32.629828,-86.473866 32.629859,-86.474186 32.629873)\r\n1299;1295;all;Tallant Dr;Autauga;AL;36067;LINESTRING(-86.520451 32.48607,-86.520499 32.485778)\r\n801;899;all;Jensen Rd;Autauga;AL;36067;LINESTRING(-86.469781 32.431025,-86.469808 32.430967)\r\n2800;2898;even;River Bend Rd;Autauga;AL;36003;LINESTRING(-86.674759 32.360724,-86.674772 32.360723,-86.674912 32.360634,-86.675165 32.360446)\r\n2801;2817;odd;River Bend Rd;Autauga;AL;36003;LINESTRING(-86.674662 32.360581,-86.67466 32.360577,-86.674786 32.3605,-86.675038 32.360321)\r\n693;699;all;Autery Rd;Autauga;AL;36067;LINESTRING(-86.510165 32.527897,-86.510122 32.527917)\r\n101;131;all;Autauga County 68 W;Autauga;AL;36022;LINESTRING(-86.489333 32.657482,-86.489717 32.657553,-86.490874 32.657837,-86.491201 32.657898,-86.491383 32.657922)\r\n399;301;odd;Sheila Blvd;Autauga;AL;36066;LINESTRING(-86.426122 32.448566,-86.426119 32.448396,-86.426138 32.446448,-86.426155 32.446315,-86.426189 32.446185,-86.426244 32.446065,-86.426362 32.445884,-86.426452 32.445764,-86.426634 32.445536)\r\n398;300;even;Sheila Blvd;Autauga;AL;36066;LINESTRING(-86.425927 32.448568,-86.425925 32.448396,-86.425936 32.44644,-86.425951 32.446289,-86.425989 32.446135,-86.426056 32.445989,-86.426192 32.445798,-86.426286 32.445672,-86.426473 32.445443)\r\n404;498;even;Summer Hill Rd;Autauga;AL;36067;LINESTRING(-86.458203 32.446708,-86.4581 32.44677,-86.458038 32.446801,-86.457969 32.446826,-86.457896 32.446843,-86.457824 32.446852,-86.457316 32.446866,-86.457206 32.446868,-86.457096 32.446912,-86.457012 32.446988,-86.456968 32.447078,-86.456952 32.447172,-86.456975 32.447545,-86.456978 32.447626,-86.456978 32.447633)\r\n401;499;odd;Summer Hill Rd;Autauga;AL;36067;LINESTRING(-86.458326 32.446835,-86.458218 32.446918,-86.458128 32.446959,-86.458035 32.44699,-86.45794 32.447013,-86.457842 32.447026,-86.45733 32.447036,-86.457268 32.44705,-86.45723 32.447066,-86.457198 32.447094,-86.457174 32.447132,-86.457158 32.447184,-86.457173 32.447541,-86.457172 32.447624,-86.457172 32.447632)\r\n1000;1098;even;Choctaw Ridge N;Autauga;AL;36067;LINESTRING(-86.521457 32.45895,-86.5215 32.458637,-86.521615 32.457919,-86.521636 32.457866,-86.521665 32.457822,-86.521705 32.457781,-86.521757 32.457741,-86.521962 32.45762,-86.522036 32.457571,-86.522101 32.457514,-86.522163 32.457458,-86.522222 32.457396,-86.52232 32.457269,-86.522362 32.457195,-86.522425 32.457055,-86.522543 32.456709,-86.522629 32.456515,-86.5227 32.456394,-86.522786 32.456282,-86.522939 32.45612,-86.523052 32.456024,-86.523178 32.455934,-86.523241 32.455896,-86.523305 32.455865,-86.523452 32.455811,-86.523525 32.45579,-86.523685 32.455761,-86.523761 32.455752,-86.52409 32.455738,-86.524596 32.455752,-86.524859 32.455757,-86.525129 32.455741,-86.525226 32.455725,-86.525776 32.455569)\r\n1001;1099;odd;Choctaw Ridge N;Autauga;AL;36067;LINESTRING(-86.521264 32.458931,-86.521306 32.458617,-86.521411 32.457883,-86.521438 32.457796,-86.521491 32.457716,-86.521561 32.457655,-86.521633 32.457605,-86.521842 32.457484,-86.5219 32.457443,-86.521957 32.457398,-86.522009 32.457348,-86.522056 32.457296,-86.522142 32.457183,-86.522176 32.457127,-86.522233 32.457001,-86.522351 32.456657,-86.522441 32.456445,-86.522524 32.45631,-86.522618 32.45618,-86.522787 32.456004,-86.522916 32.455898,-86.523054 32.455798,-86.523131 32.455752,-86.523213 32.455711,-86.52338 32.455649,-86.523473 32.455626,-86.523651 32.455589,-86.523747 32.455584,-86.524088 32.455572,-86.5246 32.455586,-86.524853 32.455587,-86.525101 32.455569,-86.525174 32.455557,-86.525715 32.455412)\r\n115;109;odd;Overlook Dr;Autauga;AL;36066;LINESTRING(-86.435781 32.447917,-86.43576 32.447763,-86.435762 32.447565,-86.435824 32.447385,-86.435897 32.447278,-86.436005 32.44717,-86.436021 32.447148)\r\n114;100;even;Overlook Dr;Autauga;AL;36066;LINESTRING(-86.435589 32.447941,-86.435554 32.447777,-86.435546 32.447541,-86.435622 32.447309,-86.435729 32.447172,-86.435849 32.447062,-86.435866 32.447048)\r\n1800;1870;even;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.674747 32.604744,-86.674682 32.604954,-86.674601 32.60539,-86.674574 32.605684,-86.674563 32.605905,-86.67456 32.606198,-86.674595 32.606563,-86.67468 32.60714,-86.674748 32.607571,-86.674764 32.607641,-86.674844 32.608196,-86.674846 32.608267,-86.674857 32.608338,-86.674867 32.608475,-86.674854 32.608832,-86.674832 32.609048,-86.674828 32.609117,-86.674801 32.609318,-86.674791 32.609381)\r\n1815;1873;odd;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.674936 32.604783,-86.67488 32.604988,-86.674801 32.60541,-86.674772 32.605694,-86.674761 32.605909,-86.674762 32.606192,-86.674793 32.606547,-86.674874 32.607118,-86.674946 32.607543,-86.674964 32.607613,-86.675046 32.608182,-86.67505 32.608253,-86.675061 32.608324,-86.675063 32.608475,-86.675054 32.608842,-86.675032 32.609058,-86.67503 32.609131,-86.674997 32.609342,-86.674983 32.609407)\r\n1299;1201;odd;Nicholas Ln;Autauga;AL;36749;LINESTRING(-86.878777 32.596244,-86.878556 32.596053,-86.878169 32.595765,-86.877682 32.595459,-86.8773 32.595246)\r\n1298;1200;even;Nicholas Ln;Autauga;AL;36749;LINESTRING(-86.878639 32.596361,-86.878418 32.596177,-86.878041 32.595897,-86.877566 32.595597,-86.877191 32.595383)\r\n1686;1698;even;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.44369 32.540552,-86.443743 32.540583,-86.444041 32.540754)\r\n1689;1699;odd;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.443796 32.540415,-86.443853 32.540445,-86.444151 32.540618)\r\n264;388;even;Autauga County 15;Autauga;AL;36003;LINESTRING(-86.809554 32.484926,-86.809556 32.48493,-86.809867 32.485365,-86.810028 32.485618,-86.810172 32.485878,-86.810238 32.48601,-86.810298 32.486144,-86.810407 32.486418,-86.810453 32.486556,-86.810533 32.486836,-86.810566 32.486977,-86.810621 32.487259,-86.81064 32.4874,-86.810664 32.487686,-86.810673 32.487972,-86.810662 32.48826,-86.810591 32.489649,-86.81058 32.490088,-86.810584 32.490531,-86.810601 32.490825,-86.81063 32.491118,-86.810669 32.491413,-86.810891 32.492717,-86.810926 32.493001,-86.810935 32.493144,-86.810936 32.493283,-86.810919 32.49357,-86.810878 32.493852,-86.810816 32.494133,-86.810775 32.49427,-86.810725 32.494407,-86.81067 32.494541,-86.810547 32.494811,-86.80995 32.496029,-86.809824 32.49631,-86.80975 32.496487)\r\n301;399;odd;Autauga County 15;Autauga;AL;36003;LINESTRING(-86.809719 32.484839,-86.809722 32.484842,-86.810041 32.485281,-86.810206 32.485542,-86.810354 32.48581,-86.810422 32.485948,-86.810484 32.486088,-86.810597 32.486368,-86.810645 32.486514,-86.810727 32.4868,-86.81076 32.486947,-86.810819 32.487235,-86.810838 32.487384,-86.810864 32.487678,-86.810869 32.487972,-86.810858 32.488266,-86.810787 32.489655,-86.810776 32.490088,-86.810782 32.490527,-86.810799 32.490815,-86.810826 32.491102,-86.810865 32.491391,-86.811089 32.492697,-86.811124 32.492989,-86.811133 32.49314,-86.811134 32.493287,-86.811121 32.493584,-86.811076 32.493878,-86.811012 32.494171,-86.810965 32.494316,-86.810915 32.494459,-86.810854 32.494599,-86.810729 32.494873,-86.810134 32.496091,-86.810008 32.496368,-86.809934 32.496542)\r\n105;113;all;Asbury Dr;Autauga;AL;36067;LINESTRING(-86.540356 32.468656,-86.539559 32.468392,-86.538752 32.46815,-86.537633 32.467801)\r\n2000;2098;even;Maul Dr;Autauga;AL;36006;LINESTRING(-86.71558 32.660142,-86.714968 32.660278,-86.714323 32.66042,-86.713999 32.660475,-86.713783 32.6605)\r\n2055;2099;odd;Maul Dr;Autauga;AL;36006;LINESTRING(-86.71563 32.660301,-86.715018 32.660438,-86.714369 32.660584,-86.714031 32.660643,-86.713807 32.660664)\r\n2018;2098;even;Red Hawk Rd;Autauga;AL;36067;LINESTRING(-86.471864 32.509418,-86.471867 32.509545,-86.471866 32.509947,-86.471848 32.510518)\r\n2023;2099;odd;Red Hawk Rd;Autauga;AL;36067;LINESTRING(-86.472059 32.509413,-86.472065 32.509543,-86.472062 32.509949,-86.472042 32.510523)\r\n1226;1240;all;Conestoga Wagon Trl;Autauga;AL;36067;LINESTRING(-86.501961 32.501897,-86.501968 32.501907,-86.502021 32.501883,-86.502086 32.501867,-86.502251 32.501854,-86.503644 32.501817)\r\n422;400;all;Autauga County 4;Autauga;AL;36067;LINESTRING(-86.486123 32.431099,-86.48556 32.431095,-86.482981 32.431057,-86.482114 32.431051)\r\n301;399;odd;Carver St;Autauga;AL;36067;LINESTRING(-86.473668 32.479072,-86.473674 32.47889,-86.473673 32.478672,-86.473673 32.478649)\r\n398;300;even;Carver St;Autauga;AL;36067;LINESTRING(-86.473474 32.479069,-86.473478 32.478888,-86.473477 32.47867,-86.473478 32.478645)\r\n100;118;even;Warwick Dr;Autauga;AL;36066;LINESTRING(-86.439978 32.474435,-86.43998 32.474417,-86.439976 32.474224,-86.439935 32.474005,-86.439889 32.47379,-86.439819 32.473505,-86.439721 32.473154,-86.439634 32.472875,-86.439577 32.472674)\r\n101;117;odd;Warwick Dr;Autauga;AL;36066;LINESTRING(-86.439784 32.474435,-86.439782 32.474419,-86.439772 32.47424,-86.439739 32.474031,-86.439695 32.473822,-86.439627 32.473541,-86.439529 32.473194,-86.439442 32.472915,-86.439387 32.472711)\r\n200;298;even;Autauga County 20;Autauga;AL;36051;LINESTRING(-86.475959 32.701043,-86.47561 32.700942,-86.474715 32.700689,-86.474542 32.700642,-86.47401 32.700598,-86.473481 32.700652,-86.473309 32.700694,-86.47298 32.700783,-86.472008 32.701069,-86.471763 32.701163,-86.471608 32.701246,-86.471484 32.701331)\r\n201;299;odd;Autauga County 20;Autauga;AL;36051;LINESTRING(-86.475896 32.701199,-86.475548 32.701098,-86.474657 32.700849,-86.4745 32.700816,-86.474012 32.700762,-86.473521 32.700824,-86.473365 32.700856,-86.473042 32.700941,-86.472084 32.701229,-86.471861 32.701317,-86.471724 32.701388,-86.471603 32.701462)\r\n504;500;all;Ambrose Ln;Autauga;AL;36066;LINESTRING(-86.429189 32.472275,-86.429245 32.47218,-86.429311 32.472045,-86.429381 32.471847,-86.429435 32.471641,-86.42947 32.471481)\r\n870;998;all;Autauga County 165;Autauga;AL;36067;LINESTRING(-86.585048 32.497414,-86.584793 32.497644,-86.584394 32.498023,-86.583485 32.4989,-86.583434 32.498963,-86.583242 32.499165)\r\n496;498;even;Autauga County 122;Autauga;AL;36022;LINESTRING(-86.418932 32.587115,-86.418834 32.587098,-86.418838 32.587108)\r\n497;499;odd;Autauga County 122;Autauga;AL;36022;LINESTRING(-86.418913 32.587279,-86.418786 32.587276,-86.418772 32.587263)\r\n100;198;even;Poplar Ct;Autauga;AL;36066;LINESTRING(-86.438192 32.465649,-86.438271 32.46564,-86.43832 32.465635,-86.438374 32.465635,-86.438429 32.465637,-86.438489 32.465643,-86.438539 32.465654,-86.438633 32.465651,-86.438657 32.465648)\r\n101;199;odd;Poplar Ct;Autauga;AL;36066;LINESTRING(-86.438154 32.465488,-86.438243 32.465468,-86.438312 32.465465,-86.43838 32.465465,-86.438445 32.465469,-86.438517 32.465475,-86.438559 32.465478,-86.438627 32.465483,-86.438644 32.465484)\r\n1701;1709;all;E Bank Rd;Autauga;AL;36067;LINESTRING(-86.50677 32.541798,-86.507005 32.542369,-86.507189 32.543178,-86.507195 32.543517)\r\n700;798;all;Lakeshore Dr;Autauga;AL;36003;LINESTRING(-86.63484 32.414224,-86.634827 32.414287,-86.634821 32.414519,-86.634827 32.414672,-86.634848 32.414824,-86.634881 32.414973,-86.634947 32.415194,-86.635007 32.415337,-86.635339 32.415934,-86.635436 32.416135,-86.635459 32.416197,-86.635515 32.416402,-86.635524 32.416465,-86.635523 32.416601,-86.635502 32.416737,-86.635444 32.416941,-86.635419 32.417006,-86.635357 32.417134,-86.635283 32.417251,-86.63524 32.417307,-86.635191 32.417356,-86.635138 32.417403,-86.635083 32.417433,-86.635015 32.41747)\r\n2342;2398;even;State Rte 14;Autauga;AL;36003;LINESTRING(-86.650271 32.434802,-86.651078 32.434414,-86.652426 32.433761,-86.652727 32.433606,-86.652854 32.433543)\r\n2343;2399;odd;State Rte 14;Autauga;AL;36003;LINESTRING(-86.650175 32.434659,-86.650982 32.43427,-86.652326 32.433617,-86.652627 32.433462,-86.652758 32.4334)\r\n1100;1198;even;Oates Rd;Autauga;AL;36066;LINESTRING(-86.444588 32.456767,-86.44433 32.456771,-86.443311 32.45678,-86.442777 32.456782)\r\n1101;1199;odd;Oates Rd;Autauga;AL;36066;LINESTRING(-86.444592 32.456931,-86.444334 32.456937,-86.443313 32.456946,-86.442777 32.456947)\r\n1050;1094;even;Autauga County 5;Autauga;AL;36749;LINESTRING(-86.813299 32.575218,-86.813417 32.575578,-86.813526 32.575859,-86.813665 32.576124,-86.813749 32.57626,-86.813892 32.576441,-86.814246 32.576928,-86.814614 32.577498,-86.814956 32.57801,-86.815056 32.578136,-86.81522 32.578315,-86.815344 32.578423,-86.815473 32.578527,-86.815732 32.578719,-86.815913 32.578865,-86.816018 32.578964,-86.816115 32.579074,-86.816392 32.579436,-86.816677 32.579805,-86.816835 32.579988,-86.817013 32.580163,-86.817255 32.580379,-86.817303 32.580431,-86.817342 32.580489,-86.817376 32.580576,-86.817382 32.580763,-86.817376 32.580824,-86.8173 32.581241,-86.817274 32.581465,-86.81724 32.582047,-86.81719 32.583212,-86.817193 32.583367,-86.817242 32.583594,-86.817266 32.583674,-86.817293 32.583729)\r\n1001;1095;odd;Autauga County 5;Autauga;AL;36749;LINESTRING(-86.813486 32.575173,-86.813607 32.575528,-86.813716 32.575797,-86.813847 32.57605,-86.813925 32.576174,-86.814058 32.576353,-86.81442 32.576844,-86.814786 32.577418,-86.815128 32.57792,-86.81522 32.578036,-86.815374 32.578203,-86.815486 32.578305,-86.815607 32.578403,-86.815864 32.578595,-86.816057 32.578745,-86.816176 32.578856,-86.816281 32.578978,-86.816556 32.579346,-86.816841 32.579709,-86.816993 32.579882,-86.817161 32.580049,-86.817411 32.580265,-86.817473 32.580333,-86.817532 32.580411,-86.817598 32.580542,-86.817584 32.580773,-86.817574 32.580846,-86.817498 32.581263,-86.817472 32.581477,-86.817436 32.582055,-86.817386 32.583212,-86.817399 32.583347,-86.81744 32.583558,-86.81746 32.583624,-86.817477 32.583674)\r\n601;699;all;Kerlin St;Autauga;AL;36066;LINESTRING(-86.443787 32.46122,-86.443771 32.460883,-86.443766 32.46067,-86.443757 32.46049)\r\n299;101;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.481057 32.442223,-86.480387 32.441773,-86.479904 32.441466,-86.479419 32.441161,-86.478854 32.440826,-86.478496 32.440617,-86.478134 32.440413,-86.477179 32.439896,-86.476353 32.439489)\r\n298;170;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.480936 32.442352,-86.480267 32.441905,-86.479788 32.441598,-86.479303 32.441297,-86.478742 32.440962,-86.478386 32.440755,-86.478026 32.440553,-86.477075 32.44004,-86.476255 32.439631)\r\n1604;1698;all;Jennifer Cir;Autauga;AL;36022;LINESTRING(-86.421041 32.533583,-86.421055 32.533664,-86.421084 32.533729,-86.421114 32.533835,-86.42109 32.533858,-86.421057 32.533898,-86.421003 32.53394,-86.420869 32.53402,-86.420829 32.534044)\r\n1172;1170;all;Autauga County 6;Autauga;AL;36067;LINESTRING(-86.59552 32.548566,-86.595286 32.548594,-86.59344 32.548963,-86.592607 32.549114,-86.592275 32.549164,-86.592114 32.549178,-86.591957 32.549177,-86.591801 32.549158,-86.59172 32.549144,-86.590391 32.54884,-86.590053 32.548772,-86.589709 32.548721,-86.589366 32.548689,-86.589201 32.548667,-86.589041 32.548636,-86.588885 32.548598,-86.588729 32.548549,-86.588581 32.548492,-86.588435 32.548426,-86.588291 32.548352,-86.588154 32.548274,-86.588021 32.54819,-86.587897 32.548099,-86.587778 32.548001,-86.587547 32.54779,-86.587434 32.547679,-86.587315 32.547567,-86.587126 32.547409,-86.586986 32.547308,-86.586832 32.547224,-86.586667 32.547152,-86.586488 32.547103,-86.586391 32.547087,-86.586314 32.547086)\r\n1198;1174;all;Autauga County 6;Autauga;AL;36067;LINESTRING(-86.59555 32.548729,-86.595324 32.548762,-86.593484 32.549125,-86.592645 32.549278,-86.592305 32.549332,-86.592126 32.54935,-86.591941 32.549353,-86.591761 32.549326,-86.591672 32.549306,-86.590343 32.549002,-86.590013 32.548938,-86.589681 32.548889,-86.58934 32.548855,-86.589165 32.548833,-86.588991 32.548802,-86.588821 32.548758,-86.588653 32.548707,-86.588491 32.548644,-86.588335 32.548572,-86.588185 32.548494,-86.588038 32.548412,-86.587895 32.548322,-86.587761 32.548223,-86.587636 32.548117,-86.587399 32.547902,-86.587286 32.547789,-86.587171 32.547685,-86.58699 32.547535,-86.586864 32.547448,-86.58673 32.547374,-86.586587 32.547314,-86.586436 32.547271,-86.586363 32.547259,-86.586299 32.54725)\r\n38;122;even;Grand Park Dr;Autauga;AL;36022;LINESTRING(-86.412653 32.504702,-86.412645 32.504725,-86.412723 32.504994,-86.41283 32.505069,-86.412939 32.505114,-86.413279 32.505159,-86.413405 32.505177,-86.413778 32.505215)\r\n101;125;odd;Grand Park Dr;Autauga;AL;36022;LINESTRING(-86.412847 32.504694,-86.412857 32.504697,-86.412929 32.504888,-86.412954 32.504915,-86.413009 32.504938,-86.413313 32.504995,-86.413433 32.505011,-86.413802 32.505052)\r\n4099;3977;odd;Mitchell Rd;Autauga;AL;36749;LINESTRING(-86.823799 32.565191,-86.823792 32.565247,-86.823709 32.565716,-86.823689 32.565746,-86.823593 32.565819,-86.823463 32.56589,-86.823166 32.566027,-86.823019 32.566105,-86.822875 32.566196,-86.822808 32.566255,-86.822744 32.566314,-86.822693 32.566384,-86.822649 32.566452,-86.822612 32.566524,-86.822521 32.566732,-86.822453 32.566945,-86.822252 32.567494,-86.822179 32.567708)\r\n4098;3990;even;Mitchell Rd;Autauga;AL;36749;LINESTRING(-86.823994 32.565201,-86.823992 32.565263,-86.823927 32.56578,-86.823857 32.565874,-86.823711 32.565959,-86.823567 32.566038,-86.823268 32.566173,-86.823135 32.566245,-86.823011 32.566328,-86.822956 32.566371,-86.82291 32.56642,-86.822867 32.566472,-86.822831 32.566528,-86.822798 32.566588,-86.822713 32.566784,-86.822643 32.566993,-86.82244 32.567542,-86.822366 32.567753)\r\n166;198;all;Palmer Rd;Autauga;AL;36003;LINESTRING(-86.684155 32.444594,-86.683963 32.445661)\r\n495;489;odd;Greystone Way;Autauga;AL;36066;LINESTRING(-86.424481 32.464421,-86.424378 32.464522,-86.424337 32.46462,-86.424301 32.464748,-86.424291 32.464908,-86.424291 32.464992,-86.424341 32.465218,-86.424414 32.465366,-86.42443 32.465375)\r\n488;486;even;Greystone Way;Autauga;AL;36066;LINESTRING(-86.424637 32.464519,-86.424568 32.464612,-86.424535 32.464672,-86.424507 32.464776,-86.424489 32.46491,-86.424497 32.46497,-86.424545 32.465166,-86.424602 32.465284,-86.424594 32.465286)\r\n1270;1264;all;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.41818 32.509039,-86.418179 32.508705,-86.418172 32.508216)\r\n1676;1698;even;Ole Country Rd;Autauga;AL;36022;LINESTRING(-86.42939 32.547997,-86.429153 32.548476,-86.42908 32.54861,-86.429019 32.548754,-86.428977 32.548902,-86.428944 32.549124,-86.428914 32.549344,-86.428896 32.549704,-86.428884 32.549869)\r\n1673;1699;odd;Ole Country Rd;Autauga;AL;36022;LINESTRING(-86.42957 32.548061,-86.429335 32.548542,-86.429268 32.548674,-86.429215 32.548804,-86.429177 32.548934,-86.42914 32.549144,-86.429114 32.549358,-86.429094 32.549714,-86.429078 32.549881)\r\n859;735;odd;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.806879 32.384666,-86.807063 32.384714,-86.807728 32.384898,-86.811648 32.386028,-86.812955 32.3864,-86.815153 32.38704,-86.815476 32.387146,-86.815786 32.387262,-86.81609 32.38739,-86.81639 32.387531,-86.816682 32.387682,-86.816962 32.387845,-86.817232 32.388017,-86.817492 32.3882,-86.817745 32.388397,-86.817985 32.388598,-86.818215 32.388812,-86.818432 32.389035,-86.818636 32.389264,-86.818829 32.389503,-86.818921 32.389625,-86.819178 32.390002,-86.820546 32.392099,-86.820803 32.392516)\r\n858;734;even;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.806936 32.384509,-86.807121 32.384556,-86.80779 32.38474,-86.81171 32.385872,-86.813017 32.386244,-86.815221 32.386882,-86.815552 32.38699,-86.81587 32.38711,-86.816182 32.387242,-86.81649 32.387387,-86.81679 32.38754,-86.817078 32.387709,-86.817356 32.387885,-86.817624 32.388074,-86.817881 32.388275,-86.818129 32.388482,-86.818365 32.388702,-86.818588 32.388931,-86.818798 32.389166,-86.818993 32.389411,-86.819091 32.389537,-86.819348 32.38992,-86.82072 32.392021,-86.820975 32.392441)\r\n1199;1101;all;Raymond Dr;Autauga;AL;36749;LINESTRING(-86.853167 32.572571,-86.853214 32.572579,-86.853299 32.572553,-86.853383 32.572536)\r\n112;114;even;Old Autaugaville Rd;Autauga;AL;36067;LINESTRING(-86.502524 32.431724,-86.502386 32.431886,-86.502018 32.432295,-86.501859 32.432452)\r\n299;201;odd;Old Autaugaville Rd;Autauga;AL;36067;LINESTRING(-86.502682 32.43182,-86.502544 32.431984,-86.502174 32.432403,-86.502005 32.432561)\r\n1378;1390;even;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.598321 32.585445,-86.598329 32.586316,-86.598357 32.587038,-86.598375 32.587256,-86.598403 32.587476,-86.598438 32.587693,-86.598488 32.587909,-86.598541 32.588124,-86.598602 32.588337,-86.598678 32.588547,-86.598761 32.588752,-86.59927 32.589901,-86.599604 32.590644,-86.599665 32.590773)\r\n1375;1399;odd;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.598516 32.585444,-86.598527 32.586312,-86.598555 32.58703,-86.598573 32.587242,-86.598599 32.587456,-86.598634 32.587665,-86.59868 32.587877,-86.598733 32.588086,-86.598794 32.588293,-86.598866 32.588495,-86.598947 32.588696,-86.599452 32.589843,-86.599786 32.590584,-86.599846 32.590712)\r\n4313;4119;odd;Autauga County 22;Autauga;AL;36758;LINESTRING(-86.897928 32.612735,-86.897383 32.612736,-86.897118 32.612746,-86.896941 32.612764,-86.896681 32.612807,-86.896426 32.612861,-86.895669 32.613025,-86.895497 32.613071,-86.895405 32.613102,-86.89532 32.613144,-86.895239 32.61319,-86.895166 32.613244,-86.895101 32.613296,-86.895035 32.613352,-86.894932 32.613475,-86.894556 32.613953,-86.893843 32.614863,-86.893745 32.614976,-86.893583 32.615134,-86.893531 32.615176,-86.893472 32.615214,-86.893267 32.615319,-86.892967 32.615448,-86.892652 32.615567,-86.8925 32.615616,-86.892427 32.615635,-86.892269 32.615665,-86.892112 32.615683,-86.891767 32.615696,-86.891504 32.615738,-86.891329 32.615779,-86.89124 32.615809,-86.891154 32.615841,-86.890993 32.615912,-86.890841 32.616006,-86.890707 32.616111,-86.890579 32.616224,-86.890355 32.616452,-86.8902 32.616641,-86.890068 32.616838,-86.889951 32.617037,-86.88988 32.617178,-86.889819 32.617322,-86.889717 32.61761,-86.889639 32.617906,-86.889599 32.618043,-86.889572 32.618185,-86.889503 32.618463,-86.889439 32.61867,-86.889362 32.618873,-86.889306 32.619002,-86.889112 32.619391,-86.88897 32.619652,-86.888526 32.620436,-86.888183 32.621028,-86.888112 32.621162,-86.888037 32.621286,-86.887953 32.621402,-86.88781 32.62157,-86.88743 32.621945,-86.886806 32.622532,-86.885988 32.623275,-86.885538 32.623715,-86.885209 32.624053,-86.884996 32.624286,-86.884788 32.62452,-86.882579 32.627131,-86.88252 32.627199,-86.882264 32.627475,-86.881938 32.627813,-86.881642 32.628089,-86.881585 32.628132,-86.881458 32.628206,-86.881393 32.628235,-86.881322 32.628257,-86.881183 32.628286,-86.881038 32.628301,-86.880797 32.628308,-86.879751 32.628302)\r\n4294;4138;even;Autauga County 22;Autauga;AL;36758;LINESTRING(-86.89793 32.612899,-86.897389 32.612904,-86.897134 32.612916,-86.896971 32.612932,-86.896723 32.612971,-86.896474 32.613021,-86.895725 32.613187,-86.895567 32.613231,-86.895497 32.613258,-86.895428 32.61329,-86.895363 32.613328,-86.8953 32.61337,-86.895243 32.613416,-86.895193 32.613464,-86.895096 32.613571,-86.894718 32.614045,-86.894007 32.614957,-86.893907 32.615082,-86.893731 32.615254,-86.893663 32.615308,-86.893586 32.615356,-86.893365 32.615469,-86.893053 32.6156,-86.892728 32.615721,-86.892568 32.615776,-86.892481 32.615801,-86.892305 32.615833,-86.89213 32.615853,-86.891791 32.61587,-86.89155 32.615906,-86.891391 32.615943,-86.891316 32.615965,-86.891244 32.615993,-86.891103 32.61606,-86.890971 32.61614,-86.890847 32.616233,-86.890729 32.616338,-86.890517 32.616556,-86.890372 32.616733,-86.890244 32.616918,-86.890133 32.617107,-86.890066 32.61724,-86.890009 32.617374,-86.889911 32.617654,-86.889829 32.617944,-86.889795 32.618077,-86.889766 32.618215,-86.889697 32.618501,-86.889631 32.618716,-86.889552 32.618929,-86.88949 32.619064,-86.889294 32.619459,-86.889148 32.619722,-86.888702 32.620508,-86.888363 32.621098,-86.888292 32.621234,-86.888213 32.621368,-86.888123 32.621496,-86.88797 32.621676,-86.887578 32.622055,-86.886952 32.622644,-86.886136 32.623387,-86.885688 32.623823,-86.885363 32.624157,-86.885152 32.624386,-86.884948 32.624618,-86.882739 32.627231,-86.882674 32.627299,-86.882418 32.627579,-86.88209 32.627923,-86.881788 32.628209,-86.881715 32.628268,-86.881564 32.628358,-86.881473 32.628393,-86.881384 32.628423,-86.881219 32.628458,-86.881052 32.628471,-86.880799 32.628474,-86.879749 32.628466)\r\n798;700;even;Powell Rd;Autauga;AL;36067;LINESTRING(-86.46662 32.491109,-86.466351 32.491105,-86.4654 32.491132,-86.465318 32.491138,-86.465147 32.491142,-86.461056 32.491256,-86.460541 32.49128,-86.460367 32.491293,-86.460113 32.491321,-86.459857 32.49136,-86.458523 32.491603,-86.458274 32.491637,-86.458109 32.491653,-86.457945 32.491661,-86.457692 32.491661,-86.457359 32.491643,-86.456849 32.491597,-86.456167 32.491548,-86.455819 32.49155,-86.455476 32.491574,-86.455083 32.491624)\r\n601;899;odd;Powell Rd;Autauga;AL;36067;LINESTRING(-86.466618 32.491274,-86.466353 32.491271,-86.465414 32.491302,-86.465328 32.49131,-86.465151 32.491308,-86.461064 32.491422,-86.460555 32.491446,-86.460389 32.491459,-86.460143 32.491487,-86.459895 32.491524,-86.458561 32.491769,-86.458302 32.491805,-86.458127 32.491821,-86.457951 32.491831,-86.457684 32.491831,-86.457341 32.491809,-86.456831 32.491763,-86.456159 32.491718,-86.455827 32.49172,-86.455498 32.491742,-86.45511 32.491787)\r\n213;299;all;Winchester Way;Autauga;AL;36067;LINESTRING(-86.47632 32.449574,-86.47646 32.449595,-86.476706 32.44973,-86.476974 32.449933,-86.477147 32.450156)\r\n2251;2299;all;State Rte 14;Autauga;AL;36003;LINESTRING(-86.64117 32.436915,-86.64126 32.436915)\r\n1373;1301;odd;Reds Ct;Autauga;AL;36067;LINESTRING(-86.418445 32.430076,-86.418458 32.429914)\r\n1364;1300;even;Reds Ct;Autauga;AL;36067;LINESTRING(-86.418251 32.430066,-86.418264 32.429904)\r\n100;198;even;Odell St;Autauga;AL;36066;LINESTRING(-86.44546 32.466192,-86.445276 32.46563,-86.444814 32.46422)\r\n101;199;odd;Odell St;Autauga;AL;36066;LINESTRING(-86.445272 32.466236,-86.445088 32.465674,-86.444626 32.464264)\r\n100;198;even;McKensey Ct;Autauga;AL;36051;LINESTRING(-86.559149 32.695884,-86.559199 32.695859,-86.559585 32.695457,-86.560013 32.694951,-86.560234 32.69459,-86.560305 32.694423,-86.560212 32.694286,-86.560123 32.694169,-86.560025 32.694022)\r\n101;199;odd;McKensey Ct;Autauga;AL;36051;LINESTRING(-86.559025 32.695757,-86.559049 32.695731,-86.559425 32.695353,-86.559837 32.694859,-86.560056 32.694516,-86.560121 32.694437,-86.560052 32.69438,-86.559947 32.694259,-86.559853 32.694099)\r\n501;599;all;Washington Ferry Rd;Autauga;AL;36067;LINESTRING(-86.466704 32.447329,-86.466427 32.44693,-86.466281 32.44666,-86.466195 32.446512)\r\n501;599;odd;Chambliss St;Autauga;AL;36066;LINESTRING(-86.448859 32.462166,-86.448905 32.462155,-86.449048 32.461999,-86.449039 32.461743,-86.449022 32.461522,-86.449018 32.461442)\r\n500;598;even;Chambliss St;Autauga;AL;36066;LINESTRING(-86.448755 32.462027,-86.448751 32.462015,-86.448818 32.461931,-86.448841 32.461745,-86.448826 32.46153,-86.448823 32.461448)\r\n1400;1498;even;E Main St;Autauga;AL;36066;LINESTRING(-86.435223 32.460375,-86.434692 32.460373,-86.43426 32.460377)\r\n1315;1499;odd;E Main St;Autauga;AL;36066;LINESTRING(-86.435223 32.46054,-86.434692 32.460539,-86.434262 32.460542)\r\n836;822;even;Simuel Ln;Autauga;AL;36067;LINESTRING(-86.57924 32.563245,-86.579187 32.563666,-86.579174 32.563814,-86.579125 32.564616,-86.579106 32.564754,-86.579074 32.564886,-86.579024 32.565016,-86.578957 32.565141,-86.57892 32.565197,-86.578678 32.565493,-86.578573 32.565609,-86.578372 32.565853,-86.578282 32.565987,-86.578206 32.566127,-86.578146 32.56627,-86.578097 32.566416,-86.578057 32.566562,-86.578009 32.566837)\r\n831;801;odd;Simuel Ln;Autauga;AL;36067;LINESTRING(-86.579434 32.563262,-86.579383 32.56368,-86.57937 32.563824,-86.579323 32.564628,-86.57931 32.56478,-86.579272 32.564932,-86.579214 32.565078,-86.579139 32.565221,-86.579088 32.565289,-86.578838 32.565591,-86.578735 32.565707,-86.578544 32.565945,-86.578462 32.566065,-86.578394 32.566191,-86.578338 32.566322,-86.578291 32.566458,-86.578255 32.566594,-86.578202 32.566863)\r\n499;401;odd;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.610769 32.402807,-86.610788 32.402931,-86.610819 32.403199)\r\n398;392;even;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.610961 32.402783,-86.610986 32.402911,-86.611013 32.403185)\r\n400;414;even;Runway Dr;Autauga;AL;36022;LINESTRING(-86.439968 32.59916,-86.439911 32.599152,-86.439752 32.599126,-86.439672 32.599107,-86.439496 32.599068,-86.439229 32.599056,-86.43786 32.599071,-86.437796 32.599073)\r\n401;411;odd;Runway Dr;Autauga;AL;36022;LINESTRING(-86.439954 32.599324,-86.439883 32.599324,-86.439702 32.599294,-86.43962 32.599271,-86.439464 32.599244,-86.439223 32.599226,-86.437864 32.599237,-86.437802 32.599238)\r\n200;298;even;Cynthia St;Autauga;AL;36066;LINESTRING(-86.430718 32.445369,-86.430554 32.445375,-86.427657 32.445406,-86.427379 32.445431,-86.427284 32.445476,-86.427202 32.445516,-86.427177 32.445535)\r\n201;299;odd;Cynthia St;Autauga;AL;36066;LINESTRING(-86.430728 32.445534,-86.43056 32.445543,-86.427671 32.44558,-86.427441 32.445611,-86.427378 32.445628,-86.427312 32.44566,-86.427289 32.445669)\r\n230;232;all;Golson Rd;Autauga;AL;36067;LINESTRING(-86.55138 32.445,-86.551415 32.445074)\r\n1100;1298;even;Autauga County 5;Autauga;AL;36749;LINESTRING(-86.82164 32.591777,-86.821638 32.591778,-86.821715 32.592502,-86.821752 32.592724,-86.821807 32.592942,-86.82189 32.593227,-86.821933 32.593436,-86.82196 32.593646,-86.821973 32.593861,-86.821978 32.594437,-86.821969 32.594942,-86.821952 32.595151,-86.82194 32.595217,-86.821923 32.595281,-86.8219 32.595345,-86.821871 32.595405,-86.821797 32.595527,-86.821663 32.595708,-86.821128 32.596363,-86.820988 32.596551,-86.820905 32.596685,-86.820837 32.596825,-86.820785 32.596973,-86.820384 32.598534,-86.820243 32.599011,-86.820189 32.599157)\r\n1201;1299;odd;Autauga County 5;Autauga;AL;36749;LINESTRING(-86.821833 32.591756,-86.821836 32.59176,-86.821913 32.592482,-86.82195 32.592694,-86.822001 32.592904,-86.822086 32.593191,-86.822133 32.593412,-86.82216 32.593634,-86.822171 32.593857,-86.822174 32.594437,-86.822169 32.594948,-86.822152 32.595169,-86.82214 32.595249,-86.822119 32.595325,-86.82209 32.595401,-86.822057 32.595475,-86.821973 32.595613,-86.821829 32.5958,-86.821294 32.596455,-86.821164 32.596635,-86.821089 32.596757,-86.821029 32.596883,-86.820981 32.597015,-86.820576 32.598572,-86.820437 32.599059,-86.820374 32.599209)\r\n899;763;all;Inzer Ln;Autauga;AL;36067;LINESTRING(-86.452203 32.438728,-86.452211 32.438826,-86.452201 32.439111,-86.452191 32.439177,-86.45216 32.439318,-86.452075 32.439828,-86.452065 32.439904,-86.452061 32.440274,-86.452045 32.44049,-86.452034 32.440558,-86.452016 32.440632,-86.452015 32.440715,-86.452029 32.441012,-86.452046 32.441865,-86.452045 32.441986)\r\n1037;1001;all;2nd St;Autauga;AL;36703;LINESTRING(-86.796251 32.348373,-86.796254 32.348402)\r\n1700;1798;even;Maul Dr;Autauga;AL;36006;LINESTRING(-86.734655 32.633935,-86.734515 32.634145,-86.734351 32.6344,-86.734271 32.63453,-86.734129 32.634798,-86.733987 32.635144,-86.733791 32.6357,-86.733696 32.635979,-86.733591 32.636252,-86.73347 32.636521,-86.733336 32.636786,-86.733158 32.637117,-86.732956 32.63747)\r\n1749;1799;odd;Maul Dr;Autauga;AL;36006;LINESTRING(-86.734825 32.634016,-86.734687 32.634225,-86.734525 32.634478,-86.734451 32.634602,-86.734317 32.63486,-86.734177 32.635196,-86.733979 32.635746,-86.733886 32.636027,-86.733779 32.636308,-86.733654 32.636585,-86.733516 32.636854,-86.733336 32.637187,-86.733131 32.637542)\r\n900;998;even;Silver Creek Ct;Autauga;AL;36066;LINESTRING(-86.434272 32.451125,-86.434286 32.451319,-86.434314 32.451481,-86.434367 32.451535)\r\n901;999;odd;Silver Creek Ct;Autauga;AL;36066;LINESTRING(-86.434466 32.451111,-86.434488 32.451295,-86.434524 32.451413,-86.434535 32.451452)\r\n2408;2498;even;Pete's Ln;Autauga;AL;36067;LINESTRING(-86.647362 32.528985,-86.647462 32.529046,-86.64752 32.52913,-86.64756 32.529327,-86.647572 32.529468,-86.647636 32.530194,-86.647665 32.530415,-86.647719 32.530666)\r\n2407;2499;odd;Pete's Ln;Autauga;AL;36067;LINESTRING(-86.647451 32.528838,-86.647636 32.5289,-86.647734 32.529074,-86.647762 32.529311,-86.647768 32.529458,-86.647834 32.530178,-86.647863 32.530391,-86.647911 32.530638)\r\n1099;1001;all;Windrush Ln;Autauga;AL;36067;LINESTRING(-86.52712 32.454075,-86.527281 32.454082,-86.527447 32.454084,-86.527617 32.454072,-86.528231 32.454081,-86.528328 32.454094,-86.528424 32.454113,-86.528514 32.45415,-86.528599 32.454188,-86.528678 32.454236,-86.528749 32.45429,-86.528813 32.45435,-86.528871 32.454411,-86.528929 32.454476,-86.528972 32.454551,-86.529005 32.454625,-86.529032 32.454699,-86.529108 32.454985,-86.529197 32.455263,-86.529323 32.455607,-86.529435 32.455957,-86.529487 32.456091,-86.52955 32.456221,-86.529664 32.456413,-86.529803 32.456596,-86.529908 32.456713,-86.529915 32.456724)\r\n2501;2599;all;Mountain Creek Dr;Autauga;AL;36022;LINESTRING(-86.487547 32.629232,-86.487447 32.6293,-86.487236 32.629465,-86.487078 32.629641,-86.486988 32.629802,-86.486945 32.63001,-86.486861 32.630188,-86.486842 32.630279,-86.486855 32.630908,-86.486806 32.631128,-86.486733 32.63124,-86.486641 32.631369,-86.486545 32.631481)\r\n300;398;even;Azalea Dr;Autauga;AL;36067;LINESTRING(-86.45671 32.476543,-86.457478 32.476543)\r\n303;399;odd;Azalea Dr;Autauga;AL;36067;LINESTRING(-86.45671 32.476379,-86.457478 32.476379)\r\n1393;1499;all;Autauga County 103;Autauga;AL;36758;LINESTRING(-86.902024 32.617614,-86.902057 32.617722,-86.902237 32.618414,-86.902819 32.620534,-86.903005 32.621202,-86.903229 32.622005)\r\n160;198;even;Simmons Rd;Autauga;AL;36067;LINESTRING(-86.525513 32.438524,-86.525502 32.439199,-86.525499 32.43939,-86.525475 32.440311)\r\n155;199;odd;Simmons Rd;Autauga;AL;36067;LINESTRING(-86.525707 32.438527,-86.525696 32.439201,-86.525695 32.439392,-86.52567 32.440314)\r\n3975;3973;odd;Mitchell Rd;Autauga;AL;36749;LINESTRING(-86.822097 32.567944,-86.821722 32.569023,-86.821605 32.569378,-86.821577 32.569436,-86.821542 32.569487,-86.821501 32.569531,-86.821245 32.569729,-86.821181 32.569798,-86.821129 32.56987,-86.820986 32.57012,-86.820867 32.570298,-86.820595 32.570659,-86.820498 32.570772,-86.820392 32.570881,-86.820094 32.571153,-86.819983 32.571276,-86.819929 32.571346,-86.819931 32.571353)\r\n3988;3940;even;Mitchell Rd;Autauga;AL;36749;LINESTRING(-86.822284 32.567991,-86.821912 32.569069,-86.821799 32.56943,-86.821767 32.56951,-86.821716 32.569589,-86.821651 32.569653,-86.821397 32.569849,-86.821349 32.569898,-86.821307 32.569954,-86.821164 32.5702,-86.821037 32.570384,-86.820761 32.570755,-86.820656 32.570876,-86.820542 32.570991,-86.82025 32.571263,-86.820149 32.571374,-86.820107 32.571432,-86.820105 32.571427)\r\n599;501;odd;Autauga County 165;Autauga;AL;36067;LINESTRING(-86.615161 32.465436,-86.615464 32.465373,-86.615627 32.465346,-86.615962 32.465303,-86.616301 32.465274,-86.616641 32.465256,-86.616982 32.465251,-86.617149 32.465256,-86.617489 32.465276,-86.617829 32.46531,-86.618164 32.465358,-86.618495 32.46542,-86.618825 32.465496,-86.619312 32.465632,-86.620938 32.466118,-86.621268 32.46621,-86.621435 32.466252,-86.621603 32.466288,-86.621942 32.46635,-86.622117 32.466375,-86.622461 32.466408,-86.622809 32.466429,-86.623329 32.466428,-86.624702 32.466388,-86.624959 32.466381,-86.627107 32.466314,-86.627708 32.46629,-86.628568 32.466224,-86.629254 32.466156,-86.629769 32.466094,-86.630615 32.465967,-86.631125 32.465883,-86.631796 32.465752,-86.632298 32.465647,-86.633127 32.465449,-86.636241 32.464697)\r\n598;500;even;Autauga County 165;Autauga;AL;36067;LINESTRING(-86.615113 32.465277,-86.61542 32.465209,-86.615593 32.46518,-86.615938 32.465137,-86.616285 32.465106,-86.616633 32.465088,-86.616984 32.465085,-86.617159 32.465088,-86.617507 32.465108,-86.617857 32.465144,-86.618202 32.465192,-86.618543 32.465256,-86.618883 32.465334,-86.619376 32.465474,-86.621002 32.46596,-86.621326 32.46605,-86.621487 32.46609,-86.621647 32.466124,-86.62198 32.466184,-86.622145 32.466207,-86.622479 32.46624,-86.622815 32.466259,-86.623325 32.46626,-86.624696 32.466224,-86.624953 32.466217,-86.627099 32.466148,-86.627694 32.466122,-86.628548 32.466058,-86.629228 32.46599,-86.629737 32.465928,-86.630579 32.465803,-86.631083 32.465719,-86.63175 32.46559,-86.632248 32.465485,-86.633073 32.465291,-86.636188 32.464539)\r\n200;298;all;Mountain Vw;Autauga;AL;36067;LINESTRING(-86.511351 32.468515,-86.511336 32.468422,-86.511296 32.468212,-86.511288 32.468147,-86.511279 32.468009,-86.511313 32.467077,-86.511351 32.466574,-86.51136 32.466002,-86.511376 32.465864,-86.51139 32.465798,-86.511409 32.465732,-86.511434 32.465668,-86.511465 32.465605,-86.511502 32.465563,-86.511518 32.465552,-86.511497 32.465538)\r\n701;799;odd;Elizabeth St;Autauga;AL;36067;LINESTRING(-86.487787 32.488664,-86.487542 32.488667,-86.487037 32.488664)\r\n724;700;even;Elizabeth St;Autauga;AL;36067;LINESTRING(-86.487789 32.488829,-86.487542 32.488831,-86.487035 32.488828)\r\n807;701;odd;Autauga County 42;Autauga;AL;36051;LINESTRING(-86.561956 32.605709,-86.56077 32.60659,-86.559733 32.607339,-86.559105 32.607823,-86.558556 32.608267,-86.558177 32.608557,-86.557807 32.608853,-86.557491 32.609093,-86.557363 32.609178,-86.557227 32.609254,-86.556933 32.609394,-86.556705 32.60949,-86.556397 32.609605,-86.555923 32.609762,-86.555688 32.609825,-86.554951 32.609983,-86.554455 32.610067,-86.554042 32.610129,-86.553553 32.610193,-86.5533 32.610221,-86.553126 32.610246,-86.552784 32.610316,-86.552612 32.610365,-86.552526 32.610396,-86.552366 32.610466,-86.551779 32.610777,-86.550472 32.61145,-86.550328 32.611512,-86.550178 32.611565,-86.550023 32.611607,-86.549694 32.611674,-86.549362 32.611727,-86.548521 32.611839,-86.548126 32.611882,-86.547898 32.611897)\r\n812;700;even;Autauga County 42;Autauga;AL;36051;LINESTRING(-86.562085 32.605832,-86.560898 32.606716,-86.559863 32.607465,-86.559239 32.607945,-86.55869 32.608389,-86.558311 32.608679,-86.557941 32.608975,-86.557621 32.609221,-86.557483 32.609316,-86.557333 32.6094,-86.557027 32.609542,-86.556791 32.609644,-86.556473 32.609759,-86.555991 32.609922,-86.555742 32.609989,-86.554995 32.610147,-86.554491 32.610231,-86.554074 32.610293,-86.553581 32.610357,-86.55333 32.610387,-86.553168 32.610412,-86.55284 32.61048,-86.552684 32.610525,-86.552612 32.61055,-86.552466 32.610614,-86.551881 32.610917,-86.55057 32.6116,-86.550412 32.611668,-86.550248 32.611725,-86.550077 32.611771,-86.549736 32.611838,-86.549396 32.611891,-86.548549 32.612005,-86.548146 32.61205,-86.547911 32.612061)\r\n1836;1860;even;Autauga County 7;Autauga;AL;36758;LINESTRING(-86.871458 32.646411,-86.871474 32.646486,-86.871527 32.646639,-86.871656 32.646919,-86.871818 32.647185,-86.872106 32.647632,-86.872217 32.647822,-86.87231 32.648016,-86.872336 32.648082,-86.872354 32.648146,-86.872367 32.648212,-86.872382 32.648348,-86.872373 32.648487,-86.872352 32.648626,-86.8723 32.648836,-86.872233 32.64904,-86.872154 32.649245,-86.872065 32.64945,-86.871951 32.6498,-86.871868 32.650066,-86.871865 32.6501)\r\n1837;1899;odd;Autauga County 7;Autauga;AL;36758;LINESTRING(-86.871649 32.646376,-86.87167 32.646444,-86.871719 32.646583,-86.871842 32.646849,-86.871994 32.647107,-86.872282 32.647554,-86.872401 32.647752,-86.8725 32.647958,-86.872528 32.648036,-86.872552 32.64811,-86.872569 32.64819,-86.87258 32.648346,-86.872573 32.648501,-86.872554 32.648654,-86.872496 32.648876,-86.872423 32.64909,-86.87234 32.649299,-86.872257 32.649502,-86.872141 32.649844,-86.872066 32.650102,-86.872057 32.650127)\r\n1098;1000;all;Old Fairview Ave;Autauga;AL;36066;LINESTRING(-86.438256 32.477608,-86.43826 32.477603,-86.438339 32.477561,-86.438501 32.477498,-86.438819 32.477394,-86.43928 32.477215,-86.43955 32.477131,-86.439641 32.477171)\r\n1900;1960;even;Big Spring;Autauga;AL;36006;LINESTRING(-86.719695 32.62125,-86.719674 32.621293,-86.719607 32.621502,-86.719557 32.621634,-86.719496 32.62176,-86.719422 32.621876,-86.719332 32.621981,-86.719221 32.622084,-86.719107 32.622196,-86.719007 32.622319,-86.718911 32.622444,-86.718827 32.622577,-86.718756 32.622716,-86.718693 32.622854,-86.718581 32.623127,-86.718531 32.623263,-86.718477 32.623395,-86.718415 32.623525,-86.718197 32.623912,-86.718114 32.624024,-86.717958 32.624175,-86.71784 32.624259,-86.717492 32.624462,-86.717218 32.624638,-86.716822 32.624905,-86.716693 32.624973,-86.716556 32.625022,-86.716315 32.625075,-86.716064 32.625109,-86.715814 32.625129,-86.715302 32.625148,-86.714453 32.625197,-86.713944 32.625213,-86.713275 32.625216,-86.713114 32.625217,-86.713005 32.625238,-86.712887 32.625326,-86.712876 32.625528,-86.712886 32.625688,-86.712888 32.626207,-86.712884 32.626572,-86.712889 32.626938,-86.712887 32.627665,-86.712888 32.62804)\r\n1901;1969;odd;Big Spring;Autauga;AL;36006;LINESTRING(-86.719879 32.621303,-86.719866 32.621343,-86.719797 32.621548,-86.719747 32.62169,-86.719684 32.621832,-86.719598 32.62197,-86.71949 32.622093,-86.719371 32.622196,-86.719269 32.6223,-86.719173 32.622413,-86.719085 32.62253,-86.719009 32.622651,-86.71894 32.62278,-86.718879 32.622912,-86.718769 32.623179,-86.718721 32.623315,-86.718663 32.623453,-86.718599 32.623593,-86.718377 32.623994,-86.718284 32.624128,-86.718106 32.624305,-86.71796 32.624397,-86.717608 32.624598,-86.71734 32.62477,-86.716942 32.625045,-86.716793 32.625129,-86.716622 32.625192,-86.716355 32.625241,-86.71609 32.625279,-86.715826 32.625297,-86.715312 32.625314,-86.714463 32.625365,-86.713948 32.625379,-86.713281 32.625384,-86.71315 32.625397,-86.713121 32.62541,-86.713111 32.625422,-86.713078 32.625534,-86.713084 32.625684,-86.713084 32.626207,-86.71308 32.626572,-86.713085 32.626938,-86.713081 32.627665,-86.713083 32.628039)\r\n1000;1064;even;Hill St;Autauga;AL;36067;LINESTRING(-86.468809 32.43091,-86.468814 32.430843,-86.468814 32.43062,-86.468821 32.430401,-86.468815 32.42996)\r\n1001;1041;odd;Hill St;Autauga;AL;36067;LINESTRING(-86.468615 32.430903,-86.468616 32.430839,-86.468616 32.430618,-86.468625 32.430399,-86.46862 32.429961)\r\n2954;2998;all;State Rte 143;Autauga;AL;36051;LINESTRING(-86.462533 32.698412,-86.462654 32.698602,-86.462993 32.699067)\r\n305;303;all;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.512217 32.406886,-86.512177 32.406982,-86.512119 32.407204,-86.512077 32.407424,-86.512051 32.407647,-86.512043 32.40787,-86.512045 32.408001)\r\n1060;1008;all;Old Ridge Rd;Autauga;AL;36066;LINESTRING(-86.443987 32.494684,-86.444297 32.494668,-86.444458 32.494651,-86.444614 32.494623,-86.444685 32.494603,-86.44483 32.494551,-86.444972 32.494486,-86.445176 32.494373,-86.445438 32.494201,-86.445718 32.494019,-86.445863 32.493932,-86.445942 32.49389,-86.446105 32.493822,-86.446274 32.493767,-86.446451 32.493731,-86.446791 32.493682,-86.447018 32.493655)\r\n101;199;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.45061 32.46456,-86.450609 32.464554,-86.450603 32.464333)\r\n659;501;odd;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.479692 32.473814,-86.479537 32.473585,-86.479334 32.47326,-86.478125 32.471079,-86.477635 32.470208)\r\n642;500;even;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.479524 32.473897,-86.479363 32.473667,-86.479156 32.473336,-86.477949 32.471149,-86.477459 32.470279)\r\n500;598;even;Doster Rd;Autauga;AL;36067;LINESTRING(-86.464475 32.45159,-86.464334 32.451294,-86.464277 32.451161,-86.464182 32.450881,-86.464128 32.450674,-86.464072 32.45039,-86.464018 32.449886,-86.46399 32.44967,-86.463961 32.449302,-86.463948 32.449198)\r\n601;673;odd;Doster Rd;Autauga;AL;36067;LINESTRING(-86.464295 32.451652,-86.46415 32.451354,-86.464085 32.451215,-86.463986 32.450923,-86.463934 32.450706,-86.46387 32.450412,-86.463822 32.449902,-86.463792 32.449684,-86.463765 32.449316,-86.463755 32.449214)\r\n398;352;even;Kindling Ridge Rd;Autauga;AL;36022;LINESTRING(-86.42785 32.609193,-86.427965 32.609263,-86.428119 32.60937,-86.428283 32.609507,-86.428324 32.60955,-86.428352 32.609609,-86.428486 32.610077)\r\n399;353;odd;Kindling Ridge Rd;Autauga;AL;36022;LINESTRING(-86.427959 32.609056,-86.428089 32.609125,-86.428249 32.609244,-86.428453 32.609387,-86.4285 32.609466,-86.428558 32.609547,-86.428676 32.610042)\r\n240;298;all;Pine Level Ridge;Autauga;AL;36022;LINESTRING(-86.469569 32.586964,-86.470419 32.586958)\r\n701;717;all;Autauga County 68;Autauga;AL;36051;LINESTRING(-86.434045 32.677436,-86.433968 32.677462)\r\n100;198;even;Woodley Ave;Autauga;AL;36066;LINESTRING(-86.448177 32.473563,-86.448241 32.47358,-86.448573 32.473678,-86.448845 32.47371,-86.449025 32.473702,-86.449366 32.473687,-86.449792 32.473685,-86.450303 32.473665,-86.450334 32.473662)\r\n101;199;odd;Woodley Ave;Autauga;AL;36066;LINESTRING(-86.44823 32.473405,-86.448299 32.47342,-86.448621 32.473504,-86.448857 32.473536,-86.449017 32.473536,-86.44936 32.473517,-86.449788 32.473517,-86.450291 32.473499,-86.450319 32.473498)\r\n399;301;odd;Kingston Ridge Rd;Autauga;AL;36067;LINESTRING(-86.476308 32.490963,-86.475131 32.490992,-86.474785 32.490996,-86.474658 32.491)\r\n398;300;even;Kingston Ridge Rd;Autauga;AL;36067;LINESTRING(-86.476314 32.491128,-86.475135 32.491158,-86.474789 32.491162,-86.474665 32.491165)\r\n1000;1052;even;Alabama St;Autauga;AL;36067;LINESTRING(-86.482398 32.43668,-86.482487 32.436649,-86.482655 32.436589,-86.482742 32.436531)\r\n1001;1053;odd;Alabama St;Autauga;AL;36067;LINESTRING(-86.482323 32.436528,-86.482407 32.436497,-86.482551 32.436435,-86.482632 32.436395)\r\n1400;1598;even;Autauga County 81;Autauga;AL;36067;LINESTRING(-86.573273 32.503275,-86.57327 32.503686,-86.57322 32.505145,-86.573168 32.5077,-86.57317 32.507993,-86.573209 32.509234,-86.573227 32.509599,-86.573275 32.510984,-86.573297 32.511928,-86.573313 32.513531,-86.573289 32.515141,-86.573302 32.516882,-86.573296 32.517023,-86.573282 32.51716,-86.573257 32.517297,-86.57322 32.517432,-86.573172 32.517563,-86.57311 32.517688,-86.573035 32.517808,-86.572947 32.517924,-86.572848 32.518033,-86.572738 32.518139,-86.572621 32.518242,-86.571623 32.519038,-86.570872 32.519647,-86.570751 32.519757,-86.570633 32.519869,-86.570523 32.519986,-86.570419 32.520109,-86.570231 32.52036,-86.570145 32.520493,-86.570067 32.520627,-86.569925 32.520897,-86.569765 32.521238)\r\n1401;1599;odd;Autauga County 81;Autauga;AL;36067;LINESTRING(-86.573468 32.503276,-86.573468 32.503688,-86.573416 32.505149,-86.573364 32.5077,-86.573366 32.507991,-86.573405 32.509228,-86.573423 32.509593,-86.573471 32.51098,-86.573493 32.511926,-86.573509 32.513531,-86.573485 32.515141,-86.573498 32.516884,-86.573494 32.517031,-86.573482 32.51718,-86.573455 32.517329,-86.573416 32.517476,-86.573362 32.517621,-86.573294 32.517762,-86.573209 32.517894,-86.573113 32.518024,-86.573002 32.518141,-86.572884 32.518253,-86.572763 32.518362,-86.571757 32.519158,-86.571014 32.519765,-86.570897 32.519869,-86.570787 32.519977,-86.570683 32.520088,-86.570585 32.520203,-86.570403 32.520446,-86.570321 32.520571,-86.570247 32.520699,-86.570107 32.520963,-86.569946 32.521299)\r\n157;135;odd;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.832234 32.462485,-86.832324 32.463498,-86.832351 32.463934,-86.832352 32.464076,-86.832337 32.464365,-86.832305 32.464651,-86.832253 32.464936,-86.832221 32.465075,-86.832142 32.465354,-86.832047 32.465628,-86.832011 32.465718)\r\n132;100;even;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.832428 32.462473,-86.83252 32.463488,-86.832551 32.46393,-86.83255 32.46408,-86.832535 32.464377,-86.832503 32.464671,-86.832449 32.464966,-86.832413 32.465111,-86.832336 32.465398,-86.832237 32.465682,-86.832193 32.465775)\r\n100;198;even;Cypress Bend Rd;Autauga;AL;36703;LINESTRING(-86.82984 32.469742,-86.829848 32.469774,-86.829882 32.469912,-86.829895 32.469978,-86.829884 32.470037,-86.829815 32.470323,-86.829773 32.470467,-86.829716 32.470689,-86.82967 32.470913,-86.829657 32.471066,-86.829658 32.471361,-86.829664 32.471713,-86.829661 32.4719,-86.829791 32.472089,-86.829894 32.472299,-86.829964 32.47244,-86.830048 32.472576,-86.830149 32.47271,-86.830269 32.472828,-86.830627 32.473144,-86.830729 32.47325,-86.830812 32.473362,-86.830877 32.473483,-86.830901 32.473545,-86.830915 32.473607,-86.830934 32.473733,-86.830917 32.473784,-86.830868 32.473902,-86.83069 32.474149,-86.830613 32.474291,-86.830584 32.474371,-86.830575 32.474461,-86.830577 32.474553,-86.830613 32.474637,-86.83066 32.474718,-86.830782 32.474841,-86.831015 32.475048,-86.831099 32.475158,-86.831162 32.475281,-86.831207 32.475414,-86.831224 32.475482,-86.83126 32.475697,-86.83129 32.475984,-86.831302 32.47627,-86.831295 32.476628,-86.831277 32.476764,-86.831243 32.4769,-86.83122 32.476961,-86.831153 32.47708,-86.830862 32.477433,-86.830783 32.477554)\r\n101;149;odd;Cypress Bend Rd;Autauga;AL;36703;LINESTRING(-86.830026 32.469695,-86.830042 32.46973,-86.830088 32.469884,-86.830091 32.469976,-86.83009 32.470063,-86.830007 32.470361,-86.829965 32.470505,-86.829912 32.470721,-86.829872 32.470933,-86.829859 32.471072,-86.829854 32.471361,-86.829862 32.471707,-86.829885 32.471848,-86.829977 32.472017,-86.830076 32.472235,-86.830146 32.472366,-86.830224 32.47249,-86.830315 32.472606,-86.830419 32.472714,-86.830777 32.47303,-86.830893 32.473148,-86.830998 32.473278,-86.831069 32.473423,-86.831095 32.473501,-86.831119 32.473579,-86.83113 32.473735,-86.831129 32.473826,-86.83106 32.473982,-86.830872 32.474231,-86.830807 32.474353,-86.830788 32.474409,-86.830773 32.474465,-86.830787 32.474515,-86.830805 32.474569,-86.830838 32.47462,-86.830934 32.474727,-86.831181 32.474936,-86.831287 32.475074,-86.831358 32.475225,-86.831403 32.475376,-86.83142 32.475454,-86.831458 32.475677,-86.83149 32.475974,-86.831498 32.476268,-86.831501 32.476638,-86.831477 32.476792,-86.831441 32.476944,-86.831412 32.477023,-86.831337 32.47717,-86.831032 32.477527,-86.830951 32.477637)\r\n1376;1398;all;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.690036 32.550993,-86.690027 32.551011,-86.68999 32.551091,-86.689881 32.551278,-86.689752 32.55146,-86.689659 32.551576,-86.689558 32.551685,-86.689448 32.551787,-86.689264 32.551929,-86.689135 32.552015,-86.688927 32.552137,-86.688495 32.552364,-86.687834 32.552697,-86.687397 32.552926,-86.687181 32.553048,-86.686975 32.553181,-86.686771 32.553318,-86.68668 32.553395)\r\n2000;2010;all;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.464148 32.582273,-86.464193 32.583426,-86.464192 32.583815)\r\n132;134;all;Patrick St;Autauga;AL;36067;LINESTRING(-86.455417 32.452592,-86.45554 32.452587)\r\n316;368;even;Fig Tree St;Autauga;AL;36749;LINESTRING(-86.844753 32.503417,-86.844789 32.503363,-86.844826 32.503314,-86.844936 32.503217,-86.844993 32.503179,-86.845137 32.503108,-86.845445 32.502987,-86.845767 32.50288,-86.845934 32.502817,-86.846089 32.502729,-86.846342 32.502523,-86.846473 32.502421,-86.846601 32.502287,-86.84664 32.502114,-86.846645 32.501853,-86.846658 32.50177,-86.846681 32.501715,-86.846715 32.501674,-86.846748 32.501657,-86.846878 32.501629,-86.847037 32.501648,-86.847204 32.501673,-86.847358 32.501704,-86.847418 32.501727,-86.847522 32.501792,-86.847584 32.501886,-86.847614 32.502008,-86.847575 32.502441,-86.847569 32.502592,-86.847571 32.502744,-86.847643 32.50325,-86.84773 32.504255,-86.847742 32.504504)\r\n301;399;odd;Fig Tree St;Autauga;AL;36749;LINESTRING(-86.844573 32.503356,-86.844599 32.503279,-86.84466 32.503202,-86.844798 32.503081,-86.844883 32.503035,-86.845041 32.502954,-86.845367 32.502831,-86.845687 32.502724,-86.845832 32.502663,-86.845959 32.502591,-86.846206 32.502403,-86.846315 32.502305,-86.846391 32.502205,-86.84643 32.50209,-86.846447 32.501843,-86.846452 32.501742,-86.846475 32.501639,-86.846553 32.501538,-86.846664 32.501471,-86.846878 32.501465,-86.847067 32.501482,-86.847242 32.501507,-86.847414 32.501538,-86.847514 32.501561,-86.847698 32.501658,-86.8478 32.50183,-86.847812 32.502004,-86.847773 32.502451,-86.847765 32.502592,-86.847773 32.502732,-86.847841 32.503234,-86.847928 32.504245,-86.847937 32.504498)\r\n1161;1103;odd;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.479371 32.486869,-86.479407 32.486685,-86.479481 32.486309)\r\n1152;1106;even;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.479179 32.486842,-86.479215 32.486657,-86.479289 32.486282)\r\n799;701;odd;Francis Dr;Autauga;AL;36067;LINESTRING(-86.488028 32.48862,-86.488025 32.488503,-86.48802 32.487403,-86.488026 32.486249)\r\n798;700;even;Francis Dr;Autauga;AL;36067;LINESTRING(-86.487833 32.488624,-86.487829 32.488505,-86.487826 32.487403,-86.487831 32.486248)\r\n3359;3399;all;US Hwy 82;Autauga;AL;36006;LINESTRING(-86.739043 32.628394,-86.73911 32.628454)\r\n130;132;all;Beth Manor Dr;Autauga;AL;36066;LINESTRING(-86.431508 32.448082,-86.431428 32.448076,-86.431246 32.44808)\r\n199;101;odd;Kingswood Dr;Autauga;AL;36067;LINESTRING(-86.473911 32.442798,-86.473595 32.442668,-86.472987 32.442398,-86.472679 32.442266,-86.472519 32.442197,-86.472344 32.44215,-86.472076 32.442115,-86.471646 32.442122,-86.471527 32.442129)\r\n120;100;even;Kingswood Dr;Autauga;AL;36067;LINESTRING(-86.473827 32.442946,-86.473507 32.442818,-86.472897 32.442546,-86.472593 32.442416,-86.472443 32.442361,-86.472296 32.442322,-86.47206 32.442291,-86.471652 32.44229,-86.471536 32.442293)\r\n799;727;all;Ruth St;Autauga;AL;36067;LINESTRING(-86.488877 32.486038,-86.48862 32.486041,-86.488101 32.486037,-86.488072 32.486039)\r\n1947;1999;all;Davis Rd;Autauga;AL;36067;LINESTRING(-86.479799 32.565498,-86.479792 32.565737,-86.479757 32.566032,-86.479696 32.566322,-86.479572 32.566747,-86.479399 32.56731,-86.479345 32.567453,-86.479277 32.567591,-86.47914 32.567852,-86.479095 32.567979,-86.479071 32.568109,-86.47906 32.568321,-86.479062 32.568682,-86.479055 32.568961)\r\n299;201;all;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.707061 32.414494,-86.707126 32.414524,-86.707249 32.414584,-86.70737 32.41466,-86.707481 32.414748,-86.707528 32.414793,-86.707617 32.414902,-86.707694 32.41502,-86.707757 32.415145,-86.707805 32.415275,-86.707839 32.41541,-86.707861 32.415549,-86.707898 32.415976,-86.707915 32.416337,-86.707931 32.416486,-86.707944 32.416562,-86.707977 32.416712,-86.708023 32.416857,-86.708075 32.417003,-86.708189 32.417289,-86.708265 32.417429,-86.708352 32.417565,-86.708458 32.417693,-86.708588 32.417806,-86.70873 32.417897,-86.709208 32.418202,-86.709333 32.418295,-86.709386 32.418343,-86.70949 32.418451,-86.709532 32.418506,-86.709606 32.418626,-86.70966 32.418753,-86.709699 32.41889,-86.709709 32.418953,-86.709722 32.419092,-86.709727 32.419231,-86.709725 32.420032,-86.709728 32.420216,-86.709738 32.421487,-86.709742 32.421653,-86.709752 32.422221,-86.709775 32.422957,-86.709784 32.423679,-86.709781 32.424045,-86.709816 32.426959,-86.709824 32.427079)\r\n100;198;even;S Washington St;Autauga;AL;36067;LINESTRING(-86.4697 32.462535,-86.469833 32.461197)\r\n101;199;odd;S Washington St;Autauga;AL;36067;LINESTRING(-86.469506 32.462521,-86.469639 32.461183)\r\n301;399;all;Autauga County 20;Autauga;AL;36051;LINESTRING(-86.455411 32.704277,-86.455337 32.704284,-86.454998 32.704321,-86.454824 32.704331,-86.454651 32.704334,-86.454245 32.704335)\r\n2598;2400;all;Pine St;Autauga;AL;36003;LINESTRING(-86.657314 32.436667,-86.656887 32.436931,-86.656212 32.437369)\r\n299;201;odd;Berry Ln;Autauga;AL;36066;LINESTRING(-86.450017 32.520217,-86.450527 32.520322,-86.451009 32.520441,-86.451157 32.520491,-86.451457 32.52062,-86.451841 32.520774,-86.451985 32.520842,-86.452349 32.521035,-86.452587 32.521142,-86.452686 32.521184,-86.452777 32.521181)\r\n298;200;even;Berry Ln;Autauga;AL;36066;LINESTRING(-86.450063 32.520057,-86.450577 32.52016,-86.451075 32.520277,-86.451243 32.520333,-86.451545 32.52047,-86.451935 32.520622,-86.452087 32.520698,-86.452449 32.520887,-86.452673 32.520986,-86.45274 32.521002,-86.452795 32.521017)\r\n1200;1398;even;Alabama St;Autauga;AL;36067;LINESTRING(-86.487786 32.434287,-86.489194 32.433664,-86.489404 32.433584,-86.489963 32.433341,-86.490194 32.433267,-86.490385 32.433221,-86.49052 32.433188,-86.490677 32.433159,-86.490743 32.433148,-86.490777 32.43315)\r\n1225;1299;odd;Alabama St;Autauga;AL;36067;LINESTRING(-86.487696 32.434142,-86.489106 32.43351,-86.489318 32.433432,-86.489879 32.433183,-86.490132 32.433103,-86.490331 32.433061,-86.490468 32.433024,-86.490641 32.432987,-86.490741 32.432982,-86.490794 32.432986)\r\n2199;2101;odd;Autauga County 66;Autauga;AL;36022;LINESTRING(-86.487611 32.590881,-86.487518 32.590876,-86.487004 32.590876,-86.486497 32.590892,-86.486424 32.590886,-86.486265 32.590863,-86.486106 32.590832,-86.485871 32.590779)\r\n2198;2160;even;Autauga County 66;Autauga;AL;36022;LINESTRING(-86.487603 32.591046,-86.487514 32.591044,-86.487008 32.591044,-86.486491 32.591062,-86.486398 32.591054,-86.486225 32.591031,-86.486056 32.590994,-86.485819 32.590938)\r\n1500;1514;all;Autauga County 161;Autauga;AL;36051;LINESTRING(-86.59277 32.60368,-86.592772 32.603797,-86.592802 32.603948,-86.592843 32.604092,-86.592888 32.604236,-86.593016 32.604553)\r\n300;398;all;Doster Rd;Autauga;AL;36067;LINESTRING(-86.467359 32.45642,-86.467317 32.456374,-86.467182 32.456211,-86.467057 32.456026,-86.466578 32.455219)\r\n2800;2898;even;Skyview Dr;Autauga;AL;36067;LINESTRING(-86.674313 32.618756,-86.674661 32.618798,-86.675419 32.618866,-86.675589 32.618868,-86.675874 32.618863,-86.676479 32.618807,-86.677323 32.618756,-86.677452 32.618765,-86.677442 32.618749)\r\n2801;2899;odd;Skyview Dr;Autauga;AL;36067;LINESTRING(-86.674339 32.618593,-86.674685 32.618632,-86.675433 32.618696,-86.675589 32.618704,-86.67586 32.618693,-86.676461 32.618641,-86.677315 32.618586,-86.677494 32.618577,-86.677511 32.618595)\r\n2467;2499;all;Autauga County 61;Autauga;AL;36022;LINESTRING(-86.479929 32.60811,-86.479972 32.608375,-86.480047 32.608799,-86.480076 32.608938,-86.480127 32.609146,-86.480185 32.609351,-86.480231 32.609485,-86.480313 32.609679,-86.480417 32.609864,-86.480497 32.609985,-86.480721 32.610284,-86.481091 32.610757,-86.481231 32.610944,-86.48142 32.611287,-86.481471 32.611596,-86.481428 32.611971,-86.481254 32.612422)\r\n700;712;even;Summer Ln;Autauga;AL;36066;LINESTRING(-86.428711 32.45895,-86.428657 32.45892,-86.427292 32.458498,-86.427277 32.458496)\r\n701;711;odd;Summer Ln;Autauga;AL;36066;LINESTRING(-86.428621 32.459095,-86.428573 32.45908,-86.427228 32.458658,-86.427217 32.458653)\r\n3600;3798;even;US Hwy 82;Autauga;AL;36006;LINESTRING(-86.762984 32.646913,-86.763048 32.646988,-86.763241 32.64723,-86.763506 32.647601,-86.763757 32.647979,-86.764074 32.648489,-86.764688 32.649521,-86.765467 32.650807,-86.766246 32.652107,-86.767018 32.653408,-86.76787 32.654807,-86.767931 32.654912)\r\n3601;3699;odd;US Hwy 82;Autauga;AL;36006;LINESTRING(-86.763141 32.646815,-86.76321 32.64689,-86.763409 32.64714,-86.763678 32.647517,-86.763931 32.647899,-86.764248 32.648413,-86.764862 32.649447,-86.765641 32.650733,-86.76642 32.652033,-86.767192 32.653334,-86.768048 32.654733,-86.768107 32.654841)\r\n1598;1500;even;White Cloud Dr;Autauga;AL;36066;LINESTRING(-86.451202 32.539545,-86.451013 32.539715,-86.450955 32.539759,-86.450897 32.539793,-86.450763 32.539848,-86.45062 32.539876,-86.450551 32.539879,-86.450478 32.539872,-86.450408 32.539858,-86.450343 32.539834,-86.450212 32.539767,-86.450158 32.539728,-86.450107 32.539681,-86.450012 32.53957,-86.449879 32.539386,-86.449686 32.539146,-86.449598 32.539027,-86.449515 32.538903,-86.44944 32.538778,-86.449412 32.538719,-86.449389 32.538658,-86.449376 32.538594,-86.449356 32.538309,-86.449302 32.537666,-86.449292 32.537537)\r\n1599;1501;odd;White Cloud Dr;Autauga;AL;36066;LINESTRING(-86.451345 32.539657,-86.451157 32.539835,-86.451087 32.539891,-86.451009 32.539945,-86.450837 32.540022,-86.450642 32.540056,-86.450539 32.540053,-86.450442 32.540044,-86.450346 32.540024,-86.450249 32.539996,-86.450088 32.539909,-86.450012 32.539852,-86.449947 32.539789,-86.449842 32.539664,-86.449711 32.539476,-86.449522 32.539238,-86.449426 32.539113,-86.449341 32.538983,-86.44926 32.538852,-86.449218 32.538781,-86.449189 32.5387,-86.44917 32.538614,-86.44916 32.538319,-86.449106 32.537676,-86.449098 32.537546)\r\n1331;1399;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.433231 32.443867,-86.433189 32.443841,-86.43246 32.443329,-86.432401 32.443276,-86.431883 32.442906,-86.431351 32.442542,-86.431208 32.442455,-86.431016 32.442305)\r\n1098;1086;even;2nd St;Autauga;AL;36703;LINESTRING(-86.794957 32.332801,-86.795041 32.332836,-86.795176 32.332901,-86.795307 32.332981,-86.795429 32.333071,-86.795542 32.333169,-86.795644 32.333276,-86.795735 32.33339,-86.795811 32.333509,-86.795874 32.333636,-86.795924 32.333767,-86.795959 32.333898,-86.795982 32.334033,-86.795995 32.334172,-86.796049 32.335545)\r\n1099;1087;odd;2nd St;Autauga;AL;36703;LINESTRING(-86.795031 32.332649,-86.795131 32.332678,-86.795288 32.332755,-86.795433 32.332849,-86.795567 32.332945,-86.795694 32.333055,-86.795806 32.333174,-86.795909 32.3333,-86.795993 32.333435,-86.796064 32.333576,-86.79612 32.333721,-86.796159 32.333868,-86.79618 32.334015,-86.796193 32.334162,-86.796243 32.33554)\r\n1277;1299;all;Rice Park Cir;Autauga;AL;36067;LINESTRING(-86.500547 32.460283,-86.500556 32.460264,-86.500615 32.460132)\r\n319;399;all;S Washington St;Autauga;AL;36003;LINESTRING(-86.651998 32.427445,-86.651966 32.42741,-86.651896 32.427319)\r\n600;698;even;George Dr;Autauga;AL;36067;LINESTRING(-86.452425 32.451298,-86.452366 32.451298,-86.452245 32.451313,-86.452142 32.451331,-86.452009 32.451353,-86.451961 32.451355,-86.451305 32.451377,-86.451232 32.45137,-86.451183 32.451362,-86.451134 32.451341,-86.451085 32.451312,-86.451066 32.451287,-86.45103 32.451241,-86.451003 32.451158,-86.450987 32.451076,-86.45099 32.45048,-86.450989 32.449997)\r\n601;699;odd;George Dr;Autauga;AL;36067;LINESTRING(-86.452438 32.451462,-86.452386 32.451468,-86.452277 32.451479,-86.452178 32.451493,-86.452047 32.451515,-86.451983 32.451531,-86.451309 32.451545,-86.451206 32.451552,-86.451113 32.45153,-86.451022 32.451497,-86.450945 32.451444,-86.450878 32.451393,-86.450844 32.451305,-86.450789 32.451198,-86.450787 32.451082,-86.450794 32.45048,-86.450795 32.449997)\r\n709;701;all;Ruth St;Autauga;AL;36067;LINESTRING(-86.486788 32.486037,-86.486729 32.486035,-86.486627 32.486033)\r\n1698;1600;all;Pam's Pl;Autauga;AL;36067;LINESTRING(-86.569636 32.522031,-86.569582 32.522119,-86.569617 32.522335,-86.569631 32.522505,-86.569641 32.522788,-86.569636 32.522914,-86.569623 32.522988,-86.569598 32.523077,-86.569498 32.523298,-86.569397 32.523466,-86.569138 32.523794)\r\n2400;2420;even;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.431786 32.580538,-86.431791 32.580906,-86.431805 32.581201,-86.431838 32.581423,-86.431886 32.581641,-86.431948 32.581855,-86.43202 32.582068,-86.432104 32.582278,-86.432172 32.582416,-86.432245 32.58255,-86.432323 32.582683,-86.432522 32.582987)\r\n2401;2423;odd;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.431981 32.580535,-86.431989 32.5809,-86.432007 32.581187,-86.432036 32.581397,-86.432082 32.581605,-86.43214 32.581813,-86.43221 32.582018,-86.432292 32.582218,-86.432354 32.58235,-86.432423 32.582478,-86.432499 32.582605,-86.432693 32.582908)\r\n1601;1609;all;Pink Lilly Rd;Autauga;AL;36067;LINESTRING(-86.47889 32.541677,-86.47889 32.541896,-86.478883 32.542023)\r\n222;298;even;Floyd St;Autauga;AL;36066;LINESTRING(-86.449378 32.516397,-86.448605 32.516358)\r\n219;299;odd;Floyd St;Autauga;AL;36066;LINESTRING(-86.449367 32.516561,-86.448594 32.516522)\r\n1800;1898;even;Glynnwood Dr;Autauga;AL;36066;LINESTRING(-86.421555 32.460631,-86.421552 32.461732,-86.42156 32.462879)\r\n1801;1899;odd;Glynnwood Dr;Autauga;AL;36066;LINESTRING(-86.42175 32.460632,-86.421746 32.461732,-86.421754 32.462878)\r\n107;101;odd;N Autauga St;Autauga;AL;36003;LINESTRING(-86.653418 32.431693,-86.654109 32.432584)\r\n198;110;even;N Autauga St;Autauga;AL;36003;LINESTRING(-86.65358 32.431603,-86.654271 32.432494)\r\n1356;1300;all;Reed St;Autauga;AL;36067;LINESTRING(-86.505819 32.467798,-86.505749 32.467788)\r\n109;161;all;Ball Enwright Rd;Autauga;AL;36022;LINESTRING(-86.463686 32.60942,-86.463655 32.609431,-86.463474 32.609432,-86.463133 32.609424,-86.46297 32.609429,-86.462722 32.609449,-86.462561 32.609471,-86.462061 32.609561,-86.461803 32.6096,-86.461544 32.609621,-86.46112 32.609647,-86.46087 32.609672,-86.460539 32.609717,-86.460268 32.609764)\r\n798;700;all;Karrah Rd;Autauga;AL;36067;LINESTRING(-86.514544 32.565054,-86.514658 32.565082,-86.515621 32.566136,-86.51562 32.566805,-86.51535 32.567031,-86.515084 32.567107,-86.513834 32.567002)\r\n2200;2224;all;Autauga County 123;Autauga;AL;36051;LINESTRING(-86.578943 32.69568,-86.57858 32.696092,-86.578047 32.696649,-86.577786 32.696905)\r\n1000;1030;even;Spring St;Autauga;AL;36067;LINESTRING(-86.467489 32.430609,-86.467545 32.43047,-86.467537 32.430169,-86.467544 32.4301,-86.467585 32.429882,-86.467593 32.429727,-86.467584 32.429646,-86.467579 32.429632)\r\n1001;1035;odd;Spring St;Autauga;AL;36067;LINESTRING(-86.467302 32.430565,-86.467329 32.430446,-86.467337 32.430163,-86.467342 32.43008,-86.467383 32.429864,-86.467395 32.429731,-86.467386 32.429668,-86.467387 32.429658)\r\n1321;1301;odd;Hare Cir;Autauga;AL;36067;LINESTRING(-86.423962 32.433992,-86.423933 32.434013,-86.423809 32.43411,-86.423579 32.434326,-86.423572 32.434336)\r\n1320;1300;even;Hare Cir;Autauga;AL;36067;LINESTRING(-86.424092 32.434115,-86.424067 32.434135,-86.423953 32.43423,-86.423729 32.434436,-86.423721 32.434441)\r\n1198;1116;even;Hines Dr;Autauga;AL;36067;LINESTRING(-86.61728 32.581112,-86.617471 32.581112,-86.617812 32.581104,-86.618155 32.581106,-86.618322 32.581091,-86.618664 32.581079)\r\n1129;1359;odd;Hines Dr;Autauga;AL;36067;LINESTRING(-86.617278 32.580948,-86.617467 32.580946,-86.617808 32.580938,-86.618145 32.580934,-86.61831 32.580923,-86.618656 32.580914)\r\n999;901;odd;Autauga County 49;Autauga;AL;36051;LINESTRING(-86.5849 32.630003,-86.583796 32.629999,-86.580043 32.630053,-86.579958 32.630062,-86.578351 32.630089,-86.577764 32.630094,-86.576162 32.630118,-86.57523 32.630121,-86.574378 32.630131,-86.573364 32.630154)\r\n998;900;even;Autauga County 49;Autauga;AL;36051;LINESTRING(-86.584899 32.630168,-86.583798 32.630165,-86.580057 32.630225,-86.579972 32.630234,-86.578353 32.630255,-86.577766 32.63026,-86.576164 32.630284,-86.575232 32.630287,-86.574382 32.630297,-86.573369 32.630319)\r\n2183;2101;odd;Airport Rd;Autauga;AL;36022;LINESTRING(-86.436358 32.610305,-86.436407 32.610306,-86.436499 32.610273,-86.436581 32.610241,-86.436893 32.610113,-86.437191 32.609966,-86.437411 32.609871,-86.437559 32.609819,-86.437711 32.60978,-86.437949 32.609738,-86.43811 32.609722,-86.438443 32.609707,-86.438775 32.609709,-86.438933 32.609722,-86.439007 32.609734,-86.439079 32.609752,-86.439151 32.609775,-86.439308 32.609837,-86.43948 32.609889,-86.439576 32.609905,-86.439671 32.609913,-86.439766 32.609913,-86.440029 32.609904,-86.440214 32.609889,-86.440327 32.609868,-86.440513 32.609753,-86.44055 32.609638,-86.440547 32.609548,-86.440528 32.609036,-86.440493 32.6086,-86.440462 32.608311,-86.44041 32.607952,-86.440387 32.607741,-86.440374 32.607528,-86.440381 32.60732,-86.440394 32.607182,-86.440476 32.606684,-86.440523 32.606394,-86.440542 32.606106,-86.440581 32.605819,-86.440596 32.605526,-86.440581 32.603792,-86.440575 32.602391)\r\n2180;2100;even;Airport Rd;Autauga;AL;36022;LINESTRING(-86.436327 32.610143,-86.436353 32.610132,-86.436423 32.610115,-86.436497 32.610089,-86.436799 32.609963,-86.437095 32.60982,-86.437325 32.609715,-86.437489 32.609657,-86.437661 32.609612,-86.437917 32.60957,-86.438094 32.609552,-86.438439 32.609539,-86.438785 32.609537,-86.438963 32.609552,-86.439055 32.609568,-86.439143 32.60959,-86.439229 32.609617,-86.439384 32.609677,-86.439536 32.609721,-86.439608 32.609735,-86.439685 32.609743,-86.439764 32.609747,-86.440013 32.609734,-86.440172 32.609715,-86.440225 32.609696,-86.440315 32.609633,-86.440336 32.609602,-86.440349 32.609546,-86.44033 32.609044,-86.440297 32.608614,-86.440266 32.608329,-86.440214 32.60797,-86.440187 32.607753,-86.440176 32.60753,-86.440179 32.60731,-86.440196 32.607162,-86.440282 32.606662,-86.440323 32.606378,-86.440342 32.606092,-86.440381 32.605805,-86.440398 32.605522,-86.440385 32.603792,-86.44038 32.602392)\r\n1817;1825;odd;Edinburgh St;Autauga;AL;36066;LINESTRING(-86.426638 32.478157,-86.426103 32.478182,-86.425676 32.4782)\r\n1816;1822;even;Edinburgh St;Autauga;AL;36066;LINESTRING(-86.426649 32.478321,-86.426113 32.478348,-86.425685 32.478364)\r\n1099;1027;all;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.469581 32.485457,-86.469597 32.485409,-86.469647 32.485199,-86.46967 32.485049,-86.469676 32.484972,-86.469683 32.484606,-86.469675 32.483803,-86.469676 32.483491)\r\n503;501;all;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.824231 32.417356,-86.824171 32.417405)\r\n1299;1201;odd;Caliber Xing;Autauga;AL;36067;LINESTRING(-86.470139 32.450672,-86.472657 32.450651)\r\n2198;2100;even;Caliber Xing;Autauga;AL;36067;LINESTRING(-86.470137 32.450507,-86.472655 32.450486)\r\n256;298;all;Autauga County 3;Autauga;AL;36067;LINESTRING(-86.578765 32.455079,-86.578669 32.45518,-86.578338 32.455506,-86.577899 32.455956,-86.577739 32.456116)\r\n2318;2334;even;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.480275 32.614479,-86.480369 32.614606,-86.480582 32.614915,-86.480951 32.615481,-86.481227 32.615926,-86.481379 32.616191)\r\n2321;2333;odd;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.480438 32.61439,-86.480539 32.614518,-86.480754 32.614833,-86.481125 32.615403,-86.481405 32.61585,-86.481555 32.61612)\r\n899;893;odd;Mallard Ln;Autauga;AL;36051;LINESTRING(-86.586495 32.600906,-86.586432 32.600902,-86.586435 32.600908)\r\n898;892;even;Mallard Ln;Autauga;AL;36051;LINESTRING(-86.586499 32.601071,-86.586414 32.601078,-86.586398 32.60107)\r\n2701;2799;all;Autauga County 139;Autauga;AL;36022;LINESTRING(-86.454486 32.657288,-86.454487 32.657306,-86.454869 32.658705,-86.455079 32.659556,-86.45512 32.659706,-86.455162 32.659784,-86.455212 32.659858,-86.455278 32.659928,-86.455363 32.659983,-86.455456 32.660024,-86.455553 32.660049,-86.455648 32.660061,-86.455741 32.660067,-86.455997 32.660067,-86.458646 32.660032,-86.458808 32.660042,-86.45896 32.660065,-86.459023 32.660084,-86.459079 32.660111,-86.459127 32.660145,-86.459166 32.660187,-86.4592 32.660237,-86.459226 32.660292,-86.459248 32.660355,-86.459283 32.660492,-86.459367 32.66092,-86.459415 32.66107,-86.45945 32.661145,-86.45949 32.661217,-86.459536 32.661285,-86.459589 32.661354,-86.459651 32.661417,-86.459722 32.661473,-86.459795 32.661526,-86.459876 32.66157,-86.459959 32.661608,-86.460049 32.661639,-86.460221 32.661683,-86.460639 32.661756,-86.461223 32.661868,-86.461646 32.661937,-86.462062 32.662015,-86.462303 32.662075,-86.46237 32.662099,-86.462431 32.662131,-86.462476 32.662167,-86.462498 32.662199,-86.462524 32.662235,-86.462505 32.662284,-86.462485 32.662348,-86.462439 32.662492,-86.462427 32.662571,-86.462417 32.662946,-86.462433 32.663174,-86.462432 32.663307,-86.462428 32.663393,-86.462453 32.663468,-86.46252 32.663549,-86.462605 32.663622,-86.462726 32.663702)\r\n300;330;even;Autauga County 56;Autauga;AL;36051;LINESTRING(-86.458596 32.692863,-86.458409 32.692902,-86.458248 32.692926,-86.457828 32.692958,-86.457405 32.692977,-86.456897 32.692984,-86.456647 32.692975,-86.456403 32.692952,-86.456245 32.692925,-86.45609 32.692887,-86.456017 32.692863,-86.45595 32.692835,-86.455733 32.692728,-86.4553 32.692492,-86.455217 32.692455,-86.455049 32.692392,-86.454987 32.692386)\r\n301;327;odd;Autauga County 56;Autauga;AL;36051;LINESTRING(-86.458646 32.693022,-86.458453 32.693068,-86.458274 32.693096,-86.457842 32.693124,-86.457411 32.693145,-86.456895 32.69315,-86.456633 32.693145,-86.456373 32.69312,-86.456197 32.693093,-86.456024 32.693049,-86.455937 32.693021,-86.455852 32.692987,-86.455629 32.69287,-86.455198 32.69264,-86.455129 32.692609,-86.454983 32.69256,-86.454942 32.692546)\r\n1383;1399;all;Autauga County 11;Autauga;AL;36749;LINESTRING(-86.818192 32.606458,-86.818168 32.606482,-86.816891 32.607832,-86.816268 32.608516,-86.816023 32.608808,-86.815793 32.609102,-86.815666 32.609286)\r\n517;653;all;Golson Rd;Autauga;AL;36067;LINESTRING(-86.545325 32.467079,-86.544837 32.46824,-86.544627 32.468717,-86.544465 32.469058,-86.54435 32.469257,-86.544218 32.469451,-86.544022 32.469693,-86.543801 32.469925,-86.543549 32.470133,-86.543282 32.470326,-86.542989 32.470497,-86.542835 32.470571,-86.542656 32.470651)\r\n199;101;odd;9th St;Autauga;AL;36067;LINESTRING(-86.474516 32.47051,-86.474399 32.470503,-86.474146 32.470482,-86.472939 32.470405,-86.471991 32.470347,-86.471806 32.470334)\r\n198;100;even;9th St;Autauga;AL;36067;LINESTRING(-86.474505 32.470675,-86.474383 32.470671,-86.474128 32.470648,-86.472925 32.470569,-86.471975 32.470513,-86.471789 32.470498)\r\n1500;1596;even;Old Hillside Rd;Autauga;AL;36067;LINESTRING(-86.66729 32.596754,-86.667291 32.596759,-86.667382 32.596868,-86.667412 32.596918,-86.667434 32.596978,-86.667448 32.597043,-86.667455 32.597108,-86.667455 32.597178,-86.667475 32.597417,-86.667538 32.5977,-86.66756 32.597775,-86.667595 32.597843,-86.667661 32.597964,-86.667685 32.598021,-86.667716 32.598151,-86.667724 32.598213,-86.667728 32.598279,-86.667698 32.598704,-86.667668 32.598912,-86.667621 32.599124,-86.667591 32.599275,-86.667592 32.599426,-86.667609 32.599658)\r\n1501;1599;odd;Old Hillside Rd;Autauga;AL;36067;LINESTRING(-86.667437 32.596645,-86.667447 32.596651,-86.667566 32.596774,-86.667608 32.596858,-86.667634 32.59694,-86.66765 32.597021,-86.667657 32.597102,-86.667657 32.597172,-86.667679 32.597395,-86.667736 32.597662,-86.667756 32.597719,-86.667779 32.597773,-86.667857 32.5979,-86.667881 32.597979,-86.667918 32.598125,-86.667926 32.598203,-86.667926 32.598281,-86.667898 32.59872,-86.667866 32.598938,-86.667817 32.599152,-86.667797 32.599289,-86.66779 32.599422,-86.667803 32.599649)\r\n501;531;all;Ashton Oak Dr;Autauga;AL;36066;LINESTRING(-86.419852 32.488182,-86.419839 32.486454,-86.419857 32.486071)\r\n1300;1398;even;Rice Park Cir;Autauga;AL;36067;LINESTRING(-86.500404 32.462644,-86.500424 32.462791,-86.500425 32.462865,-86.500471 32.46309,-86.50052 32.463298,-86.50055 32.463503,-86.500558 32.463598)\r\n1399;1371;odd;Rice Park Cir;Autauga;AL;36067;LINESTRING(-86.500597 32.462621,-86.500628 32.462777,-86.500631 32.462849,-86.500667 32.46306,-86.50072 32.46327,-86.500752 32.463489,-86.500753 32.463592)\r\n279;273;all;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.512057 32.412416,-86.512072 32.412976,-86.512098 32.413803)\r\n1750;1798;all;Autauga County 103;Autauga;AL;36758;LINESTRING(-86.904799 32.663167,-86.904703 32.663196)\r\n100;198;even;Yaupon Dr;Autauga;AL;36067;LINESTRING(-86.464931 32.43899,-86.465096 32.438996,-86.466809 32.439022,-86.466883 32.439031,-86.46694 32.439036)\r\n101;199;odd;Yaupon Dr;Autauga;AL;36067;LINESTRING(-86.464938 32.438826,-86.465102 32.43883,-86.466817 32.438854,-86.466915 32.438855,-86.466986 32.438876)\r\n600;698;even;Watson Rd;Autauga;AL;36051;LINESTRING(-86.574626 32.687315,-86.574599 32.687338,-86.574574 32.687453,-86.574568 32.687627,-86.574543 32.688151,-86.574532 32.688948,-86.574524 32.689263)\r\n601;699;odd;Watson Rd;Autauga;AL;36051;LINESTRING(-86.574799 32.687392,-86.574805 32.687402,-86.574782 32.687477,-86.574764 32.687635,-86.574741 32.688155,-86.574728 32.68895,-86.574719 32.689267)\r\n871;801;odd;2nd St;Autauga;AL;36703;LINESTRING(-86.797949 32.365887,-86.797853 32.367232,-86.797794 32.367961,-86.797677 32.369554,-86.797605 32.370425,-86.797558 32.370857,-86.797551 32.370916)\r\n870;800;even;2nd St;Autauga;AL;36703;LINESTRING(-86.798143 32.365897,-86.798047 32.367242,-86.797988 32.367971,-86.797871 32.369564,-86.797801 32.370439,-86.797754 32.370875,-86.797743 32.370937)\r\n1599;1501;odd;Ingram Ln;Autauga;AL;36066;LINESTRING(-86.455685 32.537314,-86.45553 32.537206,-86.455379 32.537095,-86.455242 32.537003,-86.45516 32.536953,-86.454993 32.536903,-86.454903 32.536888,-86.454821 32.536875,-86.454651 32.53687,-86.454563 32.53685,-86.454507 32.536826,-86.454461 32.536795,-86.454365 32.5367,-86.45436 32.536684,-86.454364 32.536691,-86.454398 32.536667,-86.45444 32.536559,-86.454416 32.536452,-86.454354 32.536337,-86.454307 32.536307)\r\n1598;1500;even;Ingram Ln;Autauga;AL;36066;LINESTRING(-86.455562 32.537442,-86.455402 32.537334,-86.455253 32.537225,-86.455124 32.537143,-86.455064 32.537115,-86.454933 32.537071,-86.454865 32.537056,-86.454805 32.537051,-86.454615 32.537056,-86.454481 32.537014,-86.454397 32.536976,-86.454317 32.536929,-86.454177 32.536802,-86.454134 32.536724,-86.45413 32.536591,-86.454222 32.536537,-86.454244 32.536543,-86.45422 32.536516,-86.454172 32.536441,-86.454163 32.536418)\r\n1900;1998;all;Barrett Hill Dr;Autauga;AL;36067;LINESTRING(-86.647678 32.604244,-86.647674 32.604295,-86.647714 32.604751,-86.647746 32.606839,-86.647741 32.60718,-86.647742 32.607391,-86.647745 32.607472,-86.647759 32.607554,-86.647784 32.607633,-86.647923 32.607967,-86.647939 32.60803,-86.647947 32.608094,-86.647944 32.608168,-86.647934 32.608234,-86.647916 32.608298,-86.64779 32.608615)\r\n100;198;even;Capri Ct;Autauga;AL;36067;LINESTRING(-86.489578 32.451206,-86.48941 32.451286,-86.488973 32.451511,-86.488854 32.451564)\r\n101;199;odd;Capri Ct;Autauga;AL;36067;LINESTRING(-86.489675 32.451349,-86.489512 32.45143,-86.489071 32.451663,-86.488939 32.451712)\r\n100;114;all;Autauga County 165;Autauga;AL;36003;LINESTRING(-86.648012 32.435913,-86.648073 32.436088)\r\n125;101;all;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.665477 32.42812,-86.664806 32.429649,-86.664682 32.429915,-86.664572 32.430177,-86.664546 32.430252)\r\n2300;2398;even;Wynoaks Dr;Autauga;AL;36067;LINESTRING(-86.515895 32.446868,-86.515908 32.446796,-86.515917 32.446706,-86.515858 32.446463,-86.515686 32.446263,-86.515435 32.446049,-86.515009 32.445695,-86.514961 32.445647,-86.514919 32.445594,-86.514887 32.445539,-86.514865 32.445484,-86.514851 32.445421,-86.514837 32.445283,-86.514835 32.445135,-86.514819 32.445052,-86.514787 32.444971,-86.51474 32.444891,-86.514672 32.444823,-86.514592 32.444764,-86.514504 32.444722,-86.514412 32.444688,-86.514233 32.444651,-86.513983 32.444604,-86.51391 32.444584,-86.51384 32.444559,-86.513777 32.444528,-86.513718 32.44449,-86.513665 32.444446,-86.513618 32.444398,-86.513579 32.444345,-86.513547 32.444289,-86.513525 32.44423,-86.513512 32.444169,-86.513502 32.444106,-86.513512 32.444043,-86.513556 32.443834,-86.513688 32.443341,-86.513736 32.443211,-86.513765 32.443155,-86.513801 32.443103,-86.513845 32.443057,-86.513899 32.443015,-86.513957 32.44298,-86.51402 32.442953,-86.514087 32.442934,-86.514159 32.442924,-86.514232 32.44292,-86.514309 32.442927,-86.514386 32.442938,-86.514458 32.442954,-86.514532 32.442971)\r\n2301;2399;odd;Wynoaks Dr;Autauga;AL;36067;LINESTRING(-86.515702 32.446849,-86.515708 32.446782,-86.515709 32.446722,-86.51565 32.446541,-86.515524 32.446375,-86.515295 32.446167,-86.514861 32.445813,-86.514799 32.445753,-86.514741 32.445684,-86.514693 32.445607,-86.514663 32.445524,-86.514649 32.445441,-86.514639 32.445291,-86.514629 32.445153,-86.514617 32.445096,-86.514595 32.445041,-86.514562 32.444991,-86.514522 32.444947,-86.51447 32.44491,-86.51441 32.444878,-86.514344 32.444854,-86.514187 32.444815,-86.513931 32.44477,-86.51384 32.444746,-86.51375 32.444715,-86.513663 32.444674,-86.513584 32.444622,-86.513513 32.444564,-86.513452 32.4445,-86.513397 32.444429,-86.513357 32.444353,-86.513325 32.444274,-86.513304 32.444191,-86.513306 32.444104,-86.513308 32.444021,-86.513362 32.4438,-86.513494 32.443297,-86.513544 32.443153,-86.513579 32.443077,-86.513629 32.443003,-86.513693 32.442937,-86.513767 32.442877,-86.513851 32.44283,-86.51394 32.442791,-86.514037 32.442764,-86.514139 32.442748,-86.51424 32.44275,-86.514337 32.442757,-86.514428 32.442772,-86.514514 32.44279,-86.514593 32.442815)\r\n3399;3355;odd;Motley Dr;Autauga;AL;36003;LINESTRING(-86.75283 32.487041,-86.752675 32.487123,-86.752411 32.487318,-86.752288 32.487429,-86.752174 32.487551,-86.752085 32.487685,-86.751879 32.488003,-86.75144 32.488627,-86.751181 32.489006,-86.750845 32.489524,-86.750753 32.48964,-86.750539 32.489866,-86.750436 32.489991,-86.750346 32.490126,-86.750273 32.49027,-86.750202 32.490492,-86.75016 32.490637,-86.750109 32.490769,-86.750042 32.49089,-86.749955 32.491003,-86.749794 32.491169,-86.749465 32.491512)\r\n3398;3354;even;Motley Dr;Autauga;AL;36003;LINESTRING(-86.752938 32.487177,-86.752801 32.487261,-86.752553 32.487442,-86.752442 32.487541,-86.752344 32.487649,-86.752257 32.487767,-86.752051 32.488087,-86.75161 32.488711,-86.751353 32.489088,-86.751019 32.489614,-86.750917 32.489742,-86.750701 32.489968,-86.750608 32.490083,-86.75053 32.490202,-86.750467 32.490328,-86.750394 32.490534,-86.750352 32.490681,-86.750303 32.490831,-86.750226 32.490978,-86.750117 32.491107,-86.749946 32.491275,-86.749616 32.491616)\r\n100;198;all;Cone St;Autauga;AL;36067;LINESTRING(-86.470726 32.475448,-86.47061 32.475443,-86.47044 32.475432,-86.470268 32.475433,-86.469932 32.47542,-86.469909 32.475419)\r\n3698;3600;even;Yelder Ln;Autauga;AL;36003;LINESTRING(-86.803674 32.483414,-86.80367 32.483414,-86.80358 32.483412,-86.803139 32.483421,-86.801426 32.483433,-86.800909 32.483425,-86.800717 32.483418,-86.800503 32.483502,-86.800417 32.483689,-86.800424 32.483864,-86.800459 32.484019,-86.80055 32.484304,-86.800598 32.484447,-86.800663 32.484596,-86.800772 32.484734,-86.800984 32.48486,-86.801031 32.484902,-86.801136 32.48503)\r\n3699;3601;odd;Yelder Ln;Autauga;AL;36003;LINESTRING(-86.80368 32.483578,-86.80367 32.483578,-86.80358 32.483576,-86.803143 32.483587,-86.801426 32.483599,-86.800911 32.483591,-86.800773 32.483608,-86.800685 32.483648,-86.800641 32.483727,-86.800634 32.48385,-86.800657 32.483983,-86.80074 32.484258,-86.80079 32.484391,-86.800853 32.48451,-86.800932 32.484602,-86.801128 32.484726,-86.801197 32.484794,-86.8013 32.484942)\r\n100;198;all;Josie Run;Autauga;AL;36066;LINESTRING(-86.414963 32.481553,-86.415463 32.481586,-86.415871 32.481671)\r\n198;124;all;2nd St;Autauga;AL;36703;LINESTRING(-86.804652 32.461158,-86.804668 32.461868,-86.804671 32.462234,-86.804717 32.4641,-86.804718 32.464147)\r\n231;225;odd;S Pickett St;Autauga;AL;36003;LINESTRING(-86.650357 32.430221,-86.65053 32.430455,-86.65105 32.431133)\r\n298;200;even;S Pickett St;Autauga;AL;36003;LINESTRING(-86.650521 32.430134,-86.650694 32.430365,-86.651213 32.431044)\r\n1044;1098;all;Autauga County 4;Autauga;AL;36067;LINESTRING(-86.431391 32.423969,-86.431193 32.423988,-86.431029 32.424005,-86.430169 32.424104,-86.429314 32.424205,-86.425778 32.424609,-86.425648 32.42463)\r\n1826;1898;even;Seasons Dr;Autauga;AL;36066;LINESTRING(-86.422387 32.45711,-86.422242 32.457265,-86.422073 32.457408,-86.421886 32.457503,-86.421756 32.457535,-86.421529 32.457494,-86.42129 32.457424,-86.421114 32.457388,-86.420935 32.457367,-86.420669 32.457365,-86.420239 32.457373,-86.419386 32.457376,-86.418535 32.45739,-86.418377 32.457388,-86.418271 32.457397)\r\n1823;1899;odd;Seasons Dr;Autauga;AL;36066;LINESTRING(-86.422542 32.45721,-86.422398 32.457377,-86.422211 32.45755,-86.421966 32.457685,-86.421754 32.457699,-86.421475 32.457666,-86.421232 32.45759,-86.421076 32.457558,-86.420917 32.457539,-86.420669 32.457529,-86.420241 32.457539,-86.419388 32.457542,-86.418537 32.457556,-86.418383 32.457558,-86.418284 32.457561)\r\n498;400;even;Jeanette Dr;Autauga;AL;36067;LINESTRING(-86.456601 32.457401,-86.456603 32.457043)\r\n499;401;odd;Jeanette Dr;Autauga;AL;36067;LINESTRING(-86.456406 32.4574,-86.456408 32.457042)\r\n111;101;odd;Forrester Dr;Autauga;AL;36066;LINESTRING(-86.452945 32.531292,-86.453223 32.531348,-86.453401 32.531372,-86.453665 32.531378,-86.453841 32.531374,-86.454522 32.531325,-86.45512 32.531265,-86.455314 32.531225)\r\n110;100;even;Forrester Dr;Autauga;AL;36066;LINESTRING(-86.452988 32.531131,-86.453261 32.53118,-86.453421 32.5312,-86.453665 32.531212,-86.453829 32.531206,-86.454502 32.531159,-86.455086 32.531095,-86.455272 32.531064)\r\n4057;4047;all;Fig Tree Dr;Autauga;AL;36749;LINESTRING(-86.845892 32.50419,-86.845799 32.504185,-86.845715 32.504182,-86.845645 32.504173,-86.845504 32.504132,-86.845456 32.504106,-86.845347 32.50401,-86.845139 32.503776,-86.845024 32.50366,-86.844895 32.503555,-86.844784 32.503501)\r\n2498;2424;all;Alma Ln;Autauga;AL;36067;LINESTRING(-86.64198 32.570626,-86.641497 32.570726,-86.641331 32.570773,-86.641166 32.570809,-86.641001 32.570832,-86.640747 32.570841,-86.640442 32.570925,-86.640383 32.571136,-86.640395 32.571298,-86.640415 32.57145,-86.640444 32.571606,-86.640509 32.571768,-86.640672 32.571893,-86.640853 32.57195,-86.641021 32.571994,-86.641209 32.572027,-86.641404 32.572011,-86.641579 32.57197,-86.641773 32.571915,-86.641906 32.571777,-86.641979 32.571673,-86.642191 32.57141,-86.642254 32.571328,-86.642312 32.57124,-86.642349 32.571143,-86.642349 32.571038,-86.642329 32.57095,-86.642292 32.570808,-86.642278 32.570773)\r\n818;822;even;Dunvegan Dr;Autauga;AL;36067;LINESTRING(-86.477434 32.475704,-86.477447 32.476315,-86.47744 32.476601)\r\n815;823;odd;Dunvegan Dr;Autauga;AL;36067;LINESTRING(-86.477629 32.475701,-86.477641 32.476315,-86.477635 32.476604)\r\n3366;3396;all;US Hwy 82;Autauga;AL;36006;LINESTRING(-86.739823 32.62914,-86.739873 32.629167,-86.740213 32.629329,-86.740373 32.629391,-86.740698 32.629511,-86.740974 32.629596)\r\n199;173;all;Autauga County 64;Autauga;AL;36022;LINESTRING(-86.477178 32.627311,-86.477221 32.627293,-86.477221 32.627292,-86.477371 32.627243,-86.477935 32.627098,-86.478175 32.627044,-86.47837 32.627006)\r\n1310;1398;all;Dorchester Dr;Autauga;AL;36067;LINESTRING(-86.471055 32.496436,-86.470901 32.496414,-86.470654 32.496397,-86.470409 32.49639)\r\n2201;2299;all;Judi's Loop;Autauga;AL;36067;LINESTRING(-86.635343 32.478131,-86.635667 32.477555)\r\n1100;1198;even;Beverly Ave;Autauga;AL;36066;LINESTRING(-86.444579 32.457627,-86.443411 32.457645,-86.443067 32.457646,-86.442729 32.457649,-86.442673 32.457664)\r\n1101;1199;odd;Beverly Ave;Autauga;AL;36066;LINESTRING(-86.444583 32.457792,-86.443413 32.457811,-86.443071 32.457812,-86.442751 32.457825,-86.442707 32.457826)\r\n2534;2596;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.640998 32.537306,-86.641068 32.537423,-86.641307 32.537808,-86.641335 32.537853)\r\n299;219;odd;Kendrick Way;Autauga;AL;36066;LINESTRING(-86.423204 32.492958,-86.423225 32.492957,-86.423397 32.492923,-86.423679 32.492905,-86.42404 32.492906,-86.424463 32.49291,-86.424614 32.492913,-86.424767 32.492888,-86.424898 32.492833,-86.425032 32.49273,-86.425138 32.492625,-86.425214 32.492503,-86.425233 32.492476)\r\n298;226;even;Kendrick Way;Autauga;AL;36066;LINESTRING(-86.423126 32.492807,-86.423157 32.492789,-86.423367 32.492745,-86.423675 32.492737,-86.424042 32.492742,-86.424461 32.492744,-86.42459 32.492735,-86.424695 32.492714,-86.424778 32.492679,-86.424884 32.492606,-86.424966 32.492523,-86.425046 32.492419,-86.425066 32.492392)\r\n699;629;odd;Madison;Autauga;AL;36066;LINESTRING(-86.424153 32.493943,-86.424245 32.493892,-86.424292 32.493865)\r\n698;630;even;Madison;Autauga;AL;36066;LINESTRING(-86.424025 32.49382,-86.424131 32.493724,-86.424229 32.493709)\r\n100;150;all;Averhart St;Autauga;AL;36067;LINESTRING(-86.471347 32.48686,-86.471347 32.486781)\r\n203;201;odd;Winchester Way;Autauga;AL;36067;LINESTRING(-86.474023 32.449561,-86.473354 32.449571,-86.473139 32.449573)\r\n298;200;even;Winchester Way;Autauga;AL;36067;LINESTRING(-86.474027 32.449725,-86.473356 32.449735,-86.473141 32.449738)\r\n1540;1598;even;Autauga County 103;Autauga;AL;36758;LINESTRING(-86.906823 32.635945,-86.906825 32.635952,-86.907029 32.636098,-86.907169 32.636188,-86.90767 32.636477,-86.908173 32.636763,-86.90831 32.636841,-86.908442 32.636926,-86.908565 32.637015,-86.90874 32.637161,-86.908905 32.637323)\r\n1523;1699;odd;Autauga County 103;Autauga;AL;36758;LINESTRING(-86.90696 32.635829,-86.906963 32.635826,-86.907155 32.635966,-86.907287 32.636052,-86.90778 32.636341,-86.908281 32.636625,-86.908428 32.636701,-86.908568 32.636796,-86.908701 32.636889,-86.90889 32.637045,-86.909055 32.637218)\r\n1008;1098;even;Wright St;Autauga;AL;36066;LINESTRING(-86.448004 32.465627,-86.447998 32.465628,-86.447013 32.465862,-86.446899 32.465895)\r\n1015;1099;odd;Wright St;Autauga;AL;36066;LINESTRING(-86.448053 32.465787,-86.44805 32.465788,-86.447071 32.466022,-86.446959 32.466051)\r\n1109;1101;all;2nd St;Autauga;AL;36703;LINESTRING(-86.792629 32.332306,-86.792683 32.332313,-86.794446 32.332508,-86.794623 32.332533,-86.794745 32.332566)\r\n1200;1238;even;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.509145 32.48197,-86.509168 32.481977,-86.509408 32.482044,-86.50964 32.482125,-86.509792 32.482186,-86.510014 32.482289,-86.510154 32.482365,-86.510292 32.482448,-86.510628 32.48267,-86.511227 32.483084)\r\n1201;1247;odd;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.509194 32.48181,-86.509224 32.481815,-86.509478 32.481882,-86.509722 32.481971,-86.509882 32.482036,-86.510116 32.482143,-86.510266 32.482225,-86.510412 32.482312,-86.510752 32.48254,-86.511351 32.482957)\r\n199;101;odd;Cumberland Ct;Autauga;AL;36066;LINESTRING(-86.426019 32.469681,-86.425937 32.469687,-86.42575 32.469699)\r\n100;198;even;Cumberland Ct;Autauga;AL;36066;LINESTRING(-86.426044 32.469844,-86.425955 32.469857,-86.425761 32.469863)\r\n750;798;even;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.891402 32.569263,-86.891658 32.570264,-86.891835 32.570973,-86.89202 32.57168,-86.892212 32.572459,-86.892309 32.572885,-86.892427 32.573456,-86.892573 32.574242,-86.892919 32.576319,-86.892964 32.576745,-86.892969 32.576883,-86.892959 32.577097,-86.892955 32.577157)\r\n743;799;odd;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.891592 32.569228,-86.891848 32.57023,-86.892027 32.570939,-86.892212 32.571646,-86.892404 32.572427,-86.892503 32.572855,-86.892621 32.573428,-86.892767 32.574218,-86.893117 32.576299,-86.893166 32.576737,-86.893165 32.576885,-86.893161 32.577109,-86.893149 32.577175)\r\n164;172;all;Laurel Hill Dr;Autauga;AL;36066;LINESTRING(-86.456862 32.562064,-86.456987 32.561955,-86.457078 32.561818,-86.457193 32.561618,-86.45732 32.561371)\r\n1978;1986;even;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.674213 32.621501,-86.674214 32.621551,-86.674209 32.62199,-86.674197 32.622349,-86.674147 32.623135,-86.674126 32.62344)\r\n1965;1987;odd;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.674408 32.621496,-86.67441 32.621549,-86.674407 32.621994,-86.674393 32.622355,-86.674343 32.623145,-86.674321 32.62345)\r\n816;876;even;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.468747 32.441774,-86.468881 32.441687,-86.469534 32.441219,-86.469769 32.441039,-86.470652 32.44041,-86.47103 32.440144)\r\n783;881;odd;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.468626 32.441645,-86.468755 32.441557,-86.469404 32.441093,-86.469639 32.440913,-86.470526 32.440284,-86.470906 32.440018)\r\n2600;2698;even;Derby St;Autauga;AL;36006;LINESTRING(-86.719948 32.659096,-86.720258 32.659266,-86.720617 32.659472,-86.720628 32.659469)\r\n2601;2619;odd;Derby St;Autauga;AL;36006;LINESTRING(-86.720055 32.658958,-86.720364 32.659128,-86.720755 32.659332,-86.720769 32.659356)\r\n199;101;odd;Appalachian Ridge;Autauga;AL;36066;LINESTRING(-86.427491 32.473109,-86.427607 32.473106,-86.427856 32.473105,-86.428109 32.473111,-86.428531 32.473129,-86.428606 32.473138,-86.428678 32.473153,-86.428701 32.473156)\r\n198;100;even;Appalachian Ridge;Autauga;AL;36066;LINESTRING(-86.427482 32.472944,-86.427603 32.472938,-86.427858 32.472939,-86.428117 32.472945,-86.428547 32.472959,-86.428642 32.472966,-86.42874 32.472987,-86.428771 32.473002)\r\n1300;1398;even;Tiffany Dr;Autauga;AL;36067;LINESTRING(-86.425187 32.437621,-86.425268 32.437552)\r\n1301;1389;odd;Tiffany Dr;Autauga;AL;36067;LINESTRING(-86.42505 32.437504,-86.425131 32.437435)\r\n500;510;even;Mossy Oak Ridge;Autauga;AL;36066;LINESTRING(-86.428824 32.465475,-86.429289 32.466543,-86.429332 32.466673,-86.429357 32.466804,-86.429378 32.46727)\r\n501;513;odd;Mossy Oak Ridge;Autauga;AL;36066;LINESTRING(-86.429007 32.465418,-86.429479 32.466489,-86.429532 32.466635,-86.429563 32.466788,-86.429572 32.467265)\r\n1270;1276;all;Autauga County 103;Autauga;AL;36749;LINESTRING(-86.898595 32.601006,-86.898782 32.601734,-86.898858 32.602005)\r\n1700;1798;all;Childers Ln;Autauga;AL;36008;LINESTRING(-86.57356 32.501868,-86.573672 32.501941,-86.57379 32.502032,-86.573892 32.502136,-86.57398 32.502248,-86.57405 32.502369,-86.574104 32.502498,-86.574191 32.502782,-86.57428 32.502996,-86.574317 32.503067,-86.574392 32.503196)\r\n703;701;all;Marlyn Dr;Autauga;AL;36067;LINESTRING(-86.485904 32.485027,-86.485909 32.485065)\r\n699;695;odd;2nd St;Autauga;AL;36703;LINESTRING(-86.795199 32.384542,-86.795015 32.385764)\r\n692;686;even;2nd St;Autauga;AL;36703;LINESTRING(-86.795392 32.384563,-86.795208 32.385785)\r\n128;134;all;Seaside Rd;Autauga;AL;36003;LINESTRING(-86.651946 32.439666,-86.651936 32.439873,-86.65196 32.439959,-86.652061 32.440171,-86.652084 32.440214,-86.652127 32.440306,-86.652453 32.441059,-86.652622 32.441472,-86.652655 32.441545,-86.652695 32.441602)\r\n417;421;all;Oak Valley Rd;Autauga;AL;36022;LINESTRING(-86.442448 32.530987,-86.442448 32.530961,-86.442429 32.530912,-86.442443 32.530854,-86.442478 32.530722,-86.442527 32.530584,-86.442554 32.530506,-86.442556 32.53042,-86.442555 32.530335,-86.442532 32.530255,-86.44247 32.530109,-86.442369 32.529913,-86.442233 32.5295,-86.442145 32.529291,-86.441954 32.528888,-86.441846 32.528621,-86.441775 32.528424)\r\n374;498;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.451004 32.462228,-86.450986 32.461447)\r\n1899;1801;odd;Station Dr;Autauga;AL;36066;LINESTRING(-86.41819 32.479749,-86.418489 32.479751,-86.418831 32.479749,-86.419457 32.479758,-86.419462 32.479757)\r\n1898;1800;even;Station Dr;Autauga;AL;36066;LINESTRING(-86.418192 32.479585,-86.418489 32.479587,-86.418831 32.479583,-86.419459 32.479592,-86.419462 32.479593)\r\n3502;3528;all;State Rte 14;Autauga;AL;36003;LINESTRING(-86.779046 32.456805,-86.779591 32.456991,-86.782928 32.45812,-86.783012 32.458149,-86.783037 32.458153)\r\n998;970;all;Lower Kingston Rd;Autauga;AL;36067;LINESTRING(-86.494703 32.477254,-86.494034 32.47687,-86.493753 32.476696,-86.493536 32.476544,-86.493484 32.476512,-86.493225 32.476318,-86.492853 32.476014,-86.492804 32.475963,-86.492737 32.475905,-86.492724 32.475893,-86.492501 32.475699,-86.49247 32.475669)\r\n975;901;odd;Sandy Ridge Rd;Autauga;AL;36067;LINESTRING(-86.60197 32.582642,-86.601889 32.582647,-86.601725 32.582653,-86.601213 32.582653,-86.600187 32.582699,-86.599511 32.582739,-86.598996 32.582756,-86.598646 32.582775,-86.598495 32.582781)\r\n976;900;even;Sandy Ridge Rd;Autauga;AL;36067;LINESTRING(-86.601991 32.582806,-86.601903 32.582817,-86.601729 32.582821,-86.601219 32.582821,-86.600199 32.582865,-86.599521 32.582905,-86.599006 32.582922,-86.598656 32.582941,-86.598503 32.582946)\r\n199;101;odd;Newby St;Autauga;AL;36067;LINESTRING(-86.474591 32.469749,-86.474466 32.469736,-86.474381 32.469724,-86.47412 32.469703,-86.47232 32.469573,-86.4719 32.469549,-86.471872 32.469548)\r\n198;100;even;Newby St;Autauga;AL;36067;LINESTRING(-86.474571 32.469913,-86.47444 32.469904,-86.474355 32.469892,-86.474102 32.469869,-86.472306 32.469739,-86.471882 32.469717,-86.471851 32.469712)\r\n204;218;even;N Pickett St;Autauga;AL;36003;LINESTRING(-86.653806 32.434673,-86.654493 32.435541)\r\n201;217;odd;N Pickett St;Autauga;AL;36003;LINESTRING(-86.653968 32.434582,-86.654655 32.43545)\r\n516;598;even;Daniel Dr;Autauga;AL;36067;LINESTRING(-86.460609 32.477719,-86.46061 32.477758,-86.460603 32.477818,-86.460583 32.477861,-86.460597 32.477869)\r\n515;599;odd;Daniel Dr;Autauga;AL;36067;LINESTRING(-86.460802 32.477705,-86.46081 32.477754,-86.460811 32.47784,-86.460795 32.477943,-86.460752 32.477968)\r\n899;801;odd;Summer Ln;Autauga;AL;36066;LINESTRING(-86.41895 32.454233,-86.418994 32.454336,-86.419065 32.454545,-86.419165 32.454747,-86.419172 32.454754)\r\n798;780;even;Summer Ln;Autauga;AL;36066;LINESTRING(-86.41913 32.454171,-86.419188 32.454278,-86.419259 32.454489,-86.419347 32.454679,-86.419348 32.454685)\r\n100;198;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.470416 32.456044,-86.47042 32.456034,-86.470415 32.456014,-86.470412 32.45594,-86.470326 32.45559)\r\n1268;1280;all;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.514657 32.485459,-86.515355 32.485942,-86.515422 32.48599)\r\n2378;2386;all;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.485276 32.622303,-86.48577 32.623089,-86.486259 32.62385,-86.48674 32.62461,-86.486867 32.624825)\r\n399;301;all;Somerset Dr;Autauga;AL;36067;LINESTRING(-86.479399 32.525305,-86.479227 32.52531,-86.478887 32.525311,-86.478794 32.525315,-86.47864 32.525333,-86.478529 32.525452,-86.478532 32.525559,-86.478542 32.525779,-86.478541 32.52592,-86.478539 32.526007)\r\n200;206;even;Doe Dr;Autauga;AL;36067;LINESTRING(-86.483187 32.455451,-86.483132 32.455362,-86.483019 32.455271,-86.48298 32.455205,-86.482943 32.455136,-86.482934 32.455029,-86.482923 32.454731,-86.482922 32.454628,-86.482916 32.454623)\r\n201;205;odd;Doe Dr;Autauga;AL;36067;LINESTRING(-86.483024 32.45554,-86.482966 32.455482,-86.482825 32.455383,-86.48279 32.455279,-86.482717 32.455182,-86.482738 32.455029,-86.482727 32.454737,-86.482718 32.454644,-86.482723 32.454646)\r\n1200;1204;all;Kingston Garden Rd;Autauga;AL;36067;LINESTRING(-86.474616 32.491209,-86.474621 32.491522,-86.47462 32.49157)\r\n1201;1275;all;Rice Park Cir;Autauga;AL;36067;LINESTRING(-86.499995 32.461104,-86.500009 32.461097,-86.499971 32.461059,-86.499913 32.460937,-86.499892 32.460889,-86.499926 32.460774,-86.499948 32.460744,-86.500057 32.460675,-86.500287 32.460606,-86.500401 32.460561,-86.500412 32.460516)\r\n1800;1806;all;Seasons Dr;Autauga;AL;36066;LINESTRING(-86.425894 32.455476,-86.425583 32.455479,-86.425145 32.455475,-86.425129 32.455482)\r\n492;498;even;Autauga County 68 W;Autauga;AL;36022;LINESTRING(-86.528706 32.658766,-86.529468 32.658848,-86.530487 32.658947,-86.531167 32.659021,-86.531513 32.659039,-86.531769 32.659043,-86.532197 32.659043,-86.533121 32.659023,-86.533471 32.659027)\r\n423;499;odd;Autauga County 68 W;Autauga;AL;36022;LINESTRING(-86.52873 32.658603,-86.529492 32.658684,-86.530511 32.658783,-86.531185 32.658853,-86.531521 32.658871,-86.531771 32.658877,-86.532195 32.658877,-86.533119 32.658857,-86.533474 32.658862)\r\n899;863;all;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.803393 32.384446,-86.803533 32.384447,-86.804906 32.384438,-86.805246 32.384446,-86.805586 32.384466,-86.805923 32.384498,-86.806247 32.384541,-86.806562 32.384596,-86.806603 32.384603)\r\n3398;3496;even;US Hwy 82;Autauga;AL;36006;LINESTRING(-86.741252 32.62968,-86.741624 32.629789,-86.742549 32.630046,-86.743508 32.630342,-86.743818 32.630452,-86.744206 32.630611,-86.74443 32.630712,-86.744723 32.630855,-86.745079 32.631052,-86.745424 32.63126,-86.745555 32.631346,-86.745813 32.631532,-86.745939 32.631629,-86.746184 32.63183,-86.74642 32.632034,-86.746533 32.632141,-86.74675 32.632359,-86.747063 32.632702,-86.747159 32.632822,-86.747258 32.632944,-86.747731 32.63355,-86.748198 32.634162,-86.749584 32.635999,-86.750044 32.636621,-86.750915 32.637768,-86.750981 32.637863,-86.752087 32.639299,-86.752199 32.639433,-86.752288 32.639543,-86.752431 32.639701)\r\n3401;3499;odd;US Hwy 82;Autauga;AL;36006;LINESTRING(-86.741315 32.629524,-86.741686 32.629631,-86.742613 32.629888,-86.743582 32.630184,-86.7439 32.630298,-86.744296 32.630461,-86.744526 32.630566,-86.744829 32.630711,-86.745191 32.630914,-86.745544 32.631124,-86.745681 32.631216,-86.745945 32.631406,-86.746075 32.631507,-86.746324 32.631712,-86.746566 32.63192,-86.746683 32.632031,-86.746904 32.632253,-86.747229 32.632602,-86.747323 32.63273,-86.747422 32.63285,-86.747895 32.63346,-86.748362 32.634072,-86.74975 32.635911,-86.75021 32.636533,-86.751085 32.63768,-86.751151 32.637775,-86.752251 32.639205,-86.752359 32.639339,-86.752448 32.639445,-86.752587 32.639602)\r\n100;198;even;Virginia Reed Ct;Autauga;AL;36066;LINESTRING(-86.428248 32.476204,-86.428156 32.476208,-86.427981 32.476238,-86.42781 32.476278,-86.427644 32.476329,-86.42741 32.476413,-86.427233 32.476464)\r\n101;199;odd;Virginia Reed Ct;Autauga;AL;36066;LINESTRING(-86.428268 32.476367,-86.428186 32.476378,-86.428027 32.476404,-86.427872 32.47644,-86.427718 32.476487,-86.42748 32.476575,-86.427291 32.476621)\r\n1200;1298;even;Ricky Dr;Autauga;AL;36066;LINESTRING(-86.433193 32.505289,-86.433538 32.505857,-86.433913 32.506316,-86.43423 32.506848,-86.434294 32.507243,-86.434251 32.507546,-86.434317 32.507843,-86.434279 32.508115,-86.43416 32.508292,-86.433779 32.508684,-86.43346 32.509113)\r\n1201;1299;odd;Ricky Dr;Autauga;AL;36066;LINESTRING(-86.433366 32.505213,-86.433714 32.505767,-86.434089 32.506226,-86.434448 32.506792,-86.434488 32.507243,-86.434451 32.50754,-86.434521 32.507833,-86.434503 32.508177,-86.434328 32.508394,-86.433945 32.508786,-86.433624 32.509202)\r\n700;798;all;Deramus St;Autauga;AL;36066;LINESTRING(-86.444849 32.460234,-86.44485 32.459877,-86.444844 32.45957)\r\n949;999;all;Fireside Dr;Autauga;AL;36067;LINESTRING(-86.479499 32.448511,-86.480248 32.448986,-86.480393 32.44909,-86.480471 32.449143,-86.480664 32.449296,-86.480995 32.44966,-86.481034 32.449715)\r\n118;198;all;Lake Haven Way;Autauga;AL;36066;LINESTRING(-86.43197 32.467551,-86.431762 32.467338)\r\n816;826;all;Sweet Ridge Rd;Autauga;AL;36066;LINESTRING(-86.429029 32.452925,-86.430449 32.45292,-86.430535 32.452922)\r\n1199;1145;all;Old Ridge Rd;Autauga;AL;36066;LINESTRING(-86.448756 32.4937,-86.451722 32.493604,-86.452236 32.493576,-86.452834 32.49353,-86.453092 32.493504,-86.453267 32.493478,-86.453436 32.493434,-86.453759 32.493329,-86.453839 32.493299)\r\n109;107;odd;Mobile Dr;Autauga;AL;36067;LINESTRING(-86.462695 32.452376,-86.462781 32.452371,-86.462957 32.452331,-86.46313 32.452285,-86.463284 32.45223)\r\n110;108;even;Mobile Dr;Autauga;AL;36067;LINESTRING(-86.46267 32.452213,-86.462743 32.452201,-86.462901 32.452169,-86.463062 32.452125,-86.463211 32.452077)\r\n1501;1653;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.417753 32.432467,-86.417619 32.432355,-86.417506 32.432259)\r\n199;113;odd;Willow Oak Dr;Autauga;AL;36067;LINESTRING(-86.474838 32.475767,-86.474842 32.475513,-86.474874 32.475083,-86.474918 32.474882,-86.474958 32.47477)\r\n198;112;even;Willow Oak Dr;Autauga;AL;36067;LINESTRING(-86.474643 32.475766,-86.474642 32.475507,-86.47467 32.475063,-86.474716 32.474836,-86.474774 32.474715)\r\n301;373;all;Seaside Rd;Autauga;AL;36003;LINESTRING(-86.665055 32.460582,-86.665125 32.460669,-86.665346 32.460907,-86.666234 32.461812,-86.666767 32.462534,-86.667739 32.463818,-86.667891 32.464067,-86.668215 32.464538,-86.668263 32.46465,-86.668334 32.464801,-86.66835 32.464957,-86.668344 32.465061,-86.668282 32.465244,-86.668234 32.465382,-86.668161 32.465483,-86.668082 32.465641,-86.667989 32.465725,-86.667687 32.466112,-86.667586 32.466398,-86.667427 32.467355,-86.666964 32.470387,-86.66683 32.470929,-86.666696 32.471536,-86.666381 32.472455,-86.666104 32.473233,-86.666015 32.473489)\r\n135;101;odd;N Washington St;Autauga;AL;36067;LINESTRING(-86.469589 32.463415,-86.469672 32.462783)\r\n154;100;even;N Washington St;Autauga;AL;36067;LINESTRING(-86.469395 32.463397,-86.469478 32.462765)\r\n1300;1398;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.436794 32.445989,-86.436753 32.445944,-86.435598 32.445134,-86.434265 32.444199,-86.433721 32.443807)\r\n2100;2198;even;Church St;Autauga;AL;36006;LINESTRING(-86.718414 32.66063,-86.71837 32.660687,-86.718176 32.660949,-86.717982 32.661184,-86.717886 32.661289,-86.717738 32.661435,-86.71767 32.661497,-86.717632 32.661526,-86.717624 32.661539)\r\n2101;2199;odd;Church St;Autauga;AL;36006;LINESTRING(-86.718578 32.660718,-86.718536 32.660775,-86.718344 32.661043,-86.718142 32.661284,-86.71804 32.661395,-86.717886 32.661547,-86.717812 32.661613,-86.717782 32.661642,-86.717774 32.661644)\r\n899;815;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.57373 32.575616,-86.571381 32.575659,-86.568133 32.575601,-86.566846 32.575568,-86.566432 32.575563,-86.566005 32.575553,-86.565578 32.57555,-86.563018 32.575506,-86.56259 32.575491,-86.561734 32.575475,-86.561393 32.575465,-86.56088 32.57545,-86.560233 32.575445)\r\n856;800;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.573734 32.575781,-86.571381 32.575823,-86.568129 32.575767,-86.566842 32.575734,-86.566428 32.575729,-86.566001 32.575719,-86.565576 32.575716,-86.563012 32.575672,-86.562584 32.575657,-86.561728 32.575641,-86.561387 32.575629,-86.560876 32.575616,-86.560231 32.57561)\r\n1708;1718;even;Meadowbrook Dr;Autauga;AL;36066;LINESTRING(-86.423695 32.468602,-86.423644 32.468674,-86.423485 32.469012,-86.423409 32.469128,-86.423263 32.469295,-86.423149 32.469398,-86.423092 32.469474)\r\n1701;1713;odd;Meadowbrook Dr;Autauga;AL;36066;LINESTRING(-86.423867 32.46868,-86.42383 32.468748,-86.423671 32.469086,-86.423583 32.469222,-86.423421 32.469405,-86.423309 32.469508,-86.42325 32.46957)\r\n1870;1800;all;Siesta Dr;Autauga;AL;36067;LINESTRING(-86.523811 32.558524,-86.522792 32.558075,-86.522776 32.557383,-86.523311 32.55682,-86.523422 32.556788)\r\n1201;1215;all;E Main St;Autauga;AL;36066;LINESTRING(-86.441918 32.460476,-86.441167 32.460502)\r\n300;398;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.467236 32.436351,-86.466955 32.436285,-86.46667 32.436221,-86.466132 32.436102,-86.465966 32.43606,-86.46546 32.435955,-86.465017 32.435879)\r\n1900;2098;even;Deloach Rd;Autauga;AL;36067;LINESTRING(-86.652037 32.60421,-86.6521 32.604826,-86.65227 32.605113,-86.652475 32.605501,-86.652531 32.605741,-86.652859 32.606554,-86.653109 32.607221,-86.653497 32.607821,-86.6536 32.60803,-86.653682 32.608254,-86.65375 32.608478,-86.653962 32.609063,-86.654147 32.609505,-86.654318 32.609844,-86.65459 32.610191,-86.654863 32.610425,-86.65533 32.610896,-86.655536 32.611191,-86.655577 32.611254)\r\n1901;1999;odd;Deloach Rd;Autauga;AL;36067;LINESTRING(-86.652231 32.604193,-86.652316 32.604776,-86.652448 32.605043,-86.652683 32.605445,-86.652733 32.605697,-86.653045 32.606502,-86.653303 32.607151,-86.653681 32.607747,-86.653792 32.607972,-86.653874 32.608208,-86.653942 32.608432,-86.654152 32.609011,-86.654335 32.609443,-86.654504 32.609758,-86.654756 32.610079,-86.655013 32.610311,-86.655504 32.610794,-86.655712 32.611111,-86.655751 32.61118)\r\n200;298;even;Simmons Rd;Autauga;AL;36067;LINESTRING(-86.527938 32.44615,-86.527959 32.446139,-86.528001 32.446084)\r\n275;299;odd;Simmons Rd;Autauga;AL;36067;LINESTRING(-86.527754 32.446095,-86.527763 32.446035,-86.527862 32.445968)\r\n406;498;even;Azalea Dr;Autauga;AL;36067;LINESTRING(-86.458777 32.476407,-86.458799 32.476399,-86.458871 32.476337,-86.459033 32.476151,-86.45932 32.475697,-86.45942 32.475503)\r\n407;499;odd;Azalea Dr;Autauga;AL;36067;LINESTRING(-86.458658 32.476277,-86.458661 32.476269,-86.458713 32.476223,-86.458857 32.476057,-86.45914 32.475621,-86.459242 32.475436)\r\n498;462;all;Autauga County 4;Autauga;AL;36067;LINESTRING(-86.48741 32.431113,-86.486419 32.431102,-86.486415 32.431101)\r\n1398;1200;all;Breakfast Creek Rd;Autauga;AL;36067;LINESTRING(-86.49967 32.500014,-86.499657 32.499916,-86.499656 32.499764,-86.499666 32.499611,-86.499693 32.499459,-86.499766 32.499177,-86.499791 32.499039,-86.499849 32.498532,-86.499936 32.498024,-86.499938 32.498017)\r\n399;301;odd;Cambridge St;Autauga;AL;36066;LINESTRING(-86.420621 32.46428,-86.42063 32.464521,-86.42062 32.465387,-86.42062 32.46617,-86.420613 32.466259)\r\n398;300;even;Cambridge St;Autauga;AL;36066;LINESTRING(-86.420815 32.464274,-86.420826 32.464519,-86.420814 32.465387,-86.420826 32.46618,-86.420806 32.46628)\r\n2094;2198;even;Autauga County 21;Autauga;AL;36051;LINESTRING(-86.602233 32.659155,-86.602382 32.660091,-86.602463 32.660667,-86.602523 32.660957,-86.602575 32.661171,-86.602695 32.661596,-86.602766 32.661807,-86.602845 32.662017,-86.60293 32.662223,-86.603055 32.662495,-86.60319 32.662764,-86.60396 32.664209,-86.604244 32.66473,-86.604482 32.665191,-86.604574 32.665389,-86.60468 32.665659,-86.604725 32.665794,-86.604822 32.66614,-86.604884 32.666419,-86.604907 32.66656,-86.604931 32.66677,-86.604942 32.666982,-86.604952 32.667775,-86.60496 32.668049,-86.604972 32.668499,-86.605014 32.67046,-86.605018 32.670896,-86.605035 32.67162,-86.605049 32.672776,-86.605071 32.673495,-86.605073 32.673566,-86.60508 32.674432,-86.60515 32.677555,-86.605186 32.678858,-86.605217 32.679509,-86.605274 32.680376,-86.605331 32.681673,-86.605374 32.682395,-86.605398 32.683112,-86.605412 32.683398,-86.605415 32.683753,-86.605401 32.684186,-86.605385 32.684475,-86.605286 32.6857,-86.60525 32.686206)\r\n1975;2199;odd;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.602426 32.659133,-86.602576 32.660069,-86.602661 32.660643,-86.602717 32.660925,-86.602769 32.661135,-86.602887 32.661554,-86.602956 32.661759,-86.603033 32.661965,-86.603116 32.662165,-86.603239 32.662433,-86.60337 32.662698,-86.604138 32.664141,-86.604424 32.664662,-86.604664 32.665127,-86.604762 32.665331,-86.604872 32.665611,-86.604917 32.665752,-86.605018 32.666106,-86.60508 32.666393,-86.605105 32.66654,-86.605131 32.666758,-86.60514 32.666978,-86.605148 32.667773,-86.605156 32.668045,-86.605168 32.668495,-86.60521 32.670458,-86.605214 32.670894,-86.605231 32.671618,-86.605245 32.672774,-86.605267 32.673491,-86.605269 32.673564,-86.605276 32.67443,-86.605346 32.677551,-86.605382 32.678852,-86.605413 32.679501,-86.60547 32.680368,-86.605527 32.681665,-86.605572 32.682389,-86.605594 32.683106,-86.60561 32.683394,-86.605613 32.683755,-86.605597 32.684192,-86.605583 32.684485,-86.605482 32.68571,-86.605445 32.686216)\r\n1620;1622;all;Autauga County 87;Autauga;AL;36022;LINESTRING(-86.431221 32.539096,-86.43131 32.539254)\r\n704;758;even;Autauga County 175;Autauga;AL;36051;LINESTRING(-86.576269 32.687992,-86.576271 32.688024,-86.576525 32.68831,-86.576803 32.688671,-86.57695 32.688854,-86.577172 32.689083,-86.577664 32.689651,-86.57785 32.689887,-86.577977 32.690068,-86.578092 32.690256,-86.578194 32.690447,-86.578769 32.691641,-86.57897 32.69204,-86.579027 32.692172,-86.579072 32.692306,-86.579102 32.692438,-86.579118 32.692575,-86.579128 32.692933,-86.57913 32.693873,-86.579143 32.694309,-86.579144 32.694595,-86.579123 32.695036)\r\n705;793;odd;Autauga County 175;Autauga;AL;36051;LINESTRING(-86.576452 32.687935,-86.576465 32.687938,-86.576689 32.688216,-86.576967 32.688579,-86.577112 32.688752,-86.57733 32.688979,-86.577826 32.689555,-86.57802 32.689797,-86.578153 32.689986,-86.578274 32.690182,-86.578376 32.690383,-86.578951 32.691577,-86.579156 32.691978,-86.579219 32.69212,-86.579268 32.692266,-86.579304 32.692412,-86.57932 32.692565,-86.579324 32.692931,-86.579328 32.693871,-86.579341 32.694307,-86.579342 32.694599,-86.579318 32.695043)\r\n802;800;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.490127 32.451947,-86.490022 32.451778,-86.489855 32.451524,-86.489744 32.451364)\r\n101;105;all;Dellwood Ct;Autauga;AL;36066;LINESTRING(-86.41514 32.454705,-86.415282 32.454661,-86.415383 32.454656,-86.415399 32.45466)\r\n760;792;even;Autauga County 175;Autauga;AL;36051;LINESTRING(-86.579099 32.695275,-86.579078 32.695378,-86.57905 32.69549)\r\n795;799;odd;Autauga County 175;Autauga;AL;36051;LINESTRING(-86.579293 32.695296,-86.579282 32.69541,-86.579239 32.695531)\r\n1301;1365;all;Autauga County 73;Autauga;AL;36006;LINESTRING(-86.742007 32.563538,-86.741957 32.563605,-86.741698 32.563812,-86.741574 32.563909,-86.741405 32.564061,-86.741358 32.564111,-86.741315 32.564167,-86.741279 32.564224,-86.741217 32.564348,-86.741168 32.56448,-86.741111 32.564687,-86.741102 32.564715)\r\n127;299;all;Grand Park Dr;Autauga;AL;36022;LINESTRING(-86.414097 32.505092,-86.41432 32.505127,-86.414551 32.505157,-86.414778 32.505194,-86.414884 32.50524,-86.414967 32.505298,-86.415046 32.505354,-86.415107 32.505423,-86.415229 32.505533,-86.415285 32.505565,-86.415376 32.505604)\r\n400;698;even;Pinecrest Dr;Autauga;AL;36067;LINESTRING(-86.462019 32.463981,-86.462004 32.463699,-86.461945 32.463034,-86.461904 32.462854,-86.461795 32.462754,-86.46167 32.462733,-86.461499 32.462719,-86.461334 32.462696,-86.460048 32.462538,-86.459706 32.462501,-86.459451 32.462467,-86.459275 32.462448,-86.458449 32.462381)\r\n401;699;odd;Pinecrest Dr;Autauga;AL;36067;LINESTRING(-86.461825 32.463989,-86.461806 32.463709,-86.461739 32.463062,-86.461696 32.46295,-86.461669 32.462926,-86.461628 32.462907,-86.461469 32.462887,-86.461302 32.46286,-86.460022 32.462702,-86.459678 32.462667,-86.459423 32.462633,-86.459253 32.462614,-86.45843 32.462545)\r\n500;598;even;S McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.418197 32.462393,-86.418204 32.461588,-86.418191 32.46089)\r\n501;699;odd;S McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.418003 32.462392,-86.418008 32.461588,-86.417997 32.460893)\r\n471;401;odd;2nd St;Autauga;AL;36703;LINESTRING(-86.79558 32.410279,-86.795882 32.410617,-86.796286 32.411085,-86.796481 32.411324,-86.796569 32.411443,-86.796718 32.411663)\r\n470;452;even;2nd St;Autauga;AL;36703;LINESTRING(-86.795735 32.410179,-86.79604 32.410517,-86.796446 32.410989,-86.796647 32.41123,-86.796741 32.411357,-86.796887 32.411582)\r\n399;233;odd;S Pickett St;Autauga;AL;36003;LINESTRING(-86.648665 32.428031,-86.648675 32.42805,-86.648948 32.42841,-86.649281 32.428836,-86.649425 32.42901,-86.650196 32.430011,-86.6502 32.430015)\r\n398;300;even;S Pickett St;Autauga;AL;36003;LINESTRING(-86.648833 32.427948,-86.648845 32.427962,-86.649112 32.42832,-86.649443 32.428742,-86.649589 32.428916,-86.65036 32.429921,-86.650362 32.429925)\r\n698;686;even;Yosemite Pkwy;Autauga;AL;36067;LINESTRING(-86.547892 32.577,-86.547893 32.577048,-86.547895 32.577776,-86.547909 32.578348,-86.5479 32.57841,-86.547885 32.578467,-86.547858 32.578505,-86.547769 32.578576,-86.547642 32.578617,-86.547487 32.578632,-86.547314 32.578632,-86.547139 32.578638,-86.5471 32.578641)\r\n695;685;odd;Yosemite Pkwy;Autauga;AL;36067;LINESTRING(-86.548087 32.576993,-86.548091 32.577044,-86.548091 32.577774,-86.548109 32.578352,-86.548104 32.578434,-86.548087 32.578515,-86.548052 32.578615,-86.547889 32.578742,-86.547684 32.578801,-86.547491 32.5788,-86.547318 32.5788,-86.547149 32.578804,-86.547111 32.578805)\r\n210;298;even;Seaside Rd;Autauga;AL;36003;LINESTRING(-86.660458 32.450273,-86.660475 32.450295,-86.660669 32.45053,-86.660758 32.450648,-86.660838 32.450766,-86.66091 32.450894,-86.660973 32.451025,-86.661083 32.451302,-86.661273 32.451712,-86.661473 32.452115,-86.661598 32.452385,-86.661773 32.452795,-86.661875 32.45307,-86.662011 32.453488,-86.662052 32.453628,-86.662163 32.454055,-86.662307 32.454481,-86.66232 32.454506)\r\n227;247;odd;Seaside Rd;Autauga;AL;36003;LINESTRING(-86.660612 32.450173,-86.660635 32.450195,-86.660833 32.450438,-86.660926 32.45056,-86.661018 32.450686,-86.661092 32.450826,-86.661161 32.450965,-86.661271 32.451244,-86.661455 32.45165,-86.661655 32.452053,-86.661782 32.452327,-86.661961 32.452741,-86.662065 32.453022,-86.662201 32.453446,-86.662244 32.45359,-86.662357 32.454013,-86.662497 32.454429,-86.662504 32.454452)\r\n1100;1114;even;Perrydale Loop;Autauga;AL;36066;LINESTRING(-86.442683 32.456723,-86.44237 32.45582,-86.442112 32.455116)\r\n1101;1113;odd;Perrydale Loop;Autauga;AL;36066;LINESTRING(-86.442497 32.45677,-86.442182 32.455868,-86.441926 32.455164)\r\n198;2;even;Sparrow Pointe Ct;Autauga;AL;36022;LINESTRING(-86.419085 32.505402,-86.418962 32.504986)\r\n303;101;odd;Sparrow Pointe Ct;Autauga;AL;36022;LINESTRING(-86.418896 32.505442,-86.418773 32.505026)\r\n3101;3151;all;Prather Rd;Autauga;AL;36003;LINESTRING(-86.71032 32.450762,-86.710409 32.45079,-86.710807 32.450908,-86.711612 32.451159,-86.712419 32.451404,-86.712821 32.451532,-86.714438 32.45203,-86.714926 32.452171,-86.715577 32.452345,-86.716069 32.452481,-86.716234 32.45253,-86.716396 32.452588,-86.716557 32.45265,-86.716715 32.452719,-86.716935 32.452836,-86.717367 32.453072,-86.717655 32.45322,-86.7178 32.453285,-86.717947 32.453341,-86.718178 32.45341,-86.718334 32.453447,-86.718661 32.45351,-86.718668 32.453513)\r\n304;598;even;Hunting Ridge Rd;Autauga;AL;36067;LINESTRING(-86.474289 32.451625,-86.47427 32.449764)\r\n305;399;odd;Hunting Ridge Rd;Autauga;AL;36067;LINESTRING(-86.474094 32.451626,-86.474075 32.449765)\r\n501;599;all;Kerlin St;Autauga;AL;36066;LINESTRING(-86.443864 32.462182,-86.443842 32.461895,-86.443804 32.461469)\r\n1879;1871;all;Autauga County 85;Autauga;AL;36067;LINESTRING(-86.468612 32.535158,-86.468909 32.535411,-86.469246 32.535729,-86.469668 32.536177,-86.469721 32.536235)\r\n1700;1730;even;Twelve Oaks Ln;Autauga;AL;36066;LINESTRING(-86.425176 32.463318,-86.42506 32.46331,-86.424808 32.46328,-86.424554 32.463254,-86.424307 32.463222,-86.424141 32.463192,-86.423883 32.463156,-86.423706 32.46315,-86.423448 32.463147,-86.423277 32.463149,-86.423133 32.46319,-86.423028 32.463279,-86.422959 32.463366,-86.422913 32.46347,-86.422877 32.463593,-86.422883 32.463783,-86.42289 32.463914,-86.422927 32.46407,-86.422993 32.46418,-86.423089 32.464203)\r\n1701;1715;odd;Twelve Oaks Ln;Autauga;AL;36066;LINESTRING(-86.425167 32.463483,-86.42504 32.463482,-86.424782 32.463446,-86.424528 32.46342,-86.424271 32.463388,-86.424105 32.463358,-86.423861 32.463328,-86.4237 32.463318,-86.423454 32.463315,-86.423323 32.463331,-86.423253 32.463356,-86.423192 32.463397,-86.423149 32.46345,-86.423113 32.463522,-86.423091 32.463613,-86.423083 32.463777,-86.423096 32.463888,-86.423133 32.464002,-86.423161 32.464032,-86.423176 32.464056)\r\n537;533;all;Ashton Oak Dr;Autauga;AL;36066;LINESTRING(-86.420083 32.485691,-86.41998 32.485726,-86.419948 32.485804)\r\n100;198;even;Amanda Ln;Autauga;AL;36066;LINESTRING(-86.427379 32.446321,-86.427293 32.446165,-86.42727 32.446107,-86.427242 32.445979,-86.427236 32.445837,-86.427226 32.445787)\r\n101;199;odd;Amanda Ln;Autauga;AL;36066;LINESTRING(-86.427206 32.446395,-86.427101 32.446233,-86.427068 32.446151,-86.427034 32.445997,-86.427034 32.445847,-86.427033 32.445804)\r\n2300;2308;all;Maul Dr;Autauga;AL;36006;LINESTRING(-86.703828 32.676283,-86.703858 32.676338,-86.703974 32.676555,-86.704392 32.677213,-86.7046 32.677536)\r\n1121;1101;odd;Autauga County 42;Autauga;AL;36051;LINESTRING(-86.593582 32.614043,-86.593589 32.614042,-86.59357 32.613912,-86.593571 32.613775,-86.59359 32.613561,-86.593597 32.613412,-86.593596 32.613262,-86.593576 32.613112,-86.593549 32.612965,-86.593409 32.612398,-86.593368 32.612254,-86.593272 32.611974,-86.59322 32.611836,-86.593164 32.611698,-86.593114 32.611619)\r\n1104;1100;even;Autauga County 42;Autauga;AL;36051;LINESTRING(-86.593394 32.614086,-86.593383 32.614074,-86.593366 32.61392,-86.593369 32.613767,-86.593392 32.613551,-86.593401 32.61341,-86.593394 32.613272,-86.593378 32.613134,-86.593353 32.612995,-86.593215 32.612434,-86.593176 32.612298,-86.593082 32.612022,-86.593032 32.61189,-86.592976 32.611764,-86.592939 32.611691)\r\n1799;1793;odd;Tara Dr;Autauga;AL;36066;LINESTRING(-86.426166 32.453791,-86.426399 32.4538,-86.427 32.453801,-86.427087 32.453793)\r\n1798;1796;even;Tara Dr;Autauga;AL;36066;LINESTRING(-86.426173 32.453627,-86.426403 32.453632,-86.426992 32.453631,-86.427074 32.453629)\r\n1912;1932;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.580605 32.496541,-86.580686 32.496616,-86.580807 32.496732,-86.581365 32.497282,-86.582023 32.49795,-86.582232 32.498178,-86.582531 32.498529,-86.582619 32.498637,-86.582814 32.498891,-86.582894 32.499,-86.582991 32.499134,-86.583057 32.49923,-86.583069 32.499247)\r\n1909;1929;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.58075 32.496431,-86.58083 32.496506,-86.580955 32.496622,-86.581515 32.497174,-86.582177 32.497846,-86.58239 32.498078,-86.582695 32.498433,-86.582781 32.498547,-86.58298 32.498801,-86.58306 32.498912,-86.583163 32.499048,-86.583227 32.499148,-86.583238 32.499165)\r\n2300;2398;even;Autauga County 67;Autauga;AL;36006;LINESTRING(-86.699657 32.668468,-86.699652 32.668476,-86.699637 32.668542,-86.699591 32.668679,-86.699227 32.669494)\r\n2301;2409;odd;Autauga County 67;Autauga;AL;36006;LINESTRING(-86.699851 32.668484,-86.699854 32.6685,-86.699835 32.668582,-86.699785 32.668733,-86.699409 32.669553)\r\n1399;1033;odd;Durden Rd;Autauga;AL;36067;LINESTRING(-86.480657 32.496205,-86.480669 32.496201,-86.480811 32.496108,-86.48354 32.494143,-86.483589 32.494108)\r\n1098;1034;even;Durden Rd;Autauga;AL;36067;LINESTRING(-86.480548 32.496069,-86.480551 32.496065,-86.480685 32.495978,-86.483414 32.494017,-86.483463 32.493982)\r\n101;199;odd;Chimney Ridge;Autauga;AL;36067;LINESTRING(-86.479786 32.450313,-86.478772 32.449308,-86.478678 32.449257,-86.47859 32.449259,-86.478513 32.449246,-86.478469 32.449303,-86.478436 32.449326,-86.4784 32.449365,-86.478418 32.449415,-86.478417 32.449427,-86.478409 32.4495,-86.478528 32.450073,-86.478539 32.450106,-86.478551 32.450129,-86.478566 32.450143,-86.478575 32.45017,-86.478611 32.450204,-86.478669 32.450217,-86.478724 32.450246,-86.47947 32.450445,-86.479638 32.450495)\r\n198;110;even;Chimney Ridge;Autauga;AL;36067;LINESTRING(-86.479639 32.450421,-86.478628 32.449452,-86.478604 32.449443,-86.47858 32.449431,-86.478609 32.449444,-86.478615 32.449419,-86.47861 32.449432,-86.47863 32.449417,-86.478612 32.449415,-86.478613 32.449429,-86.478617 32.449488,-86.478728 32.450033,-86.478733 32.450044,-86.478733 32.450043,-86.478738 32.450055,-86.478749 32.450058,-86.478741 32.450048,-86.478759 32.450065,-86.478806 32.450082,-86.479534 32.450287,-86.479704 32.450341)\r\n1501;1599;odd;Montauga Rd;Autauga;AL;36067;LINESTRING(-86.50621 32.523944,-86.506247 32.523914,-86.506391 32.523798,-86.50652 32.52371,-86.506712 32.523596,-86.507221 32.523198,-86.507287 32.523069,-86.5073 32.522898,-86.50727 32.522707,-86.507249 32.522537,-86.507207 32.522189,-86.507075 32.522003,-86.506933 32.521727,-86.506895 32.521643)\r\n1500;1598;even;Montauga Rd;Autauga;AL;36067;LINESTRING(-86.506067 32.523833,-86.506103 32.523796,-86.506257 32.523668,-86.5064 32.523576,-86.50658 32.523462,-86.507035 32.523086,-86.507075 32.523017,-86.507106 32.5229,-86.507072 32.522727,-86.507053 32.522557,-86.506991 32.522249,-86.506893 32.522079,-86.506745 32.521789,-86.506711 32.521697)\r\n300;308;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.469862 32.454517,-86.469799 32.454429,-86.469632 32.454179,-86.469496 32.453992,-86.469416 32.453866)\r\n1799;1701;all;Miller Trce;Autauga;AL;36067;LINESTRING(-86.553073 32.455099,-86.553181 32.455245,-86.553302 32.455407,-86.553609 32.45571)\r\n301;399;all;Washington St;Autauga;AL;36003;LINESTRING(-86.659005 32.436177,-86.658996 32.436163,-86.658818 32.435894,-86.658783 32.435866)\r\n128;136;even;Shady Oak Ln;Autauga;AL;36066;LINESTRING(-86.435907 32.466279,-86.435906 32.465756,-86.435901 32.464818,-86.435895 32.464589)\r\n127;137;odd;Shady Oak Ln;Autauga;AL;36066;LINESTRING(-86.435713 32.46628,-86.435712 32.465756,-86.435705 32.46482,-86.435701 32.464592)\r\n845;801;odd;Stonewall Dr;Autauga;AL;36067;LINESTRING(-86.445959 32.452297,-86.446022 32.452254,-86.446054 32.452219)\r\n898;806;even;Stonewall Dr;Autauga;AL;36067;LINESTRING(-86.445829 32.452175,-86.445878 32.452132,-86.44591 32.452108)\r\n200;998;even;Peagler St;Autauga;AL;36067;LINESTRING(-86.471539 32.434312,-86.47154 32.434254,-86.471533 32.434021,-86.471541 32.433663,-86.471566 32.433276)\r\n201;909;odd;Peagler St;Autauga;AL;36067;LINESTRING(-86.471344 32.434311,-86.471344 32.434256,-86.471337 32.434021,-86.471343 32.433657,-86.471372 32.433266)\r\n1065;1001;all;Walkers Lake Rd;Autauga;AL;36749;LINESTRING(-86.870182 32.571498,-86.870134 32.571434,-86.870008 32.571333,-86.86996 32.571284,-86.869716 32.57099,-86.869657 32.570929,-86.869594 32.57087,-86.869459 32.570769,-86.869176 32.570611,-86.869129 32.570572,-86.869115 32.57057)\r\n198;156;all;Melmar Dr;Autauga;AL;36067;LINESTRING(-86.483778 32.481943,-86.483804 32.481926,-86.484025 32.481825,-86.484261 32.481721,-86.484356 32.481696,-86.484497 32.481683,-86.484653 32.481691,-86.484668 32.481703)\r\n139;199;all;Indian Trl;Autauga;AL;36067;LINESTRING(-86.558198 32.432172,-86.558212 32.432442)\r\n500;598;even;Autauga County 101;Autauga;AL;36003;LINESTRING(-86.787254 32.493787,-86.787257 32.493865,-86.787248 32.494145,-86.787251 32.494438,-86.787285 32.495166,-86.78729 32.495454,-86.787278 32.495744,-86.787227 32.496394,-86.787173 32.496823,-86.787074 32.4974,-86.787036 32.497694,-86.787029 32.497844,-86.787028 32.49814,-86.787064 32.499162,-86.787069 32.500621,-86.787062 32.500986,-86.787059 32.501788,-86.787074 32.502376,-86.7871 32.502819,-86.787117 32.502971,-86.787172 32.503267,-86.787208 32.503413,-86.787334 32.50384,-86.787365 32.503981,-86.787384 32.504119,-86.787393 32.50426,-86.787393 32.504877)\r\n501;599;odd;Autauga County 101;Autauga;AL;36003;LINESTRING(-86.787448 32.493782,-86.787451 32.493865,-86.787444 32.494147,-86.787449 32.494434,-86.787483 32.495162,-86.787486 32.495456,-86.787476 32.495752,-86.787425 32.496408,-86.787369 32.496845,-86.78727 32.49742,-86.787236 32.497706,-86.787227 32.497848,-86.787226 32.498138,-86.787262 32.49916,-86.787265 32.500623,-86.787258 32.500988,-86.787255 32.501786,-86.787272 32.50237,-86.787298 32.502807,-86.787315 32.502949,-86.787368 32.503237,-86.787402 32.503375,-86.78753 32.503804,-86.787565 32.503955,-86.787586 32.504105,-86.787591 32.504256,-86.787588 32.504878)\r\n900;958;even;Silver Creek Cir;Autauga;AL;36066;LINESTRING(-86.433097 32.451662,-86.433207 32.452121,-86.433258 32.452269,-86.433294 32.452346,-86.433342 32.452419,-86.433402 32.452488,-86.433477 32.452552,-86.433566 32.4526,-86.433657 32.452636,-86.43375 32.452658,-86.434333 32.452777,-86.434509 32.452806,-86.434605 32.452804,-86.434699 32.452805,-86.434878 32.452784,-86.435046 32.452746,-86.435381 32.452687,-86.435471 32.452666,-86.435562 32.452641,-86.435651 32.452603,-86.435736 32.452558,-86.435814 32.4525,-86.435874 32.452433,-86.435929 32.452367,-86.435974 32.452294,-86.436012 32.452218,-86.436035 32.452134,-86.436098 32.451551,-86.436101 32.451467,-86.436087 32.45138,-86.436056 32.451301,-86.436018 32.451226,-86.435969 32.451154,-86.435906 32.451085,-86.435832 32.451022,-86.435744 32.450977,-86.43565 32.45094,-86.435549 32.450915,-86.435365 32.450904,-86.434842 32.450896,-86.434577 32.450899,-86.434496 32.450905)\r\n901;967;odd;Silver Creek Cir;Autauga;AL;36066;LINESTRING(-86.433287 32.451628,-86.433403 32.452079,-86.43345 32.452211,-86.43348 32.45227,-86.433516 32.452323,-86.43356 32.452372,-86.433611 32.452412,-86.433668 32.452446,-86.433733 32.452472,-86.433804 32.452494,-86.434375 32.452611,-86.434531 32.452632,-86.434605 32.45264,-86.434681 32.452633,-86.43484 32.452614,-86.435002 32.452584,-86.435333 32.452523,-86.435411 32.452504,-86.435482 32.452481,-86.435549 32.452453,-86.43561 32.452418,-86.435662 32.452378,-86.435712 32.452331,-86.435753 32.452277,-86.435788 32.452222,-86.435814 32.452164,-86.435831 32.452106,-86.435896 32.451541,-86.435895 32.451479,-86.435883 32.45142,-86.435864 32.451361,-86.435834 32.451304,-86.435797 32.451252,-86.435752 32.451203,-86.4357 32.451164,-86.435644 32.451131,-86.435578 32.451106,-86.435511 32.451091,-86.435353 32.451074,-86.434842 32.45106,-86.434585 32.451067,-86.434509 32.451069)\r\n499;401;odd;Woodvale Rd;Autauga;AL;36067;LINESTRING(-86.455519 32.473549,-86.455745 32.473173,-86.456034 32.472699)\r\n498;400;even;Woodvale Rd;Autauga;AL;36067;LINESTRING(-86.455345 32.473475,-86.455571 32.473097,-86.455862 32.472624)\r\n399;301;odd;Tuskegee St;Autauga;AL;36067;LINESTRING(-86.473445 32.477772,-86.473286 32.47777,-86.472508 32.47777,-86.472457 32.477773)\r\n398;300;even;Tuskegee St;Autauga;AL;36067;LINESTRING(-86.473443 32.477937,-86.473286 32.477936,-86.472512 32.477938,-86.472464 32.477938)\r\n1410;1560;even;Autauga County 85;Autauga;AL;36067;LINESTRING(-86.497442 32.513441,-86.49738 32.513542,-86.496779 32.514325,-86.496596 32.514572,-86.496428 32.514827,-86.496286 32.515094,-86.496221 32.515229,-86.49616 32.515367,-86.496054 32.515646,-86.495973 32.51593,-86.495913 32.516216,-86.495607 32.517928,-86.495517 32.518348,-86.495437 32.518626,-86.495388 32.518761,-86.495275 32.519028,-86.495143 32.519291,-86.49507 32.51942,-86.494993 32.519545,-86.494908 32.519668,-86.494727 32.51991,-86.494154 32.520628,-86.493193 32.521818,-86.493094 32.521931,-86.493035 32.521995)\r\n1201;1579;odd;Autauga County 85;Autauga;AL;36067;LINESTRING(-86.497619 32.513508,-86.497564 32.513628,-86.496945 32.514415,-86.496768 32.514658,-86.496608 32.514903,-86.496468 32.51516,-86.496405 32.515289,-86.496348 32.515421,-86.496248 32.515692,-86.496169 32.515966,-86.496107 32.516244,-86.495801 32.517954,-86.495713 32.518384,-86.495629 32.51867,-86.495578 32.518813,-86.495461 32.51909,-86.495325 32.519361,-86.495248 32.519496,-86.495165 32.519625,-86.49508 32.519756,-86.494891 32.520002,-86.494316 32.52072,-86.493355 32.521914,-86.493252 32.522035,-86.493186 32.5221)\r\n104;198;even;White Oak Dr;Autauga;AL;36067;LINESTRING(-86.473881 32.473917,-86.473726 32.473851,-86.473467 32.473769,-86.473193 32.473771,-86.472752 32.473798)\r\n101;199;odd;White Oak Dr;Autauga;AL;36067;LINESTRING(-86.473799 32.474066,-86.47365 32.474011,-86.473427 32.473953,-86.473197 32.473939,-86.472765 32.473963)\r\n1399;1301;all;Walter Ct;Autauga;AL;36067;LINESTRING(-86.50665 32.468517,-86.506912 32.468568)\r\n1399;1375;odd;Reds Ct;Autauga;AL;36067;LINESTRING(-86.418425 32.430394,-86.418431 32.430296)\r\n1398;1370;even;Reds Ct;Autauga;AL;36067;LINESTRING(-86.418231 32.430387,-86.418237 32.430289)\r\n1469;1517;all;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.416111 32.532942,-86.41631 32.532966,-86.417663 32.533067,-86.418 32.533082,-86.418503 32.533087,-86.418843 32.533074,-86.419945 32.532995,-86.420799 32.532911,-86.420922 32.532907)\r\n2;330;even;Hidden Valley Rd;Autauga;AL;36022;LINESTRING(-86.417759 32.503915,-86.417779 32.503902,-86.417909 32.503784,-86.417993 32.503632,-86.418003 32.503536,-86.418001 32.503445,-86.41797 32.503359,-86.417849 32.503154,-86.417205 32.502209,-86.41706 32.502025,-86.416946 32.501909,-86.416882 32.501853,-86.416813 32.501799,-86.41667 32.501712,-86.416447 32.501593,-86.415168 32.501007,-86.414933 32.500908,-86.414847 32.500877,-86.414679 32.500829,-86.414586 32.500808,-86.41447 32.500802)\r\n1;377;odd;Hidden Valley Rd;Autauga;AL;36022;LINESTRING(-86.41762 32.503799,-86.417631 32.503786,-86.417725 32.503684,-86.417783 32.503578,-86.417801 32.503528,-86.417791 32.503477,-86.417774 32.503423,-86.417671 32.503234,-86.417035 32.502299,-86.416896 32.502127,-86.416796 32.502023,-86.416742 32.501975,-86.416685 32.501933,-86.416556 32.501852,-86.416345 32.501739,-86.415076 32.501155,-86.414851 32.501062,-86.414777 32.501037,-86.414623 32.500993,-86.41455 32.50098,-86.414448 32.500965)\r\n1578;1598;all;Fuller Rd;Autauga;AL;36067;LINESTRING(-86.509083 32.538236,-86.509125 32.538391,-86.509216 32.538673,-86.509268 32.538811,-86.509309 32.538944,-86.509333 32.539076,-86.509339 32.539138,-86.509325 32.539274,-86.509303 32.539418)\r\n725;709;odd;Cranbrook Dr;Autauga;AL;36067;LINESTRING(-86.460642 32.448185,-86.461262 32.448184,-86.461518 32.44819,-86.461698 32.448192,-86.461793 32.448179,-86.461885 32.448161,-86.461979 32.448141,-86.462083 32.448108,-86.462102 32.448083)\r\n740;708;even;Cranbrook Dr;Autauga;AL;36067;LINESTRING(-86.460642 32.44802,-86.461264 32.448018,-86.46152 32.448024,-86.461682 32.448018,-86.461757 32.448011,-86.461837 32.447997,-86.461909 32.447977,-86.461969 32.44795,-86.46198 32.447954)\r\n100;198;even;Till Ct;Autauga;AL;36066;LINESTRING(-86.448724 32.469635,-86.448916 32.469723,-86.449674 32.470061,-86.449924 32.470134,-86.450037 32.470153,-86.45011 32.470146)\r\n101;199;odd;Till Ct;Autauga;AL;36066;LINESTRING(-86.448817 32.46949,-86.449008 32.469577,-86.449756 32.469899,-86.449978 32.469964,-86.450057 32.469975,-86.45011 32.469982)\r\n1500;1598;even;Monfee Rd;Autauga;AL;36067;LINESTRING(-86.503786 32.511048,-86.505859 32.511017,-86.507156 32.511008,-86.508021 32.510995,-86.50842 32.510977,-86.508449 32.510976,-86.509048 32.510981,-86.509723 32.510976,-86.509816 32.510973,-86.509909 32.510957,-86.510018 32.510932,-86.510039 32.510895)\r\n1541;1599;odd;Monfee Rd;Autauga;AL;36067;LINESTRING(-86.503782 32.510883,-86.505857 32.510851,-86.507154 32.510842,-86.508015 32.510827,-86.508412 32.510811,-86.508447 32.51081,-86.509048 32.510817,-86.509715 32.510806,-86.509788 32.510799,-86.509853 32.510787,-86.509894 32.510766,-86.509902 32.510779)\r\n100;198;even;William Ct;Autauga;AL;36066;LINESTRING(-86.44444 32.46644,-86.444422 32.466366,-86.444085 32.465403,-86.444083 32.465373,-86.444075 32.465366)\r\n101;199;odd;William Ct;Autauga;AL;36066;LINESTRING(-86.44425 32.466478,-86.444228 32.46641,-86.443869 32.465433,-86.443867 32.465349,-86.443889 32.465318)\r\n1552;1598;all;Kimberly Ln;Autauga;AL;36066;LINESTRING(-86.452687 32.529777,-86.452683 32.530117,-86.452695 32.530553,-86.452727 32.53099,-86.452729 32.53106)\r\n372;402;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.513188 32.56891,-86.51339 32.568906,-86.513714 32.568913,-86.514217 32.568943,-86.515568 32.569053,-86.516083 32.569084,-86.516601 32.569104,-86.516948 32.569111,-86.517471 32.569112,-86.51766 32.569109)\r\n411;427;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.513184 32.568746,-86.51339 32.568742,-86.513724 32.568745,-86.514233 32.568777,-86.515584 32.568887,-86.516095 32.568918,-86.516607 32.568938,-86.51695 32.568945,-86.517469 32.568946,-86.517658 32.568944)\r\n599;533;odd;Old Mill Way;Autauga;AL;36067;LINESTRING(-86.449411 32.428458,-86.449419 32.428453,-86.44945 32.428371,-86.449473 32.428328,-86.449541 32.42823,-86.449536 32.428226)\r\n598;534;even;Old Mill Way;Autauga;AL;36067;LINESTRING(-86.449219 32.428429,-86.449217 32.428407,-86.449262 32.428307,-86.449293 32.42825,-86.449367 32.428132,-86.449383 32.428125)\r\n2200;2274;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.601339 32.518438,-86.6032 32.519135,-86.603993 32.519425,-86.604312 32.519534,-86.604636 32.519637,-86.605448 32.519872,-86.605778 32.51996,-86.606276 32.520077,-86.607028 32.520234,-86.607706 32.520347,-86.608975 32.52055,-86.610666 32.52081,-86.611932 32.521014,-86.612877 32.521161)\r\n2189;2231;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.601418 32.518288,-86.603278 32.518983,-86.604069 32.519271,-86.604384 32.519378,-86.604702 32.519479,-86.60551 32.519714,-86.605834 32.5198,-86.606326 32.519915,-86.607072 32.52007,-86.607744 32.520185,-86.609011 32.520388,-86.610702 32.520648,-86.611968 32.520852,-86.612912 32.520999)\r\n1304;1360;even;US Hwy 31;Autauga;AL;36066;LINESTRING(-86.456165 32.502701,-86.456221 32.502931,-86.456329 32.503498,-86.456349 32.503638,-86.456374 32.50392,-86.456388 32.504209,-86.456385 32.50464,-86.456229 32.510555,-86.456228 32.510917,-86.456233 32.511067)\r\n1317;1359;odd;US Hwy 31;Autauga;AL;36067;LINESTRING(-86.456356 32.502667,-86.456417 32.502901,-86.456525 32.503474,-86.456547 32.503622,-86.456572 32.50391,-86.456586 32.504207,-86.456581 32.504642,-86.456425 32.510557,-86.456424 32.510915,-86.456428 32.511063)\r\n2369;2381;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.62555 32.523309,-86.625723 32.523391,-86.626017 32.523554,-86.626298 32.523728,-86.626689 32.52402,-86.628377 32.525365,-86.628467 32.525434)\r\n394;396;all;Golson Rd;Autauga;AL;36067;LINESTRING(-86.548311 32.463181,-86.54815 32.463292,-86.54791 32.463436)\r\n117;199;odd;Fox Run;Autauga;AL;36022;LINESTRING(-86.420244 32.626528,-86.419408 32.626524)\r\n122;198;even;Fox Run;Autauga;AL;36022;LINESTRING(-86.420243 32.626693,-86.419407 32.626689)\r\n1173;1101;odd;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.467832 32.488277,-86.468079 32.487798,-86.468203 32.487563)\r\n898;826;even;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.467654 32.488211,-86.467901 32.487732,-86.468026 32.487496)\r\n801;899;odd;Clay Dr;Autauga;AL;36067;LINESTRING(-86.667436 32.398688,-86.668007 32.398621,-86.668416 32.398482,-86.668806 32.398394,-86.669047 32.3983)\r\n800;898;even;Clay Dr;Autauga;AL;36067;LINESTRING(-86.667406 32.398526,-86.667951 32.398445,-86.668352 32.398318,-86.668738 32.398228,-86.66897 32.398149)\r\n890;700;all;Johnson St;Autauga;AL;36067;LINESTRING(-86.467415 32.437153,-86.467421 32.437207,-86.467411 32.437434,-86.467395 32.437647,-86.467403 32.437735)\r\n599;501;odd;Boxwood Rd;Autauga;AL;36067;LINESTRING(-86.455599 32.476348,-86.455589 32.475765,-86.455595 32.475554,-86.455618 32.475422,-86.455637 32.475363,-86.455734 32.475171,-86.455895 32.47492,-86.456005 32.474723,-86.456083 32.474598,-86.456209 32.47441,-86.45635 32.474179)\r\n598;500;even;Boxwood Rd;Autauga;AL;36067;LINESTRING(-86.455404 32.476351,-86.455393 32.475767,-86.455387 32.475542,-86.455414 32.475384,-86.455445 32.475303,-86.455552 32.475095,-86.455717 32.474842,-86.455829 32.474649,-86.455909 32.474518,-86.456035 32.47433,-86.456177 32.474103)\r\n2904;2936;all;State Rte 14;Autauga;AL;36003;LINESTRING(-86.679411 32.434645,-86.679516 32.434741,-86.679756 32.434948,-86.679873 32.435057,-86.680125 32.435262,-86.680388 32.435458,-86.680653 32.435643,-86.680927 32.435825,-86.681209 32.435996,-86.681499 32.436158,-86.681796 32.43631,-86.682249 32.436521,-86.683157 32.43693,-86.684024 32.437314)\r\n1799;1729;all;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.58469 32.502775,-86.581685 32.503441,-86.58102 32.503586,-86.580525 32.503685,-86.580348 32.503713)\r\n100;198;even;Sandy Ct;Autauga;AL;36067;LINESTRING(-86.46942 32.470594,-86.469321 32.470558,-86.469255 32.470542)\r\n101;199;odd;Sandy Ct;Autauga;AL;36067;LINESTRING(-86.469349 32.470747,-86.469253 32.470718,-86.469194 32.470699)\r\n772;758;all;2nd St;Autauga;AL;36703;LINESTRING(-86.79695 32.374798,-86.796939 32.374877,-86.796582 32.376657)\r\n345;347;odd;Bozie Rd;Autauga;AL;36022;LINESTRING(-86.428357 32.526653,-86.428224 32.526665,-86.427907 32.526711,-86.427563 32.52677,-86.42735 32.526867,-86.427311 32.527142,-86.427146 32.52754,-86.427044 32.527732,-86.426951 32.527988,-86.42696 32.529097)\r\n300;374;even;Bozie Rd;Autauga;AL;36022;LINESTRING(-86.428381 32.526816,-86.428254 32.526831,-86.427947 32.526877,-86.427645 32.526944,-86.427564 32.526991,-86.427517 32.527186,-86.427332 32.527602,-86.427238 32.527792,-86.427169 32.528014,-86.427155 32.529098)\r\n105;101;odd;Buckner St;Autauga;AL;36066;LINESTRING(-86.445886 32.467244,-86.445886 32.466543,-86.445872 32.466391,-86.44586 32.466357)\r\n108;100;even;Buckner St;Autauga;AL;36066;LINESTRING(-86.445691 32.467245,-86.445684 32.466551,-86.44567 32.466413,-86.445669 32.466387)\r\n199;151;odd;Livingston Cir;Autauga;AL;36066;LINESTRING(-86.44978 32.477286,-86.449784 32.477494,-86.449784 32.477931,-86.449788 32.477978)\r\n198;150;even;Livingston Cir;Autauga;AL;36066;LINESTRING(-86.449975 32.477283,-86.44998 32.477492,-86.449982 32.477927,-86.449982 32.477971)\r\n2601;2613;all;Hanna Dr;Autauga;AL;36022;LINESTRING(-86.484277 32.637053,-86.484012 32.636994,-86.483053 32.636768)\r\n1812;1898;all;Riverton Dr;Autauga;AL;36066;LINESTRING(-86.42011 32.488366,-86.420335 32.488339,-86.420672 32.488323,-86.420844 32.488306)\r\n198;140;all;Quail Run;Autauga;AL;36067;LINESTRING(-86.478413 32.455569,-86.478102 32.455583,-86.47776 32.455572,-86.477595 32.455575,-86.477513 32.45557)\r\n330;334;even;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.476826 32.541172,-86.477086 32.541283,-86.477232 32.541336)\r\n323;331;odd;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.476912 32.541025,-86.47717 32.541131,-86.477311 32.541185)\r\n2352;2398;even;Autauga County 66;Autauga;AL;36067;LINESTRING(-86.497024 32.598163,-86.49747 32.598166,-86.497549 32.598171,-86.497716 32.598194,-86.497878 32.598229,-86.498455 32.598382,-86.498791 32.598458,-86.499126 32.598524,-86.499547 32.598588,-86.500059 32.598639,-86.500482 32.59868,-86.50074 32.598693,-86.500923 32.598693,-86.501101 32.598663,-86.501193 32.598641,-86.501359 32.598583,-86.501731 32.59843,-86.5018 32.59841,-86.501954 32.598382,-86.502114 32.598369,-86.502802 32.598376,-86.503064 32.598368,-86.50324 32.598351,-86.503416 32.598326,-86.503998 32.598195,-86.504244 32.598149,-86.504407 32.598126,-86.50474 32.598097,-86.505642 32.59805,-86.506236 32.598064,-86.506491 32.598084,-86.506656 32.598106,-86.506904 32.598152,-86.507146 32.598213,-86.507382 32.598286,-86.507639 32.598378)\r\n2319;2499;odd;Autauga County 66;Autauga;AL;36067;LINESTRING(-86.497024 32.597998,-86.497476 32.597996,-86.497573 32.598001,-86.497758 32.598026,-86.497934 32.598067,-86.498511 32.59822,-86.498839 32.598296,-86.499166 32.598358,-86.499577 32.59842,-86.500081 32.598475,-86.5005 32.598512,-86.500744 32.598527,-86.500901 32.598517,-86.501055 32.598495,-86.501127 32.598477,-86.501277 32.598427,-86.501651 32.598272,-86.501742 32.598242,-86.501924 32.598208,-86.502108 32.598199,-86.502798 32.59821,-86.503048 32.598198,-86.503212 32.598183,-86.503372 32.598158,-86.503952 32.598033,-86.504206 32.597985,-86.504379 32.597958,-86.504724 32.597929,-86.505638 32.597882,-86.506248 32.597894,-86.506515 32.597916,-86.506694 32.597938,-86.506954 32.597988,-86.50721 32.598051,-86.507458 32.598128,-86.507718 32.598228)\r\n778;898;even;S McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.41823 32.457364,-86.418232 32.456691)\r\n701;799;odd;S McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.418035 32.457363,-86.418037 32.45669)\r\n132;140;even;Country Club Dr;Autauga;AL;36067;LINESTRING(-86.47127 32.44146,-86.471269 32.441569,-86.471287 32.442004,-86.471289 32.442094)\r\n133;199;odd;Country Club Dr;Autauga;AL;36067;LINESTRING(-86.471465 32.441459,-86.471467 32.441565,-86.471485 32.442002,-86.471483 32.442094)\r\n1671;1601;odd;Ole Country Rd;Autauga;AL;36022;LINESTRING(-86.429584 32.547772,-86.429514 32.547581,-86.42944 32.547322,-86.4294 32.546978,-86.429396 32.546502,-86.429386 32.544565)\r\n1674;1600;even;Ole Country Rd;Autauga;AL;36022;LINESTRING(-86.429399 32.547823,-86.429322 32.547627,-86.429234 32.547352,-86.429196 32.546986,-86.4292 32.546502,-86.429191 32.544566)\r\n1308;1380;even;Autauga County 51;Autauga;AL;36067;LINESTRING(-86.538665 32.503753,-86.538663 32.503785,-86.5387 32.504805,-86.538724 32.505748,-86.538725 32.506113,-86.53878 32.508151,-86.538799 32.509529,-86.53881 32.509967,-86.538828 32.510117,-86.538861 32.510265,-86.538906 32.510411,-86.539179 32.511102,-86.539475 32.511934,-86.539785 32.512764,-86.539976 32.513247,-86.540335 32.514044)\r\n1345;1399;odd;Autauga County 51;Autauga;AL;36067;LINESTRING(-86.53886 32.50376,-86.538859 32.503785,-86.538896 32.504801,-86.53892 32.505746,-86.538921 32.506111,-86.538976 32.508149,-86.538995 32.509525,-86.539012 32.509957,-86.539028 32.510093,-86.539057 32.510229,-86.539098 32.510363,-86.539367 32.511052,-86.539663 32.511886,-86.539971 32.512712,-86.540162 32.513191,-86.540517 32.513985)\r\n246;240;all;Teri Ln;Autauga;AL;36066;LINESTRING(-86.427043 32.448116,-86.427037 32.447578,-86.42704 32.447441)\r\n1700;1702;all;E Bank Rd;Autauga;AL;36067;LINESTRING(-86.505346 32.540471,-86.505296 32.540534,-86.505182 32.540637,-86.505119 32.540731,-86.50512 32.540857,-86.50521 32.540955,-86.505399 32.54102,-86.505567 32.541067,-86.505719 32.54112,-86.505791 32.541148,-86.505936 32.541218,-86.506071 32.541295,-86.506133 32.541336,-86.506254 32.541431,-86.506309 32.54148,-86.50641 32.541585,-86.506469 32.541651)\r\n1101;1199;all;Pates Mill Ln;Autauga;AL;36067;LINESTRING(-86.500667 32.477739,-86.500688 32.477704,-86.50098 32.477585,-86.501256 32.47749,-86.501578 32.477459,-86.501835 32.477448,-86.502027 32.477325,-86.503024 32.476778,-86.503086 32.476742)\r\n699;601;all;Autauga County 121;Autauga;AL;36022;LINESTRING(-86.42785 32.647799,-86.427854 32.648124,-86.427817 32.649702,-86.427817 32.651438,-86.427805 32.652018,-86.427807 32.652453,-86.427805 32.65254)\r\n138;198;even;Teri Ln;Autauga;AL;36066;LINESTRING(-86.431645 32.446269,-86.431181 32.446271,-86.431025 32.44627)\r\n135;199;odd;Teri Ln;Autauga;AL;36066;LINESTRING(-86.431647 32.446433,-86.431181 32.446437,-86.431022 32.446434)\r\n2499;2431;all;Hollon Run Rd;Autauga;AL;36067;LINESTRING(-86.511862 32.601442,-86.511857 32.601465,-86.511919 32.601518,-86.512 32.601571,-86.512089 32.601616,-86.512185 32.60164,-86.512521 32.601707,-86.512591 32.601728,-86.512729 32.601786,-86.512845 32.601862,-86.512932 32.601956,-86.51298 32.602059,-86.512979 32.602171,-86.512936 32.602291,-86.512905 32.60235,-86.512821 32.602469,-86.512726 32.602576,-86.51249 32.602787,-86.512377 32.602919,-86.512317 32.603084,-86.512322 32.603252,-86.512375 32.603405,-86.512457 32.60361,-86.512496 32.603744,-86.51252 32.603878,-86.51253 32.604017,-86.51252 32.604371,-86.512499 32.604505,-86.512462 32.604636,-86.512404 32.604761,-86.512327 32.604873,-86.512229 32.604977,-86.512116 32.605077,-86.512101 32.60509)\r\n301;399;all;Oneal Ct;Autauga;AL;36003;LINESTRING(-86.665261 32.454197,-86.665285 32.454082,-86.665292 32.453925,-86.665283 32.453843,-86.665265 32.453745,-86.665252 32.453636,-86.66515 32.453542,-86.665001 32.453357,-86.664939 32.453256,-86.664923 32.453249,-86.664938 32.453261,-86.665172 32.452972,-86.665294 32.452854)\r\n1412;1458;even;Autauga County 161;Autauga;AL;36051;LINESTRING(-86.595848 32.596534,-86.595846 32.59657,-86.595839 32.597006,-86.595821 32.597439,-86.595759 32.598011,-86.595722 32.598135,-86.595658 32.59824,-86.595564 32.598326,-86.59544 32.598398,-86.594767 32.598699,-86.594617 32.598757,-86.594213 32.598886,-86.594041 32.598961,-86.593887 32.599079,-86.593842 32.599226)\r\n1419;1459;odd;Autauga County 161;Autauga;AL;36051;LINESTRING(-86.596043 32.596539,-86.596042 32.596574,-86.596035 32.59701,-86.596021 32.597449,-86.595963 32.598037,-86.595926 32.598195,-86.59584 32.598348,-86.595702 32.598468,-86.59554 32.598546,-86.594855 32.598849,-86.594697 32.598913,-86.594301 32.599044,-86.594171 32.599109,-86.594083 32.599187,-86.594025 32.599282)\r\n1501;1599;all;E Main St;Autauga;AL;36066;LINESTRING(-86.43397 32.460545,-86.428919 32.460603)\r\n1798;1792;all;Benson St;Autauga;AL;36066;LINESTRING(-86.418608 32.492457,-86.418618 32.491845)\r\n500;504;even;Jasmine Trl;Autauga;AL;36066;LINESTRING(-86.425412 32.467422,-86.425578 32.46743,-86.425735 32.46745,-86.425971 32.467507,-86.426034 32.467531,-86.426154 32.467591)\r\n501;507;odd;Jasmine Trl;Autauga;AL;36066;LINESTRING(-86.425416 32.467257,-86.425596 32.467256,-86.425779 32.46728,-86.426041 32.467341,-86.426134 32.467375,-86.426261 32.467453)\r\n2717;2737;all;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.489272 32.657655,-86.489293 32.658038,-86.489403 32.659188)\r\n100;198;even;Red Berry Ct;Autauga;AL;36067;LINESTRING(-86.53538 32.523341,-86.535403 32.523356,-86.535479 32.523391,-86.535545 32.523426,-86.535674 32.523511,-86.535723 32.523555,-86.53581 32.523659,-86.535875 32.523777,-86.535922 32.523907,-86.535975 32.524115,-86.536 32.524259,-86.536021 32.524326,-86.536039 32.5244)\r\n101;199;odd;Red Berry Ct;Autauga;AL;36067;LINESTRING(-86.535481 32.523201,-86.535501 32.523208,-86.535581 32.523241,-86.535661 32.523286,-86.535808 32.523379,-86.535885 32.523437,-86.535994 32.523571,-86.536073 32.523717,-86.536116 32.523867,-86.536171 32.524083,-86.5362 32.524223,-86.536221 32.524292,-86.536231 32.524376)\r\n136;152;even;Patrick St;Autauga;AL;36067;LINESTRING(-86.455807 32.452579,-86.456755 32.452564,-86.457004 32.45256)\r\n137;149;odd;Patrick St;Autauga;AL;36067;LINESTRING(-86.455803 32.452414,-86.456751 32.4524,-86.457 32.452395)\r\n210;298;even;Spruce St;Autauga;AL;36067;LINESTRING(-86.480384 32.454461,-86.480376 32.453896,-86.480382 32.453463)\r\n207;299;odd;Spruce St;Autauga;AL;36067;LINESTRING(-86.48019 32.454463,-86.480182 32.453896,-86.480187 32.453462)\r\n193;159;odd;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.831986 32.459738,-86.832149 32.461613,-86.832188 32.461977,-86.832212 32.462239)\r\n192;166;even;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.83218 32.459726,-86.832345 32.461599,-86.832382 32.461963,-86.832406 32.462227)\r\n2699;2601;odd;State Rte 14;Autauga;AL;36003;LINESTRING(-86.656882 32.431458,-86.656669 32.431493,-86.65633 32.431568,-86.65616 32.431613,-86.65583 32.431719,-86.65567 32.431784)\r\n2698;2600;even;State Rte 14;Autauga;AL;36003;LINESTRING(-86.656921 32.431619,-86.656715 32.431657,-86.656386 32.43173,-86.656226 32.431773,-86.655908 32.431875,-86.655751 32.431934)\r\n278;288;all;Autauga County 33;Autauga;AL;36003;LINESTRING(-86.744032 32.469296,-86.743967 32.469465,-86.743851 32.469736,-86.743658 32.470139,-86.743593 32.470261)\r\n799;701;all;W 4th St;Autauga;AL;36067;LINESTRING(-86.495306 32.465985,-86.494956 32.465871)\r\n1500;1504;even;Clear Branch Rd;Autauga;AL;36022;LINESTRING(-86.418392 32.507154,-86.418828 32.507143)\r\n101;199;odd;Clear Branch Rd;Autauga;AL;36022;LINESTRING(-86.418386 32.506989,-86.418822 32.506978)\r\n1000;1026;all;Loren St;Autauga;AL;36067;LINESTRING(-86.462958 32.428034,-86.462975 32.427927,-86.462932 32.427566,-86.462902 32.427275,-86.462869 32.427053)\r\n201;205;all;Seaside Rd;Autauga;AL;36003;LINESTRING(-86.65891 32.448212,-86.659045 32.448387,-86.659486 32.448925,-86.65979 32.449275,-86.660433 32.449977)\r\n899;801;all;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.469832 32.478546,-86.469849 32.478511,-86.469971 32.47825,-86.470113 32.477996,-86.470547 32.477296,-86.470625 32.477165,-86.470694 32.477026,-86.47075 32.476886,-86.470787 32.476778)\r\n799;701;odd;Clifton Dr;Autauga;AL;36067;LINESTRING(-86.571635 32.579763,-86.571568 32.579732,-86.571488 32.579711,-86.571347 32.579655,-86.571198 32.57957,-86.571094 32.579543,-86.570827 32.579524,-86.570561 32.579488)\r\n700;798;even;Clifton Dr;Autauga;AL;36067;LINESTRING(-86.571555 32.579913,-86.571498 32.579898,-86.57141 32.579881,-86.571247 32.579803,-86.571106 32.579736,-86.57105 32.579719,-86.570799 32.579692,-86.570528 32.57965)\r\n1100;1198;even;Mary Dr;Autauga;AL;36066;LINESTRING(-86.443742 32.46126,-86.443716 32.461258,-86.443475 32.461239,-86.443231 32.461209,-86.443161 32.461194,-86.443089 32.461174,-86.442785 32.461058,-86.442562 32.460962,-86.442351 32.460858,-86.442256 32.460789,-86.442215 32.46074,-86.442192 32.460696,-86.442166 32.460567,-86.442159 32.460512)\r\n1101;1199;odd;Mary Dr;Autauga;AL;36066;LINESTRING(-86.443746 32.461425,-86.443708 32.461428,-86.443453 32.461405,-86.443195 32.461379,-86.443101 32.461362,-86.443013 32.461332,-86.442699 32.46121,-86.44247 32.46111,-86.442233 32.461006,-86.442096 32.460917,-86.442019 32.460826,-86.441988 32.46074,-86.441958 32.460583,-86.441964 32.460513)\r\n1400;1422;even;Mims Ln;Autauga;AL;36066;LINESTRING(-86.449404 32.515504,-86.449386 32.515527,-86.449401 32.515968,-86.449416 32.516365)\r\n1401;1423;odd;Mims Ln;Autauga;AL;36066;LINESTRING(-86.449592 32.515546,-86.449602 32.515549,-86.449597 32.515964,-86.449611 32.51636)\r\n1384;1670;all;S McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.418092 32.439978,-86.418095 32.43988,-86.418077 32.436978,-86.418036 32.433328,-86.418036 32.433307)\r\n600;602;even;Blakeley;Autauga;AL;36066;LINESTRING(-86.414598 32.444235,-86.414614 32.444013,-86.414547 32.443771,-86.41446 32.443569,-86.414415 32.443445)\r\n601;605;odd;Blakeley;Autauga;AL;36066;LINESTRING(-86.414404 32.44423,-86.414404 32.444031,-86.414349 32.443819,-86.414268 32.443621,-86.414228 32.44349)\r\n199;129;all;Gray Dr;Autauga;AL;36067;LINESTRING(-86.474353 32.444955,-86.473495 32.444615)\r\n186;190;even;Barkley;Autauga;AL;36066;LINESTRING(-86.424361 32.494694,-86.424371 32.494423,-86.424332 32.494305,-86.424292 32.494201,-86.424204 32.494062,-86.424146 32.494009)\r\n101;193;odd;Barkley;Autauga;AL;36066;LINESTRING(-86.424167 32.494694,-86.424157 32.494445,-86.424136 32.494353,-86.4241 32.494273,-86.424028 32.49416,-86.423992 32.494111)\r\n300;398;even;S Washington St;Autauga;AL;36067;LINESTRING(-86.470053 32.459389,-86.470077 32.459242,-86.470196 32.458204,-86.470202 32.458151)\r\n301;399;odd;S Washington St;Autauga;AL;36067;LINESTRING(-86.46986 32.459368,-86.469881 32.459222,-86.47 32.458186,-86.470009 32.458132)\r\n2201;2299;all;Bonnie Blue Rd;Autauga;AL;36067;LINESTRING(-86.585979 32.496548,-86.585971 32.496099,-86.585973 32.495675,-86.586095 32.495348,-86.586237 32.49486,-86.586811 32.49384,-86.587072 32.493177,-86.587824 32.492192,-86.588529 32.491333,-86.589288 32.490627)\r\n2464;2498;even;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.490199 32.619709,-86.490205 32.620119,-86.490221 32.620553,-86.490224 32.62084,-86.490218 32.621054,-86.490198 32.621337,-86.490156 32.621697,-86.490102 32.622053,-86.490044 32.622333,-86.489953 32.622686,-86.489796 32.623175,-86.489657 32.623547)\r\n2481;2599;odd;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.490394 32.619707,-86.490401 32.620115,-86.490417 32.620549,-86.49042 32.62084,-86.490416 32.62106,-86.490396 32.621351,-86.490352 32.621715,-86.490298 32.622077,-86.49024 32.622365,-86.490147 32.622726,-86.489986 32.623223,-86.489842 32.623598)\r\n198;100;even;Shenandoah Ct;Autauga;AL;36067;LINESTRING(-86.546841 32.580415,-86.545641 32.580419,-86.545041 32.580417,-86.544705 32.580429,-86.54459 32.580428,-86.544516 32.580426)\r\n101;199;odd;Shenandoah Ct;Autauga;AL;36067;LINESTRING(-86.546841 32.58058,-86.545641 32.580583,-86.545045 32.580585,-86.544709 32.580597,-86.544582 32.580598,-86.544501 32.58059)\r\n299;229;all;N Autauga St;Autauga;AL;36003;LINESTRING(-86.655306 32.433793,-86.655381 32.433885,-86.656011 32.434694)\r\n1227;1255;all;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.598024 32.563908,-86.598059 32.56397,-86.598212 32.564231,-86.598332 32.564423,-86.598501 32.564678,-86.598859 32.565187,-86.599029 32.565441,-86.599272 32.565824,-86.600098 32.567098,-86.60052 32.567728,-86.600681 32.567984,-86.600831 32.568255,-86.600967 32.568526,-86.601024 32.568665,-86.601074 32.568807,-86.601115 32.568953,-86.601172 32.569248,-86.601191 32.569397,-86.601202 32.569545,-86.601218 32.569839,-86.601225 32.570058,-86.601228 32.57047)\r\n1350;1372;even;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.517516 32.49441,-86.517845 32.497032,-86.517911 32.497465,-86.517969 32.497757,-86.517995 32.497862)\r\n1301;1393;odd;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.517709 32.494393,-86.518041 32.497012,-86.518107 32.497441,-86.518163 32.497727,-86.518186 32.49783)\r\n2800;2870;even;Autauga County 65;Autauga;AL;36091;LINESTRING(-86.557416 32.685235,-86.557395 32.685481,-86.557368 32.685689,-86.557318 32.685888,-86.557245 32.686087,-86.557126 32.686349,-86.557023 32.68654,-86.556905 32.686726,-86.55677 32.686903,-86.55662 32.687075,-86.556407 32.6873,-86.556018 32.687677,-86.555852 32.687842,-86.555745 32.687962,-86.555652 32.688093,-86.555613 32.68817,-86.555559 32.688318,-86.555524 32.688469,-86.555509 32.68862,-86.55551 32.688699,-86.555524 32.688847,-86.555564 32.689069,-86.555624 32.689285,-86.555799 32.689842,-86.555869 32.690118,-86.55592 32.690401,-86.555972 32.690761,-86.55602 32.690979,-86.556107 32.691265,-86.556325 32.691895,-86.556365 32.692101,-86.556356 32.692237,-86.556336 32.692381)\r\n2801;2871;odd;Autauga County 65;Autauga;AL;36091;LINESTRING(-86.557611 32.685247,-86.557591 32.685495,-86.557572 32.685715,-86.557516 32.685932,-86.557435 32.686143,-86.557312 32.686415,-86.557203 32.686614,-86.557081 32.686814,-86.556934 32.686999,-86.556778 32.687177,-86.556561 32.687408,-86.556168 32.687785,-86.55601 32.687946,-86.555915 32.688058,-86.555836 32.688173,-86.555805 32.68823,-86.555757 32.68836,-86.555726 32.688493,-86.555711 32.688626,-86.555712 32.688691,-86.555724 32.688827,-86.555762 32.689037,-86.555816 32.689245,-86.555993 32.689802,-86.556069 32.690088,-86.556114 32.690379,-86.55617 32.690735,-86.556216 32.690943,-86.556299 32.691221,-86.556527 32.691857,-86.556569 32.692091,-86.55656 32.692253,-86.556529 32.692405)\r\n2600;2698;even;Savannah Dr;Autauga;AL;36067;LINESTRING(-86.519893 32.444362,-86.518763 32.444414,-86.517908 32.444479,-86.517489 32.444495,-86.517226 32.444493)\r\n2601;2699;odd;Savannah Dr;Autauga;AL;36067;LINESTRING(-86.519904 32.444526,-86.518777 32.44458,-86.517922 32.444647,-86.517491 32.444661,-86.517224 32.444658)\r\n775;791;all;Stapleford Trce;Autauga;AL;36066;LINESTRING(-86.416656 32.471826,-86.416018 32.471957,-86.415908 32.472018,-86.415824 32.472077,-86.415782 32.472165,-86.415714 32.472259,-86.415659 32.472313,-86.415589 32.472366,-86.415519 32.472402,-86.415427 32.472433,-86.415276 32.472464,-86.415136 32.472449,-86.414854 32.472409,-86.41475 32.472391)\r\n300;398;all;Autauga County 102;Autauga;AL;36022;LINESTRING(-86.437291 32.583964,-86.437098 32.583961,-86.436932 32.583952,-86.436159 32.583954,-86.435645 32.583965,-86.43547 32.583976,-86.434966 32.584032,-86.434461 32.584062,-86.434332 32.584068)\r\n500;584;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.450937 32.46022,-86.45091 32.46001)\r\n1400;1498;all;Morningview Dr;Autauga;AL;36067;LINESTRING(-86.504011 32.461747,-86.504016 32.46184,-86.504018 32.461861)\r\n300;398;all;Robinson St;Autauga;AL;36067;LINESTRING(-86.46715 32.437101,-86.467014 32.437091,-86.466081 32.437101,-86.465232 32.437088,-86.464978 32.437098,-86.464978 32.437095)\r\n5299;3201;odd;Autauga County 84;Autauga;AL;36006;LINESTRING(-86.708684 32.632092,-86.708677 32.632243,-86.708663 32.632448,-86.708612 32.632949,-86.708594 32.633244,-86.708596 32.633391,-86.708639 32.633892,-86.708673 32.635903,-86.708662 32.63604,-86.708636 32.636174,-86.708597 32.636308)\r\n5298;4400;even;Autauga County 84;Autauga;AL;36006;LINESTRING(-86.708879 32.632097,-86.708875 32.632251,-86.708861 32.63246,-86.70881 32.632961,-86.708792 32.633246,-86.708796 32.633383,-86.708839 32.633884,-86.708873 32.635907,-86.708864 32.636058,-86.708838 32.63621,-86.708785 32.636352)\r\n199;101;all;Autauga County 92;Autauga;AL;36066;LINESTRING(-86.462272 32.584002,-86.462602 32.583997,-86.463205 32.584011,-86.463886 32.584009,-86.464139 32.584016)\r\n1247;1201;odd;Plum St;Autauga;AL;36066;LINESTRING(-86.442003 32.465648,-86.442067 32.465643,-86.442657 32.465612,-86.443119 32.46561)\r\n1246;1200;even;Plum St;Autauga;AL;36066;LINESTRING(-86.441967 32.465486,-86.442043 32.465469,-86.442651 32.465444,-86.443119 32.465445)\r\n199;127;odd;Primrose Dr;Autauga;AL;36067;LINESTRING(-86.455928 32.472423,-86.455352 32.472177,-86.454511 32.47183,-86.453759 32.4715,-86.453477 32.47136,-86.453324 32.471234,-86.453266 32.471134,-86.453221 32.47094,-86.453208 32.470807,-86.453236 32.470611,-86.453269 32.470524,-86.453318 32.470438,-86.453345 32.470395)\r\n198;132;even;Primrose Dr;Autauga;AL;36067;LINESTRING(-86.455841 32.47257,-86.455266 32.472325,-86.454423 32.47198,-86.453667 32.471646,-86.453349 32.47151,-86.453138 32.471346,-86.453058 32.471188,-86.453017 32.47096,-86.453012 32.470805,-86.45302 32.470571,-86.453081 32.470452,-86.453144 32.470358,-86.453177 32.470313)\r\n1800;1840;even;US Hwy 31;Autauga;AL;36066;LINESTRING(-86.462737 32.564201,-86.463033 32.565093,-86.463556 32.566692,-86.463719 32.567255,-86.463741 32.567338)\r\n1801;1835;odd;US Hwy 31;Autauga;AL;36067;LINESTRING(-86.462924 32.564157,-86.463221 32.565049,-86.463748 32.56665,-86.463913 32.567219,-86.463932 32.567305)\r\n800;898;even;Live Oak;Autauga;AL;36067;LINESTRING(-86.47767 32.476821,-86.477672 32.476826,-86.477736 32.476844,-86.477895 32.476913,-86.478074 32.477027,-86.478147 32.477074,-86.47823 32.477114,-86.478318 32.477149,-86.478415 32.477172,-86.478511 32.477181,-86.478535 32.477179)\r\n101;199;odd;Live Oak;Autauga;AL;36067;LINESTRING(-86.47769 32.476657,-86.477706 32.476654,-86.477814 32.47667,-86.478011 32.476765,-86.478194 32.476893,-86.478257 32.476928,-86.478322 32.47696,-86.478388 32.476983,-86.478457 32.477,-86.478531 32.477011,-86.478548 32.477015)\r\n1615;1541;odd;Autauga County 24;Autauga;AL;36006;LINESTRING(-86.696237 32.668702,-86.695495 32.668968,-86.69518 32.669076,-86.694866 32.669169,-86.694592 32.669237,-86.694544 32.669248,-86.694223 32.669314,-86.693895 32.669364,-86.693564 32.669395,-86.693225 32.669412,-86.692886 32.669417,-86.692718 32.669413,-86.692551 32.669405,-86.692384 32.669391,-86.692048 32.669353,-86.691884 32.669328,-86.691468 32.669253,-86.688988 32.668756,-86.688156 32.668593,-86.686494 32.66826,-86.685656 32.668093,-86.685479 32.66807,-86.685216 32.668049,-86.684952 32.668047,-86.684774 32.668057,-86.684597 32.668076,-86.684423 32.668105,-86.684003 32.668202,-86.683836 32.668253,-86.683674 32.668311,-86.683518 32.668382,-86.683365 32.668454,-86.681369 32.669568,-86.679987 32.670352)\r\n1620;1500;even;Autauga County 24;Autauga;AL;36006;LINESTRING(-86.696314 32.668853,-86.695571 32.66912,-86.695252 32.669234,-86.694928 32.669329,-86.694652 32.669397,-86.6946 32.669414,-86.694263 32.669478,-86.693925 32.669532,-86.69358 32.669563,-86.693233 32.66958,-86.692886 32.669583,-86.69271 32.669581,-86.692535 32.669571,-86.692362 32.669557,-86.692016 32.669521,-86.691844 32.669492,-86.691424 32.669415,-86.688944 32.668916,-86.688112 32.668753,-86.68645 32.66842,-86.685618 32.668261,-86.685453 32.668238,-86.685206 32.668219,-86.684958 32.668215,-86.684794 32.668225,-86.684629 32.668244,-86.684469 32.668271,-86.684065 32.668364,-86.68391 32.668411,-86.68376 32.668465,-86.683614 32.668528,-86.683471 32.668598,-86.681477 32.669706,-86.680096 32.670488)\r\n1917;1999;all;Autauga County 112;Autauga;AL;36067;LINESTRING(-86.664282 32.605932,-86.664382 32.605997)\r\n4226;4298;all;Autauga County 88;Autauga;AL;36749;LINESTRING(-86.86744 32.536188,-86.867518 32.536215,-86.867851 32.5363,-86.868167 32.536393,-86.868314 32.53645,-86.868531 32.536554,-86.868817 32.536714,-86.868973 32.536787,-86.869137 32.536849,-86.869307 32.536898,-86.869562 32.536951,-86.870562 32.537139,-86.87072 32.537179,-86.870871 32.537228,-86.871018 32.537288,-86.871157 32.537359,-86.871287 32.53744,-86.871673 32.537726,-86.871813 32.53782,-86.871961 32.537905,-86.872118 32.537979,-86.872435 32.538102,-86.873236 32.53837,-86.873796 32.538547,-86.874276 32.538695,-86.875226 32.539019,-86.875472 32.539096,-86.875724 32.539158,-86.87598 32.539209,-86.876324 32.539253,-86.876753 32.539284,-86.877346 32.539321,-86.877676 32.539355,-86.877836 32.539382,-86.877995 32.539418,-86.878315 32.539508,-86.87926 32.539826,-86.880296 32.540161,-86.880757 32.540325,-86.880899 32.540386,-86.881043 32.540458,-86.881477 32.540694,-86.882129 32.541036,-86.882358 32.541135,-86.882514 32.541204,-86.882561 32.541217,-86.8826 32.541236,-86.882775 32.541281,-86.882873 32.541292,-86.883222 32.541304,-86.883735 32.541323,-86.884074 32.541346,-86.884237 32.541365,-86.884396 32.541396,-86.884552 32.541439,-86.884701 32.541492,-86.884845 32.541557,-86.885349 32.541825,-86.885484 32.541907,-86.885613 32.541996,-86.885667 32.542041,-86.885776 32.542145,-86.886139 32.542546,-86.886493 32.542956,-86.886715 32.543183,-86.886833 32.543296,-86.887028 32.543448,-86.887042 32.543455)\r\n761;799;all;Bel Ru Lndg;Autauga;AL;36067;LINESTRING(-86.590761 32.368927,-86.590656 32.368809,-86.590574 32.368541,-86.590502 32.368293,-86.590533 32.368036,-86.590676 32.367443)\r\n199;137;odd;Sycamore Dr;Autauga;AL;36066;LINESTRING(-86.44142 32.479179,-86.441441 32.479185,-86.442346 32.479185,-86.442858 32.479207,-86.443032 32.479204,-86.443289 32.479198)\r\n198;138;even;Sycamore Dr;Autauga;AL;36066;LINESTRING(-86.441338 32.47903,-86.441393 32.478995,-86.442352 32.479017,-86.442862 32.479039,-86.443028 32.479038,-86.443284 32.479033)\r\n399;301;odd;Summer Hill Rd;Autauga;AL;36067;LINESTRING(-86.460827 32.446119,-86.461138 32.446112,-86.462083 32.446121,-86.462432 32.44611,-86.462699 32.446091,-86.462878 32.446057,-86.463113 32.44599)\r\n316;300;even;Summer Hill Rd;Autauga;AL;36067;LINESTRING(-86.460821 32.445955,-86.461136 32.445946,-86.462081 32.445955,-86.462418 32.445942,-86.462667 32.445919,-86.462826 32.445891,-86.463053 32.445833)\r\n105;101;odd;Rosewood Dr;Autauga;AL;36066;LINESTRING(-86.437743 32.475561,-86.43878 32.475536,-86.438939 32.475533)\r\n108;100;even;Rosewood Dr;Autauga;AL;36066;LINESTRING(-86.437737 32.475396,-86.438776 32.475372,-86.438935 32.475369)\r\n1251;1249;all;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.418319 32.506193,-86.418315 32.506121)\r\n840;870;all;Autauga County 1;Autauga;AL;36749;LINESTRING(-86.815352 32.552342,-86.813427 32.553753)\r\n599;501;odd;Northington St;Autauga;AL;36067;LINESTRING(-86.465015 32.474626,-86.465085 32.474476,-86.465355 32.473945,-86.465396 32.47387)\r\n598;500;even;Northington St;Autauga;AL;36067;LINESTRING(-86.464833 32.474566,-86.464903 32.474412,-86.465173 32.473873,-86.465223 32.473796)\r\n899;801;odd;Wd Dr;Autauga;AL;36067;LINESTRING(-86.640292 32.535763,-86.64035 32.53575,-86.640421 32.535732,-86.640929 32.535674,-86.641447 32.535643,-86.64163 32.535629,-86.641816 32.535586,-86.641979 32.535501,-86.642078 32.535442,-86.642163 32.53537,-86.642253 32.535284,-86.642282 32.53525)\r\n898;800;even;Wd Dr;Autauga;AL;36067;LINESTRING(-86.640212 32.535613,-86.640284 32.535576,-86.640389 32.535566,-86.640909 32.535504,-86.641429 32.535475,-86.641588 32.535455,-86.641732 32.535418,-86.641867 32.535357,-86.641944 32.535308,-86.642017 32.535252,-86.642101 32.535174,-86.64213 32.535147)\r\n1839;1817;odd;Pendlebrook Dr;Autauga;AL;36066;LINESTRING(-86.421353 32.494794,-86.421362 32.494796,-86.421618 32.49484,-86.421965 32.494879,-86.422159 32.494885)\r\n1838;1816;even;Pendlebrook Dr;Autauga;AL;36066;LINESTRING(-86.421383 32.494631,-86.421396 32.494632,-86.42165 32.494672,-86.421983 32.494709,-86.42217 32.494721)\r\n3999;3931;odd;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.831616 32.600405,-86.831405 32.600472,-86.830922 32.600613,-86.830598 32.600694,-86.830434 32.600728,-86.83027 32.600757,-86.829938 32.600804,-86.829703 32.600827,-86.829506 32.600835)\r\n3998;3938;even;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.831686 32.600558,-86.831473 32.60063,-86.830982 32.600773,-86.83065 32.600856,-86.830478 32.600892,-86.830306 32.600921,-86.829968 32.60097,-86.829719 32.600999,-86.829512 32.601)\r\n798;700;all;Red Fox Hollow Rd;Autauga;AL;36051;LINESTRING(-86.544032 32.647798,-86.544025 32.647859,-86.543963 32.648092,-86.543923 32.648274,-86.543863 32.648465,-86.543713 32.649088,-86.54366 32.649241,-86.543591 32.649439,-86.543517 32.64959,-86.543398 32.649747,-86.543223 32.649953,-86.543068 32.650111,-86.543022 32.650139)\r\n1701;1799;odd;Willis Dr;Autauga;AL;36067;LINESTRING(-86.564107 32.528732,-86.564103 32.528686,-86.564086 32.528477,-86.56409 32.528332,-86.564083 32.528178,-86.564051 32.528023,-86.56399 32.527869,-86.56389 32.527731,-86.563718 32.527564,-86.56363 32.527452,-86.563478 32.527192,-86.56339 32.52706,-86.563301 32.526935,-86.563229 32.526813,-86.56318 32.526688,-86.563157 32.526558,-86.563155 32.52642,-86.563183 32.526137,-86.563215 32.526006,-86.563295 32.525806,-86.563426 32.52554,-86.563497 32.525411,-86.563574 32.525287,-86.56366 32.52517,-86.563759 32.525057,-86.563867 32.524953,-86.563985 32.524854,-86.564319 32.52462,-86.564433 32.524492,-86.564533 32.524365,-86.564707 32.524104,-86.564744 32.524023,-86.564773 32.523878,-86.564826 32.52376,-86.564909 32.523655,-86.565017 32.523559,-86.56521 32.523427,-86.56535 32.523346,-86.5655 32.523261,-86.565634 32.52315,-86.565837 32.522913,-86.565947 32.522813,-86.566142 32.52267,-86.566262 32.522552,-86.566274 32.52253)\r\n1798;1700;even;Willis Dr;Autauga;AL;36067;LINESTRING(-86.563918 32.528772,-86.563891 32.52871,-86.56389 32.528479,-86.563892 32.528336,-86.563879 32.528198,-86.563849 32.528069,-86.563796 32.527945,-86.56372 32.527835,-86.563556 32.52767,-86.563448 32.52754,-86.5633 32.52727,-86.563218 32.527144,-86.563127 32.527019,-86.563037 32.526883,-86.562974 32.526728,-86.562951 32.52657,-86.562955 32.526414,-86.562977 32.526113,-86.563017 32.525958,-86.563107 32.525746,-86.563244 32.525472,-86.563319 32.525337,-86.563398 32.525203,-86.563492 32.525074,-86.563601 32.524951,-86.563719 32.524835,-86.563849 32.524728,-86.564167 32.524494,-86.564269 32.524392,-86.564359 32.524277,-86.564517 32.52403,-86.56454 32.523975,-86.564571 32.523834,-86.56463 32.523676,-86.564747 32.523541,-86.564879 32.523429,-86.56509 32.523289,-86.565238 32.523208,-86.565366 32.523125,-86.565476 32.523034,-86.565679 32.522801,-86.565805 32.522689,-86.565996 32.522546,-86.5661 32.522446,-86.566115 32.522436)\r\n500;538;even;Pratt St;Autauga;AL;36067;LINESTRING(-86.4651 32.456265,-86.465216 32.455223)\r\n501;537;odd;Pratt St;Autauga;AL;36067;LINESTRING(-86.464907 32.456249,-86.465023 32.455207)\r\n108;198;even;Diane Dr;Autauga;AL;36066;LINESTRING(-86.437815 32.476645,-86.437773 32.476372,-86.437736 32.476086,-86.437712 32.475802,-86.437707 32.475657,-86.437701 32.4756)\r\n107;199;odd;Diane Dr;Autauga;AL;36066;LINESTRING(-86.437622 32.476666,-86.437579 32.476392,-86.437538 32.476102,-86.437512 32.47581,-86.437509 32.475665,-86.437507 32.475611)\r\n1810;1898;all;Wynford St;Autauga;AL;36066;LINESTRING(-86.419457 32.467209,-86.419232 32.467217,-86.418975 32.467211,-86.418282 32.467215)\r\n1699;1601;odd;Rambling Brook Ln;Autauga;AL;36066;LINESTRING(-86.425489 32.466464,-86.425851 32.466462,-86.426277 32.466468,-86.426452 32.466467,-86.426628 32.466459,-86.426808 32.466448,-86.427071 32.466389,-86.427399 32.466286,-86.427565 32.46623,-86.427649 32.466192,-86.427869 32.466064,-86.428136 32.465872,-86.428455 32.465637,-86.428654 32.465516,-86.42872 32.465483,-86.428774 32.465458)\r\n1698;1678;even;Rambling Brook Ln;Autauga;AL;36066;LINESTRING(-86.425487 32.4663,-86.425851 32.466296,-86.426277 32.466304,-86.426444 32.466299,-86.426612 32.466291,-86.426772 32.466274,-86.427011 32.466225,-86.427327 32.46613,-86.427477 32.466074,-86.427543 32.466044,-86.427747 32.465926,-86.428008 32.465746,-86.428327 32.465503,-86.428544 32.46537,-86.428626 32.465331,-86.428692 32.465309)\r\n1355;1369;all;Autauga County 43;Autauga;AL;36067;LINESTRING(-86.612853 32.581177,-86.612856 32.582528)\r\n2099;2001;all;Office St;Autauga;AL;36006;LINESTRING(-86.718709 32.658464,-86.718606 32.658596,-86.718279 32.659032,-86.717998 32.659392,-86.71764 32.659834,-86.717631 32.659851)\r\n699;633;odd;Mimosa Rd;Autauga;AL;36067;LINESTRING(-86.458807 32.479474,-86.458774 32.479396,-86.458725 32.479259,-86.458642 32.47905,-86.458543 32.478849,-86.458373 32.478419)\r\n698;632;even;Mimosa Rd;Autauga;AL;36067;LINESTRING(-86.458626 32.479535,-86.458582 32.479452,-86.458535 32.479309,-86.458454 32.47911,-86.458353 32.478909,-86.458188 32.47847)\r\n400;498;all;S Northington St;Autauga;AL;36067;LINESTRING(-86.467616 32.457712,-86.467691 32.457024,-86.467719 32.456815)\r\n1793;1701;odd;Nathan Dr;Autauga;AL;36067;LINESTRING(-86.702541 32.588648,-86.702559 32.588617,-86.702537 32.588386,-86.702521 32.587659,-86.702519 32.586932,-86.702502 32.585915,-86.702497 32.58569,-86.702473 32.585584,-86.702372 32.585496,-86.702251 32.585469,-86.702145 32.585465,-86.701796 32.585484,-86.701726 32.585478,-86.701678 32.585464,-86.701643 32.585442,-86.701613 32.585407,-86.701595 32.58536,-86.701583 32.585299,-86.701578 32.585084,-86.70158 32.584794,-86.701573 32.584429,-86.701538 32.583928,-86.701545 32.583863,-86.701565 32.583727,-86.701615 32.583523,-86.701639 32.583472,-86.701717 32.583361,-86.70171 32.583359)\r\n1700;1798;even;Nathan Dr;Autauga;AL;36067;LINESTRING(-86.702353 32.588603,-86.702347 32.588597,-86.702339 32.588392,-86.702325 32.587661,-86.702323 32.586934,-86.702304 32.585921,-86.702285 32.585718,-86.702265 32.585682,-86.702246 32.585664,-86.702205 32.585645,-86.702141 32.585633,-86.701802 32.585654,-86.7017 32.58566,-86.70158 32.585638,-86.701475 32.585572,-86.701413 32.585483,-86.701383 32.58539,-86.701385 32.585305,-86.701382 32.585084,-86.701384 32.584796,-86.701375 32.584435,-86.701342 32.583928,-86.701343 32.583847,-86.701369 32.583701,-86.701413 32.583477,-86.701445 32.583394,-86.701549 32.583257,-86.701561 32.583253)\r\n2024;2098;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.585856 32.505696,-86.586628 32.507714,-86.587426 32.509774,-86.587607 32.510255,-86.587773 32.510666,-86.588019 32.511211,-86.588257 32.511666,-86.588403 32.511884)\r\n2001;2107;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.586042 32.505645,-86.586814 32.507662,-86.587612 32.509724,-86.587793 32.510203,-86.587959 32.510608,-86.588203 32.511147,-86.588439 32.51159,-86.588574 32.511804)\r\n1699;1601;odd;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.553118 32.430876,-86.552457 32.430757,-86.551525 32.430624,-86.551268 32.43059,-86.550411 32.430499,-86.549895 32.430454,-86.549633 32.430435,-86.548943 32.430403,-86.548914 32.430404,-86.548423 32.430397,-86.545845 32.430388,-86.543267 32.43039,-86.539837 32.430381,-86.539594 32.430378)\r\n1698;1600;even;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.553078 32.431037,-86.552421 32.430921,-86.551493 32.430788,-86.55124 32.430756,-86.550389 32.430665,-86.549877 32.43062,-86.549619 32.430601,-86.548937 32.430571,-86.548912 32.43057,-86.548421 32.430563,-86.545845 32.430552,-86.543267 32.430554,-86.539835 32.430547,-86.53959 32.430543)\r\n100;198;even;Echlin Blvd;Autauga;AL;36067;LINESTRING(-86.477723 32.435834,-86.477727 32.43535,-86.477711 32.434382)\r\n299;225;odd;Echlin Blvd;Autauga;AL;36067;LINESTRING(-86.477529 32.435833,-86.477531 32.43535,-86.477517 32.434384)\r\n929;931;all;Fireside Dr;Autauga;AL;36067;LINESTRING(-86.480511 32.446215,-86.480166 32.446226,-86.479819 32.446227)\r\n135;125;odd;Sycamore Dr;Autauga;AL;36066;LINESTRING(-86.443581 32.479191,-86.443628 32.479191,-86.444149 32.479195,-86.444299 32.479176,-86.444447 32.479147,-86.444541 32.479078,-86.444614 32.479001,-86.444659 32.478905,-86.444662 32.478669,-86.444655 32.478324)\r\n136;126;even;Sycamore Dr;Autauga;AL;36066;LINESTRING(-86.443575 32.479026,-86.443626 32.479023,-86.444133 32.479019,-86.444255 32.479004,-86.444341 32.478975,-86.444387 32.47895,-86.444422 32.478909,-86.444441 32.478865,-86.444464 32.478665,-86.444461 32.478326)\r\n2312;2396;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.617678 32.521917,-86.62012 32.522297,-86.620541 32.522359,-86.62332 32.522802,-86.623819 32.522895,-86.624148 32.52297,-86.624311 32.523013,-86.62463 32.523111,-86.625021 32.523256,-86.625173 32.523319,-86.6252 32.523329)\r\n2301;2367;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.617713 32.521755,-86.620154 32.522135,-86.620575 32.522197,-86.62336 32.522638,-86.623867 32.522731,-86.624204 32.522808,-86.624375 32.522853,-86.624706 32.522953,-86.625105 32.523104,-86.625267 32.523169,-86.625296 32.523186)\r\n2010;2098;even;Vonica Rose St;Autauga;AL;36022;LINESTRING(-86.420289 32.509206,-86.421007 32.509193,-86.421177 32.509199,-86.421228 32.509202,-86.421286 32.509227,-86.421334 32.509263,-86.42136 32.509302,-86.421379 32.509349,-86.421375 32.509486,-86.421364 32.509549,-86.421347 32.509611,-86.421294 32.509742,-86.421196 32.509941,-86.420917 32.510465,-86.420817 32.510643)\r\n2011;2099;odd;Vonica Rose St;Autauga;AL;36022;LINESTRING(-86.420285 32.509042,-86.421009 32.509027,-86.421173 32.509031,-86.421268 32.509018,-86.421406 32.509071,-86.421502 32.509141,-86.421574 32.509234,-86.421585 32.509337,-86.421577 32.509498,-86.421568 32.509581,-86.421543 32.509661,-86.42148 32.509804,-86.421376 32.510007,-86.421095 32.510535,-86.420992 32.510714)\r\n501;545;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.45064 32.461196,-86.450625 32.460852,-86.450624 32.460813)\r\n1800;1898;even;High Valley Rd;Autauga;AL;36067;LINESTRING(-86.702212 32.591232,-86.702167 32.591248,-86.702074 32.591368,-86.701984 32.591522,-86.701952 32.59161,-86.701948 32.591785,-86.701986 32.591982,-86.701978 32.592081,-86.702001 32.592062,-86.701894 32.592086,-86.701755 32.592066,-86.701545 32.592042,-86.70133 32.592042,-86.701156 32.592077,-86.700941 32.592179,-86.70081 32.592259,-86.700698 32.592357,-86.700546 32.592509,-86.700409 32.592637,-86.700342 32.592716,-86.700216 32.592856,-86.700035 32.593023,-86.699866 32.593163,-86.699737 32.593284,-86.699498 32.593469,-86.699342 32.593573,-86.699109 32.59382,-86.699076 32.594038,-86.699073 32.594169,-86.69906 32.594319,-86.699051 32.594422,-86.699067 32.594544,-86.699309 32.59466,-86.699539 32.594662,-86.699695 32.594659,-86.699841 32.594603,-86.699968 32.594541,-86.700201 32.59446,-86.70033 32.594394,-86.700479 32.594306,-86.700653 32.59423,-86.700778 32.594196,-86.700934 32.594175,-86.700983 32.594195,-86.701204 32.594312,-86.701392 32.594454,-86.701632 32.594658,-86.701822 32.594844,-86.702084 32.594908,-86.702272 32.59494,-86.702464 32.594959,-86.702654 32.595009,-86.702704 32.595029)\r\n1801;1821;odd;High Valley Rd;Autauga;AL;36067;LINESTRING(-86.702331 32.591362,-86.702327 32.591378,-86.702254 32.591458,-86.702182 32.591586,-86.702166 32.59164,-86.702154 32.591775,-86.702194 32.591966,-86.70221 32.592167,-86.702097 32.592252,-86.701888 32.592254,-86.701727 32.592232,-86.701535 32.592214,-86.701358 32.592222,-86.701234 32.592249,-86.701051 32.592327,-86.700946 32.592393,-86.700846 32.592473,-86.700694 32.592617,-86.700565 32.592745,-86.7005 32.592814,-86.700374 32.592966,-86.700177 32.593141,-86.700012 32.593279,-86.699883 32.593406,-86.699628 32.593595,-86.699498 32.593697,-86.699325 32.5939,-86.699282 32.594056,-86.699271 32.594179,-86.699258 32.594327,-86.699261 32.594406,-86.699277 32.594418,-86.699379 32.594472,-86.699537 32.594496,-86.699641 32.594477,-86.699749 32.594445,-86.699876 32.594383,-86.700109 32.594302,-86.700218 32.59425,-86.700369 32.594154,-86.700573 32.59407,-86.700728 32.59402,-86.700952 32.594001,-86.701077 32.594025,-86.701334 32.594172,-86.70153 32.594334,-86.701772 32.594542,-86.701948 32.594676,-86.702138 32.59474,-86.702304 32.59477,-86.7025 32.594785,-86.70277 32.594833,-86.70284 32.594911)\r\n318;398;even;Camellia Dr;Autauga;AL;36067;LINESTRING(-86.461157 32.476225,-86.461218 32.47625,-86.461605 32.476412,-86.461734 32.476449,-86.461818 32.476455)\r\n315;399;odd;Camellia Dr;Autauga;AL;36067;LINESTRING(-86.461236 32.476075,-86.461302 32.476098,-86.461683 32.47625,-86.461784 32.476277,-86.46185 32.476292)\r\n1475;1491;all;Longview Heights Rd;Autauga;AL;36067;LINESTRING(-86.426256 32.435035,-86.426251 32.435027)\r\n1699;1601;odd;Ashwood Dr;Autauga;AL;36066;LINESTRING(-86.426504 32.467591,-86.426671 32.467508,-86.426805 32.467469,-86.427045 32.467452,-86.427387 32.467453,-86.427811 32.467441,-86.428104 32.467441)\r\n1698;1600;even;Ashwood Dr;Autauga;AL;36066;LINESTRING(-86.426397 32.467453,-86.426573 32.467346,-86.426761 32.467285,-86.427041 32.467284,-86.427385 32.467287,-86.427807 32.467273,-86.428105 32.467276)\r\n798;726;all;Elizabeth St;Autauga;AL;36067;LINESTRING(-86.488474 32.48881,-86.488461 32.488815,-86.488146 32.488828,-86.488081 32.488826)\r\n2001;2095;all;Autauga County 72;Autauga;AL;36006;LINESTRING(-86.703576 32.552299,-86.703615 32.552332,-86.703816 32.552572,-86.703958 32.552757,-86.704257 32.553201,-86.704457 32.553525,-86.70463 32.553861,-86.704922 32.554462,-86.704997 32.554583,-86.705039 32.554638,-86.705086 32.554689,-86.705196 32.55479,-86.705381 32.554933,-86.705509 32.555017,-86.705571 32.55505,-86.705639 32.555077,-86.705711 32.5551,-86.705871 32.555137,-86.706284 32.555206,-86.706618 32.555243,-86.706694 32.555249,-86.706769 32.555241,-86.706845 32.555232,-86.707013 32.555199,-86.707107 32.555181,-86.707214 32.555179,-86.707325 32.5552,-86.707421 32.555252,-86.707491 32.555317,-86.707543 32.555384,-86.707687 32.555568,-86.707856 32.555825,-86.708115 32.556283,-86.708234 32.556468,-86.708275 32.556515,-86.708322 32.556553,-86.708377 32.556585,-86.708441 32.556606,-86.708508 32.556622,-86.708755 32.556648,-86.709444 32.556689,-86.709714 32.556737,-86.709884 32.556812,-86.709949 32.556859)\r\n100;198;all;Merrill Ln;Autauga;AL;36022;LINESTRING(-86.483257 32.635634,-86.483346 32.635439,-86.483475 32.635236,-86.483632 32.635053,-86.483817 32.634893,-86.484022 32.634764,-86.484181 32.634693,-86.484375 32.634628,-86.484633 32.63457,-86.484903 32.634576,-86.485387 32.634421,-86.485784 32.634281,-86.486039 32.634139,-86.486727 32.633737,-86.486905 32.633635,-86.486939 32.633537,-86.486786 32.632251,-86.486766 32.631888,-86.48663 32.63164,-86.486551 32.631577)\r\n117;199;all;Thomas Ln;Autauga;AL;36067;LINESTRING(-86.476828 32.45373,-86.476761 32.453702,-86.47663 32.453595)\r\n343;101;odd;Autauga County 41;Autauga;AL;36067;LINESTRING(-86.557711 32.41068,-86.557774 32.411123,-86.557819 32.411413,-86.557877 32.411919,-86.55789 32.412134,-86.55789 32.412351,-86.557872 32.412638,-86.557837 32.412925,-86.557799 32.413139,-86.557728 32.413421,-86.557642 32.413701,-86.557542 32.413976,-86.557123 32.41501,-86.556963 32.415429,-86.556894 32.415641,-86.556839 32.415857,-86.556799 32.416078,-86.556765 32.416371,-86.556759 32.416589,-86.556761 32.416737,-86.556776 32.416958,-86.556808 32.417176,-86.556857 32.417384,-86.556872 32.417466,-86.55694 32.417682,-86.557042 32.417964,-86.55732 32.418656,-86.55742 32.418933,-86.557459 32.419071,-86.557494 32.419225,-86.557504 32.419282,-86.557534 32.419496,-86.557544 32.41964,-86.557542 32.41978,-86.557524 32.419994,-86.557478 32.420279,-86.557425 32.42049,-86.557311 32.420837,-86.555545 32.425717,-86.555336 32.426272,-86.555169 32.426682,-86.554929 32.427228,-86.5548 32.427493,-86.55466 32.427758,-86.554432 32.428144,-86.553948 32.428909,-86.553729 32.429304,-86.55366 32.429442,-86.553542 32.429717,-86.553382 32.430134,-86.553344 32.430267)\r\n298;100;even;Autauga County 41;Autauga;AL;36067;LINESTRING(-86.557904 32.410661,-86.557968 32.411103,-86.558015 32.411393,-86.558075 32.411907,-86.55809 32.41213,-86.558088 32.412355,-86.55807 32.41265,-86.558035 32.412947,-86.557995 32.413169,-86.557922 32.413459,-86.557832 32.413747,-86.55773 32.414028,-86.557309 32.415062,-86.557153 32.415477,-86.557088 32.415681,-86.557035 32.415887,-86.556997 32.416098,-86.556965 32.416381,-86.556955 32.416591,-86.556959 32.416731,-86.556976 32.416942,-86.557006 32.41715,-86.557049 32.417354,-86.557068 32.41743,-86.55713 32.417636,-86.55723 32.417912,-86.557508 32.418604,-86.557614 32.418889,-86.557655 32.419037,-86.557686 32.419195,-86.557702 32.419256,-86.557734 32.419482,-86.557742 32.419636,-86.557742 32.419786,-86.557724 32.420012,-86.557676 32.420309,-86.557621 32.42053,-86.557499 32.420885,-86.555731 32.425767,-86.555522 32.426324,-86.555355 32.426738,-86.555113 32.42729,-86.55498 32.427559,-86.55484 32.42783,-86.554606 32.42822,-86.554126 32.428985,-86.553911 32.429372,-86.553846 32.429504,-86.55373 32.429771,-86.553574 32.430182,-86.553532 32.430308)\r\n1492;1498;even;Longview Heights Rd;Autauga;AL;36067;LINESTRING(-86.426408 32.434925,-86.426404 32.434916,-86.426397 32.434905)\r\n1493;1499;odd;Longview Heights Rd;Autauga;AL;36067;LINESTRING(-86.426236 32.435001,-86.426228 32.43499,-86.426222 32.434978)\r\n1600;1610;even;Buena Vista Blvd;Autauga;AL;36067;LINESTRING(-86.449642 32.424557,-86.449611 32.424592,-86.449574 32.424677,-86.449524 32.424837,-86.449508 32.424915,-86.44948 32.425065,-86.44945 32.425221,-86.449435 32.425299,-86.449422 32.425365)\r\n1601;1613;odd;Buena Vista Blvd;Autauga;AL;36067;LINESTRING(-86.449811 32.424638,-86.449799 32.424668,-86.449768 32.424731,-86.44972 32.424875,-86.449702 32.424945,-86.449672 32.425091,-86.449644 32.425247,-86.449627 32.425327,-86.449613 32.425393)\r\n943;901;odd;Autauga County 20;Autauga;AL;36051;LINESTRING(-86.591936 32.652305,-86.589751 32.653013,-86.589549 32.65308)\r\n946;900;even;Autauga County 20;Autauga;AL;36051;LINESTRING(-86.592005 32.652459,-86.589821 32.653167,-86.589621 32.653233)\r\n800;826;even;Loder St;Autauga;AL;36067;LINESTRING(-86.452022 32.45712,-86.451904 32.456988,-86.451312 32.456364,-86.451265 32.456312)\r\n801;831;odd;Loder St;Autauga;AL;36067;LINESTRING(-86.451867 32.45722,-86.45175 32.457092,-86.451148 32.456466,-86.451104 32.456403)\r\n999;901;odd;Cooper Ave;Autauga;AL;36066;LINESTRING(-86.447591 32.462386,-86.44812 32.462389,-86.448307 32.462389,-86.44858 32.462322,-86.44861 32.462296)\r\n998;900;even;Cooper Ave;Autauga;AL;36066;LINESTRING(-86.447591 32.462222,-86.448116 32.462221,-86.448271 32.462209,-86.448492 32.462154,-86.448509 32.462156)\r\n699;601;odd;Old Autaugaville Rd;Autauga;AL;36067;LINESTRING(-86.488882 32.44943,-86.489076 32.448729)\r\n698;600;even;Old Autaugaville Rd;Autauga;AL;36067;LINESTRING(-86.488693 32.449392,-86.488887 32.448691)\r\n699;697;all;Yosemite Pkwy;Autauga;AL;36067;LINESTRING(-86.551912 32.576077,-86.551895 32.576077,-86.551029 32.576089,-86.550169 32.576092,-86.548396 32.576113,-86.548239 32.576123,-86.548177 32.576135,-86.54813 32.576155,-86.548101 32.57618,-86.54808 32.576214,-86.548065 32.576268,-86.548064 32.576482,-86.548075 32.576746)\r\n100;198;even;Grasmere Ct;Autauga;AL;36066;LINESTRING(-86.413986 32.471852,-86.414115 32.471661,-86.414385 32.471266,-86.414474 32.47117,-86.414566 32.471106,-86.414747 32.471033,-86.41485 32.471009,-86.414999 32.470993,-86.415709 32.470998)\r\n103;199;odd;Grasmere Ct;Autauga;AL;36066;LINESTRING(-86.413817 32.471771,-86.413945 32.471579,-86.414213 32.47117,-86.414318 32.471046,-86.414448 32.47095,-86.414681 32.470857,-86.414816 32.470845,-86.414985 32.470817,-86.415713 32.470834)\r\n1700;1808;even;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.604351 32.619207,-86.604399 32.621959,-86.604432 32.623405,-86.604477 32.625932,-86.604574 32.630548,-86.60457 32.630833,-86.604542 32.631117,-86.604518 32.631254,-86.604463 32.63149)\r\n1701;1797;odd;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.604546 32.619204,-86.604595 32.621957,-86.604628 32.623403,-86.604673 32.62593,-86.60477 32.630546,-86.604772 32.630841,-86.604742 32.631137,-86.604716 32.631284,-86.604654 32.631524)\r\n900;940;even;Gaddis Ave;Autauga;AL;36066;LINESTRING(-86.450593 32.461238,-86.450267 32.461243,-86.449163 32.461245,-86.449064 32.461244)\r\n901;941;odd;Gaddis Ave;Autauga;AL;36066;LINESTRING(-86.450597 32.461402,-86.450269 32.461409,-86.449159 32.461413,-86.449058 32.461408)\r\n303;301;odd;Abington St;Autauga;AL;36066;LINESTRING(-86.421036 32.467511,-86.420982 32.467565,-86.42076 32.467774,-86.420661 32.467856)\r\n300;200;even;Abington St;Autauga;AL;36066;LINESTRING(-86.421189 32.467612,-86.421136 32.467673,-86.420906 32.467894,-86.420793 32.467977)\r\n1299;1279;all;McCullough Rd;Autauga;AL;36749;LINESTRING(-86.864718 32.595394,-86.864723 32.595336,-86.864725 32.595231,-86.864641 32.595149,-86.864469 32.595014)\r\n440;498;all;Autauga County 101;Autauga;AL;36003;LINESTRING(-86.787648 32.489385,-86.787684 32.489752,-86.787687 32.48989,-86.787671 32.490027,-86.787639 32.490163,-86.787541 32.490441,-86.787459 32.490731,-86.787432 32.490878,-86.78739 32.49117,-86.787296 32.491897,-86.787253 32.492338,-86.787253 32.492444)\r\n1430;1456;all;Longview Heights Rd;Autauga;AL;36067;LINESTRING(-86.426281 32.436361,-86.426396 32.436338,-86.426569 32.436254,-86.426704 32.436109,-86.42672 32.435986,-86.426715 32.43582,-86.4267 32.435645,-86.426696 32.435522,-86.426647 32.435407,-86.426636 32.435376)\r\n258;298;all;Jay St;Autauga;AL;36066;LINESTRING(-86.422976 32.4485,-86.421367 32.448432)\r\n899;801;odd;Wilberforce Ave;Autauga;AL;36067;LINESTRING(-86.471634 32.478644,-86.471638 32.478474,-86.471642 32.477747,-86.471657 32.477533,-86.471714 32.47717,-86.471716 32.477089,-86.471716 32.477006,-86.471699 32.476924,-86.471672 32.476843,-86.471637 32.476756,-86.471575 32.476702)\r\n864;800;even;Wilberforce Ave;Autauga;AL;36067;LINESTRING(-86.471439 32.478641,-86.471442 32.478472,-86.471442 32.477741,-86.471457 32.477517,-86.471514 32.477154,-86.471522 32.477089,-86.471512 32.477026,-86.471499 32.476962,-86.471478 32.476899,-86.471447 32.476848,-86.471419 32.476801)\r\n1370;1398;even;Paula St;Autauga;AL;36067;LINESTRING(-86.457677 32.511902,-86.457631 32.511989,-86.457474 32.512339)\r\n1301;1375;odd;Paula St;Autauga;AL;36067;LINESTRING(-86.457856 32.511966,-86.457815 32.512051,-86.457656 32.512398)\r\n198;100;all;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.469463 32.481974,-86.469463 32.481958)\r\n2484;2482;even;Chancellor Ridge Rd;Autauga;AL;36066;LINESTRING(-86.417556 32.471249,-86.417608 32.471518,-86.417645 32.471602)\r\n2163;2161;odd;Chancellor Ridge Rd;Autauga;AL;36066;LINESTRING(-86.417747 32.47122,-86.417808 32.471476,-86.41783 32.471553)\r\n3600;3698;all;Rainbow Dr;Autauga;AL;36006;LINESTRING(-86.769154 32.608229,-86.769152 32.608259,-86.769223 32.608235,-86.769373 32.608222,-86.769589 32.608213,-86.769785 32.608205,-86.769963 32.608183,-86.770184 32.608173,-86.770345 32.608199,-86.770512 32.608248,-86.770839 32.608279,-86.770923 32.608292)\r\n198;100;even;Martin Hill Dr;Autauga;AL;36703;LINESTRING(-86.870041 32.472039,-86.870079 32.47214,-86.870316 32.472619,-86.870529 32.473021,-86.870609 32.473154,-86.870695 32.473285,-86.870828 32.473469,-86.870928 32.473593,-86.871248 32.473859,-86.87163 32.474163,-86.873271 32.475334,-86.873393 32.475431,-86.873506 32.475533,-86.873607 32.47564,-86.873698 32.475756,-86.873782 32.475879,-86.873942 32.476136,-86.874 32.47622)\r\n299;201;odd;Martin Hill Dr;Autauga;AL;36703;LINESTRING(-86.870225 32.471985,-86.870267 32.47208,-86.870498 32.472553,-86.870709 32.472949,-86.870785 32.473076,-86.870867 32.473199,-86.870996 32.473375,-86.871088 32.473479,-86.871386 32.473739,-86.871762 32.474037,-86.873403 32.475208,-86.873533 32.475311,-86.873658 32.475419,-86.873771 32.475538,-86.87387 32.475668,-86.873956 32.475799,-86.874116 32.476056,-86.874169 32.476139)\r\n705;703;all;English Hill Dr;Autauga;AL;36067;LINESTRING(-86.533678 32.465046,-86.533596 32.465099,-86.533342 32.465256,-86.532964 32.465429,-86.532685 32.465476)\r\n100;198;even;Dellwood Ct;Autauga;AL;36066;LINESTRING(-86.415691 32.454824,-86.415727 32.454829,-86.415879 32.454849,-86.416075 32.45491,-86.41612 32.454925)\r\n107;199;odd;Dellwood Ct;Autauga;AL;36066;LINESTRING(-86.415691 32.45466,-86.415739 32.454655,-86.415933 32.454671,-86.416163 32.454752,-86.416213 32.454781)\r\n216;398;even;Autauga County 104;Autauga;AL;36066;LINESTRING(-86.449492 32.570194,-86.449457 32.570003,-86.449419 32.569876,-86.44939 32.569787,-86.449356 32.569708,-86.449306 32.569631,-86.449239 32.569565,-86.449163 32.569505,-86.449073 32.569463,-86.448981 32.56943,-86.448889 32.569412,-86.448798 32.569395,-86.448621 32.569375,-86.448108 32.569363,-86.44726 32.569347,-86.446581 32.569355,-86.445561 32.569361,-86.444966 32.569356,-86.444789 32.569359,-86.444612 32.569376,-86.444436 32.569408,-86.444266 32.569454,-86.443711 32.569637,-86.443556 32.569677,-86.443401 32.569704,-86.443329 32.569712,-86.443258 32.569706,-86.443192 32.569695,-86.443126 32.569677,-86.443062 32.569652,-86.443 32.569619,-86.442944 32.569581,-86.442891 32.569538,-86.44284 32.569488,-86.442794 32.569436,-86.442654 32.569258,-86.442411 32.568958,-86.442243 32.568787,-86.441705 32.568316,-86.441399 32.568065,-86.44129 32.567964,-86.441189 32.567855,-86.441102 32.567741,-86.44094 32.567488,-86.440753 32.56724,-86.440499 32.566945,-86.440293 32.566709,-86.440178 32.566597,-86.440112 32.566544,-86.439981 32.56644,-86.439903 32.566393,-86.43982 32.566351,-86.439656 32.566286,-86.439481 32.566245,-86.439388 32.566234,-86.439296 32.566224,-86.439119 32.566223,-86.43861 32.566266,-86.438354 32.566293,-86.437942 32.566368,-86.437698 32.566401,-86.437543 32.566414,-86.437385 32.566404,-86.43731 32.566395,-86.437156 32.566364,-86.437082 32.566345,-86.436931 32.566293,-86.436783 32.566233,-86.436639 32.566166,-86.435929 32.565781,-86.435456 32.565484,-86.435408 32.565454)\r\n239;327;odd;Autauga County 104;Autauga;AL;36066;LINESTRING(-86.4493 32.570222,-86.449259 32.570037,-86.449227 32.56992,-86.449198 32.569843,-86.449168 32.569784,-86.449132 32.569733,-86.449089 32.569687,-86.449037 32.569651,-86.448979 32.569619,-86.448913 32.569596,-86.448841 32.569576,-86.448764 32.569563,-86.448605 32.569547,-86.448102 32.569529,-86.44726 32.569513,-86.446583 32.569521,-86.445561 32.569525,-86.444968 32.569522,-86.444805 32.569529,-86.444646 32.569546,-86.444488 32.569574,-86.444332 32.569614,-86.443779 32.569797,-86.443608 32.569845,-86.443431 32.569876,-86.443333 32.56988,-86.443236 32.56988,-86.44314 32.569867,-86.443046 32.569839,-86.442962 32.569802,-86.442882 32.569759,-86.442808 32.569711,-86.442741 32.569654,-86.442682 32.569592,-86.44263 32.569532,-86.44249 32.569352,-86.442249 32.569062,-86.442093 32.568901,-86.441565 32.568434,-86.441257 32.568183,-86.441136 32.568076,-86.441023 32.567955,-86.440928 32.567827,-86.440766 32.567574,-86.440587 32.567334,-86.440341 32.567043,-86.440137 32.566817,-86.44003 32.566713,-86.439976 32.566666,-86.439851 32.566574,-86.439791 32.566537,-86.439726 32.566505,-86.439584 32.566452,-86.439435 32.566415,-86.43936 32.566402,-86.439284 32.566396,-86.439127 32.566395,-86.438632 32.566432,-86.438388 32.566461,-86.43798 32.566534,-86.437722 32.566571,-86.437545 32.56658,-86.437367 32.566574,-86.437274 32.566565,-86.4371 32.56653,-86.437012 32.566503,-86.436849 32.566449,-86.436691 32.566383,-86.436537 32.566312,-86.435813 32.565921,-86.43534 32.565616,-86.435293 32.565587)\r\n1100;1198;even;Alabama St;Autauga;AL;36067;LINESTRING(-86.485725 32.435212,-86.486007 32.435077,-86.486763 32.43474,-86.487513 32.434419,-86.487535 32.434405)\r\n1101;1199;odd;Alabama St;Autauga;AL;36067;LINESTRING(-86.485629 32.435069,-86.485913 32.434931,-86.486673 32.434592,-86.487417 32.434271,-86.487437 32.434264)\r\n199;101;odd;Chester St;Autauga;AL;36066;LINESTRING(-86.450024 32.46696,-86.449496 32.46673,-86.448825 32.466446,-86.448747 32.466406,-86.448563 32.466286,-86.448472 32.466191,-86.448404 32.466077,-86.448353 32.465952,-86.448299 32.465776)\r\n198;100;even;Chester St;Autauga;AL;36066;LINESTRING(-86.449935 32.467107,-86.449408 32.466878,-86.448739 32.466594,-86.448635 32.466558,-86.448411 32.466418,-86.448292 32.466287,-86.448208 32.466143,-86.448161 32.465996,-86.448111 32.465816)\r\n109;107;all;Sheila Blvd;Autauga;AL;36066;LINESTRING(-86.42938 32.443564,-86.429473 32.44356,-86.429643 32.443493,-86.429729 32.443452,-86.429871 32.443353,-86.429981 32.44325)\r\n754;796;even;Washington Ferry Rd;Autauga;AL;36067;LINESTRING(-86.464819 32.441532,-86.464841 32.440624)\r\n743;799;odd;Washington Ferry Rd;Autauga;AL;36067;LINESTRING(-86.464625 32.441529,-86.464647 32.440621)\r\n4209;4175;odd;State Rte 14;Autauga;AL;36067;LINESTRING(-86.867086 32.472956,-86.865054 32.473729)\r\n4208;4200;even;State Rte 14;Autauga;AL;36749;LINESTRING(-86.867166 32.473106,-86.865134 32.473879)\r\n608;622;even;Little Farm Rd;Autauga;AL;36066;LINESTRING(-86.417401 32.467319,-86.417386 32.467522,-86.417355 32.467641,-86.417253 32.46781,-86.417208 32.467865,-86.417101 32.467965,-86.416926 32.468109,-86.416808 32.468182,-86.416702 32.468226,-86.416603 32.468251,-86.416501 32.468263,-86.416193 32.468269)\r\n609;631;odd;Little Farm Rd;Autauga;AL;36066;LINESTRING(-86.417596 32.467325,-86.417592 32.46754,-86.417567 32.467703,-86.417429 32.467912,-86.417356 32.467973,-86.417247 32.468081,-86.417062 32.468241,-86.41692 32.468336,-86.416776 32.468394,-86.416645 32.468423,-86.416515 32.468439,-86.416193 32.468433)\r\n1989;1999;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.598577 32.437267,-86.598643 32.437266)\r\n507;501;odd;Bedford Ter;Autauga;AL;36066;LINESTRING(-86.439212 32.476244,-86.439242 32.476217,-86.439239 32.476074,-86.439236 32.475926,-86.439205 32.475563,-86.439201 32.475558)\r\n506;500;even;Bedford Ter;Autauga;AL;36066;LINESTRING(-86.439035 32.476177,-86.439022 32.476171,-86.439041 32.476072,-86.439036 32.475934,-86.439005 32.475581,-86.439008 32.475582)\r\n622;664;even;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.894176 32.552297,-86.894048 32.552462,-86.893786 32.552744,-86.892803 32.553656,-86.892633 32.553824,-86.892477 32.554006,-86.892379 32.554129,-86.892249 32.554324,-86.892169 32.554458,-86.892095 32.554592,-86.892027 32.55473,-86.891939 32.554938,-86.891845 32.555224,-86.891772 32.555511,-86.891398 32.557535)\r\n623;665;odd;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.894341 32.552384,-86.894216 32.552562,-86.89394 32.552854,-86.892953 32.553766,-86.892791 32.55393,-86.892641 32.554102,-86.892551 32.554219,-86.892425 32.554404,-86.892347 32.554532,-86.892277 32.55466,-86.892213 32.55479,-86.892131 32.55499,-86.892039 32.555264,-86.891968 32.555541,-86.891591 32.557561)\r\n1200;1278;even;Cooper Ave;Autauga;AL;36066;LINESTRING(-86.441677 32.462538,-86.44103 32.462571,-86.440864 32.462572,-86.440704 32.462563,-86.44048 32.462521,-86.440382 32.462478,-86.440306 32.462423,-86.440257 32.462377,-86.440252 32.462377)\r\n1223;1285;odd;Cooper Ave;Autauga;AL;36066;LINESTRING(-86.44169 32.462702,-86.441036 32.462741,-86.44086 32.46274,-86.44068 32.462739,-86.440402 32.462697,-86.44026 32.462626,-86.440154 32.462547,-86.440095 32.462479,-86.440092 32.462469)\r\n626;798;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.45084 32.459752,-86.450787 32.45962,-86.450659 32.459359,-86.45051 32.459093,-86.450181 32.458691)\r\n2122;2198;even;Maul Dr;Autauga;AL;36006;LINESTRING(-86.707963 32.660643,-86.707901 32.660674,-86.707849 32.6607,-86.707563 32.660801,-86.706601 32.661106,-86.706434 32.661159,-86.706114 32.661288,-86.705957 32.661361,-86.705802 32.661443,-86.705659 32.66153,-86.705518 32.661619,-86.705387 32.661714,-86.705349 32.661747,-86.70526 32.661816,-86.705141 32.661924,-86.705024 32.662039,-86.70492 32.662155,-86.704227 32.662982,-86.70272 32.664786,-86.702562 32.664965,-86.702508 32.665017,-86.702385 32.665119,-86.702246 32.665213,-86.702236 32.665223)\r\n2135;2199;odd;Maul Dr;Autauga;AL;36006;LINESTRING(-86.708079 32.660775,-86.708013 32.660824,-86.707935 32.660856,-86.707635 32.660957,-86.706671 32.66126,-86.706514 32.661315,-86.706206 32.661438,-86.706059 32.661507,-86.705914 32.661583,-86.705777 32.661664,-86.705644 32.661751,-86.705521 32.66184,-86.705485 32.661867,-86.705402 32.661936,-86.705289 32.662036,-86.70518 32.662145,-86.70508 32.662255,-86.704387 32.663078,-86.70288 32.664882,-86.70272 32.665069,-86.702658 32.665135,-86.702521 32.665247,-86.702366 32.665353,-86.702342 32.665361)\r\n621;617;odd;Shadow Ln;Autauga;AL;36066;LINESTRING(-86.448202 32.473359,-86.448434 32.472779,-86.44846 32.472716)\r\n624;618;even;Shadow Ln;Autauga;AL;36066;LINESTRING(-86.448017 32.473307,-86.448248 32.472725,-86.448276 32.472661)\r\n699;601;odd;N McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.420398 32.479546,-86.420404 32.479027,-86.420465 32.476248)\r\n652;400;even;N McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.420204 32.479545,-86.420208 32.479025,-86.420271 32.476245)\r\n2007;2011;all;Red Hawk Rd;Autauga;AL;36067;LINESTRING(-86.470941 32.507111,-86.470939 32.507255,-86.470964 32.507384,-86.47101 32.507509,-86.471124 32.507698,-86.471306 32.507958,-86.471489 32.508208,-86.471774 32.508568)\r\n901;999;all;Hill St;Autauga;AL;36067;LINESTRING(-86.469012 32.432517,-86.468903 32.432461,-86.468862 32.432358,-86.468838 32.432274,-86.468815 32.432121,-86.468808 32.431944,-86.468793 32.431751,-86.46879 32.431601,-86.468793 32.431301)\r\n2499;2401;odd;Academy St;Autauga;AL;36003;LINESTRING(-86.653244 32.431548,-86.653177 32.431586,-86.652243 32.43211,-86.652138 32.432166)\r\n2498;2400;even;Academy St;Autauga;AL;36003;LINESTRING(-86.653355 32.431683,-86.653287 32.431724,-86.652349 32.432252,-86.652239 32.432307)\r\n828;898;all;Loder St;Autauga;AL;36067;LINESTRING(-86.450736 32.455733,-86.450681 32.455662)\r\n512;522;even;McGriff St;Autauga;AL;36067;LINESTRING(-86.468439 32.439693,-86.468655 32.439319,-86.468699 32.439243,-86.468751 32.439013,-86.468742 32.438927)\r\n513;599;odd;McGriff St;Autauga;AL;36067;LINESTRING(-86.468264 32.439622,-86.468473 32.439249,-86.468495 32.439191,-86.468541 32.438997,-86.468548 32.438929)\r\n3661;3681;all;Bledsoe Rd;Autauga;AL;36003;LINESTRING(-86.803163 32.479384,-86.803294 32.479449,-86.803439 32.47951,-86.803507 32.479533,-86.803582 32.479548,-86.803657 32.479556,-86.803736 32.479561,-86.803817 32.479557,-86.804331 32.479517,-86.804513 32.479519,-86.804694 32.479537,-86.804783 32.479556,-86.804871 32.479577,-86.805036 32.47963,-86.805117 32.479665,-86.805338 32.479765,-86.805487 32.479823,-86.805557 32.479843,-86.805705 32.479869,-86.805859 32.479876,-86.80606 32.479863)\r\n200;254;even;Autauga County 3;Autauga;AL;36067;LINESTRING(-86.583607 32.450174,-86.582597 32.451188,-86.58183 32.451974,-86.581493 32.452303,-86.579943 32.453866,-86.579382 32.45442,-86.57899 32.454818,-86.578938 32.454885)\r\n201;299;odd;Autauga County 3;Autauga;AL;36067;LINESTRING(-86.583755 32.45028,-86.582747 32.451294,-86.58198 32.452082,-86.581643 32.452411,-86.580093 32.453972,-86.579532 32.454526,-86.57915 32.454922,-86.579096 32.454981)\r\n306;308;even;E Poplar St;Autauga;AL;36066;LINESTRING(-86.438534 32.466174,-86.438206 32.466019,-86.438175 32.466006,-86.438114 32.465943,-86.438062 32.465855,-86.438078 32.465749,-86.438072 32.465737)\r\n305;313;odd;E Poplar St;Autauga;AL;36066;LINESTRING(-86.438444 32.46632,-86.438082 32.466169,-86.438045 32.46613,-86.437924 32.466057,-86.437848 32.465881,-86.437866 32.465707,-86.437889 32.465681)\r\n2852;2898;even;Autauga County 53;Autauga;AL;36091;LINESTRING(-86.636789 32.702955,-86.63677 32.702965,-86.636637 32.703049,-86.636428 32.703166,-86.636213 32.703279,-86.635626 32.70357,-86.635479 32.703651,-86.635334 32.703739,-86.635069 32.703929,-86.634295 32.704488,-86.634163 32.704572,-86.634024 32.704651,-86.633582 32.704875,-86.633011 32.70519,-86.632742 32.705357,-86.632611 32.705446,-86.632483 32.705543,-86.632359 32.705648,-86.632127 32.705871,-86.632018 32.705989,-86.631914 32.706112,-86.631873 32.706186)\r\n2829;2899;odd;Autauga County 53;Autauga;AL;36091;LINESTRING(-86.636917 32.70308,-86.636896 32.703099,-86.636751 32.703187,-86.636534 32.703306,-86.636315 32.703421,-86.635732 32.703712,-86.635593 32.703789,-86.635458 32.703873,-86.635195 32.704055,-86.634421 32.704618,-86.634281 32.704712,-86.63413 32.704793,-86.633688 32.705017,-86.633125 32.705328,-86.632864 32.705491,-86.632741 32.705574,-86.632621 32.705665,-86.632505 32.705764,-86.632281 32.705979,-86.63218 32.706089,-86.63209 32.706202,-86.632045 32.706264)\r\n820;800;all;Simuel Ln;Autauga;AL;36067;LINESTRING(-86.577961 32.567079,-86.577946 32.567141,-86.577749 32.5683,-86.577746 32.568391,-86.577748 32.568403)\r\n201;213;all;Echlin Blvd;Autauga;AL;36067;LINESTRING(-86.477627 32.43636,-86.477579 32.436318,-86.477569 32.436265)\r\n1701;1799;all;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.66744 32.608066,-86.667581 32.608124,-86.668 32.608285,-86.668452 32.608442,-86.669009 32.608614,-86.669493 32.60875,-86.670077 32.6089)\r\n1101;1157;odd;Old Hwy 31;Autauga;AL;36067;LINESTRING(-86.443784 32.452429,-86.44372 32.452464,-86.443671 32.452491,-86.443634 32.452475,-86.443579 32.452455,-86.443447 32.45236,-86.443164 32.452184,-86.442336 32.451652,-86.441574 32.45117,-86.441316 32.451002,-86.441121 32.45087,-86.440372 32.4504)\r\n1100;1180;even;Old Hwy 31;Autauga;AL;36067;LINESTRING(-86.443919 32.452547,-86.443844 32.452626,-86.443697 32.452667,-86.443544 32.452659,-86.443453 32.452589,-86.443321 32.452492,-86.443046 32.452316,-86.442218 32.451784,-86.441456 32.451302,-86.441194 32.451132,-86.441001 32.451002,-86.440256 32.450532)\r\n100;206;even;Azalea Dr;Autauga;AL;36067;LINESTRING(-86.454564 32.476568,-86.454829 32.476563,-86.455359 32.476557)\r\n201;203;odd;Azalea Dr;Autauga;AL;36067;LINESTRING(-86.454559 32.476404,-86.454825 32.476397,-86.455357 32.476392)\r\n1698;1674;all;Pebble Creek Dr;Autauga;AL;36066;LINESTRING(-86.425606 32.462417,-86.425779 32.462418,-86.426615 32.462393,-86.427399 32.46238,-86.427964 32.462324,-86.428232 32.462336)\r\n150;196;all;Old Autaugaville Rd;Autauga;AL;36067;LINESTRING(-86.499161 32.435439,-86.499041 32.435572,-86.497484 32.437312,-86.496978 32.437892,-86.496851 32.438035)\r\n116;158;even;Simmons Rd;Autauga;AL;36067;LINESTRING(-86.525404 32.433909,-86.525432 32.434747,-86.525443 32.43575)\r\n119;127;odd;Simmons Rd;Autauga;AL;36067;LINESTRING(-86.525598 32.433904,-86.525628 32.434743,-86.525638 32.435749)\r\n834;898;even;Dee Dr;Autauga;AL;36066;LINESTRING(-86.415062 32.454674,-86.415065 32.454665,-86.41501 32.454469,-86.414992 32.454269,-86.415029 32.45407,-86.415071 32.453942,-86.415154 32.453763)\r\n843;899;odd;Dee Dr;Autauga;AL;36066;LINESTRING(-86.414882 32.454736,-86.414867 32.454719,-86.414802 32.454495,-86.41479 32.454261,-86.414825 32.454032,-86.414879 32.453884,-86.414974 32.4537)\r\n100;198;even;Greencrest Ln;Autauga;AL;36067;LINESTRING(-86.467539 32.488274,-86.467379 32.488273,-86.466782 32.488288,-86.465593 32.488305,-86.463892 32.488322,-86.461328 32.488355)\r\n101;199;odd;Greencrest Ln;Autauga;AL;36067;LINESTRING(-86.467539 32.488439,-86.467381 32.488439,-86.466786 32.488454,-86.465595 32.488469,-86.463894 32.488486,-86.461331 32.488519)\r\n1251;1201;all;Cygnus Ln;Autauga;AL;36067;LINESTRING(-86.541055 32.498537,-86.541022 32.498516,-86.540938 32.498495,-86.540772 32.498395,-86.540578 32.498338,-86.540434 32.498144,-86.540503 32.496636)\r\n433;405;odd;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.673531 32.394573,-86.672379 32.395533,-86.672015 32.395847,-86.671218 32.396549)\r\n432;404;even;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.673667 32.39469,-86.672517 32.395651,-86.672155 32.395963,-86.671358 32.396663)\r\n1200;1206;all;Josephine Ave;Autauga;AL;36066;LINESTRING(-86.442593 32.458513,-86.441679 32.458529,-86.441668 32.45853)\r\n1401;1499;odd;Forest Trl;Autauga;AL;36066;LINESTRING(-86.431526 32.459012,-86.431577 32.459047,-86.431657 32.4591)\r\n1400;1498;even;Forest Trl;Autauga;AL;36066;LINESTRING(-86.431637 32.458877,-86.431701 32.458911,-86.431783 32.458974)\r\n1701;1727;all;Big Springs Church Rd;Autauga;AL;36006;LINESTRING(-86.70798 32.581344,-86.707945 32.581459,-86.707749 32.58216,-86.707464 32.583144,-86.707233 32.583988,-86.707166 32.584271,-86.707131 32.58448,-86.707118 32.584619,-86.707118 32.584758,-86.707129 32.584896,-86.707154 32.585035,-86.707191 32.585169,-86.707344 32.585579,-86.707514 32.58599,-86.707791 32.58668,-86.707839 32.586825,-86.707844 32.586867)\r\n1151;1149;odd;Perrydale Loop;Autauga;AL;36066;LINESTRING(-86.441175 32.45546,-86.441161 32.45539,-86.44114 32.455345)\r\n1152;1150;even;Perrydale Loop;Autauga;AL;36066;LINESTRING(-86.440986 32.455497,-86.440965 32.455436,-86.440954 32.455395)\r\n300;364;even;Autauga County 9;Autauga;AL;36003;LINESTRING(-86.775469 32.467259,-86.775465 32.467427,-86.775452 32.468299,-86.775433 32.468587,-86.775419 32.46873,-86.775398 32.468871,-86.775371 32.469011,-86.775301 32.469294,-86.775258 32.469432,-86.775156 32.469706,-86.775033 32.469971,-86.774813 32.47036,-86.773657 32.472239,-86.773511 32.472506,-86.773442 32.472642,-86.773379 32.47278,-86.773272 32.473062,-86.773224 32.473208,-86.773149 32.473498,-86.773095 32.47379,-86.77306 32.474085,-86.772969 32.475102,-86.772802 32.477504,-86.772796 32.477651,-86.772797 32.477802,-86.772812 32.477955,-86.77284 32.478102,-86.772877 32.47825,-86.772926 32.478395,-86.772984 32.478538,-86.773055 32.478676,-86.773077 32.478707,-86.773135 32.47881,-86.773225 32.478939,-86.773327 32.479064,-86.773436 32.479183,-86.774235 32.479943,-86.774343 32.480054,-86.774444 32.480168,-86.774532 32.480284,-86.774687 32.480538,-86.774748 32.480666,-86.774798 32.480802,-86.774836 32.480938,-86.774865 32.481079,-86.774884 32.481219,-86.774896 32.481362,-86.774908 32.481798,-86.774918 32.48267,-86.774905 32.482958,-86.77488 32.483247,-86.774838 32.483532,-86.77481 32.483676,-86.774776 32.483815,-86.774692 32.484093,-86.773753 32.486662,-86.77366 32.486945,-86.773581 32.487225,-86.7735 32.487641)\r\n301;365;odd;Autauga County 9;Autauga;AL;36003;LINESTRING(-86.775664 32.467262,-86.775661 32.467429,-86.77565 32.468305,-86.775631 32.468599,-86.775615 32.468748,-86.775594 32.468895,-86.775567 32.469041,-86.775495 32.469332,-86.77545 32.469478,-86.775346 32.469762,-86.775219 32.470039,-86.774989 32.470434,-86.773835 32.472313,-86.773691 32.472574,-86.773626 32.472704,-86.773567 32.472836,-86.773462 32.47311,-86.773418 32.473248,-86.773345 32.47353,-86.773293 32.473812,-86.773256 32.474099,-86.773165 32.475114,-86.772998 32.477512,-86.772992 32.477653,-86.772997 32.477794,-86.773012 32.477935,-86.773036 32.478072,-86.773071 32.478208,-86.773116 32.478343,-86.773172 32.478476,-86.773237 32.478604,-86.773251 32.478633,-86.773311 32.478728,-86.773395 32.478847,-86.773489 32.478964,-86.77359 32.479075,-86.774385 32.479835,-86.774499 32.47995,-86.77461 32.48007,-86.774708 32.480198,-86.774875 32.480466,-86.774938 32.48061,-86.774992 32.480756,-86.775034 32.480904,-86.775061 32.481055,-86.775082 32.481203,-86.775094 32.481354,-86.775104 32.481796,-86.775114 32.482672,-86.775103 32.482966,-86.775078 32.483263,-86.775034 32.483556,-86.775004 32.483706,-86.77497 32.483853,-86.774884 32.484139,-86.773943 32.486708,-86.773852 32.486987,-86.773777 32.487259,-86.773691 32.487669)\r\n100;198;even;Camellia Dr;Autauga;AL;36067;LINESTRING(-86.452002 32.472684,-86.452494 32.472662,-86.452658 32.472659,-86.452902 32.47268,-86.452974 32.472692,-86.453126 32.472736,-86.453275 32.472793,-86.453499 32.472896,-86.45426 32.473222,-86.45509 32.473586,-86.455191 32.473633)\r\n1;199;odd;Camellia Dr;Autauga;AL;36067;LINESTRING(-86.451991 32.472519,-86.452486 32.472496,-86.452664 32.472491,-86.452934 32.472506,-86.45303 32.472526,-86.453204 32.472576,-86.453365 32.472643,-86.453591 32.472748,-86.45435 32.473074,-86.455184 32.473438,-86.455287 32.47349)\r\n100;198;even;Noccalula Ct;Autauga;AL;36067;LINESTRING(-86.525186 32.458827,-86.525188 32.458797,-86.525085 32.457777,-86.525076 32.457664)\r\n101;199;odd;Noccalula Ct;Autauga;AL;36067;LINESTRING(-86.524992 32.458832,-86.524988 32.458807,-86.524889 32.457789,-86.524882 32.457673)\r\n2512;2598;all;Norrell St;Autauga;AL;36006;LINESTRING(-86.717687 32.660142,-86.717733 32.660179,-86.718001 32.660336,-86.718364 32.660557,-86.718399 32.660573)\r\n600;698;even;Thomas Ave;Autauga;AL;36067;LINESTRING(-86.454014 32.456814,-86.453791 32.456811,-86.452922 32.45681,-86.452742 32.456825,-86.452646 32.456841,-86.452557 32.456862,-86.452463 32.456886,-86.452371 32.456923,-86.452217 32.457013,-86.452144 32.457065,-86.452074 32.457124)\r\n601;699;odd;Thomas Ave;Autauga;AL;36067;LINESTRING(-86.454012 32.456979,-86.453791 32.456977,-86.452932 32.456982,-86.45277 32.456995,-86.452692 32.457007,-86.452615 32.457024,-86.452541 32.457048,-86.452475 32.457075,-86.452339 32.457151,-86.452276 32.457193,-86.452206 32.457244)\r\n800;878;even;Autauga County 6;Autauga;AL;36067;LINESTRING(-86.556565 32.541176,-86.5566 32.54119,-86.55666 32.541208,-86.556722 32.54124,-86.556771 32.541277,-86.556868 32.541375,-86.556904 32.541426,-86.556926 32.54148,-86.556988 32.541754,-86.557069 32.542117,-86.557139 32.542331,-86.55726 32.542612,-86.557343 32.54275,-86.55744 32.542885,-86.557689 32.543102,-86.55783 32.543203,-86.558132 32.54336,-86.558296 32.543426,-86.558467 32.543473,-86.558641 32.543509,-86.559153 32.543575,-86.559497 32.543604,-86.559844 32.543616,-86.560022 32.543616,-86.560371 32.543591,-86.560543 32.543569,-86.560714 32.543543,-86.560885 32.543509,-86.561054 32.543462,-86.561216 32.543403,-86.561375 32.543338,-86.561526 32.543263,-86.561673 32.543185,-86.562099 32.542947,-86.562243 32.542874,-86.562288 32.542851)\r\n801;869;odd;Autauga County 6;Autauga;AL;36067;LINESTRING(-86.556602 32.541014,-86.556664 32.541016,-86.556754 32.541054,-86.556838 32.541096,-86.556923 32.541147,-86.55704 32.541275,-86.557088 32.541348,-86.557134 32.541428,-86.557182 32.541724,-86.557265 32.542077,-86.557331 32.542279,-86.557448 32.542542,-86.557521 32.542664,-86.557608 32.542775,-86.557829 32.542976,-86.557952 32.543061,-86.55823 32.543208,-86.558372 32.543264,-86.558523 32.543309,-86.558681 32.543341,-86.559179 32.543407,-86.559511 32.543436,-86.559848 32.543448,-86.560012 32.543446,-86.560347 32.543423,-86.560511 32.543403,-86.560672 32.543377,-86.560829 32.543345,-86.560982 32.543302,-86.561134 32.543249,-86.561281 32.543188,-86.561424 32.543119,-86.561567 32.543045,-86.561993 32.542805,-86.562143 32.542726,-86.562199 32.542705)\r\n836;838;all;Autauga County 1;Autauga;AL;36749;LINESTRING(-86.817811 32.550494,-86.817722 32.550573,-86.817483 32.550773,-86.81736 32.550868,-86.815572 32.55218)\r\n142;298;all;Hazel St;Autauga;AL;36067;LINESTRING(-86.468764 32.431076,-86.468512 32.431039)\r\n1699;1691;odd;Hawthorne St;Autauga;AL;36066;LINESTRING(-86.421328 32.474933,-86.421327 32.474918,-86.421305 32.474781,-86.421286 32.474568,-86.421284 32.474501,-86.421301 32.474294,-86.421331 32.474162,-86.421376 32.474029)\r\n1698;1684;even;Hawthorne St;Autauga;AL;36066;LINESTRING(-86.421138 32.474965,-86.421131 32.474948,-86.421103 32.474799,-86.421088 32.474576,-86.421086 32.474499,-86.421095 32.474272,-86.421131 32.474118,-86.421191 32.473978)\r\n199;101;odd;Allenville Rd;Autauga;AL;36067;LINESTRING(-86.48599 32.465071,-86.48602 32.46484,-86.486109 32.464262,-86.486127 32.464118,-86.486169 32.463901)\r\n198;100;even;Allenville Rd;Autauga;AL;36067;LINESTRING(-86.485796 32.465053,-86.485826 32.46482,-86.485913 32.464244,-86.485927 32.464096,-86.485977 32.463872)\r\n557;487;odd;W 4th St;Autauga;AL;36067;LINESTRING(-86.490437 32.464446,-86.490365 32.464423,-86.489869 32.464293,-86.48937 32.464175,-86.488696 32.464036,-86.488357 32.463975,-86.487679 32.463863,-86.487166 32.463796,-86.486821 32.463759,-86.486308 32.463711,-86.486259 32.463707)\r\n598;428;even;W 4th St;Autauga;AL;36067;LINESTRING(-86.490372 32.464602,-86.490303 32.464583,-86.489813 32.464453,-86.48932 32.464337,-86.488652 32.464198,-86.488317 32.464137,-86.487645 32.464029,-86.487138 32.463962,-86.486799 32.463925,-86.486278 32.463881,-86.486223 32.463869)\r\n1401;1499;all;Grapevine Dr;Autauga;AL;36006;LINESTRING(-86.769319 32.609327,-86.769281 32.609452,-86.769232 32.609586,-86.769085 32.609763,-86.769007 32.609834,-86.768932 32.609925,-86.768876 32.610012,-86.768599 32.610586,-86.768477 32.610887,-86.768406 32.611131,-86.768377 32.611292,-86.768366 32.611404,-86.768388 32.611505,-86.768427 32.611613,-86.768427 32.611626)\r\n800;998;even;Moore Dr;Autauga;AL;36067;LINESTRING(-86.468462 32.43223,-86.468432 32.431672)\r\n999;901;odd;Moore Dr;Autauga;AL;36067;LINESTRING(-86.468267 32.432237,-86.468237 32.431679)\r\n1150;1196;even;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.595599 32.549021,-86.595624 32.549822,-86.595662 32.550336,-86.595704 32.550632,-86.595797 32.551067,-86.595854 32.551283,-86.595958 32.551636,-86.59601 32.551777,-86.596381 32.552743,-86.596506 32.553086,-86.596675 32.553643,-86.59674 32.553922,-86.596786 32.554206,-86.596808 32.554418,-86.596827 32.554709,-86.596851 32.555216,-86.596862 32.555939,-86.596857 32.556302,-86.596814 32.558489,-86.596817 32.559453)\r\n1103;1181;odd;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.595793 32.549016,-86.595822 32.549814,-86.595862 32.55032,-86.595902 32.550608,-86.595991 32.551035,-86.596046 32.551245,-86.59615 32.55159,-86.596198 32.551727,-86.596567 32.552693,-86.596698 32.55304,-86.596869 32.553605,-86.596938 32.553894,-86.596984 32.554188,-86.597004 32.554406,-86.597023 32.554701,-86.597049 32.555212,-86.597056 32.555939,-86.597053 32.556304,-86.59701 32.558491,-86.597012 32.559452)\r\n1098;1000;even;Plum Orchard Way;Autauga;AL;36067;LINESTRING(-86.530113 32.456882,-86.5304 32.456746,-86.530479 32.456705,-86.53069 32.456566,-86.530878 32.456408,-86.531181 32.456155)\r\n1099;1001;odd;Plum Orchard Way;Autauga;AL;36067;LINESTRING(-86.530017 32.456739,-86.530296 32.456602,-86.530361 32.456565,-86.530556 32.456436,-86.530742 32.45629,-86.531045 32.456038)\r\n401;499;all;Autauga County 27;Autauga;AL;36067;LINESTRING(-86.523572 32.399432,-86.522393 32.400161,-86.5217 32.400598,-86.520924 32.401081,-86.520824 32.401145)\r\n1784;1752;all;Windermere Ave;Autauga;AL;36066;LINESTRING(-86.424531 32.475841,-86.424618 32.475833,-86.424869 32.475814,-86.425379 32.475765,-86.425714 32.475723,-86.426556 32.475636,-86.426805 32.475619,-86.427142 32.47561,-86.428186 32.475616)\r\n242;486;even;Autauga County 1;Autauga;AL;36749;LINESTRING(-86.849609 32.488265,-86.849413 32.488383,-86.849001 32.488649,-86.848869 32.488746,-86.848738 32.488845,-86.848617 32.488953,-86.848503 32.489066,-86.848395 32.489182,-86.848298 32.489306,-86.848211 32.489435,-86.848128 32.489563,-86.848052 32.4897,-86.847988 32.48984,-86.847934 32.489983,-86.847887 32.490126,-86.847811 32.490415,-86.846812 32.494786,-86.8468 32.49485,-86.846754 32.495076,-86.84673 32.495224,-86.84671 32.495518,-86.846716 32.495815,-86.84673 32.495966,-86.846783 32.49626,-86.846818 32.496406,-86.846861 32.496549,-86.846912 32.496691,-86.84697 32.496834,-86.847033 32.496972,-86.847102 32.49711,-86.847268 32.497373,-86.847449 32.497625,-86.849638 32.500341,-86.84992 32.500706,-86.850006 32.500827,-86.850167 32.501081,-86.850306 32.501341,-86.850366 32.501472,-86.850418 32.501606,-86.850463 32.501745,-86.850501 32.501883,-86.85053 32.502023,-86.850569 32.502308,-86.850588 32.502594,-86.850568 32.50376,-86.850547 32.504191,-86.850518 32.504473,-86.850478 32.504747,-86.850471 32.504793)\r\n201;315;odd;Autauga County 1;Autauga;AL;36749;LINESTRING(-86.849723 32.488398,-86.849531 32.488517,-86.849127 32.488781,-86.848999 32.488872,-86.848878 32.488967,-86.848765 32.489067,-86.848657 32.489172,-86.848559 32.489282,-86.848468 32.489396,-86.848383 32.489517,-86.848306 32.489639,-86.848236 32.489766,-86.848176 32.489896,-86.848124 32.490031,-86.848081 32.490166,-86.848005 32.490449,-86.847006 32.494816,-86.846992 32.494878,-86.84695 32.4951,-86.84693 32.49524,-86.846908 32.495522,-86.846916 32.495807,-86.84693 32.495946,-86.846979 32.49623,-86.847012 32.496368,-86.847053 32.496505,-86.8471 32.496639,-86.847156 32.496776,-86.847217 32.496908,-86.847284 32.497036,-86.847442 32.497289,-86.847617 32.497533,-86.849802 32.500249,-86.850086 32.500616,-86.85018 32.500743,-86.850347 32.501005,-86.850492 32.501275,-86.850554 32.501416,-86.850608 32.501558,-86.850657 32.501703,-86.850695 32.501849,-86.850728 32.501999,-86.850769 32.502294,-86.850786 32.50259,-86.850766 32.503764,-86.850745 32.504201,-86.850716 32.504491,-86.850672 32.504771,-86.850663 32.504817)\r\n410;498;even;Wind Ridge Dr;Autauga;AL;36022;LINESTRING(-86.420941 32.59138,-86.421127 32.591389,-86.422205 32.591461,-86.422344 32.591491,-86.422413 32.591527,-86.422445 32.59157,-86.422472 32.591634,-86.422419 32.591748,-86.422032 32.592312,-86.421916 32.592442,-86.421866 32.592505,-86.421871 32.59258,-86.421888 32.592709,-86.42205 32.593313,-86.422067 32.593595,-86.422038 32.593722,-86.421988 32.59383,-86.421903 32.593923,-86.421758 32.594016,-86.421455 32.594153,-86.4213 32.594195,-86.421243 32.594202,-86.421181 32.594184,-86.420913 32.594053,-86.420634 32.593877)\r\n413;499;odd;Wind Ridge Dr;Autauga;AL;36022;LINESTRING(-86.420951 32.591216,-86.421139 32.591223,-86.422229 32.591291,-86.422434 32.591309,-86.422561 32.591393,-86.422663 32.591486,-86.422678 32.59165,-86.422611 32.591824,-86.422202 32.592406,-86.422092 32.592536,-86.422084 32.592563,-86.422067 32.592578,-86.422088 32.592677,-86.42226 32.593289,-86.422275 32.593609,-86.422236 32.593764,-86.42219 32.59392,-86.422053 32.594059,-86.421866 32.594164,-86.421539 32.594315,-86.421344 32.594377,-86.421221 32.59438,-86.421093 32.594354,-86.420797 32.594195,-86.420516 32.594007)\r\n2400;2462;even;Autauga County 61;Autauga;AL;36022;LINESTRING(-86.480876 32.600435,-86.480841 32.600433,-86.480662 32.600448,-86.480569 32.600468,-86.480481 32.600496,-86.480394 32.600525,-86.480313 32.600569,-86.480236 32.600615,-86.480171 32.600672,-86.480105 32.600727,-86.479897 32.600961,-86.4797 32.6012,-86.479317 32.601682,-86.47923 32.601814,-86.479165 32.601959,-86.479142 32.602038,-86.479116 32.60219,-86.479104 32.602413,-86.47911 32.602782,-86.479138 32.603142,-86.4792 32.603791,-86.479241 32.604298,-86.479295 32.604807,-86.479308 32.604901)\r\n2409;2437;odd;Autauga County 61;Autauga;AL;36022;LINESTRING(-86.480882 32.600599,-86.480855 32.600603,-86.480698 32.60062,-86.480627 32.600634,-86.480555 32.600654,-86.48049 32.600681,-86.480427 32.600711,-86.48037 32.600749,-86.480311 32.600792,-86.480261 32.600839,-86.480057 32.601061,-86.479862 32.601294,-86.479491 32.60177,-86.479418 32.601888,-86.479361 32.602011,-86.479342 32.602072,-86.479318 32.602208,-86.479302 32.602417,-86.47931 32.602776,-86.479334 32.60313,-86.479396 32.603779,-86.479437 32.604284,-86.479491 32.604791,-86.479502 32.604883)\r\n2028;2034;even;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.464222 32.587053,-86.464222 32.587059,-86.464217 32.587346)\r\n2035;2099;odd;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.464416 32.587055,-86.464416 32.587061,-86.464411 32.587349)\r\n750;752;all;Silver Hills Dr;Autauga;AL;36066;LINESTRING(-86.429794 32.45509,-86.429642 32.454953,-86.429576 32.454905,-86.429408 32.454757,-86.429371 32.454722)\r\n522;598;all;Autauga County 40;Autauga;AL;36022;LINESTRING(-86.414931 32.589172,-86.414836 32.589176,-86.414134 32.589224,-86.413498 32.58927)\r\n199;111;odd;Livingston Ave;Autauga;AL;36066;LINESTRING(-86.450025 32.477238,-86.450199 32.477237,-86.450292 32.47722,-86.45039 32.477204,-86.450562 32.477131,-86.450706 32.477024,-86.450872 32.476841,-86.450969 32.476671)\r\n198;108;even;Livingston Ave;Autauga;AL;36066;LINESTRING(-86.450017 32.477074,-86.450175 32.477063,-86.450248 32.477054,-86.450314 32.477034,-86.450442 32.476979,-86.450552 32.4769,-86.450694 32.476745,-86.450797 32.476594)\r\n1499;1481;odd;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.541813 32.503217,-86.541642 32.50319,-86.541315 32.503125,-86.541154 32.503087,-86.540911 32.503021,-86.540674 32.502947,-86.540365 32.502834,-86.540138 32.502739,-86.539916 32.502637,-86.539701 32.502526,-86.539491 32.502405,-86.539354 32.50232)\r\n1498;1400;even;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.541781 32.503379,-86.541602 32.503356,-86.541263 32.503289,-86.541096 32.503245,-86.540847 32.503181,-86.5406 32.503105,-86.540281 32.502986,-86.540046 32.502889,-86.539816 32.502783,-86.539593 32.502668,-86.539375 32.502543,-86.539236 32.502451)\r\n761;701;odd;Inzer Ln;Autauga;AL;36067;LINESTRING(-86.452063 32.442243,-86.452101 32.442493,-86.45203 32.442897,-86.452026 32.443848)\r\n700;898;even;Inzer Ln;Autauga;AL;36067;LINESTRING(-86.452256 32.442222,-86.452295 32.442493,-86.452236 32.442909,-86.452221 32.443849)\r\n2500;2598;even;Nettie Ln;Autauga;AL;36006;LINESTRING(-86.713004 32.661197,-86.712995 32.661245,-86.712957 32.661336,-86.712797 32.661414,-86.712703 32.661423,-86.712631 32.661504,-86.712617 32.661513,-86.712541 32.661527,-86.71232 32.661505,-86.712169 32.661485,-86.712022 32.6615,-86.7118 32.661542,-86.711578 32.66155,-86.711301 32.661548,-86.71116 32.661527)\r\n2501;2599;odd;Nettie Ln;Autauga;AL;36006;LINESTRING(-86.713199 32.661196,-86.713209 32.661267,-86.713159 32.66147,-86.712871 32.66159,-86.712835 32.661603,-86.712775 32.661664,-86.712669 32.661697,-86.712537 32.661695,-86.71229 32.661673,-86.712167 32.661649,-86.712064 32.661668,-86.711826 32.661724,-86.71158 32.661716,-86.711277 32.661728,-86.711114 32.661687)\r\n100;198;even;Robin Ct;Autauga;AL;36022;LINESTRING(-86.480251 32.616806,-86.480268 32.616861,-86.480321 32.617066,-86.480362 32.617205,-86.480372 32.617263,-86.480377 32.617267)\r\n101;199;odd;Robin Ct;Autauga;AL;36022;LINESTRING(-86.480433 32.616747,-86.48047 32.616811,-86.480517 32.617028,-86.480562 32.617171,-86.480578 32.617253,-86.480572 32.617273)\r\n899;753;odd;N Court St;Autauga;AL;36067;LINESTRING(-86.473693 32.475779,-86.473693 32.475734,-86.473701 32.475047,-86.473722 32.474838,-86.473774 32.474642,-86.473829 32.474517,-86.473903 32.474386,-86.474003 32.47419)\r\n798;756;even;N Court St;Autauga;AL;36067;LINESTRING(-86.473499 32.475782,-86.473497 32.475736,-86.473499 32.475039,-86.473518 32.474812,-86.473572 32.474588,-86.473647 32.474447,-86.473723 32.474316,-86.473824 32.474124)\r\n499;453;all;Durden Rd;Autauga;AL;36067;LINESTRING(-86.488027 32.480909,-86.487977 32.480835,-86.487891 32.480703,-86.487323 32.479879,-86.487205 32.479689,-86.487107 32.479495,-86.487029 32.479292,-86.48697 32.479084,-86.486933 32.478924)\r\n1271;901;odd;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.480134 32.495182,-86.480097 32.495094,-86.479617 32.494,-86.479056 32.4927,-86.478953 32.492428,-86.478851 32.492081,-86.478794 32.4918,-86.478761 32.491513,-86.478756 32.491303,-86.47877 32.491089,-86.47885 32.49036,-86.478877 32.490066)\r\n1278;1200;even;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.47995 32.495237,-86.479913 32.49515,-86.479435 32.494056,-86.478868 32.492754,-86.478761 32.492474,-86.478653 32.492117,-86.478594 32.491822,-86.478559 32.491523,-86.478558 32.491299,-86.478572 32.491077,-86.478654 32.490346,-86.478683 32.490052)\r\n2938;2976;even;State Rte 14;Autauga;AL;36003;LINESTRING(-86.684281 32.43743,-86.685056 32.43778,-86.685214 32.437849,-86.688365 32.439256,-86.68849 32.439311)\r\n2901;2939;odd;State Rte 14;Autauga;AL;36003;LINESTRING(-86.684372 32.437284,-86.685148 32.437634,-86.685304 32.437703,-86.688455 32.43911,-86.68858 32.439166)\r\n2399;2301;odd;Fox Quarter Rd;Autauga;AL;36003;LINESTRING(-86.658505 32.448175,-86.65835 32.448241,-86.658279 32.448267,-86.658207 32.448282,-86.658056 32.448298,-86.65754 32.448309,-86.657025 32.448324,-86.656857 32.448324,-86.656512 32.448313,-86.656415 32.448308,-86.656245 32.44834,-86.656135 32.448353,-86.656009 32.448346,-86.655655 32.448356,-86.655479 32.448364,-86.655297 32.448377,-86.655174 32.448396,-86.655088 32.448473,-86.655058 32.448565,-86.655036 32.448961,-86.655024 32.449133,-86.655096 32.44924,-86.655181 32.449308,-86.655373 32.449357,-86.655473 32.449373)\r\n2398;2300;even;Fox Quarter Rd;Autauga;AL;36003;LINESTRING(-86.658596 32.44832,-86.658438 32.448395,-86.658351 32.448427,-86.658251 32.44846,-86.658066 32.448468,-86.657546 32.448475,-86.657029 32.44849,-86.656853 32.448492,-86.65651 32.448479,-86.656437 32.448486,-86.656277 32.448508,-86.656141 32.448521,-86.656005 32.448514,-86.655665 32.448522,-86.655497 32.448532,-86.655337 32.448551,-86.655296 32.44857,-86.655288 32.448575,-86.655272 32.448601,-86.655236 32.448965,-86.655252 32.449083,-86.655274 32.449124,-86.655299 32.449142,-86.655431 32.449191,-86.65552 32.449214)\r\n2682;2698;all;Autauga County 85;Autauga;AL;36022;LINESTRING(-86.425876 32.613529,-86.425655 32.614029,-86.425418 32.614624)\r\n119;101;odd;W 3rd St;Autauga;AL;36067;LINESTRING(-86.47353 32.461252,-86.472978 32.461211,-86.47275 32.461192)\r\n134;100;even;W 3rd St;Autauga;AL;36067;LINESTRING(-86.473513 32.461416,-86.47296 32.461377,-86.47273 32.461356)\r\n151;199;all;Cypress Bend Rd;Autauga;AL;36703;LINESTRING(-86.830831 32.477847,-86.830814 32.477897,-86.830773 32.478029,-86.830746 32.478167,-86.830729 32.478316,-86.830688 32.478469,-86.830625 32.478617,-86.830576 32.47869,-86.830522 32.478758,-86.830398 32.478876,-86.830254 32.478965,-86.830137 32.479056,-86.830037 32.479156,-86.830033 32.479151)\r\n1901;1999;odd;Co Rd 109;Autauga;AL;36066;LINESTRING(-86.454765 32.583852,-86.454706 32.583464,-86.45466 32.583072)\r\n1900;1998;even;Co Rd 109;Autauga;AL;36066;LINESTRING(-86.454572 32.583874,-86.454508 32.583484,-86.454466 32.583088)\r\n1358;1348;all;Indian Hills Rd;Autauga;AL;36067;LINESTRING(-86.505138 32.459569,-86.50482 32.459554,-86.504345 32.459519)\r\n1731;1795;all;Big Springs Church Rd;Autauga;AL;36006;LINESTRING(-86.707836 32.587754,-86.707838 32.587768,-86.707814 32.587978,-86.707795 32.588262,-86.707781 32.588763,-86.707817 32.590636,-86.707863 32.591645,-86.707888 32.591931,-86.707919 32.592143,-86.707987 32.5925,-86.708108 32.592994,-86.708186 32.593354,-86.70823 32.593644,-86.708261 32.593934,-86.708287 32.59437,-86.708301 32.594736,-86.708295 32.595176,-86.708267 32.59554,-86.708181 32.596407,-86.708179 32.596406)\r\n1299;1007;odd;Autauga County 24;Autauga;AL;36067;LINESTRING(-86.625859 32.68466,-86.624699 32.684306,-86.623509 32.683951,-86.623347 32.683907,-86.62318 32.683867,-86.623013 32.683831,-86.622675 32.683781,-86.6225 32.68376,-86.622326 32.683748,-86.622151 32.683742,-86.621889 32.683741,-86.621629 32.683754,-86.621456 32.683769,-86.621284 32.683788,-86.621112 32.683812,-86.620774 32.683876,-86.619816 32.684079,-86.619728 32.684101,-86.619487 32.684156,-86.619469 32.684158,-86.619206 32.684207,-86.618265 32.684409,-86.617933 32.684475,-86.615691 32.684966,-86.614775 32.685157,-86.61369 32.685391,-86.612856 32.685565,-86.612361 32.68568,-86.611782 32.685798,-86.611534 32.685844,-86.611285 32.685884,-86.611033 32.685921,-86.610696 32.685963,-86.610358 32.685999,-86.609767 32.686043,-86.609085 32.68608,-86.607544 32.68615,-86.60651 32.68619,-86.605816 32.686231,-86.60548 32.686246)\r\n1098;1000;even;Autauga County 24;Autauga;AL;36067;LINESTRING(-86.625792 32.684814,-86.624633 32.684462,-86.623445 32.684109,-86.623289 32.684067,-86.62313 32.684029,-86.622971 32.683997,-86.622643 32.683947,-86.622478 32.683928,-86.622314 32.683916,-86.622147 32.68391,-86.621895 32.683909,-86.621645 32.683922,-86.621478 32.683935,-86.621314 32.683954,-86.62115 32.683978,-86.62082 32.684038,-86.619868 32.684241,-86.61978 32.684261,-86.619541 32.684316,-86.619519 32.684324,-86.619252 32.684371,-86.618311 32.684569,-86.617981 32.684637,-86.615739 32.685126,-86.614823 32.685317,-86.613738 32.685551,-86.612906 32.685727,-86.612411 32.685842,-86.611826 32.68596,-86.611574 32.686008,-86.611319 32.686048,-86.611065 32.686085,-86.610722 32.686127,-86.61038 32.686165,-86.609781 32.686209,-86.609097 32.686246,-86.607554 32.686316,-86.606522 32.686356,-86.605828 32.686397,-86.60549 32.68641)\r\n460;498;even;Dawson St;Autauga;AL;36067;LINESTRING(-86.486989 32.465382,-86.487046 32.465388,-86.487103 32.465393)\r\n463;499;odd;Dawson St;Autauga;AL;36067;LINESTRING(-86.487014 32.465218,-86.48707 32.465224,-86.487125 32.46523)\r\n100;198;even;Snowdrift Rd;Autauga;AL;36022;LINESTRING(-86.455589 32.537536,-86.455545 32.537616,-86.455319 32.537996,-86.455192 32.538174,-86.455097 32.538287,-86.454992 32.538389,-86.45494 32.538434,-86.454879 32.538476,-86.454817 32.538512,-86.454678 32.538581,-86.454377 32.538706,-86.454069 32.538819,-86.453911 32.538869,-86.453589 32.538982,-86.453432 32.539052,-86.453359 32.539087,-86.453201 32.539155,-86.452977 32.539273,-86.452501 32.539586,-86.45229 32.53971,-86.451987 32.539892)\r\n101;199;odd;Snowdrift Rd;Autauga;AL;36022;LINESTRING(-86.455768 32.537602,-86.455727 32.537688,-86.455495 32.538078,-86.45536 32.538268,-86.455257 32.538391,-86.455142 32.538509,-86.455074 32.53856,-86.455005 32.538612,-86.454927 32.53866,-86.45477 32.538729,-86.454461 32.53886,-86.454143 32.538975,-86.453985 32.539025,-86.453675 32.539136,-86.453526 32.5392,-86.453453 32.539235,-86.453301 32.539303,-86.453093 32.539415,-86.452619 32.539724,-86.452402 32.539846,-86.452099 32.540026)\r\n500;598;even;Sundown Dr;Autauga;AL;36067;LINESTRING(-86.524343 32.559592,-86.524681 32.559627,-86.525116 32.559642,-86.525709 32.559689,-86.528085 32.559853,-86.528277 32.55986,-86.528412 32.55981,-86.528476 32.559695,-86.528473 32.559598,-86.528466 32.559446,-86.528474 32.558839)\r\n501;599;odd;Sundown Dr;Autauga;AL;36067;LINESTRING(-86.524365 32.559429,-86.524697 32.559457,-86.52513 32.559474,-86.525727 32.559523,-86.528091 32.559685,-86.528223 32.55967,-86.52824 32.55966,-86.528256 32.559643,-86.528273 32.559594,-86.52827 32.559448,-86.528279 32.558837)\r\n1;99;all;Pressley St;Autauga;AL;36067;LINESTRING(-86.470311 32.486752,-86.4711 32.48678)\r\n121;199;all;Pressley St;Autauga;AL;36067;LINESTRING(-86.470319 32.486588,-86.471108 32.486616)\r\n799;731;odd;Mimosa Rd;Autauga;AL;36067;LINESTRING(-86.461874 32.480846,-86.461412 32.480835,-86.460802 32.480841)\r\n740;732;even;Mimosa Rd;Autauga;AL;36067;LINESTRING(-86.461869 32.48101,-86.46141 32.481001,-86.460804 32.481006)\r\n2600;2698;even;Autauga County 65;Autauga;AL;36091;LINESTRING(-86.560472 32.667312,-86.56048 32.667327,-86.560524 32.667366,-86.560563 32.667417,-86.560596 32.667473,-86.560622 32.667528,-86.560736 32.667865,-86.560807 32.668006,-86.560852 32.668074,-86.560944 32.668201,-86.561204 32.668486,-86.561353 32.668659,-86.561494 32.668839,-86.561761 32.669211,-86.561862 32.669337,-86.561977 32.66946,-86.562047 32.669514,-86.562118 32.669568,-86.562195 32.669612,-86.562275 32.669655,-86.56236 32.669692,-86.562598 32.669779,-86.56282 32.669876,-86.562894 32.669911)\r\n2601;2699;odd;Autauga County 65;Autauga;AL;36091;LINESTRING(-86.560586 32.667178,-86.560628 32.667193,-86.560692 32.667264,-86.560743 32.667333,-86.560784 32.667405,-86.560812 32.667476,-86.56093 32.667807,-86.560991 32.667932,-86.561026 32.667988,-86.561112 32.668103,-86.561362 32.668386,-86.561517 32.668563,-86.561662 32.668749,-86.561929 32.669119,-86.562024 32.669235,-86.562129 32.669342,-86.562183 32.66939,-86.562244 32.669432,-86.562307 32.669472,-86.562375 32.669507,-86.562446 32.669538,-86.562682 32.669627,-86.562924 32.669724,-86.563002 32.669774)\r\n400;404;even;Azalea Dr;Autauga;AL;36067;LINESTRING(-86.457771 32.476542,-86.458311 32.476544,-86.458472 32.476518)\r\n401;405;odd;Azalea Dr;Autauga;AL;36067;LINESTRING(-86.457769 32.476378,-86.458295 32.476368,-86.458443 32.476355)\r\n298;200;all;W 5th St;Autauga;AL;36067;LINESTRING(-86.478033 32.464719,-86.47771 32.464698,-86.477668 32.464695,-86.477365 32.464681,-86.476961 32.464652,-86.476591 32.464626,-86.476164 32.464602,-86.475525 32.464565)\r\n498;100;even;Pletcher St;Autauga;AL;36067;LINESTRING(-86.474182 32.457648,-86.473958 32.457365,-86.473823 32.45718,-86.473486 32.456676,-86.47329 32.456434,-86.473112 32.45627,-86.472784 32.455931,-86.472499 32.455661,-86.472451 32.455608,-86.472412 32.455553,-86.472342 32.455431,-86.472256 32.455232,-86.472112 32.45482,-86.472055 32.454614,-86.471927 32.453981,-86.471931 32.453927,-86.471961 32.453785)\r\n101;199;odd;Pletcher St;Autauga;AL;36067;LINESTRING(-86.474021 32.45774,-86.47379 32.457457,-86.473653 32.457266,-86.473314 32.456768,-86.473128 32.456542,-86.472962 32.456378,-86.472634 32.456041,-86.472345 32.455771,-86.472287 32.455708,-86.47223 32.455639,-86.472154 32.455497,-86.472066 32.455284,-86.471918 32.454864,-86.471859 32.454648,-86.471719 32.453995,-86.471717 32.453905,-86.471772 32.453747)\r\n1400;1598;even;Quinobequin Rd;Autauga;AL;36067;LINESTRING(-86.45618 32.523341,-86.456284 32.52336,-86.456388 32.523386,-86.456478 32.523418,-86.456682 32.523461,-86.456749 32.523489,-86.457087 32.523691,-86.457234 32.523821)\r\n1401;1599;odd;Quinobequin Rd;Autauga;AL;36067;LINESTRING(-86.456215 32.523179,-86.456328 32.523194,-86.456456 32.52322,-86.456546 32.523252,-86.45674 32.523299,-86.456851 32.523323,-86.457233 32.523555,-86.457381 32.523713)\r\n646;636;all;2nd St;Autauga;AL;36703;LINESTRING(-86.794372 32.391313,-86.794357 32.391413)\r\n2026;2098;all;Billingsley Park Rd;Autauga;AL;36006;LINESTRING(-86.717203 32.658837,-86.716767 32.659389)\r\n899;801;odd;State Rte 14 E;Autauga;AL;36066;LINESTRING(-86.4409 32.476105,-86.440973 32.476035,-86.441203 32.475839,-86.441392 32.475711,-86.441668 32.475564,-86.441963 32.475446,-86.442196 32.475378,-86.442353 32.47534,-86.443414 32.475121)\r\n916;800;even;State Rte 14 E;Autauga;AL;36066;LINESTRING(-86.440749 32.476001,-86.440821 32.475919,-86.441065 32.475711,-86.441272 32.475569,-86.44157 32.47541,-86.441887 32.475286,-86.442138 32.475214,-86.442305 32.47518,-86.443368 32.474961)\r\n1899;1801;all;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.687144 32.625786,-86.687213 32.625708)\r\n960;998;even;Silver Creek Cir;Autauga;AL;36066;LINESTRING(-86.434213 32.45091,-86.434146 32.450908,-86.433541 32.450904,-86.433347 32.450927,-86.433245 32.450969,-86.433155 32.451029,-86.433083 32.451109,-86.433027 32.451281,-86.433049 32.451411)\r\n969;999;odd;Silver Creek Cir;Autauga;AL;36066;LINESTRING(-86.434209 32.451075,-86.434144 32.451074,-86.433559 32.45108,-86.433413 32.451105,-86.433359 32.451125,-86.433313 32.451157,-86.433283 32.451195,-86.433235 32.451299,-86.433242 32.451392)\r\n499;465;odd;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.824006 32.41754,-86.822638 32.418659,-86.820209 32.420633,-86.819967 32.420844,-86.819852 32.420958,-86.819636 32.421189,-86.819438 32.421434,-86.819257 32.421687,-86.819092 32.421947,-86.818946 32.422219,-86.818827 32.422496,-86.818771 32.422635,-86.818677 32.422921,-86.818637 32.423067,-86.818604 32.423213,-86.818576 32.423361,-86.818534 32.423655,-86.818526 32.423851)\r\n498;464;even;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.824141 32.417658,-86.822774 32.418777,-86.820349 32.420751,-86.820115 32.420958,-86.820006 32.421064,-86.819798 32.421289,-86.819606 32.421526,-86.819431 32.421771,-86.819272 32.422023,-86.819132 32.422283,-86.819013 32.422552,-86.818961 32.422685,-86.818869 32.422963,-86.818831 32.423101,-86.818798 32.423243,-86.818772 32.423383,-86.818734 32.423669,-86.81872 32.423859)\r\n199;133;odd;Autauga County 68 W;Autauga;AL;36022;LINESTRING(-86.499816 32.65743,-86.499616 32.657406,-86.498515 32.657297,-86.497415 32.657201,-86.497069 32.657185,-86.496723 32.65719,-86.496378 32.657205,-86.496031 32.657237,-86.495772 32.65727,-86.495432 32.657334,-86.494355 32.657566,-86.493772 32.657683,-86.493112 32.657827,-86.492947 32.657859,-86.492701 32.657898,-86.492574 32.657914)\r\n198;100;even;Autauga County 68 W;Autauga;AL;36022;LINESTRING(-86.499789 32.657593,-86.499592 32.65757,-86.498493 32.657461,-86.497399 32.657369,-86.497065 32.657353,-86.496729 32.657358,-86.496394 32.657373,-86.496057 32.657403,-86.495808 32.657436,-86.495478 32.657496,-86.494403 32.657726,-86.49382 32.657845,-86.49316 32.657989,-86.492989 32.658023,-86.492733 32.658064,-86.4926 32.658077)\r\n1389;1301;all;Serenity Dr;Autauga;AL;36067;LINESTRING(-86.424276 32.435017,-86.424271 32.435042,-86.424279 32.435034,-86.4243 32.435034)\r\n122;100;all;Walnut St;Autauga;AL;36067;LINESTRING(-86.478073 32.466943,-86.477972 32.466898)\r\n700;732;even;Red Eagle Rd;Autauga;AL;36067;LINESTRING(-86.522111 32.448795,-86.522121 32.448734,-86.522109 32.448673)\r\n701;749;odd;Red Eagle Rd;Autauga;AL;36067;LINESTRING(-86.521919 32.448769,-86.521927 32.448736,-86.521918 32.448704)\r\n1988;2008;all;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.674106 32.623734,-86.674076 32.624146,-86.674045 32.624427,-86.674021 32.624565,-86.673985 32.624699,-86.673936 32.624828,-86.673872 32.624957,-86.673835 32.625014,-86.673742 32.625134,-86.673729 32.625152)\r\n100;118;even;Beth Manor Dr;Autauga;AL;36066;LINESTRING(-86.435555 32.447976,-86.434289 32.448038,-86.433446 32.448063)\r\n101;119;odd;Beth Manor Dr;Autauga;AL;36066;LINESTRING(-86.435566 32.44814,-86.434299 32.448204,-86.433452 32.448227)\r\n712;720;all;Autauga County 32;Autauga;AL;36091;LINESTRING(-86.576532 32.687857,-86.576908 32.687945,-86.577082 32.687978,-86.577342 32.688007,-86.577599 32.688034,-86.577853 32.688052,-86.578104 32.688074,-86.578432 32.688108)\r\n1670;1764;even;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.539187 32.530012,-86.539788 32.530483,-86.540029 32.530686,-86.540249 32.5309,-86.54035 32.531012,-86.540444 32.531127,-86.540533 32.531248,-86.540614 32.531369,-86.540762 32.531623,-86.540828 32.531753,-86.540887 32.531886,-86.540938 32.53202,-86.54098 32.532154,-86.54105 32.53243,-86.541088 32.532642,-86.541105 32.532784,-86.541113 32.532924,-86.541114 32.533066,-86.541093 32.533352,-86.541073 32.533491,-86.541013 32.533774,-86.540746 32.53476,-86.540445 32.53581,-86.540273 32.536441,-86.540203 32.536727,-86.540155 32.537023,-86.540127 32.537305,-86.540119 32.537451,-86.540118 32.537597,-86.540125 32.537887,-86.540153 32.538179,-86.540173 32.538324,-86.540198 32.53847,-86.540268 32.538756,-86.54031 32.538901,-86.540407 32.539182,-86.540513 32.539452,-86.540638 32.539721,-86.540724 32.539867,-86.540863 32.540116,-86.541113 32.540503,-86.541621 32.541273)\r\n1667;1791;odd;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.539319 32.529891,-86.539924 32.530363,-86.540177 32.530568,-86.540405 32.530794,-86.540512 32.530912,-86.540612 32.531035,-86.540703 32.531162,-86.540792 32.531289,-86.540942 32.531553,-86.541014 32.531691,-86.541073 32.53183,-86.54113 32.531972,-86.541174 32.532114,-86.541246 32.5324,-86.541288 32.532622,-86.541303 32.532772,-86.541313 32.53292,-86.541314 32.53307,-86.541293 32.533368,-86.541269 32.533517,-86.541209 32.533808,-86.540936 32.534798,-86.540635 32.535848,-86.540465 32.536477,-86.540401 32.536755,-86.540353 32.537041,-86.540325 32.537317,-86.540317 32.537455,-86.540314 32.537595,-86.540325 32.537879,-86.540351 32.538163,-86.540369 32.538302,-86.540394 32.53844,-86.540462 32.53872,-86.540502 32.538857,-86.540597 32.539132,-86.540701 32.539394,-86.540822 32.539653,-86.5409 32.539795,-86.541041 32.54004,-86.541285 32.540423,-86.541791 32.541193)\r\n2827;2837;all;State Rte 14;Autauga;AL;36003;LINESTRING(-86.668957 32.429653,-86.670023 32.429495,-86.670252 32.429455)\r\n111;107;all;Till St;Autauga;AL;36066;LINESTRING(-86.445568 32.468076,-86.445467 32.468032,-86.445308 32.46797,-86.445072 32.467895,-86.445033 32.467884)\r\n813;821;all;Bluegrass Dr;Autauga;AL;36066;LINESTRING(-86.415498 32.491427,-86.415651 32.491646,-86.41581 32.491898,-86.415872 32.491989)\r\n417;401;odd;Pickett Mill Rd;Autauga;AL;36003;LINESTRING(-86.644992 32.426766,-86.645188 32.426946,-86.646464 32.428047)\r\n446;400;even;Pickett Mill Rd;Autauga;AL;36003;LINESTRING(-86.645134 32.426654,-86.64533 32.42683,-86.646602 32.427932)\r\n590;586;all;Marshall Dr;Autauga;AL;36067;LINESTRING(-86.488986 32.441031,-86.488691 32.440969,-86.48881 32.440076)\r\n131;121;all;W 3rd St;Autauga;AL;36067;LINESTRING(-86.473932 32.461282,-86.473804 32.461272)\r\n177;127;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.474916 32.574453,-86.473945 32.575214,-86.473447 32.575611,-86.473152 32.57587,-86.472871 32.576127,-86.472827 32.576174)\r\n178;118;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.475048 32.574573,-86.474079 32.575334,-86.473587 32.575731,-86.473296 32.575984,-86.473019 32.576239,-86.472975 32.57628)\r\n1699;1601;odd;Alt Rte Route Cord 39;Autauga;AL;36022;LINESTRING(-86.443468 32.540343,-86.443368 32.54035,-86.443034 32.540327,-86.442441 32.540313,-86.442275 32.540304,-86.442028 32.54028,-86.441768 32.540246)\r\n1698;1678;even;Alt Rte Route Cord 39;Autauga;AL;36022;LINESTRING(-86.443483 32.540507,-86.443368 32.540514,-86.443024 32.540495,-86.442433 32.540481,-86.442257 32.540472,-86.442 32.540446,-86.441736 32.540408)\r\n598;500;all;E Poplar St;Autauga;AL;36066;LINESTRING(-86.422819 32.475077,-86.423796 32.474983,-86.424557 32.474897,-86.42473 32.474875,-86.424905 32.474844,-86.425157 32.474768,-86.425315 32.474691,-86.425464 32.474607,-86.425604 32.474514,-86.42579 32.474355,-86.42585 32.474298,-86.425964 32.474175,-86.426128 32.473909,-86.42621 32.47369,-86.426241 32.473536,-86.426251 32.473314,-86.426224 32.471727,-86.426238 32.471523,-86.426278 32.471407,-86.426328 32.471334,-86.426406 32.471263,-86.426505 32.4712,-86.426573 32.471176,-86.426675 32.471157,-86.426814 32.471148,-86.427159 32.471162)\r\n1084;1000;all;E Poplar St;Autauga;AL;36066;LINESTRING(-86.422797 32.474913,-86.423772 32.474819,-86.424529 32.474733,-86.424692 32.474709,-86.424847 32.474676,-86.425071 32.474606,-86.425209 32.474545,-86.425344 32.474469,-86.425468 32.474384,-86.425644 32.474239,-86.425694 32.47419,-86.425786 32.474081,-86.425934 32.473841,-86.426008 32.473648,-86.426037 32.473516,-86.426053 32.47331,-86.426028 32.471727,-86.426024 32.471497,-86.426074 32.471329,-86.426162 32.471224,-86.426266 32.471133,-86.426391 32.471048,-86.426507 32.470994,-86.426657 32.470985,-86.426814 32.470984,-86.427168 32.470997)\r\n2499;2401;odd;State Rte 14;Autauga;AL;36003;LINESTRING(-86.654095 32.432652,-86.654016 32.4327,-86.653103 32.433225,-86.653007 32.433277)\r\n2498;2400;even;State Rte 14;Autauga;AL;36003;LINESTRING(-86.654214 32.432782,-86.654134 32.432838,-86.653211 32.433367,-86.653108 32.433417)\r\n218;298;even;Stewart St;Autauga;AL;36067;LINESTRING(-86.474324 32.442212,-86.4742 32.442398,-86.47408 32.442594,-86.473977 32.442778)\r\n225;299;odd;Stewart St;Autauga;AL;36067;LINESTRING(-86.474494 32.442292,-86.474374 32.442478,-86.474256 32.442668,-86.474152 32.442849)\r\n441;423;odd;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.492662 32.538682,-86.49254 32.538685,-86.491692 32.538755,-86.491354 32.538774,-86.490674 32.538798,-86.490661 32.5388)\r\n438;424;even;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.492672 32.538846,-86.492554 32.538853,-86.491708 32.538921,-86.491364 32.53894,-86.49068 32.538966,-86.490663 32.538964)\r\n899;801;all;Northington Rd;Autauga;AL;36067;LINESTRING(-86.514976 32.449953,-86.514392 32.449988,-86.513954 32.44998)\r\n447;435;odd;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.820534 32.427734,-86.820917 32.427997,-86.822862 32.429201)\r\n446;434;even;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.820656 32.427606,-86.821037 32.427863,-86.822977 32.429069)\r\n271;239;all;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.512102 32.414048,-86.512106 32.417218,-86.512112 32.417427,-86.512122 32.417603,-86.512108 32.417786)\r\n971;901;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.599086 32.574063,-86.5986 32.57406,-86.597237 32.574085,-86.596835 32.574098)\r\n980;968;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.599085 32.574228,-86.598602 32.574226,-86.597243 32.574251,-86.596843 32.574263)\r\n974;1018;even;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.609083 32.534027,-86.609228 32.534154,-86.609598 32.534463,-86.609731 32.534561,-86.610002 32.534748,-86.610146 32.53484,-86.610307 32.534916,-86.610478 32.534976,-86.610651 32.535015,-86.610823 32.535053,-86.611671 32.535179,-86.612172 32.535263,-86.612336 32.535296,-86.612495 32.535335,-86.612823 32.535426,-86.613109 32.53549,-86.613249 32.53551)\r\n1001;1019;odd;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.609222 32.533912,-86.609368 32.534036,-86.609734 32.534339,-86.609859 32.534433,-86.610124 32.534614,-86.610258 32.534694,-86.610397 32.53476,-86.610546 32.534812,-86.610703 32.534853,-86.610865 32.534887,-86.611707 32.535015,-86.612214 32.535099,-86.612386 32.535134,-86.612553 32.535175,-86.612879 32.535264,-86.613153 32.535324,-86.613286 32.535348)\r\n579;501;odd;Anderson St;Autauga;AL;36067;LINESTRING(-86.490671 32.43811,-86.489921 32.438115)\r\n598;500;even;Anderson St;Autauga;AL;36067;LINESTRING(-86.490673 32.438274,-86.489923 32.438279)\r\n499;419;odd;Autauga County 40;Autauga;AL;36022;LINESTRING(-86.419151 32.588845,-86.419425 32.58888,-86.420263 32.589006,-86.421352 32.589189,-86.422032 32.589287,-86.422373 32.589325,-86.422713 32.589356,-86.42314 32.589392,-86.424247 32.589468,-86.424586 32.589487,-86.424922 32.589513,-86.425257 32.589549,-86.425842 32.589634,-86.426254 32.589713,-86.426579 32.589788,-86.426822 32.58985,-86.428522 32.590311,-86.429485 32.590599,-86.430522 32.590931,-86.430679 32.590985,-86.430917 32.591058,-86.431189 32.591149)\r\n498;462;even;Autauga County 40;Autauga;AL;36022;LINESTRING(-86.419178 32.588682,-86.419457 32.588714,-86.420299 32.588842,-86.421388 32.589025,-86.422062 32.589121,-86.422397 32.589159,-86.422733 32.589192,-86.423158 32.589226,-86.424261 32.589302,-86.424602 32.589321,-86.424944 32.589347,-86.425287 32.589383,-86.425882 32.589468,-86.426302 32.589551,-86.426633 32.589628,-86.42688 32.589692,-86.428586 32.590153,-86.429553 32.590443,-86.430594 32.590777,-86.430749 32.590829,-86.430987 32.590902,-86.431261 32.590996)\r\n1100;1214;even;Old Ridge Rd;Autauga;AL;36066;LINESTRING(-86.43527 32.501544,-86.435253 32.501631,-86.435186 32.501949,-86.435132 32.502155,-86.435087 32.502291,-86.435007 32.502487,-86.434942 32.502612,-86.434865 32.502731,-86.43473 32.502908,-86.434161 32.503548,-86.433984 32.503799,-86.433781 32.504123,-86.433488 32.504655,-86.433458 32.504721,-86.433425 32.504777,-86.433344 32.504893,-86.4333 32.504941,-86.433246 32.504996)\r\n1201;1215;odd;Old Ridge Rd;Autauga;AL;36066;LINESTRING(-86.435462 32.50157,-86.435447 32.501659,-86.435382 32.501981,-86.435326 32.502195,-86.435279 32.502341,-86.435197 32.502549,-86.435124 32.502688,-86.435039 32.502819,-86.434896 32.503006,-86.434331 32.503644,-86.434158 32.503883,-86.433959 32.504199,-86.433674 32.504721,-86.433644 32.504789,-86.433603 32.504859,-86.433514 32.504985,-86.433462 32.505055,-86.433384 32.505112)\r\n2400;2498;even;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.545586 32.622835,-86.545296 32.623272,-86.54464 32.624197,-86.54416 32.624794,-86.54381 32.625203,-86.543226 32.625826,-86.540621 32.628498,-86.538977 32.630171,-86.538448 32.630742,-86.538396 32.630804,-86.538213 32.631053,-86.538021 32.631377,-86.537921 32.631579,-86.537861 32.631712,-86.537722 32.632075)\r\n2401;2499;odd;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.545756 32.622915,-86.545468 32.623356,-86.54481 32.624289,-86.544322 32.62489,-86.543968 32.625305,-86.543378 32.62593,-86.540771 32.628604,-86.539131 32.630275,-86.538608 32.630842,-86.538564 32.630896,-86.538391 32.631137,-86.538203 32.631449,-86.538105 32.631641,-86.538049 32.631768,-86.537907 32.632126)\r\n2599;2501;all;Academy St;Autauga;AL;36003;LINESTRING(-86.654543 32.430805,-86.654185 32.431009,-86.653602 32.43133,-86.65348 32.431406)\r\n699;569;odd;N Memorial Dr;Autauga;AL;36067;LINESTRING(-86.452068 32.475172,-86.452064 32.475037,-86.452042 32.474674,-86.452019 32.474026,-86.451988 32.473627)\r\n598;500;even;N Memorial Dr;Autauga;AL;36067;LINESTRING(-86.451874 32.475177,-86.451868 32.475043,-86.451846 32.47468,-86.451821 32.474034,-86.451794 32.473637)\r\n1100;1198;even;Deramus Ct;Autauga;AL;36066;LINESTRING(-86.444781 32.456663,-86.444737 32.45653,-86.444691 32.456461,-86.444606 32.456333,-86.444536 32.45621,-86.444516 32.456156,-86.444501 32.456111)\r\n1101;1199;odd;Deramus Ct;Autauga;AL;36066;LINESTRING(-86.444596 32.456714,-86.444545 32.456598,-86.444515 32.456539,-86.444432 32.456413,-86.444344 32.45628,-86.44431 32.456196,-86.444308 32.456132)\r\n1000;1098;all;Saddle Rdg;Autauga;AL;36066;LINESTRING(-86.412585 32.451046,-86.412635 32.45101,-86.412638 32.450949)\r\n3599;3501;odd;Autauga County 44;Autauga;AL;36003;LINESTRING(-86.776365 32.510113,-86.774835 32.512025,-86.774358 32.51263,-86.773875 32.513235,-86.773396 32.513843,-86.772912 32.514445,-86.772431 32.515055,-86.771303 32.516463,-86.771151 32.516659,-86.771109 32.516724)\r\n3570;3500;even;Autauga County 44;Autauga;AL;36003;LINESTRING(-86.776526 32.510205,-86.774997 32.512117,-86.77452 32.512722,-86.774037 32.513327,-86.773558 32.513935,-86.773074 32.514537,-86.772593 32.515147,-86.771467 32.516555,-86.771321 32.516747,-86.771277 32.516807)\r\n1415;1401;all;Old Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.49317 32.507977,-86.493495 32.507827,-86.493613 32.507717,-86.493688 32.507603)\r\n2563;2599;all;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.488034 32.638489,-86.487983 32.639078,-86.487888 32.640097,-86.487664 32.642701,-86.487629 32.64306,-86.487495 32.644653)\r\n701;707;all;Sweet Ridge Rd;Autauga;AL;36066;LINESTRING(-86.427039 32.4584,-86.427066 32.458268,-86.427095 32.458062,-86.427108 32.457698,-86.427129 32.457566)\r\n1900;1926;all;Tara Dr;Autauga;AL;36066;LINESTRING(-86.418117 32.454008,-86.418097 32.453965,-86.417968 32.453951,-86.417878 32.453946,-86.417702 32.453932,-86.417349 32.453929,-86.417261 32.453937,-86.416675 32.453937,-86.416501 32.453928)\r\n1298;1200;all;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.632535 32.566182,-86.632495 32.566286,-86.632388 32.566496,-86.6323 32.566635,-86.632154 32.566834,-86.631988 32.567018,-86.631866 32.567131,-86.631677 32.56729,-86.63154 32.567389,-86.63133 32.567528,-86.6311 32.567643,-86.631051 32.56766)\r\n301;307;all;Autauga County 4;Autauga;AL;36067;LINESTRING(-86.469449 32.431179,-86.469355 32.431174)\r\n421;401;odd;Sheila Blvd;Autauga;AL;36066;LINESTRING(-86.426108 32.451001,-86.426109 32.450925,-86.42612 32.450565,-86.426118 32.449047,-86.426121 32.448815)\r\n498;400;even;Sheila Blvd;Autauga;AL;36066;LINESTRING(-86.425914 32.451001,-86.425913 32.450923,-86.425924 32.450563,-86.425922 32.449045,-86.425927 32.448812)\r\n699;501;odd;State Rte 14 E;Autauga;AL;36066;LINESTRING(-86.446694 32.474128,-86.44674 32.474042,-86.447016 32.473359,-86.447836 32.471307,-86.447936 32.471072,-86.448157 32.470566,-86.448213 32.470449)\r\n698;500;even;State Rte 14 E;Autauga;AL;36066;LINESTRING(-86.446515 32.474064,-86.446552 32.473982,-86.446832 32.473305,-86.44765 32.471253,-86.447752 32.471016,-86.447971 32.470504,-86.448034 32.470384)\r\n1980;1998;all;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.513562 32.567003,-86.513177 32.568054,-86.51301 32.568534,-86.512974 32.568663,-86.51297 32.568695)\r\n298;232;all;N Chestnut St;Autauga;AL;36067;LINESTRING(-86.472046 32.465667,-86.472079 32.46533)\r\n708;732;even;Silver Hills Dr;Autauga;AL;36066;LINESTRING(-86.428947 32.459006,-86.428971 32.458981,-86.429061 32.458878,-86.429231 32.458725,-86.430474 32.457727,-86.43066 32.457567,-86.430721 32.457502,-86.430777 32.457427,-86.430847 32.457271,-86.43085 32.457118)\r\n709;729;odd;Silver Hills Dr;Autauga;AL;36066;LINESTRING(-86.428773 32.458933,-86.428791 32.458887,-86.428905 32.458764,-86.429091 32.458605,-86.430334 32.457607,-86.430506 32.457453,-86.430551 32.457404,-86.430585 32.457351,-86.430633 32.457231,-86.430656 32.457106)\r\n2800;2832;even;State Rte 143;Autauga;AL;36022;LINESTRING(-86.451128 32.675069,-86.451302 32.675243,-86.4514 32.675357,-86.451626 32.675658,-86.451751 32.675846,-86.451906 32.676102,-86.452013 32.676297,-86.452077 32.676426,-86.452219 32.676764,-86.452354 32.677178,-86.452408 32.67739,-86.452464 32.677673,-86.452485 32.677816,-86.45251 32.678101,-86.452533 32.678679,-86.452547 32.679341)\r\n2801;2817;odd;State Rte 143;Autauga;AL;36022;LINESTRING(-86.451275 32.674961,-86.451464 32.675137,-86.451566 32.675263,-86.4518 32.675572,-86.451925 32.675768,-86.452086 32.676028,-86.452195 32.676229,-86.452263 32.676364,-86.452411 32.676712,-86.452548 32.677138,-86.452604 32.677358,-86.452662 32.677649,-86.452683 32.6778,-86.45271 32.678093,-86.452729 32.678675,-86.452742 32.679338)\r\n106;110;even;Abney Dr;Autauga;AL;36067;LINESTRING(-86.453896 32.448945,-86.453711 32.448822,-86.453576 32.448737,-86.453507 32.448683,-86.45348 32.448678)\r\n107;109;odd;Abney Dr;Autauga;AL;36067;LINESTRING(-86.453777 32.449075,-86.453593 32.448956,-86.453452 32.448871,-86.453387 32.448831,-86.453385 32.448822)\r\n1199;1101;odd;Newton St;Autauga;AL;36066;LINESTRING(-86.444853 32.464093,-86.444876 32.464088,-86.44538 32.463844,-86.445607 32.463746,-86.445832 32.463638,-86.445867 32.463617)\r\n1198;1040;even;Newton St;Autauga;AL;36066;LINESTRING(-86.444715 32.463977,-86.444744 32.463938,-86.445288 32.463698,-86.445513 32.463598,-86.44573 32.463494,-86.445764 32.463478)\r\n1338;1340;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.502568 32.430917,-86.501191 32.430937)\r\n399;301;odd;Austin Valley Dr;Autauga;AL;36067;LINESTRING(-86.479265 32.486089,-86.478836 32.486082,-86.478455 32.486084,-86.478102 32.486103,-86.478041 32.486079,-86.477983 32.486031,-86.477857 32.485897,-86.477409 32.485375,-86.477101 32.485125,-86.476964 32.485024,-86.47681 32.484944,-86.4763 32.484882,-86.476041 32.484818,-86.475803 32.484732,-86.475575 32.484556,-86.475507 32.48447,-86.475457 32.484317,-86.475295 32.483556)\r\n398;300;even;Austin Valley Dr;Autauga;AL;36067;LINESTRING(-86.479261 32.486254,-86.478836 32.486246,-86.478465 32.486254,-86.478046 32.486291,-86.477929 32.486217,-86.477823 32.486165,-86.477697 32.485995,-86.477251 32.485491,-86.476965 32.485251,-86.476844 32.48517,-86.476736 32.485124,-86.476252 32.485054,-86.475977 32.484978,-86.475679 32.484898,-86.475427 32.484672,-86.475291 32.484556,-86.475265 32.484347,-86.475103 32.483585)\r\n259;299;all;Seaside Rd;Autauga;AL;36003;LINESTRING(-86.662601 32.454685,-86.662608 32.454701,-86.663052 32.455731,-86.66341 32.456617)\r\n500;526;even;Booth St;Autauga;AL;36067;LINESTRING(-86.462171 32.467191,-86.462022 32.467177,-86.461927 32.467162,-86.461864 32.467149,-86.461824 32.467136,-86.461776 32.467122)\r\n501;521;odd;Booth St;Autauga;AL;36067;LINESTRING(-86.462156 32.467355,-86.461994 32.467349,-86.461879 32.46733,-86.461806 32.467309,-86.461752 32.467296,-86.4617 32.467273)\r\n199;101;all;Avant St;Autauga;AL;36067;LINESTRING(-86.485572 32.435054,-86.485425 32.434802,-86.48532 32.434607,-86.485283 32.434536)\r\n100;198;even;Tea Olive Ct;Autauga;AL;36067;LINESTRING(-86.46959 32.570773,-86.469527 32.570823,-86.469493 32.570897,-86.46946 32.570968,-86.469428 32.571032,-86.4694 32.571099,-86.469392 32.571137)\r\n199;101;odd;Tea Olive Ct;Autauga;AL;36067;LINESTRING(-86.469739 32.570879,-86.469709 32.570923,-86.469675 32.570967,-86.469642 32.57103,-86.469616 32.57109,-86.469594 32.571147,-86.469581 32.571177)\r\n4051;4043;odd;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.840605 32.597547,-86.840542 32.597563,-86.839275 32.597968)\r\n4050;4042;even;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.840666 32.597703,-86.840608 32.597721,-86.839344 32.598122)\r\n1800;1898;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.567503 32.490504,-86.567869 32.49055,-86.568376 32.490622,-86.568708 32.490679,-86.569209 32.490776,-86.569872 32.49092,-86.570198 32.490998,-86.570853 32.491174,-86.571341 32.491314,-86.571982 32.491511,-86.572542 32.491696,-86.573173 32.491926,-86.573279 32.491967)\r\n199;103;all;Camille Cove;Autauga;AL;36066;LINESTRING(-86.449992 32.481323,-86.450134 32.481419,-86.450492 32.481462)\r\n1095;1099;all;E Poplar St;Autauga;AL;36066;LINESTRING(-86.421132 32.47517,-86.420895 32.475202,-86.420425 32.47525)\r\n108;122;all;Indian Trl;Autauga;AL;36067;LINESTRING(-86.557997 32.430845,-86.557996 32.430935,-86.557987 32.431297,-86.557985 32.431666,-86.557993 32.431931)\r\n499;455;all;State Rte 14 E;Autauga;AL;36066;LINESTRING(-86.448329 32.470223,-86.448357 32.470174,-86.448664 32.469651)\r\n2000;2098;even;Summit Ter;Autauga;AL;36066;LINESTRING(-86.417899 32.479025,-86.417687 32.479024,-86.417434 32.47903,-86.417177 32.479024,-86.417065 32.479029)\r\n2001;2099;odd;Summit Ter;Autauga;AL;36066;LINESTRING(-86.417899 32.479189,-86.417689 32.47919,-86.417434 32.479194,-86.417179 32.47919,-86.417074 32.479193)\r\n353;327;all;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.667487 32.400556,-86.66739 32.400748,-86.667264 32.40102,-86.667106 32.401438,-86.667014 32.401723,-86.666897 32.402153,-86.66662 32.403249)\r\n954;960;all;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.608372 32.533422,-86.608386 32.533435,-86.608868 32.533841,-86.608879 32.533849)\r\n150;198;even;10th St;Autauga;AL;36067;LINESTRING(-86.468127 32.473623,-86.467999 32.473625,-86.467607 32.473627)\r\n149;199;odd;10th St;Autauga;AL;36067;LINESTRING(-86.468131 32.473788,-86.468001 32.473791,-86.467608 32.473792)\r\n1099;1001;odd;Louberry Ln;Autauga;AL;36067;LINESTRING(-86.606513 32.57163,-86.606169 32.571628,-86.604979 32.571659,-86.604289 32.571663,-86.604188 32.571668,-86.60407 32.571685,-86.603961 32.571753,-86.603894 32.571851,-86.603886 32.571951,-86.603899 32.572233,-86.603904 32.573245,-86.603913 32.573823,-86.603907 32.57389,-86.603892 32.574007)\r\n1098;1000;even;Louberry Ln;Autauga;AL;36067;LINESTRING(-86.606512 32.571795,-86.606171 32.571794,-86.604983 32.571825,-86.604299 32.571833,-86.604222 32.571842,-86.604168 32.571861,-86.604133 32.571883,-86.60411 32.571915,-86.604092 32.571961,-86.604095 32.572231,-86.6041 32.573243,-86.604111 32.573827,-86.604107 32.573906,-86.604085 32.574028)\r\n199;101;odd;Pickett St;Autauga;AL;36067;LINESTRING(-86.471623 32.433232,-86.471811 32.433234,-86.472836 32.433255,-86.47301 32.433264,-86.473204 32.433272,-86.473325 32.433254,-86.473437 32.433197,-86.473518 32.433105,-86.473545 32.433014,-86.473555 32.432929,-86.473552 32.432849,-86.473532 32.432557,-86.473525 32.432268,-86.47353 32.431533,-86.473528 32.431177)\r\n112;998;even;Pickett St;Autauga;AL;36067;LINESTRING(-86.471625 32.433067,-86.471815 32.433068,-86.472844 32.433089,-86.473018 32.433096,-86.473182 32.433094,-86.473241 32.433078,-86.473285 32.433055,-86.473318 32.433019,-86.473339 32.432978,-86.473349 32.432919,-86.473352 32.432853,-86.473334 32.432563,-86.473329 32.432268,-86.473336 32.431533,-86.473334 32.431178)\r\n499;449;all;Autauga County 9;Autauga;AL;36003;LINESTRING(-86.763199 32.41047,-86.763135 32.410494,-86.762982 32.410568,-86.762833 32.410646,-86.762686 32.410726,-86.762544 32.410818,-86.76241 32.410911,-86.762156 32.411112,-86.762036 32.411222,-86.761921 32.411335,-86.761815 32.411456,-86.761716 32.41158,-86.761535 32.411834,-86.761454 32.411967,-86.761377 32.412105,-86.761257 32.412384,-86.761168 32.412673,-86.761135 32.412822,-86.761108 32.412971,-86.76108 32.41327,-86.761077 32.413565,-86.761081 32.413858,-86.76108 32.414728,-86.761084 32.414908,-86.761091 32.415458,-86.76109 32.415826,-86.761108 32.417645,-86.761107 32.418374,-86.761131 32.42129,-86.761136 32.42283,-86.761132 32.422975,-86.761121 32.423119,-86.761091 32.42336)\r\n3099;3001;odd;Autauga County 78;Autauga;AL;36003;LINESTRING(-86.695917 32.436039,-86.695892 32.436038,-86.695215 32.436051,-86.694534 32.436058,-86.694109 32.436058,-86.693515 32.436043,-86.692999 32.436034,-86.692812 32.436053,-86.692701 32.436082,-86.692536 32.436202,-86.692462 32.436374,-86.692464 32.436465,-86.692471 32.436689,-86.69246 32.43743,-86.692462 32.438091,-86.692511 32.439558,-86.692548 32.440285,-86.692585 32.440777,-86.692578 32.440921)\r\n3098;3000;even;Autauga County 78;Autauga;AL;36003;LINESTRING(-86.695917 32.436203,-86.695894 32.436204,-86.695219 32.436217,-86.694536 32.436224,-86.694107 32.436224,-86.693511 32.436209,-86.693013 32.436208,-86.692864 32.436229,-86.692817 32.436248,-86.692728 32.436316,-86.692678 32.436414,-86.692664 32.436469,-86.692667 32.436689,-86.692656 32.43743,-86.692658 32.438089,-86.692707 32.439552,-86.692744 32.440277,-86.692781 32.440775,-86.692772 32.440929)\r\n199;101;odd;Crimson Dr;Autauga;AL;36066;LINESTRING(-86.449476 32.526699,-86.449471 32.526703,-86.449515 32.52672,-86.449656 32.526787,-86.44975 32.52683,-86.449873 32.526834,-86.449983 32.526807,-86.450215 32.526712,-86.450284 32.526692,-86.450346 32.526681,-86.450399 32.526688,-86.450456 32.526702,-86.450518 32.526729,-86.450792 32.526891,-86.451058 32.52707,-86.4512 32.527161,-86.451283 32.5272,-86.451368 32.527236,-86.45146 32.52726,-86.451627 32.527295,-86.451779 32.527338,-86.451846 32.527364,-86.45206 32.527465)\r\n198;100;even;Crimson Dr;Autauga;AL;36066;LINESTRING(-86.449447 32.526536,-86.449493 32.526527,-86.449605 32.52656,-86.44975 32.526633,-86.449808 32.526648,-86.449853 32.526658,-86.449907 32.526643,-86.450137 32.526552,-86.450228 32.526524,-86.45033 32.526505,-86.450443 32.526506,-86.450544 32.52654,-86.450628 32.526583,-86.450912 32.526755,-86.451178 32.526936,-86.451312 32.527015,-86.451377 32.527048,-86.451446 32.527074,-86.451516 32.527096,-86.451683 32.527131,-86.451853 32.527178,-86.45194 32.52721,-86.452158 32.527324)\r\n3694;3698;even;Autauga County 106;Autauga;AL;36006;LINESTRING(-86.768176 32.655056,-86.768174 32.655177)\r\n3695;3699;odd;Autauga County 106;Autauga;AL;36006;LINESTRING(-86.768371 32.655058,-86.768369 32.655179)\r\n2100;2120;all;Autauga County 61;Autauga;AL;36067;LINESTRING(-86.504765 32.580003,-86.504334 32.580007)\r\n698;600;even;Viking Ln;Autauga;AL;36067;LINESTRING(-86.54208 32.556504,-86.542093 32.5565,-86.543266 32.556085,-86.543412 32.556056,-86.543739 32.556049,-86.546037 32.556033,-86.54638 32.556037,-86.546996 32.556038,-86.54709 32.556034)\r\n699;601;odd;Viking Ln;Autauga;AL;36067;LINESTRING(-86.542 32.556354,-86.542013 32.556348,-86.543198 32.555919,-86.543384 32.555874,-86.543739 32.555885,-86.546037 32.555869,-86.546382 32.555871,-86.546992 32.55587,-86.547084 32.555869)\r\n2800;2996;even;Autauga County 57;Autauga;AL;36091;LINESTRING(-86.536447 32.663873,-86.536561 32.66401,-86.537348 32.665049,-86.539175 32.667494,-86.541475 32.67054,-86.542017 32.671274,-86.542236 32.671582,-86.542489 32.671955,-86.542692 32.672272,-86.543218 32.673178,-86.543316 32.673351,-86.543471 32.673634,-86.544116 32.674738,-86.545598 32.677342,-86.545739 32.677606,-86.545875 32.677872,-86.546098 32.67834,-86.546217 32.678609,-86.546485 32.679286,-86.546824 32.680173,-86.547196 32.681136,-86.547362 32.681618,-86.547425 32.681824,-86.547535 32.682242,-86.547651 32.682809,-86.547697 32.683093,-86.547857 32.684383,-86.547897 32.68467,-86.548047 32.685961,-86.548087 32.686252,-86.548164 32.686611,-86.54826 32.686893,-86.548436 32.687303,-86.54851 32.687442,-86.548758 32.687827,-86.548998 32.688132,-86.549374 32.688575)\r\n2801;2991;odd;Autauga County 57;Autauga;AL;36091;LINESTRING(-86.536606 32.663777,-86.536727 32.663916,-86.537514 32.664961,-86.539341 32.667406,-86.541641 32.670452,-86.542185 32.671188,-86.542406 32.671498,-86.542661 32.671875,-86.542868 32.672196,-86.543396 32.673106,-86.543492 32.673281,-86.543649 32.673562,-86.544292 32.674666,-86.545776 32.677272,-86.545919 32.67754,-86.546057 32.677808,-86.546282 32.67828,-86.546405 32.678553,-86.546671 32.679234,-86.54701 32.680123,-86.547386 32.681086,-86.547552 32.681574,-86.547619 32.681784,-86.547731 32.68221,-86.547847 32.682783,-86.547893 32.683073,-86.548053 32.684365,-86.548093 32.684652,-86.548243 32.685943,-86.548285 32.686226,-86.548362 32.686571,-86.548452 32.686841,-86.548624 32.687239,-86.548692 32.687366,-86.548932 32.687739,-86.549162 32.688038,-86.549533 32.68848)\r\n227;209;odd;N Autauga St;Autauga;AL;36003;LINESTRING(-86.651996 32.429843,-86.65235 32.430301,-86.652413 32.430385)\r\n298;208;even;N Autauga St;Autauga;AL;36003;LINESTRING(-86.652158 32.429753,-86.652514 32.430211,-86.652577 32.430297)\r\n419;407;odd;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.828181 32.432843,-86.828289 32.432929,-86.828406 32.433029,-86.828628 32.433241,-86.828835 32.433464,-86.829024 32.433698,-86.829196 32.433939,-86.829275 32.434063,-86.829348 32.434191,-86.829413 32.434317)\r\n418;406;even;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.828311 32.432721,-86.828429 32.432807,-86.82855 32.432915,-86.828782 32.433131,-86.828997 32.433364,-86.829194 32.433606,-86.829368 32.433857,-86.829451 32.433987,-86.82953 32.434121,-86.829592 32.434253)\r\n1504;1538;even;Jade St;Autauga;AL;36067;LINESTRING(-86.49418 32.523063,-86.494302 32.523093,-86.494483 32.523103,-86.496099 32.523098,-86.496524 32.523092,-86.497374 32.523087,-86.497974 32.523081,-86.498142 32.523069,-86.498189 32.523084,-86.4982 32.523091,-86.498218 32.523113,-86.498283 32.523594,-86.498313 32.523951,-86.498341 32.524382,-86.498368 32.525524,-86.498378 32.526472)\r\n1505;1537;odd;Jade St;Autauga;AL;36067;LINESTRING(-86.494224 32.522903,-86.494334 32.522919,-86.494491 32.522933,-86.496097 32.522932,-86.496522 32.522926,-86.497372 32.522921,-86.497964 32.522911,-86.498138 32.522901,-86.498259 32.52289,-86.498386 32.522957,-86.498434 32.523067,-86.498479 32.52358,-86.498509 32.523941,-86.498539 32.524376,-86.498564 32.525522,-86.498572 32.526471)\r\n4099;4001;odd;Kent Ln;Autauga;AL;36758;LINESTRING(-86.876504 32.636392,-86.87551 32.636595,-86.875368 32.636626,-86.874984 32.636628,-86.871701 32.636706)\r\n4098;4000;even;Kent Ln;Autauga;AL;36758;LINESTRING(-86.87655 32.636551,-86.875564 32.636759,-86.8754 32.63681,-86.874984 32.636794,-86.871707 32.636871)\r\n100;198;even;S Chestnut St;Autauga;AL;36067;LINESTRING(-86.472551 32.462756,-86.472642 32.461743,-86.472679 32.461391)\r\n101;299;odd;S Chestnut St;Autauga;AL;36067;LINESTRING(-86.472357 32.462744,-86.472446 32.461729,-86.472485 32.461376)\r\n1300;1398;even;Padres Pl;Autauga;AL;36067;LINESTRING(-86.417792 32.430582,-86.4173 32.431051)\r\n1301;1399;odd;Padres Pl;Autauga;AL;36067;LINESTRING(-86.417937 32.430691,-86.417445 32.43116)\r\n359;301;all;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.50918 32.569541,-86.509042 32.569586,-86.508563 32.569734,-86.508242 32.569819,-86.50808 32.569856,-86.50775 32.569918,-86.507417 32.569966,-86.507083 32.569999,-86.50467 32.570167)\r\n355;345;odd;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.480761 32.541202,-86.480201 32.541337,-86.479872 32.541402,-86.479709 32.541426,-86.479375 32.541457,-86.479045 32.541472,-86.47894 32.541472)\r\n356;342;even;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.480815 32.54136,-86.480251 32.541499,-86.479912 32.541568,-86.479737 32.541594,-86.479391 32.541627,-86.479049 32.54164,-86.478938 32.541637)\r\n100;298;all;Long St;Autauga;AL;36067;LINESTRING(-86.469724 32.48345,-86.469809 32.483452,-86.469982 32.483445,-86.470666 32.483461,-86.47101 32.483477,-86.471262 32.483481,-86.471451 32.483491)\r\n271;299;odd;N Mulberry Rd;Autauga;AL;36003;LINESTRING(-86.764872 32.466734,-86.764775 32.466764,-86.764617 32.466808,-86.764283 32.466889,-86.764117 32.466938,-86.763954 32.466992,-86.763642 32.467115,-86.763491 32.467179,-86.7632 32.467309,-86.762899 32.467425,-86.762666 32.467499,-86.76251 32.46753,-86.762357 32.467541,-86.762109 32.467513,-86.76194 32.467488,-86.761767 32.467467,-86.761425 32.46744,-86.761265 32.467444)\r\n200;298;even;N Mulberry Rd;Autauga;AL;36003;LINESTRING(-86.764943 32.466888,-86.764841 32.466924,-86.764673 32.466966,-86.764345 32.467049,-86.764187 32.467096,-86.764032 32.467148,-86.763728 32.467265,-86.763581 32.467327,-86.763288 32.467461,-86.762977 32.467581,-86.762728 32.467665,-86.762542 32.467708,-86.762347 32.467711,-86.762079 32.467679,-86.76191 32.467654,-86.761745 32.467635,-86.761417 32.467612,-86.761265 32.467608)\r\n1900;1998;even;Dundee Dr;Autauga;AL;36066;LINESTRING(-86.416322 32.469309,-86.416227 32.469221,-86.416135 32.469174,-86.415955 32.469121,-86.415683 32.46911,-86.415339 32.469114,-86.414914 32.469123,-86.414488 32.469126,-86.414237 32.469131,-86.414081 32.469116,-86.414072 32.469123)\r\n1901;1999;odd;Dundee Dr;Autauga;AL;36066;LINESTRING(-86.416187 32.469428,-86.416097 32.469365,-86.416045 32.469338,-86.415911 32.469301,-86.415677 32.46928,-86.415343 32.46928,-86.414918 32.469289,-86.414492 32.469292,-86.414233 32.469299,-86.414045 32.469296,-86.414018 32.469281)\r\n600;624;even;Jason Rd;Autauga;AL;36067;LINESTRING(-86.636405 32.502208,-86.636348 32.502408,-86.636119 32.503187,-86.63592 32.503897,-86.635853 32.504188,-86.635825 32.504337,-86.635813 32.504563,-86.635812 32.504645,-86.635852 32.504868,-86.635917 32.505154,-86.636001 32.505586,-86.63605 32.505811)\r\n627;899;odd;Jason Rd;Autauga;AL;36067;LINESTRING(-86.636595 32.502246,-86.636538 32.502448,-86.636309 32.503225,-86.636114 32.503933,-86.636049 32.504216,-86.636027 32.504355,-86.636009 32.504565,-86.636016 32.504629,-86.636048 32.50484,-86.636111 32.505124,-86.636195 32.505558,-86.636242 32.505782)\r\n1430;1418;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.423818 32.436643,-86.423878 32.436682,-86.424343 32.437032)\r\n3093;3001;odd;Go Cart Rd;Autauga;AL;36051;LINESTRING(-86.51967 32.703013,-86.519502 32.703185,-86.519195 32.703526,-86.519087 32.70363,-86.518972 32.703726,-86.518848 32.703814,-86.518717 32.703893,-86.518576 32.703966,-86.518355 32.704066,-86.518129 32.704151,-86.518057 32.704172,-86.517984 32.704188,-86.517828 32.704207,-86.517667 32.704216,-86.517504 32.704206,-86.517347 32.704189,-86.517188 32.704161,-86.517031 32.704124,-86.516798 32.704052,-86.516648 32.703995,-86.515661 32.703575,-86.515042 32.703333,-86.514571 32.703157,-86.514249 32.70305,-86.513923 32.702961,-86.513513 32.702864,-86.513194 32.702779,-86.512967 32.702699,-86.512288 32.702399,-86.51197 32.702275,-86.511802 32.702222,-86.511552 32.70216,-86.510969 32.702034,-86.510479 32.701914,-86.509832 32.701728,-86.509581 32.701661,-86.509407 32.701627,-86.509063 32.701583,-86.50863 32.701552,-86.508297 32.701545)\r\n3092;3000;even;Go Cart Rd;Autauga;AL;36051;LINESTRING(-86.519821 32.703117,-86.519658 32.703289,-86.519351 32.703634,-86.519235 32.703746,-86.519108 32.703852,-86.518974 32.70395,-86.518827 32.704035,-86.518676 32.704112,-86.518445 32.70422,-86.518205 32.704311,-86.518115 32.704338,-86.518024 32.704356,-86.517846 32.704379,-86.517667 32.70438,-86.517486 32.704378,-86.517311 32.704357,-86.517142 32.704325,-86.516969 32.704288,-86.516722 32.704208,-86.516562 32.704147,-86.515575 32.703725,-86.51496 32.703485,-86.514495 32.703313,-86.514181 32.70321,-86.513865 32.703121,-86.513457 32.703024,-86.513124 32.702941,-86.512881 32.702853,-86.5122 32.702551,-86.511892 32.702433,-86.511738 32.702384,-86.511498 32.702322,-86.510917 32.702194,-86.510419 32.702074,-86.50977 32.701886,-86.509529 32.701825,-86.509369 32.701795,-86.509039 32.701751,-86.508618 32.70172,-86.508291 32.70171)\r\n100;198;all;Roy St;Autauga;AL;36067;LINESTRING(-86.485951 32.470972,-86.486053 32.471002,-86.48616 32.471037)\r\n537;489;odd;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.505367 32.5403,-86.505141 32.540273,-86.504981 32.540249,-86.504822 32.540219,-86.504667 32.540182,-86.504512 32.540136,-86.50436 32.540083,-86.504211 32.540022,-86.503996 32.539919,-86.503788 32.539801,-86.503514 32.539632,-86.502838 32.539191,-86.502555 32.539024,-86.502405 32.538942,-86.502094 32.538808,-86.501769 32.53869,-86.501603 32.538644,-86.501433 32.538606,-86.50126 32.538572,-86.501085 32.538543,-86.500738 32.538515,-86.500561 32.538512,-86.500386 32.538513,-86.500212 32.538518,-86.499441 32.53856,-86.497156 32.538711,-86.496649 32.538731,-86.496312 32.538734,-86.495803 32.538724,-86.49521 32.53869)\r\n598;454;even;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.505341 32.540463,-86.505111 32.540439,-86.504943 32.540415,-86.504774 32.540383,-86.504607 32.540344,-86.50444 32.540294,-86.50428 32.540235,-86.504119 32.540174,-86.50389 32.540063,-86.503674 32.539939,-86.503396 32.539766,-86.50272 32.539327,-86.502445 32.539164,-86.502305 32.539092,-86.502008 32.538962,-86.501697 32.53885,-86.501545 32.538806,-86.501385 32.538768,-86.50122 32.538736,-86.501057 32.538713,-86.500724 32.538685,-86.500559 32.538678,-86.50039 32.538679,-86.500222 32.538684,-86.499455 32.538726,-86.497168 32.538877,-86.496655 32.538899,-86.49631 32.5389,-86.495793 32.538892,-86.495196 32.538854)\r\n616;630;even;Vintage Way;Autauga;AL;36067;LINESTRING(-86.449647 32.426613,-86.449173 32.426977,-86.448879 32.427091,-86.448659 32.427105,-86.448536 32.427144)\r\n619;639;odd;Vintage Way;Autauga;AL;36067;LINESTRING(-86.449781 32.426733,-86.449299 32.427133,-86.448933 32.427279,-86.448695 32.427285,-86.44859 32.427302)\r\n3658;3698;even;State Rte 14;Autauga;AL;36003;LINESTRING(-86.800336 32.462748,-86.804333 32.464265,-86.804455 32.464305)\r\n3659;3699;odd;State Rte 14;Autauga;AL;36003;LINESTRING(-86.800416 32.462597,-86.804411 32.464111,-86.804527 32.464152)\r\n1500;1598;all;Rushmore Dr;Autauga;AL;36022;LINESTRING(-86.418414 32.508172,-86.419094 32.508166)\r\n100;198;even;New Moon Ct;Autauga;AL;36067;LINESTRING(-86.46233 32.457946,-86.462423 32.457904,-86.462493 32.457857,-86.462636 32.457776,-86.462715 32.457728,-86.462785 32.45767,-86.46286 32.457603,-86.462936 32.457422)\r\n101;199;odd;New Moon Ct;Autauga;AL;36067;LINESTRING(-86.462231 32.457804,-86.462309 32.45776,-86.462377 32.457719,-86.46252 32.457638,-86.462581 32.457596,-86.462635 32.457552,-86.46267 32.457507,-86.462756 32.457358)\r\n1577;1601;all;US Hwy 31;Autauga;AL;36067;LINESTRING(-86.455827 32.53399,-86.455871 32.534475,-86.455907 32.534688,-86.456013 32.53555,-86.456085 32.53605,-86.456143 32.536481,-86.45616 32.536695)\r\n1910;1914;even;Fairview Ave;Autauga;AL;36066;LINESTRING(-86.417715 32.482844,-86.417192 32.482946,-86.416857 32.483025,-86.416532 32.483119,-86.416126 32.483245,-86.415798 32.483364)\r\n1901;1915;odd;Fairview Ave;Autauga;AL;36066;LINESTRING(-86.417759 32.483004,-86.417242 32.483108,-86.416917 32.483187,-86.416598 32.483277,-86.4162 32.483401,-86.415874 32.483516)\r\n900;950;all;Raines Dr;Autauga;AL;36067;LINESTRING(-86.60078 32.651984,-86.600825 32.652011,-86.604455 32.65195,-86.606561 32.651918,-86.606636 32.65193,-86.606717 32.651952,-86.606785 32.651997,-86.606878 32.652102,-86.607009 32.652344,-86.607291 32.652662,-86.607349 32.652698)\r\n3047;3083;all;US Hwy 31;Autauga;AL;36051;LINESTRING(-86.490516 32.702995,-86.490386 32.703251,-86.490037 32.703835,-86.489591 32.704617,-86.488934 32.705712,-86.488556 32.706361,-86.488097 32.707135,-86.488002 32.707276)\r\n799;601;all;Aljuise Dr;Autauga;AL;36067;LINESTRING(-86.68529 32.524046,-86.68529 32.524108)\r\n400;498;even;Montana Ct;Autauga;AL;36067;LINESTRING(-86.487695 32.476928,-86.487692 32.477083,-86.487684 32.47723,-86.487686 32.4776,-86.487709 32.477786)\r\n401;499;odd;Montana Ct;Autauga;AL;36067;LINESTRING(-86.487889 32.476928,-86.487892 32.477087,-86.487882 32.477234,-86.487888 32.477592,-86.487903 32.477772)\r\n3600;3692;even;Autauga County 127;Autauga;AL;36006;LINESTRING(-86.768088 32.647626,-86.768213 32.647881,-86.768273 32.648015,-86.768324 32.648151,-86.768363 32.648288,-86.768398 32.648496,-86.768413 32.648709,-86.768412 32.648848,-86.768389 32.64913,-86.768367 32.649266,-86.768314 32.649468,-86.768266 32.649599,-86.768025 32.650114,-86.767966 32.650258,-86.767727 32.650723,-86.767696 32.6508,-86.767672 32.650881,-86.76765 32.651036,-86.767649 32.651117,-86.767648 32.651197,-86.767674 32.651351,-86.767755 32.651638,-86.767881 32.652049,-86.767953 32.652332,-86.768013 32.652618,-86.7681 32.653122,-86.768179 32.653547,-86.768195 32.653685,-86.768202 32.653896,-86.768185 32.654401,-86.76818 32.654812)\r\n3601;3693;odd;Autauga County 127;Autauga;AL;36006;LINESTRING(-86.768267 32.647562,-86.768397 32.647819,-86.768461 32.647959,-86.768518 32.648105,-86.768563 32.648256,-86.7686 32.64848,-86.768613 32.648705,-86.768612 32.648854,-86.768589 32.649146,-86.768567 32.649296,-86.76851 32.649512,-86.768456 32.649655,-86.768213 32.650172,-86.768154 32.65032,-86.767917 32.650785,-86.767892 32.650848,-86.767874 32.650913,-86.767852 32.65105,-86.767845 32.651117,-86.767852 32.651183,-86.767874 32.651319,-86.767947 32.651598,-86.768075 32.652011,-86.768149 32.6523,-86.768207 32.652592,-86.768294 32.653096,-86.768379 32.653525,-86.768397 32.653675,-86.768398 32.653898,-86.768381 32.654405,-86.768375 32.654814)\r\n748;1170;all;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.701419 32.522211,-86.701428 32.522269)\r\n123;101;odd;Autauga County 27;Autauga;AL;36067;LINESTRING(-86.5379 32.426004,-86.537903 32.426866,-86.537928 32.429064,-86.537933 32.43018)\r\n132;116;even;Autauga County 27;Autauga;AL;36067;LINESTRING(-86.538095 32.426003,-86.538099 32.426864,-86.538124 32.429062,-86.538128 32.430179)\r\n800;854;even;Gillespie St;Autauga;AL;36067;LINESTRING(-86.453992 32.462798,-86.453719 32.4629,-86.453567 32.462943,-86.453322 32.462993,-86.453159 32.463019,-86.452538 32.463096)\r\n809;899;odd;Gillespie St;Autauga;AL;36067;LINESTRING(-86.454073 32.462947,-86.453793 32.463062,-86.453621 32.463107,-86.453364 32.463159,-86.453191 32.463185,-86.452565 32.463259)\r\n445;419;odd;Cargill St;Autauga;AL;36067;LINESTRING(-86.488898 32.477587,-86.488887 32.477419,-86.488875 32.477054,-86.48885 32.476932)\r\n444;438;even;Cargill St;Autauga;AL;36067;LINESTRING(-86.488703 32.477597,-86.488691 32.477427,-86.488671 32.477068,-86.488657 32.476954)\r\n500;598;all;Langford Ct;Autauga;AL;36067;LINESTRING(-86.460376 32.428228,-86.460303 32.428305)\r\n800;898;even;Washington Ferry Rd;Autauga;AL;36067;LINESTRING(-86.464879 32.438661,-86.46488 32.438624,-86.464917 32.437151)\r\n847;899;odd;Washington Ferry Rd;Autauga;AL;36067;LINESTRING(-86.464685 32.438656,-86.464686 32.43862,-86.464723 32.437148)\r\n458;494;even;Autauga County 122;Autauga;AL;36022;LINESTRING(-86.425719 32.585966,-86.425691 32.58598,-86.425557 32.586052,-86.425416 32.586113,-86.425267 32.586165,-86.42488 32.586285,-86.424721 32.586338,-86.42456 32.586406,-86.424412 32.586495,-86.42434 32.586545,-86.424273 32.586598,-86.424211 32.586659,-86.424156 32.586722,-86.424102 32.586786,-86.423903 32.587104,-86.423861 32.587154,-86.423814 32.587197,-86.423765 32.587228,-86.42371 32.587251,-86.423643 32.587265,-86.423573 32.587275,-86.423238 32.587256,-86.420929 32.587177,-86.419743 32.587147,-86.419321 32.587115,-86.419231 32.587113,-86.419179 32.587117)\r\n459;495;odd;Autauga County 122;Autauga;AL;36022;LINESTRING(-86.42584 32.586095,-86.425809 32.58612,-86.425659 32.586204,-86.425498 32.586269,-86.425337 32.586321,-86.424952 32.586441,-86.424805 32.586494,-86.424666 32.586556,-86.424534 32.586631,-86.424474 32.586673,-86.424419 32.586718,-86.424367 32.586767,-86.424318 32.58682,-86.424278 32.586874,-86.424077 32.58719,-86.424027 32.58726,-86.423962 32.587327,-86.423877 32.587386,-86.423776 32.587421,-86.423675 32.587439,-86.423575 32.587441,-86.423228 32.587422,-86.420923 32.587343,-86.419731 32.587317,-86.419307 32.587283,-86.419233 32.587279,-86.419192 32.587281)\r\n1814;1824;even;Seasons Dr;Autauga;AL;36066;LINESTRING(-86.423971 32.455569,-86.423822 32.455624,-86.423742 32.455674,-86.423552 32.455833,-86.423263 32.456117,-86.423204 32.456194)\r\n1813;1821;odd;Seasons Dr;Autauga;AL;36066;LINESTRING(-86.424057 32.455717,-86.42393 32.455776,-86.423876 32.455808,-86.4237 32.455951,-86.423423 32.456223,-86.423363 32.456289)\r\n601;699;all;Autauga County32;Autauga;AL;36051;LINESTRING(-86.574832 32.68338,-86.574841 32.683348,-86.574859 32.683282,-86.575089 32.682585,-86.575145 32.682369,-86.575197 32.68215,-86.575211 32.681995,-86.575208 32.681841,-86.57518 32.681619,-86.575141 32.681397,-86.575102 32.681245,-86.575068 32.681168,-86.575027 32.68109,-86.574968 32.681017,-86.574894 32.68096,-86.574755 32.680861,-86.57461 32.680771,-86.574526 32.68074,-86.574368 32.680679,-86.573904 32.680525,-86.573829 32.680498,-86.573517 32.680387,-86.573293 32.680294,-86.573156 32.680224,-86.573044 32.68016,-86.573027 32.680146,-86.572902 32.680058,-86.572696 32.679927,-86.57255 32.67984,-86.572419 32.679793)\r\n2900;2952;even;State Rte 143;Autauga;AL;36022;LINESTRING(-86.456639 32.68957,-86.456917 32.690098,-86.457133 32.690495,-86.457611 32.691344,-86.457961 32.69188,-86.458189 32.692232,-86.458605 32.692845)\r\n2901;2961;odd;State Rte 143;Autauga;AL;36051;LINESTRING(-86.456817 32.689503,-86.457095 32.69003,-86.457311 32.690425,-86.457789 32.691266,-86.458133 32.6918,-86.458361 32.69215,-86.458774 32.692763)\r\n233;263;all;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.51199 32.418473,-86.511958 32.4186,-86.511858 32.418903)\r\n511;699;all;Cook Rd;Autauga;AL;36067;LINESTRING(-86.483685 32.452283,-86.483574 32.452175,-86.483503 32.452066)\r\n231;219;odd;Deerwood Dr;Autauga;AL;36067;LINESTRING(-86.483011 32.455614,-86.482822 32.455739,-86.482692 32.455808,-86.48263 32.45583,-86.482403 32.455878,-86.482073 32.455895,-86.481817 32.455896,-86.481549 32.455898)\r\n230;222;even;Deerwood Dr;Autauga;AL;36067;LINESTRING(-86.483134 32.455741,-86.482942 32.455879,-86.48279 32.455962,-86.4827 32.455998,-86.482435 32.456058,-86.482077 32.456063,-86.481817 32.45606,-86.481551 32.456062)\r\n417;409;all;Cargill St;Autauga;AL;36067;LINESTRING(-86.488358 32.476676,-86.488124 32.476684,-86.487966 32.476708,-86.487931 32.476714)\r\n1600;1618;even;Pink Lilly Rd;Autauga;AL;36067;LINESTRING(-86.478683 32.542267,-86.478679 32.542924,-86.478686 32.543284,-86.478675 32.543926)\r\n1611;1613;odd;Pink Lilly Rd;Autauga;AL;36067;LINESTRING(-86.478878 32.542268,-86.478875 32.542924,-86.47888 32.543284,-86.478869 32.543929)\r\n123;115;odd;Sycamore Dr;Autauga;AL;36066;LINESTRING(-86.44465 32.478077,-86.444643 32.477731,-86.444641 32.477223,-86.444634 32.476997)\r\n124;118;even;Sycamore Dr;Autauga;AL;36066;LINESTRING(-86.444456 32.47808,-86.444447 32.477733,-86.444445 32.477225,-86.44444 32.477)\r\n799;741;odd;2nd St;Autauga;AL;36703;LINESTRING(-86.795837 32.379126,-86.795771 32.379318,-86.795666 32.379595,-86.795326 32.380425,-86.795214 32.380706,-86.795171 32.380856,-86.795134 32.381005,-86.795118 32.381162,-86.795121 32.381318,-86.795139 32.381474,-86.79518 32.381624,-86.795223 32.381768,-86.795316 32.382048,-86.795352 32.382186,-86.795378 32.382326,-86.795395 32.382466,-86.795404 32.382606,-86.795402 32.382749,-86.79538 32.383036,-86.795294 32.383828,-86.795233 32.384298)\r\n738;694;even;2nd St;Autauga;AL;36703;LINESTRING(-86.796024 32.379171,-86.795961 32.379366,-86.795852 32.379647,-86.795512 32.380479,-86.795408 32.380754,-86.795365 32.380892,-86.795336 32.381029,-86.79532 32.381168,-86.795323 32.381308,-86.795341 32.381448,-86.795372 32.381586,-86.795413 32.381724,-86.79551 32.382006,-86.795548 32.382154,-86.795576 32.382304,-86.795595 32.382454,-86.795602 32.382602,-86.795602 32.382755,-86.795576 32.38305,-86.795488 32.383844,-86.795426 32.384316)\r\n507;501;odd;Sandstone Trl;Autauga;AL;36066;LINESTRING(-86.428897 32.468653,-86.428815 32.468453,-86.428744 32.468315,-86.428617 32.468119,-86.428443 32.46788,-86.428369 32.467696,-86.42835 32.467568,-86.428347 32.467483)\r\n510;500;even;Sandstone Trl;Autauga;AL;36066;LINESTRING(-86.428714 32.468709,-86.428629 32.468517,-86.428562 32.468391,-86.428443 32.468205,-86.428249 32.46796,-86.428157 32.467734,-86.428148 32.467574,-86.428152 32.467482)\r\n858;868;even;Autauga County 165;Autauga;AL;36067;LINESTRING(-86.590167 32.493098,-86.589779 32.493486,-86.589336 32.493921,-86.58888 32.494348,-86.58853 32.494659,-86.588046 32.495065,-86.587555 32.495462,-86.587303 32.495654,-86.586932 32.495925,-86.586526 32.496221,-86.586122 32.496526)\r\n863;999;odd;Autauga County 165;Autauga;AL;36067;LINESTRING(-86.590316 32.493203,-86.589929 32.493594,-86.589484 32.494031,-86.589024 32.494462,-86.58867 32.494775,-86.588184 32.495185,-86.587689 32.495584,-86.587433 32.49578,-86.58706 32.496049,-86.586656 32.496345,-86.586252 32.496649)\r\n2716;2700;even;Alt Rte Route County Road 59;Autauga;AL;36022;LINESTRING(-86.501817 32.653926,-86.501732 32.654057,-86.501487 32.654514,-86.501369 32.654698,-86.501088 32.655053,-86.500999 32.655184,-86.500928 32.655326,-86.500929 32.655344)\r\n2717;2701;odd;Alt Rte Route County Road 59;Autauga;AL;36022;LINESTRING(-86.50199 32.654003,-86.501912 32.654131,-86.501669 32.65459,-86.501543 32.654786,-86.50126 32.655143,-86.501185 32.65526,-86.501126 32.655382,-86.501118 32.655385)\r\n999;949;odd;Langford Ln;Autauga;AL;36067;LINESTRING(-86.460054 32.428451,-86.460044 32.428682,-86.460053 32.428723)\r\n998;948;even;Langford Ln;Autauga;AL;36067;LINESTRING(-86.460249 32.428455,-86.460246 32.428676,-86.460246 32.428706)\r\n199;101;odd;Gateway Ct;Autauga;AL;36067;LINESTRING(-86.507386 32.461127,-86.507367 32.461093,-86.507093 32.460802,-86.507027 32.460725)\r\n198;100;even;Gateway Ct;Autauga;AL;36067;LINESTRING(-86.507221 32.461214,-86.507199 32.461193,-86.506929 32.460902,-86.506866 32.460816)\r\n1800;1848;even;Autauga County 107;Autauga;AL;36066;LINESTRING(-86.463786 32.567854,-86.463298 32.568033,-86.46314 32.568098,-86.462977 32.568173,-86.462833 32.568273,-86.462767 32.568332,-86.462653 32.568448,-86.461691 32.569553,-86.461278 32.570012,-86.46107 32.570248,-86.460931 32.570437,-86.460806 32.570632,-86.460731 32.570768,-86.460668 32.570911,-86.460616 32.571053,-86.460559 32.571266,-86.460401 32.571903,-86.460198 32.572677,-86.460133 32.572887,-86.460108 32.572964)\r\n147;199;odd;Autauga County 107;Autauga;AL;36066;LINESTRING(-86.463864 32.568005,-86.463382 32.568185,-86.463234 32.568248,-86.463095 32.568319,-86.462971 32.568401,-86.462917 32.568446,-86.462811 32.568552,-86.461847 32.569653,-86.461436 32.570112,-86.461238 32.570344,-86.461105 32.570523,-86.460986 32.570708,-86.460917 32.570834,-86.460858 32.570965,-86.46081 32.571097,-86.460751 32.571302,-86.460593 32.571937,-86.46039 32.572715,-86.460325 32.572933,-86.460294 32.573012)\r\n1900;1902;even;Holly Brooke Ln;Autauga;AL;36066;LINESTRING(-86.41804 32.495838,-86.417877 32.495826,-86.417624 32.495797,-86.417607 32.495797)\r\n1901;1903;odd;Holly Brooke Ln;Autauga;AL;36066;LINESTRING(-86.418027 32.496002,-86.417857 32.495996,-86.4176 32.495963,-86.417585 32.49596)\r\n1364;1398;even;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.52046 32.486285,-86.521012 32.486378,-86.52134 32.486449,-86.521743 32.486562,-86.52206 32.486668,-86.524561 32.487631,-86.524827 32.487741,-86.524868 32.48776,-86.525239 32.487936,-86.525452 32.488052,-86.525723 32.488223,-86.525984 32.488407,-86.526168 32.488556,-86.5264 32.488767,-86.526564 32.488931,-86.526829 32.489216,-86.527294 32.489742,-86.527721 32.490204,-86.527997 32.490487,-86.528288 32.49076,-86.528401 32.490857)\r\n1319;1359;odd;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.520497 32.486124,-86.521056 32.486212,-86.521396 32.486287,-86.521811 32.486402,-86.522138 32.486512,-86.524645 32.487479,-86.524913 32.487593,-86.52496 32.48761,-86.525341 32.487792,-86.525566 32.487912,-86.525847 32.488091,-86.526118 32.488279,-86.52631 32.488438,-86.526548 32.488655,-86.526718 32.488825,-86.526985 32.489114,-86.52745 32.48964,-86.527875 32.4901,-86.528147 32.490377,-86.528432 32.490646,-86.52854 32.490742)\r\n1200;1208;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.487268 32.4323,-86.487719 32.4321)\r\n1498;1400;even;Rice Park Cir;Autauga;AL;36067;LINESTRING(-86.500015 32.461332,-86.500036 32.46144,-86.500115 32.461799,-86.500193 32.462014,-86.500344 32.462417)\r\n1369;1301;odd;Rice Park Cir;Autauga;AL;36067;LINESTRING(-86.500207 32.461304,-86.50023 32.46141,-86.500313 32.461759,-86.500381 32.461966,-86.500529 32.462368)\r\n700;798;all;E Main St;Autauga;AL;36067;LINESTRING(-86.456559 32.459939,-86.456122 32.460002,-86.455609 32.460063,-86.454855 32.460126,-86.454419 32.460154,-86.454001 32.460174,-86.453146 32.460193,-86.452614 32.460183)\r\n1814;1824;even;Tara Dr;Autauga;AL;36066;LINESTRING(-86.423728 32.453646,-86.423448 32.453658,-86.422171 32.453671,-86.422071 32.453676)\r\n1813;1823;odd;Tara Dr;Autauga;AL;36066;LINESTRING(-86.423739 32.45381,-86.423454 32.453826,-86.422177 32.453839,-86.422079 32.453841)\r\n2300;2310;even;Hilltop Farm Rd;Autauga;AL;36067;LINESTRING(-86.593912 32.489761,-86.59466 32.490117,-86.595411 32.490467,-86.595716 32.490603,-86.596243 32.490851,-86.596498 32.490957)\r\n2301;2307;odd;Hilltop Farm Rd;Autauga;AL;36067;LINESTRING(-86.594007 32.489618,-86.594754 32.489973,-86.595505 32.490321,-86.59581 32.490457,-86.596335 32.490703,-86.596585 32.490809)\r\n2101;2299;all;Autauga County 38;Autauga;AL;36006;LINESTRING(-86.732098 32.52315,-86.732144 32.523169,-86.732363 32.523277,-86.732507 32.523337,-86.732736 32.523415,-86.733048 32.523505,-86.733863 32.523693,-86.734191 32.523783,-86.734434 32.523857,-86.735622 32.524262,-86.735782 32.524328,-86.735937 32.524403,-86.736083 32.52449,-86.736155 32.524539,-86.736341 32.524699,-86.73687 32.525178,-86.736926 32.525241,-86.736978 32.525308,-86.737021 32.525381,-86.737055 32.525458,-86.737077 32.525536,-86.737094 32.525615,-86.737205 32.526988,-86.737256 32.527416,-86.737284 32.527551,-86.737326 32.527683,-86.737381 32.527812,-86.73745 32.527936,-86.737574 32.528118,-86.737762 32.528355,-86.7385 32.529242,-86.738808 32.529586,-86.739239 32.530033,-86.739644 32.530406,-86.739809 32.530579,-86.739957 32.530764,-86.740091 32.530952,-86.740215 32.531149,-86.740319 32.531353,-86.740376 32.531495,-86.74042 32.53164,-86.740515 32.531988,-86.740564 32.532117,-86.740626 32.532242,-86.740743 32.532426,-86.74088 32.532597,-86.740982 32.532701,-86.741215 32.532904,-86.741584 32.533201,-86.742031 32.533538,-86.742154 32.533646,-86.742322 32.533817,-86.742648 32.534154,-86.742699 32.534223,-86.742745 32.534295,-86.742881 32.534643,-86.743092 32.535119,-86.743141 32.535266,-86.743158 32.535343,-86.74317 32.535423,-86.743172 32.535719,-86.743168 32.536016,-86.743139 32.536236,-86.743105 32.536452,-86.743088 32.53666,-86.743094 32.536798,-86.743102 32.536865,-86.743116 32.536927,-86.743136 32.536985,-86.743165 32.537038,-86.743201 32.537085,-86.743248 32.537127,-86.743301 32.537164,-86.744466 32.537756,-86.744612 32.537819,-86.744839 32.537902,-86.744913 32.537923,-86.74507 32.537957,-86.745316 32.537997,-86.745478 32.538013,-86.745724 32.538025,-86.75023 32.537957,-86.750576 32.537955,-86.750755 32.537965,-86.750934 32.537995,-86.750981 32.538012,-86.751024 32.538018,-86.751111 32.538054,-86.751196 32.538095,-86.75128 32.53815,-86.751349 32.538222,-86.751395 32.538305,-86.751419 32.538388,-86.751435 32.538471,-86.751441 32.538624,-86.751429 32.538921,-86.751356 32.539717,-86.751315 32.540438,-86.751275 32.540946,-86.751187 32.541739,-86.751067 32.542528,-86.751034 32.542809,-86.750992 32.543604,-86.750974 32.544405,-86.75092 32.545057,-86.750922 32.545193,-86.75093 32.545257,-86.750947 32.54532,-86.750997 32.545454,-86.751074 32.545629)\r\n501;519;all;Weatherby Trl;Autauga;AL;36067;LINESTRING(-86.472897 32.449533,-86.472884 32.448659,-86.472843 32.448591,-86.472759 32.448537,-86.472619 32.448513,-86.472157 32.448506)\r\n511;501;odd;Old Mill Way;Autauga;AL;36067;LINESTRING(-86.450696 32.427255,-86.450729 32.427239,-86.450782 32.427212,-86.450843 32.427179,-86.450908 32.427147,-86.450974 32.427116,-86.451115 32.427055,-86.451189 32.427026,-86.451265 32.426998,-86.451345 32.426973,-86.451423 32.426951,-86.451588 32.426912,-86.45167 32.426895,-86.451753 32.42688,-86.451832 32.426867,-86.4519 32.426856,-86.451932 32.426851)\r\n516;500;even;Old Mill Way;Autauga;AL;36067;LINESTRING(-86.450592 32.427116,-86.450625 32.427097,-86.45068 32.42707,-86.450741 32.427039,-86.450808 32.427003,-86.45088 32.426968,-86.451029 32.426903,-86.451109 32.426872,-86.451191 32.426844,-86.451277 32.426813,-86.451365 32.426789,-86.45154 32.426748,-86.451628 32.426733,-86.451713 32.426718,-86.451794 32.426703,-86.451868 32.426692,-86.451902 32.426688)\r\n201;203;all;Simmons Rd;Autauga;AL;36067;LINESTRING(-86.525662 32.440562,-86.525646 32.441079,-86.525645 32.44114)\r\n3484;3598;even;Autauga County 26;Autauga;AL;36006;LINESTRING(-86.751097 32.654845,-86.751157 32.654855,-86.751293 32.654879,-86.751488 32.654914,-86.751816 32.654983,-86.753633 32.655407,-86.753877 32.655468,-86.754034 32.655513,-86.754269 32.655593,-86.754494 32.655683,-86.754715 32.655789,-86.754853 32.655864,-86.755058 32.655991,-86.755187 32.65608,-86.755375 32.656222,-86.755639 32.656416,-86.755781 32.656504,-86.756001 32.656633,-86.756231 32.656746,-86.756465 32.656847,-86.756708 32.656942,-86.756876 32.656992,-86.757213 32.657082,-86.75756 32.657147,-86.757823 32.657184,-86.758173 32.657203,-86.759033 32.657219,-86.759381 32.657218,-86.759815 32.657205,-86.760166 32.65717,-86.760338 32.657143,-86.760764 32.657068,-86.760937 32.657028,-86.761186 32.65696,-86.762892 32.656467,-86.763213 32.656384,-86.763372 32.656352,-86.763701 32.656306,-86.764033 32.656281,-86.764197 32.656276,-86.764362 32.656282,-86.764701 32.656307,-86.765558 32.656392,-86.765994 32.656417,-86.766173 32.656417,-86.766354 32.656407,-86.766535 32.656392,-86.766886 32.656329,-86.767066 32.656285,-86.767234 32.656233,-86.767563 32.656113,-86.768289 32.6558,-86.768382 32.655756)\r\n3401;3493;odd;Autauga County 26;Autauga;AL;36006;LINESTRING(-86.751131 32.654683,-86.751195 32.654691,-86.751333 32.654717,-86.751532 32.65475,-86.751866 32.654821,-86.753687 32.655247,-86.753937 32.655308,-86.754104 32.655355,-86.754349 32.655437,-86.754586 32.655533,-86.754819 32.655643,-86.754967 32.655724,-86.755182 32.655857,-86.755317 32.655954,-86.755505 32.656098,-86.755765 32.656284,-86.755897 32.656368,-86.756109 32.656489,-86.756327 32.656598,-86.756551 32.656695,-86.756784 32.656784,-86.75694 32.656832,-86.757265 32.656916,-86.757598 32.656981,-86.757847 32.657014,-86.758183 32.657035,-86.759035 32.657053,-86.759377 32.65705,-86.759799 32.657035,-86.760136 32.657002,-86.7603 32.656979,-86.760716 32.656904,-86.760881 32.656866,-86.761124 32.656802,-86.76283 32.656309,-86.763159 32.656218,-86.763332 32.656186,-86.763675 32.656136,-86.764023 32.656111,-86.764199 32.65611,-86.764374 32.656114,-86.764721 32.656141,-86.765576 32.656224,-86.766 32.656247,-86.766167 32.656247,-86.766338 32.656239,-86.766503 32.656222,-86.766838 32.656163,-86.767004 32.656123,-86.76716 32.656075,-86.767477 32.655959,-86.768197 32.655652,-86.768289 32.655611)\r\n1544;1598;even;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.683536 32.567949,-86.68353 32.567964,-86.683201 32.568858,-86.683084 32.569121,-86.682948 32.56938,-86.682832 32.569566,-86.682746 32.569682,-86.682292 32.570203,-86.68215 32.570391,-86.682019 32.570582,-86.681862 32.570847,-86.681758 32.571052,-86.681727 32.571125,-86.681682 32.571272,-86.681656 32.571423,-86.68164 32.571574,-86.681641 32.571726,-86.681649 32.571875,-86.681688 32.572236,-86.681735 32.572811,-86.681739 32.572969)\r\n1561;1599;odd;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.683723 32.567994,-86.683718 32.568012,-86.683391 32.568912,-86.68327 32.569185,-86.683128 32.569454,-86.683006 32.56965,-86.682914 32.569778,-86.682458 32.570299,-86.68232 32.570479,-86.682195 32.570662,-86.682044 32.570919,-86.681946 32.571114,-86.681921 32.571175,-86.681882 32.571306,-86.681856 32.571443,-86.681842 32.571582,-86.681839 32.571722,-86.681847 32.571863,-86.681884 32.572222,-86.681935 32.572805,-86.681934 32.572968)\r\n101;199;all;Monroe Dr;Autauga;AL;36067;LINESTRING(-86.497981 32.431047,-86.497796 32.431848,-86.498246 32.43191,-86.498102 32.432915)\r\n124;130;even;Country Club Dr;Autauga;AL;36067;LINESTRING(-86.471903 32.440529,-86.471895 32.440531,-86.4717 32.440663,-86.47149 32.440816,-86.471328 32.441021,-86.471283 32.441187,-86.471287 32.441204)\r\n121;131;odd;Country Club Dr;Autauga;AL;36067;LINESTRING(-86.472035 32.44065,-86.472027 32.440661,-86.47183 32.440793,-86.471656 32.440936,-86.471532 32.441099,-86.471487 32.441219,-86.47148 32.441223)\r\n136;198;even;Bryan St;Autauga;AL;36066;LINESTRING(-86.436959 32.464776,-86.436961 32.464774,-86.436964 32.464709,-86.436979 32.464655,-86.437001 32.464588)\r\n135;199;odd;Bryan St;Autauga;AL;36066;LINESTRING(-86.436764 32.464787,-86.436761 32.464778,-86.43676 32.464697,-86.436767 32.464605,-86.436822 32.464522)\r\n1926;1944;even;Calumet Pkwy;Autauga;AL;36066;LINESTRING(-86.414489 32.489502,-86.414306 32.489488,-86.414215 32.489486,-86.414122 32.48949,-86.41403 32.489504,-86.413942 32.489529,-86.413857 32.489561,-86.413778 32.489599,-86.413699 32.489641,-86.413623 32.489694,-86.413558 32.489753,-86.413343 32.489981,-86.412917 32.490393)\r\n1923;1945;odd;Calumet Pkwy;Autauga;AL;36066;LINESTRING(-86.414474 32.489666,-86.414296 32.489656,-86.414221 32.489654,-86.41415 32.489662,-86.41408 32.489674,-86.414014 32.489691,-86.413947 32.489715,-86.413882 32.489745,-86.413821 32.489781,-86.413763 32.489822,-86.41371 32.489867,-86.413495 32.490089,-86.413063 32.490502)\r\n700;798;even;William Wood Ct;Autauga;AL;36067;LINESTRING(-86.45634 32.448009,-86.456352 32.447957,-86.456344 32.447867)\r\n799;701;odd;William Wood Ct;Autauga;AL;36067;LINESTRING(-86.456147 32.447988,-86.456148 32.447949,-86.45615 32.447872)\r\n100;498;all;S McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.418198 32.464064,-86.418198 32.464056,-86.418191 32.463211)\r\n2301;2355;all;Big Springs Church Rd;Autauga;AL;36006;LINESTRING(-86.718867 32.639686,-86.718844 32.639866,-86.718801 32.640014,-86.718723 32.640227,-86.718629 32.640435,-86.718304 32.641031,-86.71821 32.641231,-86.718126 32.641435,-86.718081 32.641571,-86.718049 32.641688,-86.717994 32.641927,-86.717932 32.642144,-86.717833 32.642426,-86.717727 32.642701,-86.717707 32.642765,-86.717629 32.643128,-86.717557 32.643346,-86.717521 32.643418,-86.717385 32.643684,-86.717298 32.643883,-86.717276 32.643946,-86.717241 32.644085,-86.717217 32.644225,-86.717205 32.644366,-86.717203 32.645089,-86.717199 32.645451,-86.717175 32.64567,-86.71712 32.645965,-86.716997 32.64647,-86.716822 32.647053)\r\n1899;1813;odd;Briarwood St;Autauga;AL;36066;LINESTRING(-86.418255 32.464267,-86.418526 32.464259,-86.419208 32.464246,-86.419422 32.464243)\r\n1898;1816;even;Briarwood St;Autauga;AL;36066;LINESTRING(-86.418247 32.464103,-86.41852 32.464093,-86.419204 32.46408,-86.41942 32.464079)\r\n299;201;odd;Sheila Blvd;Autauga;AL;36066;LINESTRING(-86.426801 32.445339,-86.426988 32.445134,-86.427446 32.444524,-86.427524 32.444428)\r\n298;200;even;Sheila Blvd;Autauga;AL;36066;LINESTRING(-86.426646 32.44524,-86.426822 32.445036,-86.42728 32.44443,-86.427366 32.444332)\r\n901;999;odd;Goodson Rd;Autauga;AL;36067;LINESTRING(-86.57597 32.538091,-86.575589 32.538078,-86.57541 32.538077,-86.575232 32.538089,-86.575055 32.538106,-86.574876 32.538134,-86.57462 32.538206,-86.574227 32.538353,-86.574076 32.538397,-86.573932 32.538426,-86.57376 32.538448,-86.573598 32.538459,-86.572735 32.538466,-86.572556 32.538489,-86.57238 32.538515,-86.572206 32.538553,-86.572038 32.538598,-86.57155 32.538741,-86.570235 32.539101,-86.570068 32.539162,-86.569906 32.539237,-86.569759 32.53933,-86.569623 32.539434,-86.569153 32.539866,-86.569034 32.539964,-86.56891 32.540049,-86.568777 32.540118,-86.568632 32.540173,-86.568476 32.540217,-86.56815 32.540288,-86.567816 32.540346,-86.567483 32.54039,-86.567176 32.540414)\r\n998;922;even;Goodson Rd;Autauga;AL;36067;LINESTRING(-86.575963 32.538256,-86.575585 32.538246,-86.575418 32.538247,-86.575252 32.538257,-86.575087 32.538274,-86.574928 32.538302,-86.574694 32.538366,-86.574303 32.538511,-86.574132 32.538567,-86.573968 32.538588,-86.573784 32.538624,-86.573604 32.538625,-86.572749 32.53864,-86.572586 32.538655,-86.572422 32.538681,-86.57226 32.538715,-86.5721 32.538756,-86.571612 32.538899,-86.570307 32.539261,-86.570158 32.539316,-86.570018 32.539383,-86.569887 32.539464,-86.569765 32.539556,-86.569297 32.539982,-86.569172 32.54009,-86.569032 32.540193,-86.568873 32.540274,-86.568704 32.540333,-86.568532 32.540379,-86.568194 32.540452,-86.567852 32.540512,-86.567507 32.54056,-86.567191 32.540578)\r\n2599;2501;odd;Bates Ln;Autauga;AL;36003;LINESTRING(-86.652496 32.428172,-86.652289 32.428291,-86.65215 32.428387,-86.652086 32.428437,-86.652025 32.428479,-86.651816 32.428602,-86.651523 32.428759,-86.651459 32.428803)\r\n2598;2500;even;Bates Ln;Autauga;AL;36003;LINESTRING(-86.652608 32.428306,-86.652411 32.428427,-86.652284 32.428515,-86.65222 32.428569,-86.652143 32.428617,-86.651924 32.42874,-86.651637 32.428899,-86.651574 32.428935)\r\n601;799;odd;Becky Ln;Autauga;AL;36067;LINESTRING(-86.615218 32.516804,-86.615211 32.5169,-86.615209 32.516989,-86.61524 32.517075,-86.615284 32.517154,-86.615484 32.517394,-86.615648 32.517637,-86.615714 32.51776,-86.615737 32.517819,-86.615754 32.51788,-86.615798 32.518159,-86.615831 32.518603,-86.615912 32.518758,-86.615978 32.518832,-86.616116 32.518934,-86.616283 32.519063,-86.61631 32.519103,-86.616328 32.519142,-86.616318 32.519197,-86.616254 32.519406,-86.616242 32.519569,-86.616271 32.519738,-86.616332 32.519847,-86.616406 32.519893)\r\n600;798;even;Becky Ln;Autauga;AL;36067;LINESTRING(-86.615412 32.516815,-86.615405 32.5169,-86.615419 32.516957,-86.615436 32.517013,-86.615466 32.517066,-86.615656 32.517302,-86.615828 32.517559,-86.615902 32.517696,-86.615935 32.517771,-86.615954 32.51785,-86.615996 32.518141,-86.616047 32.518557,-86.6161 32.518668,-86.616136 32.518712,-86.616248 32.518806,-86.616457 32.518941,-86.616524 32.519041,-86.61653 32.519136,-86.616528 32.519227,-86.616462 32.519436,-86.616444 32.519561,-86.616479 32.51968,-86.616514 32.519737,-86.616543 32.519777)\r\n198;100;even;Little Farm Ct;Autauga;AL;36066;LINESTRING(-86.416161 32.468238,-86.416167 32.468207,-86.41618 32.468061,-86.416181 32.468033)\r\n199;101;odd;Little Farm Ct;Autauga;AL;36066;LINESTRING(-86.415967 32.468219,-86.415969 32.468191,-86.41598 32.468043,-86.415989 32.46801)\r\n1130;1198;even;Eds Dr;Autauga;AL;36067;LINESTRING(-86.498484 32.47806,-86.498675 32.477754,-86.498685 32.477508,-86.498702 32.477117,-86.498655 32.476618)\r\n1113;1199;odd;Eds Dr;Autauga;AL;36067;LINESTRING(-86.498309 32.477988,-86.498455 32.477704,-86.498487 32.477498,-86.498504 32.477121,-86.498461 32.47663)\r\n399;391;odd;Autauga County 27;Autauga;AL;36067;LINESTRING(-86.529005 32.397445,-86.529058 32.397451,-86.529417 32.397504,-86.529954 32.397592,-86.530718 32.397725,-86.531139 32.397808,-86.53147 32.397882,-86.53196 32.398006,-86.532283 32.398097,-86.532756 32.39825)\r\n398;340;even;Autauga County 27;Autauga;AL;36067;LINESTRING(-86.529004 32.39728,-86.529078 32.397273,-86.529455 32.397342,-86.529992 32.39743,-86.53076 32.397563,-86.531187 32.397646,-86.531524 32.397722,-86.53202 32.397846,-86.532351 32.397939,-86.532826 32.398097)\r\n2400;2498;even;S Fork Dr;Autauga;AL;36067;LINESTRING(-86.59844 32.491369,-86.598474 32.491353,-86.598788 32.491205,-86.599046 32.49097,-86.599153 32.490799,-86.59947 32.4904,-86.599543 32.490352,-86.600255 32.490125,-86.600557 32.489975,-86.600837 32.489846,-86.601123 32.489709,-86.601445 32.489575,-86.601943 32.489459,-86.604104 32.488931,-86.604489 32.488766)\r\n2401;2499;odd;S Fork Dr;Autauga;AL;36067;LINESTRING(-86.598329 32.491234,-86.598364 32.491209,-86.59865 32.491059,-86.598872 32.490862,-86.598981 32.490711,-86.599304 32.490266,-86.599441 32.490188,-86.600167 32.489965,-86.600463 32.489831,-86.600741 32.489702,-86.601029 32.489563,-86.601367 32.489405,-86.601891 32.489297,-86.604028 32.488765,-86.604404 32.488618)\r\n200;298;even;Meharry St;Autauga;AL;36067;LINESTRING(-86.471493 32.48123,-86.4731 32.481272,-86.473186 32.481276)\r\n201;299;odd;Meharry St;Autauga;AL;36067;LINESTRING(-86.471499 32.481066,-86.473108 32.481106,-86.473198 32.481111)\r\n1201;1221;all;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.702662 32.524435,-86.702681 32.525677,-86.702694 32.527707)\r\n198;100;even;Carleton St;Autauga;AL;36067;LINESTRING(-86.485259 32.481896,-86.485262 32.481895,-86.485378 32.481804,-86.485568 32.481686,-86.485672 32.481642,-86.485768 32.481621,-86.486084 32.481606)\r\n199;101;odd;Carleton St;Autauga;AL;36067;LINESTRING(-86.485119 32.481782,-86.485122 32.481777,-86.485244 32.481672,-86.485456 32.481534,-86.485596 32.481474,-86.485736 32.481439,-86.48608 32.481441)\r\n200;228;even;Pine Level Ridge;Autauga;AL;36022;LINESTRING(-86.465474 32.584703,-86.465535 32.584704,-86.466432 32.58473,-86.466548 32.584762,-86.466559 32.584775,-86.466581 32.584817,-86.466622 32.586641,-86.466642 32.58678,-86.466717 32.58685,-86.466813 32.586956,-86.467103 32.586993,-86.46794 32.58698)\r\n101;221;odd;Pine Level Ridge;Autauga;AL;36022;LINESTRING(-86.465476 32.584538,-86.465539 32.584538,-86.466466 32.584546,-86.466654 32.584592,-86.466769 32.584665,-86.466793 32.584795,-86.46683 32.586623,-86.466856 32.586702,-86.466875 32.58674,-86.466933 32.586774,-86.467123 32.586815,-86.467938 32.586816)\r\n319;225;odd;N Pickett St;Autauga;AL;36003;LINESTRING(-86.65604 32.437231,-86.655627 32.436687,-86.655273 32.436232)\r\n320;300;even;N Pickett St;Autauga;AL;36003;LINESTRING(-86.655876 32.43732,-86.655463 32.436777,-86.655111 32.436322)\r\n1699;1601;all;Ewell Ln;Autauga;AL;36067;LINESTRING(-86.473879 32.539958,-86.473883 32.539924,-86.473877 32.539854,-86.473867 32.539802,-86.473864 32.539788)\r\n100;198;even;Cottage Ct;Autauga;AL;36067;LINESTRING(-86.468492 32.438729,-86.467776 32.438762)\r\n101;199;odd;Cottage Ct;Autauga;AL;36067;LINESTRING(-86.468503 32.438894,-86.467787 32.438927)\r\n2099;2001;odd;Glenforest Dr;Autauga;AL;36067;LINESTRING(-86.541662 32.577494,-86.541663 32.577401,-86.541649 32.577253,-86.54146 32.575955)\r\n2098;2008;even;Glenforest Dr;Autauga;AL;36067;LINESTRING(-86.541467 32.577496,-86.541463 32.577409,-86.541451 32.577269,-86.541267 32.575974)\r\n114;198;even;Graylynn Dr;Autauga;AL;36066;LINESTRING(-86.438586 32.473072,-86.438462 32.472606,-86.438076 32.471201,-86.438032 32.470992,-86.438025 32.470928,-86.43802 32.470793)\r\n113;199;odd;Graylynn Dr;Autauga;AL;36066;LINESTRING(-86.438396 32.473108,-86.438272 32.472642,-86.43788 32.471235,-86.437832 32.471016,-86.437821 32.470938,-86.437826 32.470793)\r\n511;599;all;Avery St;Autauga;AL;36022;LINESTRING(-86.428356 32.584526,-86.428356 32.584498,-86.428362 32.584421,-86.428366 32.58434,-86.428378 32.584176,-86.428399 32.584004,-86.428423 32.583916,-86.428454 32.58383,-86.428537 32.583674,-86.42858 32.583596,-86.428623 32.583521,-86.428665 32.583446,-86.428705 32.583372,-86.428747 32.583299,-86.428786 32.583231,-86.428822 32.583167,-86.428855 32.583113,-86.428876 32.583079)\r\n618;698;even;River Birch Dr;Autauga;AL;36067;LINESTRING(-86.469697 32.570593,-86.469633 32.570552,-86.469546 32.570493,-86.469452 32.57043,-86.469351 32.570367,-86.469241 32.57032,-86.469131 32.570283,-86.469 32.570275,-86.468881 32.570275,-86.468767 32.57029,-86.46866 32.570312,-86.468555 32.570333,-86.468452 32.570358,-86.468352 32.570381,-86.468254 32.570403,-86.468156 32.570424,-86.46806 32.570445,-86.46797 32.570463,-86.467927 32.570475)\r\n613;699;odd;River Birch Dr;Autauga;AL;36067;LINESTRING(-86.469584 32.570727,-86.469511 32.570686,-86.469422 32.570623,-86.469334 32.570566,-86.469245 32.570517,-86.469159 32.57048,-86.469083 32.570461,-86.46899 32.570447,-86.468897 32.570449,-86.468803 32.570458,-86.468704 32.570474,-86.468605 32.570495,-86.468504 32.570518,-86.468402 32.570541,-86.468302 32.570563,-86.468204 32.570584,-86.468108 32.570605,-86.468022 32.570625,-86.46798 32.570633)\r\n198;196;all;Autauga County 27;Autauga;AL;36067;LINESTRING(-86.53804 32.416867,-86.538041 32.418809,-86.538047 32.419041,-86.538048 32.419084)\r\n3034;3048;even;State Rte 143;Autauga;AL;36051;LINESTRING(-86.468846 32.701708,-86.469355 32.701874,-86.469988 32.702091,-86.470545 32.702277,-86.470654 32.702307)\r\n3035;3049;odd;State Rte 143;Autauga;AL;36051;LINESTRING(-86.468916 32.701555,-86.469427 32.70172,-86.47006 32.701937,-86.470615 32.702119,-86.470718 32.702152)\r\n4066;4078;even;Fig Tree Dr;Autauga;AL;36749;LINESTRING(-86.84618 32.504359,-86.846207 32.504361,-86.846366 32.50437,-86.84653 32.504388,-86.84686 32.504445,-86.847011 32.504486,-86.847328 32.504599,-86.847503 32.504649,-86.847677 32.504675,-86.84768 32.504674)\r\n4059;4061;odd;Fig Tree Dr;Autauga;AL;36749;LINESTRING(-86.846178 32.504195,-86.846211 32.504193,-86.846386 32.5042,-86.846562 32.504222,-86.846912 32.504275,-86.847083 32.504326,-86.8474 32.504439,-86.847555 32.504481,-86.847721 32.504511,-86.847727 32.504514)\r\n400;498;all;Autauga County 27;Autauga;AL;36067;LINESTRING(-86.52869 32.397325,-86.528632 32.397338,-86.528474 32.397395,-86.527149 32.397897,-86.526676 32.398068,-86.525801 32.39836,-86.525153 32.398558,-86.524662 32.398716,-86.524412 32.398808,-86.524081 32.398952,-86.523915 32.399042,-86.523792 32.399103,-86.5237 32.399156)\r\n1606;1698;even;Autauga County 163;Autauga;AL;36051;LINESTRING(-86.583362 32.614013,-86.583344 32.614151,-86.583302 32.614577,-86.583273 32.615083,-86.583268 32.61566,-86.583297 32.616968,-86.583319 32.617264,-86.583343 32.617419,-86.583373 32.617496,-86.583406 32.617572,-86.583451 32.617644,-86.583503 32.617713,-86.583562 32.617775,-86.583625 32.617832,-86.58376 32.61793,-86.583903 32.618017,-86.58427 32.618204,-86.585019 32.618554,-86.585383 32.618739,-86.586599 32.619415,-86.586944 32.61962,-86.58707 32.619708,-86.587186 32.619802,-86.587237 32.619851,-86.587283 32.619902,-86.587321 32.619956,-86.587424 32.620143,-86.587474 32.620272,-86.587509 32.620405,-86.58754 32.620611,-86.58756 32.62104,-86.587562 32.621254,-86.587556 32.621616,-86.58755 32.622581)\r\n1607;1699;odd;Autauga County 163;Autauga;AL;36051;LINESTRING(-86.583556 32.61403,-86.58354 32.614167,-86.5835 32.614587,-86.583471 32.615087,-86.583464 32.61566,-86.583497 32.61696,-86.583521 32.617246,-86.583547 32.617381,-86.583565 32.617442,-86.583594 32.617502,-86.583627 32.617558,-86.583669 32.617613,-86.583716 32.617663,-86.583767 32.617708,-86.583886 32.617796,-86.584015 32.617875,-86.58437 32.618058,-86.585119 32.61841,-86.585489 32.618597,-86.586709 32.619277,-86.587066 32.619484,-86.587204 32.61958,-86.587332 32.619684,-86.587393 32.619743,-86.587449 32.619804,-86.587503 32.619872,-86.587616 32.620079,-86.58767 32.620226,-86.587711 32.620375,-86.587742 32.620597,-86.587758 32.621036,-86.587758 32.621254,-86.587752 32.621618,-86.587745 32.622582)\r\n1882;1998;even;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.464182 32.575048,-86.46418 32.576382,-86.464185 32.576887,-86.464183 32.579273,-86.464163 32.580789,-86.464163 32.581005,-86.464128 32.581655,-86.464139 32.582026)\r\n1887;1999;odd;US Hwy 31;Autauga;AL;36067;LINESTRING(-86.464377 32.575049,-86.464376 32.576382,-86.464381 32.576887,-86.464379 32.579273,-86.464359 32.580789,-86.464361 32.581009,-86.464324 32.581657,-86.464334 32.582022)\r\n1377;1383;all;Paula St;Autauga;AL;36067;LINESTRING(-86.457558 32.512627,-86.457318 32.513233,-86.457296 32.51329)\r\n872;898;even;Autauga County 1;Autauga;AL;36749;LINESTRING(-86.813207 32.553915,-86.811124 32.555442)\r\n875;899;odd;Autauga County 1;Autauga;AL;36749;LINESTRING(-86.813335 32.554039,-86.811252 32.555566)\r\n1791;1701;odd;Tara Dr;Autauga;AL;36066;LINESTRING(-86.427373 32.453783,-86.429034 32.453765,-86.42919 32.453777,-86.429285 32.453801,-86.429371 32.453844,-86.429411 32.45388,-86.429471 32.45395)\r\n1794;1700;even;Tara Dr;Autauga;AL;36066;LINESTRING(-86.427371 32.453618,-86.429036 32.453599,-86.429222 32.453597,-86.429373 32.453631,-86.429503 32.453702,-86.429585 32.453766,-86.42964 32.453868)\r\n1359;1363;all;Indian Hills Rd;Autauga;AL;36067;LINESTRING(-86.49783 32.46025,-86.497883 32.460215)\r\n1200;1298;even;Gardenia Cir;Autauga;AL;36067;LINESTRING(-86.4592 32.471688,-86.459214 32.471675,-86.459258 32.471621,-86.459362 32.47152,-86.459545 32.471392,-86.459678 32.471331,-86.45981 32.471289)\r\n1201;1299;odd;Gardenia Cir;Autauga;AL;36067;LINESTRING(-86.45903 32.471608,-86.459042 32.471583,-86.459096 32.471517,-86.459212 32.471394,-86.459427 32.471242,-86.459596 32.471167,-86.459752 32.471132)\r\n754;748;all;N Court St;Autauga;AL;36067;LINESTRING(-86.473954 32.473896,-86.474017 32.473792,-86.47412 32.4736,-86.474205 32.473402,-86.474214 32.473391)\r\n2700;2798;even;Norrell St;Autauga;AL;36006;LINESTRING(-86.719562 32.661277,-86.719608 32.661316,-86.71971 32.661408,-86.719717 32.661411)\r\n2701;2799;odd;Norrell St;Autauga;AL;36006;LINESTRING(-86.719683 32.661148,-86.719752 32.661186,-86.719868 32.6613,-86.719873 32.661312)\r\n1700;1798;all;Silver Hills Dr;Autauga;AL;36066;LINESTRING(-86.429288 32.454533,-86.429283 32.454481,-86.429315 32.454398,-86.42936 32.454332,-86.42958 32.454159)\r\n200;298;even;Wetumpka St;Autauga;AL;36067;LINESTRING(-86.46932 32.463461,-86.468811 32.463508,-86.468473 32.46355,-86.4674 32.463629)\r\n201;299;odd;Wetumpka St;Autauga;AL;36067;LINESTRING(-86.469342 32.463625,-86.468837 32.463674,-86.468497 32.463718,-86.467417 32.463793)\r\n599;501;odd;Marshall Rd;Autauga;AL;36067;LINESTRING(-86.490593 32.439846,-86.490167 32.439861,-86.489146 32.439872,-86.489066 32.439876)\r\n598;500;even;Marshall Rd;Autauga;AL;36067;LINESTRING(-86.490602 32.44001,-86.490173 32.440029,-86.489152 32.440038,-86.489074 32.44004)\r\n146;152;even;Lawrence St;Autauga;AL;36067;LINESTRING(-86.453821 32.44989,-86.453784 32.449889,-86.453596 32.449895,-86.4535 32.449926,-86.453407 32.449952,-86.453331 32.449997)\r\n145;147;odd;Lawrence St;Autauga;AL;36067;LINESTRING(-86.453825 32.450055,-86.453794 32.450057,-86.453636 32.450073,-86.453566 32.450086,-86.453499 32.450112,-86.45343 32.450139)\r\n601;621;all;E Main St;Autauga;AL;36067;LINESTRING(-86.458762 32.459946,-86.457535 32.46011,-86.456899 32.46019)\r\n2000;2016;even;Wood Valley Ridge;Autauga;AL;36066;LINESTRING(-86.456277 32.512002,-86.456183 32.512011,-86.456063 32.512029,-86.456012 32.512035,-86.455943 32.512044,-86.455876 32.512052,-86.455803 32.51206,-86.455644 32.512075,-86.455557 32.512079,-86.45546 32.512083,-86.455352 32.512083,-86.455241 32.512086,-86.455016 32.512089,-86.454904 32.51209,-86.454683 32.512092,-86.454579 32.512092,-86.454471 32.512094,-86.45429 32.512092,-86.454257 32.512092,-86.454149 32.512094,-86.454042 32.512095,-86.45382 32.512094,-86.453693 32.512099,-86.453575 32.512099,-86.453343 32.512104,-86.453234 32.512109,-86.453125 32.512107,-86.452919 32.512134,-86.45274 32.512094,-86.45269 32.512058,-86.452668 32.51203,-86.452655 32.511982,-86.452643 32.51192,-86.452649 32.511843,-86.452649 32.511831)\r\n2001;2099;odd;Wood Valley Ridge;Autauga;AL;36066;LINESTRING(-86.456304 32.512165,-86.456215 32.512177,-86.456093 32.512197,-86.456036 32.512201,-86.455971 32.512208,-86.455906 32.512216,-86.455829 32.512228,-86.455662 32.512241,-86.455565 32.512249,-86.455462 32.512247,-86.455356 32.512249,-86.455245 32.51225,-86.455018 32.512253,-86.454906 32.512254,-86.454685 32.512258,-86.454581 32.512258,-86.454471 32.51226,-86.454288 32.512258,-86.454259 32.512258,-86.454153 32.51226,-86.454044 32.512261,-86.453824 32.512262,-86.453697 32.512267,-86.453577 32.512265,-86.453353 32.512272,-86.45324 32.512279,-86.453139 32.512281,-86.452917 32.5123,-86.452632 32.512278,-86.4525 32.512168,-86.452468 32.512084,-86.452447 32.512008,-86.452449 32.51192,-86.452453 32.511835,-86.452454 32.511824)\r\n2038;2054;even;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.449334 32.543832,-86.449279 32.543882,-86.449168 32.543997,-86.448904 32.544292,-86.448002 32.545351,-86.447942 32.545417)\r\n2025;2045;odd;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.44948 32.54394,-86.449431 32.54399,-86.449324 32.544101,-86.449062 32.544392,-86.448162 32.545455,-86.448093 32.545522)\r\n2198;2100;even;Tommy Ln;Autauga;AL;36067;LINESTRING(-86.590237 32.523888,-86.587963 32.524091)\r\n2199;2101;odd;Tommy Ln;Autauga;AL;36067;LINESTRING(-86.590257 32.524052,-86.587983 32.524255)\r\n200;298;even;Pine Ridge;Autauga;AL;36067;LINESTRING(-86.478683 32.455124,-86.478813 32.455126,-86.479912 32.455116,-86.480148 32.45512)\r\n201;299;odd;Pine Ridge;Autauga;AL;36067;LINESTRING(-86.478687 32.45496,-86.478813 32.454962,-86.479912 32.45495,-86.480152 32.454955)\r\n700;798;even;Kathleen Ct;Autauga;AL;36067;LINESTRING(-86.455243 32.463586,-86.454858 32.463602,-86.454604 32.463603,-86.45444 32.463604,-86.454376 32.463589,-86.454367 32.463597)\r\n701;799;odd;Kathleen Ct;Autauga;AL;36067;LINESTRING(-86.455253 32.463751,-86.454864 32.46377,-86.454606 32.463769,-86.454428 32.463776,-86.454308 32.463769,-86.454278 32.463744)\r\n2300;2310;even;Autauga County 66;Autauga;AL;36067;LINESTRING(-86.496352 32.597525,-86.496355 32.597593,-86.496364 32.597687,-86.496412 32.597895,-86.496471 32.598006,-86.496566 32.598093,-86.496671 32.598146,-86.496718 32.598141)\r\n2301;2317;odd;Autauga County 66;Autauga;AL;36067;LINESTRING(-86.496547 32.597515,-86.496553 32.597579,-86.496566 32.597659,-86.496616 32.597837,-86.496655 32.597902,-86.496704 32.597947,-86.496747 32.597966,-86.49675 32.597978)\r\n490;598;all;Golson Rd;Autauga;AL;36067;LINESTRING(-86.541603 32.470786,-86.541163 32.470823,-86.541108 32.470825,-86.541096 32.470828)\r\n2000;2032;all;Autauga County 63;Autauga;AL;36067;LINESTRING(-86.575199 32.561676,-86.575197 32.561736,-86.575205 32.562031,-86.575217 32.562181,-86.575246 32.562335,-86.575293 32.562486,-86.575363 32.56263,-86.575616 32.563014,-86.575683 32.56314,-86.575739 32.563271,-86.575779 32.563404,-86.575805 32.563539,-86.575818 32.563678,-86.575824 32.563821,-86.575815 32.564548,-86.575814 32.564697,-86.575827 32.564845,-86.575855 32.56514,-86.57591 32.565433,-86.575946 32.56558,-86.575989 32.565724,-86.576037 32.565866,-86.576145 32.566144,-86.576442 32.566829,-86.576634 32.567236,-86.576708 32.567374,-86.576797 32.567507,-86.576898 32.567631,-86.577104 32.56787,-86.57768 32.56848)\r\n2182;2192;all;Airport Rd;Autauga;AL;36022;LINESTRING(-86.435767 32.610162,-86.435621 32.610162)\r\n900;998;even;Autauga County 5;Autauga;AL;36749;LINESTRING(-86.806054 32.56493,-86.806095 32.564936,-86.806244 32.564949,-86.807411 32.565087,-86.807659 32.565126,-86.807817 32.565161,-86.807888 32.565182,-86.807958 32.56521,-86.808026 32.565242,-86.808089 32.565279,-86.808148 32.565319,-86.808206 32.565365,-86.808257 32.565413,-86.808355 32.565518,-86.808496 32.565689,-86.809052 32.566414,-86.809268 32.566723,-86.809376 32.566914,-86.809433 32.567044,-86.80948 32.567174,-86.809603 32.567598,-86.809699 32.567881,-86.80981 32.568161,-86.809939 32.568431,-86.810078 32.568702,-86.810238 32.568962,-86.810415 32.569214,-86.810606 32.569462,-86.810806 32.569701,-86.811282 32.570215,-86.812612 32.57164,-86.813258 32.57233,-86.813291 32.572382,-86.813314 32.572436,-86.813339 32.572558,-86.813352 32.572688,-86.813292 32.573627,-86.813254 32.573906,-86.813152 32.574405,-86.813153 32.574565,-86.813167 32.57472,-86.813195 32.574876,-86.813225 32.574975)\r\n901;999;odd;Autauga County 5;Autauga;AL;36749;LINESTRING(-86.806083 32.564767,-86.806119 32.56477,-86.806268 32.564783,-86.807443 32.564921,-86.807701 32.56496,-86.807877 32.564995,-86.807966 32.565024,-86.808052 32.565058,-86.808132 32.565098,-86.808211 32.565141,-86.808282 32.565191,-86.80835 32.565247,-86.808411 32.565303,-86.808517 32.565418,-86.80866 32.565597,-86.80922 32.566326,-86.809448 32.566641,-86.809562 32.566848,-86.809625 32.56699,-86.809672 32.56713,-86.809795 32.567554,-86.809889 32.567831,-86.809998 32.568103,-86.810121 32.568367,-86.81026 32.568628,-86.810414 32.56888,-86.810585 32.569126,-86.81077 32.569368,-86.810966 32.569601,-86.811436 32.570113,-86.812766 32.571538,-86.813432 32.57223,-86.813487 32.57231,-86.813516 32.572394,-86.813543 32.57254,-86.813546 32.572688,-86.813492 32.573641,-86.813452 32.57393,-86.81336 32.574421,-86.813353 32.574559,-86.813367 32.5747,-86.813393 32.574844,-86.813415 32.574938)\r\n405;401;odd;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.82952 32.434544,-86.829537 32.434585,-86.829612 32.434773,-86.829633 32.43483)\r\n404;400;even;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.829702 32.434485,-86.829723 32.434527,-86.829804 32.434723,-86.829821 32.434787)\r\n200;214;even;Jay St;Autauga;AL;36066;LINESTRING(-86.424771 32.448499,-86.424717 32.448496,-86.424601 32.448498,-86.424298 32.448496,-86.423981 32.44849)\r\n207;213;odd;Jay St;Autauga;AL;36066;LINESTRING(-86.424764 32.448664,-86.424713 32.448664,-86.424601 32.448662,-86.424296 32.448662,-86.423976 32.448654)\r\n2358;2368;even;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.491763 32.605391,-86.491509 32.60598,-86.491327 32.606385,-86.491211 32.606661,-86.491136 32.606924)\r\n2371;2373;odd;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.491946 32.605447,-86.491693 32.606038,-86.491513 32.606441,-86.491405 32.606711,-86.491325 32.606964)\r\n3616;3656;even;State Rte 14;Autauga;AL;36003;LINESTRING(-86.795914 32.461072,-86.80007 32.462647)\r\n3617;3657;odd;State Rte 14;Autauga;AL;36003;LINESTRING(-86.795994 32.460921,-86.80015 32.462496)\r\n100;198;even;Greystone Ct;Autauga;AL;36066;LINESTRING(-86.425159 32.466629,-86.424977 32.466605,-86.424748 32.466554,-86.424647 32.466519)\r\n401;499;odd;Greystone Ct;Autauga;AL;36066;LINESTRING(-86.425134 32.466793,-86.424939 32.466775,-86.424672 32.466726,-86.424557 32.466665)\r\n800;814;even;Sweet Ridge Rd;Autauga;AL;36066;LINESTRING(-86.427747 32.452976,-86.427765 32.452976,-86.427916 32.452944,-86.428075 32.452931,-86.428738 32.452926)\r\n809;829;odd;Sweet Ridge Rd;Autauga;AL;36066;LINESTRING(-86.427669 32.452825,-86.427697 32.452808,-86.427884 32.452766,-86.428069 32.452763,-86.428737 32.452761)\r\n2100;2188;even;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.46419 32.598652,-86.464197 32.598921,-86.464201 32.599785,-86.464191 32.600217,-86.464195 32.600345,-86.464188 32.600409,-86.464188 32.600487,-86.464192 32.60055,-86.464184 32.601051,-86.464184 32.601124)\r\n2161;2183;odd;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.464384 32.598647,-86.464395 32.598919,-86.464397 32.599787,-86.464387 32.600215,-86.464393 32.600349,-86.464388 32.600417,-86.464386 32.600483,-86.46439 32.600546,-86.46438 32.601053,-86.464379 32.601125)\r\n701;799;odd;Karrh Rd;Autauga;AL;36067;LINESTRING(-86.511208 32.532797,-86.509726 32.533282)\r\n700;798;even;Karrh Rd;Autauga;AL;36067;LINESTRING(-86.511278 32.53295,-86.509796 32.533435)\r\n100;198;even;Lynn Dr;Autauga;AL;36066;LINESTRING(-86.448522 32.472691,-86.448562 32.472704,-86.448797 32.472784,-86.448977 32.472819,-86.449074 32.472822,-86.449248 32.47282,-86.44968 32.47281,-86.450026 32.472798,-86.450279 32.472774)\r\n101;199;odd;Lynn Dr;Autauga;AL;36066;LINESTRING(-86.448587 32.472536,-86.44863 32.472548,-86.448857 32.472616,-86.449007 32.472645,-86.44908 32.472652,-86.449246 32.472654,-86.449672 32.472644,-86.450012 32.47263,-86.450259 32.47261)\r\n2300;2340;all;State Rte 14;Autauga;AL;36003;LINESTRING(-86.648239 32.435781,-86.649768 32.435045)\r\n730;726;all;Criddle Rd;Autauga;AL;36067;LINESTRING(-86.556146 32.58349,-86.556187 32.583591,-86.556198 32.58373,-86.556193 32.583888,-86.556196 32.584047)\r\n100;198;even;Hillwood Rd;Autauga;AL;36067;LINESTRING(-86.462857 32.451371,-86.462848 32.45137,-86.462775 32.45139,-86.462699 32.451404,-86.462624 32.451411,-86.462456 32.451417,-86.46223 32.451414)\r\n101;105;odd;Hillwood Rd;Autauga;AL;36067;LINESTRING(-86.462935 32.451522,-86.46292 32.451532,-86.462827 32.451556,-86.462733 32.451574,-86.462636 32.451583,-86.462456 32.451581,-86.462228 32.451579)\r\n334;398;even;Janice St;Autauga;AL;36066;LINESTRING(-86.426519 32.443623,-86.42642 32.443574,-86.426144 32.443562,-86.425644 32.443551,-86.425434 32.443518)\r\n335;399;odd;Janice St;Autauga;AL;36066;LINESTRING(-86.426441 32.443774,-86.426364 32.443758,-86.426134 32.443732,-86.425618 32.443731,-86.42539 32.443678)\r\n199;101;odd;Ashley Dr;Autauga;AL;36051;LINESTRING(-86.481768 32.679669,-86.481818 32.679623,-86.48223 32.679315,-86.482647 32.67909,-86.482963 32.678956,-86.483249 32.67874,-86.483521 32.678258,-86.48379 32.677841,-86.484004 32.677398,-86.484155 32.67695,-86.484414 32.676473,-86.484508 32.676332,-86.484614 32.676329,-86.484799 32.67637,-86.485071 32.676461,-86.485329 32.676494,-86.485644 32.676506,-86.485985 32.676477,-86.486388 32.676484,-86.486682 32.676406,-86.486912 32.676352,-86.48718 32.67605,-86.487466 32.675525,-86.487891 32.674597)\r\n198;100;even;Ashley Dr;Autauga;AL;36051;LINESTRING(-86.481605 32.679579,-86.481652 32.679501,-86.482106 32.679173,-86.482545 32.678942,-86.482837 32.678806,-86.483067 32.678624,-86.483345 32.678182,-86.483604 32.677767,-86.48381 32.677342,-86.483957 32.676888,-86.484236 32.676403,-86.484364 32.67614,-86.484648 32.676145,-86.484863 32.67621,-86.485125 32.676287,-86.485351 32.676322,-86.485638 32.676338,-86.485975 32.676305,-86.486358 32.6763,-86.486622 32.676244,-86.48677 32.676186,-86.486996 32.675954,-86.48728 32.675457,-86.487709 32.674537)\r\n1200;1298;all;Cotton Gin Cut;Autauga;AL;36067;LINESTRING(-86.536795 32.394693,-86.53677 32.394708,-86.536724 32.394733,-86.536673 32.394764,-86.536617 32.394798,-86.536554 32.394836,-86.536487 32.394874,-86.53642 32.394913,-86.536355 32.394951,-86.536291 32.394989,-86.536226 32.395029,-86.536164 32.395068,-86.536099 32.395108,-86.536034 32.395151,-86.535967 32.395193,-86.535902 32.395235,-86.535839 32.395275,-86.535776 32.395317,-86.535712 32.395359,-86.535649 32.395401,-86.535585 32.395443,-86.535523 32.395485,-86.535463 32.395526,-86.535401 32.395569,-86.535341 32.395611,-86.535279 32.395656,-86.535216 32.395699,-86.535154 32.395743,-86.535092 32.395786,-86.534971 32.395872,-86.534911 32.395916,-86.53485 32.395962,-86.534789 32.396009,-86.534728 32.396054,-86.534668 32.396101,-86.53461 32.396149,-86.534551 32.396198,-86.534491 32.396252,-86.5343 32.396417,-86.534236 32.396473,-86.534172 32.39653,-86.534107 32.396588,-86.534047 32.396642,-86.533989 32.396696,-86.533881 32.396803,-86.53383 32.396857,-86.533782 32.396915,-86.533739 32.396972,-86.533698 32.397031,-86.533661 32.39709,-86.533626 32.39715,-86.533593 32.397209,-86.53356 32.39727,-86.533499 32.397387,-86.533468 32.397447,-86.533438 32.397507,-86.533409 32.397569,-86.533375 32.397632,-86.533343 32.397694,-86.533312 32.397756,-86.53328 32.39782,-86.533247 32.397882,-86.533217 32.397943,-86.533186 32.398001,-86.533157 32.398056,-86.533127 32.398109,-86.533101 32.398163,-86.533091 32.398165)\r\n999;901;odd;Dozier Ave;Autauga;AL;36066;LINESTRING(-86.447763 32.457973,-86.447883 32.457888,-86.448145 32.45771,-86.448425 32.457533,-86.448539 32.45744)\r\n998;900;even;Dozier Ave;Autauga;AL;36066;LINESTRING(-86.447637 32.457847,-86.447757 32.45776,-86.448023 32.457578,-86.448295 32.457401,-86.448408 32.457319)\r\n255;299;all;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.635441 32.459969,-86.635456 32.460027,-86.635604 32.460671,-86.636122 32.463107,-86.636269 32.463825,-86.636379 32.464321,-86.636413 32.464444)\r\n600;698;all;Glendora Dr;Autauga;AL;36749;LINESTRING(-86.867193 32.536153,-86.867084 32.536382,-86.866911 32.536715,-86.866844 32.536856,-86.866796 32.537003,-86.866748 32.537223,-86.86673 32.537372,-86.866729 32.537452,-86.866736 32.537531,-86.866752 32.53761,-86.86678 32.537686,-86.866813 32.537764,-86.866864 32.537838,-86.866929 32.537901,-86.867002 32.53796,-86.867212 32.538078,-86.867268 32.53812,-86.867321 32.538168,-86.867367 32.538222,-86.867408 32.538278,-86.867441 32.538338,-86.867466 32.538398,-86.867486 32.538462,-86.867498 32.538527,-86.867505 32.538592,-86.867505 32.538659,-86.867497 32.538723,-86.867432 32.539008,-86.86742 32.539087,-86.867417 32.539165,-86.867423 32.539318,-86.86745 32.539537,-86.867475 32.539684,-86.86753 32.53983,-86.86756 32.539897,-86.867582 32.539951)\r\n367;301;odd;Sydney Dr S;Autauga;AL;36066;LINESTRING(-86.425359 32.49066,-86.425895 32.490324)\r\n364;300;even;Sydney Dr S;Autauga;AL;36066;LINESTRING(-86.425243 32.490528,-86.425779 32.490192)\r\n1901;1945;all;Davis Rd;Autauga;AL;36067;LINESTRING(-86.482184 32.563518,-86.481998 32.563647,-86.48185 32.56373,-86.481699 32.563806,-86.481395 32.563943,-86.481237 32.564007,-86.481075 32.564063,-86.480599 32.564214,-86.480452 32.564271,-86.480173 32.564413,-86.480052 32.564497,-86.479951 32.564594,-86.479876 32.564701,-86.47983 32.564819,-86.47981 32.564947,-86.479805 32.565249)\r\n1550;1598;all;Autauga County 43;Autauga;AL;36067;LINESTRING(-86.608743 32.600828,-86.608672 32.600829,-86.607741 32.600828,-86.606885 32.600835,-86.606028 32.600848,-86.605169 32.600871,-86.604999 32.600869,-86.604647 32.600862,-86.604539 32.600864)\r\n1400;1598;even;Tom Turner Rd;Autauga;AL;36006;LINESTRING(-86.68604 32.6547,-86.686192 32.654725,-86.686761 32.654766,-86.687444 32.654746,-86.689984 32.65476,-86.690632 32.65476,-86.691194 32.654753,-86.691295 32.654765,-86.691376 32.65479,-86.691658 32.654958,-86.691753 32.655053,-86.691771 32.655089,-86.691787 32.655187,-86.691775 32.656055,-86.691798 32.657108,-86.691801 32.657805)\r\n1501;1599;odd;Tom Turner Rd;Autauga;AL;36006;LINESTRING(-86.686072 32.654538,-86.686218 32.654555,-86.686767 32.654598,-86.687442 32.65458,-86.689984 32.654594,-86.69063 32.654594,-86.691202 32.654583,-86.691335 32.654589,-86.691476 32.65462,-86.6918 32.654824,-86.691947 32.654951,-86.691991 32.655053,-86.691983 32.655185,-86.691971 32.656055,-86.691994 32.657106,-86.691996 32.657804)\r\n301;367;all;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.636491 32.464678,-86.636509 32.464722,-86.63687 32.465618,-86.636921 32.465762,-86.63696 32.465907,-86.636995 32.466054,-86.637017 32.466205,-86.637035 32.466352,-86.637041 32.466502,-86.637038 32.466798,-86.636948 32.46848,-86.636917 32.468774,-86.636842 32.469211,-86.636732 32.46979,-86.636634 32.470222,-86.636557 32.470511,-86.636512 32.470658,-86.636396 32.470942,-86.636321 32.471078,-86.636084 32.471463,-86.636021 32.471589,-86.63597 32.471719,-86.635934 32.471851,-86.635914 32.471987,-86.635907 32.472122,-86.63592 32.472259,-86.635967 32.472542,-86.63605 32.472974,-86.636131 32.473483,-86.636147 32.473632,-86.63615 32.473786,-86.63613 32.473943,-86.636091 32.474098,-86.636023 32.474245,-86.635887 32.474444,-86.635831 32.474509,-86.635628 32.474706)\r\n832;898;even;Rosa Mae Ln;Autauga;AL;36067;LINESTRING(-86.708767 32.51918,-86.708941 32.519514,-86.708967 32.519573,-86.708944 32.519606,-86.708921 32.519634,-86.708805 32.5197,-86.708731 32.519729,-86.708551 32.519786,-86.708417 32.519914,-86.708326 32.520043,-86.708229 32.520156,-86.708122 32.520266,-86.707949 32.520449)\r\n7;99;odd;Rosa Mae Ln;Autauga;AL;36067;LINESTRING(-86.708943 32.51911,-86.709145 32.519456,-86.709163 32.519569,-86.70916 32.519676,-86.709083 32.519778,-86.708895 32.519858,-86.708809 32.519883,-86.708683 32.519944,-86.708585 32.520024,-86.708492 32.520139,-86.708387 32.520262,-86.708274 32.520372,-86.7081 32.520553)\r\n400;434;even;Forge Rd;Autauga;AL;36022;LINESTRING(-86.441486 32.540414,-86.441465 32.540502,-86.441435 32.540719,-86.441423 32.540938,-86.441429 32.541231,-86.441428 32.541664,-86.441413 32.542098,-86.441416 32.542606,-86.441446 32.542726)\r\n401;433;odd;Forge Rd;Autauga;AL;36022;LINESTRING(-86.441678 32.540443,-86.441663 32.540526,-86.441635 32.540733,-86.441621 32.540942,-86.441625 32.541229,-86.441626 32.541666,-86.441609 32.5421,-86.441624 32.54259,-86.441638 32.542699)\r\n798;700;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.489598 32.451146,-86.489596 32.451145,-86.489382 32.450832,-86.489165 32.450531,-86.48888 32.450141,-86.48868 32.449875)\r\n100;198;even;Gentry Dr;Autauga;AL;36003;LINESTRING(-86.727454 32.450165,-86.727415 32.449674,-86.727409 32.449481,-86.727341 32.448523,-86.7273 32.447757,-86.727253 32.446222,-86.727253 32.44616)\r\n101;3299;odd;Gentry Dr;Autauga;AL;36003;LINESTRING(-86.72726 32.450177,-86.727217 32.449682,-86.727211 32.449489,-86.727145 32.448531,-86.727104 32.447763,-86.727057 32.446224,-86.727059 32.446157)\r\n450;498;even;Forge Rd;Autauga;AL;36022;LINESTRING(-86.44166 32.542959,-86.441737 32.543002,-86.441848 32.542992,-86.44244 32.542961,-86.442686 32.542973,-86.443281 32.542991,-86.443708 32.542989,-86.443968 32.542993,-86.444088 32.542999,-86.444217 32.542934,-86.444273 32.542825,-86.444281 32.542735,-86.444284 32.542655,-86.444279 32.542434,-86.44425 32.541933,-86.444249 32.541501,-86.444262 32.541144,-86.444276 32.541001,-86.444292 32.54089)\r\n449;499;odd;Forge Rd;Autauga;AL;36022;LINESTRING(-86.441739 32.542809,-86.441785 32.542812,-86.441842 32.542822,-86.44244 32.542797,-86.442694 32.542807,-86.443285 32.542823,-86.44371 32.542823,-86.443962 32.542825,-86.444016 32.542809,-86.444039 32.542796,-86.444061 32.542769,-86.444079 32.542717,-86.444086 32.542651,-86.444081 32.54244,-86.44405 32.541937,-86.444053 32.541499,-86.444062 32.541134,-86.444078 32.540983,-86.444099 32.540867)\r\n301;399;odd;Oneal Rd;Autauga;AL;36003;LINESTRING(-86.664974 32.454272,-86.664917 32.454282,-86.664867 32.454295,-86.664813 32.454304,-86.66475 32.454312,-86.664664 32.454323,-86.664565 32.454336,-86.664507 32.454341,-86.664454 32.454348,-86.664346 32.454359,-86.66424 32.454369,-86.664184 32.454373,-86.66412 32.454379,-86.664053 32.454388,-86.66398 32.454397,-86.66391 32.454406,-86.663768 32.454421,-86.663693 32.454427,-86.663619 32.454431,-86.663541 32.454433,-86.663463 32.454435,-86.663376 32.454431,-86.663298 32.454441,-86.663225 32.454447,-86.663147 32.454449,-86.663067 32.454451,-86.662916 32.454462,-86.662845 32.454471,-86.662773 32.454476,-86.66263 32.454493,-86.662591 32.454498)\r\n2400;2498;even;Oneal Rd;Autauga;AL;36003;LINESTRING(-86.66504 32.454427,-86.664971 32.454456,-86.664899 32.454459,-86.664845 32.454466,-86.66478 32.454476,-86.664694 32.454487,-86.664593 32.454502,-86.664539 32.454509,-86.664482 32.45452,-86.664366 32.454525,-86.66426 32.454535,-86.664204 32.454539,-86.664146 32.454545,-86.664081 32.454552,-86.664012 32.454561,-86.66394 32.454574,-86.663788 32.454587,-86.663709 32.454593,-86.663627 32.454597,-86.663545 32.454599,-86.663465 32.454599,-86.663392 32.454605,-86.663316 32.454613,-86.663233 32.454613,-86.663155 32.454615,-86.663081 32.454619,-86.66294 32.45463,-86.662867 32.454639,-86.662793 32.454644,-86.662656 32.454657,-86.662618 32.454661)\r\n1094;1098;all;Doster Rd;Autauga;AL;36067;LINESTRING(-86.44006 32.440458,-86.438992 32.440988,-86.437145 32.441897)\r\n594;598;even;Autauga County 133;Autauga;AL;36003;LINESTRING(-86.675082 32.392946,-86.674977 32.392946)\r\n595;599;odd;Autauga County 133;Autauga;AL;36003;LINESTRING(-86.675082 32.39311,-86.674977 32.39311)\r\n201;299;odd;Hughes St;Autauga;AL;36067;LINESTRING(-86.471411 32.485619,-86.471593 32.48562)\r\n134;298;even;Hughes St;Autauga;AL;36067;LINESTRING(-86.471412 32.485454,-86.471594 32.485455)\r\n1829;1801;odd;Sanford Dr;Autauga;AL;36066;LINESTRING(-86.422601 32.457205,-86.422697 32.457277,-86.422811 32.457375,-86.422956 32.457534,-86.423051 32.457669)\r\n1828;1800;even;Sanford Dr;Autauga;AL;36066;LINESTRING(-86.422727 32.457079,-86.422831 32.457151,-86.422967 32.457257,-86.423132 32.457438,-86.423222 32.45759)\r\n203;299;all;E 6th St;Autauga;AL;36067;LINESTRING(-86.468689 32.465748,-86.468339 32.465771,-86.467913 32.465808,-86.467608 32.465826)\r\n1901;1921;all;Maul Dr;Autauga;AL;36006;LINESTRING(-86.725022 32.655263,-86.72482 32.655453,-86.724699 32.65556,-86.724574 32.655665,-86.724187 32.655954,-86.724051 32.656048,-86.723867 32.656163)\r\n2430;2438;all;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.490255 32.614581,-86.490206 32.614761,-86.490139 32.61505,-86.490118 32.615201,-86.4901 32.615658)\r\n130;100;even;Magnolia Ct;Autauga;AL;36067;LINESTRING(-86.455195 32.470972,-86.455257 32.470873,-86.455343 32.470756,-86.455345 32.47075)\r\n101;199;odd;Magnolia Ct;Autauga;AL;36067;LINESTRING(-86.455019 32.470903,-86.455075 32.470787,-86.455179 32.47066,-86.455188 32.470653)\r\n606;600;all;Shadow Ln;Autauga;AL;36066;LINESTRING(-86.448774 32.471475,-86.448997 32.470965,-86.44908 32.470847)\r\n634;628;all;2nd St;Autauga;AL;36703;LINESTRING(-86.794324 32.391636,-86.794182 32.392597,-86.794031 32.393536,-86.793938 32.394064)\r\n1000;1106;even;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.597127 32.539337,-86.59711 32.539413,-86.596995 32.540161,-86.596753 32.541606,-86.596692 32.54204,-86.59665 32.542248,-86.596612 32.542382,-86.596538 32.542584,-86.596339 32.543056,-86.596237 32.543338,-86.596166 32.543548,-86.595954 32.544248,-86.595731 32.544947,-86.595639 32.545306,-86.595598 32.545527,-86.595555 32.545895,-86.595535 32.546333,-86.595522 32.547348,-86.59553 32.547641,-86.595575 32.548508)\r\n1001;1099;odd;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.597319 32.539365,-86.597306 32.539439,-86.597189 32.540183,-86.596949 32.541628,-86.59689 32.542064,-86.596848 32.542282,-86.596806 32.542428,-86.596726 32.542638,-86.596527 32.54311,-86.596425 32.543386,-86.596356 32.543592,-86.596144 32.54429,-86.595925 32.544987,-86.595835 32.545338,-86.595796 32.545549,-86.595755 32.545907,-86.595733 32.546337,-86.595718 32.547348,-86.595726 32.547635,-86.59577 32.548501)\r\n99;1;all;Charlton Pl;Autauga;AL;36022;LINESTRING(-86.41608 32.50502,-86.416129 32.504993,-86.416184 32.504957,-86.416241 32.50492,-86.416295 32.504883,-86.416348 32.504848,-86.416401 32.504812,-86.41645 32.504778,-86.4165 32.504747,-86.416548 32.50472,-86.416596 32.504691,-86.416654 32.504663,-86.416776 32.504594,-86.416838 32.504556,-86.416899 32.504519,-86.416961 32.504484,-86.417022 32.504446,-86.417086 32.504406,-86.417149 32.504366,-86.417213 32.504328,-86.417277 32.504289,-86.417328 32.504252,-86.417364 32.504225)\r\n1350;1486;all;Autauga County 1;Autauga;AL;36006;LINESTRING(-86.768572 32.608227,-86.76849 32.608369,-86.768329 32.608625,-86.768157 32.608876,-86.767975 32.609121,-86.765439 32.612304,-86.765287 32.612474,-86.765178 32.612581,-86.76506 32.612683,-86.765 32.612726,-86.7648 32.612852,-86.764659 32.612924,-86.764437 32.613015,-86.764284 32.613065,-86.764123 32.613106,-86.763965 32.613136,-86.763884 32.613148,-86.763718 32.613163,-86.763554 32.61317,-86.763389 32.61316,-86.763139 32.613134,-86.761882 32.612942,-86.761624 32.612909,-86.761363 32.612896,-86.761186 32.612897,-86.761096 32.612904,-86.760836 32.612932,-86.760664 32.612968,-86.760498 32.613015,-86.760254 32.613099,-86.7601 32.613171,-86.759951 32.613247,-86.759751 32.613373,-86.759684 32.613434)\r\n100;198;even;W Teri Ct;Autauga;AL;36066;LINESTRING(-86.429565 32.450403,-86.429728 32.450533,-86.430113 32.450846)\r\n101;199;odd;W Teri Ct;Autauga;AL;36066;LINESTRING(-86.429697 32.450283,-86.429864 32.450413,-86.430248 32.450728)\r\n4211;4101;odd;Autauga County 88;Autauga;AL;36749;LINESTRING(-86.860454 32.534393,-86.860388 32.534388,-86.860289 32.534398,-86.860196 32.53442,-86.860108 32.534446,-86.860024 32.534473,-86.8594 32.534726,-86.859239 32.534799,-86.859097 32.534893,-86.858965 32.534993,-86.85866 32.535246,-86.857907 32.535839,-86.857779 32.535928,-86.857717 32.535964,-86.857649 32.535995,-86.857503 32.536048,-86.856701 32.536279,-86.856462 32.536335,-86.856043 32.536414,-86.855869 32.536456,-86.855778 32.536485,-86.855618 32.536559,-86.85547 32.536645,-86.855329 32.536741,-86.855203 32.536844,-86.854782 32.537211,-86.854598 32.537357,-86.854539 32.537396,-86.854476 32.53743,-86.854408 32.537458,-86.854338 32.53748,-86.854182 32.537515,-86.8536 32.537603,-86.853358 32.537625,-86.853284 32.537626,-86.853213 32.537618,-86.853145 32.537604,-86.852997 32.537556,-86.852852 32.537495,-86.852716 32.537424,-86.85238 32.537214,-86.852254 32.537125,-86.852 32.536926,-86.851857 32.536831,-86.851807 32.536808,-86.851775 32.536787,-86.851614 32.536718,-86.851527 32.536691,-86.851438 32.536667,-86.851344 32.536654,-86.851248 32.536652,-86.851156 32.536653,-86.850981 32.536669,-86.850807 32.5367,-86.850636 32.536742,-86.85047 32.536798,-86.85031 32.536866,-86.850091 32.53699,-86.849677 32.537241,-86.84954 32.537311,-86.849316 32.537402,-86.849164 32.537451,-86.849005 32.537493,-86.848851 32.537519,-86.848759 32.537525)\r\n4174;4100;even;Autauga County 88;Autauga;AL;36749;LINESTRING(-86.860454 32.534557,-86.8604 32.534562,-86.860327 32.53457,-86.860252 32.534584,-86.860176 32.534604,-86.860104 32.534629,-86.859492 32.534876,-86.859353 32.534945,-86.859225 32.535025,-86.859101 32.535117,-86.858796 32.535366,-86.858039 32.535965,-86.857903 32.536066,-86.857823 32.53611,-86.857739 32.536151,-86.857573 32.536206,-86.856761 32.536441,-86.85651 32.536499,-86.856093 32.536578,-86.855935 32.536618,-86.855866 32.536643,-86.855724 32.536707,-86.85559 32.536783,-86.855463 32.536869,-86.855343 32.536964,-86.854922 32.537329,-86.854732 32.537487,-86.854657 32.537538,-86.854576 32.53758,-86.85449 32.537616,-86.8544 32.537646,-86.854224 32.537683,-86.85363 32.537769,-86.85337 32.537799,-86.853274 32.537798,-86.853177 32.537792,-86.853081 32.53777,-86.852913 32.537714,-86.852754 32.537645,-86.852602 32.537566,-86.852254 32.537348,-86.852122 32.537249,-86.85187 32.537056,-86.851739 32.536971,-86.851703 32.536948,-86.851675 32.536937,-86.851532 32.536876,-86.851463 32.536853,-86.851392 32.536837,-86.85132 32.536826,-86.851246 32.536818,-86.851172 32.536823,-86.851013 32.536839,-86.850855 32.536866,-86.850702 32.536904,-86.850554 32.536954,-86.850412 32.537016,-86.850203 32.537128,-86.849789 32.537383,-86.849638 32.537463,-86.849396 32.53756,-86.849228 32.537613,-86.849057 32.537655,-86.848875 32.537699,-86.848755 32.537689)\r\n1001;1099;all;Honeysuckle Dr;Autauga;AL;36067;LINESTRING(-86.450398 32.454096,-86.450396 32.453228,-86.450397 32.453205)\r\n3000;3032;even;State Rte 143;Autauga;AL;36051;LINESTRING(-86.46799 32.701432,-86.46832 32.701534,-86.468572 32.701618)\r\n3029;3033;odd;State Rte 143;Autauga;AL;36051;LINESTRING(-86.468057 32.701278,-86.46839 32.701378,-86.468644 32.701465)\r\n900;998;even;Doster Rd Cutoff;Autauga;AL;36067;LINESTRING(-86.450211 32.43865,-86.450159 32.436563,-86.450147 32.436269,-86.450126 32.436118)\r\n999;501;odd;Doster Rd Cutoff;Autauga;AL;36067;LINESTRING(-86.450017 32.438653,-86.449963 32.436569,-86.449947 32.436281,-86.449933 32.436134)\r\n1910;1998;even;Chancellor Ridge Rd;Autauga;AL;36066;LINESTRING(-86.416194 32.469502,-86.41614 32.469555,-86.416084 32.469609,-86.416044 32.469654)\r\n2401;2499;odd;Chancellor Ridge Rd;Autauga;AL;36066;LINESTRING(-86.416348 32.469602,-86.416296 32.469665,-86.416236 32.469719,-86.416195 32.469758)\r\n400;498;even;First St;Autauga;AL;36067;LINESTRING(-86.464722 32.457547,-86.464716 32.457543,-86.464628 32.457541,-86.464271 32.457512)\r\n401;499;odd;First St;Autauga;AL;36067;LINESTRING(-86.4647 32.45771,-86.4647 32.457713,-86.464614 32.457709,-86.464251 32.457676)\r\n1206;1214;even;Kingston Green Dr;Autauga;AL;36067;LINESTRING(-86.476423 32.490076,-86.47654 32.490126,-86.476571 32.490148,-86.476584 32.490176,-86.476595 32.490261,-86.476582 32.490348,-86.476526 32.490557,-86.476457 32.490765,-86.476408 32.4909)\r\n1203;1213;odd;Kingston Green Dr;Autauga;AL;36067;LINESTRING(-86.476489 32.489921,-86.47666 32.48996,-86.476751 32.490034,-86.476812 32.49013,-86.476803 32.490273,-86.476782 32.49038,-86.476718 32.490599,-86.476645 32.490813,-86.476594 32.490949)\r\n2300;2356;even;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.496267 32.597417,-86.4962 32.597463,-86.495269 32.598063,-86.495001 32.598248,-86.494805 32.598394,-86.494616 32.598549,-86.494384 32.598774,-86.49418 32.599022,-86.494045 32.599214,-86.493883 32.599478,-86.493785 32.599688,-86.493082 32.601706,-86.492602 32.603095,-86.492364 32.603793,-86.492343 32.603863,-86.492045 32.60469,-86.491859 32.60516)\r\n2301;2369;odd;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.496396 32.59754,-86.496328 32.597595,-86.495391 32.598195,-86.495129 32.598376,-86.494941 32.598518,-86.494764 32.598667,-86.494546 32.59888,-86.49435 32.599114,-86.494221 32.599296,-86.494069 32.59955,-86.493977 32.599744,-86.49327 32.601752,-86.49279 32.603141,-86.492556 32.603835,-86.492537 32.603907,-86.492233 32.604742,-86.492043 32.605212)\r\n2799;2701;odd;Sabrina Ln;Autauga;AL;36022;LINESTRING(-86.50087 32.655373,-86.500034 32.655188)\r\n2798;2700;even;Sabrina Ln;Autauga;AL;36022;LINESTRING(-86.500821 32.655532,-86.499985 32.655347)\r\n2699;2679;all;Rollins Rd;Autauga;AL;36051;LINESTRING(-86.415679 32.678028,-86.416351 32.678019,-86.416949 32.678019,-86.417129 32.678019,-86.417225 32.678032,-86.41732 32.678054,-86.417411 32.678083,-86.417498 32.678122,-86.41758 32.678175,-86.417652 32.678238,-86.41771 32.678311,-86.417748 32.678389,-86.417803 32.678532,-86.41785 32.678678,-86.417881 32.678828,-86.417903 32.67905,-86.417903 32.679343,-86.417876 32.68057,-86.417873 32.680927,-86.417897 32.681864,-86.41789 32.682803,-86.417881 32.683083)\r\n101;103;all;Doss Ct;Autauga;AL;36066;LINESTRING(-86.415386 32.455508,-86.415651 32.455518,-86.415666 32.455528)\r\n299;201;all;Walter St;Autauga;AL;36067;LINESTRING(-86.506626 32.468285,-86.506623 32.467952)\r\n2000;2006;all;Calumet Pkwy;Autauga;AL;36066;LINESTRING(-86.416908 32.494548,-86.417 32.494558)\r\n1300;1398;even;Abilene Dr;Autauga;AL;36067;LINESTRING(-86.510744 32.469581,-86.51074 32.469574,-86.510409 32.469467,-86.510077 32.469379,-86.509749 32.469297,-86.509519 32.469229,-86.509348 32.469176,-86.509326 32.46917)\r\n1385;1301;odd;Abilene Dr;Autauga;AL;36067;LINESTRING(-86.510652 32.469726,-86.510654 32.469732,-86.510343 32.469627,-86.510019 32.469539,-86.509687 32.469457,-86.509453 32.469385,-86.509282 32.469332,-86.509261 32.469325)\r\n1500;1698;even;E Main St;Autauga;AL;36066;LINESTRING(-86.428627 32.460439,-86.425696 32.460417)\r\n1601;1699;odd;E Main St;Autauga;AL;36066;LINESTRING(-86.428625 32.460603,-86.425694 32.460581)\r\n1324;1398;even;Kingston Oaks Dr;Autauga;AL;36067;LINESTRING(-86.470361 32.496181,-86.470358 32.495793,-86.470361 32.495358,-86.470368 32.495215,-86.470367 32.494408,-86.470378 32.493679,-86.470375 32.4936,-86.470356 32.493515,-86.470312 32.493426,-86.47017 32.493307,-86.47005 32.493261)\r\n1325;1399;odd;Kingston Oaks Dr;Autauga;AL;36067;LINESTRING(-86.470167 32.496182,-86.470162 32.495793,-86.470163 32.495354,-86.47017 32.495211,-86.470171 32.494408,-86.470178 32.493685,-86.470169 32.493626,-86.470152 32.493573,-86.470126 32.493534,-86.470036 32.493455,-86.469954 32.493404)\r\n1176;1198;even;2nd St;Autauga;AL;36703;LINESTRING(-86.787596 32.326704,-86.787322 32.326665,-86.787057 32.326541,-86.786925 32.326346,-86.786847 32.326064,-86.786818 32.325826,-86.786959 32.325624,-86.787209 32.325531,-86.787499 32.325797,-86.787619 32.32622,-86.787676 32.326521,-86.787652 32.326667)\r\n1175;1199;odd;2nd St;Autauga;AL;36703;LINESTRING(-86.787574 32.326868,-86.787254 32.326849,-86.786885 32.326687,-86.786719 32.32641,-86.786647 32.326092,-86.786602 32.325792,-86.786797 32.32546,-86.787255 32.325361,-86.787711 32.325697,-86.787815 32.32619,-86.78787 32.326519,-86.787845 32.326688)\r\n3398;3200;all;Lavon Rd;Autauga;AL;36003;LINESTRING(-86.745074 32.409219,-86.744963 32.410576,-86.743647 32.413129,-86.743408 32.413208,-86.743331 32.413271,-86.743361 32.413429,-86.743434 32.413547,-86.743601 32.413899,-86.743608 32.414135,-86.743671 32.414617,-86.743582 32.415352,-86.743628 32.416337,-86.743622 32.416668,-86.743684 32.416802,-86.74384 32.416933,-86.743942 32.416927,-86.744035 32.417157,-86.744126 32.417214,-86.744733 32.417123,-86.744999 32.417066,-86.745337 32.417073,-86.746055 32.417169,-86.74639 32.417442,-86.746562 32.417535,-86.747107 32.417621,-86.748061 32.418295,-86.74842 32.418851,-86.748872 32.419384,-86.749179 32.41989,-86.748974 32.420703,-86.748469 32.42124,-86.747977 32.421491,-86.747594 32.421895,-86.747513 32.422085,-86.747223 32.422598,-86.747144 32.423016,-86.747233 32.423062,-86.747568 32.423173,-86.748306 32.423356,-86.749083 32.423661,-86.749495 32.423795,-86.750111 32.423912,-86.750588 32.423974,-86.751216 32.424176,-86.751904 32.424363,-86.752263 32.424471,-86.752645 32.424726,-86.752932 32.424909,-86.75315 32.425018,-86.753367 32.425076,-86.753747 32.425118,-86.753815 32.425054,-86.753942 32.424967,-86.754114 32.424768,-86.75423 32.424595)\r\n500;502;all;Cook Rd;Autauga;AL;36067;LINESTRING(-86.485278 32.453481,-86.484973 32.453342)\r\n1701;1799;all;Autauga County 103;Autauga;AL;36758;LINESTRING(-86.909385 32.660113,-86.909356 32.660205,-86.909238 32.660536,-86.909095 32.66088,-86.908626 32.661903,-86.908545 32.66204,-86.908453 32.662172,-86.908418 32.662207)\r\n1096;1098;even;Autauga County 5;Autauga;AL;36749;LINESTRING(-86.817384 32.583933,-86.817424 32.584018)\r\n1101;1199;odd;Autauga County 5;Autauga;AL;36749;LINESTRING(-86.817565 32.583872,-86.817605 32.583957)\r\n400;440;all;Nummy Rd;Autauga;AL;36022;LINESTRING(-86.439214 32.538023,-86.439133 32.538109,-86.438873 32.538406,-86.438707 32.538672,-86.438647 32.538817,-86.438603 32.538963,-86.438575 32.53911,-86.438547 32.539327,-86.438505 32.539538,-86.438413 32.539889,-86.438404 32.539971,-86.438402 32.540063,-86.438439 32.540145,-86.438556 32.540343,-86.438619 32.540473,-86.438729 32.540746,-86.438829 32.540946,-86.438852 32.541006,-86.438868 32.541069,-86.438878 32.541128,-86.438872 32.541188,-86.438859 32.541245,-86.438835 32.5413,-86.438801 32.541348,-86.438758 32.541391,-86.438565 32.541528,-86.438435 32.541632,-86.438373 32.541693,-86.438318 32.541758,-86.43827 32.541829,-86.438232 32.541903,-86.438204 32.541982,-86.438189 32.542065,-86.43819 32.542146,-86.438204 32.542297,-86.438255 32.542578)\r\n1000;1098;even;Paige Ct;Autauga;AL;36067;LINESTRING(-86.445383 32.454108,-86.444801 32.454507,-86.44474 32.454544,-86.444708 32.454575,-86.4447 32.454548,-86.444661 32.454523,-86.444557 32.454413,-86.444376 32.454436,-86.444281 32.454521)\r\n1001;1099;odd;Paige Ct;Autauga;AL;36067;LINESTRING(-86.445506 32.454235,-86.444933 32.454635,-86.444864 32.4547,-86.44472 32.454737,-86.444544 32.454714,-86.444493 32.454613,-86.444485 32.454583,-86.444486 32.454606,-86.444408 32.454646)\r\n2700;2798;even;Maul Dr;Autauga;AL;36006;LINESTRING(-86.709363 32.687352,-86.709421 32.68756,-86.709456 32.687704,-86.709514 32.687993,-86.709559 32.68828,-86.709591 32.688568,-86.709601 32.688711,-86.709676 32.692055,-86.709688 32.692775,-86.70977 32.696524,-86.70977 32.696952,-86.70976 32.697236,-86.709726 32.697664,-86.709665 32.69822,-86.709628 32.698527,-86.709605 32.698816,-86.709597 32.698961,-86.709598 32.699107,-86.709603 32.699255,-86.709634 32.699546,-86.709651 32.699625,-86.709686 32.699839,-86.709724 32.699983,-86.70981 32.700266,-86.709915 32.700546,-86.710042 32.700819,-86.710743 32.702134,-86.711081 32.7028,-86.711402 32.70347,-86.711556 32.703807,-86.712072 32.704952,-86.712281 32.705379,-86.712287 32.705388)\r\n2401;2499;odd;Maul Dr;Autauga;AL;36006;LINESTRING(-86.709552 32.687313,-86.709615 32.687524,-86.709652 32.687674,-86.70971 32.687969,-86.709757 32.688262,-86.709789 32.688554,-86.709801 32.688705,-86.709872 32.692053,-86.709884 32.692773,-86.709966 32.696522,-86.709968 32.696954,-86.709958 32.697244,-86.709924 32.697678,-86.709859 32.698236,-86.709826 32.698541,-86.709803 32.698826,-86.709797 32.698965,-86.709796 32.699105,-86.709803 32.699245,-86.709834 32.699526,-86.709845 32.699601,-86.709884 32.699809,-86.709918 32.699945,-86.710002 32.70022,-86.710105 32.70049,-86.710226 32.700753,-86.710923 32.702068,-86.711263 32.702736,-86.711586 32.70341,-86.711738 32.703749,-86.712256 32.70489,-86.712465 32.705317,-86.712469 32.705329)\r\n1384;1398;even;US Hwy 31;Autauga;AL;36067;LINESTRING(-86.456358 32.512199,-86.456373 32.512301,-86.456461 32.512808,-86.456665 32.513994,-86.45667 32.51402)\r\n1361;1385;odd;US Hwy 31;Autauga;AL;36067;LINESTRING(-86.456551 32.512178,-86.456567 32.512279,-86.456653 32.512784,-86.456861 32.513972,-86.456863 32.514003)\r\n299;201;odd;W 6th St;Autauga;AL;36067;LINESTRING(-86.477868 32.466112,-86.477652 32.466099,-86.475766 32.465966,-86.475286 32.465939)\r\n298;200;even;W 6th St;Autauga;AL;36067;LINESTRING(-86.477855 32.466276,-86.477636 32.466263,-86.475752 32.466132,-86.475273 32.466103)\r\n199;111;odd;Mobile Dr;Autauga;AL;36067;LINESTRING(-86.461118 32.45241,-86.46218 32.452409,-86.462397 32.452399)\r\n198;112;even;Mobile Dr;Autauga;AL;36067;LINESTRING(-86.461118 32.452245,-86.462176 32.452241,-86.462388 32.452234)\r\n299;201;odd;N Washington St;Autauga;AL;36067;LINESTRING(-86.469508 32.46438,-86.46951 32.464367,-86.469521 32.464162)\r\n298;200;even;N Washington St;Autauga;AL;36067;LINESTRING(-86.469314 32.464368,-86.469314 32.464357,-86.469327 32.464154)\r\n799;737;odd;N Memorial Dr;Autauga;AL;36067;LINESTRING(-86.451942 32.479818,-86.451977 32.479495,-86.452012 32.479277,-86.452038 32.478908,-86.452068 32.478225)\r\n798;700;even;N Memorial Dr;Autauga;AL;36067;LINESTRING(-86.451748 32.479804,-86.451779 32.479477,-86.451812 32.479261,-86.451842 32.4789,-86.451873 32.478219)\r\n100;108;even;Oakland Dr;Autauga;AL;36067;LINESTRING(-86.458394 32.462329,-86.458398 32.46215,-86.45839 32.461715,-86.458397 32.461508)\r\n101;107;odd;Oakland Dr;Autauga;AL;36067;LINESTRING(-86.4582 32.462326,-86.458204 32.46215,-86.458194 32.461713,-86.458203 32.461503)\r\n501;599;odd;Blackburn Way;Autauga;AL;36067;LINESTRING(-86.640872 32.560593,-86.640836 32.560553,-86.640751 32.56045,-86.640573 32.560337,-86.640338 32.560279,-86.637567 32.55972,-86.637473 32.55966,-86.63742 32.559594,-86.63761 32.559005)\r\n598;500;even;Blackburn Way;Autauga;AL;36067;LINESTRING(-86.640718 32.560694,-86.640682 32.560655,-86.640601 32.560584,-86.640471 32.560505,-86.640282 32.560445,-86.637473 32.559896,-86.637279 32.559784,-86.637226 32.5596,-86.637421 32.558963)\r\n218;226;even;Camellia Dr;Autauga;AL;36067;LINESTRING(-86.457353 32.474567,-86.458058 32.474874)\r\n219;227;odd;Camellia Dr;Autauga;AL;36067;LINESTRING(-86.457442 32.47442,-86.458147 32.474727)\r\n298;200;all;W 4th St;Autauga;AL;36067;LINESTRING(-86.479064 32.463396,-86.478961 32.463388)\r\n2100;2198;all;Wee Lovett Dr;Autauga;AL;36066;LINESTRING(-86.412742 32.471538,-86.412554 32.471465,-86.412287 32.471343,-86.412196 32.471279,-86.412152 32.471245,-86.412127 32.471201,-86.412054 32.471063,-86.412018 32.470977,-86.412013 32.470945,-86.412006 32.470953,-86.412007 32.470944,-86.412013 32.470931,-86.412008 32.470917,-86.412008 32.470906,-86.412012 32.470892,-86.412007 32.470879,-86.412011 32.470863,-86.411987 32.470774,-86.411958 32.470697,-86.411936 32.470686)\r\n900;998;all;Off Dr;Autauga;AL;36067;LINESTRING(-86.594916 32.530181,-86.594905 32.530212,-86.594879 32.530291,-86.594882 32.530358,-86.594902 32.530418,-86.594982 32.530539,-86.595098 32.530735,-86.595112 32.530812,-86.595128 32.530912,-86.595056 32.531073,-86.594767 32.531913,-86.594738 32.532195,-86.59473 32.532505,-86.594683 32.532647,-86.594619 32.532793,-86.593966 32.532884)\r\n4100;4194;all;Autauga County 60;Autauga;AL;36749;LINESTRING(-86.824851 32.543244,-86.824866 32.543306,-86.824957 32.543361,-86.825033 32.543403,-86.825389 32.543581,-86.825587 32.543705,-86.825841 32.54389,-86.826143 32.544137,-86.826499 32.544447,-86.826683 32.544604,-86.826818 32.544705,-86.826963 32.544792,-86.827186 32.544914,-86.827351 32.544981,-86.827521 32.545035,-86.827611 32.545055,-86.827704 32.545071,-86.827883 32.545085,-86.828236 32.545097,-86.828491 32.545085,-86.828547 32.545101,-86.828587 32.545117,-86.828629 32.545149,-86.828661 32.545192,-86.828687 32.545244,-86.828706 32.545302,-86.828811 32.545795,-86.828961 32.546364,-86.829168 32.547073,-86.829227 32.547221,-86.829305 32.54736,-86.829398 32.54749,-86.829453 32.547554,-86.829675 32.54778,-86.830019 32.548105,-86.830374 32.548421,-86.830678 32.548679,-86.830875 32.548826,-86.831147 32.549007,-86.831696 32.549351,-86.831957 32.54953,-86.832142 32.549673,-86.832312 32.549827,-86.832468 32.549991,-86.832563 32.550107,-86.832692 32.550288,-86.832764 32.55041,-86.832821 32.550536,-86.832866 32.550668,-86.832938 32.550951,-86.833001 32.551166,-86.833139 32.551515,-86.8334 32.552136,-86.8335 32.552346,-86.833546 32.552417,-86.833597 32.552486,-86.833657 32.552552,-86.833726 32.552609,-86.833799 32.552664,-86.833881 32.552705,-86.833962 32.552747,-86.834282 32.55286,-86.834428 32.552923,-86.834495 32.552956,-86.834556 32.552994,-86.834613 32.553036,-86.834666 32.553083,-86.834711 32.553133,-86.834798 32.553248,-86.834833 32.553306,-86.834896 32.553434,-86.835123 32.553977,-86.835357 32.554519,-86.835459 32.554792,-86.835498 32.554927,-86.835523 32.555064,-86.835542 32.555276,-86.835552 32.555636,-86.83556 32.555787,-86.835585 32.555939,-86.835606 32.55602,-86.835641 32.556097,-86.835683 32.556172,-86.835734 32.556243,-86.835797 32.556312,-86.835873 32.55637,-86.835957 32.556414,-86.836041 32.556451,-86.836127 32.55648,-86.836456 32.556564,-86.836958 32.556674,-86.837381 32.556754,-86.838138 32.556876,-86.83838 32.556928,-86.838455 32.556949,-86.838602 32.557005,-86.838669 32.557036,-86.838733 32.557072,-86.838788 32.557113,-86.83884 32.557158,-86.838886 32.557208,-86.838927 32.557263,-86.83896 32.55732,-86.839019 32.557447,-86.839092 32.557651,-86.83917 32.557927,-86.839257 32.558352,-86.839316 32.558567,-86.839368 32.558713,-86.839501 32.558982,-86.83962 32.559248,-86.839691 32.559448,-86.839727 32.559582,-86.839737 32.559647,-86.839744 32.559711,-86.839739 32.559776,-86.839731 32.55984,-86.839715 32.559906,-86.839695 32.55997,-86.839558 32.560318,-86.839546 32.560395,-86.8395 32.560545,-86.839493 32.5607,-86.839492 32.56085,-86.839512 32.561003,-86.83955 32.561154,-86.839607 32.561302,-86.83965 32.561375,-86.839745 32.561509,-86.839809 32.561571,-86.839871 32.561626,-86.840062 32.561774,-86.840251 32.561918,-86.840363 32.562015,-86.84046 32.56212,-86.8405 32.562173,-86.840535 32.562232,-86.8406 32.562359,-86.840851 32.562975,-86.841004 32.563245,-86.841143 32.563434,-86.841293 32.563615,-86.841547 32.563903,-86.841636 32.564019,-86.841712 32.564139,-86.84177 32.564262,-86.84181 32.56439,-86.841822 32.564453,-86.841829 32.564518,-86.841824 32.564585,-86.841768 32.565094,-86.841769 32.565183,-86.841797 32.565267,-86.841836 32.565342,-86.841879 32.565413,-86.84193 32.565479,-86.842039 32.5656,-86.842679 32.566188,-86.842859 32.566353,-86.842877 32.566358)\r\n400;498;even;Dusty Trl;Autauga;AL;36022;LINESTRING(-86.43005 32.537797,-86.429906 32.537808,-86.429332 32.537888,-86.428821 32.538095,-86.428745 32.538239,-86.428573 32.538475,-86.428455 32.538599,-86.42826 32.538761,-86.428253 32.538929,-86.428258 32.539207)\r\n401;499;odd;Dusty Trl;Autauga;AL;36022;LINESTRING(-86.430071 32.537961,-86.429934 32.537976,-86.429402 32.538064,-86.428987 32.538245,-86.428913 32.538321,-86.428747 32.538581,-86.428601 32.538709,-86.428484 32.538845,-86.428457 32.538939,-86.428452 32.539207)\r\n120;124;even;Beth Manor Dr;Autauga;AL;36066;LINESTRING(-86.43315 32.448077,-86.433045 32.448081,-86.432372 32.44809,-86.432272 32.448085)\r\n121;127;odd;Beth Manor Dr;Autauga;AL;36066;LINESTRING(-86.433165 32.448241,-86.433055 32.448251,-86.432364 32.44826,-86.432254 32.448249)\r\n1200;1246;even;Adell Pl;Autauga;AL;36066;LINESTRING(-86.443392 32.464441,-86.443389 32.464346,-86.443368 32.464131,-86.443354 32.46368,-86.443293 32.463554,-86.443154 32.463504,-86.443039 32.463509,-86.442782 32.463519,-86.442442 32.463516,-86.441998 32.463528)\r\n1201;1247;odd;Adell Pl;Autauga;AL;36066;LINESTRING(-86.443198 32.464448,-86.443191 32.464356,-86.443172 32.464141,-86.443134 32.463726,-86.443115 32.463702,-86.443098 32.46369,-86.443037 32.463675,-86.442786 32.463687,-86.442444 32.463682,-86.442004 32.463693)\r\n387;333;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.483277 32.443859,-86.4832 32.443797,-86.482832 32.443506,-86.482438 32.443215)\r\n386;332;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.483142 32.443978,-86.483066 32.443917,-86.4827 32.44363,-86.48231 32.443339)\r\n1876;1898;all;Siesta Dr;Autauga;AL;36067;LINESTRING(-86.52368 32.556588,-86.524607 32.556462,-86.525242 32.55691,-86.525196 32.557595)\r\n1799;1797;all;Windermere Ave;Autauga;AL;36066;LINESTRING(-86.420524 32.476051,-86.420613 32.476054,-86.420761 32.476054,-86.420908 32.476049)\r\n1682;1698;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.412375 32.425537,-86.412373 32.425514,-86.412327 32.425195)\r\n2500;2580;even;Autauga County 65;Autauga;AL;36091;LINESTRING(-86.55726 32.659191,-86.557262 32.659397,-86.557238 32.66032,-86.557215 32.660823,-86.557199 32.661982,-86.557214 32.662633,-86.557201 32.663292,-86.557201 32.663441,-86.557224 32.663595,-86.55726 32.663748,-86.557288 32.663828,-86.557353 32.663977,-86.557473 32.664173,-86.557819 32.664654,-86.558103 32.665089,-86.558296 32.665406,-86.558463 32.665726,-86.558637 32.666121,-86.558765 32.66647,-86.558818 32.666568)\r\n2527;2581;odd;Autauga County 65;Autauga;AL;36091;LINESTRING(-86.557455 32.65919,-86.557458 32.659397,-86.557434 32.660324,-86.557413 32.660827,-86.557395 32.661982,-86.55741 32.662633,-86.557397 32.663292,-86.557405 32.663429,-86.557424 32.663567,-86.557458 32.663708,-86.55748 32.663774,-86.557541 32.663907,-86.557649 32.664091,-86.557991 32.66457,-86.558277 32.665011,-86.558478 32.665332,-86.558649 32.665662,-86.558827 32.666067,-86.558957 32.666412,-86.558998 32.666505)\r\n306;300;all;Hampstead St;Autauga;AL;36066;LINESTRING(-86.419693 32.466376,-86.419706 32.466587,-86.419704 32.467163)\r\n1400;1498;even;Autauga County 34;Autauga;AL;36006;LINESTRING(-86.663491 32.668657,-86.663678 32.668693,-86.664489 32.668836,-86.664649 32.66887,-86.664721 32.668892,-86.664867 32.668944,-86.66501 32.669011,-86.665223 32.669129,-86.665376 32.669204,-86.665535 32.669275,-86.665703 32.669331,-86.665878 32.669366,-86.666057 32.669389,-86.666405 32.6694,-86.666751 32.66941,-86.667183 32.669407,-86.667524 32.669399,-86.668721 32.669401,-86.669067 32.66941,-86.670244 32.669395,-86.670394 32.669407,-86.670451 32.669421,-86.670564 32.669472,-86.670641 32.669552,-86.670677 32.66966,-86.670716 32.670448,-86.670746 32.671097,-86.670771 32.671195,-86.670783 32.671227)\r\n1401;1499;odd;Autauga County 34;Autauga;AL;36006;LINESTRING(-86.663534 32.668496,-86.66372 32.668531,-86.664535 32.668672,-86.664701 32.66871,-86.664791 32.668728,-86.664959 32.668788,-86.665114 32.668867,-86.665329 32.668985,-86.665472 32.669056,-86.665619 32.669117,-86.665765 32.669165,-86.665918 32.669198,-86.666077 32.669217,-86.666413 32.669234,-86.666753 32.669244,-86.667179 32.669241,-86.667522 32.669233,-86.668725 32.669233,-86.669069 32.669244,-86.670248 32.669227,-86.67042 32.669233,-86.670521 32.669245,-86.670706 32.669318,-86.670853 32.669464,-86.670887 32.669638,-86.670912 32.670442,-86.670952 32.671077,-86.670967 32.671159,-86.670972 32.671186)\r\n101;111;all;Narrow Rd;Autauga;AL;36749;LINESTRING(-86.861405 32.47537,-86.861435 32.475416,-86.861467 32.47546,-86.861561 32.475548)\r\n100;114;even;Simmons Rd;Autauga;AL;36067;LINESTRING(-86.525321 32.430705,-86.525397 32.433661)\r\n101;109;odd;Simmons Rd;Autauga;AL;36067;LINESTRING(-86.525515 32.430702,-86.525591 32.433658)\r\n201;405;odd;Fisk St;Autauga;AL;36067;LINESTRING(-86.473423 32.47911,-86.472425 32.479102)\r\n126;202;even;Fisk St;Autauga;AL;36067;LINESTRING(-86.473421 32.479275,-86.472423 32.479267)\r\n2699;2501;odd;Beaver Creek Rd;Autauga;AL;36067;LINESTRING(-86.662442 32.580508,-86.66108 32.580505,-86.660822 32.580498,-86.659144 32.580403,-86.658805 32.580374,-86.658462 32.580328,-86.65803 32.580306,-86.657681 32.580277,-86.657504 32.580265,-86.657329 32.580263,-86.656992 32.58029,-86.656659 32.580336,-86.656628 32.580344)\r\n2698;2608;even;Beaver Creek Rd;Autauga;AL;36067;LINESTRING(-86.662442 32.580672,-86.661078 32.580671,-86.660812 32.580666,-86.659128 32.580569,-86.658779 32.580542,-86.65844 32.580498,-86.658014 32.580474,-86.657665 32.580443,-86.657496 32.580435,-86.657337 32.580435,-86.657018 32.580458,-86.656695 32.580502,-86.656668 32.580505)\r\n385;379;odd;Sydney Dr S;Autauga;AL;36066;LINESTRING(-86.423253 32.490963,-86.423927 32.490948)\r\n382;366;even;Sydney Dr S;Autauga;AL;36066;LINESTRING(-86.423248 32.490799,-86.423922 32.490784)\r\n2400;2418;all;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.491128 32.612,-86.491064 32.612262,-86.490978 32.612535,-86.490881 32.612809,-86.490516 32.613771,-86.490368 32.61419,-86.490324 32.614338)\r\n498;442;even;Harvest Loop;Autauga;AL;36066;LINESTRING(-86.424405 32.449618,-86.424625 32.44964,-86.42468 32.449655,-86.424725 32.449685,-86.424754 32.449723,-86.42477 32.449749,-86.424772 32.449882,-86.424772 32.45017,-86.424782 32.450603,-86.4248 32.45101)\r\n599;455;odd;Harvest Loop;Autauga;AL;36066;LINESTRING(-86.424416 32.449454,-86.424673 32.449456,-86.42478 32.449495,-86.424881 32.449549,-86.424968 32.449643,-86.424978 32.449735,-86.424968 32.449884,-86.424968 32.450168,-86.424978 32.450599,-86.424994 32.451004)\r\n1816;1898;even;Big Spring;Autauga;AL;36006;LINESTRING(-86.723428 32.613541,-86.723424 32.613538,-86.723376 32.613588,-86.723323 32.613631,-86.723184 32.613712,-86.722954 32.613821,-86.722799 32.613904,-86.722655 32.614002,-86.722525 32.614111,-86.722415 32.614236,-86.722334 32.614373,-86.722274 32.614524,-86.722245 32.614683,-86.722247 32.614837,-86.722299 32.615491,-86.722317 32.61585,-86.722344 32.616914,-86.722327 32.617049,-86.722288 32.617177,-86.722224 32.617301,-86.722138 32.61742,-86.721535 32.61812,-86.72122 32.618463,-86.721119 32.618584,-86.721024 32.618707,-86.720934 32.618836,-86.720857 32.61897,-86.720786 32.619105,-86.720723 32.619241,-86.72044 32.619923,-86.72038 32.620051,-86.720311 32.620172,-86.720229 32.620292,-86.720134 32.620411,-86.720037 32.620539,-86.719957 32.620675,-86.719823 32.620947,-86.719794 32.621016)\r\n1801;1899;odd;Big Spring;Autauga;AL;36006;LINESTRING(-86.723597 32.613623,-86.723596 32.613632,-86.723536 32.61371,-86.723451 32.613771,-86.72329 32.613858,-86.723058 32.613967,-86.722919 32.614044,-86.722793 32.61413,-86.722683 32.614225,-86.722595 32.614328,-86.722526 32.614441,-86.722478 32.614566,-86.722453 32.614697,-86.722447 32.614833,-86.722495 32.615483,-86.722513 32.615844,-86.722544 32.616918,-86.722537 32.617077,-86.722488 32.617237,-86.722406 32.617383,-86.722306 32.617516,-86.721693 32.61822,-86.72138 32.618563,-86.721283 32.618678,-86.721194 32.618795,-86.721112 32.618916,-86.721037 32.619042,-86.72097 32.619169,-86.720909 32.619299,-86.720624 32.619979,-86.720566 32.620117,-86.720493 32.620254,-86.720397 32.620382,-86.7203 32.620503,-86.720215 32.620623,-86.720139 32.620747,-86.720007 32.621009,-86.719977 32.621073)\r\n2698;2798;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.663397 32.557547,-86.663864 32.557896,-86.664115 32.558093,-86.664584 32.558486)\r\n108;112;even;Deer Trce;Autauga;AL;36067;LINESTRING(-86.470764 32.453575,-86.471076 32.453648)\r\n109;199;odd;Deer Trce;Autauga;AL;36067;LINESTRING(-86.470815 32.453416,-86.471127 32.453489)\r\n2399;2301;odd;Rebecca Bell Dr;Autauga;AL;36067;LINESTRING(-86.618636 32.517131,-86.618581 32.517101,-86.618141 32.517106,-86.617714 32.517091,-86.617536 32.517093,-86.617351 32.517111,-86.617253 32.51714,-86.617167 32.517179,-86.617087 32.517223,-86.617012 32.517273,-86.616944 32.517327,-86.616882 32.517389,-86.61682 32.517457,-86.616779 32.517539,-86.616758 32.517622,-86.616742 32.517773,-86.616741 32.517923,-86.616744 32.517995,-86.616732 32.518053,-86.616698 32.518184,-86.616681 32.51826,-86.616667 32.518338,-86.616668 32.51849,-86.616703 32.518849,-86.616708 32.518984,-86.6167 32.519045,-86.616687 32.519108,-86.616667 32.519169,-86.61661 32.519295,-86.616537 32.519424,-86.616469 32.519565,-86.616452 32.519649,-86.616448 32.519734,-86.616462 32.51981)\r\n2398;2300;even;Rebecca Bell Dr;Autauga;AL;36067;LINESTRING(-86.618567 32.517285,-86.618539 32.517289,-86.618135 32.517274,-86.617714 32.517255,-86.617554 32.517265,-86.617399 32.517285,-86.617335 32.517302,-86.617269 32.517329,-86.617205 32.517363,-86.617146 32.517403,-86.617092 32.517447,-86.617042 32.517495,-86.617006 32.517545,-86.616979 32.517595,-86.616962 32.51765,-86.616944 32.517783,-86.616937 32.517923,-86.61694 32.517995,-86.616944 32.518081,-86.616894 32.518222,-86.616879 32.518286,-86.616873 32.518348,-86.61687 32.518484,-86.616903 32.518839,-86.616908 32.51899,-86.6169 32.519067,-86.616885 32.519144,-86.616863 32.519223,-86.616794 32.519363,-86.616723 32.519492,-86.616671 32.519615,-86.616656 32.519671,-86.616648 32.519728,-86.616655 32.519789)\r\n856;898;all;Gillespie St;Autauga;AL;36067;LINESTRING(-86.452251 32.463127,-86.451454 32.463205,-86.451065 32.46324)\r\n200;298;even;Holly Ln;Autauga;AL;36066;LINESTRING(-86.446174 32.480734,-86.446106 32.480971)\r\n99;1;odd;Holly Ln;Autauga;AL;36066;LINESTRING(-86.446363 32.480773,-86.446295 32.48101)\r\n131;125;all;Autauga County 27;Autauga;AL;36067;LINESTRING(-86.537895 32.424853,-86.537891 32.424998,-86.537892 32.42556,-86.537897 32.425758)\r\n601;529;odd;Sheila Blvd;Autauga;AL;36066;LINESTRING(-86.426158 32.456988,-86.42616 32.456954,-86.426142 32.456737,-86.426138 32.45568)\r\n598;524;even;Sheila Blvd;Autauga;AL;36066;LINESTRING(-86.425963 32.456991,-86.42596 32.456962,-86.42594 32.456743,-86.425944 32.45568)\r\n1130;1160;even;E Main St;Autauga;AL;36066;LINESTRING(-86.444605 32.460276,-86.443993 32.46028)\r\n1125;1155;odd;E Main St;Autauga;AL;36066;LINESTRING(-86.444607 32.46044,-86.443995 32.460444)\r\n114;198;even;Mantlewood Ct;Autauga;AL;36067;LINESTRING(-86.479746 32.445212,-86.479738 32.444139)\r\n107;199;odd;Mantlewood Ct;Autauga;AL;36067;LINESTRING(-86.479552 32.445213,-86.479544 32.44414)\r\n200;298;even;Cedar Grove Pl;Autauga;AL;36003;LINESTRING(-86.683961 32.441654,-86.683824 32.44165,-86.683482 32.44163,-86.682793 32.441598,-86.682539 32.441582,-86.682195 32.441569,-86.681683 32.441526,-86.680569 32.441455,-86.680205 32.441427)\r\n201;299;odd;Cedar Grove Pl;Autauga;AL;36003;LINESTRING(-86.683959 32.441819,-86.683816 32.44182,-86.68347 32.441796,-86.682781 32.441764,-86.682527 32.441748,-86.682181 32.441737,-86.681665 32.441692,-86.680553 32.441621,-86.680187 32.441591)\r\n999;951;odd;Langford Dr;Autauga;AL;36067;LINESTRING(-86.460187 32.427554,-86.460185 32.427642,-86.460199 32.427925,-86.460237 32.428005)\r\n958;900;even;Langford Dr;Autauga;AL;36067;LINESTRING(-86.460381 32.427552,-86.460385 32.427636,-86.460411 32.427893,-86.460424 32.427958)\r\n2100;2198;all;Wynchase Dr;Autauga;AL;36067;LINESTRING(-86.514935 32.447264,-86.514791 32.447213,-86.514559 32.447119,-86.514372 32.447079,-86.514102 32.447066,-86.513842 32.447063,-86.513578 32.447066,-86.513402 32.447076,-86.513268 32.447081)\r\n2400;2498;even;State Rte 143;Autauga;AL;36022;LINESTRING(-86.417126 32.638695,-86.417149 32.638732,-86.417306 32.63898,-86.417445 32.639234,-86.417532 32.63943,-86.417685 32.639907,-86.41778 32.640326,-86.417909 32.641036,-86.418007 32.641468,-86.418087 32.641751,-86.418153 32.641964,-86.418236 32.642178,-86.41852 32.642713,-86.418778 32.643097,-86.419139 32.64359,-86.419593 32.644202,-86.420078 32.644879,-86.420157 32.645003,-86.420361 32.645351)\r\n2435;2499;odd;State Rte 143;Autauga;AL;36022;LINESTRING(-86.417291 32.638608,-86.417323 32.638646,-86.417484 32.638904,-86.417631 32.639168,-86.417726 32.639376,-86.417883 32.639869,-86.417974 32.640298,-86.418105 32.641008,-86.418201 32.641432,-86.418279 32.641711,-86.418345 32.641916,-86.418426 32.642116,-86.418702 32.642635,-86.41895 32.643011,-86.419305 32.643502,-86.419759 32.644116,-86.42025 32.644795,-86.420335 32.644925,-86.420536 32.645279)\r\n199;163;odd;W 5th St;Autauga;AL;36067;LINESTRING(-86.475075 32.464371,-86.473998 32.464292)\r\n198;150;even;W 5th St;Autauga;AL;36067;LINESTRING(-86.475058 32.464535,-86.473981 32.464456)\r\n201;237;all;Autauga County 104;Autauga;AL;36066;LINESTRING(-86.44959 32.570718,-86.449544 32.570699,-86.449467 32.570633,-86.449396 32.570553,-86.449376 32.570473)\r\n299;201;all;Caldwell Ln;Autauga;AL;36067;LINESTRING(-86.490842 32.439799,-86.490852 32.438919,-86.490847 32.438476,-86.490868 32.438347,-86.490862 32.438335)\r\n299;221;odd;Cherry Dr;Autauga;AL;36067;LINESTRING(-86.458065 32.478291,-86.457913 32.478331,-86.457795 32.478353,-86.457686 32.478362,-86.457435 32.478364,-86.456735 32.47838)\r\n298;220;even;Cherry Dr;Autauga;AL;36067;LINESTRING(-86.45813 32.478446,-86.457969 32.478501,-86.457825 32.478525,-86.457694 32.478532,-86.457437 32.47853,-86.45674 32.478544)\r\n100;198;even;Gawain Dr;Autauga;AL;36067;LINESTRING(-86.471454 32.437076,-86.471493 32.437075,-86.471887 32.437081,-86.472757 32.437075,-86.473096 32.437079)\r\n101;199;odd;Gawain Dr;Autauga;AL;36067;LINESTRING(-86.47145 32.436911,-86.471493 32.436911,-86.471887 32.436915,-86.472757 32.436911,-86.473098 32.436914)\r\n1600;1698;even;Adeline Dr;Autauga;AL;36758;LINESTRING(-86.876222 32.622165,-86.876211 32.622162,-86.87615 32.622193,-86.875997 32.622264,-86.875923 32.622314,-86.875853 32.622368,-86.875794 32.62243,-86.875691 32.62255,-86.875512 32.622721,-86.87546 32.622805,-86.875441 32.622898,-86.875424 32.623109,-86.875405 32.623158,-86.875373 32.623202,-86.875329 32.623242,-86.875135 32.623367,-86.874928 32.623486,-86.874781 32.623573,-86.87471 32.62363,-86.874644 32.623693,-86.874593 32.623763,-86.874549 32.623837,-86.874515 32.623913,-86.874494 32.623991,-86.874479 32.624063,-86.874375 32.624653,-86.874367 32.624729,-86.874356 32.624798,-86.874322 32.62494)\r\n1601;1699;odd;Adeline Dr;Autauga;AL;36758;LINESTRING(-86.876344 32.622293,-86.876325 32.622316,-86.876244 32.622343,-86.876113 32.62241,-86.876055 32.622446,-86.876003 32.622488,-86.875952 32.622536,-86.875849 32.622654,-86.875692 32.622821,-86.875666 32.622867,-86.875649 32.62292,-86.87564 32.623143,-86.875603 32.623238,-86.875539 32.623318,-86.875461 32.623376,-86.875249 32.623503,-86.875042 32.623622,-86.874913 32.623707,-86.874858 32.62375,-86.874812 32.623797,-86.874771 32.623849,-86.874737 32.623907,-86.874711 32.623965,-86.87469 32.624027,-86.874675 32.624091,-86.874575 32.624671,-86.874569 32.624749,-86.874552 32.624828,-86.874513 32.624974)\r\n3499;3401;odd;Mulberry Rd;Autauga;AL;36003;LINESTRING(-86.776247 32.459232,-86.776213 32.45924,-86.776168 32.459253)\r\n3498;3496;even;Mulberry Rd;Autauga;AL;36003;LINESTRING(-86.776311 32.459387,-86.776273 32.4594,-86.776223 32.459411)\r\n1612;1618;even;Buena Vista Blvd;Autauga;AL;36067;LINESTRING(-86.449377 32.425612,-86.449323 32.425917,-86.449318 32.426086,-86.449366 32.426242,-86.449455 32.426362,-86.449651 32.426547)\r\n1615;1621;odd;Buena Vista Blvd;Autauga;AL;36067;LINESTRING(-86.44957 32.425634,-86.449529 32.425929,-86.449534 32.426062,-86.449568 32.42617,-86.449625 32.426258,-86.449799 32.426441)\r\n799;701;odd;Archie Ln;Autauga;AL;36067;LINESTRING(-86.468159 32.473814,-86.468062 32.474412)\r\n700;798;even;Archie Ln;Autauga;AL;36067;LINESTRING(-86.468352 32.473836,-86.468255 32.474434)\r\n824;898;even;Dunvegan Dr;Autauga;AL;36067;LINESTRING(-86.477443 32.476853,-86.477457 32.477185,-86.477456 32.4774,-86.477446 32.477609,-86.477438 32.477703)\r\n825;899;odd;Dunvegan Dr;Autauga;AL;36067;LINESTRING(-86.477638 32.476846,-86.477655 32.477183,-86.477654 32.477402,-86.477648 32.477621,-86.477631 32.477721)\r\n199;101;odd;Gallahad St;Autauga;AL;36067;LINESTRING(-86.470423 32.43619,-86.470485 32.435967,-86.47054 32.435847,-86.47057 32.435817,-86.470603 32.4358,-86.470658 32.435785,-86.470726 32.43578,-86.472856 32.435775,-86.473106 32.435777)\r\n198;100;even;Gallahad St;Autauga;AL;36067;LINESTRING(-86.470233 32.436155,-86.470287 32.435921,-86.470342 32.435757,-86.47042 32.435669,-86.470531 32.43562,-86.470636 32.435613,-86.47072 32.43561,-86.472858 32.435609,-86.473108 32.435612)\r\n599;501;all;S Autauga St;Autauga;AL;36003;LINESTRING(-86.649657 32.416233,-86.649652 32.416402,-86.649657 32.417992,-86.649664 32.419152)\r\n1488;1498;even;Autauga County 1;Autauga;AL;36006;LINESTRING(-86.759478 32.61362,-86.759361 32.613729,-86.759301 32.613805,-86.759106 32.614071,-86.757156 32.616913,-86.757075 32.617043,-86.756972 32.617244)\r\n1401;1499;odd;Autauga County 1;Autauga;AL;36006;LINESTRING(-86.759626 32.613726,-86.759523 32.613835,-86.759467 32.613899,-86.759276 32.614157,-86.75733 32.616995,-86.757255 32.617117,-86.75715 32.617311)\r\n499;401;odd;Weatherby Trl;Autauga;AL;36067;LINESTRING(-86.472705 32.450691,-86.472705 32.450857,-86.472709 32.451195,-86.472687 32.451349,-86.472652 32.451419,-86.472605 32.451464,-86.472549 32.451493,-86.47246 32.451514,-86.471529 32.451531,-86.471427 32.451531)\r\n490;400;even;Weatherby Trl;Autauga;AL;36067;LINESTRING(-86.4729 32.45069,-86.472901 32.450855,-86.472907 32.451199,-86.472907 32.451395,-86.472838 32.451521,-86.472747 32.451606,-86.472637 32.451667,-86.472486 32.451694,-86.471529 32.451697,-86.471426 32.451696)\r\n2134;2190;all;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.665677 32.638907,-86.665667 32.639029,-86.66565 32.639169,-86.6656 32.639448,-86.665515 32.639797,-86.665474 32.63993,-86.665333 32.640309,-86.665258 32.640491,-86.664547 32.641999,-86.664081 32.642992,-86.663961 32.643267,-86.663852 32.643543,-86.663728 32.643889,-86.663636 32.64417,-86.663524 32.644595,-86.663383 32.645234,-86.662675 32.648617)\r\n200;298;even;Evergreen St;Autauga;AL;36067;LINESTRING(-86.481501 32.455858,-86.481503 32.453449)\r\n201;299;odd;Evergreen St;Autauga;AL;36067;LINESTRING(-86.481307 32.455858,-86.481309 32.453449)\r\n707;701;odd;Mimosa Rd;Autauga;AL;36067;LINESTRING(-86.459007 32.480665,-86.459005 32.480615,-86.459 32.480112,-86.458991 32.479962,-86.458982 32.47988,-86.458926 32.47973,-86.458913 32.479706)\r\n710;700;even;Mimosa Rd;Autauga;AL;36067;LINESTRING(-86.458813 32.480686,-86.458799 32.480627,-86.4588 32.480116,-86.458791 32.479978,-86.458778 32.479916,-86.458736 32.479784,-86.45873 32.479763)\r\n436;498;even;Water St;Autauga;AL;36067;LINESTRING(-86.46318 32.454841,-86.462983 32.454823,-86.462679 32.45479)\r\n433;499;odd;Water St;Autauga;AL;36067;LINESTRING(-86.463161 32.455005,-86.462961 32.454989,-86.462654 32.454954)\r\n705;721;all;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.890939 32.563696,-86.890933 32.565255,-86.890938 32.565977,-86.890945 32.566156)\r\n3601;3671;odd;Red Cross Rd;Autauga;AL;36003;LINESTRING(-86.796082 32.464548,-86.796188 32.464536,-86.796938 32.464523,-86.797794 32.464507,-86.798993 32.464491,-86.799788 32.464494)\r\n3648;3670;even;Red Cross Rd;Autauga;AL;36703;LINESTRING(-86.796042 32.464386,-86.796166 32.464358,-86.796934 32.464357,-86.79779 32.464341,-86.798991 32.464325,-86.799789 32.464329)\r\n2348;2398;even;Cole Rd;Autauga;AL;36006;LINESTRING(-86.742155 32.56348,-86.742281 32.56349,-86.742444 32.56351,-86.742856 32.563589,-86.743013 32.563629,-86.743083 32.563652,-86.743227 32.563714,-86.743368 32.563785,-86.743793 32.564033,-86.744021 32.564146,-86.744478 32.56434,-86.744763 32.564493,-86.744845 32.564535,-86.74494 32.564566,-86.745038 32.564583,-86.745138 32.564581,-86.745404 32.564568,-86.745665 32.564535,-86.745941 32.564495)\r\n2301;2499;odd;Cole Rd;Autauga;AL;36006;LINESTRING(-86.742168 32.563316,-86.742301 32.56332,-86.742482 32.563342,-86.742906 32.563425,-86.743079 32.563465,-86.743167 32.563496,-86.743327 32.563564,-86.743476 32.563645,-86.743901 32.563889,-86.744117 32.563996,-86.74458 32.56419,-86.744867 32.564347,-86.744933 32.564375,-86.744998 32.564396,-86.745064 32.564407,-86.745136 32.564415,-86.745384 32.564398,-86.745635 32.564371,-86.745909 32.564333)\r\n1040;1098;all;Corley Rd;Autauga;AL;36067;LINESTRING(-86.419367 32.425558,-86.418589 32.425709,-86.418511 32.425718,-86.418452 32.425718,-86.418453 32.425726)\r\n2055;2099;all;Fairview Ave;Autauga;AL;36066;LINESTRING(-86.412226 32.485617,-86.412219 32.485672,-86.41213 32.485732)\r\n1387;1399;all;US Hwy 31;Autauga;AL;36067;LINESTRING(-86.456895 32.514248,-86.456908 32.514342,-86.45703 32.515086)\r\n718;798;all;Smith Ave;Autauga;AL;36067;LINESTRING(-86.449591 32.454831,-86.448485 32.454855,-86.448401 32.454862,-86.448309 32.454866)\r\n389;301;all;Greystone Way;Autauga;AL;36066;LINESTRING(-86.42411 32.470032,-86.423923 32.470397)\r\n3099;3059;odd;Mushat Ln;Autauga;AL;36051;LINESTRING(-86.473319 32.702259,-86.472825 32.702088,-86.472582 32.702021,-86.472427 32.701967,-86.471871 32.701786,-86.471475 32.701641,-86.471415 32.701627)\r\n200;298;even;Mushat Ln;Autauga;AL;36051;LINESTRING(-86.473246 32.702412,-86.472755 32.702248,-86.47251 32.702181,-86.472353 32.702123,-86.471795 32.701942,-86.471403 32.701801,-86.471353 32.701783)\r\n100;108;even;Seaside Rd;Autauga;AL;36003;LINESTRING(-86.64916 32.438403,-86.649391 32.43838,-86.649988 32.438329,-86.650243 32.438316,-86.650408 32.438311,-86.650412 32.43831)\r\n1;99;odd;Seaside Rd;Autauga;AL;36003;LINESTRING(-86.649136 32.438239,-86.649369 32.438214,-86.649972 32.438163,-86.650233 32.438148,-86.65041 32.438145,-86.650421 32.438146)\r\n199;101;odd;7th St;Autauga;AL;36067;LINESTRING(-86.474821 32.467472,-86.474194 32.467426,-86.473341 32.467353,-86.472484 32.467294,-86.47211 32.467263)\r\n198;100;even;7th St;Autauga;AL;36067;LINESTRING(-86.474804 32.467636,-86.474176 32.467592,-86.473323 32.467519,-86.472466 32.46746,-86.47209 32.467426)\r\n2140;2144;all;Autauga County 66;Autauga;AL;36022;LINESTRING(-86.483351 32.590458,-86.483483 32.590484,-86.483731 32.590537,-86.483869 32.590562)\r\n920;900;all;Goodson Rd;Autauga;AL;36067;LINESTRING(-86.565674 32.541176,-86.565582 32.541233,-86.565458 32.54132,-86.565349 32.541417,-86.565251 32.541529,-86.56516 32.54165,-86.565011 32.541836,-86.564838 32.542012,-86.564671 32.542141)\r\n1399;1301;odd;Valleyview Rd;Autauga;AL;36067;LINESTRING(-86.520395 32.494176,-86.520415 32.49313)\r\n1398;1300;even;Valleyview Rd;Autauga;AL;36067;LINESTRING(-86.5202 32.494173,-86.52022 32.493127)\r\n2720;2718;even;Alt Rte Route County Road 59;Autauga;AL;36022;LINESTRING(-86.502098 32.653531,-86.502029 32.653606,-86.501963 32.653707)\r\n2721;2719;odd;Alt Rte Route County Road 59;Autauga;AL;36022;LINESTRING(-86.502256 32.653628,-86.502199 32.6537,-86.50213 32.653791)\r\n1412;1418;all;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.48985 32.506669,-86.490546 32.507254,-86.490794 32.50745)\r\n483;401;all;Greystone Way;Autauga;AL;36066;LINESTRING(-86.425232 32.46649,-86.425219 32.466575,-86.425218 32.466599)\r\n198;132;all;Magnolia Ct;Autauga;AL;36067;LINESTRING(-86.455058 32.471204,-86.455095 32.471147)\r\n1698;1622;even;Clear Creek Vw;Autauga;AL;36067;LINESTRING(-86.538145 32.424612,-86.538479 32.424616,-86.538654 32.424623,-86.539005 32.424622,-86.539179 32.424627,-86.539784 32.424625,-86.539952 32.424629,-86.540119 32.424641,-86.540284 32.42466,-86.540876 32.42476,-86.541135 32.424795,-86.541312 32.42481,-86.541576 32.424819,-86.541755 32.424816,-86.542015 32.424798,-86.542337 32.42477,-86.542459 32.424763)\r\n1699;1601;odd;Clear Creek Vw;Autauga;AL;36067;LINESTRING(-86.538147 32.424448,-86.538485 32.424448,-86.538658 32.424455,-86.539007 32.424454,-86.539183 32.424459,-86.539786 32.424459,-86.539962 32.424461,-86.540141 32.424471,-86.540318 32.424494,-86.54091 32.424594,-86.541161 32.424627,-86.541326 32.424642,-86.541578 32.424653,-86.541745 32.424648,-86.541997 32.424632,-86.542323 32.424598,-86.542454 32.424599)\r\n2245;2259;all;Maul Dr;Autauga;AL;36006;LINESTRING(-86.70232 32.669714,-86.702322 32.669722,-86.702346 32.669934,-86.702392 32.67022,-86.702405 32.670288,-86.702468 32.670571,-86.702517 32.670754,-86.702584 32.67099,-86.703052 32.672534,-86.703111 32.672762)\r\n1319;1315;all;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.469322 32.500243,-86.469483 32.500103,-86.469662 32.499952,-86.4701 32.499602,-86.470596 32.499187)\r\n1600;1752;even;Autauga County125;Autauga;AL;36758;LINESTRING(-86.803703 32.625011,-86.803738 32.625119,-86.803797 32.625191,-86.803857 32.625255,-86.803927 32.625311,-86.803998 32.625364,-86.804997 32.625937,-86.805558 32.62627,-86.805756 32.626401,-86.80588 32.626494,-86.806056 32.626645,-86.806279 32.62686,-86.806703 32.627305,-86.806799 32.627419,-86.806882 32.627537,-86.806949 32.627659,-86.806974 32.62772,-86.806992 32.627784,-86.807016 32.627918,-86.80703 32.628131,-86.807031 32.628706,-86.807017 32.629358,-86.807026 32.629653,-86.807054 32.629875,-86.807085 32.630025,-86.807128 32.63017,-86.807156 32.630244,-86.80719 32.630319,-86.807273 32.630454,-86.807325 32.630522,-86.807381 32.630584,-86.8075 32.6307,-86.807696 32.630853,-86.8079 32.630994,-86.808112 32.631125,-86.808337 32.631245,-86.808569 32.631351,-86.808726 32.631414,-86.809272 32.631611,-86.809414 32.631675,-86.809552 32.631749,-86.809827 32.63192,-86.810087 32.632102,-86.810267 32.632247,-86.810433 32.632404,-86.810531 32.632514,-86.810573 32.63257,-86.81061 32.632627,-86.810641 32.632687,-86.810667 32.632749,-86.810684 32.632809,-86.810694 32.632872,-86.810701 32.633009,-86.810687 32.633297,-86.810697 32.634315,-86.810694 32.634818,-86.810705 32.635109,-86.810728 32.635334,-86.810762 32.635483,-86.810833 32.635698,-86.810996 32.636115,-86.811265 32.636726,-86.811363 32.63693,-86.811478 32.637128,-86.811569 32.637259,-86.811722 32.637444,-86.811941 32.637673,-86.812276 32.638,-86.812433 32.638168,-86.812574 32.638341,-86.812613 32.638397,-86.812647 32.638457,-86.812707 32.638586,-86.812753 32.638717,-86.812786 32.638852,-86.81282 32.639064,-86.812919 32.639925,-86.813079 32.641007,-86.813225 32.641939,-86.813253 32.642223,-86.813258 32.642362,-86.813244 32.642574,-86.813216 32.642783,-86.813162 32.643065,-86.813108 32.643276,-86.81294 32.643837,-86.812903 32.643984,-86.812879 32.644134,-86.812858 32.64443,-86.812865 32.645015,-86.812898 32.64567,-86.81297 32.646539,-86.812992 32.64676,-86.813034 32.646979,-86.813092 32.647194,-86.813184 32.647479,-86.813362 32.64796,-86.813446 32.648235,-86.813523 32.648586,-86.813544 32.648724,-86.81357 32.64908,-86.813565 32.649291,-86.813549 32.649507,-86.813516 32.649799,-86.813491 32.650165,-86.813487 32.650606,-86.813506 32.651042,-86.813514 32.65155,-86.813497 32.652281)\r\n1601;1765;odd;Autauga County125;Autauga;AL;36758;LINESTRING(-86.803886 32.624955,-86.803932 32.625039,-86.803965 32.625091,-86.804011 32.625139,-86.804063 32.625185,-86.804122 32.625226,-86.805109 32.625801,-86.805676 32.626134,-86.805886 32.626271,-86.806018 32.626372,-86.806202 32.626531,-86.806431 32.626752,-86.806863 32.627203,-86.806967 32.627325,-86.807066 32.627455,-86.807139 32.627597,-86.807168 32.627672,-86.807192 32.62775,-86.80722 32.627902,-86.807228 32.628127,-86.807227 32.628708,-86.807213 32.629356,-86.807228 32.629641,-86.807254 32.629851,-86.807283 32.629989,-86.807322 32.630124,-86.807346 32.630186,-86.807376 32.630247,-86.807449 32.630368,-86.807491 32.630424,-86.807537 32.630476,-86.807646 32.63058,-86.807828 32.630725,-86.808022 32.63086,-86.808226 32.630985,-86.808439 32.631099,-86.808659 32.631201,-86.808808 32.63126,-86.80936 32.631457,-86.809518 32.631527,-86.809666 32.631611,-86.809949 32.631786,-86.810221 32.631974,-86.810413 32.632129,-86.810591 32.632296,-86.810697 32.632418,-86.810747 32.632482,-86.810792 32.632551,-86.810831 32.632623,-86.810861 32.632699,-86.810886 32.632777,-86.810898 32.63286,-86.810897 32.633011,-86.810885 32.633299,-86.810893 32.634315,-86.810892 32.634816,-86.810905 32.635099,-86.81093 32.63531,-86.81096 32.635445,-86.811025 32.63565,-86.811184 32.636059,-86.811449 32.636664,-86.811547 32.63686,-86.811656 32.637048,-86.811739 32.637167,-86.811884 32.637342,-86.812093 32.637565,-86.81243 32.637892,-86.812595 32.638066,-86.812744 32.638249,-86.812791 32.638317,-86.812833 32.638389,-86.812899 32.63853,-86.812951 32.638675,-86.812986 32.638824,-86.813016 32.639046,-86.813115 32.639907,-86.813273 32.640985,-86.813423 32.641921,-86.813453 32.642213,-86.813456 32.642364,-86.813446 32.642588,-86.813414 32.642807,-86.813358 32.643097,-86.8133 32.643314,-86.813134 32.643875,-86.813101 32.644012,-86.813079 32.64415,-86.813058 32.644434,-86.813063 32.645011,-86.813096 32.64566,-86.813166 32.646525,-86.813192 32.646738,-86.813232 32.646947,-86.813286 32.647154,-86.813374 32.647431,-86.813554 32.647914,-86.813642 32.648199,-86.813721 32.64856,-86.813744 32.648708,-86.813768 32.649076,-86.813765 32.649299,-86.813745 32.649521,-86.813714 32.649811,-86.813691 32.650171,-86.813685 32.650604,-86.813702 32.651038,-86.81371 32.65155,-86.813691 32.652284)\r\n651;601;all;Covered Bridge Pkwy;Autauga;AL;36066;LINESTRING(-86.415223 32.478545,-86.41549 32.477887,-86.415632 32.477548,-86.415653 32.477485,-86.4157 32.477288,-86.415695 32.47717,-86.415633 32.476992,-86.415523 32.47684)\r\n230;238;even;Pine Level Ridge;Autauga;AL;36022;LINESTRING(-86.468232 32.586978,-86.469277 32.586967)\r\n223;299;odd;Pine Level Ridge;Autauga;AL;36022;LINESTRING(-86.46823 32.586813,-86.469275 32.586802)\r\n1486;1494;even;Autauga County 24;Autauga;AL;36006;LINESTRING(-86.67146 32.671227,-86.671577 32.671196,-86.671741 32.671159,-86.671795 32.671148)\r\n1479;1493;odd;Autauga County 24;Autauga;AL;36006;LINESTRING(-86.671395 32.671072,-86.671517 32.671032,-86.671697 32.670993,-86.671759 32.670986)\r\n4248;4210;all;State Rte 14;Autauga;AL;36749;LINESTRING(-86.869992 32.472021,-86.867621 32.472934,-86.867432 32.473005)\r\n100;198;even;Danya Dr;Autauga;AL;36067;LINESTRING(-86.4502 32.45212,-86.450153 32.452142,-86.450014 32.452202,-86.449948 32.452221,-86.44988 32.452229,-86.449113 32.452238,-86.448859 32.452233,-86.448718 32.452228,-86.448622 32.452357,-86.448612 32.452458,-86.448609 32.452556,-86.448651 32.452625)\r\n101;199;odd;Danya Dr;Autauga;AL;36067;LINESTRING(-86.450311 32.452255,-86.450261 32.45229,-86.450094 32.452368,-86.449994 32.452391,-86.449896 32.452405,-86.449113 32.452402,-86.448865 32.452403,-86.44885 32.452418,-86.448836 32.452429,-86.448818 32.45247,-86.448827 32.452522,-86.448834 32.45257)\r\n180;298;all;Ball Enwright Rd;Autauga;AL;36022;LINESTRING(-86.458621 32.609463,-86.458595 32.60946,-86.457909 32.60942,-86.457813 32.60942,-86.457393 32.609469,-86.457144 32.609478,-86.456805 32.609474,-86.456549 32.609463,-86.456432 32.609454,-86.456298 32.609513,-86.456073 32.610017,-86.456002 32.610143,-86.45588 32.610328,-86.455703 32.610568,-86.455657 32.61061,-86.455549 32.610675,-86.455419 32.610706,-86.45535 32.610709,-86.455331 32.610711)\r\n3026;3118;even;Autauga County 155;Autauga;AL;36091;LINESTRING(-86.559332 32.696118,-86.559357 32.69613,-86.559461 32.696125,-86.559553 32.696117,-86.559648 32.696103,-86.559739 32.69608,-86.559829 32.696053,-86.560064 32.695955,-86.560217 32.695903,-86.560288 32.695887,-86.560354 32.695877,-86.560421 32.695881,-86.560493 32.695891,-86.560562 32.695908,-86.560715 32.695956,-86.560958 32.696027,-86.561112 32.69608,-86.561255 32.696139,-86.561544 32.696285,-86.561775 32.696392,-86.562173 32.696549,-86.56223 32.696583,-86.562257 32.696613,-86.562272 32.696642,-86.56228 32.69669,-86.562235 32.697097,-86.562197 32.697306,-86.562075 32.697805,-86.562001 32.698237,-86.561984 32.698299,-86.561958 32.698363,-86.561926 32.698418,-86.561888 32.698463,-86.561848 32.698496,-86.5618 32.698521,-86.56174 32.698541,-86.56167 32.698553,-86.561597 32.69856,-86.561263 32.698564,-86.561002 32.69857,-86.56074 32.698596,-86.56048 32.698628,-86.560388 32.698646,-86.560298 32.698677,-86.560215 32.698708,-86.560131 32.698744,-86.55963 32.699019,-86.559489 32.699084,-86.559026 32.699267,-86.558865 32.699333,-86.558785 32.69938,-86.558709 32.699431,-86.558581 32.699545,-86.558268 32.699898,-86.558173 32.700022,-86.558086 32.700152,-86.558052 32.700227,-86.557993 32.700367,-86.557947 32.700516,-86.557898 32.700803,-86.557868 32.700941,-86.557789 32.701217,-86.557668 32.701559,-86.557558 32.701831,-86.557156 32.702713,-86.557107 32.702858,-86.556967 32.703362,-86.556954 32.703449,-86.556974 32.703781,-86.557115 32.70395)\r\n3025;3029;odd;Autauga County 155;Autauga;AL;36051;LINESTRING(-86.559375 32.695957,-86.559379 32.69595,-86.559449 32.695953,-86.559525 32.695947,-86.559602 32.695935,-86.559677 32.695918,-86.559749 32.695895,-86.559982 32.695801,-86.560149 32.695741,-86.560242 32.695715,-86.560344 32.695705,-86.560445 32.695707,-86.560541 32.695723,-86.560628 32.695746,-86.560783 32.695798,-86.561028 32.695869,-86.561194 32.695924,-86.561353 32.695989,-86.561644 32.696139,-86.561865 32.69624,-86.562269 32.696395,-86.562366 32.696439,-86.562457 32.696511,-86.562492 32.696612,-86.562484 32.696698,-86.562433 32.697119,-86.562393 32.697336,-86.562273 32.697833,-86.562203 32.698271,-86.562178 32.698349,-86.562146 32.698425,-86.56211 32.6985,-86.562058 32.698577,-86.561982 32.698642,-86.561888 32.698687,-86.561792 32.698709,-86.5617 32.698725,-86.561607 32.69873,-86.561267 32.69873,-86.561016 32.69874,-86.560766 32.698762,-86.56052 32.698796,-86.560448 32.698812,-86.560374 32.698833,-86.560303 32.69886,-86.560235 32.698892,-86.559734 32.699165,-86.559579 32.699236,-86.559114 32.699417,-86.558971 32.699483,-86.558907 32.699518,-86.558849 32.699559,-86.558739 32.699657,-86.558434 32.699996,-86.558347 32.70011,-86.558272 32.700228,-86.55824 32.700287,-86.558187 32.700417,-86.558147 32.70055,-86.558094 32.700831,-86.558064 32.700975,-86.557983 32.701261,-86.557856 32.701611,-86.557744 32.701887,-86.557348 32.702767,-86.557301 32.7029,-86.557167 32.703394,-86.557154 32.703455,-86.557196 32.703719,-86.557282 32.703865)\r\n398;300;even;Dickey Ln;Autauga;AL;36067;LINESTRING(-86.507606 32.616159,-86.507749 32.616178,-86.508356 32.61616,-86.509013 32.616149,-86.509388 32.616182,-86.509788 32.616366)\r\n399;301;odd;Dickey Ln;Autauga;AL;36067;LINESTRING(-86.50763 32.615996,-86.507759 32.616006,-86.508352 32.615994,-86.509017 32.615981,-86.509458 32.615992,-86.509887 32.616224)\r\n2818;2898;even;Autauga County 59;Autauga;AL;36022;LINESTRING(-86.521909 32.654661,-86.522144 32.654811,-86.522534 32.655085,-86.522843 32.655328,-86.52314 32.655583,-86.523387 32.655784,-86.524444 32.656626,-86.525589 32.657506,-86.52579 32.657647,-86.525935 32.657735,-86.526152 32.657855,-86.526358 32.657976,-86.526557 32.658105,-86.52675 32.658245,-86.526925 32.658398,-86.526985 32.658462)\r\n2807;2899;odd;Autauga County 59;Autauga;AL;36022;LINESTRING(-86.522025 32.654528,-86.522268 32.654677,-86.522666 32.654959,-86.522981 32.655208,-86.52328 32.655465,-86.523523 32.655664,-86.524578 32.656504,-86.525719 32.657378,-86.525914 32.657513,-86.526049 32.657597,-86.526262 32.657717,-86.526476 32.65784,-86.526683 32.657973,-86.526886 32.658121,-86.527091 32.658284,-86.527148 32.658373)\r\n199;101;odd;Morris Cir;Autauga;AL;36067;LINESTRING(-86.446087 32.452234,-86.446176 32.452326,-86.446247 32.452391,-86.446343 32.452439,-86.44645 32.452471,-86.446556 32.452472,-86.446991 32.452465,-86.447153 32.452476,-86.447219 32.452488,-86.447281 32.452509,-86.447352 32.452543,-86.447406 32.452567)\r\n198;100;even;Morris Cir;Autauga;AL;36067;LINESTRING(-86.446234 32.452126,-86.446324 32.452208,-86.446379 32.452247,-86.446433 32.452275,-86.446494 32.452291,-86.446562 32.452302,-86.446993 32.452299,-86.447177 32.4523,-86.447281 32.452316,-86.447379 32.452351,-86.447456 32.452399,-86.447502 32.452424)\r\n399;301;odd;Dillard St;Autauga;AL;36067;LINESTRING(-86.473432 32.478443,-86.472913 32.478449,-86.472655 32.478441,-86.472452 32.478439)\r\n398;300;even;Dillard St;Autauga;AL;36067;LINESTRING(-86.473434 32.478608,-86.472911 32.478615,-86.472651 32.478607,-86.47245 32.478604)\r\n600;610;even;Coleman Way;Autauga;AL;36067;LINESTRING(-86.478736 32.498212,-86.478737 32.499131)\r\n601;605;odd;Coleman Way;Autauga;AL;36067;LINESTRING(-86.478931 32.498211,-86.478932 32.49913)\r\n247;273;all;Simmons Rd;Autauga;AL;36067;LINESTRING(-86.525652 32.441567,-86.525648 32.441802,-86.525656 32.443176,-86.525696 32.443759,-86.525694 32.443982,-86.525668 32.444637,-86.525666 32.444732)\r\n2001;2099;all;Summit Pkwy;Autauga;AL;36066;LINESTRING(-86.41794 32.480903,-86.417952 32.480368,-86.417944 32.480078,-86.417947 32.479789)\r\n501;599;all;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.735529 32.492699,-86.738821 32.493659)\r\n1000;1098;even;Peagler St;Autauga;AL;36067;LINESTRING(-86.47158 32.433028,-86.471585 32.432932,-86.471572 32.432498,-86.471568 32.432131,-86.471553 32.431766,-86.47151 32.431204)\r\n911;1099;odd;Peagler St;Autauga;AL;36067;LINESTRING(-86.471386 32.433022,-86.471389 32.432932,-86.471376 32.4325,-86.471372 32.432135,-86.471357 32.431774,-86.471316 32.431214)\r\n1900;1908;even;Chancellor Ridge Rd;Autauga;AL;36066;LINESTRING(-86.417022 32.469129,-86.417016 32.469126,-86.416923 32.469129,-86.416832 32.469147,-86.416744 32.469166,-86.416656 32.469194,-86.416619 32.469213,-86.416526 32.469245,-86.416422 32.469315)\r\n1901;1999;odd;Chancellor Ridge Rd;Autauga;AL;36066;LINESTRING(-86.417024 32.469293,-86.417024 32.469296,-86.416951 32.469303,-86.416878 32.469313,-86.416806 32.46933,-86.416736 32.469352,-86.416705 32.469361,-86.416634 32.469397,-86.416535 32.469449)\r\n100;198;even;Village Creek Rd;Autauga;AL;36067;LINESTRING(-86.56542 32.433051,-86.565448 32.43334,-86.565409 32.433834,-86.565417 32.434401,-86.565396 32.434806,-86.565382 32.435055,-86.565408 32.435582,-86.565415 32.435832,-86.565409 32.436145,-86.565383 32.436438,-86.565325 32.436785,-86.565293 32.437034,-86.565274 32.437433,-86.565273 32.437598,-86.565237 32.437812,-86.565249 32.438407,-86.565215 32.439198,-86.565212 32.439667,-86.565223 32.440274,-86.565216 32.440712,-86.565221 32.44084)\r\n101;199;odd;Village Creek Rd;Autauga;AL;36067;LINESTRING(-86.565614 32.433037,-86.565644 32.433338,-86.565609 32.433838,-86.565615 32.434405,-86.56559 32.434814,-86.565576 32.435055,-86.565604 32.435576,-86.565611 32.43583,-86.565609 32.436153,-86.565583 32.436456,-86.565521 32.436805,-86.565493 32.437046,-86.565472 32.437435,-86.565479 32.43761,-86.565443 32.437824,-86.565445 32.438409,-86.565413 32.439202,-86.565408 32.439667,-86.565417 32.440274,-86.565412 32.44071,-86.565416 32.440835)\r\n1314;1398;even;Adell Pl;Autauga;AL;36066;LINESTRING(-86.438747 32.46104,-86.438743 32.460856,-86.438749 32.46064,-86.438749 32.460569)\r\n1315;1399;odd;Adell Pl;Autauga;AL;36066;LINESTRING(-86.438553 32.461043,-86.438549 32.460856,-86.438553 32.460638,-86.438554 32.460568)\r\n598;500;all;Autauga County32;Autauga;AL;36091;LINESTRING(-86.572076 32.679854,-86.572079 32.67986,-86.572008 32.679848,-86.571933 32.679842,-86.571861 32.679846,-86.571788 32.679852,-86.571631 32.679884,-86.570991 32.680082,-86.570922 32.680109,-86.570791 32.680175,-86.570734 32.68021,-86.570683 32.680254,-86.570584 32.680357,-86.570302 32.680722,-86.570192 32.680839,-86.56967 32.681315,-86.569489 32.681477,-86.569353 32.681576,-86.569011 32.681798,-86.568753 32.681985,-86.568505 32.682179,-86.568391 32.682278,-86.568226 32.682437,-86.568067 32.682605,-86.567902 32.68278,-86.56777 32.682887,-86.567629 32.682987,-86.567546 32.683029,-86.567461 32.683069,-86.567369 32.683095,-86.567277 32.683121,-86.567175 32.683128,-86.567073 32.683131,-86.566972 32.683108,-86.566882 32.683082,-86.566796 32.683048,-86.566579 32.682941,-86.566282 32.682824,-86.566131 32.682778,-86.565883 32.682725,-86.565715 32.68268,-86.565546 32.682625,-86.565388 32.682547,-86.565312 32.682501,-86.565175 32.682409,-86.564398 32.681828,-86.564337 32.681796,-86.564285 32.681781,-86.564238 32.681776,-86.564189 32.68179,-86.563981 32.68189,-86.563818 32.681956,-86.563728 32.681983,-86.563558 32.682027,-86.56331 32.682074,-86.563158 32.682112,-86.563016 32.682159,-86.56295 32.682188,-86.562816 32.682262,-86.562684 32.682347,-86.562359 32.682576,-86.561344 32.683349,-86.560824 32.683732,-86.560681 32.683824,-86.560526 32.683902,-86.560288 32.683995,-86.559895 32.684142,-86.559651 32.684222,-86.559243 32.68433,-86.559088 32.684379,-86.558941 32.684435,-86.558871 32.684466,-86.558729 32.684539,-86.558223 32.684819,-86.557867 32.685028,-86.5577 32.685119)\r\n4301;4373;all;Autauga County 88;Autauga;AL;36749;LINESTRING(-86.866694 32.535705,-86.866807 32.535746,-86.867251 32.535939)\r\n1126;1198;all;Wright St;Autauga;AL;36066;LINESTRING(-86.4456 32.466199,-86.445489 32.466227)\r\n1700;1798;even;Lyles Dr;Autauga;AL;36067;LINESTRING(-86.568957 32.521408,-86.569146 32.521399,-86.569164 32.521398,-86.569412 32.521413,-86.569574 32.521431,-86.569638 32.521438)\r\n1799;1701;odd;Lyles Dr;Autauga;AL;36067;LINESTRING(-86.568946 32.521244,-86.569136 32.521235,-86.569164 32.521234,-86.56943 32.521245,-86.569606 32.521261,-86.569678 32.521277)\r\n642;698;even;Little Farm Rd;Autauga;AL;36066;LINESTRING(-86.413866 32.467617,-86.413372 32.467448)\r\n655;699;odd;Little Farm Rd;Autauga;AL;36066;LINESTRING(-86.413793 32.46777,-86.413299 32.467601)\r\n800;898;even;Pine Corner Dr;Autauga;AL;36067;LINESTRING(-86.599726 32.522882,-86.599591 32.522855,-86.599299 32.522772,-86.59913 32.522726,-86.598954 32.522699,-86.598778 32.522678,-86.598268 32.522642,-86.59802 32.52261,-86.597693 32.522554,-86.59762 32.522536,-86.596747 32.522253,-86.596489 32.522178,-86.596365 32.522173,-86.596231 32.522216,-86.596142 32.522324,-86.596146 32.522439,-86.596228 32.522656,-86.59624 32.522714,-86.596236 32.522771,-86.596222 32.522827,-86.596198 32.522883,-86.596122 32.523001,-86.596025 32.523119,-86.595966 32.523194,-86.595945 32.523288,-86.59594 32.523592,-86.595943 32.523672,-86.595955 32.523763)\r\n801;899;odd;Pine Corner Dr;Autauga;AL;36067;LINESTRING(-86.599691 32.523044,-86.599537 32.523027,-86.599237 32.522932,-86.59908 32.522894,-86.59892 32.522865,-86.598756 32.522846,-86.598244 32.522812,-86.597986 32.522774,-86.597643 32.522722,-86.597554 32.522696,-86.596681 32.522413,-86.596453 32.52236,-86.596407 32.522361,-86.596383 32.522374,-86.596372 32.522388,-86.596362 32.522415,-86.59643 32.522616,-86.596446 32.522702,-86.596444 32.522791,-86.596424 32.522877,-86.596386 32.522957,-86.596294 32.523093,-86.596197 32.523211,-86.596172 32.523262,-86.596155 32.52331,-86.596136 32.523592,-86.596141 32.52366,-86.596149 32.523747)\r\n1339;1353;all;Autauga County 43;Autauga;AL;36067;LINESTRING(-86.61285 32.579203,-86.612851 32.579268,-86.612861 32.580343,-86.612854 32.580931)\r\n756;748;all;2nd St;Autauga;AL;36703;LINESTRING(-86.796534 32.3769,-86.79635 32.377822)\r\n149;101;odd;8th St;Autauga;AL;36067;LINESTRING(-86.473348 32.468898,-86.473104 32.468887,-86.472078 32.468818,-86.471947 32.468807)\r\n116;100;even;8th St;Autauga;AL;36067;LINESTRING(-86.473338 32.469063,-86.473092 32.469053,-86.472058 32.468986,-86.471924 32.46897)\r\n100;202;even;N Pickett St;Autauga;AL;36003;LINESTRING(-86.65293 32.433559,-86.652982 32.433628,-86.653644 32.434468)\r\n101;199;odd;N Pickett St;Autauga;AL;36003;LINESTRING(-86.653094 32.43347,-86.653146 32.433538,-86.653806 32.434377)\r\n200;2598;even;Autauga County 53;Autauga;AL;36006;LINESTRING(-86.675286 32.673131,-86.675237 32.67336,-86.6752 32.673494,-86.675154 32.673628,-86.675042 32.6739,-86.675 32.674048,-86.674971 32.674198,-86.674958 32.674349,-86.674961 32.674497,-86.674985 32.675001,-86.674992 32.675289,-86.674999 32.676227,-86.674972 32.676954,-86.674946 32.677239,-86.674923 32.677377,-86.674872 32.677583,-86.674796 32.677778,-86.674728 32.677899,-86.674645 32.678017,-86.674264 32.678489,-86.673924 32.678985,-86.673237 32.679993,-86.673003 32.680371,-86.672632 32.681024,-86.672516 32.681216,-86.672434 32.681341,-86.672301 32.68152,-86.672205 32.681629,-86.672098 32.681731,-86.672041 32.681777,-86.671849 32.681909,-86.671715 32.681991,-86.671148 32.682309,-86.670723 32.682558,-86.670174 32.682905,-86.670036 32.682998,-86.669793 32.683213,-86.669463 32.683552,-86.668944 32.684132,-86.667673 32.685582,-86.66716 32.686159,-86.666907 32.686452,-86.666166 32.687341,-86.665913 32.687633,-86.665755 32.687804,-86.665535 32.688025,-86.665306 32.688242,-86.664546 32.688921,-86.664302 32.689116,-86.663779 32.689477,-86.663492 32.68966)\r\n2401;2599;odd;Autauga County 53;Autauga;AL;36006;LINESTRING(-86.675478 32.673159,-86.675433 32.673394,-86.675394 32.673538,-86.675344 32.673678,-86.675238 32.673948,-86.675198 32.674082,-86.675173 32.674218,-86.67516 32.674355,-86.675159 32.674493,-86.675181 32.674997,-86.675188 32.675287,-86.675197 32.676229,-86.675172 32.676962,-86.675146 32.677257,-86.675119 32.677405,-86.675072 32.677627,-86.674988 32.677844,-86.674906 32.677981,-86.674813 32.678109,-86.674434 32.678579,-86.674094 32.679067,-86.673411 32.680073,-86.673181 32.680445,-86.672808 32.681098,-86.672692 32.681294,-86.672606 32.681427,-86.672469 32.681616,-86.672363 32.681737,-86.672244 32.681849,-86.672175 32.681905,-86.671971 32.682043,-86.671829 32.682129,-86.671258 32.682447,-86.670839 32.682694,-86.670298 32.683037,-86.670176 32.683126,-86.669943 32.683327,-86.669619 32.683656,-86.6691 32.684232,-86.667829 32.68568,-86.667318 32.686257,-86.667067 32.686548,-86.666326 32.687437,-86.666071 32.687733,-86.665911 32.68791,-86.665685 32.688135,-86.665452 32.688354,-86.664688 32.689041,-86.664436 32.689244,-86.663901 32.689609,-86.663609 32.689792)\r\n1700;1758;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.56183 32.432863,-86.562121 32.432899,-86.562234 32.432914,-86.562494 32.432939,-86.562927 32.432972,-86.563191 32.432986,-86.563287 32.432995,-86.563471 32.432992,-86.564417 32.433022,-86.564764 32.43302,-86.565362 32.433006)\r\n799;701;odd;State Rte 14 E;Autauga;AL;36066;LINESTRING(-86.444679 32.474961,-86.444887 32.474955,-86.445143 32.474952,-86.44532 32.474945,-86.445587 32.474915,-86.445765 32.474871,-86.446015 32.474782,-86.446178 32.474701,-86.446389 32.474549,-86.446511 32.474427,-86.446554 32.474358)\r\n714;700;even;State Rte 14 E;Autauga;AL;36066;LINESTRING(-86.44467 32.474797,-86.444881 32.474787,-86.445137 32.474784,-86.4453 32.474775,-86.445543 32.474743,-86.445697 32.474707,-86.445921 32.474626,-86.446056 32.474557,-86.446241 32.474423,-86.446343 32.474323,-86.446388 32.474272)\r\n100;198;even;Melvina Pl;Autauga;AL;36066;LINESTRING(-86.412694 32.455055,-86.412868 32.455062,-86.413116 32.455083,-86.413353 32.455126,-86.413414 32.455147,-86.413432 32.455148)\r\n101;199;odd;Melvina Pl;Autauga;AL;36066;LINESTRING(-86.4127 32.45489,-86.41288 32.454892,-86.413146 32.454913,-86.413411 32.454956,-86.41351 32.454987,-86.413536 32.455009)\r\n2452;2460;even;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.490152 32.617561,-86.490164 32.617879,-86.490192 32.619251,-86.490196 32.619463)\r\n2455;2467;odd;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.490347 32.617556,-86.49036 32.617875,-86.490388 32.619249,-86.490391 32.619461)\r\n901;999;all;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.691522 32.488995,-86.691698 32.489174,-86.693094 32.49056,-86.693936 32.491388,-86.694213 32.491667,-86.694495 32.491942,-86.696091 32.493529)\r\n2;298;even;Melissa Robyn Rd;Autauga;AL;36022;LINESTRING(-86.489799 32.663236,-86.48951 32.663277,-86.489206 32.663339,-86.48875 32.663305,-86.488307 32.663346,-86.487958 32.663366,-86.484157 32.6633,-86.484148 32.66329,-86.484099 32.663224,-86.484069 32.662877,-86.484128 32.662607,-86.484064 32.662323,-86.483928 32.662073,-86.483728 32.661769,-86.483402 32.661485,-86.483343 32.661382,-86.48317 32.661351,-86.48293 32.661386,-86.482784 32.661489,-86.482613 32.661575,-86.482297 32.661649)\r\n1;151;odd;Melissa Robyn Rd;Autauga;AL;36022;LINESTRING(-86.489833 32.663399,-86.489552 32.663443,-86.48922 32.663513,-86.488752 32.663469,-86.488325 32.663514,-86.487962 32.663534,-86.484123 32.663484,-86.483992 32.663458,-86.483873 32.66328,-86.483861 32.662863,-86.483936 32.662607,-86.483862 32.662379,-86.483746 32.662151,-86.483554 32.661879,-86.483228 32.661595,-86.483183 32.661544,-86.48316 32.661517,-86.483026 32.66156,-86.482896 32.661623,-86.482705 32.661751,-86.48234 32.661809)\r\n357;201;odd;Northington St;Autauga;AL;36067;LINESTRING(-86.466323 32.4712,-86.466351 32.471105,-86.466784 32.469704,-86.466997 32.469003,-86.467603 32.4672,-86.46764 32.466975,-86.467649 32.466825,-86.46765 32.466677,-86.467635 32.466456,-86.467566 32.465868)\r\n398;200;even;Northington St;Autauga;AL;36067;LINESTRING(-86.466134 32.471161,-86.466161 32.471065,-86.466596 32.469662,-86.466807 32.468959,-86.467401 32.467164,-86.467438 32.466957,-86.467449 32.466819,-86.46745 32.466681,-86.467437 32.466468,-86.467372 32.465884)\r\n4001;4099;all;Cecil Smedley Rd;Autauga;AL;36749;LINESTRING(-86.844316 32.513459,-86.844809 32.513729,-86.844971 32.513803,-86.845152 32.51387,-86.845358 32.513878,-86.84546 32.513854,-86.84555 32.513835,-86.845717 32.513773,-86.845877 32.513701,-86.846031 32.513618,-86.846174 32.513517,-86.846296 32.513404,-86.846359 32.513344,-86.846459 32.513216,-86.846716 32.512835,-86.846808 32.512715,-86.84696 32.512544,-86.84707 32.512442,-86.847128 32.512397,-86.847253 32.512319,-86.84739 32.512259,-86.847543 32.512213,-86.847702 32.512178,-86.847961 32.512137,-86.848045 32.512118,-86.848053 32.512113)\r\n2599;2501;odd;Autauga County 66;Autauga;AL;36067;LINESTRING(-86.539534 32.601458,-86.53952 32.601641,-86.539483 32.601915,-86.539466 32.601972,-86.539437 32.60203,-86.539401 32.602086,-86.539307 32.602205,-86.53922 32.602339,-86.539182 32.602413,-86.539157 32.602489,-86.539119 32.602634,-86.539097 32.602782,-86.539074 32.603157)\r\n2598;2584;even;Autauga County 66;Autauga;AL;36067;LINESTRING(-86.539728 32.601468,-86.539716 32.601653,-86.539693 32.601951,-86.539658 32.602032,-86.539619 32.602106,-86.539575 32.602174,-86.539481 32.602293,-86.539404 32.602413,-86.539376 32.602471,-86.539353 32.602531,-86.539319 32.602664,-86.539297 32.602798,-86.539269 32.603167)\r\n699;401;odd;Allenville Rd;Autauga;AL;36067;LINESTRING(-86.495235 32.466133,-86.495194 32.466162,-86.495132 32.466203,-86.495067 32.46624,-86.494923 32.466308,-86.494844 32.466342,-86.494731 32.466389,-86.494693 32.466403,-86.494537 32.466459,-86.494379 32.466509,-86.49395 32.466631,-86.493705 32.466706,-86.49256 32.467022,-86.492397 32.467071,-86.491915 32.467228,-86.491757 32.467272,-86.491599 32.467306,-86.491438 32.467328,-86.491273 32.467338,-86.489899 32.46736,-86.48818 32.467374,-86.487487 32.467371)\r\n698;300;even;Allenville Rd;Autauga;AL;36067;LINESTRING(-86.49537 32.466251,-86.495328 32.46629,-86.495252 32.466343,-86.495169 32.466386,-86.495015 32.466454,-86.494934 32.466492,-86.494813 32.466539,-86.494773 32.466555,-86.494611 32.466615,-86.494445 32.466667,-86.494014 32.466789,-86.493769 32.466864,-86.492624 32.46718,-86.492465 32.467227,-86.491983 32.467386,-86.491815 32.467436,-86.491641 32.467476,-86.49146 32.467498,-86.491281 32.467506,-86.489901 32.467526,-86.48818 32.467538,-86.487486 32.467536)\r\n1301;1399;all;Soledad Ranch Rd;Autauga;AL;36749;LINESTRING(-86.82948 32.601032,-86.829502 32.601155,-86.829527 32.601388,-86.829591 32.602782,-86.829613 32.603071,-86.82962 32.603416,-86.829651 32.603634,-86.829657 32.603786,-86.829672 32.604592,-86.829706 32.605022,-86.829747 32.605304,-86.829791 32.60551,-86.829832 32.605644,-86.829887 32.605771,-86.829955 32.605896,-86.830076 32.60608,-86.830476 32.606634,-86.830567 32.606749,-86.830614 32.606798,-86.830662 32.606843,-86.830846 32.606988,-86.831357 32.607348,-86.831683 32.607584,-86.831813 32.607667,-86.83202 32.607782,-86.832248 32.607889,-86.83233 32.607927,-86.83241 32.60798,-86.832475 32.608048,-86.832529 32.608116,-86.832568 32.608191,-86.832601 32.608264,-86.832626 32.608347,-86.832624 32.608446,-86.832581 32.60859,-86.832568 32.608648,-86.832587 32.608698,-86.832609 32.608744,-86.832647 32.608789,-86.83296 32.609036,-86.832968 32.609054)\r\n2835;2897;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.682228 32.573585,-86.682933 32.574195,-86.683418 32.574615)\r\n1298;1200;all;Indian Hills Rd;Autauga;AL;36067;LINESTRING(-86.496524 32.461322,-86.496563 32.461282)\r\n799;701;odd;Sheila Blvd;Autauga;AL;36066;LINESTRING(-86.425648 32.460376,-86.425653 32.460086,-86.425639 32.459418,-86.425638 32.459049,-86.425648 32.458907,-86.42569 32.458694,-86.425741 32.458568,-86.425757 32.458528)\r\n798;700;even;Sheila Blvd;Autauga;AL;36066;LINESTRING(-86.425454 32.460374,-86.425457 32.460086,-86.425443 32.45942,-86.42544 32.459047,-86.425442 32.458889,-86.42549 32.458654,-86.425541 32.458492,-86.425591 32.458441)\r\n1799;1763;all;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.68524 32.523903,-86.684153 32.523909,-86.683296 32.523916,-86.682441 32.523917,-86.680729 32.523932,-86.680384 32.523937,-86.679353 32.523974,-86.677036 32.52408,-86.676575 32.524108)\r\n4399;4369;odd;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.893595 32.591672,-86.893358 32.591727,-86.893195 32.59176,-86.89295 32.591799,-86.892705 32.591828,-86.892452 32.591846,-86.892113 32.591847,-86.891774 32.591832,-86.891258 32.591794,-86.890509 32.591732,-86.88857 32.591567)\r\n4398;4300;even;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.893648 32.59183,-86.893408 32.591889,-86.893237 32.591924,-86.892982 32.591965,-86.892729 32.591996,-86.892462 32.592018,-86.892107 32.592017,-86.89176 32.591998,-86.89124 32.591958,-86.890489 32.591896,-86.888551 32.59173)\r\n1858;1998;all;Maul Dr;Autauga;AL;36006;LINESTRING(-86.721092 32.657089,-86.72067 32.657178,-86.720241 32.65726,-86.719821 32.657347,-86.719653 32.657388,-86.719488 32.65744,-86.719327 32.657504,-86.719172 32.657576,-86.719024 32.657661,-86.718883 32.657752,-86.718749 32.657852,-86.71863 32.657964,-86.718548 32.658052)\r\n2801;2899;all;Whitwood Ln;Autauga;AL;36067;LINESTRING(-86.650275 32.662183,-86.650366 32.662179,-86.650865 32.662169,-86.651482 32.66217,-86.651622 32.662185)\r\n1300;1398;all;Dodgers Dr;Autauga;AL;36067;LINESTRING(-86.417969 32.430396,-86.417891 32.430278,-86.41783 32.430207,-86.41774 32.43015,-86.417687 32.430099,-86.41763 32.430085,-86.417515 32.430027,-86.417466 32.430022)\r\n199;101;odd;N Nichols St;Autauga;AL;36066;LINESTRING(-86.449542 32.467773,-86.449196 32.467621,-86.449049 32.467554,-86.447918 32.467056,-86.447613 32.466932,-86.447399 32.466828,-86.447277 32.466751,-86.447132 32.466611,-86.447066 32.466502,-86.446987 32.466303,-86.446922 32.466108)\r\n198;100;even;N Nichols St;Autauga;AL;36066;LINESTRING(-86.449453 32.46792,-86.449104 32.467769,-86.448957 32.4677,-86.44783 32.467206,-86.447521 32.467082,-86.447291 32.466974,-86.447133 32.466889,-86.446946 32.466713,-86.446874 32.466564,-86.446797 32.466351,-86.446735 32.466152)\r\n2499;2321;all;Line St;Autauga;AL;36003;LINESTRING(-86.649837 32.42712,-86.648937 32.427623,-86.648738 32.427744)\r\n1299;1201;odd;Terrell Ln;Autauga;AL;36749;LINESTRING(-86.87915 32.596169,-86.879159 32.596103,-86.879183 32.595967,-86.879224 32.595829,-86.879243 32.595729,-86.879245 32.59564,-86.879218 32.595544,-86.879127 32.595299,-86.879093 32.595166,-86.879075 32.595035,-86.879094 32.594904,-86.879143 32.594697,-86.879149 32.594594,-86.879131 32.594521,-86.879085 32.594375,-86.878947 32.594027,-86.878911 32.593953,-86.878869 32.593878,-86.878768 32.593749,-86.878679 32.593674)\r\n1298;1200;even;Terrell Ln;Autauga;AL;36749;LINESTRING(-86.878955 32.596166,-86.878949 32.596085,-86.878989 32.595933,-86.879024 32.595797,-86.879035 32.595717,-86.879033 32.595658,-86.87902 32.595586,-86.878933 32.595345,-86.878885 32.595194,-86.878879 32.595033,-86.878892 32.59488,-86.878937 32.594675,-86.878943 32.594604,-86.878935 32.594559,-86.878893 32.594423,-86.878759 32.594087,-86.878727 32.594023,-86.878691 32.593966,-86.878604 32.593857,-86.878534 32.593784)\r\n1201;1229;all;Valridge N;Autauga;AL;36066;LINESTRING(-86.439384 32.501437,-86.4394 32.501744,-86.439397 32.501892)\r\n4117;3901;odd;Autauga County 22;Autauga;AL;36758;LINESTRING(-86.879459 32.6283,-86.878234 32.628292,-86.877374 32.628293,-86.876941 32.628299,-86.876246 32.628314,-86.875724 32.628317,-86.875349 32.628306,-86.874178 32.628297,-86.872075 32.628292)\r\n4136;4000;even;Autauga County 22;Autauga;AL;36758;LINESTRING(-86.879457 32.628464,-86.878234 32.628458,-86.877376 32.628459,-86.876945 32.628465,-86.87625 32.62848,-86.875722 32.628483,-86.875345 32.628472,-86.874176 32.628463,-86.872075 32.628457)\r\n601;699;all;Chambliss St;Autauga;AL;36066;LINESTRING(-86.448816 32.461199,-86.448808 32.460429)\r\n112;198;all;Mays Ct;Autauga;AL;36091;LINESTRING(-86.556017 32.699285,-86.556204 32.699289,-86.5564 32.699267,-86.556502 32.699264,-86.556549 32.699152,-86.55659 32.698972,-86.556652 32.698765)\r\n1742;1700;even;Windermere Ave;Autauga;AL;36066;LINESTRING(-86.430005 32.475599,-86.43013 32.475595,-86.430295 32.475594,-86.430459 32.475603,-86.430519 32.475618,-86.430539 32.475613)\r\n1737;1501;odd;Windermere Ave;Autauga;AL;36066;LINESTRING(-86.429993 32.475434,-86.430124 32.475425,-86.430299 32.475426,-86.430477 32.475431,-86.430587 32.475436,-86.430628 32.475467)\r\n208;298;even;Amanda Ln;Autauga;AL;36066;LINESTRING(-86.424739 32.444238,-86.424715 32.444225,-86.424616 32.4442,-86.424177 32.444193,-86.423667 32.444171,-86.423593 32.444182)\r\n201;299;odd;Amanda Ln;Autauga;AL;36066;LINESTRING(-86.42467 32.444392,-86.424653 32.444391,-86.424586 32.44438,-86.424169 32.444359,-86.423675 32.444341,-86.42362 32.444345)\r\n644;686;all;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.616301 32.507249,-86.616207 32.507347,-86.615937 32.507634,-86.61573 32.507868,-86.615629 32.507988,-86.615264 32.508485,-86.61484 32.509115,-86.614657 32.509359,-86.614484 32.509573)\r\n2798;2500;all;I- 65;Autauga;AL;36051;LINESTRING(-86.50038 32.657627,-86.500983 32.658798,-86.501393 32.659596,-86.503451 32.663572)\r\n1300;1398;all;Serenity Dr;Autauga;AL;36067;LINESTRING(-86.424283 32.435304,-86.42398 32.435581,-86.423771 32.435766,-86.423627 32.435789,-86.423531 32.435753)\r\n842;830;all;Autauga County 140;Autauga;AL;36051;LINESTRING(-86.587383 32.597558,-86.587385 32.597574,-86.587372 32.59771,-86.587359 32.598284,-86.587374 32.599946,-86.587373 32.600094,-86.587346 32.600251,-86.587268 32.600408,-86.587133 32.600529,-86.586996 32.600617,-86.586889 32.600709,-86.586758 32.600868,-86.586727 32.600909)\r\n2498;2400;all;Tyus St;Autauga;AL;36003;LINESTRING(-86.655942 32.434979,-86.655084 32.435463,-86.65483 32.4356)\r\n2000;2098;even;Big Springs Church Rd;Autauga;AL;36006;LINESTRING(-86.69826 32.621338,-86.698247 32.621639,-86.698225 32.622,-86.698223 32.62215,-86.698229 32.622228,-86.698263 32.622443,-86.6983 32.622586,-86.698475 32.623074,-86.698757 32.623836,-86.698813 32.623976,-86.698882 32.624115,-86.698969 32.624249,-86.699075 32.624374,-86.699187 32.624486,-86.699303 32.624597,-86.699537 32.624808,-86.6997 32.624971,-86.69979 32.625082,-86.699868 32.625203,-86.699934 32.625327,-86.699994 32.62546,-86.700196 32.62594,-86.700495 32.626612,-86.70065 32.626943,-86.700853 32.627417,-86.701035 32.627822,-86.701195 32.628162,-86.701274 32.628295,-86.701359 32.628431,-86.701465 32.62856,-86.701596 32.628668,-86.701733 32.628766,-86.702429 32.629202,-86.702574 32.629287,-86.702726 32.629366,-86.702887 32.629432,-86.703053 32.629487,-86.703221 32.629533,-86.703311 32.629555,-86.703537 32.629587,-86.703988 32.62965,-86.704478 32.629727,-86.704708 32.629783,-86.704849 32.629837,-86.704988 32.629908,-86.705124 32.62999,-86.705256 32.630081,-86.705448 32.630226,-86.705774 32.63045,-86.706106 32.630664,-86.706248 32.630744,-86.706394 32.630824,-86.707146 32.631185,-86.707955 32.631603,-86.708445 32.631876,-86.70861 32.63197)\r\n2001;2099;odd;Big Springs Church Rd;Autauga;AL;36006;LINESTRING(-86.698455 32.621344,-86.698443 32.621647,-86.698423 32.622004,-86.698423 32.622144,-86.698429 32.62221,-86.698463 32.622413,-86.698496 32.622544,-86.698663 32.623026,-86.698945 32.623784,-86.699001 32.623914,-86.699066 32.624039,-86.699143 32.624157,-86.699235 32.62427,-86.699337 32.624378,-86.699449 32.624485,-86.699685 32.624696,-86.699864 32.624865,-86.699964 32.624992,-86.70005 32.625127,-86.700118 32.625263,-86.70018 32.625402,-86.70038 32.625884,-86.700679 32.626552,-86.700834 32.626885,-86.701037 32.627359,-86.701219 32.627762,-86.701379 32.628092,-86.70145 32.628217,-86.701533 32.628339,-86.701625 32.628446,-86.701734 32.628542,-86.701859 32.628634,-86.702545 32.629066,-86.702682 32.629145,-86.702824 32.629216,-86.702969 32.629276,-86.703121 32.629327,-86.703279 32.629371,-86.703355 32.629387,-86.703571 32.629423,-86.704022 32.629486,-86.704524 32.629559,-86.704782 32.629617,-86.704947 32.629685,-86.7051 32.629766,-86.705246 32.629854,-86.705386 32.629953,-86.705578 32.630098,-86.705896 32.630318,-86.706222 32.630526,-86.706356 32.630604,-86.706498 32.63068,-86.707246 32.631041,-86.708061 32.631461,-86.708555 32.631738,-86.70872 32.631834)\r\n1916;1998;even;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.548978 32.563518,-86.549069 32.564291,-86.549223 32.565596,-86.549237 32.565716,-86.549366 32.566938,-86.549424 32.567374,-86.549476 32.567663,-86.549545 32.56795,-86.549626 32.568235,-86.549771 32.568654,-86.549976 32.569207,-86.550419 32.570299,-86.551366 32.572688,-86.55157 32.573238,-86.551614 32.573373,-86.551706 32.573713,-86.551742 32.57387)\r\n1913;1999;odd;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.549172 32.563502,-86.549263 32.564275,-86.549417 32.56558,-86.549431 32.5657,-86.549562 32.566922,-86.54962 32.567352,-86.549672 32.567633,-86.549739 32.567914,-86.549818 32.568191,-86.549959 32.568606,-86.550164 32.569155,-86.550605 32.570247,-86.551554 32.572636,-86.551758 32.57319,-86.551808 32.573331,-86.551902 32.573679,-86.551934 32.573841)\r\n2215;2221;all;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.66162 32.653996,-86.661579 32.654076,-86.661492 32.654204,-86.661441 32.654272,-86.661397 32.654334,-86.661334 32.654401)\r\n2799;2701;all;State Rte 14;Autauga;AL;36003;LINESTRING(-86.658266 32.431248,-86.657224 32.431404)\r\n129;153;all;Simmons Rd;Autauga;AL;36067;LINESTRING(-86.525643 32.435994,-86.525695 32.437498,-86.525711 32.438155,-86.52571 32.438279)\r\n506;598;even;Mockingbird Ct;Autauga;AL;36067;LINESTRING(-86.485975 32.478752,-86.485768 32.478751,-86.4856 32.478756,-86.485596 32.478756)\r\n501;599;odd;Mockingbird Ct;Autauga;AL;36067;LINESTRING(-86.485975 32.478916,-86.48577 32.478917,-86.4856 32.47892,-86.48559 32.47892)\r\n100;2298;even;Cyrus Dr;Autauga;AL;36003;LINESTRING(-86.643778 32.437633,-86.643756 32.437663,-86.643742 32.437698)\r\n101;503;odd;Cyrus Dr;Autauga;AL;36003;LINESTRING(-86.643964 32.437681,-86.643954 32.437741,-86.643905 32.437788)\r\n1923;1949;all;Maul Dr;Autauga;AL;36006;LINESTRING(-86.723627 32.65631,-86.723493 32.656391,-86.723269 32.656506,-86.722891 32.656683,-86.722428 32.656871,-86.722192 32.656963,-86.721874 32.657068,-86.721481 32.657173,-86.721425 32.657185)\r\n1796;1798;all;Co Rd 163;Autauga;AL;36051;LINESTRING(-86.5876 32.631853,-86.587592 32.632008,-86.587583 32.632129)\r\n1901;2085;all;Briarwood St;Autauga;AL;36066;LINESTRING(-86.416553 32.464707,-86.416227 32.464903)\r\n1034;1000;even;Orton St;Autauga;AL;36067;LINESTRING(-86.46364 32.425962,-86.463623 32.425737,-86.463616 32.425625)\r\n1035;1001;odd;Orton St;Autauga;AL;36067;LINESTRING(-86.463446 32.425973,-86.463427 32.425747,-86.463422 32.425632)\r\n200;298;even;S Nichols St;Autauga;AL;36066;LINESTRING(-86.446545 32.464945,-86.446335 32.464312,-86.446302 32.464234)\r\n201;299;odd;S Nichols St;Autauga;AL;36066;LINESTRING(-86.446358 32.46499,-86.446145 32.464362,-86.446118 32.464286)\r\n100;198;even;Lasalle Ct;Autauga;AL;36067;LINESTRING(-86.462383 32.453032,-86.46222 32.453038,-86.461282 32.453057,-86.461198 32.453063,-86.461135 32.453067)\r\n101;199;odd;Lasalle Ct;Autauga;AL;36067;LINESTRING(-86.462393 32.453196,-86.462228 32.453204,-86.461294 32.453227,-86.461208 32.453235,-86.461136 32.453232)\r\n2338;2376;even;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.481523 32.616415,-86.481705 32.616673,-86.482187 32.617435,-86.482595 32.618067,-86.48366 32.61975,-86.484287 32.620741,-86.48456 32.62118,-86.484722 32.621445,-86.484794 32.621551,-86.484938 32.621769,-86.485138 32.622085)\r\n2335;2379;odd;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.481689 32.61633,-86.481879 32.616589,-86.482359 32.617357,-86.482767 32.617989,-86.483832 32.619672,-86.484459 32.620663,-86.484732 32.621104,-86.484896 32.621365,-86.484964 32.621471,-86.485112 32.621689,-86.48531 32.622007)\r\n510;598;all;E Main St;Autauga;AL;36067;LINESTRING(-86.461599 32.459382,-86.461384 32.459363,-86.460396 32.459472)\r\n1248;1298;even;Adell Pl;Autauga;AL;36066;LINESTRING(-86.441703 32.46354,-86.441664 32.46354,-86.441401 32.463565,-86.441224 32.463595,-86.440911 32.463727,-86.440607 32.463818,-86.440305 32.463856,-86.43995 32.463759,-86.439671 32.463543,-86.439383 32.463196,-86.439106 32.46288)\r\n1249;1299;odd;Adell Pl;Autauga;AL;36066;LINESTRING(-86.441716 32.463704,-86.441682 32.463708,-86.441437 32.463735,-86.441294 32.463767,-86.440991 32.463885,-86.440659 32.463996,-86.440289 32.46403,-86.439834 32.463931,-86.439507 32.463661,-86.439221 32.463292,-86.438949 32.462977)\r\n116;198;even;Moses Rd;Autauga;AL;36067;LINESTRING(-86.466498 32.50035,-86.466527 32.500352,-86.466952 32.50038,-86.467129 32.500383,-86.468237 32.500328,-86.468905 32.500318,-86.468986 32.500327)\r\n101;199;odd;Moses Rd;Autauga;AL;36067;LINESTRING(-86.466509 32.500186,-86.466539 32.500186,-86.466962 32.500212,-86.467125 32.500215,-86.468229 32.500162,-86.468927 32.500138,-86.469032 32.500167)\r\n1200;1298;even;Kenwood Ct;Autauga;AL;36067;LINESTRING(-86.474905 32.495527,-86.474891 32.495267,-86.474911 32.494627,-86.474935 32.494517)\r\n1201;1299;odd;Kenwood Ct;Autauga;AL;36067;LINESTRING(-86.474711 32.495536,-86.474693 32.495271,-86.474697 32.494603,-86.474746 32.494476)\r\n700;898;even;Thomas Ave;Autauga;AL;36067;LINESTRING(-86.451859 32.457282,-86.451826 32.457304,-86.451074 32.457807)\r\n701;799;odd;Thomas Ave;Autauga;AL;36067;LINESTRING(-86.451982 32.45741,-86.451948 32.457434,-86.451195 32.457936)\r\n1367;1381;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.508015 32.470011,-86.508448 32.470143)\r\n255;201;odd;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.665944 32.405831,-86.665781 32.406471,-86.665413 32.407891,-86.665141 32.408963,-86.665059 32.409399,-86.665011 32.40969,-86.664975 32.409984,-86.664949 32.410275,-86.664931 32.41057,-86.664927 32.410863,-86.664934 32.411449,-86.664984 32.41363,-86.665022 32.414707)\r\n298;250;even;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.666134 32.405866,-86.665971 32.406507,-86.665603 32.407925,-86.665337 32.408995,-86.665253 32.409423,-86.665207 32.40971,-86.665171 32.41,-86.665145 32.410285,-86.665129 32.410576,-86.665121 32.410863,-86.66513 32.411447,-86.66518 32.413626,-86.665216 32.414702)\r\n398;300;even;Arbor Ln;Autauga;AL;36066;LINESTRING(-86.424742 32.451702,-86.424428 32.451701,-86.424259 32.451707,-86.424021 32.451691,-86.42389 32.451653,-86.423867 32.451638,-86.42382 32.451584,-86.423798 32.451535,-86.423777 32.451406,-86.423785 32.450903,-86.423786 32.450398,-86.423783 32.450391)\r\n399;301;odd;Arbor Ln;Autauga;AL;36066;LINESTRING(-86.424742 32.451867,-86.424432 32.451869,-86.424259 32.451873,-86.423981 32.451877,-86.423786 32.451817,-86.423709 32.45177,-86.423626 32.451672,-86.423584 32.451575,-86.423577 32.451412,-86.423589 32.450901,-86.423584 32.450392,-86.423589 32.450379)\r\n2899;2801;odd;Autauga County 74;Autauga;AL;36003;LINESTRING(-86.675317 32.414592,-86.6752 32.414595,-86.6747 32.414599,-86.671701 32.414645,-86.666804 32.414714,-86.665518 32.414731,-86.665265 32.414741)\r\n2898;2800;even;Autauga County 74;Autauga;AL;36003;LINESTRING(-86.675326 32.414757,-86.675206 32.414763,-86.674702 32.414765,-86.671705 32.414809,-86.666808 32.414878,-86.665524 32.414897,-86.665273 32.414905)\r\n329;301;all;2nd St;Autauga;AL;36703;LINESTRING(-86.802916 32.429072,-86.803509 32.430334,-86.803754 32.430879,-86.803865 32.431153,-86.80396 32.431431,-86.803999 32.431569,-86.804055 32.431817)\r\n100;198;even;September Dr;Autauga;AL;36022;LINESTRING(-86.489159 32.659254,-86.488293 32.659359)\r\n101;199;odd;September Dr;Autauga;AL;36022;LINESTRING(-86.489187 32.659417,-86.488321 32.659522)\r\n2600;2698;all;Rollins Rd;Autauga;AL;36051;LINESTRING(-86.415389 32.678196,-86.414567 32.678206,-86.413716 32.678223,-86.413273 32.678232,-86.413167 32.678204,-86.413058 32.67816,-86.412932 32.678014,-86.412912 32.677919,-86.412902 32.677839,-86.412902 32.677689)\r\n300;318;even;Fig Tree Ct;Autauga;AL;36749;LINESTRING(-86.84586 32.504302,-86.845814 32.504332,-86.845678 32.504418,-86.845535 32.504514,-86.845471 32.504571,-86.845408 32.504629,-86.845285 32.504782)\r\n301;319;odd;Fig Tree Ct;Autauga;AL;36749;LINESTRING(-86.845993 32.504422,-86.845946 32.504466,-86.8458 32.504552,-86.845673 32.504642,-86.845617 32.504687,-86.845568 32.504737,-86.845444 32.504877)\r\n1618;1620;all;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.650682 32.524204,-86.650937 32.524207)\r\n1922;1960;even;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.514206 32.561182,-86.51428 32.561422,-86.514614 32.562387,-86.514655 32.562522,-86.51472 32.562802,-86.514741 32.562941,-86.514751 32.56308,-86.514753 32.563363,-86.514727 32.563646,-86.514703 32.563785,-86.514669 32.563924,-86.514628 32.564062,-86.514534 32.564336,-86.514432 32.564612,-86.514319 32.564935)\r\n1921;1999;odd;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.514394 32.56114,-86.51447 32.561378,-86.514804 32.562343,-86.514851 32.562484,-86.51492 32.562776,-86.514939 32.562925,-86.514951 32.563074,-86.514955 32.563369,-86.514927 32.563666,-86.514901 32.563815,-86.514863 32.563962,-86.514818 32.564106,-86.514722 32.564384,-86.51462 32.56466,-86.514506 32.564982)\r\n1400;1444;even;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.412228 32.528894,-86.41231 32.529006,-86.412363 32.52906,-86.412805 32.529583,-86.412845 32.529633,-86.412891 32.529691,-86.413004 32.529837)\r\n1401;1455;odd;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.412391 32.528804,-86.412474 32.528904,-86.412523 32.528958,-86.412963 32.529487,-86.413009 32.529539,-86.413055 32.529601,-86.413167 32.529748)\r\n1300;1398;even;Autauga County 34;Autauga;AL;36006;LINESTRING(-86.64935 32.665995,-86.649374 32.666199,-86.649401 32.666855,-86.649392 32.666995,-86.649374 32.667132,-86.649314 32.667411,-86.649311 32.667513,-86.649418 32.667679,-86.649606 32.667774,-86.649804 32.667798,-86.649993 32.667791,-86.650261 32.667775,-86.650436 32.667751,-86.650602 32.667735,-86.65077 32.667725,-86.651284 32.667711,-86.651975 32.667668,-86.652143 32.667662,-86.652474 32.667662,-86.652635 32.667668,-86.652794 32.667684,-86.652952 32.667711,-86.653435 32.667828,-86.653588 32.667875,-86.653732 32.667933,-86.653869 32.668004,-86.654002 32.668087,-86.654263 32.668266,-86.654781 32.668643,-86.654921 32.668733,-86.654999 32.668778,-86.655155 32.668849,-86.655327 32.66891,-86.655506 32.668944,-86.65585 32.668998,-86.656016 32.669029,-86.657326 32.669336,-86.657493 32.669367,-86.657584 32.669378,-86.657676 32.66938,-86.657768 32.669379,-86.657864 32.66937,-86.657962 32.669352,-86.65814 32.669292,-86.65873 32.668988,-86.658874 32.668921,-86.659019 32.668863,-86.659087 32.668841,-86.659237 32.66881,-86.659392 32.668793,-86.659554 32.668785,-86.659805 32.668769,-86.660341 32.668719,-86.66112 32.668614,-86.661459 32.668551,-86.661863 32.668473,-86.662021 32.668453,-86.66218 32.668443,-86.662342 32.668455,-86.662509 32.668475,-86.662676 32.668502,-86.663206 32.668602)\r\n1301;1399;odd;Autauga County 34;Autauga;AL;36067;LINESTRING(-86.649544 32.665976,-86.649576 32.666187,-86.649597 32.666855,-86.649594 32.667007,-86.649574 32.667156,-86.649516 32.667419,-86.649533 32.667457,-86.64959 32.667541,-86.649688 32.667594,-86.649822 32.667622,-86.649983 32.667623,-86.650239 32.667605,-86.65041 32.667585,-86.650584 32.667567,-86.65076 32.667559,-86.651274 32.667543,-86.651963 32.667502,-86.652139 32.667494,-86.652478 32.667494,-86.652651 32.667498,-86.652826 32.667516,-86.653 32.667545,-86.653495 32.667668,-86.653664 32.667715,-86.653832 32.667779,-86.653983 32.667864,-86.654126 32.667953,-86.654389 32.668138,-86.654907 32.668511,-86.655037 32.668595,-86.655103 32.66863,-86.655243 32.668693,-86.655391 32.668742,-86.655548 32.668778,-86.65589 32.668834,-86.656064 32.668865,-86.657374 32.669172,-86.657529 32.669199,-86.657604 32.669208,-86.657678 32.669214,-86.657752 32.669209,-86.657828 32.6692,-86.657898 32.669184,-86.658046 32.669134,-86.658632 32.668842,-86.658782 32.668773,-86.658937 32.668705,-86.659025 32.668677,-86.659199 32.668636,-86.659376 32.668623,-86.659542 32.668619,-86.659787 32.668603,-86.660315 32.668553,-86.661084 32.668448,-86.661415 32.668389,-86.661825 32.668303,-86.662001 32.668283,-86.662182 32.668277,-86.662364 32.668287,-86.662543 32.668307,-86.662718 32.66834,-86.663249 32.668442)\r\n3569;3501;odd;Netezen Ln;Autauga;AL;36749;LINESTRING(-86.786072 32.586567,-86.786039 32.58643,-86.786021 32.586313,-86.786015 32.586207,-86.786012 32.586099,-86.786008 32.585895,-86.785999 32.585752,-86.78599 32.585681,-86.785983 32.585575,-86.78598 32.585446,-86.785973 32.585314,-86.785968 32.585169,-86.785966 32.585028,-86.785959 32.584899,-86.785958 32.584769,-86.785968 32.584606,-86.785983 32.584422,-86.786003 32.584313,-86.78609 32.584058,-86.786118 32.583994,-86.78615 32.583931)\r\n3580;3542;even;Netezen Ln;Autauga;AL;36749;LINESTRING(-86.785883 32.586606,-86.785833 32.586458,-86.785825 32.586327,-86.785813 32.586213,-86.785816 32.586101,-86.78581 32.585901,-86.785799 32.585766,-86.785788 32.585693,-86.785787 32.585579,-86.785784 32.58545,-86.785779 32.58532,-86.78577 32.585173,-86.785768 32.585034,-86.785759 32.584903,-86.785758 32.584765,-86.785772 32.584596,-86.785781 32.584406,-86.785799 32.584275,-86.785898 32.584002,-86.785934 32.583928,-86.785973 32.583861)\r\n1390;1300;even;Candlestick Way;Autauga;AL;36067;LINESTRING(-86.415999 32.430306,-86.416134 32.43021,-86.416395 32.429866)\r\n1399;1301;odd;Candlestick Way;Autauga;AL;36067;LINESTRING(-86.415866 32.430186,-86.41597 32.430092,-86.416233 32.429775)\r\n2501;2599;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.641639 32.538,-86.642525 32.539411,-86.642538 32.539432)\r\n99;3;odd;Knob Hill Rd;Autauga;AL;36067;LINESTRING(-86.459041 32.460973,-86.459054 32.460896)\r\n98;4;even;Knob Hill Rd;Autauga;AL;36067;LINESTRING(-86.458848 32.46095,-86.458861 32.460873)\r\n399;325;odd;Autauga County 36;Autauga;AL;36051;LINESTRING(-86.455681 32.704285,-86.455743 32.704294,-86.455915 32.704309,-86.456176 32.70432,-86.456776 32.704304,-86.457545 32.70429,-86.457892 32.704274,-86.45832 32.704224,-86.458741 32.704158,-86.458996 32.704113,-86.459408 32.704019,-86.459568 32.703993,-86.459727 32.703978,-86.459886 32.70398,-86.460134 32.704002,-86.46047 32.704044,-86.461067 32.704097,-86.46158 32.704135,-86.461838 32.704144,-86.462268 32.704144,-86.462442 32.704138,-86.4627 32.704117,-86.463204 32.70405)\r\n398;328;even;Autauga County 36;Autauga;AL;36051;LINESTRING(-86.455709 32.704122,-86.455767 32.704128,-86.455931 32.704141,-86.456178 32.704154,-86.45677 32.70414,-86.457537 32.704122,-86.457872 32.704104,-86.458288 32.704058,-86.458703 32.703994,-86.458948 32.703949,-86.459362 32.703853,-86.459536 32.703823,-86.459717 32.703806,-86.4599 32.703806,-86.46016 32.703836,-86.460496 32.703878,-86.461085 32.703931,-86.461592 32.703967,-86.461842 32.703976,-86.462264 32.703976,-86.462428 32.70397,-86.462676 32.703949,-86.463175 32.703887)\r\n1753;1835;all;Autauga County 7;Autauga;AL;36758;LINESTRING(-86.871656 32.636915,-86.871659 32.637176,-86.871708 32.638487,-86.871717 32.638925,-86.871733 32.639359,-86.871827 32.64268,-86.871844 32.643118,-86.871867 32.643994,-86.87186 32.644433,-86.871841 32.644726,-86.871812 32.644942,-86.871743 32.645303,-86.871627 32.645853,-86.87161 32.645979,-86.871603 32.64604,-86.87161 32.646145)\r\n200;298;even;Fawn Ln;Autauga;AL;36067;LINESTRING(-86.482961 32.454569,-86.483088 32.454549,-86.483153 32.454542,-86.483244 32.454517,-86.483277 32.454503,-86.483329 32.454488,-86.483476 32.454427,-86.483732 32.454337,-86.483816 32.45429,-86.483895 32.454234,-86.483962 32.454162,-86.484004 32.454079,-86.484033 32.453999,-86.484046 32.453917,-86.484049 32.453551,-86.484064 32.45334,-86.48408 32.453285,-86.484106 32.453236,-86.484114 32.453213)\r\n201;299;odd;Fawn Ln;Autauga;AL;36067;LINESTRING(-86.482924 32.454408,-86.48305 32.454387,-86.483101 32.454374,-86.483174 32.454355,-86.483203 32.454347,-86.483251 32.45433,-86.483396 32.454277,-86.483632 32.454181,-86.48369 32.45415,-86.483741 32.45411,-86.483778 32.454068,-86.48381 32.454017,-86.483829 32.453961,-86.48384 32.453903,-86.483853 32.453547,-86.483858 32.45332,-86.483874 32.453231,-86.48392 32.453144,-86.483959 32.453114)\r\n100;122;even;Country Club Dr;Autauga;AL;36067;LINESTRING(-86.474865 32.441242,-86.474672 32.441155,-86.474371 32.441014,-86.474216 32.440946,-86.473746 32.440762,-86.472982 32.440431,-86.472575 32.440252,-86.472345 32.440247,-86.47216 32.440338,-86.472131 32.440365)\r\n101;119;odd;Country Club Dr;Autauga;AL;36067;LINESTRING(-86.474775 32.441387,-86.474578 32.441301,-86.474279 32.441162,-86.474128 32.441096,-86.47366 32.440912,-86.472894 32.440581,-86.472521 32.440442,-86.472399 32.440439,-86.472274 32.440488,-86.472251 32.440495)\r\n216;298;even;Hickory Ln;Autauga;AL;36066;LINESTRING(-86.446266 32.476605,-86.446123 32.476645,-86.445884 32.476701,-86.445724 32.476726,-86.445474 32.476749,-86.444966 32.476777,-86.444676 32.476788)\r\n217;299;odd;Hickory Ln;Autauga;AL;36066;LINESTRING(-86.446331 32.476761,-86.446183 32.476807,-86.44593 32.476869,-86.445752 32.476894,-86.44549 32.476915,-86.444976 32.476943,-86.444684 32.476952)\r\n2998;3096;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.702419 32.591368,-86.703333 32.592166,-86.704941 32.593571,-86.70547 32.594044,-86.705811 32.594368,-86.706142 32.594698,-86.706354 32.594923,-86.706562 32.595153,-86.706861 32.595503,-86.707053 32.595738,-86.707523 32.596341,-86.707665 32.596534,-86.70767 32.596541)\r\n3001;3099;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.702559 32.591253,-86.703473 32.592052,-86.705083 32.593457,-86.705616 32.593932,-86.705961 32.594258,-86.706294 32.594592,-86.70651 32.594821,-86.70672 32.595053,-86.707021 32.595407,-86.707217 32.595644,-86.707691 32.596251,-86.707831 32.596448,-86.707837 32.596456)\r\n1844;1824;even;Edinburgh St;Autauga;AL;36066;LINESTRING(-86.424377 32.476745,-86.424373 32.477092,-86.42436 32.477813,-86.424353 32.477959,-86.424343 32.478189,-86.42438 32.478291,-86.424487 32.478376,-86.424694 32.478414,-86.424881 32.478405,-86.425395 32.478377)\r\n1899;1827;odd;Edinburgh St;Autauga;AL;36066;LINESTRING(-86.424571 32.476746,-86.424569 32.477094,-86.424556 32.477817,-86.424551 32.477961,-86.424563 32.478157,-86.424578 32.478183,-86.424601 32.4782,-86.42472 32.478232,-86.424873 32.478237,-86.425384 32.478213)\r\n2000;2098;even;Eh Hunt Rd;Autauga;AL;36022;LINESTRING(-86.418831 32.591273,-86.418812 32.591838,-86.418803 32.592323,-86.418824 32.592809,-86.418812 32.593425,-86.4188 32.593476,-86.418809 32.59348)\r\n2099;2001;odd;Eh Hunt Rd;Autauga;AL;36022;LINESTRING(-86.419025 32.591278,-86.419008 32.591842,-86.418999 32.592321,-86.419022 32.592807,-86.419018 32.593437,-86.41901 32.59352,-86.418991 32.593539)\r\n2100;2198;all;Autauga County 32;Autauga;AL;36051;LINESTRING(-86.584673 32.688268,-86.584769 32.688279,-86.585112 32.688284,-86.585619 32.688278,-86.585942 32.688288,-86.586278 32.688308,-86.586358 32.688317,-86.586519 32.688342,-86.586765 32.688395,-86.586853 32.688407,-86.587083 32.688419)\r\n1789;1753;all;Windermere Ave;Autauga;AL;36066;LINESTRING(-86.42231 32.475904,-86.422501 32.475882,-86.422623 32.475873)\r\n223;113;all;S Pickett St;Autauga;AL;36003;LINESTRING(-86.651209 32.43134,-86.651903 32.432242)\r\n899;847;all;Stonewall Dr;Autauga;AL;36067;LINESTRING(-86.444893 32.453026,-86.445011 32.452945,-86.44535 32.452722,-86.445751 32.452448)\r\n1510;1520;all;Indian Hills Rd;Autauga;AL;36067;LINESTRING(-86.518066 32.462644,-86.518214 32.462762,-86.518229 32.462777,-86.518569 32.463019,-86.519641 32.463775,-86.519914 32.46396,-86.520201 32.464133,-86.520509 32.46428,-86.520893 32.464427)\r\n237;235;odd;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.512083 32.418028,-86.512066 32.418126,-86.512045 32.418229)\r\n298;240;even;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.512276 32.418047,-86.512266 32.418152,-86.512236 32.418261)\r\n700;798;even;Happy Trails Rd;Autauga;AL;36067;LINESTRING(-86.52209 32.543199,-86.52207 32.543349,-86.522186 32.543529,-86.522431 32.543691,-86.522664 32.543837,-86.522869 32.543982,-86.523074 32.544106,-86.523283 32.544103,-86.5234 32.544094,-86.523627 32.54412,-86.523981 32.544173,-86.52416 32.54421,-86.524359 32.544231,-86.524616 32.544297,-86.525282 32.544458,-86.525402 32.544485,-86.525539 32.544503,-86.525733 32.544523,-86.525871 32.544553,-86.526805 32.544901)\r\n737;799;odd;Happy Trails Rd;Autauga;AL;36067;LINESTRING(-86.522285 32.543204,-86.522296 32.543303,-86.522362 32.543407,-86.522555 32.543559,-86.522786 32.543705,-86.522989 32.543842,-86.523148 32.543916,-86.523281 32.543937,-86.523404 32.543928,-86.523657 32.543954,-86.524021 32.544007,-86.524194 32.544038,-86.524405 32.544055,-86.524674 32.544137,-86.525334 32.544296,-86.525442 32.544317,-86.525565 32.544335,-86.525767 32.544351,-86.525939 32.544383,-86.526885 32.544751)\r\n3199;3101;odd;Autauga County 78;Autauga;AL;36003;LINESTRING(-86.709898 32.435952,-86.709763 32.435957,-86.708894 32.435978,-86.708489 32.435985,-86.706511 32.436017,-86.704585 32.436046,-86.703726 32.436046,-86.702867 32.436064,-86.702437 32.43606,-86.701574 32.436075,-86.701507 32.436076)\r\n3198;3100;even;Autauga County 78;Autauga;AL;36003;LINESTRING(-86.709908 32.436116,-86.709771 32.436123,-86.708898 32.436144,-86.708493 32.436149,-86.706515 32.436181,-86.704587 32.436212,-86.703728 32.436212,-86.702869 32.43623,-86.702437 32.436226,-86.701578 32.436241,-86.701509 32.436241)\r\n100;198;even;Auburn Rd;Autauga;AL;36067;LINESTRING(-86.46132 32.487201,-86.461659 32.487205,-86.461756 32.487201,-86.462013 32.487139,-86.462173 32.487091,-86.462324 32.487062,-86.462566 32.487047,-86.463072 32.48705,-86.463149 32.487056,-86.463223 32.487066,-86.463238 32.487064)\r\n101;199;odd;Auburn Rd;Autauga;AL;36067;LINESTRING(-86.46132 32.487037,-86.461651 32.487033,-86.46172 32.487025,-86.461953 32.486975,-86.462113 32.486925,-86.462294 32.486884,-86.462562 32.486879,-86.463078 32.486882,-86.463173 32.486884,-86.463249 32.486896,-86.463255 32.4869)\r\n700;798;even;Belle Maison;Autauga;AL;36067;LINESTRING(-86.487172 32.492901,-86.487762 32.493374,-86.488077 32.493615,-86.488152 32.493676)\r\n701;799;odd;Belle Maison;Autauga;AL;36067;LINESTRING(-86.487306 32.492781,-86.487896 32.493252,-86.488213 32.493493,-86.488289 32.493559)\r\n1948;1998;even;Tara Dr;Autauga;AL;36066;LINESTRING(-86.412094 32.452981,-86.412008 32.45297,-86.411852 32.452954,-86.41184 32.45296)\r\n1947;1999;odd;Tara Dr;Autauga;AL;36066;LINESTRING(-86.412071 32.453144,-86.41199 32.453138,-86.411812 32.453134,-86.411782 32.453117)\r\n4199;4053;odd;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.863393 32.595312,-86.863248 32.595308,-86.861628 32.595367,-86.861293 32.595372,-86.861046 32.595357,-86.860798 32.595325,-86.860555 32.595277,-86.860314 32.595215,-86.860241 32.595191,-86.860013 32.595103,-86.859794 32.595,-86.859584 32.594886,-86.859102 32.594589,-86.858084 32.593944,-86.857664 32.593689,-86.857366 32.593539,-86.856984 32.593365,-86.856669 32.593245,-86.855081 32.592698,-86.854039 32.592345,-86.853789 32.592275,-86.853618 32.592239,-86.853528 32.592225,-86.853354 32.592207,-86.853177 32.592197,-86.852999 32.592201,-86.852823 32.592215,-86.852649 32.592242,-86.852478 32.592277,-86.852306 32.592321,-86.852065 32.592412,-86.851909 32.592475,-86.849467 32.593521,-86.848702 32.593857,-86.848398 32.593995,-86.848025 32.594183,-86.847589 32.594419,-86.845475 32.595678,-86.844771 32.596092,-86.844629 32.59617,-86.844412 32.59628,-86.844189 32.596383,-86.843962 32.596476,-86.843728 32.596561,-86.84261 32.59692,-86.841812 32.597169,-86.840877 32.597466)\r\n4198;4052;even;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.863387 32.595477,-86.86325 32.595474,-86.861634 32.595533,-86.861289 32.59554,-86.861024 32.595527,-86.86076 32.595491,-86.860503 32.595443,-86.86025 32.595375,-86.860163 32.595349,-86.859921 32.595255,-86.85969 32.595146,-86.85947 32.595026,-86.858986 32.594721,-86.857968 32.594078,-86.857554 32.593831,-86.857268 32.593685,-86.856894 32.593517,-86.856591 32.593399,-86.855007 32.592852,-86.853971 32.592505,-86.853733 32.592439,-86.853576 32.592405,-86.853498 32.592393,-86.853334 32.592375,-86.853173 32.592365,-86.853013 32.592371,-86.852851 32.592385,-86.852691 32.592408,-86.852532 32.592441,-86.852378 32.592483,-86.852147 32.592564,-86.851997 32.592625,-86.849557 32.593669,-86.848794 32.594003,-86.848496 32.594141,-86.848129 32.594325,-86.847701 32.594559,-86.845587 32.595814,-86.844881 32.59623,-86.844735 32.596312,-86.844512 32.596426,-86.844281 32.596533,-86.844044 32.596628,-86.843804 32.596717,-86.842678 32.597074,-86.84188 32.597323,-86.840945 32.59762)\r\n101;199;odd;David Dr;Autauga;AL;36022;LINESTRING(-86.470045 32.608717,-86.469928 32.60885,-86.469668 32.609094,-86.469496 32.60925)\r\n100;198;even;David Dr;Autauga;AL;36022;LINESTRING(-86.470205 32.608811,-86.47009 32.60896,-86.46981 32.609206,-86.469639 32.609362)\r\n1698;1600;even;Braves Pl;Autauga;AL;36067;LINESTRING(-86.414912 32.428418,-86.415173 32.428164,-86.415193 32.428142)\r\n1399;1301;odd;Braves Pl;Autauga;AL;36067;LINESTRING(-86.414764 32.428312,-86.415023 32.428042,-86.415063 32.428019)\r\n503;505;all;Cook Rd;Autauga;AL;36067;LINESTRING(-86.485894 32.454058,-86.485747 32.453963,-86.485687 32.453908,-86.485568 32.45382,-86.485438 32.453745,-86.485443 32.453743)\r\n403;215;odd;State Rte 14 E;Autauga;AL;36066;LINESTRING(-86.449289 32.468633,-86.449329 32.468574,-86.449647 32.46805)\r\n404;300;even;State Rte 14 E;Autauga;AL;36066;LINESTRING(-86.449119 32.468554,-86.449155 32.468496,-86.449474 32.467975)\r\n100;326;all;Autauga County 4;Autauga;AL;36067;LINESTRING(-86.468852 32.430964,-86.468829 32.430957,-86.468781 32.430955)\r\n1100;1198;even;Autauga County 119;Autauga;AL;36067;LINESTRING(-86.72805 32.50334,-86.72805 32.503401,-86.72805 32.50361,-86.728018 32.504702,-86.72802 32.504926,-86.728037 32.505078,-86.728094 32.505299,-86.728218 32.505642,-86.728272 32.505848,-86.728348 32.506274,-86.728457 32.506699,-86.72855 32.507055,-86.728601 32.507198,-86.728665 32.507338,-86.728736 32.507477,-86.728866 32.50767,-86.729144 32.508039,-86.729268 32.508223,-86.729297 32.508279,-86.729398 32.508547,-86.729462 32.508689,-86.729542 32.508824,-86.7298 32.5092,-86.729868 32.509323,-86.729893 32.509382,-86.72991 32.509445,-86.729919 32.509511,-86.729953 32.510158,-86.729974 32.510378,-86.730016 32.510599,-86.730168 32.51131,-86.730285 32.512022,-86.730305 32.512232,-86.730313 32.512599,-86.730341 32.512748,-86.730402 32.512962,-86.730427 32.513096,-86.730435 32.51316,-86.73043 32.513224,-86.730422 32.51329,-86.730353 32.513646,-86.730317 32.513935,-86.730239 32.51444,-86.730218 32.514659,-86.730199 32.515092,-86.730174 32.515884,-86.730152 32.516247,-86.730143 32.516468,-86.730149 32.516551,-86.730168 32.516629,-86.730191 32.516706,-86.730222 32.51678,-86.730291 32.516918,-86.730406 32.517121,-86.730456 32.517188,-86.730557 32.517314,-86.730674 32.517431,-86.730742 32.517486,-86.730938 32.517629,-86.731051 32.517728,-86.731097 32.517776,-86.731137 32.51783,-86.731173 32.517888,-86.731202 32.517949,-86.731253 32.51808,-86.731294 32.518216,-86.731343 32.518427,-86.731389 32.518712,-86.731407 32.518996,-86.731406 32.519282,-86.731392 32.519494,-86.731371 32.519632,-86.731291 32.519984,-86.731018 32.521192,-86.730899 32.521686,-86.730858 32.52182,-86.73078 32.522019,-86.730571 32.522418,-86.730547 32.5225,-86.730535 32.522586,-86.730535 32.522676,-86.730566 32.522765,-86.730617 32.522841,-86.730839 32.523095)\r\n1141;1199;odd;Autauga County 119;Autauga;AL;36067;LINESTRING(-86.728244 32.503335,-86.728248 32.503399,-86.728248 32.503612,-86.728214 32.504702,-86.728222 32.504916,-86.728239 32.505052,-86.72829 32.505255,-86.728414 32.505598,-86.72847 32.505818,-86.728546 32.506244,-86.728649 32.506663,-86.728744 32.507011,-86.728791 32.507144,-86.728849 32.507274,-86.728918 32.507399,-86.729038 32.507584,-86.729314 32.507951,-86.72945 32.508143,-86.729491 32.508217,-86.729588 32.508491,-86.729648 32.508619,-86.72972 32.508744,-86.729978 32.50912,-86.730062 32.509257,-86.730089 32.509338,-86.730108 32.509415,-86.730123 32.509495,-86.730151 32.510148,-86.730174 32.510358,-86.73021 32.510571,-86.730364 32.511284,-86.730485 32.512004,-86.730505 32.512224,-86.730519 32.512583,-86.730541 32.512716,-86.7306 32.512928,-86.730631 32.513078,-86.730631 32.513158,-86.730632 32.513236,-86.73062 32.513314,-86.730551 32.51367,-86.730511 32.513955,-86.730437 32.514458,-86.730416 32.514669,-86.730395 32.515098,-86.73037 32.51589,-86.730348 32.516253,-86.730343 32.516464,-86.730351 32.516527,-86.730364 32.516591,-86.730385 32.516656,-86.73041 32.51672,-86.730473 32.516848,-86.730584 32.517039,-86.730624 32.517096,-86.730719 32.51721,-86.730824 32.517315,-86.730878 32.517362,-86.731074 32.517505,-86.731207 32.517612,-86.731265 32.517678,-86.731315 32.517746,-86.731355 32.517818,-86.731392 32.517889,-86.731447 32.518034,-86.731488 32.51818,-86.731539 32.518399,-86.731591 32.518696,-86.731607 32.518992,-86.731606 32.519286,-86.731592 32.51951,-86.731571 32.51966,-86.731483 32.520016,-86.73121 32.521224,-86.731093 32.521722,-86.731052 32.521868,-86.73097 32.522081,-86.730769 32.522476,-86.730749 32.522534,-86.730737 32.522592,-86.730747 32.522646,-86.730764 32.522697,-86.730793 32.522749,-86.730997 32.522999)\r\n800;906;even;Doster Rd;Autauga;AL;36067;LINESTRING(-86.460023 32.438587,-86.459931 32.438525,-86.459771 32.438452,-86.459605 32.438394,-86.459436 32.438346,-86.45926 32.438313,-86.459082 32.438296,-86.458906 32.43829,-86.458558 32.438291,-86.45246 32.438489,-86.452417 32.438498)\r\n809;999;odd;Doster Rd;Autauga;AL;36067;LINESTRING(-86.45991 32.438721,-86.459821 32.438673,-86.459683 32.438608,-86.459535 32.438554,-86.459382 32.438512,-86.459226 32.438483,-86.459066 32.438466,-86.458902 32.438458,-86.458562 32.438459,-86.452478 32.438661,-86.452444 32.438661)\r\n2132;2144;even;Autauga County 61;Autauga;AL;36067;LINESTRING(-86.498135 32.580918,-86.497722 32.581008,-86.497221 32.581113,-86.496722 32.581237,-86.496632 32.581264)\r\n2145;2147;odd;Autauga County 61;Autauga;AL;36067;LINESTRING(-86.498184 32.581078,-86.49777 32.581168,-86.497273 32.581275,-86.496782 32.581397,-86.496693 32.58142)\r\n199;101;all;Lost Creek Loop;Autauga;AL;36067;LINESTRING(-86.471306 32.452356,-86.472449 32.452304)\r\n1754;1798;all;US Hwy 31;Autauga;AL;36066;LINESTRING(-86.460911 32.55909,-86.46105 32.559399,-86.461226 32.559808,-86.461539 32.560635,-86.46186 32.561558)\r\n4426;4484;all;Autauga County 88;Autauga;AL;36749;LINESTRING(-86.890179 32.544887,-86.891094 32.545415,-86.891318 32.545531,-86.891477 32.545601,-86.891642 32.545658,-86.891971 32.545747,-86.892461 32.545878,-86.892631 32.545917,-86.892888 32.545959,-86.893063 32.54598,-86.89324 32.545992,-86.89342 32.545994,-86.893599 32.545975,-86.893952 32.545907)\r\n385;301;odd;W 6th St;Autauga;AL;36067;LINESTRING(-86.480839 32.46632,-86.47984 32.466247,-86.479526 32.466216,-86.479149 32.466205,-86.478808 32.466178,-86.478294 32.466144,-86.478162 32.466134)\r\n398;300;even;W 6th St;Autauga;AL;36067;LINESTRING(-86.480822 32.466484,-86.47982 32.466413,-86.479512 32.466386,-86.479135 32.466373,-86.47879 32.466344,-86.478276 32.46631,-86.478142 32.466297)\r\n399;301;all;Kinling Ridge Rd;Autauga;AL;36022;LINESTRING(-86.426722 32.612058,-86.426777 32.612051,-86.42695 32.612086,-86.427169 32.612144,-86.427267 32.612296,-86.427332 32.612368,-86.427413 32.612439,-86.427524 32.61251,-86.42763 32.612556,-86.427806 32.612605,-86.427983 32.612631,-86.428202 32.61265,-86.428423 32.612661,-86.428465 32.612644,-86.428906 32.612693,-86.431352 32.612854)\r\n2713;2701;odd;Dutch Bend St;Autauga;AL;36003;LINESTRING(-86.660125 32.433289,-86.659505 32.433632,-86.659122 32.433854)\r\n2710;2700;even;Dutch Bend St;Autauga;AL;36003;LINESTRING(-86.660231 32.433427,-86.659615 32.43377,-86.659231 32.43399)\r\n101;199;odd;Holly Ln;Autauga;AL;36066;LINESTRING(-86.446313 32.479634,-86.446083 32.479023,-86.445962 32.478675,-86.445908 32.478523,-86.445756 32.478318,-86.445596 32.478209,-86.445327 32.47812,-86.445049 32.47811,-86.444872 32.478112,-86.444699 32.478117)\r\n116;2;even;Holly Ln;Autauga;AL;36066;LINESTRING(-86.446128 32.479685,-86.445895 32.479073,-86.445772 32.478727,-86.445714 32.478603,-86.44559 32.478444,-86.445484 32.478371,-86.445277 32.478302,-86.445041 32.47828,-86.444874 32.478278,-86.444704 32.478281)\r\n1600;1614;even;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.430144 32.536409,-86.43027 32.536473,-86.430655 32.536652,-86.431225 32.536832,-86.431398 32.536873,-86.431649 32.536921,-86.431902 32.536961,-86.432076 32.536985,-86.43225 32.536998,-86.432594 32.537012,-86.432946 32.537013)\r\n1601;1617;odd;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.430242 32.536267,-86.430366 32.536327,-86.430741 32.536492,-86.431289 32.53667,-86.431448 32.536709,-86.431689 32.536757,-86.431936 32.536797,-86.4321 32.536817,-86.432264 32.53683,-86.4326 32.536844,-86.432948 32.536849)\r\n2599;2201;odd;Stoudmire Rd;Autauga;AL;36003;LINESTRING(-86.653092 32.428935,-86.653086 32.428937,-86.652526 32.429257,-86.652173 32.429478,-86.652054 32.429555)\r\n2598;2500;even;Stoudmire Rd;Autauga;AL;36003;LINESTRING(-86.653197 32.429074,-86.653194 32.429077,-86.65264 32.429395,-86.652291 32.42961,-86.652172 32.429686)\r\n327;331;all;Autauga County 4;Autauga;AL;36067;LINESTRING(-86.468199 32.431042,-86.467804 32.430952,-86.467483 32.430857,-86.467444 32.430835)\r\n1286;1382;even;S McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.418143 32.442881,-86.418143 32.442874,-86.41814 32.442637,-86.418139 32.442438,-86.418115 32.441555,-86.418112 32.441437,-86.4181 32.440915,-86.4181 32.440447)\r\n1801;1899;odd;S McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.417949 32.442882,-86.417949 32.442876,-86.417946 32.442639,-86.417943 32.44244,-86.417921 32.441559,-86.417918 32.441441,-86.417904 32.440917,-86.417906 32.440446)\r\n1654;1600;all;Hawthorne St;Autauga;AL;36066;LINESTRING(-86.422674 32.472015,-86.422691 32.471971,-86.422738 32.471895,-86.422805 32.47183,-86.422939 32.471726,-86.422995 32.471692)\r\n501;699;odd;Cora Dr;Autauga;AL;36067;LINESTRING(-86.545378 32.549491,-86.545198 32.549498,-86.544882 32.549499,-86.544565 32.549495,-86.544227 32.54951,-86.544041 32.549529,-86.543952 32.549517,-86.543884 32.549493,-86.543811 32.549447,-86.543733 32.549376,-86.543656 32.549148,-86.543486 32.549054,-86.543229 32.549081,-86.542772 32.54909,-86.542561 32.549091)\r\n500;698;even;Cora Dr;Autauga;AL;36067;LINESTRING(-86.545391 32.549655,-86.545204 32.549668,-86.54488 32.549663,-86.544569 32.549663,-86.544243 32.549678,-86.544039 32.549693,-86.543924 32.549685,-86.543768 32.549677,-86.543671 32.549573,-86.543529 32.549488,-86.543454 32.549268,-86.543426 32.549242,-86.543241 32.549251,-86.542774 32.549256,-86.542561 32.549255)\r\n420;422;even;Reynolds Mill Rd;Autauga;AL;36067;LINESTRING(-86.463372 32.425417,-86.462877 32.425396,-86.462739 32.425393)\r\n421;431;odd;Reynolds Mill Rd;Autauga;AL;36067;LINESTRING(-86.463363 32.425581,-86.462869 32.425562,-86.462733 32.425558)\r\n100;198;even;Linda Ln;Autauga;AL;36067;LINESTRING(-86.464581 32.441562,-86.464459 32.44155,-86.464041 32.441489,-86.463856 32.441473,-86.463677 32.441481,-86.463427 32.441479,-86.463078 32.441472,-86.463006 32.441463,-86.462944 32.441446,-86.462892 32.441421,-86.46285 32.441387,-86.462816 32.441344,-86.462797 32.441296,-86.46278 32.441242,-86.462793 32.441188,-86.462806 32.441128,-86.462831 32.441064,-86.462861 32.441002,-86.462896 32.440947,-86.462984 32.440839,-86.463032 32.440795,-86.463087 32.44076,-86.463146 32.44073,-86.463214 32.440708,-86.463281 32.440694,-86.463354 32.440685,-86.46352 32.440678,-86.463959 32.440692,-86.464058 32.440681,-86.464152 32.44066,-86.464236 32.440637,-86.464476 32.440595,-86.464604 32.440585)\r\n101;199;odd;Linda Ln;Autauga;AL;36067;LINESTRING(-86.464566 32.441726,-86.464433 32.441722,-86.464013 32.441657,-86.46385 32.441643,-86.463679 32.441647,-86.463425 32.441643,-86.463066 32.441644,-86.462966 32.441637,-86.462862 32.441614,-86.462764 32.441569,-86.462682 32.441503,-86.462624 32.441424,-86.462585 32.441336,-86.462584 32.441244,-86.462585 32.441158,-86.462614 32.44108,-86.462643 32.441006,-86.462677 32.440932,-86.462718 32.440859,-86.462822 32.440729,-86.462892 32.440667,-86.462969 32.440612,-86.463058 32.440572,-86.46315 32.44054,-86.463247 32.44052,-86.463342 32.440515,-86.46352 32.440514,-86.463947 32.44052,-86.46402 32.440511,-86.464096 32.440496,-86.46418 32.440471,-86.46445 32.440417,-86.464598 32.44042)\r\n3636;3686;all;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.792879 32.590167,-86.792888 32.590259,-86.792866 32.590471,-86.79251 32.592843,-86.792484 32.593065,-86.792463 32.59336,-86.792465 32.593652,-86.792486 32.593946,-86.792529 32.594237,-86.792584 32.594524,-86.792859 32.595808,-86.793018 32.59652,-86.793061 32.596664,-86.793107 32.596809,-86.793126 32.596849)\r\n2018;2098;all;Wood Valley Ridge;Autauga;AL;36066;LINESTRING(-86.452666 32.511587,-86.452667 32.511573,-86.452678 32.511475,-86.452683 32.511369,-86.452633 32.511196,-86.45258 32.511103,-86.452489 32.511025,-86.452362 32.510991,-86.452233 32.510987,-86.452107 32.510974,-86.451979 32.510964,-86.451773 32.510927,-86.451688 32.510895,-86.451603 32.510844,-86.45152 32.510778,-86.451437 32.510699,-86.451358 32.510615,-86.451284 32.510526,-86.451213 32.510431,-86.45115 32.510331,-86.451099 32.510225,-86.451058 32.510112,-86.451031 32.509992,-86.451013 32.509866,-86.450989 32.509603,-86.450982 32.509471,-86.45098 32.509199,-86.450979 32.509061,-86.450944 32.508788,-86.450912 32.508652,-86.450828 32.508393,-86.450776 32.508267,-86.450725 32.508141,-86.450669 32.508018,-86.450609 32.507896,-86.450543 32.507776,-86.450335 32.507441,-86.450278 32.507331,-86.450231 32.507218,-86.450192 32.507102,-86.450163 32.506985,-86.450145 32.506866,-86.450138 32.506741,-86.450136 32.506611,-86.450138 32.506481,-86.450142 32.506349,-86.450149 32.506219,-86.45016 32.506095,-86.450174 32.505971,-86.450194 32.505866,-86.450218 32.505767,-86.450247 32.505683,-86.450276 32.50561,-86.450306 32.505545,-86.450325 32.505503)\r\n105;101;odd;Mobile Dr;Autauga;AL;36067;LINESTRING(-86.463556 32.452132,-86.463614 32.452112,-86.46409 32.45195,-86.464343 32.451859)\r\n106;100;even;Mobile Dr;Autauga;AL;36067;LINESTRING(-86.463476 32.451982,-86.463536 32.451958,-86.464016 32.451796,-86.464268 32.451707)\r\n398;300;all;W 5th St;Autauga;AL;36067;LINESTRING(-86.479955 32.464851,-86.479576 32.464825,-86.478324 32.464739)\r\n112;198;even;Abney Dr;Autauga;AL;36067;LINESTRING(-86.453256 32.448548,-86.453153 32.448472,-86.453101 32.448425,-86.453057 32.448377,-86.453022 32.448323,-86.452998 32.448266,-86.45298 32.448204,-86.452972 32.44814,-86.452973 32.448076,-86.452985 32.448014,-86.453005 32.447956,-86.453037 32.447904,-86.453238 32.44767)\r\n111;199;odd;Abney Dr;Autauga;AL;36067;LINESTRING(-86.453131 32.448674,-86.453019 32.448598,-86.452945 32.448543,-86.452883 32.448473,-86.452832 32.448397,-86.452796 32.448314,-86.45278 32.44823,-86.452768 32.448148,-86.452769 32.448064,-86.452779 32.447976,-86.452811 32.447892,-86.452855 32.44781,-86.453084 32.44757)\r\n799;701;odd;Redman Ln;Autauga;AL;36067;LINESTRING(-86.460566 32.446469,-86.460564 32.4466)\r\n780;700;even;Redman Ln;Autauga;AL;36067;LINESTRING(-86.46076 32.446472,-86.460758 32.446603)\r\n500;598;even;Honeybee Ct;Autauga;AL;36067;LINESTRING(-86.485432 32.479577,-86.485015 32.479549)\r\n501;599;odd;Honeybee Ct;Autauga;AL;36067;LINESTRING(-86.485417 32.479741,-86.485 32.479713)\r\n1299;1101;odd;State Rte 14 E;Autauga;AL;36066;LINESTRING(-86.43617 32.480202,-86.436211 32.480177,-86.43641 32.480036,-86.436599 32.479888,-86.437154 32.47944,-86.437775 32.478949,-86.438559 32.478308)\r\n1298;1100;even;State Rte 14 E;Autauga;AL;36066;LINESTRING(-86.436051 32.480072,-86.436087 32.480047,-86.436278 32.47991,-86.436465 32.479766,-86.43702 32.47932,-86.437639 32.478829,-86.438424 32.478189)\r\n512;698;even;Cook Rd;Autauga;AL;36067;LINESTRING(-86.483538 32.451772,-86.483543 32.451763,-86.483526 32.451709,-86.483515 32.451628,-86.483513 32.451539,-86.483513 32.451439,-86.483494 32.451392,-86.483491 32.451338,-86.483444 32.451271,-86.483372 32.451177,-86.483295 32.451094,-86.483176 32.450987,-86.482918 32.450819,-86.482603 32.450606,-86.482485 32.450548)\r\n747;799;odd;Cook Rd;Autauga;AL;36067;LINESTRING(-86.483361 32.45184,-86.483343 32.451823,-86.483318 32.451737,-86.483313 32.451634,-86.483315 32.451543,-86.483305 32.451463,-86.483302 32.451428,-86.483285 32.4514,-86.483266 32.451357,-86.483206 32.451277,-86.483141 32.451208,-86.483036 32.451117,-86.482796 32.450949,-86.482485 32.450748,-86.482381 32.450687)\r\n101;299;all;Lamar Estates Rd;Autauga;AL;36703;LINESTRING(-86.853989 32.469826,-86.853985 32.469839,-86.85349 32.47059,-86.853418 32.470716,-86.85336 32.470843,-86.85332 32.470975,-86.8533 32.47111,-86.853302 32.471247,-86.853337 32.471533,-86.853365 32.471674,-86.853441 32.471962,-86.853494 32.472259,-86.853489 32.472416,-86.85347 32.472644,-86.853432 32.472802,-86.85339 32.472884,-86.853287 32.473021,-86.853147 32.473132,-86.853002 32.473216,-86.852752 32.473401,-86.852647 32.473504,-86.852445 32.473745,-86.852328 32.473862,-86.852195 32.473961,-86.851771 32.474282,-86.851687 32.474351,-86.851576 32.474453,-86.851535 32.474505,-86.851469 32.47462,-86.851429 32.474745,-86.851417 32.47481,-86.851402 32.474952,-86.851382 32.475312,-86.851382 32.4756,-86.851395 32.475739,-86.85142 32.47588,-86.851524 32.47631,-86.851619 32.476737,-86.851666 32.476868,-86.851733 32.47699,-86.851818 32.477104,-86.85192 32.477214,-86.852096 32.477375,-86.852214 32.477495,-86.852298 32.477637,-86.852358 32.477783,-86.852408 32.477927,-86.852427 32.478009,-86.852423 32.478023)\r\n100;198;even;Industrial Park Rd;Autauga;AL;36067;LINESTRING(-86.464804 32.430836,-86.464586 32.430846,-86.463646 32.430915,-86.463586 32.430893,-86.463565 32.430892,-86.463521 32.430844,-86.463131 32.430291,-86.463002 32.430092,-86.462964 32.430021,-86.462955 32.430014,-86.462976 32.429978,-86.463518 32.429342,-86.463865 32.428924)\r\n901;999;odd;Industrial Park Rd;Autauga;AL;36067;LINESTRING(-86.464815 32.431,-86.4646 32.431012,-86.463644 32.431081,-86.463476 32.431081,-86.463409 32.431006,-86.463351 32.43094,-86.462959 32.430373,-86.46283 32.430178,-86.462746 32.430087,-86.462737 32.429974,-86.462808 32.429884,-86.463358 32.429246,-86.463706 32.428829)\r\n2401;2405;all;Big Springs Church Rd;Autauga;AL;36006;LINESTRING(-86.716747 32.650287,-86.716735 32.650385,-86.7167 32.650532,-86.716637 32.65075,-86.716312 32.651676,-86.71628 32.65174)\r\n992;998;all;Fireside Dr;Autauga;AL;36067;LINESTRING(-86.480241 32.452262,-86.478623 32.452271)\r\n1637;1647;all;Autauga County 79;Autauga;AL;36006;LINESTRING(-86.713249 32.57028,-86.713258 32.570584,-86.713246 32.570737,-86.713214 32.570887,-86.713191 32.570967,-86.7131 32.571151)\r\n1590;1582;all;Autauga County 50;Autauga;AL;36067;LINESTRING(-86.555002 32.404994,-86.55462 32.405001)\r\n3649;3601;odd;Autauga County 44;Autauga;AL;36003;LINESTRING(-86.787333 32.504935,-86.787038 32.504966,-86.786634 32.505026,-86.784853 32.505257,-86.784511 32.505307,-86.78417 32.505364,-86.783832 32.505438,-86.783497 32.505521,-86.783005 32.505662,-86.782679 32.505769,-86.782361 32.505887,-86.781417 32.506245)\r\n3698;3600;even;Autauga County 44;Autauga;AL;36003;LINESTRING(-86.787358 32.505098,-86.787068 32.505132,-86.786666 32.50519,-86.784885 32.505421,-86.784547 32.505471,-86.784214 32.505528,-86.783884 32.5056,-86.783557 32.505681,-86.783073 32.50582,-86.782755 32.505925,-86.782439 32.506039,-86.781497 32.506396)\r\n399;397;odd;N Autauga St;Autauga;AL;36003;LINESTRING(-86.649996 32.427268,-86.649999 32.42728,-86.650619 32.428075,-86.650688 32.428168)\r\n398;344;even;N Autauga St;Autauga;AL;36003;LINESTRING(-86.650167 32.42719,-86.650173 32.427192,-86.650785 32.427985,-86.650854 32.428082)\r\n2006;2036;all;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.504458 32.570394,-86.504672 32.571563,-86.504706 32.571777,-86.504743 32.572064,-86.504755 32.572205,-86.504761 32.5723)\r\n1501;1599;odd;Monfee Ct;Autauga;AL;36067;LINESTRING(-86.503734 32.510844,-86.503721 32.509176)\r\n1300;1398;even;Monfee Ct;Autauga;AL;36067;LINESTRING(-86.50354 32.510845,-86.503527 32.509177)\r\n998;900;even;J-M Ln;Autauga;AL;36067;LINESTRING(-86.564222 32.554919,-86.564179 32.555612,-86.564155 32.555798,-86.564125 32.55593,-86.564081 32.556055,-86.563994 32.556248)\r\n999;901;odd;J-M Ln;Autauga;AL;36067;LINESTRING(-86.564417 32.554927,-86.564377 32.555624,-86.564359 32.555824,-86.564321 32.55597,-86.564275 32.556111,-86.564174 32.55631)\r\n1028;1036;even;Loren St;Autauga;AL;36067;LINESTRING(-86.462838 32.426827,-86.462824 32.426723)\r\n1029;1037;odd;Loren St;Autauga;AL;36067;LINESTRING(-86.462644 32.426845,-86.46263 32.426741)\r\n1446;1450;all;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.413383 32.530344,-86.413387 32.530352,-86.413445 32.530435)\r\n1800;1898;even;Coventry Ct;Autauga;AL;36066;LINESTRING(-86.41944 32.466179,-86.419378 32.46618,-86.419133 32.466173,-86.419113 32.466177)\r\n1801;1899;odd;Coventry Ct;Autauga;AL;36066;LINESTRING(-86.419449 32.466344,-86.419382 32.466348,-86.419111 32.466351,-86.419075 32.466338)\r\n1584;1598;even;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.654331 32.598605,-86.655075 32.598964,-86.655728 32.599311,-86.655885 32.599384,-86.656051 32.599448,-86.656141 32.599469,-86.656315 32.599506,-86.656405 32.599515,-86.656748 32.599539,-86.658375 32.599585,-86.658878 32.599629,-86.659124 32.599665,-86.659281 32.5997,-86.659346 32.599716)\r\n1575;1599;odd;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.654427 32.598462,-86.655177 32.59882,-86.65583 32.599165,-86.655975 32.59923,-86.656123 32.599284,-86.656195 32.599305,-86.656353 32.599336,-86.656427 32.599347,-86.65676 32.599371,-86.658389 32.599415,-86.658906 32.599461,-86.659166 32.599497,-86.659343 32.599536,-86.659414 32.599562)\r\n827;801;odd;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.48132 32.478899,-86.481329 32.4787,-86.481335 32.478484,-86.481336 32.478449,-86.481353 32.47811)\r\n898;800;even;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.481125 32.478893,-86.481133 32.478696,-86.481139 32.478478,-86.481142 32.478441,-86.481159 32.478103)\r\n216;298;even;Radburn Way;Autauga;AL;36066;LINESTRING(-86.441698 32.471792,-86.441534 32.471683,-86.441228 32.471524,-86.441039 32.471491,-86.440857 32.471481,-86.440597 32.471491,-86.440172 32.471478,-86.439913 32.47148,-86.439648 32.471489,-86.439336 32.471547)\r\n213;299;odd;Radburn Way;Autauga;AL;36066;LINESTRING(-86.441582 32.471924,-86.44142 32.471827,-86.441146 32.471698,-86.441005 32.471665,-86.440851 32.471649,-86.440597 32.471655,-86.44017 32.471644,-86.439919 32.471648,-86.439674 32.471663,-86.439374 32.471708)\r\n304;320;even;Festival Dr;Autauga;AL;36067;LINESTRING(-86.462195 32.44733,-86.462188 32.447329,-86.460503 32.447349,-86.460237 32.447355)\r\n305;321;odd;Festival Dr;Autauga;AL;36067;LINESTRING(-86.462187 32.447494,-86.462186 32.447495,-86.460507 32.447515,-86.460241 32.447519)\r\n2500;2510;all;Norrell St;Autauga;AL;36006;LINESTRING(-86.717404 32.659957,-86.717466 32.659995,-86.717491 32.660007)\r\n742;798;even;Rice St;Autauga;AL;36067;LINESTRING(-86.46598 32.44187,-86.465987 32.441542,-86.466024 32.440446)\r\n737;799;odd;Rice St;Autauga;AL;36067;LINESTRING(-86.465786 32.441867,-86.465791 32.441538,-86.46583 32.440441)\r\n200;298;even;S Court St;Autauga;AL;36067;LINESTRING(-86.475512 32.462185,-86.475564 32.461607)\r\n101;199;odd;S Court St;Autauga;AL;36067;LINESTRING(-86.475318 32.462173,-86.47537 32.461595)\r\n199;105;odd;Stakley Dr;Autauga;AL;36067;LINESTRING(-86.472098 32.445613,-86.472091 32.445185,-86.472081 32.445113)\r\n198;106;even;Stakley Dr;Autauga;AL;36067;LINESTRING(-86.471903 32.445616,-86.471891 32.445193,-86.471887 32.445127)\r\n600;698;all;Autauga County 165;Autauga;AL;36067;LINESTRING(-86.614827 32.465348,-86.614636 32.4654,-86.614305 32.465496,-86.61414 32.465554,-86.613821 32.465674,-86.613664 32.465741,-86.613355 32.46588,-86.613055 32.466035,-86.612908 32.466117,-86.612622 32.466287,-86.612348 32.46647,-86.612087 32.466668,-86.611838 32.466873,-86.611135 32.467511,-86.610781 32.467824,-86.610537 32.468025,-86.610287 32.468219,-86.610026 32.468403,-86.60988 32.4685)\r\n1918;1924;even;Calumet Pkwy;Autauga;AL;36066;LINESTRING(-86.415477 32.489633,-86.414787 32.489533)\r\n1919;1921;odd;Calumet Pkwy;Autauga;AL;36066;LINESTRING(-86.415444 32.489795,-86.414754 32.489695)\r\n398;300;all;Washington St;Autauga;AL;36003;LINESTRING(-86.658982 32.43645,-86.659046 32.436527)\r\n294;292;all;Michelle Dr;Autauga;AL;36067;LINESTRING(-86.518012 32.472962,-86.518471 32.472436)\r\n1124;1198;all;Pates Mill Ln;Autauga;AL;36067;LINESTRING(-86.503413 32.476662,-86.503449 32.476612,-86.50355 32.47649,-86.503613 32.476332,-86.503729 32.476152)\r\n745;741;odd;Glennbrooke Blvd;Autauga;AL;36066;LINESTRING(-86.425295 32.492464,-86.426023 32.492859,-86.426432 32.493065,-86.42672 32.493214)\r\n744;700;even;Glennbrooke Blvd;Autauga;AL;36066;LINESTRING(-86.425399 32.492325,-86.426127 32.492717,-86.426534 32.492923,-86.426822 32.493073)\r\n111;101;odd;Willow Oak Dr;Autauga;AL;36067;LINESTRING(-86.475063 32.474547,-86.475119 32.474445,-86.475313 32.474118,-86.475431 32.473912)\r\n110;104;even;Willow Oak Dr;Autauga;AL;36067;LINESTRING(-86.474885 32.47448,-86.474939 32.474373,-86.475137 32.474044,-86.475256 32.47384)\r\n674;656;all;2nd St;Autauga;AL;36703;LINESTRING(-86.794926 32.387659,-86.79458 32.389964)\r\n199;153;odd;Imogene St;Autauga;AL;36067;LINESTRING(-86.458548 32.452303,-86.458547 32.452032,-86.458543 32.451952,-86.458531 32.451876,-86.458513 32.451799,-86.458487 32.451722,-86.458422 32.451581,-86.458315 32.451377,-86.458092 32.451019)\r\n198;154;even;Imogene St;Autauga;AL;36067;LINESTRING(-86.458353 32.452304,-86.458349 32.452038,-86.458343 32.451968,-86.458333 32.451904,-86.458317 32.451839,-86.458295 32.451776,-86.458238 32.451645,-86.458135 32.451451,-86.457919 32.451094)\r\n200;298;even;Rainer St;Autauga;AL;36051;LINESTRING(-86.476047 32.70131,-86.476045 32.701375,-86.476025 32.70141,-86.476017 32.701418,-86.475849 32.701487,-86.475559 32.701553,-86.47531 32.701583,-86.475049 32.701598,-86.474844 32.701623,-86.474714 32.701692,-86.474607 32.701782)\r\n201;299;odd;Rainer St;Autauga;AL;36051;LINESTRING(-86.476242 32.701302,-86.476253 32.701389,-86.476237 32.701496,-86.476157 32.701578,-86.475915 32.701651,-86.475599 32.701725,-86.47533 32.701751,-86.475075 32.70177,-86.474924 32.701801,-86.47484 32.701838,-86.474737 32.701905)\r\n898;800;all;Summer Ln;Autauga;AL;36066;LINESTRING(-86.418941 32.453377,-86.418949 32.453401,-86.418949 32.453453,-86.418954 32.453555,-86.418959 32.453602,-86.418958 32.453655,-86.418957 32.453706,-86.41896 32.453747,-86.418964 32.453784,-86.418979 32.453864,-86.419001 32.453911,-86.419005 32.453941)\r\n612;620;all;Sunset Dr;Autauga;AL;36067;LINESTRING(-86.446399 32.449852,-86.4457 32.449869,-86.445662 32.44987)\r\n704;798;even;Windmill Dr;Autauga;AL;36067;LINESTRING(-86.489679 32.492469,-86.489793 32.492534,-86.489969 32.492659,-86.48997 32.492644)\r\n703;799;odd;Windmill Dr;Autauga;AL;36067;LINESTRING(-86.489782 32.492329,-86.489911 32.492392,-86.490129 32.492531,-86.490129 32.492549)\r\n698;600;even;Covered Bridge Pkwy;Autauga;AL;36066;LINESTRING(-86.414918 32.481339,-86.414909 32.480888,-86.414908 32.48075,-86.414895 32.480532,-86.414835 32.480126,-86.414853 32.479977,-86.414868 32.479914,-86.414914 32.479781,-86.414994 32.479591)\r\n699;653;odd;Covered Bridge Pkwy;Autauga;AL;36066;LINESTRING(-86.414723 32.481342,-86.414715 32.48089,-86.41471 32.480756,-86.414695 32.480546,-86.414637 32.48013,-86.414649 32.479953,-86.41467 32.47987,-86.414726 32.479727,-86.414811 32.479535)\r\n300;398;even;Russell Ln;Autauga;AL;36067;LINESTRING(-86.461451 32.467221,-86.461359 32.467349,-86.461315 32.467636,-86.461306 32.468084,-86.461284 32.468694,-86.461289 32.469124)\r\n301;399;odd;Russell Ln;Autauga;AL;36067;LINESTRING(-86.461624 32.467296,-86.461571 32.467407,-86.461521 32.467652,-86.4615 32.468088,-86.46148 32.468696,-86.461483 32.469123)\r\n1781;1899;all;Alpine Dr;Autauga;AL;36022;LINESTRING(-86.41676 32.57515,-86.416275 32.573861,-86.416041 32.573258,-86.41601 32.573134,-86.416015 32.573076,-86.41603 32.573017,-86.416055 32.57296,-86.416091 32.572903,-86.416184 32.572789,-86.416345 32.572625,-86.416515 32.572467,-86.416691 32.572317,-86.416814 32.572224,-86.416941 32.572139,-86.417212 32.571977,-86.417348 32.57191,-86.417419 32.57188,-86.417485 32.571863,-86.417479 32.571856)\r\n4101;4181;all;Autauga County 60;Autauga;AL;36749;LINESTRING(-86.852717 32.568428,-86.852722 32.568426,-86.853061 32.5685,-86.853311 32.568567,-86.853553 32.568651,-86.854735 32.569115)\r\n1130;1134;even;Parkview Dr;Autauga;AL;36067;LINESTRING(-86.476621 32.498917,-86.476598 32.49931)\r\n1129;1199;odd;Parkview Dr;Autauga;AL;36067;LINESTRING(-86.476815 32.498925,-86.476792 32.499318)\r\n1600;1898;even;Wanda Dr;Autauga;AL;36067;LINESTRING(-86.54231 32.420363,-86.542343 32.420356,-86.542399 32.4202,-86.542387 32.419917,-86.542399 32.419665,-86.542446 32.419475,-86.542485 32.418913,-86.542474 32.418023,-86.54249 32.417817,-86.542502 32.417803,-86.542561 32.41778,-86.544458 32.417764,-86.544652 32.41779,-86.544865 32.417767)\r\n1801;1899;odd;Wanda Dr;Autauga;AL;36067;LINESTRING(-86.542175 32.420244,-86.542143 32.42025,-86.542179 32.42017,-86.542191 32.419915,-86.542187 32.419645,-86.54224 32.419451,-86.542285 32.418909,-86.54228 32.418025,-86.542258 32.417757,-86.542352 32.417639,-86.542523 32.417594,-86.544478 32.417586,-86.54466 32.417622,-86.544842 32.417604)\r\n320;398;even;Fig Tree Ct;Autauga;AL;36749;LINESTRING(-86.845125 32.504999,-86.845118 32.505007,-86.844888 32.505324,-86.844872 32.505405)\r\n321;399;odd;Fig Tree Ct;Autauga;AL;36749;LINESTRING(-86.845296 32.505078,-86.84529 32.505089,-86.845088 32.505396,-86.845059 32.50545)\r\n101;199;odd;Graham Ln;Autauga;AL;36066;LINESTRING(-86.436868 32.475036,-86.436882 32.47505,-86.437004 32.475002,-86.437032 32.474832,-86.436891 32.474606,-86.436843 32.474501,-86.43681 32.474358,-86.436761 32.474239,-86.436704 32.4741,-86.43664 32.474019,-86.436557 32.473883,-86.436493 32.473814,-86.436333 32.473443,-86.436212 32.473209,-86.436241 32.473138,-86.436244 32.472942,-86.436102 32.472884)\r\n100;198;even;Graham Ln;Autauga;AL;36066;LINESTRING(-86.436696 32.474959,-86.436712 32.474898,-86.436804 32.474862,-86.436828 32.474854,-86.436709 32.474682,-86.436635 32.474555,-86.436608 32.4744,-86.436573 32.474295,-86.436514 32.474176,-86.436472 32.474101,-86.436385 32.473989,-86.436295 32.47391,-86.436145 32.473503,-86.436012 32.473223,-86.436031 32.47312,-86.436016 32.473052,-86.435996 32.473021)\r\n200;298;all;Macon Pl;Autauga;AL;36003;LINESTRING(-86.802851 32.479482,-86.802769 32.479696,-86.802682 32.479902,-86.802649 32.479981,-86.80264 32.480152,-86.802669 32.480242,-86.802707 32.480317,-86.802906 32.480646,-86.802974 32.480775,-86.803025 32.480903,-86.803061 32.48104,-86.803126 32.481399,-86.803155 32.481545,-86.803224 32.481835,-86.803344 32.482263,-86.803456 32.482611,-86.803502 32.482737)\r\n801;815;all;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.893069 32.577588,-86.893024 32.577771,-86.89294 32.577987,-86.892231 32.579464,-86.891976 32.57998,-86.891966 32.580001)\r\n1670;1694;all;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.680237 32.584411,-86.680069 32.584988,-86.680017 32.585203,-86.679956 32.585567,-86.679932 32.585789,-86.67992 32.586086,-86.67992 32.586308,-86.679935 32.586529,-86.679968 32.586825,-86.680241 32.58855,-86.680273 32.588837,-86.680305 32.58934,-86.680313 32.589628,-86.680314 32.589887)\r\n101;299;odd;Shady Valley Rd;Autauga;AL;36003;LINESTRING(-86.788712 32.438693,-86.788862 32.438826,-86.78897 32.438932,-86.789236 32.439217,-86.789463 32.439439,-86.789698 32.439653,-86.789927 32.43987,-86.790034 32.439979,-86.790185 32.440151,-86.79026 32.440267,-86.790337 32.440459,-86.790366 32.440592,-86.79038 32.440729,-86.790377 32.440871,-86.790353 32.441153,-86.790325 32.441288,-86.790261 32.441495,-86.790216 32.441642,-86.790197 32.441799,-86.790202 32.441958,-86.790223 32.44204,-86.790251 32.442115,-86.790309 32.442256,-86.7904 32.442467,-86.790476 32.442605,-86.790521 32.44268,-86.790697 32.442867,-86.790789 32.442913,-86.79116 32.443086,-86.791207 32.443121,-86.791346 32.443276,-86.791401 32.443386,-86.791427 32.443506,-86.791413 32.443638,-86.79139 32.443778,-86.79137 32.443929,-86.791371 32.444006,-86.79138 32.444228,-86.791416 32.444806,-86.791426 32.445095,-86.79142 32.445238,-86.791403 32.445472)\r\n240;214;even;Shady Valley Rd;Autauga;AL;36003;LINESTRING(-86.788851 32.438578,-86.78901 32.438712,-86.789122 32.438826,-86.789388 32.439109,-86.789611 32.439327,-86.789844 32.439541,-86.790075 32.43976,-86.79019 32.439873,-86.790357 32.440055,-86.790454 32.440193,-86.790539 32.440417,-86.79057 32.440572,-86.790578 32.440725,-86.790575 32.440877,-86.790557 32.441173,-86.790523 32.441326,-86.790453 32.441537,-86.790418 32.441672,-86.790397 32.441805,-86.790408 32.441936,-86.790421 32.442,-86.790441 32.442065,-86.790495 32.4422,-86.790586 32.442401,-86.790656 32.442527,-86.790695 32.44258,-86.790845 32.442729,-86.790895 32.442765,-86.791278 32.442938,-86.791363 32.442995,-86.79153 32.443184,-86.791617 32.443338,-86.791623 32.443504,-86.791615 32.443656,-86.791588 32.4438,-86.791572 32.443939,-86.791567 32.444006,-86.791576 32.44422,-86.791614 32.4448,-86.79162 32.445095,-86.791618 32.445246,-86.791597 32.445483)\r\n474;400;all;Old Autaugaville Rd;Autauga;AL;36067;LINESTRING(-86.494909 32.440224,-86.495489 32.439575,-86.496615 32.438299)\r\n1359;1301;odd;Reed St;Autauga;AL;36067;LINESTRING(-86.506408 32.467719,-86.506303 32.467692,-86.506064 32.467664)\r\n1362;1358;even;Reed St;Autauga;AL;36067;LINESTRING(-86.506359 32.467878,-86.506261 32.46786,-86.506034 32.467826)\r\n1451;1473;all;Longview Heights Rd;Autauga;AL;36067;LINESTRING(-86.426366 32.435224,-86.426314 32.435135)\r\n133;101;odd;Teri Ln;Autauga;AL;36066;LINESTRING(-86.433205 32.446397,-86.433393 32.446392,-86.434245 32.446384,-86.43483 32.446394,-86.435045 32.44644,-86.435171 32.4465,-86.435563 32.446769,-86.435858 32.446982)\r\n126;100;even;Teri Ln;Autauga;AL;36066;LINESTRING(-86.433197 32.446233,-86.433389 32.446226,-86.434245 32.446218,-86.434856 32.446212,-86.435131 32.446266,-86.435293 32.446358,-86.435689 32.446643,-86.435984 32.446857)\r\n1701;1799;all;Soloman Ct;Autauga;AL;36067;LINESTRING(-86.570849 32.550372,-86.5709 32.5504)\r\n116;100;all;W 5th St;Autauga;AL;36067;LINESTRING(-86.472893 32.464376,-86.472488 32.464346,-86.472423 32.46434)\r\n2149;2199;all;Autauga County 61;Autauga;AL;36067;LINESTRING(-86.496254 32.581586,-86.496256 32.581589,-86.496126 32.581664,-86.496073 32.581703,-86.495966 32.581798,-86.495815 32.581959,-86.495374 32.582478,-86.495058 32.582822,-86.494121 32.583756,-86.493418 32.58448,-86.493407 32.584491)\r\n400;466;even;Seaside Rd;Autauga;AL;36003;LINESTRING(-86.665749 32.473683,-86.665679 32.473907,-86.665595 32.474188,-86.665497 32.474465,-86.665384 32.474736,-86.665029 32.475478,-86.664633 32.476286,-86.664495 32.476553,-86.664431 32.476695,-86.664377 32.476837,-86.66433 32.476981,-86.664139 32.477691,-86.664053 32.477972,-86.664006 32.478108,-86.663898 32.478381,-86.663778 32.478648,-86.663713 32.478781,-86.663645 32.478909,-86.66357 32.479037,-86.663072 32.479802,-86.662995 32.479936,-86.662854 32.480206,-86.66273 32.480479,-86.662346 32.481368,-86.661886 32.482384,-86.66125 32.48373,-86.661084 32.484062,-86.660543 32.485048,-86.660114 32.485845,-86.659843 32.486385,-86.659611 32.486937,-86.659424 32.487343,-86.659363 32.487483,-86.659307 32.487625,-86.659266 32.487771,-86.659232 32.48792,-86.659207 32.488069,-86.659177 32.488364,-86.659167 32.488804,-86.65917 32.489242,-86.659199 32.490116,-86.659227 32.490698,-86.659266 32.491132,-86.659268 32.491138)\r\n501;599;odd;Seaside Rd;Autauga;AL;36003;LINESTRING(-86.665937 32.473724,-86.665869 32.473947,-86.665787 32.474232,-86.665687 32.474517,-86.66557 32.474796,-86.665209 32.47554,-86.664813 32.47635,-86.664679 32.476617,-86.664619 32.476751,-86.664567 32.476885,-86.664522 32.477023,-86.664331 32.477731,-86.664243 32.478016,-86.664196 32.478158,-86.664086 32.478437,-86.66396 32.47871,-86.663895 32.478847,-86.663823 32.478981,-86.663746 32.479115,-86.663248 32.47988,-86.663175 32.480006,-86.663038 32.48027,-86.662914 32.480537,-86.66253 32.481426,-86.662068 32.482444,-86.661432 32.483794,-86.661264 32.48413,-86.660721 32.485118,-86.660294 32.485911,-86.660029 32.486447,-86.659795 32.486995,-86.659608 32.487401,-86.659551 32.487537,-86.659501 32.487671,-86.65946 32.487807,-86.659428 32.487948,-86.659405 32.488087,-86.659377 32.488374,-86.659363 32.488806,-86.659366 32.48924,-86.659395 32.49011,-86.659425 32.490688,-86.659464 32.491122,-86.659463 32.491131)\r\n1430;1444;even;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.600641 32.592308,-86.600743 32.592434,-86.601054 32.592782,-86.601685 32.593458)\r\n1419;1429;odd;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.600801 32.592214,-86.600903 32.592336,-86.60121 32.59268,-86.601838 32.593356)\r\n1680;1678;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.412424 32.425777,-86.412478 32.426004,-86.412583 32.426352,-86.412607 32.426424)\r\n199;101;odd;Jones St;Autauga;AL;36067;LINESTRING(-86.470262 32.486539,-86.470254 32.486294,-86.470254 32.486078,-86.470275 32.485792,-86.470278 32.485672)\r\n110;100;even;Jones St;Autauga;AL;36067;LINESTRING(-86.470067 32.486544,-86.470056 32.486296,-86.470054 32.486072,-86.470077 32.485784,-86.470083 32.485667)\r\n199;101;all;Isom St;Autauga;AL;36067;LINESTRING(-86.471403 32.478667,-86.471094 32.478628,-86.470828 32.478618,-86.470565 32.478617,-86.470135 32.478624,-86.470063 32.478616,-86.469988 32.478604,-86.469904 32.47858,-86.469854 32.478578)\r\n1753;1799;all;Pearson Rd;Autauga;AL;36067;LINESTRING(-86.467817 32.55065,-86.467848 32.550665,-86.467973 32.550732,-86.468116 32.550784,-86.468271 32.550824,-86.46851 32.550871,-86.468667 32.55089,-86.469326 32.550913,-86.469392 32.550902,-86.4694 32.550909)\r\n1056;1098;even;Alabama St;Autauga;AL;36067;LINESTRING(-86.483659 32.436123,-86.48372 32.4361,-86.484636 32.435689,-86.485464 32.43533)\r\n1067;1099;odd;Alabama St;Autauga;AL;36067;LINESTRING(-86.483575 32.435974,-86.48363 32.43595,-86.484546 32.435543,-86.485376 32.435184)\r\n942;998;even;Gaddis Ave;Autauga;AL;36066;LINESTRING(-86.448774 32.461234,-86.448649 32.461228,-86.448219 32.461232,-86.447875 32.461239,-86.447622 32.461256,-86.447609 32.461257)\r\n943;999;odd;Gaddis Ave;Autauga;AL;36066;LINESTRING(-86.448765 32.461399,-86.448645 32.461396,-86.448223 32.461398,-86.447885 32.461407,-86.447628 32.461424,-86.447605 32.461422)\r\n100;110;even;Mays Ct;Autauga;AL;36091;LINESTRING(-86.554272 32.699328,-86.554419 32.699307,-86.554728 32.699268,-86.555133 32.69925,-86.555718 32.699278)\r\n101;199;odd;Mays Ct;Autauga;AL;36091;LINESTRING(-86.554239 32.699166,-86.554387 32.699145,-86.554706 32.699094,-86.555135 32.699084,-86.55573 32.699114)\r\n1700;1798;even;Gilliland Dr;Autauga;AL;36006;LINESTRING(-86.739638 32.62912,-86.739584 32.629462,-86.739536 32.629553,-86.739278 32.629831,-86.738956 32.630258,-86.738431 32.630723,-86.738378 32.630762)\r\n1701;1799;odd;Gilliland Dr;Autauga;AL;36006;LINESTRING(-86.739832 32.629136,-86.739802 32.629514,-86.739716 32.629651,-86.739446 32.629931,-86.739124 32.630368,-86.738569 32.630863,-86.738485 32.6309)\r\n599;501;odd;Woodvale Rd;Autauga;AL;36067;LINESTRING(-86.454512 32.476365,-86.454503 32.475433,-86.454533 32.475236,-86.454579 32.475114,-86.454763 32.474796,-86.455281 32.473964,-86.45539 32.473769)\r\n598;500;even;Woodvale Rd;Autauga;AL;36067;LINESTRING(-86.454317 32.476367,-86.454301 32.475425,-86.454321 32.475196,-86.454389 32.475046,-86.454589 32.47472,-86.455105 32.473888,-86.455215 32.473698)\r\n1198;1100;all;December Dr;Autauga;AL;36051;LINESTRING(-86.593128 32.611595,-86.593201 32.611578,-86.593279 32.611602,-86.59337 32.61163,-86.593535 32.611677,-86.593663 32.611659,-86.593808 32.611644,-86.594218 32.611712,-86.594285 32.611721,-86.594479 32.611756,-86.594881 32.611743,-86.595197 32.611744,-86.595395 32.611769,-86.595558 32.611795,-86.59559 32.61181,-86.595648 32.611871,-86.595698 32.611957,-86.595773 32.612145,-86.595818 32.612318,-86.595803 32.612557)\r\n1385;1399;all;Paula St;Autauga;AL;36067;LINESTRING(-86.457193 32.51353,-86.457148 32.513624,-86.45709 32.51376,-86.456942 32.514021,-86.456925 32.514048)\r\n298;200;all;Alt Rte Route County Road 59;Autauga;AL;36022;LINESTRING(-86.50088 32.655602,-86.500876 32.655634,-86.500891 32.655787,-86.50091 32.655864,-86.500932 32.655941,-86.501065 32.656209,-86.50151 32.657066,-86.501639 32.65733,-86.501701 32.657452,-86.501765 32.657603)\r\n2838;2898;even;Autauga County 85;Autauga;AL;36022;LINESTRING(-86.424136 32.626753,-86.424115 32.627058,-86.424084 32.627517,-86.423988 32.628739,-86.423943 32.629097,-86.423889 32.629375,-86.423855 32.629512,-86.423814 32.62965,-86.423746 32.629856,-86.423654 32.630096,-86.423641 32.630123,-86.423551 32.630321,-86.423485 32.63045,-86.423007 32.631295,-86.422567 32.632077,-86.422428 32.632343,-86.422355 32.632497,-86.422263 32.63268,-86.422123 32.633022,-86.421976 32.633441,-86.421871 32.633793,-86.421756 32.634139,-86.421446 32.635117,-86.421328 32.635461,-86.421248 32.635662,-86.421188 32.635789,-86.421116 32.635913,-86.420947 32.636153,-86.420802 32.636321,-86.420642 32.63648,-86.420468 32.636628,-86.420279 32.636764,-86.420078 32.636889,-86.419939 32.636968,-86.418701 32.637605,-86.417526 32.638198,-86.417374 32.638277,-86.417186 32.638406)\r\n2827;2899;odd;Autauga County 85;Autauga;AL;36022;LINESTRING(-86.424331 32.626763,-86.424309 32.627068,-86.42428 32.627527,-86.424186 32.628753,-86.424141 32.629119,-86.424085 32.629407,-86.424047 32.62955,-86.424006 32.629692,-86.423936 32.629904,-86.42384 32.630148,-86.423829 32.630181,-86.423735 32.630385,-86.423665 32.63052,-86.423183 32.631365,-86.422747 32.632147,-86.42261 32.632409,-86.422535 32.632559,-86.422451 32.63274,-86.422313 32.633074,-86.422168 32.633485,-86.422061 32.633835,-86.421946 32.634183,-86.421636 32.635161,-86.421518 32.635511,-86.421436 32.63572,-86.421372 32.635857,-86.421296 32.635993,-86.421117 32.636249,-86.42096 32.636427,-86.42079 32.636596,-86.420606 32.636754,-86.420405 32.636898,-86.420192 32.637027,-86.420047 32.63711,-86.418803 32.637747,-86.41763 32.63834,-86.417492 32.638417,-86.417306 32.638536)\r\n240;1298;even;Gardenia Ct;Autauga;AL;36067;LINESTRING(-86.460499 32.472481,-86.460524 32.472497,-86.460772 32.47259,-86.460962 32.472611,-86.461111 32.472609)\r\n241;1299;odd;Gardenia Ct;Autauga;AL;36067;LINESTRING(-86.460591 32.472336,-86.460612 32.472341,-86.46083 32.472414,-86.46098 32.472437,-86.461115 32.472444)\r\n281;299;odd;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.512054 32.411833,-86.512054 32.412168)\r\n298;292;even;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.512248 32.411833,-86.512248 32.412168)\r\n1998;1900;even;Amber Rose Dr;Autauga;AL;36067;LINESTRING(-86.509432 32.569441,-86.509392 32.569047,-86.509176 32.56873,-86.50877 32.568741)\r\n1999;1901;odd;Amber Rose Dr;Autauga;AL;36067;LINESTRING(-86.509238 32.56946,-86.509174 32.569109,-86.509042 32.568924,-86.508768 32.568906)\r\n1200;1206;all;Conestoga Wagon Trl;Autauga;AL;36067;LINESTRING(-86.499685 32.501804,-86.499736 32.5019,-86.499765 32.50197,-86.499887 32.502172,-86.49997 32.502304,-86.500019 32.502373,-86.500089 32.502447,-86.500196 32.502499,-86.500399 32.502511,-86.500501 32.502504,-86.500755 32.502459,-86.500779 32.502452)\r\n900;1068;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.440343 32.437202,-86.440233 32.437216,-86.438334 32.437486,-86.438235 32.437503)\r\n741;721;all;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.470954 32.475406,-86.470917 32.474957,-86.4709 32.474811,-86.470878 32.474687)\r\n1501;1511;all;Monfee Rd;Autauga;AL;36067;LINESTRING(-86.499183 32.510954,-86.499303 32.510955,-86.499563 32.510953,-86.499908 32.510955,-86.500395 32.510945)\r\n2099;2001;odd;Gibbons Rd;Autauga;AL;36067;LINESTRING(-86.475038 32.576566,-86.475664 32.576465,-86.475872 32.576447,-86.47655 32.576411,-86.477099 32.576496,-86.477274 32.576529,-86.477682 32.576718,-86.47775 32.576779,-86.477768 32.576817,-86.477796 32.576929,-86.477774 32.577199,-86.477726 32.577326,-86.477621 32.577409,-86.477077 32.577551,-86.476992 32.577573)\r\n2098;2020;even;Gibbons Rd;Autauga;AL;36067;LINESTRING(-86.475 32.576404,-86.475636 32.576293,-86.475858 32.576281,-86.476562 32.576239,-86.477131 32.57633,-86.477348 32.576347,-86.477802 32.57657,-86.477976 32.576681,-86.477972 32.576793,-86.478002 32.576917,-86.477984 32.577225,-86.477934 32.577432,-86.477735 32.577583,-86.477131 32.577711,-86.477048 32.577731)\r\n1176;1198;even;Valridge W;Autauga;AL;36066;LINESTRING(-86.439433 32.501391,-86.439575 32.501394,-86.439642 32.501358)\r\n1199;1177;odd;Valridge W;Autauga;AL;36066;LINESTRING(-86.43942 32.501227,-86.439523 32.50121,-86.439567 32.501207)\r\n2;98;even;Hidden Valley Ct;Autauga;AL;36022;LINESTRING(-86.414203 32.500984,-86.414184 32.501107,-86.414169 32.501171,-86.414148 32.501234,-86.414119 32.501294,-86.414045 32.501414,-86.414004 32.50146,-86.413942 32.501523)\r\n1;99;odd;Hidden Valley Ct;Autauga;AL;36022;LINESTRING(-86.414397 32.501,-86.414386 32.501133,-86.414367 32.501213,-86.41434 32.501288,-86.414307 32.501366,-86.414221 32.501502,-86.414168 32.501574,-86.41408 32.501639)\r\n105;101;all;Sheila Blvd;Autauga;AL;36066;LINESTRING(-86.430187 32.443098,-86.430226 32.443083,-86.430574 32.442752,-86.430858 32.442477,-86.430975 32.44231)\r\n245;221;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.484111 32.570534,-86.481201 32.570612,-86.480857 32.570629,-86.480685 32.570642,-86.480514 32.570659,-86.480343 32.570687,-86.480177 32.570723,-86.480119 32.570743)\r\n252;218;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.484117 32.570698,-86.481209 32.570778,-86.480871 32.570795,-86.480707 32.570808,-86.480546 32.570827,-86.480387 32.570853,-86.480235 32.570887,-86.480182 32.570899)\r\n1100;1126;even;E Main St;Autauga;AL;36066;LINESTRING(-86.445819 32.460259,-86.445579 32.460269,-86.444897 32.460274)\r\n1101;1123;odd;E Main St;Autauga;AL;36066;LINESTRING(-86.445832 32.460423,-86.445585 32.460439,-86.444898 32.460439)\r\n701;799;all;Geneva St;Autauga;AL;36066;LINESTRING(-86.442652 32.46026,-86.442647 32.460101,-86.442653 32.459575)\r\n398;368;all;Somerset Dr;Autauga;AL;36067;LINESTRING(-86.483452 32.525812,-86.483164 32.526047,-86.482906 32.526242,-86.482826 32.526298,-86.482636 32.526369,-86.482423 32.526368,-86.482229 32.526306,-86.482143 32.526252,-86.481497 32.525762,-86.481247 32.525568,-86.481187 32.525529,-86.481127 32.5255,-86.480989 32.525454,-86.480923 32.525441,-86.480764 32.525431,-86.480254 32.525447,-86.479998 32.525451,-86.479699 32.52546)\r\n3612;3666;even;Bledsoe Rd;Autauga;AL;36003;LINESTRING(-86.796655 32.475884,-86.796705 32.476111,-86.796825 32.476537,-86.796873 32.476685,-86.796912 32.476763,-86.796963 32.476834,-86.797025 32.476901,-86.797092 32.476958,-86.797165 32.477009,-86.797241 32.477058,-86.797325 32.477099,-86.797418 32.477135,-86.797518 32.477152,-86.797698 32.477167,-86.797871 32.477171,-86.798019 32.477192,-86.798144 32.47724,-86.798199 32.477271,-86.798319 32.477371,-86.79852 32.477515,-86.799207 32.477946,-86.799328 32.478035,-86.799431 32.478131,-86.799524 32.478243,-86.799789 32.478622,-86.799897 32.478749,-86.800025 32.478865,-86.800105 32.478917,-86.800265 32.479,-86.800438 32.479058,-86.800531 32.47908,-86.800709 32.479107,-86.800891 32.479123,-86.801071 32.479123,-86.801505 32.479104,-86.801845 32.479098,-86.802008 32.479109,-86.802086 32.479118,-86.802243 32.479149,-86.802399 32.479194,-86.802471 32.47922,-86.802615 32.479285,-86.802813 32.479391)\r\n3601;3637;odd;Bledsoe Rd;Autauga;AL;36003;LINESTRING(-86.796845 32.475852,-86.796899 32.476075,-86.797017 32.476493,-86.797067 32.476627,-86.797096 32.476683,-86.797133 32.476736,-86.797179 32.476787,-86.79723 32.476832,-86.797289 32.476875,-86.797353 32.476912,-86.797417 32.476943,-86.797484 32.476965,-86.797552 32.47698,-86.797712 32.476997,-86.797883 32.477001,-86.798079 32.477008,-86.798264 32.477084,-86.798335 32.477147,-86.798455 32.477245,-86.798646 32.477383,-86.799327 32.477814,-86.799472 32.477905,-86.799597 32.478023,-86.799692 32.478153,-86.799959 32.478528,-86.800055 32.478637,-86.800165 32.478735,-86.800221 32.478773,-86.800359 32.478842,-86.800504 32.478894,-86.800577 32.478912,-86.800737 32.478937,-86.800903 32.478951,-86.801067 32.478955,-86.801497 32.478938,-86.801849 32.47893,-86.802028 32.478939,-86.802122 32.47895,-86.802299 32.478983,-86.802473 32.479034,-86.802559 32.479066,-86.802719 32.479137,-86.80292 32.479253)\r\n2;198;even;Laurel Pl;Autauga;AL;36022;LINESTRING(-86.41293 32.504284,-86.412945 32.504294,-86.412963 32.504279,-86.413027 32.504278,-86.413103 32.504281,-86.413182 32.504285,-86.413267 32.504289,-86.413357 32.504295,-86.413451 32.504302,-86.41355 32.504306,-86.413649 32.504312,-86.413749 32.504318,-86.413847 32.504325,-86.413944 32.504332,-86.414039 32.504341,-86.414135 32.504344,-86.414231 32.504347,-86.414328 32.504352,-86.414426 32.504357,-86.41452 32.504366,-86.414627 32.504367,-86.414732 32.504371,-86.414836 32.504377,-86.414936 32.504382,-86.415032 32.50439,-86.415116 32.504403,-86.415188 32.504423,-86.415248 32.504449,-86.415301 32.504485,-86.415355 32.504531,-86.415462 32.504648,-86.415515 32.504708,-86.415567 32.504772,-86.415618 32.504829,-86.415667 32.504885,-86.415709 32.504946,-86.415739 32.504974)\r\n1;199;odd;Laurel Pl;Autauga;AL;36022;LINESTRING(-86.412802 32.50416,-86.412849 32.504104,-86.412957 32.504109,-86.413033 32.504114,-86.413111 32.504115,-86.413194 32.504119,-86.413281 32.504125,-86.413371 32.504131,-86.413465 32.504136,-86.413562 32.504142,-86.413663 32.504146,-86.413765 32.504154,-86.413863 32.504161,-86.41396 32.504168,-86.414053 32.504173,-86.414143 32.504178,-86.414241 32.504181,-86.414338 32.504186,-86.414442 32.504187,-86.414534 32.504196,-86.414635 32.504201,-86.414742 32.504207,-86.414848 32.504211,-86.41495 32.504218,-86.415052 32.504222,-86.415158 32.504231,-86.415268 32.504255,-86.415364 32.504299,-86.415449 32.504357,-86.415511 32.504425,-86.41562 32.504548,-86.415673 32.504612,-86.415725 32.50467,-86.415782 32.504727,-86.415831 32.504795,-86.415875 32.504848,-86.415894 32.504875)\r\n1580;1564;all;Autauga County 50;Autauga;AL;36067;LINESTRING(-86.554329 32.405007,-86.554171 32.40501,-86.551583 32.405067,-86.551518 32.405068)\r\n735;723;all;N Memorial Dr;Autauga;AL;36067;LINESTRING(-86.45208 32.47798,-86.452105 32.477573,-86.452126 32.476993,-86.452142 32.476774,-86.45214 32.476621)\r\n1800;1898;even;Cotton Blossom Way;Autauga;AL;36067;LINESTRING(-86.449598 32.42822,-86.449818 32.428378,-86.450119 32.428604,-86.450287 32.428795,-86.450329 32.429036,-86.450347 32.430412)\r\n1801;1899;odd;Cotton Blossom Way;Autauga;AL;36067;LINESTRING(-86.449723 32.428095,-86.449944 32.428252,-86.450271 32.428478,-86.450511 32.428717,-86.450531 32.429028,-86.450542 32.430411)\r\n370;398;even;Autauga County 165;Autauga;AL;36003;LINESTRING(-86.648091 32.44794,-86.64794 32.448219,-86.647609 32.449009,-86.647006 32.450385,-86.646811 32.450893,-86.646654 32.451258,-86.646566 32.451465,-86.64616 32.452409,-86.645753 32.453122,-86.645292 32.45391,-86.644935 32.454438,-86.644438 32.455214,-86.644183 32.455597,-86.643831 32.456254,-86.643115 32.457436,-86.642739 32.458297,-86.642696 32.458465)\r\n343;399;odd;Autauga County 165;Autauga;AL;36003;LINESTRING(-86.648269 32.448007,-86.648128 32.448283,-86.647793 32.449065,-86.647194 32.450441,-86.646997 32.450947,-86.646838 32.451314,-86.64675 32.451521,-86.646348 32.452477,-86.645927 32.453194,-86.64547 32.45399,-86.645107 32.45452,-86.64461 32.455294,-86.644363 32.455675,-86.644011 32.456328,-86.643303 32.457506,-86.642935 32.458347,-86.642886 32.458503)\r\n210;218;even;Brookhaven Dr;Autauga;AL;36066;LINESTRING(-86.441906 32.473166,-86.441545 32.472873,-86.44122 32.47263,-86.441192 32.472618)\r\n211;217;odd;Brookhaven Dr;Autauga;AL;36066;LINESTRING(-86.441771 32.473285,-86.441411 32.472997,-86.441094 32.472766,-86.44108 32.472753)\r\n999;977;odd;Sandy Ridge Rd;Autauga;AL;36067;LINESTRING(-86.603766 32.582562,-86.603674 32.582561,-86.60325 32.582577,-86.60274 32.582572,-86.602565 32.582581,-86.60239 32.582592,-86.602256 32.582611)\r\n1002;978;even;Sandy Ridge Rd;Autauga;AL;36067;LINESTRING(-86.603767 32.582727,-86.603678 32.582729,-86.603254 32.582745,-86.602744 32.58274,-86.602579 32.582747,-86.602414 32.58276,-86.602285 32.582774)\r\n842;844;all;Autauga County 165;Autauga;AL;36067;LINESTRING(-86.596365 32.486542,-86.595847 32.48752,-86.595699 32.487778,-86.59562 32.487901,-86.595534 32.488023,-86.595443 32.488139,-86.595344 32.488254,-86.59524 32.488366,-86.595132 32.488474,-86.595018 32.488577,-86.594714 32.488829,-86.594148 32.489273,-86.593874 32.489485)\r\n200;216;even;Deer Run Dr;Autauga;AL;36067;LINESTRING(-86.478638 32.454173,-86.478641 32.454126,-86.478651 32.453955,-86.478671 32.453883,-86.478678 32.453851,-86.478687 32.453855,-86.478712 32.453836,-86.478738 32.453824,-86.478834 32.453801,-86.479143 32.4537,-86.479279 32.453637,-86.479437 32.453551,-86.479526 32.453489,-86.479589 32.453445,-86.479617 32.45343,-86.479622 32.453427,-86.479665 32.453421,-86.479657 32.453408,-86.479733 32.453412,-86.479831 32.453402,-86.480135 32.453414)\r\n201;223;odd;Deer Run Dr;Autauga;AL;36067;LINESTRING(-86.478443 32.454172,-86.478441 32.45412,-86.478455 32.453947,-86.478443 32.453823,-86.478512 32.453755,-86.478531 32.453719,-86.478608 32.453678,-86.47867 32.453658,-86.47877 32.453637,-86.479057 32.453542,-86.479177 32.453489,-86.479319 32.453411,-86.4794 32.453359,-86.479463 32.453311,-86.479505 32.453282,-86.479534 32.453269,-86.479621 32.453231,-86.479657 32.453244,-86.479723 32.45324,-86.479827 32.453234,-86.480146 32.45325)\r\n173;101;odd;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.508218 32.423088,-86.508204 32.423111,-86.508109 32.423319,-86.508028 32.423531,-86.507956 32.423748,-86.507899 32.423965,-86.507861 32.424187,-86.507836 32.424412,-86.507827 32.424634,-86.507826 32.425075,-86.507851 32.426753,-86.507893 32.430422,-86.507894 32.430617)\r\n174;100;even;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.508396 32.423154,-86.508388 32.423175,-86.508297 32.423375,-86.508218 32.423579,-86.50815 32.423788,-86.508097 32.423995,-86.508059 32.424207,-86.508036 32.424424,-86.508025 32.424638,-86.508022 32.425075,-86.508045 32.426751,-86.508089 32.430422,-86.508088 32.430617)\r\n146;152;even;Beth Manor Dr;Autauga;AL;36066;LINESTRING(-86.429147 32.448122,-86.429068 32.448121,-86.428552 32.448124,-86.428353 32.448139)\r\n143;147;odd;Beth Manor Dr;Autauga;AL;36066;LINESTRING(-86.429144 32.448286,-86.429068 32.448285,-86.42856 32.448294,-86.428368 32.448303)\r\n1900;1998;all;Autauga County 72;Autauga;AL;36067;LINESTRING(-86.690992 32.550927,-86.691738 32.550925,-86.692084 32.550907,-86.692427 32.550873,-86.693269 32.550759,-86.693517 32.550733,-86.693767 32.550718,-86.694363 32.550705,-86.694876 32.550673,-86.69547 32.550625,-86.695719 32.550612,-86.696399 32.550597,-86.697257 32.550602,-86.697775 32.55059,-86.698289 32.550565,-86.698631 32.550545,-86.698883 32.550537,-86.699046 32.550545,-86.699294 32.55057,-86.699818 32.550649)\r\n4300;4474;even;Autauga County 60;Autauga;AL;36749;LINESTRING(-86.87549 32.575276,-86.875667 32.57526,-86.875925 32.575218,-86.876263 32.575158,-86.876921 32.575032,-86.877073 32.575013,-86.877142 32.575005,-86.8773 32.575016,-86.87746 32.575033,-86.87812 32.575141,-86.878363 32.575192,-86.879591 32.575498,-86.879744 32.575547,-86.879815 32.575574,-86.87988 32.575606,-86.879945 32.575643,-86.880351 32.575917,-86.880572 32.576039,-86.880792 32.576153,-86.880894 32.576195,-86.880952 32.576223,-86.881119 32.576279,-86.881208 32.576295,-86.88138 32.576331,-86.881718 32.576373,-86.881963 32.576415,-86.882294 32.576484,-86.882953 32.576643,-86.88362 32.576786,-86.883878 32.576826,-86.883987 32.576831)\r\n4353;4499;odd;Autauga County 60;Autauga;AL;36749;LINESTRING(-86.875466 32.575112,-86.875637 32.575092,-86.875887 32.575054,-86.876221 32.574996,-86.876883 32.574864,-86.877051 32.574841,-86.877142 32.574841,-86.87732 32.574846,-86.877492 32.574867,-86.878164 32.574975,-86.878415 32.57503,-86.879653 32.575338,-86.879822 32.575387,-86.879907 32.575422,-86.87999 32.57546,-86.880065 32.575507,-86.880471 32.575779,-86.880678 32.575897,-86.88089 32.576005,-86.880982 32.576047,-86.881034 32.576065,-86.881183 32.576113,-86.881256 32.576133,-86.881418 32.576163,-86.881752 32.576207,-86.882007 32.576251,-86.882346 32.576322,-86.883005 32.576481,-86.883662 32.57662,-86.883904 32.576656,-86.884004 32.576667)\r\n4399;4315;odd;Autauga County 22;Autauga;AL;36758;LINESTRING(-86.901321 32.611983,-86.901271 32.611978,-86.901095 32.611978,-86.900918 32.611988,-86.900742 32.612017,-86.900572 32.612062,-86.899269 32.612431,-86.898703 32.612604,-86.89846 32.612671,-86.898305 32.612704,-86.898209 32.61272)\r\n4398;4296;even;Autauga County 22;Autauga;AL;36758;LINESTRING(-86.901309 32.612148,-86.901265 32.612148,-86.901103 32.612148,-86.900946 32.61216,-86.90079 32.612185,-86.900632 32.612222,-86.899333 32.612589,-86.898767 32.61276,-86.89852 32.612833,-86.898345 32.612878,-86.898232 32.612883)\r\n792;798;even;Autauga County 49;Autauga;AL;36051;LINESTRING(-86.557093 32.629209,-86.557169 32.629249,-86.557475 32.629392,-86.557947 32.629582,-86.558192 32.629669,-86.558518 32.629769,-86.558957 32.629874)\r\n701;783;odd;Autauga County 49;Autauga;AL;36051;LINESTRING(-86.557192 32.629067,-86.557267 32.629103,-86.557567 32.629242,-86.558029 32.629428,-86.558264 32.629511,-86.55858 32.629607,-86.559012 32.629716)\r\n347;279;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.500968 32.570422,-86.500211 32.570469,-86.499705 32.57049,-86.499197 32.5705,-86.498432 32.570486,-86.496302 32.570397,-86.495277 32.570348,-86.494342 32.570319,-86.493659 32.57032,-86.492465 32.570349,-86.489482 32.570432,-86.488855 32.570438)\r\n350;300;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.500983 32.570586,-86.500223 32.570635,-86.499711 32.570656,-86.499197 32.570664,-86.498426 32.570652,-86.496292 32.570561,-86.495269 32.570514,-86.494338 32.570487,-86.493661 32.570486,-86.492471 32.570513,-86.489486 32.570598,-86.488857 32.570602)\r\n101;117;all;Melmar Dr;Autauga;AL;36067;LINESTRING(-86.481088 32.481481,-86.481405 32.481519,-86.481743 32.481549,-86.481999 32.481561,-86.482859 32.481611,-86.483123 32.481644,-86.483389 32.481709,-86.483547 32.4818,-86.483673 32.481887,-86.483698 32.48193)\r\n140;146;even;Ball Enwright Rd;Autauga;AL;36022;LINESTRING(-86.459957 32.60963,-86.459938 32.609628,-86.459867 32.609621,-86.459769 32.60962,-86.459663 32.60963,-86.459569 32.60965,-86.459487 32.609679,-86.459469 32.609686)\r\n201;299;odd;Ball Enwright Rd;Autauga;AL;36022;LINESTRING(-86.459961 32.609795,-86.45993 32.609798,-86.459857 32.609793,-86.459781 32.609794,-86.459699 32.609802,-86.459629 32.609816,-86.459553 32.609837,-86.459529 32.609842)\r\n701;743;all;Gin Shop Hill Rd;Autauga;AL;36067;LINESTRING(-86.484547 32.455566,-86.484661 32.455445,-86.484866 32.455206,-86.485524 32.454533,-86.485858 32.454181)\r\n400;498;all;Co Rd 70;Autauga;AL;36022;LINESTRING(-86.444175 32.655846,-86.444178 32.655582)\r\n2000;2198;even;State Rte 14;Autauga;AL;36067;LINESTRING(-86.63306 32.437203,-86.634958 32.437175)\r\n2207;2221;odd;State Rte 14;Autauga;AL;36003;LINESTRING(-86.633056 32.437039,-86.634954 32.437011)\r\n152;198;even;E Poplar St;Autauga;AL;36066;LINESTRING(-86.438856 32.469811,-86.440593 32.469798,-86.441789 32.469779,-86.441845 32.469776)\r\n149;199;odd;E Poplar St;Autauga;AL;36066;LINESTRING(-86.438854 32.469647,-86.440591 32.469632,-86.441783 32.469613,-86.441837 32.469612)\r\n1126;1100;all;Autauga County 6;Autauga;AL;36067;LINESTRING(-86.580282 32.550055,-86.580207 32.550116,-86.579857 32.550332,-86.579453 32.550605,-86.579309 32.550693,-86.579017 32.550853,-86.578863 32.550928,-86.578707 32.550993,-86.578393 32.551123,-86.578376 32.551127,-86.578231 32.551179,-86.577679 32.551385,-86.577515 32.551442,-86.57735 32.551492,-86.577179 32.551532,-86.576674 32.551634,-86.576283 32.551707)\r\n708;744;all;S McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.41818 32.460095,-86.41819 32.459669,-86.418191 32.45938,-86.418196 32.459198,-86.418217 32.458587,-86.418211 32.458528)\r\n587;699;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.450564 32.460243,-86.450546 32.460133)\r\n133;101;odd;W 6th St;Autauga;AL;36067;LINESTRING(-86.473122 32.46579,-86.47309 32.465787,-86.472487 32.465745,-86.472286 32.465728)\r\n124;100;even;W 6th St;Autauga;AL;36067;LINESTRING(-86.473111 32.465954,-86.473076 32.465953,-86.472469 32.465911,-86.472266 32.465892)\r\n800;898;even;Cottage Ln;Autauga;AL;36067;LINESTRING(-86.468558 32.441638,-86.468493 32.441549,-86.468454 32.441468,-86.46847 32.441385,-86.468505 32.441298,-86.468757 32.440917,-86.468844 32.440781,-86.468925 32.440556,-86.468929 32.440392,-86.468879 32.440157,-86.468774 32.440009,-86.468584 32.439845,-86.468463 32.439777)\r\n801;899;odd;Cottage Ln;Autauga;AL;36067;LINESTRING(-86.468405 32.44174,-86.468295 32.441639,-86.468244 32.441486,-86.468256 32.441341,-86.468319 32.441222,-86.468581 32.440837,-86.468648 32.440715,-86.468711 32.440526,-86.468721 32.440406,-86.468671 32.440225,-86.468602 32.440119,-86.468446 32.439979,-86.468347 32.439909)\r\n700;798;even;Lola Rd;Autauga;AL;36067;LINESTRING(-86.549208 32.563469,-86.549275 32.563469,-86.549538 32.563473,-86.549716 32.563466,-86.549809 32.563457,-86.549983 32.563425,-86.550233 32.56336,-86.550392 32.563307,-86.550545 32.563271,-86.550702 32.563249,-86.550864 32.563239,-86.55137 32.563239,-86.551795 32.563235,-86.552223 32.563243,-86.554187 32.563228,-86.554435 32.563231,-86.555108 32.563216,-86.555127 32.563214)\r\n701;799;odd;Lola Rd;Autauga;AL;36067;LINESTRING(-86.549207 32.563304,-86.549275 32.563303,-86.549534 32.563305,-86.549698 32.563296,-86.549775 32.563287,-86.549931 32.563259,-86.550167 32.563198,-86.550326 32.563145,-86.550499 32.563101,-86.55068 32.563077,-86.550858 32.563071,-86.55137 32.563073,-86.551797 32.563069,-86.552225 32.563077,-86.554187 32.563064,-86.554433 32.563065,-86.5551 32.56305,-86.555116 32.56305)\r\n100;806;even;Fairwood Dr;Autauga;AL;36067;LINESTRING(-86.499192 32.453365,-86.499201 32.453375,-86.499582 32.453771,-86.499716 32.453944,-86.499806 32.454129,-86.499847 32.454326,-86.499829 32.454525,-86.499813 32.454627)\r\n101;805;odd;Fairwood Dr;Autauga;AL;36067;LINESTRING(-86.499338 32.453256,-86.499351 32.453267,-86.499744 32.453667,-86.499904 32.453858,-86.500016 32.454081,-86.500047 32.45432,-86.500033 32.454545,-86.500004 32.454656)\r\n2200;2298;all;Co Rd 2;Autauga;AL;36003;LINESTRING(-86.650102 32.444273,-86.650229 32.444338,-86.650375 32.44441,-86.650603 32.44451,-86.650729 32.444574,-86.650906 32.444658,-86.651412 32.444934,-86.651554 32.445,-86.651697 32.445049,-86.651842 32.445075,-86.651993 32.445073,-86.652031 32.445073)\r\n400;498;all;Nobles Ln;Autauga;AL;36067;LINESTRING(-86.484069 32.444797,-86.484008 32.444849,-86.483842 32.444834,-86.483746 32.444784,-86.483577 32.444686)\r\n1501;1539;all;Autauga County 24;Autauga;AL;36006;LINESTRING(-86.672052 32.670945,-86.672143 32.67093,-86.67233 32.670929,-86.672683 32.670938,-86.675165 32.671128,-86.676607 32.67124,-86.676779 32.671249,-86.676896 32.671259)\r\n199;183;odd;Forrester Dr;Autauga;AL;36066;LINESTRING(-86.450892 32.530581,-86.450883 32.530628,-86.450944 32.530699)\r\n198;182;even;Forrester Dr;Autauga;AL;36066;LINESTRING(-86.451086 32.530564,-86.451101 32.530572,-86.451116 32.530622)\r\n1364;1378;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.506569 32.469732,-86.506689 32.469774,-86.507246 32.469949,-86.507357 32.469984,-86.507675 32.470082)\r\n1363;1365;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.506641 32.469579,-86.506759 32.469618,-86.507314 32.469795,-86.507425 32.46983,-86.507741 32.469927)\r\n500;520;all;Autauga County 40;Autauga;AL;36022;LINESTRING(-86.416998 32.588875,-86.416451 32.588965,-86.41596 32.589041,-86.41529 32.58913,-86.415209 32.589144)\r\n504;508;even;Hallmark Dr;Autauga;AL;36067;LINESTRING(-86.462705 32.453773,-86.462698 32.453728,-86.462663 32.453515,-86.462646 32.453302,-86.462647 32.453232,-86.462643 32.453224)\r\n503;507;odd;Hallmark Dr;Autauga;AL;36067;LINESTRING(-86.462514 32.453805,-86.4625 32.453756,-86.462463 32.453533,-86.462446 32.453308,-86.462445 32.453238,-86.462449 32.453238)\r\n1900;1904;even;Denny Dr;Autauga;AL;36022;LINESTRING(-86.415159 32.589113,-86.415128 32.588919,-86.415087 32.588559,-86.415066 32.588325)\r\n1901;1903;odd;Denny Dr;Autauga;AL;36022;LINESTRING(-86.414966 32.589137,-86.41493 32.588939,-86.414891 32.588573,-86.414872 32.588337)\r\n100;198;even;Montview Ct;Autauga;AL;36066;LINESTRING(-86.440676 32.476009,-86.440597 32.475955,-86.440543 32.475906,-86.44046 32.475807,-86.440431 32.475752,-86.440384 32.475622,-86.440368 32.475555,-86.440361 32.475534)\r\n101;199;odd;Montview Ct;Autauga;AL;36066;LINESTRING(-86.440558 32.476139,-86.440473 32.476087,-86.440377 32.47603,-86.440278 32.475893,-86.440233 32.475814,-86.440188 32.475662,-86.440168 32.475583,-86.440168 32.475555)\r\n1601;1701;all;Childers Ln;Autauga;AL;36008;LINESTRING(-86.570285 32.500081,-86.570408 32.500061,-86.570603 32.500113,-86.570755 32.500197,-86.570832 32.500237,-86.571176 32.50045,-86.571241 32.500484,-86.571478 32.50058,-86.571616 32.500686,-86.571742 32.500784,-86.571835 32.50085)\r\n1300;1398;even;Joffre Ruckertown Rd;Autauga;AL;36067;LINESTRING(-86.633324 32.563336,-86.633272 32.563294,-86.633158 32.563261,-86.633054 32.563243,-86.632956 32.563229,-86.632857 32.563229,-86.630949 32.563319,-86.630261 32.563341,-86.627441 32.563413,-86.627293 32.563411)\r\n1301;1399;odd;Joffre Ruckertown Rd;Autauga;AL;36067;LINESTRING(-86.633212 32.56347,-86.63317 32.563456,-86.633098 32.563429,-86.633016 32.563411,-86.632934 32.563401,-86.632857 32.563393,-86.630959 32.563485,-86.630267 32.563505,-86.627441 32.563579,-86.627289 32.563575)\r\n508;598;even;Whispering Wind Way;Autauga;AL;36022;LINESTRING(-86.46882 32.599906,-86.468881 32.599647,-86.468861 32.599063)\r\n501;599;odd;Whispering Wind Way;Autauga;AL;36022;LINESTRING(-86.468628 32.599877,-86.468673 32.599633,-86.468666 32.599066)\r\n2006;2098;even;Oak Brook Ln;Autauga;AL;36022;LINESTRING(-86.461153 32.672722,-86.461178 32.672788,-86.461269 32.673059,-86.46135 32.673362)\r\n2001;2099;odd;Oak Brook Ln;Autauga;AL;36022;LINESTRING(-86.461337 32.672666,-86.46137 32.672736,-86.461465 32.673017,-86.461541 32.673327)\r\n2271;2201;odd;Blossom Rd;Autauga;AL;36003;LINESTRING(-86.645463 32.43736,-86.645339 32.437384,-86.645011 32.437434,-86.644844 32.437453,-86.644306 32.437498,-86.644279 32.437501)\r\n2270;2200;even;Blossom Rd;Autauga;AL;36003;LINESTRING(-86.645513 32.437519,-86.645383 32.437552,-86.645041 32.4376,-86.644866 32.437619,-86.644322 32.437666,-86.64429 32.437666)\r\n1532;1550;all;Kimberly Ln;Autauga;AL;36066;LINESTRING(-86.45267 32.528628,-86.452676 32.528688,-86.452692 32.528897,-86.452689 32.52953)\r\n398;300;all;Larry Ct;Autauga;AL;36067;LINESTRING(-86.490162 32.436579,-86.490174 32.436598,-86.490184 32.436677,-86.490189 32.436755,-86.490196 32.436842,-86.490179 32.436912,-86.490128 32.436996,-86.490052 32.437016,-86.489972 32.437038,-86.489792 32.437039,-86.489667 32.437033,-86.489612 32.437009,-86.48958 32.43698,-86.489529 32.436944,-86.489522 32.436895,-86.489484 32.43682,-86.489473 32.436789)\r\n599;501;odd;Wisteria Rd;Autauga;AL;36067;LINESTRING(-86.45666 32.476337,-86.456658 32.475979,-86.456675 32.475772,-86.456722 32.475576,-86.456775 32.475453,-86.45688 32.47526,-86.457114 32.474878,-86.457289 32.474584)\r\n598;500;even;Wisteria Rd;Autauga;AL;36067;LINESTRING(-86.456465 32.476338,-86.45646 32.475975,-86.456467 32.47575,-86.45652 32.475526,-86.456591 32.475385,-86.456702 32.475186,-86.45694 32.474802,-86.457115 32.47451)\r\n136;152;even;First St;Autauga;AL;36067;LINESTRING(-86.472018 32.458075,-86.471639 32.458046,-86.471382 32.458032,-86.471197 32.458017)\r\n123;199;odd;First St;Autauga;AL;36067;LINESTRING(-86.472001 32.458239,-86.471625 32.458212,-86.471366 32.458198,-86.471178 32.458181)\r\n1172;1298;even;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.701455 32.52245,-86.701507 32.522812,-86.701525 32.523025,-86.701531 32.523237,-86.701523 32.523375,-86.701498 32.52358,-86.701476 32.523697)\r\n701;1175;odd;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.701648 32.522429,-86.701705 32.522796,-86.701725 32.523017,-86.701727 32.523239,-86.701723 32.523387,-86.701698 32.523604,-86.701668 32.523726)\r\n516;598;even;Mossy Oak Ridge;Autauga;AL;36066;LINESTRING(-86.429676 32.468334,-86.429719 32.468457,-86.429842 32.468659,-86.429911 32.46875,-86.430055 32.468885,-86.430143 32.468939)\r\n519;599;odd;Mossy Oak Ridge;Autauga;AL;36066;LINESTRING(-86.42986 32.46828,-86.429911 32.468389,-86.43002 32.468571,-86.430077 32.468642,-86.430199 32.468757,-86.430267 32.468811)\r\n998;900;all;Autauga County 24;Autauga;AL;36091;LINESTRING(-86.59918 32.688739,-86.599075 32.688804,-86.59885 32.688921,-86.598547 32.689064,-86.598458 32.689094,-86.598289 32.689142,-86.598114 32.689171,-86.59752 32.689234,-86.597105 32.689297,-86.596862 32.689344,-86.596709 32.689386,-86.596487 32.689469,-86.596352 32.689538,-86.596163 32.689665,-86.59586 32.689908,-86.595737 32.690019)\r\n2010;2102;even;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.665853 32.633194,-86.665846 32.633226,-86.665839 32.633265,-86.665747 32.633837,-86.665695 32.634267,-86.665668 32.634845,-86.665666 32.635426,-86.665679 32.63724)\r\n2101;2121;odd;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.666045 32.633221,-86.66604 32.633252,-86.666033 32.633289,-86.665943 32.633857,-86.665895 32.634279,-86.665866 32.634849,-86.665862 32.635426,-86.665874 32.637239)\r\n100;198;even;S Nichols St;Autauga;AL;36066;LINESTRING(-86.446845 32.46587,-86.446623 32.465183)\r\n101;199;odd;S Nichols St;Autauga;AL;36066;LINESTRING(-86.446658 32.465914,-86.446436 32.465227)\r\n1373;1301;odd;Bluejays Pl;Autauga;AL;36067;LINESTRING(-86.420172 32.431571,-86.420179 32.431341)\r\n1374;1300;even;Bluejays Pl;Autauga;AL;36067;LINESTRING(-86.419978 32.431566,-86.419985 32.431336)\r\n799;725;odd;Hillcrest Dr;Autauga;AL;36067;LINESTRING(-86.486991 32.488624,-86.48701 32.488014)\r\n798;730;even;Hillcrest Dr;Autauga;AL;36067;LINESTRING(-86.486796 32.48862,-86.486815 32.48801)\r\n1701;1799;odd;Edinburgh St;Autauga;AL;36066;LINESTRING(-86.431584 32.476972,-86.431572 32.476758,-86.431571 32.476549,-86.431584 32.476495,-86.431603 32.476448,-86.431654 32.476383,-86.431725 32.476333,-86.431846 32.47629,-86.431998 32.476267,-86.43233 32.476244,-86.432577 32.476238,-86.432732 32.476252,-86.432793 32.476266,-86.432917 32.476317,-86.43302 32.476393,-86.433103 32.476491,-86.433204 32.476674,-86.433301 32.476896)\r\n1700;1798;even;Edinburgh St;Autauga;AL;36066;LINESTRING(-86.43139 32.476981,-86.431374 32.476764,-86.431367 32.476541,-86.431374 32.476453,-86.431411 32.476368,-86.431486 32.476265,-86.431605 32.476167,-86.431794 32.476114,-86.431976 32.476099,-86.43232 32.476076,-86.432581 32.47607,-86.432762 32.476078,-86.432861 32.476094,-86.433037 32.476161,-86.433182 32.476271,-86.433289 32.476403,-86.433392 32.476612,-86.433484 32.476841)\r\n675;649;odd;Lower Kingston Rd;Autauga;AL;36067;LINESTRING(-86.486261 32.46992,-86.4862 32.469868,-86.485845 32.46956,-86.485763 32.469487)\r\n698;656;even;Lower Kingston Rd;Autauga;AL;36067;LINESTRING(-86.486124 32.470037,-86.48606 32.469984,-86.485705 32.469674,-86.485622 32.469601)\r\n1400;1572;even;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.648438 32.580945,-86.64842 32.581151,-86.648423 32.581349,-86.648383 32.582857,-86.648357 32.583508,-86.648356 32.583806,-86.648375 32.584175,-86.648402 32.584474,-86.648452 32.58477,-86.648504 32.584989,-86.648604 32.585345,-86.648843 32.586046,-86.649128 32.586963,-86.649697 32.588864,-86.649958 32.589644,-86.650138 32.590269,-86.65056 32.591585,-86.651 32.592992,-86.651168 32.593555,-86.651435 32.5946,-86.651588 32.595239,-86.651836 32.59624,-86.65188 32.596457,-86.651903 32.596595)\r\n1401;1553;odd;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.648632 32.580955,-86.64862 32.581155,-86.648619 32.581351,-86.648579 32.582861,-86.648555 32.58351,-86.648554 32.583802,-86.648573 32.584165,-86.648602 32.584456,-86.64865 32.584742,-86.648698 32.584953,-86.648796 32.585303,-86.649033 32.586002,-86.649318 32.586921,-86.649887 32.58882,-86.65015 32.589602,-86.65033 32.590227,-86.650748 32.591543,-86.65119 32.59295,-86.651362 32.593517,-86.651627 32.594566,-86.65178 32.595205,-86.65203 32.596208,-86.652078 32.596431,-86.652096 32.596574)\r\n100;198;even;Inge Pl;Autauga;AL;36066;LINESTRING(-86.425631 32.478164,-86.425629 32.477926,-86.425643 32.477714,-86.425658 32.477636,-86.425679 32.477594,-86.425702 32.477566,-86.425742 32.477543,-86.425788 32.477524,-86.425808 32.477522)\r\n101;199;odd;Inge Pl;Autauga;AL;36066;LINESTRING(-86.425436 32.478166,-86.425431 32.477922,-86.425443 32.4777,-86.425454 32.4776,-86.425477 32.477512,-86.425542 32.477434,-86.425644 32.477367,-86.425774 32.47735,-86.425827 32.477358)\r\n130;164;even;Palmer Rd;Autauga;AL;36003;LINESTRING(-86.684017 32.441866,-86.684025 32.441998,-86.684087 32.442658,-86.684194 32.44353,-86.684207 32.443671,-86.684214 32.443813,-86.684208 32.444101,-86.684187 32.444355)\r\n147;199;odd;Palmer Rd;Autauga;AL;36003;LINESTRING(-86.684211 32.441857,-86.684221 32.441986,-86.684283 32.442642,-86.68439 32.443514,-86.684405 32.443661,-86.68441 32.443811,-86.684408 32.444109,-86.684381 32.444367)\r\n726;798;all;Hillcrest Cir;Autauga;AL;36067;LINESTRING(-86.486765 32.487964,-86.486634 32.48796,-86.486469 32.487964,-86.486408 32.487977,-86.486378 32.487993,-86.486354 32.488016,-86.486334 32.48806,-86.486323 32.488123,-86.48634 32.488606,-86.486351 32.488619,-86.486376 32.488636,-86.486434 32.48865,-86.486746 32.48866)\r\n299;201;odd;Walker St;Autauga;AL;36066;LINESTRING(-86.449155 32.470648,-86.448913 32.470535,-86.448355 32.470288)\r\n298;200;even;Walker St;Autauga;AL;36066;LINESTRING(-86.449061 32.470792,-86.448821 32.470681,-86.448265 32.470433)\r\n317;499;all;Autauga County 1;Autauga;AL;36749;LINESTRING(-86.850614 32.505063,-86.850596 32.505161,-86.850534 32.505379,-86.850438 32.505661,-86.850328 32.505941,-86.850203 32.506217,-86.848897 32.508918,-86.848685 32.5094,-86.848645 32.509496)\r\n199;101;odd;Bonanza Ct;Autauga;AL;36067;LINESTRING(-86.461155 32.454025,-86.461305 32.45402,-86.461814 32.454017,-86.46199 32.454011,-86.462414 32.453982,-86.462487 32.453985)\r\n198;100;even;Bonanza Ct;Autauga;AL;36067;LINESTRING(-86.461142 32.453861,-86.461299 32.45385,-86.46181 32.453849,-86.461978 32.453843,-86.462412 32.453816,-86.462498 32.453821)\r\n1577;1583;all;Rolling Hills Dr;Autauga;AL;36067;LINESTRING(-86.53817 32.446971,-86.538499 32.446983,-86.539357 32.447009,-86.540313 32.44704,-86.541074 32.447065,-86.541932 32.447087,-86.542794 32.447101,-86.544502 32.447092)\r\n900;998;even;Gillespie St;Autauga;AL;36066;LINESTRING(-86.45055 32.463271,-86.449713 32.463275,-86.449535 32.463287,-86.449358 32.463313,-86.448776 32.463443,-86.448533 32.46351,-86.447974 32.463643)\r\n901;999;odd;Gillespie St;Autauga;AL;36066;LINESTRING(-86.450552 32.463435,-86.449723 32.463445,-86.449561 32.463457,-86.449402 32.463481,-86.448832 32.463605,-86.448589 32.46367,-86.448026 32.463801)\r\n1229;1259;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.441126 32.44964,-86.440814 32.449364,-86.440324 32.448947)\r\n1701;1799;odd;Johnston Rd;Autauga;AL;36067;LINESTRING(-86.554322 32.535912,-86.554323 32.535911,-86.554064 32.535907,-86.553887 32.535918,-86.553719 32.535942,-86.553554 32.535957,-86.553302 32.535969,-86.553221 32.53597,-86.553048 32.535965,-86.55253 32.535977,-86.552422 32.535976)\r\n1700;1798;even;Johnston Rd;Autauga;AL;36067;LINESTRING(-86.554326 32.536076,-86.554323 32.536077,-86.55407 32.536077,-86.553911 32.536088,-86.553745 32.53611,-86.55357 32.536123,-86.553308 32.536139,-86.553217 32.536138,-86.553046 32.536131,-86.552532 32.536143,-86.55242 32.536141)\r\n328;398;all;Autauga County 4;Autauga;AL;36067;LINESTRING(-86.467268 32.430578,-86.467037 32.430483,-86.466884 32.430417,-86.466587 32.430276,-86.46637 32.430161,-86.465944 32.429917,-86.465663 32.429745,-86.465635 32.429731)\r\n1213;1201;odd;Yorkshire Dr;Autauga;AL;36067;LINESTRING(-86.472843 32.496088,-86.473398 32.495664,-86.473468 32.495603,-86.47353 32.49553,-86.473576 32.495446,-86.473593 32.495358,-86.473603 32.495277,-86.473603 32.494615,-86.473593 32.493523,-86.473599 32.493398)\r\n1220;1200;even;Yorkshire Dr;Autauga;AL;36067;LINESTRING(-86.472712 32.495967,-86.473256 32.495542,-86.473306 32.495493,-86.473346 32.495442,-86.473372 32.49539,-86.473391 32.495332,-86.473399 32.495267,-86.473409 32.494615,-86.473395 32.493519,-86.473404 32.49339)\r\n3800;3898;all;Goode Bluff Trl;Autauga;AL;36703;LINESTRING(-86.80682 32.377484,-86.809207 32.377397,-86.809969 32.377689,-86.81018 32.377706)\r\n1501;1599;all;McAfee Rd;Autauga;AL;36067;LINESTRING(-86.537849 32.42465,-86.535988 32.42466)\r\n2034;2098;all;Autauga County 63;Autauga;AL;36067;LINESTRING(-86.577848 32.569545,-86.577949 32.570198,-86.577981 32.570484,-86.578 32.570773,-86.578036 32.571791,-86.578033 32.572226,-86.578035 32.572738,-86.578026 32.573465,-86.57803 32.574194,-86.578051 32.575501)\r\n326;304;all;N Autauga St;Autauga;AL;36003;LINESTRING(-86.651008 32.428288,-86.6514 32.428794)\r\n712;798;even;Ethan Ln;Autauga;AL;36067;LINESTRING(-86.551526 32.551503,-86.551535 32.551506,-86.552032 32.551471,-86.552705 32.551423,-86.553241 32.551415,-86.553695 32.551439,-86.553984 32.551373,-86.554197 32.551345,-86.554734 32.551382,-86.555036 32.551409,-86.555251 32.551455,-86.555335 32.551516,-86.555397 32.551623,-86.555424 32.551919,-86.555357 32.5529,-86.555282 32.552961,-86.555158 32.55303,-86.555013 32.553053,-86.552286 32.553085,-86.552035 32.553351,-86.552041 32.55373,-86.552036 32.55417)\r\n715;799;odd;Ethan Ln;Autauga;AL;36067;LINESTRING(-86.551528 32.551339,-86.551529 32.551336,-86.552016 32.551307,-86.552695 32.551253,-86.553245 32.551247,-86.553673 32.551261,-86.553944 32.551201,-86.554191 32.551177,-86.554752 32.551216,-86.555064 32.551241,-86.555359 32.551271,-86.555517 32.551402,-86.555621 32.551575,-86.55562 32.551919,-86.555585 32.553006,-86.555404 32.553097,-86.555248 32.55322,-86.555023 32.553223,-86.5524 32.553281,-86.552267 32.553423,-86.552237 32.553734,-86.552231 32.554171)\r\n3701;3799;all;US Hwy 82;Autauga;AL;36006;LINESTRING(-86.768617 32.655699,-86.768889 32.656159,-86.769682 32.657465,-86.770281 32.658467,-86.770456 32.658758,-86.770853 32.6594,-86.771235 32.660049,-86.771552 32.66057)\r\n101;121;all;Barkley St;Autauga;AL;36066;LINESTRING(-86.425572 32.495706,-86.425904 32.495712)\r\n1414;1438;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.515461 32.472545,-86.515798 32.472663,-86.517715 32.473266)\r\n699;605;odd;Webb Dr;Autauga;AL;36067;LINESTRING(-86.486447 32.503766,-86.486422 32.503828,-86.486415 32.503909,-86.486413 32.50399,-86.486422 32.504142,-86.486441 32.504219,-86.486483 32.504366,-86.48654 32.504508,-86.486663 32.504772,-86.486701 32.504889,-86.486668 32.504997,-86.486604 32.505085,-86.486137 32.505341,-86.485998 32.505394,-86.485931 32.50541,-86.485775 32.505433,-86.485276 32.505474,-86.485112 32.505482,-86.484269 32.505448,-86.484021 32.505421,-86.483945 32.505408,-86.483873 32.505389,-86.483808 32.505364,-86.483677 32.505294,-86.48349 32.505162,-86.48337 32.50505,-86.483259 32.504995)\r\n698;604;even;Webb Dr;Autauga;AL;36067;LINESTRING(-86.486636 32.503807,-86.486626 32.50386,-86.486615 32.503921,-86.486611 32.503986,-86.486626 32.50412,-86.486637 32.504183,-86.486677 32.504318,-86.486728 32.504448,-86.486865 32.504718,-86.486899 32.504883,-86.486882 32.505061,-86.486774 32.505225,-86.486235 32.505495,-86.48607 32.505558,-86.485975 32.505584,-86.485799 32.505599,-86.48529 32.505642,-86.485112 32.505646,-86.484251 32.505618,-86.483989 32.505589,-86.483897 32.505574,-86.483805 32.505553,-86.48371 32.505522,-86.483555 32.505434,-86.48335 32.505288,-86.483232 32.505188,-86.48315 32.505131)\r\n499;401;odd;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.471898 32.468757,-86.471926 32.468433,-86.472038 32.467463)\r\n498;400;even;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.471704 32.468745,-86.47173 32.468419,-86.471844 32.467447)\r\n1242;1298;even;Conestoga Wagon Trl;Autauga;AL;36067;LINESTRING(-86.503936 32.50181,-86.505962 32.501758)\r\n1243;1299;odd;Conestoga Wagon Trl;Autauga;AL;36067;LINESTRING(-86.50393 32.501645,-86.505956 32.501593)\r\n1438;1496;even;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.467179 32.504514,-86.467168 32.504771,-86.467171 32.508018,-86.467162 32.50816,-86.467154 32.508228,-86.467123 32.508362,-86.467002 32.5087,-86.466856 32.509038,-86.46667 32.509438,-86.466537 32.509704,-86.466432 32.5099,-86.466132 32.510419,-86.466065 32.510556,-86.466002 32.510696,-86.465949 32.510839,-86.465883 32.511125,-86.465821 32.511431)\r\n1439;1477;odd;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.467373 32.504519,-86.467366 32.504773,-86.467369 32.508022,-86.467364 32.508174,-86.467352 32.508252,-86.467323 32.508404,-86.46719 32.508754,-86.46704 32.509098,-86.466852 32.509502,-86.466717 32.50977,-86.46661 32.50997,-86.466314 32.510489,-86.466249 32.510618,-86.466192 32.51075,-86.466147 32.510881,-86.466077 32.511157,-86.466013 32.51146)\r\n1399;1301;odd;Walter St;Autauga;AL;36067;LINESTRING(-86.506596 32.469508,-86.506607 32.469475,-86.506635 32.469348,-86.50664 32.469267,-86.506634 32.469019,-86.506629 32.468532)\r\n200;296;even;Walter St;Autauga;AL;36067;LINESTRING(-86.506406 32.469472,-86.506411 32.469443,-86.506433 32.469328,-86.50644 32.469263,-86.50644 32.469021,-86.506434 32.468533)\r\n1099;1001;odd;Ridge Ter;Autauga;AL;36066;LINESTRING(-86.443947 32.500167,-86.443992 32.50019,-86.444106 32.500177,-86.444694 32.500075,-86.445955 32.499882,-86.446178 32.499843)\r\n1098;1000;even;Ridge Ter;Autauga;AL;36066;LINESTRING(-86.444021 32.500015,-86.444024 32.500008,-86.444076 32.500007,-86.444658 32.499913,-86.445919 32.499718,-86.44614 32.499682)\r\n100;198;even;Louise Ct;Autauga;AL;36067;LINESTRING(-86.453241 32.449988,-86.453226 32.449971,-86.453157 32.449899)\r\n101;199;odd;Louise Ct;Autauga;AL;36067;LINESTRING(-86.453092 32.450094,-86.453072 32.450077,-86.453003 32.45)\r\n499;383;odd;Autauga County 56;Autauga;AL;36051;LINESTRING(-86.428559 32.685503,-86.428726 32.685649,-86.428902 32.685811,-86.429037 32.685912,-86.429115 32.68596,-86.429198 32.685999,-86.429283 32.686031,-86.429677 32.68617,-86.430059 32.686323,-86.430507 32.686527,-86.430644 32.686602,-86.4307 32.686641,-86.430812 32.686737,-86.43086 32.686787,-86.430951 32.686901,-86.430989 32.686957,-86.431097 32.687154,-86.431183 32.687288,-86.431236 32.687353,-86.431295 32.687418,-86.431362 32.687476,-86.431437 32.687529,-86.431515 32.687575,-86.431599 32.687614,-86.431766 32.687677,-86.431856 32.6877,-86.431946 32.687718,-86.432039 32.687733,-86.432132 32.687739,-86.432225 32.687739,-86.432319 32.687737,-86.432497 32.68771,-86.433077 32.687596,-86.433235 32.687578,-86.43331 32.687572,-86.433385 32.687578,-86.43346 32.687588,-86.433534 32.687602,-86.433606 32.687622,-86.433676 32.687646,-86.433744 32.687677,-86.433809 32.68771,-86.433872 32.687749,-86.433929 32.687791,-86.433985 32.687836,-86.434661 32.68847,-86.43482 32.688633,-86.435077 32.688917,-86.435267 32.68915,-86.435485 32.689452,-86.436081 32.690324,-86.436257 32.690576,-86.436406 32.690759,-86.436573 32.690935,-86.436703 32.69104,-86.436776 32.691089,-86.436922 32.691178,-86.437079 32.69125,-86.437236 32.691318,-86.437402 32.691375,-86.437577 32.691416,-86.437756 32.691439,-86.437935 32.691443,-86.438111 32.69144,-86.438374 32.691423,-86.438712 32.691381,-86.438787 32.691375,-86.43886 32.69138,-86.438933 32.691389,-86.439001 32.691406,-86.439065 32.691428,-86.439131 32.691459,-86.439189 32.691496,-86.439304 32.691585,-86.439413 32.691688,-86.440148 32.692479,-86.440405 32.692769,-86.440623 32.692996,-86.440797 32.693165,-86.44093 32.693271,-86.441025 32.693325,-86.441078 32.69336,-86.441158 32.693403,-86.44132 32.69347,-86.441559 32.693557,-86.441804 32.69363,-86.442134 32.693721,-86.442154 32.693721)\r\n498;456;even;Autauga County 56;Autauga;AL;36051;LINESTRING(-86.428699 32.685388,-86.428868 32.685535,-86.429044 32.685687,-86.429165 32.685778,-86.429225 32.685814,-86.429292 32.685847,-86.429363 32.685877,-86.429759 32.686016,-86.430149 32.686173,-86.430609 32.686379,-86.430762 32.686462,-86.430838 32.686511,-86.430966 32.686623,-86.431024 32.686685,-86.431125 32.686811,-86.431169 32.686881,-86.431277 32.687078,-86.431357 32.687198,-86.4314 32.687253,-86.431449 32.687304,-86.431502 32.68735,-86.431561 32.687393,-86.431623 32.687429,-86.431689 32.68746,-86.431838 32.687515,-86.43191 32.687536,-86.431988 32.687552,-86.432065 32.687563,-86.432142 32.687569,-86.432221 32.687571,-86.432297 32.687565,-86.432457 32.687544,-86.433039 32.687426,-86.433217 32.687406,-86.433312 32.687406,-86.433405 32.68741,-86.433498 32.687418,-86.433588 32.687438,-86.433676 32.68746,-86.433762 32.687492,-86.433846 32.687527,-86.433923 32.68757,-86.433996 32.687615,-86.434069 32.687665,-86.434131 32.687722,-86.434813 32.68836,-86.434976 32.688529,-86.435239 32.688817,-86.435435 32.689058,-86.435655 32.689368,-86.436251 32.69024,-86.436427 32.690484,-86.436568 32.690657,-86.436725 32.690817,-86.436839 32.690912,-86.436898 32.690953,-86.437032 32.691032,-86.437173 32.691102,-86.43732 32.691162,-86.437468 32.691211,-86.437621 32.691246,-86.437776 32.691267,-86.437937 32.691277,-86.438101 32.691272,-86.438352 32.691255,-86.438688 32.691215,-86.438781 32.691207,-86.438878 32.691208,-86.438973 32.691219,-86.439069 32.691238,-86.439159 32.691272,-86.439241 32.691315,-86.439321 32.69136,-86.439452 32.691465,-86.439567 32.69158,-86.440304 32.692377,-86.440561 32.692665,-86.440775 32.692888,-86.440943 32.693045,-86.441062 32.693137,-86.441141 32.693191,-86.44119 32.693218,-86.441258 32.693253,-86.441404 32.693316,-86.441633 32.693399,-86.441868 32.693472,-86.442188 32.693555,-86.442197 32.69356)\r\n198;124;all;Walnut St;Autauga;AL;36067;LINESTRING(-86.47892 32.467488,-86.478604 32.467221,-86.478477 32.467136,-86.478339 32.467062,-86.478305 32.467045)\r\n1200;1204;all;Kingston Green Dr;Autauga;AL;36067;LINESTRING(-86.476364 32.489266,-86.476249 32.48982)\r\n3353;3301;odd;Motley Dr;Autauga;AL;36003;LINESTRING(-86.747814 32.493699,-86.747798 32.493705,-86.747685 32.493787,-86.747547 32.493871,-86.747405 32.493963,-86.747268 32.494068,-86.747206 32.494136,-86.747111 32.49427,-86.746963 32.49454,-86.746659 32.495145,-86.746473 32.495473,-86.746433 32.495528,-86.746287 32.495697,-86.746178 32.495805,-86.745851 32.496146,-86.745745 32.496266,-86.745552 32.496508,-86.745451 32.496621,-86.745285 32.496787,-86.74517 32.496892,-86.744926 32.497096,-86.744802 32.497189,-86.744633 32.497308)\r\n3330;3300;even;Motley Dr;Autauga;AL;36003;LINESTRING(-86.747959 32.493809,-86.747942 32.493833,-86.747805 32.493921,-86.747667 32.494005,-86.747537 32.494093,-86.747422 32.494188,-86.747376 32.494236,-86.747291 32.494352,-86.747145 32.494608,-86.746841 32.495213,-86.746651 32.495553,-86.746605 32.495624,-86.746445 32.495803,-86.74633 32.495913,-86.746007 32.49625,-86.745907 32.496364,-86.745714 32.496606,-86.745607 32.496727,-86.745433 32.496899,-86.745312 32.497008,-86.745064 32.49722,-86.74493 32.497317,-86.744757 32.497435)\r\n654;648;all;2nd St;Autauga;AL;36703;LINESTRING(-86.794543 32.390209,-86.794455 32.390797,-86.794407 32.391091)\r\n1299;1249;odd;Plum St;Autauga;AL;36066;LINESTRING(-86.439622 32.466584,-86.43973 32.466393,-86.439808 32.466271,-86.439896 32.466156,-86.439943 32.466108,-86.439991 32.466077,-86.440189 32.466003,-86.440338 32.465982,-86.440507 32.465975,-86.440852 32.465946,-86.441112 32.46591,-86.441286 32.465872,-86.441531 32.465797,-86.441747 32.465715)\r\n1298;1248;even;Plum St;Autauga;AL;36066;LINESTRING(-86.439446 32.466515,-86.43955 32.466317,-86.439636 32.466185,-86.43973 32.466056,-86.439789 32.46599,-86.439865 32.465919,-86.440133 32.465819,-86.440324 32.465814,-86.440493 32.465807,-86.440826 32.465778,-86.44107 32.465742,-86.441226 32.465708,-86.441457 32.465639,-86.441669 32.465564)\r\n643;401;odd;Clarks Landing Rd;Autauga;AL;36003;LINESTRING(-86.639455 32.424303,-86.639677 32.424517,-86.639846 32.424685,-86.639968 32.424796,-86.640168 32.42497,-86.640369 32.425034,-86.640486 32.425029,-86.640585 32.425014,-86.640678 32.424985,-86.641388 32.424711,-86.641628 32.424618,-86.641859 32.424504,-86.642148 32.424344,-86.642214 32.424317,-86.64231 32.424285)\r\n98;2;even;Clarks Landing Rd;Autauga;AL;36003;LINESTRING(-86.639601 32.424195,-86.639823 32.424409,-86.639994 32.424573,-86.64011 32.424676,-86.64029 32.424806,-86.640411 32.424846,-86.640468 32.424851,-86.640535 32.424842,-86.640604 32.424825,-86.641306 32.424561,-86.641534 32.424466,-86.641753 32.42436,-86.642046 32.42419,-86.642138 32.424155,-86.64225 32.424129)\r\n1927;1945;all;Tara Dr;Autauga;AL;36066;LINESTRING(-86.414947 32.453639,-86.414857 32.453604,-86.414602 32.453516,-86.414241 32.45343,-86.413853 32.453353,-86.413239 32.453282,-86.412905 32.453238,-86.412359 32.453175)\r\n599;505;odd;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.471756 32.470286,-86.471765 32.470154,-86.471794 32.469795,-86.471798 32.469748)\r\n600;500;even;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.471562 32.470278,-86.471569 32.470144,-86.471598 32.469781,-86.471605 32.469732)\r\n214;200;all;S Washington St;Autauga;AL;36003;LINESTRING(-86.654447 32.430307,-86.654719 32.430656)\r\n100;198;even;Grouby Airport Rd;Autauga;AL;36067;LINESTRING(-86.507766 32.436915,-86.504597 32.436963)\r\n143;199;odd;Grouby Airport Rd;Autauga;AL;36067;LINESTRING(-86.50777 32.437079,-86.504601 32.437127)\r\n1700;1798;even;Adrian Rd;Autauga;AL;36067;LINESTRING(-86.699868 32.588329,-86.699868 32.588476,-86.699878 32.588708,-86.699915 32.588773)\r\n1701;1799;odd;Adrian Rd;Autauga;AL;36067;LINESTRING(-86.700063 32.588327,-86.700068 32.58847,-86.700092 32.588672,-86.7001 32.588721)\r\n1100;1172;even;Cooper Ave;Autauga;AL;36066;LINESTRING(-86.445842 32.462228,-86.444624 32.46223,-86.444118 32.462221)\r\n1101;1157;odd;Cooper Ave;Autauga;AL;36066;LINESTRING(-86.445842 32.462393,-86.444622 32.462396,-86.444114 32.462385)\r\n198;148;all;N Memorial Dr;Autauga;AL;36067;LINESTRING(-86.451397 32.469839,-86.451358 32.469663,-86.450862 32.467314,-86.450807 32.467099,-86.450759 32.466801)\r\n799;701;odd;Running Brook Cir;Autauga;AL;36066;LINESTRING(-86.427395 32.459884,-86.427484 32.459895,-86.428165 32.459883,-86.428512 32.459892,-86.428617 32.459887)\r\n798;700;even;Running Brook Cir;Autauga;AL;36066;LINESTRING(-86.427415 32.45972,-86.427492 32.459723,-86.428167 32.459717,-86.42851 32.459726,-86.428609 32.459723)\r\n1199;901;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.496213 32.461291,-86.495738 32.460525,-86.495244 32.459705)\r\n437;401;odd;Autauga County 9;Autauga;AL;36003;LINESTRING(-86.760463 32.424784,-86.76043 32.424822,-86.760269 32.425006,-86.760157 32.425119,-86.759919 32.425335,-86.759794 32.425434,-86.759531 32.425617,-86.758972 32.425957,-86.758119 32.426454,-86.757697 32.426711,-86.757427 32.426903,-86.7573 32.427006,-86.757175 32.427111,-86.756936 32.42733,-86.756718 32.427558,-86.756612 32.427677,-86.75642 32.427924,-86.756247 32.428184,-86.756097 32.42845,-86.756026 32.428585,-86.756003 32.428639,-86.755964 32.428723,-86.755903 32.428862,-86.755763 32.429291,-86.755725 32.429437,-86.755671 32.42973,-86.755636 32.430024,-86.755626 32.430174,-86.755623 32.430323,-86.755624 32.43047,-86.755633 32.43062,-86.755648 32.430766,-86.755692 32.431059,-86.755759 32.431349,-86.755799 32.431493,-86.755846 32.43164,-86.75602 32.432056,-86.756089 32.432197,-86.756244 32.432461,-86.756327 32.432591,-86.756415 32.432721,-86.75651 32.432846,-86.756715 32.433084,-86.756821 32.433204,-86.757549 32.433931,-86.759294 32.43565)\r\n398;314;even;Autauga County 9;Autauga;AL;36003;LINESTRING(-86.760625 32.424874,-86.760594 32.424918,-86.760425 32.42511,-86.760307 32.425231,-86.760061 32.425455,-86.759926 32.42556,-86.759655 32.425753,-86.759084 32.426093,-86.758233 32.42659,-86.757821 32.426845,-86.757561 32.427029,-86.757438 32.427126,-86.757319 32.427227,-86.757088 32.42744,-86.756874 32.427662,-86.756776 32.427775,-86.756592 32.428012,-86.756425 32.428262,-86.756277 32.42852,-86.75621 32.428649,-86.756185 32.428699,-86.756148 32.428781,-86.756095 32.428914,-86.755957 32.429331,-86.755921 32.429469,-86.755869 32.429752,-86.755834 32.430038,-86.755824 32.43018,-86.755819 32.430323,-86.755822 32.430464,-86.755831 32.430608,-86.755846 32.430748,-86.75589 32.431033,-86.755953 32.431313,-86.755991 32.431451,-86.756038 32.431588,-86.756206 32.431996,-86.756271 32.432127,-86.75642 32.432385,-86.756499 32.432509,-86.756585 32.432633,-86.756674 32.43275,-86.756873 32.432984,-86.756977 32.433098,-86.757697 32.433823,-86.759442 32.435543)\r\n179;199;all;Lancelot Cir;Autauga;AL;36067;LINESTRING(-86.473345 32.436877,-86.473352 32.436711,-86.473344 32.436461)\r\n1500;1554;all;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.604288 32.603,-86.604285 32.603284,-86.604294 32.604009,-86.604306 32.60581,-86.604304 32.606534,-86.604313 32.607979,-86.604308 32.608702,-86.604315 32.609647)\r\n1000;1098;all;Friction Dr;Autauga;AL;36067;LINESTRING(-86.418425 32.423963,-86.418457 32.423894,-86.418489 32.423837,-86.418592 32.423703)\r\n900;998;even;Loder St;Autauga;AL;36067;LINESTRING(-86.450486 32.455497,-86.450498 32.455496,-86.450072 32.455107,-86.449909 32.454949)\r\n901;999;odd;Loder St;Autauga;AL;36067;LINESTRING(-86.450369 32.455629,-86.450354 32.455628,-86.449926 32.455217,-86.449762 32.455057)\r\n529;523;odd;Jasmine Trl;Autauga;AL;36066;LINESTRING(-86.427398 32.470957,-86.427388 32.470749,-86.427387 32.470538,-86.427377 32.470043)\r\n532;526;even;Jasmine Trl;Autauga;AL;36066;LINESTRING(-86.427204 32.470966,-86.427188 32.470753,-86.427191 32.47054,-86.427182 32.470046)\r\n1301;1445;all;Calumet Pkwy;Autauga;AL;36066;LINESTRING(-86.417785 32.490155,-86.417729 32.490163,-86.41765 32.49012)\r\n100;114;all;Moses Rd;Autauga;AL;36067;LINESTRING(-86.465357 32.500299,-86.466207 32.500337)\r\n100;198;even;Crenshaw Ct;Autauga;AL;36067;LINESTRING(-86.479261 32.498192,-86.479376 32.498211)\r\n107;199;odd;Crenshaw Ct;Autauga;AL;36067;LINESTRING(-86.479298 32.49803,-86.479413 32.498049)\r\n1701;1757;all;Autauga County 31;Autauga;AL;36758;LINESTRING(-86.84907 32.629377,-86.848998 32.629412,-86.848933 32.629447,-86.848873 32.629485,-86.848819 32.629528,-86.84877 32.629575,-86.848729 32.629626,-86.848695 32.62968,-86.848668 32.629738,-86.848576 32.630018,-86.84854 32.630094,-86.848494 32.630164,-86.848439 32.630234,-86.848371 32.630294,-86.8483 32.630347,-86.848024 32.630519,-86.847903 32.630609,-86.847792 32.630709,-86.847695 32.630817,-86.847656 32.630871,-86.847588 32.630991,-86.847534 32.631119,-86.847365 32.631674,-86.847337 32.631746,-86.847306 32.631821,-86.847261 32.631891,-86.847214 32.631959,-86.847159 32.632024,-86.847098 32.632088,-86.846961 32.632192,-86.846677 32.632366,-86.846275 32.632628,-86.846084 32.632766,-86.846028 32.632812,-86.845978 32.632859,-86.845932 32.63291,-86.845895 32.632963,-86.845862 32.633019,-86.845837 32.633078,-86.845795 32.633209,-86.845762 32.633348,-86.845714 32.633508)\r\n1801;1899;all;Vida Dr;Autauga;AL;36067;LINESTRING(-86.674988 32.609411,-86.675185 32.609375,-86.675515 32.609303,-86.675693 32.609273,-86.675877 32.609274,-86.675971 32.609274,-86.676074 32.609283,-86.676242 32.609347,-86.676325 32.609382,-86.676408 32.609423,-86.676759 32.60965,-86.676959 32.609793,-86.677088 32.609895,-86.67715 32.609952,-86.677259 32.610069,-86.67736 32.610184,-86.677464 32.610289,-86.677816 32.610576,-86.677948 32.610685,-86.677937 32.610753)\r\n2001;2099;all;Hamn's Way;Autauga;AL;36022;LINESTRING(-86.414598 32.57546,-86.414578 32.575463,-86.4145 32.575446,-86.414426 32.575414,-86.414382 32.575365,-86.414329 32.575332,-86.414259 32.575239,-86.414229 32.575198,-86.414197 32.57516,-86.414165 32.575115,-86.41413 32.575075,-86.414095 32.575035,-86.414051 32.574987,-86.414007 32.574943,-86.413968 32.574902,-86.413926 32.57486,-86.413891 32.574823,-86.413858 32.574789,-86.413821 32.574756,-86.413779 32.574723,-86.413742 32.574681,-86.413708 32.57464,-86.413675 32.574597,-86.413648 32.574549,-86.413619 32.574515,-86.413588 32.574479,-86.413542 32.574404,-86.413543 32.574404)\r\n198;112;all;Jones St;Autauga;AL;36067;LINESTRING(-86.470081 32.486883,-86.470076 32.486775)\r\n201;299;all;Allenville Rd;Autauga;AL;36067;LINESTRING(-86.485774 32.466595,-86.485767 32.466654,-86.485765 32.466691,-86.485764 32.466756,-86.485775 32.466795,-86.485804 32.466843,-86.485839 32.46689,-86.485955 32.466987,-86.48608 32.467074,-86.486214 32.467151,-86.486356 32.467216,-86.486587 32.467292,-86.486745 32.46733,-86.486823 32.467344,-86.486984 32.46736,-86.487197 32.467368)\r\n1162;1198;even;E Main St;Autauga;AL;36066;LINESTRING(-86.443698 32.460286,-86.443551 32.46029,-86.442897 32.460298)\r\n1157;1189;odd;E Main St;Autauga;AL;36066;LINESTRING(-86.443707 32.460451,-86.443557 32.460458,-86.442899 32.460463)\r\n1628;1636;even;Dodgers Dr;Autauga;AL;36067;LINESTRING(-86.417154 32.429929,-86.417093 32.429902,-86.417015 32.429861,-86.416936 32.429836,-86.416864 32.429818,-86.416799 32.429796,-86.416569 32.429701)\r\n1601;1639;odd;Dodgers Dr;Autauga;AL;36067;LINESTRING(-86.417079 32.430081,-86.416999 32.430058,-86.416921 32.430019,-86.416868 32.429998,-86.416798 32.42998,-86.416715 32.429952,-86.416481 32.429847)\r\n516;574;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.524434 32.569179,-86.52479 32.5692,-86.52691 32.569339,-86.52861 32.569444,-86.529035 32.569474,-86.529461 32.569502,-86.531591 32.569618,-86.532613 32.569661,-86.53329 32.569702,-86.533628 32.569728,-86.533961 32.569765,-86.534461 32.569842,-86.534789 32.569902,-86.53544 32.570054,-86.536007 32.570203,-86.53723 32.570517,-86.539679 32.571153,-86.540923 32.571462,-86.541038 32.571491)\r\n501;597;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.524448 32.569015,-86.524804 32.569036,-86.526924 32.569175,-86.528626 32.56928,-86.529051 32.56931,-86.529475 32.569336,-86.531603 32.569452,-86.532625 32.569495,-86.533306 32.569536,-86.53365 32.569562,-86.533991 32.569599,-86.534499 32.569678,-86.534837 32.569738,-86.535496 32.569894,-86.536065 32.570045,-86.537288 32.570359,-86.539735 32.570995,-86.540981 32.571302,-86.541097 32.571334)\r\n698;500;even;Jeanette Dr;Autauga;AL;36067;LINESTRING(-86.456723 32.459466,-86.456637 32.458985,-86.456624 32.458861,-86.456602 32.457646)\r\n699;501;odd;Jeanette Dr;Autauga;AL;36067;LINESTRING(-86.456531 32.459492,-86.456437 32.459005,-86.456422 32.458869,-86.456408 32.457648)\r\n401;499;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.450612 32.462291,-86.45064 32.461438)\r\n2200;2298;even;Autauga County 46;Autauga;AL;36067;LINESTRING(-86.608885 32.517315,-86.609046 32.517301,-86.609297 32.517289,-86.609636 32.517295,-86.610493 32.517337,-86.610838 32.517335,-86.611267 32.517327,-86.611782 32.5173,-86.612886 32.517241,-86.613052 32.51724,-86.613131 32.517244,-86.613209 32.517252,-86.613282 32.517265,-86.613354 32.517284,-86.613421 32.51731,-86.613486 32.517342,-86.613549 32.517379,-86.613606 32.517422,-86.61372 32.51752,-86.613769 32.517571,-86.613911 32.517743,-86.614085 32.51798)\r\n2201;2299;odd;Autauga County 46;Autauga;AL;36067;LINESTRING(-86.60886 32.517151,-86.609028 32.517129,-86.609295 32.517123,-86.609644 32.517127,-86.610499 32.517167,-86.610836 32.517169,-86.611259 32.517159,-86.61177 32.517136,-86.61288 32.517071,-86.613056 32.517072,-86.613147 32.517074,-86.613239 32.517082,-86.613334 32.517097,-86.613426 32.517124,-86.613513 32.517154,-86.6136 32.517196,-86.613675 32.517247,-86.613746 32.517296,-86.61387 32.517406,-86.613931 32.517467,-86.614079 32.517651,-86.614251 32.517895)\r\n3901;3907;all;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.820406 32.599268,-86.822098 32.599816,-86.822149 32.599833)\r\n216;288;even;Autauga County 68 W;Autauga;AL;36022;LINESTRING(-86.502038 32.65779,-86.502815 32.657866,-86.50323 32.657921,-86.503713 32.658026,-86.504026 32.658123,-86.504256 32.658207,-86.505014 32.658528,-86.505628 32.658781,-86.506545 32.659176,-86.506854 32.659302,-86.507171 32.659416,-86.507336 32.659469,-86.507752 32.659571,-86.508177 32.659645,-86.50861 32.659687,-86.50913 32.65969,-86.509476 32.659668,-86.510326 32.659599,-86.512532 32.659445,-86.512886 32.65941)\r\n201;229;odd;Autauga County 68 W;Autauga;AL;36022;LINESTRING(-86.50206 32.657626,-86.502841 32.6577,-86.50327 32.657751,-86.503775 32.657862,-86.5041 32.657967,-86.50434 32.658053,-86.505102 32.65838,-86.505716 32.658633,-86.506633 32.659026,-86.506936 32.659148,-86.507245 32.65926,-86.5074 32.659307,-86.5078 32.659405,-86.508209 32.659475,-86.508622 32.659515,-86.509124 32.65952,-86.50946 32.659502,-86.510308 32.659433,-86.512512 32.659279,-86.512864 32.659246)\r\n1601;1699;all;Dolorosa Ln;Autauga;AL;36006;LINESTRING(-86.700989 32.658026,-86.70038 32.65805,-86.698395 32.658081,-86.698212 32.658084)\r\n1009;1001;odd;Thistle Rd;Autauga;AL;36066;LINESTRING(-86.413878 32.473121,-86.41376 32.473089,-86.413531 32.472982)\r\n1010;1000;even;Thistle Rd;Autauga;AL;36066;LINESTRING(-86.413841 32.473282,-86.413676 32.473267,-86.413428 32.473121)\r\n343;347;all;Hazel St;Autauga;AL;36067;LINESTRING(-86.467845 32.431191,-86.467484 32.431191)\r\n1700;1798;even;Planters Hill Ct;Autauga;AL;36066;LINESTRING(-86.429651 32.455237,-86.429567 32.455281,-86.429501 32.455329,-86.429299 32.455452,-86.428939 32.455626,-86.428638 32.45573)\r\n1701;1799;odd;Planters Hill Ct;Autauga;AL;36066;LINESTRING(-86.42976 32.455373,-86.429689 32.455419,-86.429625 32.455463,-86.429411 32.455598,-86.429029 32.455786,-86.428708 32.455884)\r\n100;132;even;Melmar Dr;Autauga;AL;36067;LINESTRING(-86.483646 32.482217,-86.483653 32.482252,-86.48368 32.482391,-86.483695 32.482527,-86.483683 32.48259,-86.483667 32.482654,-86.483643 32.482716,-86.483611 32.482777,-86.483573 32.482835,-86.483531 32.482889,-86.483483 32.482939,-86.483371 32.48304,-86.483186 32.483187,-86.483119 32.483243,-86.483058 32.483308,-86.483006 32.483387,-86.482961 32.483543,-86.482944 32.483625,-86.482946 32.483708,-86.482952 32.483862,-86.482967 32.483943,-86.482998 32.484027,-86.483048 32.484101,-86.483108 32.484174,-86.483186 32.484231,-86.483272 32.484279,-86.483599 32.484398,-86.483643 32.484411)\r\n125;139;odd;Melmar Dr;Autauga;AL;36067;LINESTRING(-86.483835 32.482179,-86.483849 32.482218,-86.483884 32.482369,-86.483893 32.482531,-86.483885 32.482618,-86.483863 32.4827,-86.483833 32.482778,-86.483793 32.482853,-86.483747 32.482925,-86.483693 32.482991,-86.483635 32.483053,-86.483511 32.48316,-86.483326 32.483307,-86.483275 32.483355,-86.483234 32.483404,-86.483206 32.483453,-86.483161 32.483579,-86.48315 32.483643,-86.483142 32.483706,-86.483156 32.483842,-86.483169 32.483901,-86.483192 32.483957,-86.483222 32.484007,-86.483266 32.484052,-86.483314 32.484091,-86.483372 32.484123,-86.483677 32.484244,-86.483716 32.484259)\r\n308;488;even;Kelly Botton Rd;Autauga;AL;36022;LINESTRING(-86.468481 32.634295,-86.468437 32.634341,-86.468324 32.634451,-86.467893 32.634994,-86.467712 32.635245,-86.467549 32.635502,-86.467362 32.63583,-86.467115 32.636288,-86.467037 32.636407,-86.466945 32.636518,-86.466896 32.636567,-86.46684 32.636609,-86.466782 32.636642,-86.466719 32.63667,-86.46665 32.636688,-86.46658 32.636699,-86.466509 32.636704,-86.466435 32.636696,-86.466363 32.636682,-86.466294 32.636663,-86.466227 32.636635,-86.466086 32.636564,-86.465804 32.636402,-86.465578 32.63629,-86.465205 32.636123,-86.465075 32.636047,-86.464958 32.635958,-86.464737 32.635743,-86.464552 32.635586,-86.464421 32.635485,-86.464283 32.635391,-86.464062 32.635272,-86.463839 32.635158,-86.46361 32.635057,-86.463224 32.634899,-86.462988 32.634815,-86.462508 32.63466,-86.462338 32.634615,-86.462082 32.634564,-86.461906 32.634544,-86.461728 32.634542,-86.461634 32.634542,-86.461453 32.634565,-86.461281 32.634609,-86.460883 32.634744,-86.460643 32.634809,-86.459322 32.63511,-86.459153 32.635158,-86.45899 32.635223,-86.45891 32.635265,-86.458767 32.635354,-86.458383 32.635641,-86.458114 32.635824,-86.458048 32.635875,-86.457982 32.63593,-86.457922 32.635994,-86.457827 32.636121,-86.457785 32.636191,-86.457724 32.636333,-86.457562 32.636744,-86.457533 32.636805,-86.457497 32.636863,-86.457456 32.63692,-86.457409 32.636972,-86.457358 32.637019,-86.457302 32.63706,-86.457241 32.637095,-86.457099 32.637159,-86.456951 32.63721,-86.456461 32.637338,-86.456292 32.637394,-86.456212 32.637437,-86.456133 32.637478,-86.455994 32.637574,-86.455866 32.637679,-86.455748 32.637791,-86.455487 32.638076,-86.455435 32.638125,-86.455316 32.638218,-86.455047 32.638396,-86.454917 32.638501,-86.454803 32.638615,-86.454645 32.638791,-86.45416 32.639383,-86.454008 32.639554,-86.453956 32.639606,-86.453901 32.639654,-86.453844 32.639697,-86.453782 32.639737,-86.453644 32.639811,-86.453271 32.639979,-86.453119 32.640056,-86.452974 32.640142,-86.45277 32.64028,-86.452514 32.640469,-86.452384 32.640551,-86.452246 32.640625,-86.452102 32.640688,-86.451952 32.640742,-86.45139 32.640905,-86.450984 32.641013,-86.450498 32.641154,-86.449618 32.641428,-86.449057 32.641596,-86.448817 32.641655,-86.448656 32.641687,-86.448494 32.64171,-86.448247 32.641731,-86.446716 32.641779,-86.445865 32.641826,-86.4457 32.64183,-86.445539 32.641818,-86.445378 32.641796,-86.445135 32.641749,-86.444604 32.641628)\r\n257;399;odd;Kelly Botton Rd;Autauga;AL;36022;LINESTRING(-86.468635 32.634396,-86.468591 32.634445,-86.468488 32.634555,-86.468061 32.635084,-86.467886 32.635329,-86.467727 32.635578,-86.46754 32.6359,-86.467295 32.636362,-86.467213 32.636499,-86.467105 32.636626,-86.467042 32.636685,-86.466972 32.636745,-86.466888 32.636796,-86.466797 32.63683,-86.466702 32.63686,-86.466602 32.636873,-86.466503 32.636874,-86.466405 32.636866,-86.466307 32.636852,-86.466214 32.636821,-86.466129 32.636787,-86.465978 32.636706,-86.465696 32.636546,-86.46548 32.636438,-86.465099 32.636271,-86.464945 32.636185,-86.46481 32.636078,-86.464589 32.635859,-86.464414 32.635708,-86.464291 32.635615,-86.464163 32.635531,-86.463956 32.635414,-86.463741 32.635306,-86.46352 32.635207,-86.463142 32.635053,-86.462914 32.634971,-86.462442 32.63482,-86.462286 32.634779,-86.462046 32.634734,-86.461888 32.634716,-86.461728 32.634708,-86.461654 32.634714,-86.461499 32.634735,-86.461347 32.634771,-86.460951 32.634906,-86.460699 32.634969,-86.459382 32.635272,-86.459231 32.635318,-86.459088 32.635375,-86.459024 32.635407,-86.458895 32.635488,-86.458511 32.635769,-86.458246 32.635952,-86.458188 32.635997,-86.458136 32.636044,-86.45809 32.636094,-86.458005 32.636207,-86.457973 32.636261,-86.457912 32.636389,-86.457752 32.636804,-86.457715 32.636875,-86.457675 32.636947,-86.457622 32.637016,-86.457567 32.637082,-86.457502 32.637143,-86.457428 32.637198,-86.457347 32.637243,-86.457185 32.637317,-86.457017 32.63737,-86.456529 32.6375,-86.456384 32.637552,-86.456316 32.637581,-86.456253 32.637618,-86.456128 32.637702,-86.456012 32.637797,-86.455904 32.637899,-86.455643 32.638186,-86.455579 32.638245,-86.455448 32.638348,-86.455181 32.638526,-86.455065 32.638619,-86.454959 32.638721,-86.454807 32.638889,-86.454322 32.639481,-86.454164 32.639658,-86.454106 32.639718,-86.454043 32.639776,-86.453974 32.639829,-86.453898 32.639879,-86.453746 32.639959,-86.453369 32.640127,-86.453229 32.640198,-86.453094 32.640278,-86.452898 32.64041,-86.452642 32.640601,-86.4525 32.640693,-86.452346 32.640771,-86.45219 32.640844,-86.452024 32.640902,-86.451452 32.641063,-86.451046 32.641171,-86.450564 32.64131,-86.449684 32.641584,-86.449119 32.641758,-86.448867 32.641819,-86.448696 32.641853,-86.448522 32.64188,-86.448261 32.641901,-86.446726 32.641945,-86.445875 32.641994,-86.445696 32.641998,-86.445515 32.641988,-86.445338 32.641964,-86.445085 32.641911,-86.444552 32.641787)\r\n1520;1598;even;Windy Meadows Rd;Autauga;AL;36067;LINESTRING(-86.543748 32.512874,-86.54387 32.512879,-86.544132 32.512873,-86.544986 32.512831,-86.545325 32.512822,-86.545578 32.512828,-86.546093 32.512861,-86.546271 32.512864,-86.54645 32.512855,-86.546622 32.512831,-86.546723 32.512818,-86.546889 32.512745,-86.546978 32.51271,-86.547066 32.512648,-86.547123 32.51256,-86.547132 32.512456,-86.547115 32.512353,-86.547032 32.512264)\r\n1519;1599;odd;Windy Meadows Rd;Autauga;AL;36067;LINESTRING(-86.543756 32.51271,-86.543872 32.512713,-86.544124 32.512707,-86.544978 32.512665,-86.545323 32.512656,-86.545588 32.512658,-86.546103 32.512693,-86.546267 32.512696,-86.546428 32.512685,-86.546584 32.512665,-86.546653 32.512646,-86.546797 32.512595,-86.546854 32.512562,-86.54689 32.51253,-86.546913 32.512496,-86.546936 32.512462,-86.546911 32.512429,-86.546868 32.512353)\r\n600;698;even;Linden Ln;Autauga;AL;36066;LINESTRING(-86.424808 32.472903,-86.424533 32.472912,-86.423936 32.472953,-86.422926 32.47305,-86.422735 32.473061,-86.422609 32.473048,-86.422495 32.473025,-86.422404 32.472988,-86.422283 32.472915,-86.422255 32.472899)\r\n601;699;odd;Linden Ln;Autauga;AL;36066;LINESTRING(-86.424817 32.473068,-86.424545 32.47308,-86.423956 32.473119,-86.422942 32.47322,-86.422735 32.473225,-86.422577 32.473228,-86.422427 32.473191,-86.422296 32.473146,-86.422143 32.473049,-86.422112 32.473011)\r\n102;110;even;Andiron Ct;Autauga;AL;36067;LINESTRING(-86.479492 32.44846,-86.479679 32.448268,-86.480058 32.447876,-86.480101 32.447832,-86.480409 32.447518)\r\n101;109;odd;Andiron Ct;Autauga;AL;36067;LINESTRING(-86.479342 32.448355,-86.479529 32.448164,-86.479908 32.447772,-86.479951 32.447728,-86.480259 32.447413)\r\n1700;1798;even;Honeysuckle Ridge Dr;Autauga;AL;36022;LINESTRING(-86.41334 32.529889,-86.413388 32.529876,-86.413582 32.529831,-86.413849 32.529852,-86.414334 32.529874,-86.414639 32.5299,-86.414923 32.529901,-86.41527 32.529925,-86.415925 32.530011,-86.417423 32.530186)\r\n1701;1799;odd;Honeysuckle Ridge Dr;Autauga;AL;36022;LINESTRING(-86.413225 32.529757,-86.413294 32.529698,-86.41357 32.529659,-86.413865 32.529684,-86.414348 32.529708,-86.414649 32.529728,-86.414933 32.529729,-86.415294 32.529757,-86.415953 32.529847,-86.41745 32.530024)\r\n801;899;all;Love Ln;Autauga;AL;36067;LINESTRING(-86.642586 32.539441,-86.642653 32.539398,-86.64269 32.539358,-86.642753 32.539261,-86.642773 32.539207,-86.642789 32.539068,-86.642792 32.538921,-86.642811 32.538759,-86.642883 32.538606,-86.642937 32.538534,-86.642978 32.538496)\r\n100;194;even;Autauga County 102;Autauga;AL;36066;LINESTRING(-86.458164 32.583864,-86.457708 32.583878,-86.457187 32.583871,-86.456761 32.583889,-86.454973 32.583905,-86.454835 32.583904)\r\n101;199;odd;Autauga County 102;Autauga;AL;36066;LINESTRING(-86.458172 32.584028,-86.45771 32.584044,-86.457191 32.584039,-86.456767 32.584057,-86.454973 32.584069,-86.454833 32.584068)\r\n300;422;even;Oregon Ct;Autauga;AL;36067;LINESTRING(-86.488908 32.476842,-86.48892 32.476851,-86.489108 32.476831,-86.489183 32.476826)\r\n401;423;odd;Oregon Ct;Autauga;AL;36067;LINESTRING(-86.488824 32.476693,-86.488864 32.476663,-86.489098 32.476665,-86.489172 32.476662)\r\n1600;1602;even;Tom Turner Rd;Autauga;AL;36006;LINESTRING(-86.691802 32.658052,-86.691803 32.658555,-86.691826 32.65977,-86.691837 32.660082)\r\n1601;1699;odd;Tom Turner Rd;Autauga;AL;36006;LINESTRING(-86.691997 32.658051,-86.691999 32.658553,-86.692022 32.659766,-86.692032 32.660077)\r\n1899;1801;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.7014 32.523751,-86.701244 32.523748,-86.700896 32.523779,-86.700216 32.523857,-86.69971 32.523899,-86.6992 32.523922,-86.698775 32.523927,-86.694748 32.523893)\r\n1998;1800;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.7014 32.523916,-86.701254 32.52392,-86.700918 32.523945,-86.70024 32.524023,-86.699726 32.524067,-86.699206 32.52409,-86.698775 32.524091,-86.694746 32.524057)\r\n216;256;even;Jay St;Autauga;AL;36066;LINESTRING(-86.423688 32.448485,-86.423557 32.448483,-86.423385 32.448487,-86.423255 32.448497)\r\n215;299;odd;Jay St;Autauga;AL;36066;LINESTRING(-86.423686 32.44865,-86.423559 32.448649,-86.423395 32.448655,-86.42327 32.448661)\r\n1437;1499;all;US Hwy 31;Autauga;AL;36067;LINESTRING(-86.456724 32.520936,-86.456179 32.523133)\r\n700;712;even;Criddle Rd;Autauga;AL;36067;LINESTRING(-86.551495 32.583104,-86.551702 32.583108,-86.552554 32.583116,-86.553661 32.583056,-86.553913 32.583048,-86.554076 32.583056,-86.554236 32.583073,-86.554395 32.583105,-86.554467 32.583126,-86.554622 32.583184,-86.555056 32.583368)\r\n701;761;odd;Criddle Rd;Autauga;AL;36067;LINESTRING(-86.551499 32.582939,-86.551704 32.582942,-86.552548 32.582948,-86.553651 32.58289,-86.553913 32.582884,-86.554092 32.582884,-86.554272 32.582903,-86.554453 32.582939,-86.554545 32.582968,-86.554708 32.583034,-86.555143 32.583221)\r\n1826;1844;even;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.545459 32.549701,-86.545556 32.550189,-86.545779 32.551186,-86.545883 32.551613,-86.545895 32.551655)\r\n1819;1835;odd;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.545651 32.549673,-86.54575 32.550159,-86.545971 32.551154,-86.546075 32.551577,-86.546085 32.551618)\r\n206;214;even;Hickory Ln;Autauga;AL;36066;LINESTRING(-86.447522 32.476259,-86.447495 32.476271,-86.447469 32.476293,-86.447407 32.476311,-86.447161 32.476335,-86.446982 32.476373,-86.446731 32.476449,-86.446534 32.476519)\r\n207;215;odd;Hickory Ln;Autauga;AL;36066;LINESTRING(-86.447692 32.476339,-86.447667 32.476407,-86.447565 32.476455,-86.447457 32.476491,-86.447195 32.476509,-86.44704 32.476539,-86.446801 32.476607,-86.446608 32.476672)\r\n1100;1198;even;Autauga County 4;Autauga;AL;36067;LINESTRING(-86.447524 32.42378,-86.446892 32.423782,-86.44432 32.423793,-86.443574 32.423803)\r\n701;785;odd;Autauga County 4;Autauga;AL;36067;LINESTRING(-86.447524 32.423945,-86.446892 32.423946,-86.444322 32.423959,-86.443577 32.423967)\r\n1300;1322;even;Kingston Oaks Dr;Autauga;AL;36067;LINESTRING(-86.470596 32.498897,-86.470583 32.498881,-86.470536 32.498834,-86.470497 32.498784,-86.470392 32.498603,-86.470357 32.498485,-86.470346 32.49835,-86.470363 32.497843,-86.470362 32.496428)\r\n1301;1323;odd;Kingston Oaks Dr;Autauga;AL;36067;LINESTRING(-86.47046 32.499014,-86.470433 32.498997,-86.470374 32.498938,-86.470319 32.498874,-86.470188 32.498667,-86.470145 32.498507,-86.47015 32.49835,-86.470165 32.497841,-86.470168 32.496428)\r\n500;598;even;Asbury Ct;Autauga;AL;36067;LINESTRING(-86.540612 32.468708,-86.540646 32.468657,-86.540769 32.468455,-86.540878 32.468257,-86.540906 32.468194,-86.540939 32.468153,-86.540967 32.468113)\r\n501;599;odd;Asbury Ct;Autauga;AL;36067;LINESTRING(-86.540441 32.468629,-86.540472 32.468579,-86.540591 32.468381,-86.540692 32.468191,-86.54072 32.468128,-86.540755 32.468045,-86.540828 32.467998)\r\n1199;1123;odd;Autauga County 42;Autauga;AL;36051;LINESTRING(-86.604296 32.619004,-86.604097 32.61901,-86.603184 32.619026,-86.602325 32.619027,-86.601298 32.619044,-86.60079 32.619043,-86.600626 32.619035,-86.600467 32.619019,-86.600309 32.618992,-86.600159 32.618951,-86.600013 32.618895,-86.599874 32.618827,-86.59974 32.618748,-86.599611 32.61866,-86.599488 32.618565,-86.59937 32.618465,-86.599258 32.618362,-86.598707 32.617809,-86.598478 32.617589,-86.598239 32.617379,-86.597991 32.617175,-86.596788 32.616247,-86.596401 32.615959,-86.596265 32.615866,-86.596125 32.615776,-86.595979 32.615694,-86.595686 32.61554,-86.595094 32.615252,-86.594664 32.615023,-86.594314 32.614823,-86.594178 32.61474,-86.59405 32.614654,-86.59393 32.614561,-86.593827 32.61446,-86.593695 32.614289,-86.593674 32.614264)\r\n1198;1106;even;Autauga County 42;Autauga;AL;36051;LINESTRING(-86.604304 32.619169,-86.604103 32.619176,-86.603186 32.619192,-86.602327 32.619193,-86.6013 32.61921,-86.600784 32.619213,-86.60061 32.619201,-86.600437 32.619189,-86.600257 32.61916,-86.600085 32.619111,-86.599919 32.619049,-86.599764 32.618971,-86.599618 32.618884,-86.599481 32.618788,-86.59935 32.618687,-86.599226 32.618581,-86.599108 32.618472,-86.598557 32.617917,-86.598332 32.617703,-86.598099 32.617497,-86.597855 32.617297,-86.596656 32.616371,-86.596273 32.616087,-86.596143 32.615998,-86.596009 32.615914,-86.595871 32.615834,-86.595584 32.615684,-86.594992 32.615396,-86.594556 32.615163,-86.5942 32.614959,-86.59406 32.614874,-86.593918 32.614786,-86.593786 32.614681,-86.593661 32.614568,-86.593511 32.614373,-86.593496 32.61433)\r\n765;701;odd;Glenbrooke Blvd;Autauga;AL;36066;LINESTRING(-86.422793 32.492229,-86.423109 32.492052,-86.423346 32.491964,-86.423528 32.491927,-86.423778 32.491903,-86.423977 32.491905,-86.42413 32.491926,-86.424326 32.491979,-86.424448 32.492029,-86.425049 32.492335)\r\n764;746;even;Glenbrooke Blvd;Autauga;AL;36066;LINESTRING(-86.422682 32.492094,-86.423005 32.491894,-86.42328 32.491794,-86.423494 32.491757,-86.423766 32.491729,-86.423997 32.491727,-86.424178 32.491758,-86.42441 32.491811,-86.424548 32.491885,-86.425149 32.492194)\r\n599;501;all;Langford Dr;Autauga;AL;36067;LINESTRING(-86.460588 32.428415,-86.460634 32.428566)\r\n1247;1299;all;Autauga County 19;Autauga;AL;36006;LINESTRING(-86.702694 32.527955,-86.702694 32.528578,-86.702706 32.52901,-86.702792 32.530893,-86.702796 32.530958)\r\n700;798;even;Autauga County 13;Autauga;AL;36067;LINESTRING(-86.662273 32.51792,-86.662247 32.518065,-86.662259 32.518224,-86.662304 32.518446,-86.662468 32.519165,-86.662617 32.519732,-86.662645 32.519872,-86.662662 32.52001,-86.662672 32.520294,-86.662651 32.520426,-86.662608 32.520552,-86.662539 32.520664,-86.662387 32.520815,-86.662195 32.520942,-86.661837 32.521142,-86.661555 32.521313,-86.661286 32.521494,-86.661011 32.521675,-86.660744 32.521865,-86.660619 32.521974,-86.660558 32.522032,-86.660445 32.522152,-86.660353 32.522285,-86.660236 32.52249,-86.660144 32.522702,-86.660123 32.52278,-86.660092 32.522927,-86.659994 32.523427,-86.659923 32.523705,-86.659792 32.524118)\r\n401;799;odd;Autauga County 13;Autauga;AL;36067;LINESTRING(-86.662466 32.517942,-86.662447 32.518071,-86.662461 32.518204,-86.662498 32.518416,-86.662662 32.519131,-86.662813 32.5197,-86.662841 32.519848,-86.662866 32.519998,-86.662874 32.5203,-86.662859 32.52046,-86.662806 32.520616,-86.662721 32.520766,-86.662533 32.520947,-86.662311 32.521082,-86.661949 32.52128,-86.661675 32.521447,-86.661406 32.521624,-86.661137 32.521805,-86.660882 32.521991,-86.660765 32.52209,-86.660712 32.52214,-86.660615 32.52225,-86.660531 32.522367,-86.660424 32.522556,-86.66034 32.522752,-86.660319 32.522816,-86.660286 32.522955,-86.66019 32.523459,-86.660117 32.523745,-86.659979 32.524162)\r\n171;133;odd;Autauga County 64;Autauga;AL;36022;LINESTRING(-86.478637 32.626984,-86.478774 32.626988,-86.478847 32.626995,-86.478919 32.627005,-86.479153 32.627064,-86.479304 32.627115,-86.479446 32.627176,-86.479733 32.627323,-86.480162 32.627559,-86.480315 32.627637,-86.480484 32.627701,-86.48066 32.62774,-86.480752 32.627755,-86.481602 32.627847,-86.481863 32.627872,-86.482043 32.627873,-86.482144 32.62787,-86.482208 32.627849)\r\n184;136;even;Autauga County 64;Autauga;AL;36022;LINESTRING(-86.478639 32.626819,-86.478782 32.626818,-86.478875 32.626821,-86.478969 32.626839,-86.479221 32.626902,-86.479388 32.626959,-86.479546 32.627028,-86.479839 32.627183,-86.480266 32.627415,-86.480409 32.627483,-86.480554 32.627535,-86.480706 32.627574,-86.480784 32.627587,-86.481624 32.627681,-86.481875 32.6277,-86.482037 32.627703,-86.482108 32.627694,-86.482158 32.62769)\r\n498;446;all;Danny Lynn Ct;Autauga;AL;36067;LINESTRING(-86.48754 32.469688,-86.48755 32.469735,-86.487744 32.46985,-86.487912 32.469839,-86.487998 32.469746,-86.488047 32.469637,-86.488018 32.469493,-86.487877 32.469435,-86.48776 32.469443,-86.487699 32.469449)\r\n1334;1398;all;Northington Rd;Autauga;AL;36067;LINESTRING(-86.497778 32.453222,-86.497969 32.453271,-86.498455 32.453361,-86.498559 32.453392,-86.498752 32.4534,-86.498876 32.45333,-86.49896 32.453295,-86.499005 32.453269)\r\n1642;1698;even;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.604311 32.612069,-86.604309 32.612086,-86.604315 32.613723,-86.604322 32.614084,-86.604328 32.61661,-86.604341 32.618426,-86.604338 32.618723,-86.604345 32.618961)\r\n1501;1699;odd;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.604506 32.612074,-86.604507 32.612088,-86.604511 32.613721,-86.604518 32.614082,-86.604524 32.61661,-86.604535 32.618426,-86.604534 32.618721,-86.60454 32.618957)\r\n300;306;even;Autauga County 64;Autauga;AL;36022;LINESTRING(-86.474159 32.630005,-86.474041 32.630125,-86.473696 32.630442,-86.473336 32.630755,-86.472727 32.631263,-86.472379 32.631582,-86.472159 32.631799,-86.472044 32.631898,-86.471858 32.632038,-86.47166 32.632166,-86.471311 32.632365,-86.470952 32.632549,-86.470585 32.632726,-86.47021 32.632888,-86.469903 32.633011,-86.469748 32.633083,-86.46967 32.633124,-86.469529 32.633218,-86.469404 32.633327,-86.468665 32.6341)\r\n227;255;odd;Autauga County 64;Autauga;AL;36022;LINESTRING(-86.474311 32.630109,-86.474193 32.630237,-86.47384 32.630556,-86.473476 32.630871,-86.472871 32.631379,-86.472527 32.631694,-86.472307 32.631913,-86.472184 32.632022,-86.471986 32.63217,-86.471776 32.632304,-86.471419 32.632507,-86.471052 32.632693,-86.470681 32.632876,-86.470296 32.633036,-86.469995 32.633161,-86.469852 32.633229,-86.46979 32.633264,-86.469667 32.633348,-86.469556 32.633441,-86.468816 32.634204)\r\n899;801;all;Smith Ave;Autauga;AL;36067;LINESTRING(-86.448018 32.455031,-86.447593 32.455029)\r\n683;601;odd;Autery Rd;Autauga;AL;36067;LINESTRING(-86.502633 32.530938,-86.502585 32.530949,-86.502517 32.530962,-86.502459 32.530967,-86.502453 32.530971)\r\n604;600;even;Autery Rd;Autauga;AL;36067;LINESTRING(-86.502705 32.531091,-86.502649 32.531115,-86.502551 32.531138,-86.502439 32.531143,-86.502403 32.53113)\r\n200;298;even;First St;Autauga;AL;36067;LINESTRING(-86.469986 32.457926,-86.46937 32.45788,-86.468783 32.45784,-86.468513 32.457821,-86.46766 32.457756)\r\n201;299;odd;First St;Autauga;AL;36067;LINESTRING(-86.469969 32.45809,-86.469354 32.458044,-86.468767 32.458004,-86.468497 32.457985,-86.467643 32.45792)\r\n416;498;even;Runway Dr;Autauga;AL;36022;LINESTRING(-86.437504 32.599081,-86.437429 32.59908,-86.437091 32.599107,-86.437014 32.599107,-86.436945 32.599105)\r\n413;499;odd;Runway Dr;Autauga;AL;36022;LINESTRING(-86.43751 32.599245,-86.437443 32.59925,-86.437101 32.599279,-86.437004 32.599279,-86.436926 32.599269)\r\n624;698;even;Prairie View Dr;Autauga;AL;36067;LINESTRING(-86.47684 32.496226,-86.477593 32.49625,-86.477612 32.496261,-86.477634 32.49629,-86.477648 32.496349,-86.477675 32.497299,-86.477669 32.49773,-86.477661 32.497874,-86.477664 32.497935)\r\n601;623;odd;Prairie View Dr;Autauga;AL;36067;LINESTRING(-86.476842 32.496061,-86.477663 32.496054,-86.477806 32.496133,-86.477846 32.49625,-86.477848 32.496339,-86.477871 32.497297,-86.477867 32.497734,-86.477859 32.497876,-86.477858 32.497932)\r\n1906;1998;even;Alpine Dr;Autauga;AL;36022;LINESTRING(-86.417151 32.580252,-86.417147 32.580339,-86.417153 32.580416,-86.417182 32.580567,-86.417208 32.580641,-86.417265 32.580779,-86.417382 32.581048,-86.417457 32.581249,-86.417497 32.581382,-86.417527 32.581518,-86.417556 32.581727,-86.417568 32.581866,-86.417573 32.582009,-86.417643 32.583096,-86.417726 32.583812,-86.417817 32.58453,-86.417863 32.584964,-86.417917 32.585615,-86.417949 32.585899,-86.41795 32.58611,-86.417909 32.586406,-86.417905 32.586503,-86.417909 32.586568,-86.417937 32.586656,-86.417988 32.586737,-86.418055 32.586805,-86.418446 32.587107,-86.418519 32.587146)\r\n1945;1999;odd;Alpine Dr;Autauga;AL;36022;LINESTRING(-86.417346 32.580253,-86.417349 32.580333,-86.417355 32.580396,-86.417382 32.580529,-86.4174 32.580591,-86.417451 32.580723,-86.41757 32.580994,-86.417651 32.581203,-86.417693 32.581346,-86.417725 32.581492,-86.417756 32.581711,-86.417766 32.581858,-86.417771 32.582003,-86.417841 32.583084,-86.41792 32.583796,-86.418013 32.584514,-86.418059 32.58495,-86.418115 32.585601,-86.418153 32.585889,-86.418156 32.58612,-86.418111 32.58642,-86.418105 32.586497,-86.418115 32.586534,-86.418135 32.586588,-86.418166 32.586639,-86.418207 32.586685,-86.418576 32.586973,-86.418633 32.587013)\r\n1901;1999;all;Church St;Autauga;AL;36006;LINESTRING(-86.72116 32.657507,-86.721124 32.657563,-86.720171 32.658736,-86.720041 32.658902)\r\n199;133;odd;W 3rd St;Autauga;AL;36067;LINESTRING(-86.475339 32.461388,-86.475127 32.461375,-86.47427 32.46131,-86.474208 32.461305)\r\n198;136;even;W 3rd St;Autauga;AL;36067;LINESTRING(-86.475326 32.461552,-86.475111 32.461541,-86.47425 32.461476,-86.474186 32.461469)\r\n1324;1350;even;Autauga County 43;Autauga;AL;36067;LINESTRING(-86.612619 32.575403,-86.612615 32.575653,-86.612635 32.576019,-86.612659 32.577103,-86.612657 32.578706,-86.612657 32.578791)\r\n1301;1321;odd;Autauga County 43;Autauga;AL;36067;LINESTRING(-86.612813 32.575404,-86.612813 32.575649,-86.612833 32.576013,-86.612855 32.577101,-86.612851 32.578706,-86.612851 32.578791)\r\n377;369;all;Sydney Dr S;Autauga;AL;36066;LINESTRING(-86.424216 32.490945,-86.424433 32.490946,-86.424576 32.490942,-86.424713 32.490925,-86.424835 32.490901,-86.425092 32.490794)\r\n400;498;even;Pratt St;Autauga;AL;36067;LINESTRING(-86.464966 32.457526,-86.465074 32.45651)\r\n401;499;odd;Pratt St;Autauga;AL;36067;LINESTRING(-86.464772 32.457512,-86.46488 32.456496)\r\n1066;1068;even;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.782087 32.525812,-86.782295 32.525923,-86.782569 32.526082)\r\n1067;1069;odd;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.782189 32.525672,-86.782405 32.525781,-86.78268 32.525947)\r\n100;198;even;Julia St;Autauga;AL;36066;LINESTRING(-86.44256 32.466902,-86.442556 32.466843,-86.442507 32.466678,-86.442315 32.466482,-86.442146 32.46641,-86.441964 32.466295,-86.441902 32.46621,-86.44187 32.466101,-86.441922 32.465722)\r\n101;199;odd;Julia St;Autauga;AL;36066;LINESTRING(-86.442368 32.466926,-86.442354 32.466881,-86.442305 32.46677,-86.442169 32.466628,-86.44204 32.466554,-86.441798 32.466431,-86.441684 32.466274,-86.441676 32.466101,-86.441729 32.465703)\r\n2173;2199;all;Shangri la Rd;Autauga;AL;36022;LINESTRING(-86.434412 32.606786,-86.433333 32.6068,-86.433139 32.606795)\r\n300;324;even;Landcaster Dr;Autauga;AL;36022;LINESTRING(-86.440334 32.60176,-86.439825 32.601727)\r\n301;305;odd;Landcaster Dr;Autauga;AL;36022;LINESTRING(-86.440319 32.601924,-86.43981 32.601891)\r\n2099;2015;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.613267 32.437149,-86.61233 32.437158,-86.61147 32.437162,-86.608767 32.437182,-86.603718 32.43722,-86.601322 32.43724)\r\n1358;1398;all;Autauga County 85;Autauga;AL;36067;LINESTRING(-86.499595 32.501771,-86.499569 32.501943,-86.499536 32.502089,-86.499486 32.502399,-86.499461 32.502621,-86.499457 32.502845,-86.499464 32.503144,-86.499486 32.503285,-86.499539 32.503716,-86.499553 32.503925,-86.499552 32.504136,-86.49953 32.504423,-86.499469 32.505001,-86.499298 32.506305,-86.499259 32.506746,-86.499218 32.507618,-86.499193 32.507902,-86.499156 32.508113,-86.499122 32.50825,-86.499054 32.508455,-86.498973 32.508656,-86.498896 32.508831,-86.498727 32.509207,-86.498607 32.509485,-86.498547 32.509705,-86.498495 32.50992,-86.498456 32.510059,-86.498409 32.510194,-86.498351 32.510323,-86.498328 32.510373)\r\n1698;1600;all;Timber Trl;Autauga;AL;36022;LINESTRING(-86.449538 32.543938,-86.449597 32.544006,-86.449708 32.54403)\r\n200;298;even;Kelly Bottom Ln;Autauga;AL;36022;LINESTRING(-86.47478 32.624699,-86.474759 32.625051,-86.474723 32.625653,-86.474696 32.626206,-86.474823 32.626214,-86.47498 32.626213,-86.475926 32.626202,-86.476055 32.626226,-86.476091 32.626248,-86.476117 32.626303,-86.476081 32.626581,-86.476076 32.626747,-86.476211 32.62687,-86.476313 32.627012,-86.476454 32.627112,-86.476756 32.62731,-86.476828 32.627331)\r\n2401;2499;odd;Kelly Bottom Ln;Autauga;AL;36022;LINESTRING(-86.474975 32.624707,-86.474953 32.625059,-86.474919 32.625663,-86.474876 32.626058,-86.474819 32.626048,-86.474978 32.626047,-86.475948 32.626024,-86.476117 32.626056,-86.476303 32.62611,-86.476313 32.626301,-86.476279 32.626585,-86.476304 32.626673,-86.476375 32.62677,-86.476479 32.626892,-86.476584 32.62698,-86.476868 32.627156,-86.476913 32.627183)\r\n200;852;all;Jensen Rd;Autauga;AL;36067;LINESTRING(-86.468074 32.436492,-86.468212 32.435501,-86.468237 32.435361,-86.468268 32.43522,-86.468364 32.434843)\r\n1502;1698;even;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.465776 32.511679,-86.465726 32.511988,-86.465702 32.512206,-86.465699 32.512355,-86.465703 32.512578,-86.465733 32.512799,-86.465782 32.513016,-86.465873 32.513299,-86.466404 32.514671,-86.4665 32.514944,-86.466626 32.515358,-86.466757 32.515849,-86.466799 32.516058,-86.466814 32.516194,-86.466815 32.516331,-86.466794 32.516537,-86.466753 32.516749,-86.466679 32.517025,-86.466474 32.517652,-86.466412 32.517864,-86.466365 32.518082,-86.466333 32.518298,-86.466311 32.518518,-86.466299 32.518878,-86.466283 32.519532,-86.466296 32.519685,-86.46634 32.519834,-86.466401 32.519977,-86.466478 32.520111,-86.466609 32.520304,-86.466842 32.520608,-86.467186 32.521023,-86.467454 32.521306,-86.467722 32.521584,-86.46787 32.521753,-86.467954 32.521869,-86.467986 32.521927,-86.468013 32.52199,-86.468029 32.522051,-86.46804 32.522111,-86.468034 32.522172,-86.468021 32.52223,-86.467996 32.522287,-86.467965 32.522342,-86.467922 32.522398,-86.467875 32.522451,-86.467824 32.522498,-86.467766 32.522542,-86.467362 32.5228,-86.467154 32.522935,-86.46691 32.523146,-86.466571 32.523473,-86.466334 32.523679,-86.465963 32.523976,-86.465841 32.524081,-86.465724 32.524194,-86.465617 32.524315,-86.465572 32.524383,-86.46553 32.524453,-86.46547 32.524597,-86.465376 32.524879,-86.465338 32.525025,-86.465311 32.525173,-86.465259 32.525531,-86.465245 32.5256,-86.465209 32.525736,-86.465186 32.525799,-86.465125 32.525926,-86.465051 32.526051,-86.464924 32.526232,-86.464638 32.526598,-86.464507 32.52679,-86.464361 32.527062,-86.464305 32.527204,-86.46426 32.527347,-86.464223 32.527493,-86.464174 32.527712,-86.464154 32.527861,-86.464154 32.527942,-86.464173 32.528095,-86.464199 32.528172,-86.464228 32.528247,-86.4643 32.528384,-86.464535 32.528774,-86.464615 32.528897,-86.464651 32.528963,-86.464807 32.529217,-86.464837 32.529292,-86.465015 32.529504,-86.465059 32.529572,-86.465109 32.529644,-86.465353 32.529937,-86.465391 32.529995,-86.465451 32.530118,-86.465469 32.530176,-86.465479 32.530238,-86.465472 32.530298,-86.46546 32.530363,-86.46544 32.530425,-86.465383 32.530555,-86.465274 32.530743,-86.465106 32.53099,-86.46488 32.531291,-86.464545 32.531705,-86.464415 32.531897,-86.464101 32.532411,-86.46406 32.532485)\r\n1503;1599;odd;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.465969 32.5117,-86.465924 32.512006,-86.465902 32.512216,-86.465893 32.512355,-86.465905 32.512566,-86.465933 32.512773,-86.465978 32.512978,-86.466065 32.513251,-86.466592 32.514621,-86.46669 32.5149,-86.466818 32.515318,-86.466951 32.515815,-86.467001 32.516036,-86.467016 32.516186,-86.467017 32.516337,-86.466996 32.516559,-86.466949 32.516781,-86.466873 32.517067,-86.466666 32.517694,-86.466608 32.5179,-86.466563 32.518108,-86.466531 32.518316,-86.466511 32.518528,-86.466495 32.518882,-86.466485 32.519526,-86.466502 32.519657,-86.466536 32.519784,-86.466589 32.519911,-86.466656 32.520033,-86.466779 32.520216,-86.467006 32.520514,-86.467346 32.520921,-86.467606 32.521202,-86.467878 32.52148,-86.468038 32.521655,-86.468136 32.521787,-86.468176 32.521863,-86.468205 32.52194,-86.468233 32.522019,-86.468242 32.522105,-86.468242 32.522192,-86.468221 32.522276,-86.468188 32.522359,-86.468139 32.522428,-86.46809 32.522496,-86.468031 32.522561,-86.467966 32.52262,-86.467894 32.522674,-86.467482 32.522932,-86.467292 32.523065,-86.467056 32.523262,-86.466717 32.523587,-86.466474 32.523799,-86.466103 32.524096,-86.465989 32.524195,-86.465882 32.5243,-86.465789 32.524409,-86.46575 32.524463,-86.465718 32.524521,-86.465662 32.524649,-86.46557 32.524921,-86.465534 32.525057,-86.465507 32.525197,-86.465455 32.525555,-86.465441 32.525632,-86.465403 32.525778,-86.465378 32.525855,-86.465311 32.525998,-86.465225 32.526133,-86.465094 32.526322,-86.46481 32.526686,-86.464689 32.526868,-86.464551 32.527126,-86.464497 32.527254,-86.464454 32.527387,-86.464417 32.527525,-86.464374 32.527736,-86.464358 32.527871,-86.464358 32.527932,-86.464377 32.528063,-86.464393 32.528124,-86.464418 32.528185,-86.464482 32.528312,-86.464711 32.528694,-86.464799 32.528819,-86.464833 32.528889,-86.464993 32.529145,-86.465027 32.529206,-86.465193 32.529414,-86.465235 32.52949,-86.465279 32.529552,-86.465523 32.529845,-86.465575 32.529915,-86.465657 32.530064,-86.465673 32.530152,-86.465677 32.530236,-86.465676 32.530316,-86.465658 32.530399,-86.465634 32.530477,-86.465571 32.530623,-86.46545 32.530823,-86.465276 32.531078,-86.465044 32.531383,-86.464715 32.531795,-86.464589 32.531977,-86.464277 32.532485,-86.464235 32.532557)\r\n1300;1398;even;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.463416 32.502264,-86.46312 32.502727,-86.462839 32.503178,-86.462462 32.503827,-86.460953 32.506512)\r\n1401;1425;odd;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.463587 32.502342,-86.463292 32.502805,-86.463015 32.503254,-86.462638 32.503899,-86.461129 32.506583)\r\n203;153;odd;Durden Rd;Autauga;AL;36067;LINESTRING(-86.486216 32.471312,-86.486334 32.47116)\r\n140;124;even;Durden Rd;Autauga;AL;36067;LINESTRING(-86.486054 32.471222,-86.486172 32.47107)\r\n200;248;even;S Northington St;Autauga;AL;36067;LINESTRING(-86.467289 32.460763,-86.467369 32.460007,-86.467436 32.459439)\r\n201;299;odd;S Northington St;Autauga;AL;36067;LINESTRING(-86.467095 32.460749,-86.467175 32.459991,-86.467243 32.459423)\r\n300;398;even;Esther Ct;Autauga;AL;36067;LINESTRING(-86.460613 32.476834,-86.460576 32.476828,-86.46051 32.476813,-86.460291 32.476736,-86.460068 32.47662,-86.459996 32.476635)\r\n301;399;odd;Esther Ct;Autauga;AL;36067;LINESTRING(-86.4606 32.476999,-86.46055 32.477,-86.460446 32.476987,-86.460201 32.47689,-86.460012 32.476812,-86.460001 32.476799)\r\n192;198;even;Barkley;Autauga;AL;36066;LINESTRING(-86.423922 32.493823,-86.423885 32.493787,-86.423196 32.493559)\r\n195;199;odd;Barkley;Autauga;AL;36066;LINESTRING(-86.423804 32.493953,-86.423777 32.493947,-86.423122 32.493711)\r\n598;510;all;Ambrose Ln;Autauga;AL;36066;LINESTRING(-86.428734 32.473247,-86.428738 32.47323,-86.428756 32.473177)\r\n713;705;odd;Ethan Ln;Autauga;AL;36067;LINESTRING(-86.550736 32.551263,-86.550092 32.551264,-86.54954 32.551268,-86.548908 32.551313,-86.548829 32.551322)\r\n710;704;even;Ethan Ln;Autauga;AL;36067;LINESTRING(-86.550736 32.551428,-86.550094 32.55143,-86.54955 32.551438,-86.548926 32.551479,-86.548851 32.551485)\r\n100;198;even;Black Oak Ct;Autauga;AL;36067;LINESTRING(-86.475508 32.473886,-86.475598 32.47392,-86.475902 32.474045,-86.476025 32.4741)\r\n101;199;odd;Black Oak Ct;Autauga;AL;36067;LINESTRING(-86.475578 32.473733,-86.47568 32.473762,-86.475992 32.473897,-86.476118 32.473955)\r\n230;224;all;Woodvale Rd;Autauga;AL;36067;LINESTRING(-86.456835 32.470865,-86.456833 32.470702,-86.456809 32.470564,-86.456782 32.470393)\r\n1900;1904;all;Regent Rd;Autauga;AL;36066;LINESTRING(-86.417925 32.466261,-86.417633 32.466261)\r\n734;798;all;Red Eagle Rd;Autauga;AL;36067;LINESTRING(-86.522003 32.448445,-86.521949 32.448362,-86.521897 32.448298,-86.521633 32.447996,-86.521558 32.447938,-86.521474 32.447885,-86.521369 32.447842,-86.521257 32.447841,-86.521156 32.447837,-86.520487 32.447964,-86.520399 32.447993,-86.520305 32.448019,-86.52022 32.448067,-86.520142 32.448112,-86.520074 32.448167,-86.520016 32.448225,-86.519962 32.448285,-86.519662 32.448639,-86.51944 32.448845,-86.519307 32.448931)\r\n399;1;all;Riverview Rd;Autauga;AL;36003;LINESTRING(-86.659791 32.384154,-86.659797 32.38416,-86.66094 32.384635,-86.661253 32.384758,-86.661633 32.384921,-86.661921 32.385064,-86.662185 32.385233,-86.662301 32.385328,-86.662405 32.385432,-86.662497 32.385544,-86.662535 32.385601,-86.662604 32.385727,-86.66266 32.385858,-86.662725 32.386061,-86.662771 32.38627,-86.662896 32.387001,-86.662934 32.387182)\r\n1625;1601;all;Astros Ave;Autauga;AL;36067;LINESTRING(-86.417249 32.429224,-86.41733 32.429243)\r\n198;100;even;Hidden Acres Dr;Autauga;AL;36067;LINESTRING(-86.475515 32.440759,-86.47565 32.440822,-86.475792 32.440913,-86.475868 32.441003,-86.476234 32.441982,-86.476184 32.442112,-86.476117 32.442262)\r\n199;101;odd;Hidden Acres Dr;Autauga;AL;36067;LINESTRING(-86.475602 32.440611,-86.475756 32.44067,-86.47595 32.440779,-86.476068 32.440919,-86.476426 32.441978,-86.476384 32.442168,-86.476296 32.442327)\r\n1800;1898;all;Alpine Dr;Autauga;AL;36022;LINESTRING(-86.417169 32.579259,-86.417191 32.577427,-86.417185 32.576783,-86.417179 32.576717,-86.417164 32.576652,-86.41712 32.57652,-86.416909 32.576048,-86.416666 32.575436)\r\n1032;1070;even;Spring St;Autauga;AL;36067;LINESTRING(-86.467533 32.429388,-86.467531 32.429362,-86.467516 32.429231,-86.467487 32.429073,-86.467441 32.428968,-86.467345 32.428937)\r\n1037;1045;odd;Spring St;Autauga;AL;36067;LINESTRING(-86.467341 32.429414,-86.467333 32.429384,-86.467316 32.429255,-86.467281 32.429127,-86.467259 32.429104,-86.467245 32.429078)\r\n106;198;even;Spanish Oak Dr;Autauga;AL;36067;LINESTRING(-86.475627 32.47331,-86.476032 32.473221,-86.476213 32.473182,-86.47632 32.473119,-86.476368 32.473049,-86.476393 32.472981,-86.47639 32.47292,-86.476356 32.472764,-86.476248 32.472407,-86.476225 32.472339,-86.476207 32.47229)\r\n107;199;odd;Spanish Oak Dr;Autauga;AL;36067;LINESTRING(-86.475577 32.473151,-86.475976 32.473059,-86.476113 32.473014,-86.476154 32.472987,-86.47617 32.472971,-86.476177 32.472951,-86.476182 32.472932,-86.476158 32.4728,-86.476056 32.472453,-86.476027 32.472383,-86.476017 32.472324)\r\n1501;1599;all;Autauga County 1;Autauga;AL;36006;LINESTRING(-86.756897 32.617923,-86.756883 32.617977,-86.756822 32.61823,-86.756083 32.621934,-86.756028 32.622153,-86.755978 32.6223,-86.755912 32.622443,-86.755832 32.622581,-86.755781 32.622645,-86.755726 32.622709,-86.755608 32.622824,-86.755474 32.622925,-86.755402 32.622971,-86.755324 32.623016,-86.755168 32.623091,-86.755087 32.623118,-86.755013 32.623151,-86.754852 32.623201,-86.754694 32.623249,-86.754067 32.623456,-86.753759 32.623566,-86.753449 32.623685,-86.753297 32.623747,-86.752849 32.623941)\r\n528;598;even;Autauga County 68;Autauga;AL;36022;LINESTRING(-86.455445 32.674434,-86.455407 32.674445,-86.455103 32.674548,-86.454868 32.674605,-86.454544 32.674655,-86.45438 32.67467,-86.451245 32.674832)\r\n501;599;odd;Autauga County 68;Autauga;AL;36022;LINESTRING(-86.455543 32.674576,-86.455499 32.674605,-86.455169 32.674712,-86.454914 32.674773,-86.454572 32.674825,-86.454396 32.674838,-86.451257 32.674997)\r\n1900;1964;even;Mason Rd;Autauga;AL;36067;LINESTRING(-86.559126 32.568183,-86.559118 32.568188,-86.559 32.568277,-86.558805 32.568406,-86.558603 32.568515,-86.55847 32.568553,-86.558327 32.568568,-86.557831 32.568537,-86.557657 32.568529,-86.557046 32.568525,-86.556847 32.568543,-86.556654 32.568629,-86.556528 32.568784,-86.556503 32.568884,-86.556508 32.569043,-86.556536 32.56933,-86.556579 32.570046,-86.556615 32.570979,-86.556624 32.57141,-86.556627 32.572276,-86.556615 32.572983,-86.556614 32.573067,-86.55661 32.573863,-86.556613 32.574161,-86.556624 32.574261)\r\n1901;1999;odd;Mason Rd;Autauga;AL;36067;LINESTRING(-86.559261 32.568302,-86.559252 32.56831,-86.55913 32.568407,-86.558925 32.568544,-86.558701 32.568681,-86.558512 32.568735,-86.558325 32.568734,-86.557819 32.568703,-86.557653 32.568697,-86.557062 32.568701,-86.556919 32.568725,-86.55681 32.568777,-86.556734 32.568864,-86.556717 32.568908,-86.556708 32.569037,-86.556732 32.56932,-86.556775 32.57004,-86.556811 32.570975,-86.55682 32.571408,-86.556823 32.572276,-86.556811 32.572985,-86.55681 32.573069,-86.556806 32.573863,-86.556813 32.574153,-86.556818 32.574249)\r\n399;357;odd;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.487585 32.53944,-86.487519 32.539462,-86.487284 32.539535,-86.486964 32.539625,-86.48615 32.539836,-86.482725 32.540703,-86.481909 32.540914,-86.48104 32.541133)\r\n402;358;even;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.487661 32.539592,-86.487593 32.539618,-86.487348 32.539693,-86.487024 32.539783,-86.486206 32.539994,-86.482781 32.540861,-86.481965 32.541072,-86.481096 32.541291)\r\n698;654;all;N McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.420014 32.482582,-86.420032 32.482183,-86.420049 32.481966,-86.42011 32.480819)\r\n101;107;all;Ivey Ln;Autauga;AL;36066;LINESTRING(-86.433194 32.448033,-86.433168 32.447807,-86.433084 32.447409)\r\n199;101;all;Palmetto Pl;Autauga;AL;36067;LINESTRING(-86.536207 32.43616,-86.536142 32.436546,-86.536161 32.437064,-86.536162 32.437346,-86.536148 32.437562,-86.536124 32.437658,-86.536147 32.437713,-86.536144 32.437716,-86.53615 32.437716,-86.536184 32.437729,-86.536484 32.437741,-86.537334 32.437724,-86.53811 32.437729,-86.538254 32.437745,-86.538316 32.437823,-86.538305 32.437932,-86.538291 32.438343,-86.538301 32.438953,-86.538309 32.439369)\r\n3900;4428;all;Autauga County 14;Autauga;AL;36758;LINESTRING(-86.909479 32.660052,-86.909743 32.660048,-86.910614 32.660023,-86.912165 32.659991,-86.912876 32.659989)\r\n1790;1782;all;Benson St;Autauga;AL;36066;LINESTRING(-86.418622 32.491598,-86.418636 32.490984)\r\n350;300;even;Kindling Ridge Rd;Autauga;AL;36022;LINESTRING(-86.428529 32.61031,-86.428522 32.610391,-86.428626 32.610541,-86.428705 32.610733,-86.42881 32.610834,-86.428786 32.610966,-86.428773 32.611091,-86.428753 32.61111,-86.428736 32.611121,-86.428683 32.61114,-86.42856 32.611158,-86.428498 32.611161,-86.428419 32.611054,-86.428374 32.610955,-86.428367 32.610899,-86.428428 32.610735,-86.428642 32.610326)\r\n351;301;odd;Kindling Ridge Rd;Autauga;AL;36022;LINESTRING(-86.428723 32.610296,-86.428742 32.610337,-86.428814 32.610469,-86.428899 32.610639,-86.429028 32.610784,-86.428994 32.61098,-86.429007 32.611193,-86.428915 32.611242,-86.42887 32.611309,-86.428711 32.611308,-86.428588 32.611326,-86.428392 32.611347,-86.428237 32.611138,-86.428152 32.611001,-86.428149 32.610871,-86.42824 32.610671,-86.428464 32.610259)\r\n899;801;odd;Dawson-Williams Rd;Autauga;AL;36067;LINESTRING(-86.523319 32.518579,-86.523135 32.518676,-86.522989 32.518764,-86.522852 32.518864,-86.52273 32.518977,-86.522672 32.519038,-86.522562 32.519163,-86.522485 32.519304,-86.522417 32.519441,-86.522157 32.520055,-86.521885 32.520736,-86.521602 32.521415,-86.52133 32.522104,-86.521079 32.522795,-86.520872 32.523341,-86.520703 32.523748,-86.520461 32.524285,-86.520326 32.524546,-86.520176 32.5248,-86.520094 32.524923,-86.520008 32.52504,-86.519914 32.525152,-86.51981 32.525258,-86.519698 32.525358,-86.519454 32.52555,-86.518807 32.526017,-86.517502 32.526937,-86.517127 32.527212)\r\n898;800;even;Dawson-Williams Rd;Autauga;AL;36067;LINESTRING(-86.523424 32.518718,-86.523247 32.518816,-86.523115 32.518898,-86.522994 32.518988,-86.522882 32.519089,-86.522832 32.51914,-86.522742 32.519253,-86.522667 32.519374,-86.522603 32.519503,-86.522343 32.520109,-86.522071 32.52079,-86.521788 32.521469,-86.521518 32.522154,-86.521265 32.522845,-86.521058 32.523393,-86.520889 32.523806,-86.520645 32.524349,-86.520506 32.524618,-86.520352 32.524878,-86.520266 32.525009,-86.520174 32.525134,-86.520074 32.525256,-86.51996 32.52537,-86.51984 32.525478,-86.519586 32.525676,-86.518933 32.526143,-86.51763 32.527063,-86.517254 32.527337)\r\n259;269;all;N Mulberry Rd;Autauga;AL;36003;LINESTRING(-86.765886 32.465837,-86.76587 32.465953,-86.765836 32.466085,-86.765777 32.466208,-86.765693 32.466316,-86.765583 32.466413,-86.765455 32.466495,-86.765314 32.466567,-86.765164 32.46663,-86.765138 32.466641)\r\n232;270;even;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.470249 32.455341,-86.470168 32.45513,-86.469999 32.454752)\r\n235;299;odd;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.470065 32.455393,-86.469982 32.455186,-86.469817 32.454809)\r\n3199;3153;odd;Prather Rd;Autauga;AL;36003;LINESTRING(-86.728849 32.450615,-86.728843 32.450702,-86.728843 32.450719,-86.728818 32.450912,-86.728774 32.451119,-86.72873 32.451247,-86.728666 32.451365,-86.728578 32.451467,-86.728528 32.45151,-86.728185 32.45173,-86.728045 32.451827,-86.727862 32.45199,-86.727058 32.452753,-86.726942 32.452847,-86.72682 32.452917,-86.726598 32.452987,-86.72635 32.453025,-86.726004 32.453083,-86.725744 32.453153,-86.725582 32.453229,-86.725284 32.453389,-86.725136 32.453472,-86.724989 32.453569,-86.724814 32.453743,-86.724604 32.453972,-86.724435 32.454124,-86.724377 32.454167,-86.724249 32.454242,-86.724113 32.454292,-86.724049 32.454303,-86.723804 32.454312,-86.723641 32.454299,-86.723477 32.454278,-86.722383 32.454103,-86.722213 32.454079,-86.722045 32.454051,-86.721704 32.454008,-86.720858 32.453878,-86.719841 32.453703,-86.718954 32.453559)\r\n3298;3100;even;Prather Rd;Autauga;AL;36003;LINESTRING(-86.729044 32.45062,-86.729043 32.450712,-86.729039 32.450735,-86.729018 32.450936,-86.728972 32.451157,-86.728924 32.451305,-86.728854 32.451455,-86.728736 32.451587,-86.728658 32.451642,-86.728309 32.451862,-86.728185 32.451953,-86.728008 32.452104,-86.727204 32.452867,-86.72708 32.452981,-86.726922 32.453083,-86.72665 32.453159,-86.726386 32.453191,-86.726056 32.453251,-86.725826 32.453317,-86.725682 32.453377,-86.725392 32.453529,-86.725256 32.45361,-86.725135 32.453697,-86.72497 32.453851,-86.72476 32.454084,-86.724575 32.454246,-86.724507 32.454301,-86.724357 32.4544,-86.724175 32.454464,-86.724071 32.454481,-86.723796 32.454482,-86.723617 32.454467,-86.723443 32.454444,-86.722349 32.454267,-86.722179 32.454243,-86.722011 32.454217,-86.721672 32.454172,-86.72082 32.454042,-86.719803 32.453865,-86.718917 32.453721)\r\n1600;1698;even;Northpointe Dr;Autauga;AL;36022;LINESTRING(-86.447935 32.545713,-86.448064 32.545863,-86.448208 32.546042,-86.448287 32.546161,-86.448308 32.546212,-86.448323 32.546268,-86.448308 32.546317,-86.448287 32.54636,-86.448248 32.546405,-86.448193 32.546447,-86.44799 32.546571,-86.447824 32.546663)\r\n1601;1699;odd;Northpointe Dr;Autauga;AL;36022;LINESTRING(-86.448091 32.545614,-86.448228 32.545765,-86.448374 32.545952,-86.448479 32.546081,-86.448518 32.54617,-86.448523 32.546264,-86.448528 32.546363,-86.448473 32.54646,-86.448396 32.546529,-86.448319 32.546583,-86.448102 32.546711,-86.447929 32.546802)\r\n1176;1284;even;S McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.418176 32.445886,-86.418168 32.445367,-86.418156 32.443899,-86.418146 32.443127)\r\n1177;1399;odd;S McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.417981 32.445888,-86.417974 32.445369,-86.417962 32.443901,-86.417951 32.443129)\r\n3466;3400;all;Mulberry Rd;Autauga;AL;36003;LINESTRING(-86.770754 32.460309,-86.770748 32.460316,-86.770484 32.460518,-86.770313 32.460597,-86.770215 32.460629,-86.770031 32.460654,-86.769853 32.460666,-86.769672 32.460677,-86.76952 32.460682)\r\n400;452;all;E Main St;Autauga;AL;36067;LINESTRING(-86.464523 32.459192,-86.463577 32.459252,-86.46315 32.45929,-86.462771 32.459318)\r\n700;898;even;Autauga County 19;Autauga;AL;36003;LINESTRING(-86.678335 32.465084,-86.678337 32.46509,-86.678405 32.46522,-86.678468 32.465351,-86.678525 32.465485,-86.678576 32.465619,-86.678621 32.465759,-86.678698 32.466037,-86.678794 32.466465,-86.679095 32.467956,-86.679669 32.470791)\r\n701;799;odd;Autauga County 19;Autauga;AL;36003;LINESTRING(-86.67851 32.465011,-86.678515 32.465018,-86.678589 32.465154,-86.678652 32.465291,-86.678713 32.465431,-86.678766 32.465571,-86.678813 32.465717,-86.678892 32.466003,-86.678986 32.466435,-86.679287 32.467928,-86.67986 32.470763)\r\n501;599;odd;Windy Valley Ln;Autauga;AL;36067;LINESTRING(-86.580754 32.496378,-86.581025 32.496187)\r\n500;698;even;Windy Valley Ln;Autauga;AL;36067;LINESTRING(-86.58063 32.496252,-86.580901 32.496061)\r\n799;745;odd;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.481361 32.477861,-86.481369 32.477441,-86.481364 32.47722,-86.48137 32.476862,-86.481358 32.476803)\r\n798;746;even;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.481167 32.477858,-86.481173 32.477441,-86.481168 32.477222,-86.481166 32.47687,-86.481165 32.47682)\r\n501;557;all;Geneva Ln;Autauga;AL;36067;LINESTRING(-86.73323 32.501667,-86.733323 32.501662,-86.733657 32.501635,-86.733732 32.501622,-86.733904 32.501576,-86.734005 32.501572,-86.734133 32.501566,-86.734249 32.501651)\r\n726;798;even;Autauga County 115;Autauga;AL;36067;LINESTRING(-86.617302 32.52062,-86.617344 32.520734,-86.617364 32.52086,-86.617349 32.52115,-86.617349 32.521301,-86.617366 32.521453,-86.617422 32.521667,-86.617432 32.521706)\r\n701;753;odd;Autauga County 115;Autauga;AL;36067;LINESTRING(-86.617481 32.520556,-86.617564 32.520692,-86.617558 32.52086,-86.617547 32.521152,-86.617551 32.521291,-86.617568 32.521427,-86.617618 32.521635,-86.617624 32.521679)\r\n1722;1718;all;Booth Cir;Autauga;AL;36067;LINESTRING(-86.571934 32.501105,-86.571891 32.501185)\r\n2447;2401;all;Rocky Hollow Ln;Autauga;AL;36022;LINESTRING(-86.471526 32.625647,-86.471135 32.625661)\r\n900;942;even;E Main St;Autauga;AL;36066;LINESTRING(-86.450144 32.460248,-86.449052 32.460226)\r\n901;943;odd;E Main St;Autauga;AL;36066;LINESTRING(-86.45014 32.460412,-86.449048 32.46039)\r\n2699;2601;odd;Dutch Bend St;Autauga;AL;36003;LINESTRING(-86.658881 32.433992,-86.658013 32.43448,-86.657825 32.43458)\r\n2698;2646;even;Dutch Bend St;Autauga;AL;36003;LINESTRING(-86.658989 32.434129,-86.658119 32.43462,-86.657927 32.43472)\r\n1159;1165;all;Cooper Ave;Autauga;AL;36066;LINESTRING(-86.443824 32.462382,-86.443774 32.462384,-86.44353 32.4624,-86.443392 32.462419)\r\n2400;2498;even;Autauga County 67;Autauga;AL;36006;LINESTRING(-86.699121 32.669723,-86.699106 32.669747,-86.699035 32.669876,-86.698876 32.670131,-86.698832 32.670196,-86.698623 32.670505,-86.698447 32.67075,-86.698404 32.670808,-86.698217 32.671048,-86.697718 32.67164,-86.697211 32.67222,-86.696915 32.672571,-86.696822 32.672694,-86.696733 32.672823,-86.696654 32.672961,-86.696589 32.673102,-86.696537 32.673244,-86.696329 32.673862,-86.696247 32.674072,-86.69607 32.67448,-86.695846 32.675027,-86.695751 32.675304,-86.695686 32.675511,-86.695638 32.675642,-86.69561 32.675706,-86.695542 32.675834,-86.695464 32.675959,-86.695377 32.676082,-86.695187 32.676321,-86.695087 32.67643,-86.694978 32.676531,-86.694858 32.676624,-86.69473 32.676705,-86.694593 32.676782,-86.694451 32.676852,-86.694304 32.676916,-86.694152 32.67697,-86.693996 32.677015,-86.693833 32.677052,-86.693333 32.677146,-86.692829 32.677227,-86.691819 32.677357,-86.691146 32.677453,-86.690972 32.67748,-86.690637 32.677556,-86.689234 32.677874,-86.689181 32.677886)\r\n2411;2499;odd;Autauga County 67;Autauga;AL;36006;LINESTRING(-86.699302 32.669784,-86.69929 32.669815,-86.699215 32.669952,-86.69905 32.670213,-86.699002 32.67028,-86.698793 32.670589,-86.698615 32.670836,-86.698574 32.670898,-86.698381 32.671142,-86.697878 32.671738,-86.697371 32.672318,-86.697081 32.672665,-86.696992 32.672782,-86.696911 32.672903,-86.69684 32.673029,-86.696779 32.673158,-86.696727 32.673292,-86.696519 32.673912,-86.696433 32.674128,-86.696256 32.674536,-86.696036 32.675079,-86.695941 32.675348,-86.695876 32.675557,-86.695828 32.675696,-86.695796 32.67577,-86.695722 32.675908,-86.695638 32.676041,-86.695545 32.676172,-86.695351 32.676421,-86.695243 32.67654,-86.695122 32.676653,-86.694988 32.676756,-86.694846 32.676845,-86.694699 32.676924,-86.694549 32.677,-86.69439 32.67707,-86.694224 32.67713,-86.694054 32.677177,-86.693881 32.677216,-86.693373 32.67731,-86.692863 32.677393,-86.691851 32.677521,-86.691182 32.677617,-86.691016 32.677646,-86.690687 32.677716,-86.689284 32.678034,-86.689227 32.678045)\r\n999;901;all;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.900436 32.583968,-86.900413 32.583968,-86.900076 32.583977,-86.899309 32.583978,-86.897822 32.583962,-86.897646 32.583964)\r\n1304;1398;even;Persimmon Pl;Autauga;AL;36067;LINESTRING(-86.535457 32.523131,-86.53549 32.52308,-86.535643 32.522728,-86.535863 32.522176,-86.536125 32.521492,-86.536182 32.52136,-86.536297 32.521076)\r\n1307;1399;odd;Persimmon Pl;Autauga;AL;36067;LINESTRING(-86.535281 32.52306,-86.535304 32.523012,-86.535457 32.522672,-86.535677 32.522124,-86.535937 32.521438,-86.535996 32.521304,-86.536113 32.521022)\r\n900;998;even;Davis St;Autauga;AL;36067;LINESTRING(-86.449671 32.456395,-86.449542 32.456253,-86.448331 32.454993)\r\n901;999;odd;Davis St;Autauga;AL;36067;LINESTRING(-86.449518 32.456496,-86.449388 32.456357,-86.44818 32.455097)\r\n3218;3226;all;State Rte 14;Autauga;AL;36003;LINESTRING(-86.727495 32.450395,-86.727797 32.450437,-86.728793 32.450558)\r\n2599;2501;odd;S Washington St;Autauga;AL;36003;LINESTRING(-86.652156 32.427643,-86.652246 32.427772,-86.652344 32.427892,-86.65251 32.428109)\r\n398;310;even;S Washington St;Autauga;AL;36003;LINESTRING(-86.652322 32.427557,-86.652414 32.42768,-86.652508 32.4278,-86.652674 32.42802)\r\n896;872;even;Running Brook Dr;Autauga;AL;36066;LINESTRING(-86.432249 32.457191,-86.432241 32.457202,-86.432218 32.457352,-86.432197 32.457495,-86.432151 32.457698,-86.432106 32.457826,-86.43201 32.458014,-86.431889 32.458196,-86.431464 32.458726)\r\n903;875;odd;Running Brook Dr;Autauga;AL;36066;LINESTRING(-86.432438 32.457231,-86.432441 32.457236,-86.432414 32.457374,-86.432397 32.457519,-86.432351 32.457738,-86.432298 32.457886,-86.432194 32.458092,-86.432061 32.458286,-86.431625 32.458819)\r\n470;498;even;Autauga County 68;Autauga;AL;36022;LINESTRING(-86.459505 32.671149,-86.458606 32.671701,-86.458398 32.671833,-86.458062 32.672067,-86.457745 32.672321,-86.457455 32.672596,-86.457122 32.672935,-86.45687 32.673231,-86.456874 32.67323)\r\n471;499;odd;Autauga County 68;Autauga;AL;36022;LINESTRING(-86.45962 32.671282,-86.458724 32.671835,-86.458522 32.671965,-86.458196 32.672195,-86.457891 32.672441,-86.457605 32.672706,-86.457282 32.673039,-86.45703 32.673333,-86.457026 32.673334)\r\n995;999;all;Bowman Curve Rd;Autauga;AL;36067;LINESTRING(-86.594959 32.529933,-86.595045 32.529912)\r\n100;198;even;Rebecca Ct;Autauga;AL;36067;LINESTRING(-86.457244 32.452351,-86.457244 32.452183,-86.457233 32.452001)\r\n101;199;odd;Rebecca Ct;Autauga;AL;36067;LINESTRING(-86.457049 32.452352,-86.457046 32.452187,-86.457038 32.452008)\r\n2296;2332;even;Autauga County 21;Autauga;AL;36091;LINESTRING(-86.60831 32.698359,-86.608351 32.698402,-86.608403 32.698456,-86.608702 32.698819,-86.608891 32.699061,-86.60902 32.699246,-86.609172 32.699502,-86.609274 32.699697,-86.609335 32.69983,-86.609467 32.700166,-86.609532 32.700371,-86.609566 32.700508,-86.609608 32.700719,-86.60964 32.70093,-86.609662 32.701144,-86.609674 32.701356,-86.609684 32.701934,-86.609701 32.702367,-86.609705 32.702731,-86.609758 32.70334)\r\n2289;2333;odd;Autauga County 21;Autauga;AL;36091;LINESTRING(-86.608453 32.698248,-86.608505 32.69829,-86.608565 32.698356,-86.608864 32.698725,-86.609059 32.698971,-86.609198 32.699164,-86.609354 32.69943,-86.609458 32.699633,-86.609523 32.699772,-86.609659 32.700118,-86.609726 32.700333,-86.609762 32.700478,-86.609804 32.700695,-86.609836 32.700912,-86.609862 32.701132,-86.609872 32.701352,-86.60988 32.70193,-86.609897 32.702363,-86.609905 32.702723,-86.609953 32.703328)\r\n2378;2398;even;Co Rd 21 N;Autauga;AL;36091;LINESTRING(-86.610606 32.704852,-86.610747 32.705017,-86.61102 32.70538,-86.611254 32.705744,-86.611418 32.706067,-86.611432 32.706097,-86.611508 32.706265)\r\n2379;2399;odd;Co Rd 21 N;Autauga;AL;36091;LINESTRING(-86.610762 32.704754,-86.610913 32.704921,-86.611194 32.705294,-86.611438 32.705668,-86.611606 32.706007,-86.611618 32.706041,-86.611691 32.706208)\r\n199;187;odd;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.665032 32.414955,-86.665055 32.41547,-86.665063 32.415691,-86.665086 32.416644,-86.665099 32.417087,-86.66513 32.417383,-86.665148 32.417531,-86.665205 32.417824,-86.665262 32.418041,-86.665325 32.418257,-86.665403 32.418469,-86.66546 32.418609,-86.665555 32.418816,-86.665767 32.419219,-86.667183 32.421701,-86.667284 32.421891,-86.667307 32.421935)\r\n248;158;even;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.665226 32.414948,-86.665251 32.415464,-86.665257 32.415687,-86.665282 32.41664,-86.665299 32.417077,-86.665326 32.417367,-86.665346 32.417507,-86.665401 32.417792,-86.665454 32.418003,-86.665517 32.418211,-86.665591 32.418417,-86.665646 32.418551,-86.665739 32.418752,-86.665947 32.419149,-86.667361 32.421631,-86.667468 32.421825,-86.667488 32.421875)\r\n1399;1321;odd;Autauga County 112;Autauga;AL;36067;LINESTRING(-86.6464 32.604067,-86.645815 32.604069,-86.645205 32.604076,-86.644533 32.604083,-86.643942 32.604076,-86.642824 32.60408,-86.641197 32.604105,-86.640855 32.604118,-86.640598 32.60414,-86.640426 32.604169,-86.640255 32.604209,-86.640087 32.604259,-86.639922 32.604319,-86.639689 32.604427,-86.639462 32.60454,-86.63886 32.604849,-86.638194 32.605183,-86.637477 32.605561,-86.636983 32.605832,-86.636547 32.606063,-86.636402 32.606148,-86.636261 32.606242,-86.636065 32.606396,-86.635943 32.60651,-86.635784 32.606688,-86.635591 32.606939)\r\n1398;1300;even;Autauga County 112;Autauga;AL;36067;LINESTRING(-86.646401 32.604232,-86.645817 32.604235,-86.645207 32.60424,-86.644533 32.604247,-86.643942 32.604242,-86.642826 32.604246,-86.641203 32.604271,-86.640871 32.604286,-86.640628 32.60431,-86.640472 32.604335,-86.640315 32.604371,-86.640161 32.604417,-86.64001 32.604473,-86.639785 32.604573,-86.639562 32.604682,-86.63896 32.604991,-86.638296 32.605325,-86.637583 32.605701,-86.637089 32.605972,-86.636657 32.606203,-86.636522 32.606284,-86.636393 32.606372,-86.636209 32.606516,-86.636099 32.60662,-86.635948 32.606786,-86.635753 32.60703)\r\n400;408;even;Wind Ridge Dr;Autauga;AL;36022;LINESTRING(-86.419069 32.591245,-86.419675 32.59129,-86.420646 32.591363)\r\n401;411;odd;Wind Ridge Dr;Autauga;AL;36022;LINESTRING(-86.419086 32.591081,-86.419693 32.591126,-86.420663 32.591199)\r\n149;101;odd;Livingston Cir;Autauga;AL;36066;LINESTRING(-86.449796 32.478223,-86.449801 32.478445,-86.44979 32.478514,-86.449786 32.478536,-86.449775 32.478536,-86.449747 32.478557,-86.449697 32.478573,-86.449035 32.47859,-86.448974 32.478577,-86.448945 32.478562,-86.448941 32.478555,-86.448926 32.478534,-86.448905 32.478403,-86.448911 32.47826,-86.448906 32.477822,-86.448909 32.477606,-86.448907 32.477392,-86.448923 32.477314,-86.448943 32.477284,-86.448961 32.47727,-86.449007 32.477255,-86.449252 32.477241,-86.449729 32.477243)\r\n148;100;even;Livingston Cir;Autauga;AL;36066;LINESTRING(-86.449991 32.47822,-86.449995 32.478445,-86.450002 32.478538,-86.449984 32.478592,-86.449963 32.478656,-86.449853 32.478729,-86.449731 32.478755,-86.449017 32.478768,-86.448904 32.478751,-86.448813 32.478716,-86.448741 32.478657,-86.448714 32.47857,-86.448707 32.478407,-86.448713 32.478258,-86.44871 32.477822,-86.448715 32.477606,-86.448709 32.477388,-86.448707 32.477274,-86.448751 32.477164,-86.448861 32.477094,-86.448977 32.477075,-86.44925 32.477075,-86.44973 32.477078)\r\n600;698;even;Clarks Landing Rd;Autauga;AL;36003;LINESTRING(-86.63932 32.424019,-86.639155 32.423946,-86.639048 32.423869,-86.638866 32.423637,-86.638769 32.423511,-86.638361 32.423045,-86.638183 32.422798,-86.63798 32.422554,-86.637865 32.422443,-86.637766 32.422332,-86.637723 32.422275,-86.637689 32.422216,-86.637663 32.422158,-86.63762 32.422023,-86.637548 32.421667,-86.63752 32.421526,-86.637503 32.421388,-86.637526 32.421013,-86.637441 32.420837,-86.637266 32.420739,-86.637189 32.420704,-86.637132 32.420667,-86.637102 32.420648,-86.63708 32.420624,-86.637036 32.420575,-86.636953 32.420456,-86.636841 32.420261,-86.636775 32.420135,-86.636742 32.420065,-86.636716 32.420002,-86.636696 32.419953)\r\n645;695;odd;Clarks Landing Rd;Autauga;AL;36003;LINESTRING(-86.639241 32.424169,-86.639039 32.424104,-86.63888 32.423993,-86.6387 32.423727,-86.638605 32.423609,-86.638193 32.423141,-86.638015 32.422892,-86.63782 32.42266,-86.637711 32.422549,-86.637598 32.42243,-86.637549 32.422359,-86.637503 32.422288,-86.637467 32.422212,-86.63742 32.422059,-86.637354 32.421695,-86.637318 32.42155,-86.637303 32.421394,-86.637304 32.421049,-86.637255 32.420963,-86.637154 32.420887,-86.637079 32.420852,-86.636994 32.420801,-86.636962 32.420766,-86.636924 32.42074,-86.636862 32.420671,-86.636775 32.420534,-86.636661 32.420331,-86.636597 32.420201,-86.636556 32.420127,-86.636524 32.420054,-86.636509 32.419997)\r\n670;698;even;Autauga County 19;Autauga;AL;36003;LINESTRING(-86.675629 32.455961,-86.675632 32.455993,-86.675647 32.456132,-86.675662 32.45642,-86.675693 32.457947,-86.675702 32.458676,-86.675748 32.460866,-86.675773 32.461162,-86.675795 32.461312,-86.675822 32.461459,-86.675895 32.461751,-86.675942 32.461896,-86.675996 32.462039,-86.676057 32.462178,-86.676123 32.462318,-86.676196 32.462454,-86.676274 32.462589,-86.676358 32.462719,-86.676541 32.462973,-86.676747 32.463216,-86.677707 32.464248,-86.67791 32.464479,-86.678096 32.464715,-86.678182 32.464837,-86.678203 32.464867)\r\n601;699;odd;Autauga County 19;Autauga;AL;36003;LINESTRING(-86.675822 32.455938,-86.67583 32.455973,-86.675845 32.456122,-86.675858 32.456416,-86.675887 32.457945,-86.675898 32.458674,-86.675948 32.460858,-86.675971 32.461146,-86.675991 32.461288,-86.676018 32.461429,-86.676089 32.461711,-86.676132 32.461848,-86.676184 32.461985,-86.676241 32.462118,-86.676305 32.462252,-86.676374 32.462382,-86.67645 32.462511,-86.67653 32.462635,-86.676709 32.462879,-86.676907 32.463116,-86.677863 32.464146,-86.678072 32.464381,-86.678266 32.464625,-86.678356 32.464755,-86.678375 32.464789)\r\n2200;2298;even;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.548835 32.603535,-86.548794 32.605084,-86.548766 32.605873,-86.548737 32.60623,-86.548662 32.606872,-86.548631 32.607086,-86.548595 32.607299,-86.548499 32.607795,-86.547961 32.610431,-86.547905 32.610715,-86.547814 32.61114,-86.547743 32.611498,-86.547683 32.611853)\r\n2221;2299;odd;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.54903 32.603538,-86.54899 32.605088,-86.548964 32.605881,-86.548935 32.606244,-86.548858 32.60689,-86.548827 32.607108,-86.548789 32.607325,-86.548693 32.607823,-86.548153 32.610459,-86.548099 32.610743,-86.548008 32.611168,-86.547937 32.611524,-86.547876 32.611877)\r\n463;403;odd;Autauga County 133;Autauga;AL;36003;LINESTRING(-86.68502 32.392643,-86.685028 32.392703,-86.68504 32.392823,-86.685044 32.393092,-86.685011 32.394256,-86.684986 32.394544,-86.684936 32.395275,-86.684917 32.395413,-86.684884 32.395551,-86.684837 32.395684,-86.684777 32.395814,-86.684708 32.395943,-86.68451 32.396268,-86.684339 32.39652)\r\n462;402;even;Autauga County 133;Autauga;AL;36003;LINESTRING(-86.68521 32.392609,-86.685234 32.392679,-86.68524 32.392817,-86.68524 32.393094,-86.685211 32.394264,-86.685182 32.394556,-86.685134 32.395289,-86.685117 32.395439,-86.685084 32.395593,-86.685027 32.39574,-86.684961 32.39588,-86.684886 32.396017,-86.684684 32.39635,-86.684507 32.396603)\r\n2001;2099;all;Robinson Pond Rd;Autauga;AL;36067;LINESTRING(-86.594339 32.36851,-86.594432 32.368442,-86.594553 32.368355,-86.594675 32.368275,-86.594788 32.368194,-86.594895 32.368112,-86.595003 32.368029,-86.595217 32.367864,-86.595324 32.367801,-86.595533 32.3677,-86.595748 32.367642,-86.595862 32.367625,-86.595977 32.367621,-86.596101 32.367617,-86.596369 32.367644,-86.596515 32.367686,-86.596663 32.367734,-86.596818 32.36779,-86.596981 32.367849,-86.597155 32.36791,-86.597335 32.367972,-86.597523 32.368035,-86.59771 32.3681,-86.597886 32.36816,-86.598237 32.368279,-86.598588 32.368397,-86.598768 32.368459,-86.599151 32.368584,-86.599352 32.368646,-86.599554 32.368714,-86.59976 32.36878,-86.599949 32.368844,-86.600144 32.368912,-86.600337 32.368978,-86.600533 32.369044,-86.600732 32.369109,-86.600937 32.369176,-86.601139 32.369244,-86.601345 32.369311,-86.60155 32.369379,-86.601756 32.369447,-86.60196 32.369514,-86.602162 32.369582,-86.602355 32.369648,-86.602554 32.369714,-86.602752 32.369784,-86.602949 32.369856,-86.603141 32.369932,-86.603326 32.370009,-86.603505 32.370084,-86.603674 32.37016,-86.603836 32.370233,-86.603989 32.370306,-86.604133 32.370375,-86.604376 32.370499,-86.60448 32.370554,-86.604656 32.370646,-86.6047 32.370675)\r\n118;124;even;Bryan St;Autauga;AL;36066;LINESTRING(-86.437195 32.467463,-86.437148 32.467119,-86.437017 32.466488)\r\n117;125;odd;Bryan St;Autauga;AL;36066;LINESTRING(-86.437002 32.467482,-86.43695 32.467143,-86.436826 32.466516)\r\n201;205;all;Jay St;Autauga;AL;36066;LINESTRING(-86.42587 32.448757,-86.42578 32.448753,-86.425611 32.448752,-86.425431 32.448741,-86.425042 32.448686)\r\n300;372;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.451029 32.463213,-86.451039 32.463087,-86.451025 32.463032,-86.451014 32.462892,-86.451014 32.462603,-86.451012 32.462534)\r\n1004;1000;all;Windrush Ln;Autauga;AL;36067;LINESTRING(-86.530083 32.456955,-86.530143 32.457076,-86.530254 32.457351,-86.530288 32.457577,-86.530289 32.457806,-86.530258 32.458029,-86.530164 32.458594)\r\n100;198;even;Hills & Hollows Ln;Autauga;AL;36066;LINESTRING(-86.455559 32.533812,-86.455319 32.533834,-86.45507 32.533961,-86.45487 32.534244,-86.454671 32.534443,-86.454436 32.534592,-86.454004 32.534731,-86.453715 32.534784,-86.453465 32.534818,-86.453301 32.534804,-86.452891 32.534755,-86.452498 32.534685,-86.452415 32.53466)\r\n101;113;odd;Hills & Hollows Ln;Autauga;AL;36066;LINESTRING(-86.455591 32.533975,-86.455399 32.534014,-86.455234 32.534101,-86.455036 32.534346,-86.454821 32.534575,-86.454542 32.534756,-86.45406 32.534901,-86.453749 32.534948,-86.453471 32.534986,-86.453277 32.534972,-86.452859 32.534921,-86.452424 32.534863,-86.452323 32.534805)\r\n679;799;all;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.614483 32.509869,-86.614413 32.509962,-86.613821 32.510673,-86.613641 32.510915,-86.613473 32.511165,-86.613075 32.511813,-86.612886 32.512065,-86.61268 32.512303,-86.612572 32.512422,-86.612457 32.512536,-86.612335 32.512645,-86.611951 32.512942,-86.61176 32.513088,-86.611643 32.513188,-86.611538 32.513292,-86.611343 32.513525,-86.611159 32.51377,-86.61089 32.514143,-86.610154 32.515125,-86.609892 32.515497,-86.609391 32.516253,-86.60919 32.516569,-86.609003 32.516888,-86.608936 32.517017,-86.60887 32.517162)\r\n300;308;even;Marlette Dr;Autauga;AL;36067;LINESTRING(-86.463316 32.446478,-86.46316 32.446512,-86.462996 32.44655,-86.462749 32.446594,-86.462502 32.446621,-86.46248 32.446627)\r\n301;305;odd;Marlette Dr;Autauga;AL;36067;LINESTRING(-86.463366 32.446637,-86.463212 32.446672,-86.463044 32.446716,-86.462783 32.44676,-86.462518 32.446797,-86.462482 32.446791)\r\n133;101;all;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.831909 32.465948,-86.831869 32.466033,-86.831233 32.467312,-86.831058 32.467648,-86.830895 32.467989,-86.830319 32.469136,-86.830144 32.469471)\r\n290;298;even;Autauga County 33;Autauga;AL;36003;LINESTRING(-86.743467 32.470481,-86.74328 32.470791,-86.743113 32.471044,-86.742846 32.471414,-86.742656 32.471653,-86.742354 32.472005,-86.739258 32.475526,-86.738737 32.476128,-86.738638 32.476256,-86.738546 32.476389,-86.738463 32.476527,-86.738393 32.476669,-86.738327 32.476813,-86.738271 32.476963,-86.738268 32.476987,-86.738232 32.477117,-86.738198 32.47727,-86.738174 32.47743,-86.738176 32.477449)\r\n279;361;odd;Autauga County 33;Autauga;AL;36003;LINESTRING(-86.74364 32.470555,-86.743456 32.470869,-86.743285 32.471128,-86.743014 32.471504,-86.742818 32.471749,-86.742512 32.472103,-86.739416 32.475624,-86.738901 32.476224,-86.738808 32.476344,-86.738722 32.476469,-86.738645 32.476599,-86.738577 32.476731,-86.738517 32.476869,-86.738467 32.477007,-86.73846 32.477023,-86.738426 32.477151,-86.738396 32.477296,-86.738374 32.477446,-86.73837 32.47746)\r\n1796;1798;even;Big Springs Church Rd;Autauga;AL;36006;LINESTRING(-86.707974 32.596647,-86.70797 32.596808)\r\n1797;1799;odd;Big Springs Church Rd;Autauga;AL;36006;LINESTRING(-86.708169 32.59665,-86.708165 32.596811)\r\n1801;1803;all;Thunder Trl;Autauga;AL;36067;LINESTRING(-86.665947 32.633002,-86.665915 32.633001)\r\n300;498;even;E 3rd St;Autauga;AL;36067;LINESTRING(-86.46704 32.460789,-86.466819 32.460776,-86.466222 32.460732,-86.466133 32.460723)\r\n301;399;odd;E 3rd St;Autauga;AL;36067;LINESTRING(-86.467027 32.460953,-86.466805 32.460942,-86.466198 32.460902,-86.466103 32.460886)\r\n1303;1301;all;Wright St;Autauga;AL;36066;LINESTRING(-86.442056 32.468506,-86.44207 32.468378,-86.442088 32.468326,-86.442146 32.46821,-86.442199 32.468115,-86.442258 32.468016)\r\n2801;2999;odd;Autauga County 105;Autauga;AL;36051;LINESTRING(-86.508279 32.677424,-86.508208 32.677401,-86.507971 32.677317,-86.507801 32.677267,-86.507622 32.677235,-86.507108 32.6772,-86.507031 32.677189,-86.506959 32.677172,-86.506894 32.677149,-86.506834 32.677118,-86.506778 32.67708,-86.50673 32.677034,-86.506635 32.676923,-86.506414 32.676616,-86.506076 32.676119,-86.506006 32.675995,-86.505977 32.675933,-86.505955 32.675869,-86.505923 32.675736,-86.505907 32.6756,-86.505888 32.673871,-86.505903 32.67344,-86.505928 32.67308,-86.505936 32.671992,-86.505915 32.671196,-86.505908 32.67105,-86.505901 32.670974,-86.505884 32.670894,-86.505855 32.670813,-86.505808 32.670734,-86.505736 32.670669,-86.505655 32.670618,-86.50557 32.670576,-86.505479 32.670542,-86.505381 32.670524,-86.505029 32.670501,-86.504682 32.670499,-86.504512 32.670502,-86.504436 32.670495,-86.504372 32.670482,-86.504315 32.67046,-86.504265 32.670427,-86.504219 32.670384,-86.504179 32.67033,-86.504104 32.670205,-86.503969 32.669939,-86.503893 32.669805,-86.503688 32.669487,-86.503624 32.669362,-86.503576 32.669233,-86.503543 32.669098,-86.503513 32.668886,-86.50346 32.668309,-86.503424 32.668018,-86.503376 32.667799,-86.503243 32.667307,-86.503157 32.666882,-86.503151 32.666817,-86.503145 32.666678,-86.503188 32.666177,-86.503209 32.665742,-86.503211 32.665521,-86.503204 32.665372,-86.503174 32.665222,-86.503148 32.665145,-86.503114 32.665068,-86.503063 32.664994,-86.502999 32.664928,-86.502922 32.664872,-86.502829 32.664828,-86.502727 32.664805,-86.502625 32.664804,-86.502411 32.664815)\r\n2998;2800;even;Autauga County 105;Autauga;AL;36051;LINESTRING(-86.508219 32.67758,-86.508138 32.677561,-86.507899 32.677477,-86.507747 32.677435,-86.507592 32.677407,-86.507084 32.677368,-86.506993 32.677357,-86.506895 32.67734,-86.5068 32.677307,-86.506712 32.677262,-86.506636 32.677206,-86.506566 32.677144,-86.506467 32.677013,-86.506244 32.6767,-86.505898 32.676199,-86.50582 32.676063,-86.505787 32.675989,-86.505757 32.675913,-86.505721 32.675762,-86.505705 32.675608,-86.505692 32.673869,-86.505705 32.673434,-86.505728 32.673074,-86.50574 32.671994,-86.505717 32.671202,-86.505708 32.671062,-86.505699 32.670998,-86.505684 32.670938,-86.505661 32.670883,-86.50563 32.670838,-86.505592 32.670799,-86.505539 32.670762,-86.505478 32.670732,-86.505415 32.670712,-86.505349 32.670698,-86.505019 32.670671,-86.504682 32.670665,-86.504512 32.670668,-86.504414 32.670671,-86.504306 32.670656,-86.504201 32.670616,-86.504113 32.670555,-86.504051 32.670484,-86.503999 32.670414,-86.503922 32.670275,-86.503787 32.670009,-86.503715 32.669881,-86.503508 32.669563,-86.50343 32.669424,-86.503376 32.669275,-86.503343 32.669124,-86.503315 32.668902,-86.503262 32.668325,-86.503224 32.668042,-86.50318 32.667833,-86.503047 32.667339,-86.502961 32.666906,-86.502945 32.666829,-86.502945 32.666674,-86.50299 32.666167,-86.503011 32.665738,-86.503011 32.665525,-86.503 32.665392,-86.502974 32.66526,-86.502954 32.665201,-86.502926 32.665146,-86.502891 32.665096,-86.502849 32.665054,-86.5028 32.66502,-86.502747 32.664996,-86.502689 32.664981,-86.502623 32.66497,-86.502423 32.664979)\r\n268;274;all;Teri Ln;Autauga;AL;36066;LINESTRING(-86.427988 32.450433,-86.428049 32.450505,-86.428242 32.45066,-86.428318 32.450715,-86.42849 32.450794,-86.428563 32.450799)\r\n4299;4211;odd;State Rte 14;Autauga;AL;36749;LINESTRING(-86.873537 32.470468,-86.871218 32.47136,-86.870825 32.471518,-86.870177 32.471769)\r\n4298;4250;even;State Rte 14;Autauga;AL;36749;LINESTRING(-86.873617 32.470618,-86.8713 32.47151,-86.870907 32.471668,-86.870258 32.471919)\r\n500;598;even;Bumble Bee Ct;Autauga;AL;36067;LINESTRING(-86.486053 32.4805,-86.486026 32.4805,-86.485927 32.480499)\r\n501;599;odd;Bumble Bee Ct;Autauga;AL;36067;LINESTRING(-86.486059 32.480665,-86.486026 32.480666,-86.485923 32.480664)\r\n199;101;odd;Cedar Dr;Autauga;AL;36066;LINESTRING(-86.446433 32.47982,-86.446636 32.479769,-86.44705 32.479675,-86.447294 32.479604,-86.447542 32.479537,-86.447714 32.47947,-86.447865 32.479352,-86.447991 32.479134,-86.448019 32.478897,-86.447995 32.478454,-86.447951 32.478222,-86.447804 32.478019,-86.447674 32.477903,-86.447599 32.477853,-86.447383 32.477734,-86.44725 32.477652,-86.447066 32.47752,-86.446921 32.477371,-86.446813 32.477189,-86.446582 32.476724)\r\n198;100;even;Cedar Dr;Autauga;AL;36066;LINESTRING(-86.446377 32.479663,-86.446582 32.479609,-86.446992 32.479513,-86.447232 32.479448,-86.447462 32.479375,-86.447588 32.479316,-86.447683 32.479238,-86.447777 32.479078,-86.447817 32.478889,-86.447789 32.478474,-86.447741 32.47829,-86.447632 32.478127,-86.447532 32.478031,-86.447477 32.477991,-86.447269 32.477872,-86.447128 32.477786,-86.446916 32.477648,-86.446737 32.477469,-86.446631 32.477257,-86.446402 32.476788)\r\n899;701;odd;Friendship Dr;Autauga;AL;36067;LINESTRING(-86.676573 32.524106,-86.676595 32.524053,-86.676641 32.523913,-86.67667 32.523843,-86.67671 32.523713,-86.676702 32.52358,-86.676645 32.523236,-86.676599 32.522873,-86.676568 32.522723,-86.676539 32.522644,-86.676506 32.522568,-86.676457 32.522495,-86.676396 32.522429,-86.676318 32.522365,-86.676272 32.522318,-86.676012 32.522128,-86.675898 32.52203,-86.675852 32.52198,-86.675809 32.521927,-86.675778 32.521873,-86.675766 32.521863)\r\n898;700;even;Friendship Dr;Autauga;AL;36067;LINESTRING(-86.676388 32.524055,-86.676405 32.524005,-86.676449 32.523863,-86.676474 32.523797,-86.676498 32.523695,-86.676498 32.523594,-86.676449 32.523256,-86.676399 32.522897,-86.676368 32.522763,-86.676347 32.5227,-86.676318 32.522644,-86.676283 32.522591,-86.67624 32.522541,-86.676176 32.522479,-86.67613 32.522442,-86.675874 32.522252,-86.675748 32.522144,-86.675686 32.522084,-86.675635 32.522015,-86.675586 32.521945,-86.675582 32.521918)\r\n1600;1610;all;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.648198 32.524152,-86.648385 32.524165,-86.649716 32.524188)\r\n1199;1101;all;Old Ridge Rd;Autauga;AL;36066;LINESTRING(-86.435491 32.50077,-86.435473 32.500629,-86.435378 32.500271,-86.435351 32.500134,-86.435327 32.499925,-86.435312 32.498921,-86.435318 32.498708,-86.43533 32.498568,-86.435354 32.498432,-86.435391 32.498296,-86.43544 32.498163,-86.4355 32.498036,-86.435573 32.49791,-86.435613 32.497851,-86.435671 32.497772)\r\n500;598;even;Wallace Ct;Autauga;AL;36003;LINESTRING(-86.803021 32.516233,-86.803026 32.51634,-86.803017 32.516407,-86.802993 32.516545,-86.80293 32.516757,-86.802865 32.517048,-86.802761 32.517552,-86.802594 32.518263,-86.802574 32.518334,-86.80254 32.518483,-86.802517 32.518634,-86.802512 32.518786,-86.802515 32.518937,-86.802555 32.519229,-86.802578 32.519375,-86.802607 32.519526,-86.802626 32.519564,-86.802711 32.519811,-86.803022 32.520567,-86.803072 32.520704,-86.803114 32.520841,-86.803148 32.520979,-86.803291 32.521694,-86.803356 32.522126,-86.803388 32.522415,-86.803419 32.522852,-86.803457 32.523292,-86.803506 32.523447,-86.803584 32.523592,-86.803692 32.523719,-86.803793 32.523836,-86.803979 32.524074,-86.804096 32.524204,-86.80416 32.52423,-86.80426 32.524299,-86.804504 32.524372,-86.804609 32.524438,-86.804641 32.524459)\r\n599;559;odd;Wallace Ct;Autauga;AL;36003;LINESTRING(-86.803215 32.516226,-86.80322 32.51634,-86.803221 32.516423,-86.803195 32.516579,-86.803126 32.516795,-86.803059 32.517078,-86.802955 32.517582,-86.802788 32.518299,-86.802768 32.51837,-86.802738 32.518509,-86.802719 32.518648,-86.802708 32.518786,-86.802717 32.518925,-86.802751 32.519209,-86.802774 32.519349,-86.802807 32.519484,-86.802814 32.519516,-86.802901 32.519759,-86.80321 32.520515,-86.803264 32.520658,-86.803308 32.520803,-86.803342 32.520949,-86.803487 32.52167,-86.803552 32.522108,-86.803586 32.522403,-86.803615 32.52284,-86.803665 32.523262,-86.803704 32.523387,-86.803768 32.523506,-86.803854 32.523623,-86.803955 32.52374,-86.804143 32.523972,-86.804244 32.524066,-86.804272 32.524092,-86.80436 32.524135,-86.804602 32.524208,-86.804783 32.524304,-86.804813 32.524381)\r\n3000;3098;even;Buckeye Cir;Autauga;AL;36067;LINESTRING(-86.697872 32.59027,-86.697703 32.590699,-86.697588 32.591213,-86.697557 32.59168,-86.697567 32.591988,-86.697546 32.592247,-86.697493 32.59238,-86.697369 32.592513,-86.697311 32.592541,-86.697302 32.592624,-86.697301 32.592717,-86.697547 32.593275,-86.697762 32.593789)\r\n1801;1899;odd;Buckeye Cir;Autauga;AL;36067;LINESTRING(-86.698057 32.590321,-86.697903 32.590741,-86.697792 32.591235,-86.697755 32.591684,-86.697763 32.591988,-86.697762 32.592277,-86.697695 32.592474,-86.697517 32.592637,-86.697523 32.592647,-86.697512 32.59264,-86.697519 32.592681,-86.697731 32.593221,-86.697945 32.593734)\r\n199;101;all;N Court St;Autauga;AL;36067;LINESTRING(-86.475493 32.464358,-86.475529 32.463916,-86.475574 32.46347,-86.475493 32.463161)\r\n4486;4498;even;Autauga County 88;Autauga;AL;36749;LINESTRING(-86.894237 32.545854,-86.894518 32.545805,-86.89469 32.545766,-86.894816 32.54572)\r\n4385;4499;odd;Autauga County 88;Autauga;AL;36749;LINESTRING(-86.894196 32.545693,-86.89447 32.545641,-86.894624 32.545602,-86.894744 32.545567)\r\n1600;1658;even;Autauga County 81;Autauga;AL;36067;LINESTRING(-86.569717 32.522088,-86.56972 32.522114,-86.569766 32.522263,-86.569832 32.522407,-86.57044 32.523538,-86.570575 32.523805,-86.570636 32.523938,-86.570691 32.524073,-86.570738 32.524208,-86.570777 32.524345,-86.570808 32.524483,-86.570832 32.524625,-86.57095 32.52542,-86.571023 32.525993,-86.57103 32.526134,-86.571021 32.526274,-86.571003 32.526412,-86.570795 32.527408,-86.570754 32.52754,-86.570699 32.527667,-86.570628 32.527788,-86.570542 32.527901,-86.570442 32.528006,-86.570328 32.5281,-86.570212 32.528184)\r\n1605;1671;odd;Autauga County 81;Autauga;AL;36067;LINESTRING(-86.569908 32.522056,-86.569916 32.522076,-86.56996 32.522209,-86.570018 32.522341,-86.57062 32.523472,-86.570757 32.523741,-86.570822 32.52388,-86.570881 32.524021,-86.57093 32.524164,-86.570973 32.524309,-86.571002 32.524457,-86.571028 32.524603,-86.571144 32.5254,-86.571225 32.525981,-86.571226 32.526134,-86.571223 32.526286,-86.571201 32.526436,-86.570993 32.527444,-86.570948 32.52759,-86.570887 32.527735,-86.570806 32.527874,-86.570708 32.528003,-86.570594 32.528122,-86.570464 32.52823,-86.570333 32.528313)\r\n100;198;even;Turnberry Ct;Autauga;AL;36066;LINESTRING(-86.414188 32.465907,-86.413554 32.466477)\r\n101;199;odd;Turnberry Ct;Autauga;AL;36066;LINESTRING(-86.41433 32.46602,-86.413696 32.46659)\r\n200;2098;even;Kh Rd;Autauga;AL;36067;LINESTRING(-86.477139 32.572984,-86.477197 32.573045,-86.477458 32.573336,-86.47794 32.573838,-86.478192 32.574128,-86.478256 32.57419,-86.478518 32.574373,-86.478626 32.57447,-86.478671 32.57452,-86.478752 32.574636,-86.478781 32.574692,-86.478804 32.574751,-86.478839 32.574888,-86.478859 32.574975)\r\n201;2099;odd;Kh Rd;Autauga;AL;36067;LINESTRING(-86.477288 32.572878,-86.477353 32.572939,-86.477614 32.573232,-86.478096 32.573734,-86.47835 32.574018,-86.4784 32.574062,-86.478662 32.574245,-86.478784 32.57436,-86.478839 32.574424,-86.478938 32.574556,-86.478977 32.574634,-86.478998 32.574711,-86.479033 32.574856,-86.479051 32.574946)\r\n200;298;even;Sweetbriar Ln;Autauga;AL;36067;LINESTRING(-86.458333 32.48575,-86.458171 32.485748,-86.457752 32.485728,-86.457596 32.485708,-86.457372 32.485644,-86.457236 32.485582,-86.457104 32.485502,-86.456664 32.48518,-86.456587 32.485082,-86.456526 32.484897,-86.45651 32.484691,-86.45651 32.484258,-86.456523 32.483897,-86.456518 32.483782)\r\n201;299;odd;Sweetbriar Ln;Autauga;AL;36067;LINESTRING(-86.458333 32.485915,-86.458165 32.485916,-86.457734 32.485898,-86.457548 32.485884,-86.457286 32.485808,-86.457124 32.485728,-86.45698 32.485634,-86.456502 32.485304,-86.456383 32.48516,-86.456314 32.484923,-86.456312 32.484693,-86.456312 32.484256,-86.456329 32.483897,-86.456324 32.483788)\r\n216;200;all;Allenville Rd;Autauga;AL;36067;LINESTRING(-86.485742 32.465462,-86.485764 32.465298)\r\n217;223;all;Stewart St;Autauga;AL;36067;LINESTRING(-86.474966 32.44152,-86.474814 32.441765,-86.474632 32.44207)\r\n1799;1701;odd;Booth Cir;Autauga;AL;36008;LINESTRING(-86.571609 32.501307,-86.571604 32.501313,-86.571149 32.502261,-86.570877 32.502798)\r\n1798;1724;even;Booth Cir;Autauga;AL;36067;LINESTRING(-86.571786 32.501377,-86.571786 32.501381,-86.571331 32.502325,-86.571056 32.502863)\r\n322;338;even;Autauga County 165;Autauga;AL;36003;LINESTRING(-86.649782 32.444363,-86.648454 32.44716,-86.648318 32.447458,-86.648244 32.447621)\r\n301;341;odd;Autauga County 165;Autauga;AL;36003;LINESTRING(-86.649963 32.444424,-86.648636 32.44722,-86.6485 32.447518,-86.648425 32.447681)\r\n161;101;odd;W 5th St;Autauga;AL;36067;LINESTRING(-86.473707 32.46427,-86.473201 32.464234)\r\n148;118;even;W 5th St;Autauga;AL;36067;LINESTRING(-86.47369 32.464434,-86.473184 32.464398)\r\n301;399;all;Doster Rd;Autauga;AL;36067;LINESTRING(-86.467509 32.456716,-86.467425 32.456677)\r\n1001;1021;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.446324 32.455033,-86.445572 32.454241)\r\n1332;1346;even;Indian Hills Rd;Autauga;AL;36067;LINESTRING(-86.49754 32.460625,-86.497774 32.460487)\r\n1339;1357;odd;Indian Hills Rd;Autauga;AL;36067;LINESTRING(-86.497429 32.46049,-86.497663 32.460352)\r\n2000;2058;all;Airport Rd;Autauga;AL;36022;LINESTRING(-86.440262 32.591505,-86.440264 32.591669,-86.440258 32.591956,-86.440261 32.59246,-86.440246 32.593612,-86.440245 32.595127,-86.440297 32.59758,-86.440337 32.598952,-86.440337 32.599117)\r\n2199;2101;odd;Hosea Ln;Autauga;AL;36003;LINESTRING(-86.633794 32.453421,-86.633762 32.45341,-86.633601 32.453356,-86.633347 32.453298,-86.633176 32.453261,-86.633 32.453234,-86.632822 32.453221,-86.63213 32.453197,-86.631611 32.453203,-86.630751 32.453243,-86.630404 32.453272,-86.630148 32.453298,-86.629983 32.45331,-86.629822 32.453304,-86.629658 32.453287,-86.629147 32.453205,-86.628877 32.453193,-86.62827 32.453221,-86.627067 32.453244,-86.625955 32.453252,-86.625794 32.453242,-86.625653 32.453212,-86.625449 32.453118,-86.625115 32.4529,-86.624979 32.452813,-86.624853 32.452723,-86.624734 32.452626,-86.624714 32.452612)\r\n200;2198;even;Hosea Ln;Autauga;AL;36003;LINESTRING(-86.633736 32.453578,-86.633696 32.45357,-86.633537 32.45352,-86.633297 32.45346,-86.633134 32.453427,-86.632972 32.453404,-86.632808 32.453389,-86.632128 32.453363,-86.631619 32.453371,-86.630765 32.453411,-86.630426 32.453438,-86.63017 32.453464,-86.629989 32.45348,-86.629804 32.453478,-86.629626 32.453453,-86.629121 32.453377,-86.628875 32.453359,-86.628278 32.453389,-86.627071 32.45341,-86.625951 32.45342,-86.625768 32.453418,-86.625573 32.453388,-86.625333 32.453262,-86.624995 32.453032,-86.624855 32.452945,-86.624719 32.452849,-86.62459 32.452746,-86.62457 32.452723)\r\n116;198;even;St Francis Pl;Autauga;AL;36066;LINESTRING(-86.453253 32.533617,-86.453139 32.533543,-86.452916 32.533507,-86.452515 32.533496,-86.452202 32.53359,-86.452106 32.53368)\r\n157;199;odd;St Francis Pl;Autauga;AL;36066;LINESTRING(-86.45315 32.533756,-86.453055 32.533719,-86.452892 32.533685,-86.452551 32.533682,-86.45232 32.533756,-86.452236 32.533803)\r\n100;198;even;E 6th St;Autauga;AL;36067;LINESTRING(-86.471133 32.465634,-86.470526 32.465585,-86.469915 32.465554,-86.469737 32.465554,-86.4693 32.465554,-86.469209 32.465561,-86.468969 32.46557)\r\n101;173;odd;E 6th St;Autauga;AL;36067;LINESTRING(-86.471115 32.465797,-86.470512 32.465751,-86.469907 32.465722,-86.469737 32.465718,-86.469308 32.465724,-86.469221 32.465729,-86.468976 32.465735)\r\n308;472;even;Wetumpka St;Autauga;AL;36067;LINESTRING(-86.465734 32.46376,-86.463338 32.463938,-86.462067 32.464017)\r\n325;499;odd;Wetumpka St;Autauga;AL;36067;LINESTRING(-86.465751 32.463924,-86.463354 32.464104,-86.462082 32.464181)\r\n2018;2000;all;Gibbons Rd;Autauga;AL;36067;LINESTRING(-86.476756 32.577792,-86.476607 32.577819,-86.476339 32.577881,-86.476165 32.577885,-86.475754 32.57772,-86.475391 32.577578,-86.47522 32.577538,-86.474939 32.577397,-86.474805 32.577254,-86.474671 32.577,-86.474554 32.576791)\r\n1300;1332;even;Northington Rd;Autauga;AL;36067;LINESTRING(-86.495891 32.452803,-86.495896 32.452808,-86.496465 32.452924,-86.497045 32.453055,-86.497499 32.453157)\r\n1301;1399;odd;Northington Rd;Autauga;AL;36067;LINESTRING(-86.495953 32.452648,-86.495952 32.452644,-86.496513 32.452764,-86.497095 32.452895,-86.497549 32.452998)\r\n208;278;all;Norris Rd;Autauga;AL;36067;LINESTRING(-86.515359 32.472083,-86.515355 32.47207,-86.515357 32.471928,-86.515372 32.471706,-86.515409 32.471414,-86.515429 32.471303)\r\n298;214;all;Doe Dr;Autauga;AL;36067;LINESTRING(-86.483419 32.452045,-86.483339 32.452081,-86.483268 32.452115,-86.483136 32.452192,-86.483024 32.452274,-86.482981 32.452316,-86.482948 32.452365,-86.48292 32.452419,-86.482904 32.452482,-86.482885 32.452618,-86.48288 32.453117,-86.482881 32.453195)\r\n1501;1599;all;Wm Willis Pl;Autauga;AL;36067;LINESTRING(-86.455333 32.52883,-86.455372 32.528809,-86.455424 32.528793)\r\n758;798;even;Silver Hills Dr;Autauga;AL;36066;LINESTRING(-86.4298 32.454044,-86.430078 32.453946,-86.430331 32.453873,-86.430573 32.453735,-86.43074 32.453525,-86.4308 32.453286,-86.4308 32.453127,-86.430791 32.452967)\r\n751;799;odd;Silver Hills Dr;Autauga;AL;36066;LINESTRING(-86.429724 32.453892,-86.430004 32.45379,-86.430231 32.453711,-86.430411 32.453601,-86.430532 32.453449,-86.43059 32.453262,-86.430606 32.453127,-86.430597 32.452975)\r\n2431;2499;all;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.487902 32.62655,-86.48802 32.626892,-86.488145 32.627318,-86.488285 32.627961,-86.488372 32.62839,-86.488414 32.628682,-86.488453 32.629117,-86.488467 32.629341,-86.488459 32.629436)\r\n1365;1333;all;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.645179 32.55622,-86.644977 32.556567,-86.644745 32.556957,-86.644523 32.55734,-86.643823 32.558517)\r\n900;990;even;Fireside Dr;Autauga;AL;36067;LINESTRING(-86.481593 32.444807,-86.481602 32.445675,-86.481567 32.445808,-86.481489 32.445922,-86.481437 32.445968,-86.481432 32.445968,-86.481213 32.446029,-86.480798 32.446044)\r\n901;927;odd;Fireside Dr;Autauga;AL;36067;LINESTRING(-86.481787 32.444804,-86.48181 32.445687,-86.481783 32.44588,-86.481653 32.446028,-86.481583 32.446102,-86.481532 32.446136,-86.481249 32.446215,-86.4808 32.446209)\r\n1651;1655;all;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.664247 32.604167,-86.664328 32.604311,-86.66438 32.604522,-86.664431 32.604875,-86.664456 32.605163,-86.664469 32.60544)\r\n2388;2498;all;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.486997 32.625046,-86.487003 32.625061,-86.487143 32.625318)\r\n900;998;even;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.803097 32.384287,-86.802927 32.384293,-86.798464 32.384333)\r\n901;999;odd;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.803107 32.384452,-86.802933 32.384461,-86.798466 32.384498)\r\n1700;1790;even;Adrian Dr;Autauga;AL;36067;LINESTRING(-86.699838 32.585779,-86.699833 32.585871,-86.69985 32.586991)\r\n1701;1799;odd;Adrian Dr;Autauga;AL;36067;LINESTRING(-86.700033 32.585785,-86.700031 32.585873,-86.700045 32.586989)\r\n1001;1021;all;Autauga County 49;Autauga;AL;36051;LINESTRING(-86.587769 32.63238,-86.587773 32.632457,-86.587789 32.632682,-86.587776 32.632983,-86.587702 32.63393,-86.587702 32.63414,-86.587748 32.634489,-86.587783 32.634638)\r\n244;298;all;Givens Ct;Autauga;AL;36022;LINESTRING(-86.48497 32.589024,-86.484902 32.588984,-86.484866 32.588959,-86.484815 32.588936,-86.48476 32.588912,-86.484692 32.588888,-86.484644 32.588851,-86.484603 32.588832,-86.484563 32.588812,-86.484511 32.588794,-86.484458 32.588779,-86.484412 32.58877,-86.484416 32.588764)\r\n1700;1798;even;Autauga County 7;Autauga;AL;36758;LINESTRING(-86.87136 32.628504,-86.871368 32.629644,-86.871363 32.630088,-86.871389 32.631102,-86.871385 32.631748,-86.871422 32.632333,-86.871458 32.633282,-86.87148 32.635225,-86.871462 32.636668)\r\n1701;1751;odd;Autauga County 7;Autauga;AL;36758;LINESTRING(-86.871554 32.628503,-86.871564 32.629644,-86.871559 32.630086,-86.871585 32.6311,-86.871585 32.631744,-86.871618 32.632327,-86.871656 32.633278,-86.871676 32.635225,-86.871657 32.636669)\r\n999;945;odd;Autauga County 20;Autauga;AL;36051;LINESTRING(-86.596182 32.648352,-86.596176 32.648356,-86.596152 32.648421,-86.596087 32.648552,-86.595899 32.648884,-86.595388 32.649811,-86.595163 32.650201,-86.595003 32.650448,-86.594818 32.650688,-86.59472 32.650798,-86.594446 32.65107,-86.594271 32.651221,-86.594019 32.651408,-86.593751 32.651583,-86.593614 32.651663,-86.593401 32.651775,-86.59325 32.651846,-86.593104 32.651912,-86.592874 32.652001,-86.592642 32.652084,-86.592418 32.652157,-86.592213 32.65222)\r\n998;948;even;Autauga County 20;Autauga;AL;36051;LINESTRING(-86.596372 32.648387,-86.596374 32.6484,-86.596342 32.648481,-86.596267 32.648622,-86.596077 32.648954,-86.595566 32.649883,-86.595339 32.650277,-86.595177 32.650536,-86.594984 32.650786,-86.594876 32.650904,-86.594596 32.651184,-86.594411 32.651345,-86.594147 32.65154,-86.593869 32.651719,-86.593724 32.651803,-86.593503 32.651923,-86.593344 32.651992,-86.593194 32.652064,-86.592954 32.652155,-86.592716 32.652238,-86.592488 32.652315,-86.592277 32.652375)\r\n212;298;even;Autauga County 100;Autauga;AL;36022;LINESTRING(-86.448105 32.602162,-86.448052 32.602163,-86.446693 32.602147,-86.444993 32.602149,-86.443972 32.602158,-86.44329 32.602169,-86.442186 32.60218,-86.441438 32.602184,-86.441167 32.602185,-86.440911 32.60218,-86.440622 32.602184)\r\n201;299;odd;Autauga County 100;Autauga;AL;36022;LINESTRING(-86.448111 32.602327,-86.448054 32.602329,-86.446691 32.602313,-86.444995 32.602315,-86.443974 32.602324,-86.443294 32.602335,-86.442188 32.602346,-86.44144 32.602348,-86.441165 32.602351,-86.440911 32.602346,-86.440624 32.602349)\r\n3100;3216;even;State Rte 14;Autauga;AL;36003;LINESTRING(-86.721847 32.449461,-86.722145 32.449518,-86.723394 32.449745,-86.724148 32.449883,-86.725164 32.450052,-86.727023 32.450333,-86.727208 32.450356)\r\n3183;3199;odd;State Rte 14;Autauga;AL;36003;LINESTRING(-86.72189 32.449301,-86.722187 32.449356,-86.723434 32.449585,-86.724188 32.449721,-86.7252 32.449888,-86.727055 32.450169,-86.727238 32.450194)\r\n622;698;even;Sunset Dr;Autauga;AL;36067;LINESTRING(-86.445362 32.44988,-86.44533 32.449879,-86.444813 32.449882,-86.444727 32.449889,-86.444712 32.449889)\r\n601;699;odd;Sunset Dr;Autauga;AL;36067;LINESTRING(-86.44538 32.450044,-86.44534 32.450051,-86.444821 32.450052,-86.444729 32.450055,-86.444704 32.450053)\r\n399;387;all;W 6th St;Autauga;AL;36067;LINESTRING(-86.481966 32.466384,-86.481786 32.466378,-86.481129 32.466339)\r\n1934;1998;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.583212 32.499461,-86.583326 32.499635,-86.583438 32.499816,-86.583661 32.500209,-86.583796 32.500473,-86.584048 32.501013,-86.584163 32.501284,-86.584545 32.502257,-86.58472 32.50273)\r\n1931;1999;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.583382 32.499381,-86.583498 32.499555,-86.583616 32.49974,-86.583841 32.500139,-86.58398 32.500409,-86.584232 32.500955,-86.584349 32.50123,-86.584731 32.502207,-86.584905 32.502681)\r\n1623;1601;odd;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.557169 32.500481,-86.556657 32.50052,-86.555026 32.500651,-86.554678 32.500687,-86.55442 32.500729,-86.554164 32.500779,-86.553995 32.500822,-86.553828 32.500869,-86.553583 32.500948,-86.553341 32.501039,-86.553306 32.501057)\r\n1644;1600;even;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.557186 32.500645,-86.556675 32.500684,-86.555048 32.500817,-86.55471 32.500855,-86.554462 32.500893,-86.554216 32.500943,-86.554055 32.500982,-86.553896 32.501027,-86.553659 32.501104,-86.553429 32.501191,-86.553396 32.501203)\r\n1612;1600;all;Martin Dr;Autauga;AL;36022;LINESTRING(-86.444204 32.545839,-86.444195 32.545771,-86.444202 32.545561,-86.444195 32.545272,-86.444035 32.545312,-86.443726 32.545353)\r\n101;199;odd;Country Club Manor;Autauga;AL;36067;LINESTRING(-86.472042 32.440361,-86.471741 32.440099,-86.471551 32.439879,-86.471536 32.439881)\r\n100;198;even;Country Club Manor;Autauga;AL;36067;LINESTRING(-86.471904 32.440477,-86.471587 32.440215,-86.471343 32.439963,-86.471346 32.439919)\r\n1136;1198;all;Parkview Dr;Autauga;AL;36067;LINESTRING(-86.476633 32.499578,-86.476656 32.499683,-86.477057 32.499676)\r\n101;103;all;Crenshaw Ct;Autauga;AL;36067;LINESTRING(-86.478337 32.497981,-86.478693 32.497999)\r\n300;592;even;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.634451 32.4772,-86.634377 32.477425,-86.634325 32.477561,-86.634236 32.47776,-86.634168 32.477887,-86.634089 32.478011,-86.634 32.478129,-86.633903 32.478242,-86.63357 32.478571,-86.63334 32.478786,-86.632751 32.479315,-86.632383 32.479617,-86.631882 32.480014,-86.631498 32.480307,-86.630993 32.48071,-86.630639 32.481034,-86.630185 32.481476,-86.62974 32.48192,-86.629644 32.482014,-86.629456 32.482194,-86.628793 32.482862,-86.628683 32.482976,-86.628578 32.483096,-86.628482 32.483221,-86.628306 32.483473,-86.62815 32.483733,-86.627856 32.484261,-86.627643 32.484657,-86.627413 32.485047,-86.627247 32.485297,-86.627159 32.485415,-86.626959 32.485645,-86.626852 32.485752,-86.626618 32.48596,-86.626497 32.486057,-86.626106 32.48634,-86.625586 32.486722,-86.625137 32.487063,-86.624827 32.487319,-86.624126 32.487959,-86.623765 32.488263,-86.622939 32.488896,-86.622321 32.4894,-86.621753 32.489839,-86.620958 32.49039,-86.620819 32.490476,-86.620681 32.490568,-86.620423 32.490767,-86.6203 32.490873,-86.62018 32.490984,-86.620067 32.491097,-86.619965 32.491223,-86.619874 32.491352,-86.619795 32.491489,-86.619729 32.491627,-86.619672 32.491771,-86.619628 32.491919,-86.619603 32.492071,-86.619578 32.492363,-86.61957 32.492509,-86.619531 32.492944,-86.619502 32.493158,-86.619474 32.493296,-86.619434 32.49343,-86.619382 32.49356,-86.619313 32.493676,-86.619169 32.493836,-86.618927 32.494029,-86.618589 32.494256,-86.618403 32.494421,-86.618243 32.494602,-86.618114 32.494802,-86.618038 32.494937,-86.617661 32.495752,-86.617526 32.496017,-86.617381 32.496276,-86.617302 32.4964,-86.617125 32.496645,-86.616935 32.496882,-86.61658 32.497294,-86.616482 32.497418,-86.616388 32.497544,-86.616302 32.497678,-86.616235 32.497823,-86.616186 32.497971,-86.616166 32.498125,-86.616163 32.498202)\r\n443;599;odd;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.634639 32.477243,-86.634567 32.477473,-86.634513 32.477617,-86.634422 32.477826,-86.634348 32.477963,-86.634263 32.478097,-86.634166 32.478225,-86.634061 32.478348,-86.633718 32.478681,-86.633484 32.478898,-86.632893 32.479433,-86.632519 32.479737,-86.632014 32.480136,-86.631632 32.480429,-86.631135 32.48083,-86.630785 32.481146,-86.630333 32.481584,-86.629888 32.482028,-86.62979 32.482122,-86.629606 32.482302,-86.628945 32.482968,-86.628841 32.483078,-86.628742 32.483192,-86.628652 32.483309,-86.628482 32.483555,-86.628328 32.483807,-86.628034 32.484331,-86.627823 32.484729,-86.627589 32.485125,-86.627419 32.485383,-86.627327 32.485511,-86.627117 32.485751,-86.627 32.485866,-86.62676 32.48608,-86.626631 32.486183,-86.626234 32.486466,-86.625716 32.486846,-86.625273 32.487185,-86.624969 32.487437,-86.624268 32.488075,-86.623903 32.488385,-86.623073 32.489018,-86.622455 32.489522,-86.621883 32.489967,-86.62108 32.490524,-86.620939 32.49061,-86.620811 32.490698,-86.620561 32.490889,-86.620444 32.490989,-86.62033 32.491094,-86.620229 32.491201,-86.620135 32.491315,-86.620052 32.491434,-86.619979 32.491559,-86.619917 32.491685,-86.619866 32.491819,-86.619828 32.491953,-86.619803 32.492089,-86.619776 32.492373,-86.619768 32.492519,-86.619727 32.49296,-86.6197 32.49318,-86.619672 32.49333,-86.619628 32.493478,-86.619574 32.493624,-86.619495 32.493772,-86.619323 32.493956,-86.619057 32.494157,-86.618729 32.494384,-86.618561 32.494533,-86.618417 32.494698,-86.618292 32.49488,-86.618222 32.495005,-86.617843 32.495816,-86.617706 32.496085,-86.617559 32.496352,-86.617476 32.496484,-86.617293 32.496737,-86.617097 32.496978,-86.616742 32.49739,-86.616648 32.497508,-86.616562 32.497628,-86.616488 32.49775,-86.616429 32.497877,-86.61639 32.498005,-86.616366 32.498141,-86.616357 32.498213)\r\n700;798;even;Wingard St;Autauga;AL;36066;LINESTRING(-86.446068 32.46021,-86.446071 32.460115,-86.446078 32.459972,-86.44607 32.459098,-86.446047 32.458868)\r\n701;749;odd;Wingard St;Autauga;AL;36066;LINESTRING(-86.445874 32.46021,-86.445871 32.460111,-86.44588 32.459968,-86.44587 32.459106,-86.445853 32.45888)\r\n1122;1260;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.444054 32.452195,-86.44251 32.450533,-86.442127 32.450144,-86.441557 32.449595,-86.441146 32.449224,-86.440558 32.448732)\r\n799;701;odd;Old Creek Rd;Autauga;AL;36066;LINESTRING(-86.427346 32.457571,-86.427366 32.457581,-86.427458 32.4576,-86.42756 32.457608,-86.427846 32.4576,-86.428101 32.457486,-86.428645 32.457116,-86.428969 32.456892,-86.429072 32.456831)\r\n798;700;even;Old Creek Rd;Autauga;AL;36066;LINESTRING(-86.427411 32.457416,-86.427424 32.457415,-86.427496 32.45743,-86.427564 32.45744,-86.427784 32.457414,-86.427987 32.457334,-86.428521 32.456986,-86.428847 32.456752,-86.428968 32.456692)\r\n401;421;all;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.897804 32.526737,-86.897791 32.526966,-86.897788 32.526991)\r\n901;999;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.448414 32.45725,-86.448398 32.457238,-86.448336 32.457181,-86.447926 32.456733,-86.44782 32.45663,-86.446704 32.455444,-86.446504 32.455226)\r\n2199;2163;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.62748 32.437072,-86.626363 32.43708,-86.625242 32.437079,-86.624638 32.437075,-86.624339 32.437077)\r\n224;238;even;Gardenia Ct;Autauga;AL;36067;LINESTRING(-86.459132 32.471884,-86.459849 32.472184,-86.460241 32.472363)\r\n227;239;odd;Gardenia Ct;Autauga;AL;36067;LINESTRING(-86.459218 32.471736,-86.459941 32.472034,-86.460335 32.472219)\r\n110;116;all;Lake Haven Way;Autauga;AL;36066;LINESTRING(-86.432888 32.46849,-86.432706 32.468291,-86.43221 32.467798,-86.432155 32.467743)\r\n712;798;even;Autauga County 95;Autauga;AL;36749;LINESTRING(-86.825508 32.534579,-86.825502 32.534583,-86.825248 32.534775,-86.82459 32.535237,-86.824205 32.535527,-86.823286 32.536185,-86.822627 32.536649,-86.822359 32.536829,-86.821742 32.537218,-86.821672 32.537264,-86.821605 32.537317,-86.821542 32.537375,-86.821486 32.537443,-86.821328 32.537708,-86.821183 32.537977,-86.821068 32.538257,-86.821024 32.538402,-86.821005 32.538481,-86.82099 32.53863,-86.820979 32.539069,-86.820979 32.539579,-86.820984 32.539798,-86.820993 32.539879,-86.821018 32.539961,-86.821061 32.540037,-86.821111 32.540106,-86.821269 32.540286,-86.821754 32.540794,-86.821956 32.541023,-86.822153 32.541262,-86.82227 32.541375,-86.822456 32.541532,-86.822833 32.541824,-86.822948 32.541924,-86.822999 32.541975,-86.823045 32.542029,-86.823083 32.542084,-86.823117 32.542142,-86.823143 32.542204,-86.823188 32.542339,-86.823241 32.542546,-86.823307 32.54283,-86.823343 32.542971,-86.823402 32.543164)\r\n701;799;odd;Autauga County 95;Autauga;AL;36749;LINESTRING(-86.825643 32.534698,-86.825636 32.534705,-86.825378 32.534901,-86.82472 32.535363,-86.824335 32.535653,-86.823412 32.536311,-86.822751 32.536779,-86.822479 32.536961,-86.821864 32.53735,-86.821806 32.537392,-86.821751 32.537437,-86.821704 32.537483,-86.821664 32.537533,-86.821508 32.537782,-86.821371 32.538041,-86.821262 32.538307,-86.82122 32.53844,-86.821207 32.538505,-86.82119 32.53864,-86.821175 32.539071,-86.821177 32.539577,-86.821186 32.539786,-86.821197 32.539845,-86.821216 32.539901,-86.821243 32.539957,-86.821281 32.540012,-86.821427 32.540184,-86.82191 32.540692,-86.822116 32.540925,-86.822313 32.541156,-86.822418 32.541259,-86.822594 32.54141,-86.822973 32.541702,-86.823098 32.54181,-86.823157 32.541869,-86.823213 32.541933,-86.823265 32.542002,-86.823303 32.542078,-86.823337 32.542152,-86.823382 32.542299,-86.823433 32.542514,-86.823499 32.542796,-86.823535 32.542933,-86.823591 32.543124)\r\n598;500;all;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.684523 32.396646,-86.684564 32.396649,-86.684608 32.396662,-86.684848 32.396657,-86.685112 32.396652,-86.685313 32.396671,-86.685485 32.39676,-86.685607 32.39687,-86.685969 32.397183,-86.686338 32.397479,-86.686521 32.397644,-86.686631 32.397766,-86.686825 32.398006,-86.687028 32.398236,-86.687135 32.398345,-86.687366 32.398563,-86.687481 32.398677,-86.687589 32.398796,-86.687889 32.399148,-86.687993 32.399261,-86.688207 32.399479,-86.688657 32.399918,-86.688874 32.400148,-86.688975 32.400272,-86.68907 32.400398,-86.68925 32.400647,-86.689432 32.400887,-86.689524 32.400999,-86.689725 32.401225,-86.689861 32.40139)\r\n3300;3394;all;Autauga County 78;Autauga;AL;36003;LINESTRING(-86.735755 32.436413,-86.73586 32.436496,-86.736002 32.436578,-86.736145 32.436648,-86.736293 32.436711,-86.736451 32.436778,-86.736624 32.436831,-86.736797 32.436865,-86.736967 32.43689,-86.737136 32.43691,-86.737479 32.436944,-86.738179 32.436995,-86.738532 32.437017,-86.738707 32.437017,-86.738881 32.437009,-86.739222 32.436989,-86.739744 32.436979,-86.73993 32.436971,-86.740116 32.436938,-86.740286 32.43688,-86.740444 32.436805,-86.741257 32.436388,-86.741401 32.436333,-86.741538 32.436304,-86.741686 32.436312,-86.741835 32.436338,-86.74198 32.436381,-86.742125 32.436442,-86.742274 32.436516,-86.742436 32.436594,-86.742722 32.436642,-86.742927 32.436618,-86.743017 32.436573,-86.743164 32.436498,-86.743386 32.436398,-86.743537 32.436339,-86.743692 32.436286,-86.743853 32.436237,-86.744495 32.436032,-86.744656 32.435986,-86.74482 32.435948,-86.744982 32.435922,-86.745148 32.435907,-86.745314 32.435901,-86.746556 32.435889)\r\n424;498;even;Reynolds Mill Rd;Autauga;AL;36067;LINESTRING(-86.46245 32.425383,-86.462196 32.425368,-86.462023 32.425371,-86.462015 32.425372)\r\n433;499;odd;Reynolds Mill Rd;Autauga;AL;36067;LINESTRING(-86.462439 32.425547,-86.462192 32.425536,-86.462025 32.425537,-86.462017 32.425536)\r\n1534;1500;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.418136 32.432359,-86.418267 32.432467,-86.418323 32.432511,-86.418569 32.432717,-86.418683 32.432807,-86.41921 32.433209,-86.420758 32.434377,-86.421365 32.434833,-86.421462 32.434901)\r\n300;398;even;Autauga County 68;Autauga;AL;36022;LINESTRING(-86.468855 32.662289,-86.468659 32.662304,-86.468238 32.662326,-86.467901 32.662334,-86.467735 32.66233,-86.467397 32.662314,-86.466723 32.662259,-86.466385 32.662225,-86.466041 32.662197,-86.465694 32.662184,-86.46517 32.662207,-86.464745 32.662294,-86.464494 32.662367,-86.464252 32.662457,-86.463871 32.662639,-86.463528 32.662872,-86.463281 32.663084,-86.463065 32.663319,-86.462921 32.663506,-86.462884 32.663571)\r\n301;399;odd;Autauga County 68;Autauga;AL;36022;LINESTRING(-86.468874 32.662453,-86.468675 32.66247,-86.468246 32.662494,-86.467901 32.662498,-86.467727 32.662496,-86.467383 32.662482,-86.466701 32.662425,-86.466365 32.662391,-86.466027 32.662365,-86.465696 32.66235,-86.465202 32.662383,-86.464801 32.66246,-86.464568 32.662527,-86.464344 32.662611,-86.463989 32.662785,-86.463666 32.663002,-86.463435 32.663198,-86.463231 32.663419,-86.463095 32.663594,-86.463056 32.663649)\r\n100;148;even;10th St;Autauga;AL;36067;LINESTRING(-86.470472 32.473577,-86.470064 32.473577,-86.469639 32.473592,-86.469129 32.473598,-86.468785 32.473609)\r\n101;147;odd;10th St;Autauga;AL;36067;LINESTRING(-86.470474 32.473741,-86.470068 32.473745,-86.469645 32.473758,-86.469133 32.473764,-86.468791 32.473773)\r\n3050;3098;even;State Rte 143;Autauga;AL;36051;LINESTRING(-86.47092 32.702394,-86.471099 32.70246,-86.47158 32.70261,-86.47253 32.702926,-86.472836 32.703041,-86.473128 32.703174,-86.473406 32.703331,-86.473539 32.703416,-86.473733 32.703552,-86.473913 32.703697,-86.473979 32.703754,-86.474083 32.703853,-86.47424 32.704018,-86.474433 32.70425,-86.474567 32.704432,-86.475564 32.705896)\r\n3051;3087;odd;State Rte 143;Autauga;AL;36022;LINESTRING(-86.470997 32.702243,-86.471173 32.702304,-86.47165 32.702456,-86.472606 32.702772,-86.472924 32.702887,-86.473234 32.703026,-86.473522 32.703195,-86.473663 32.703284,-86.473867 32.703424,-86.474059 32.703577,-86.474125 32.703644,-86.474235 32.703743,-86.4744 32.703916,-86.474601 32.704156,-86.474737 32.704346,-86.475733 32.705814)\r\n1400;1498;even;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.460828 32.506735,-86.460265 32.507736,-86.459532 32.50896,-86.459131 32.509595,-86.458614 32.510421,-86.458484 32.5106,-86.458386 32.510713,-86.458332 32.510771)\r\n1427;1499;odd;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.461003 32.506806,-86.460441 32.50781,-86.459706 32.509036,-86.459303 32.509673,-86.458788 32.510505,-86.458652 32.510696,-86.458542 32.510817,-86.458482 32.510876)\r\n1632;1652;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.654116 32.524254,-86.655473 32.524281,-86.657063 32.52432)\r\n1637;1657;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.65412 32.52409,-86.655479 32.524115,-86.657069 32.524155)\r\n124;126;all;Indian Trl;Autauga;AL;36067;LINESTRING(-86.558026 32.432693,-86.558027 32.432904,-86.558027 32.433538)\r\n2600;2698;all;Stoudmire Rd;Autauga;AL;36003;LINESTRING(-86.653442 32.428933,-86.65347 32.428919,-86.653695 32.428798,-86.65419 32.428519,-86.654201 32.428509)\r\n1000;1098;even;Langfield Dr;Autauga;AL;36067;LINESTRING(-86.534154 32.468141,-86.534252 32.468054,-86.53441 32.467805,-86.534606 32.46736,-86.534842 32.466794,-86.534881 32.466422,-86.53479 32.465992,-86.534554 32.465674,-86.534019 32.465083)\r\n1001;1099;odd;Langfield Dr;Autauga;AL;36067;LINESTRING(-86.534005 32.468035,-86.534076 32.467952,-86.534222 32.467731,-86.53442 32.467304,-86.534632 32.466756,-86.534679 32.46643,-86.53458 32.46606,-86.534384 32.46577,-86.533864 32.465182)\r\n300;398;even;Devondale Ln;Autauga;AL;36067;LINESTRING(-86.60847 32.462871,-86.609022 32.462871,-86.609533 32.46286,-86.610051 32.462838,-86.610143 32.462827,-86.610324 32.462795,-86.610487 32.46274,-86.610644 32.462699,-86.610802 32.46267,-86.611048 32.462645,-86.611214 32.462637,-86.61138 32.462637,-86.611544 32.462647,-86.611958 32.462702,-86.612117 32.462735,-86.612188 32.462758,-86.612255 32.462785,-86.612321 32.462819,-86.61253 32.46295,-86.612681 32.463035,-86.612766 32.46307,-86.612854 32.4631,-86.612949 32.463132,-86.613383 32.463163,-86.613619 32.463212,-86.613687 32.463235,-86.613822 32.463297,-86.613935 32.463376,-86.614081 32.463535,-86.614121 32.46359,-86.614279 32.463848,-86.614517 32.46422,-86.614593 32.464416,-86.614658 32.464628,-86.614743 32.464828,-86.614776 32.464957,-86.614792 32.465106,-86.614862 32.465291)\r\n301;399;odd;Devondale Ln;Autauga;AL;36067;LINESTRING(-86.60847 32.462707,-86.60902 32.462705,-86.609525 32.462694,-86.610031 32.462668,-86.610107 32.462659,-86.610264 32.462627,-86.610423 32.46258,-86.610592 32.462535,-86.610768 32.462498,-86.611032 32.462475,-86.61121 32.462469,-86.611386 32.462469,-86.611566 32.462475,-86.611998 32.462534,-86.612175 32.462571,-86.612268 32.462596,-86.612355 32.462635,-86.612435 32.462679,-86.612644 32.46281,-86.612783 32.462885,-86.61285 32.462914,-86.612924 32.46294,-86.612993 32.462954,-86.613419 32.462987,-86.613681 32.463048,-86.613771 32.463075,-86.61394 32.463147,-86.614091 32.46325,-86.614251 32.463439,-86.614297 32.463508,-86.614453 32.463768,-86.614715 32.46415,-86.614783 32.46437,-86.614852 32.464576,-86.614947 32.46478,-86.614974 32.464933,-86.614998 32.465072,-86.615049 32.465246)\r\n399;317;odd;Hampstead St;Autauga;AL;36066;LINESTRING(-86.419474 32.464286,-86.419478 32.464427,-86.419476 32.465038)\r\n398;318;even;Hampstead St;Autauga;AL;36066;LINESTRING(-86.419669 32.464281,-86.419676 32.464425,-86.419671 32.465039)\r\n2010;2098;even;Goose Pointe Lndg;Autauga;AL;36067;LINESTRING(-86.541793 32.505488,-86.541782 32.50551,-86.54176 32.505571,-86.541692 32.505695,-86.541653 32.505752,-86.541606 32.505803,-86.541495 32.505904,-86.541372 32.505995,-86.54124 32.506077,-86.540739 32.506346,-86.54069 32.506373)\r\n2009;2099;odd;Goose Pointe Lndg;Autauga;AL;36067;LINESTRING(-86.541984 32.505521,-86.541982 32.505556,-86.541948 32.505633,-86.541876 32.505777,-86.541821 32.505848,-86.541764 32.505915,-86.541637 32.50603,-86.541498 32.506129,-86.541352 32.506217,-86.540843 32.506488,-86.540791 32.506513)\r\n1482;1548;even;Autauga County 43;Autauga;AL;36067;LINESTRING(-86.614639 32.597403,-86.614618 32.597514,-86.614584 32.597683,-86.614442 32.598248,-86.614401 32.598385,-86.614301 32.598657,-86.614244 32.598786,-86.614177 32.598912,-86.61402 32.599162,-86.613936 32.59928,-86.613844 32.599398,-86.613644 32.59963,-86.612972 32.600362,-86.612865 32.600467,-86.612808 32.600516,-86.612687 32.600606,-86.61256 32.600675,-86.61242 32.600725,-86.612267 32.600755,-86.612106 32.600768,-86.610569 32.600771,-86.60997 32.600778,-86.609628 32.600777,-86.609454 32.600782,-86.60903 32.600814)\r\n1501;1599;odd;Autauga County 43;Autauga;AL;36067;LINESTRING(-86.614832 32.59743,-86.61481 32.59754,-86.61478 32.597713,-86.614634 32.598284,-86.614595 32.598431,-86.614491 32.598711,-86.61443 32.59885,-86.614359 32.598988,-86.614192 32.599244,-86.614104 32.59937,-86.614008 32.599494,-86.613802 32.59973,-86.613128 32.60047,-86.613011 32.600581,-86.612948 32.600638,-86.612815 32.600744,-86.61266 32.600835,-86.612482 32.600895,-86.612299 32.600927,-86.612116 32.60094,-86.610571 32.600937,-86.609972 32.600944,-86.609632 32.600945,-86.609466 32.60095,-86.609047 32.600978)\r\n100;198;even;Croydon Dr;Autauga;AL;36066;LINESTRING(-86.441539 32.47442,-86.441543 32.474361,-86.441527 32.4742,-86.44148 32.474108,-86.441415 32.474043,-86.441288 32.473935,-86.441109 32.47379,-86.440973 32.47363,-86.440916 32.473514,-86.440861 32.473311,-86.44084 32.473178,-86.440845 32.473085,-86.440871 32.473002,-86.440937 32.472883,-86.441017 32.472767,-86.441019 32.472762)\r\n101;199;odd;Croydon Dr;Autauga;AL;36066;LINESTRING(-86.441344 32.474421,-86.441339 32.474371,-86.441315 32.474248,-86.441292 32.4742,-86.441259 32.474157,-86.441148 32.474057,-86.440949 32.47391,-86.440783 32.473718,-86.440714 32.473564,-86.440665 32.473341,-86.440632 32.47319,-86.440631 32.473061,-86.440669 32.472936,-86.440763 32.472801,-86.440849 32.472679,-86.440856 32.472672)\r\n448;440;all;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.674889 32.393176,-86.674841 32.393259,-86.674794 32.393319,-86.674716 32.393431)\r\n232;298;even;Autauga County 21;Autauga;AL;36003;LINESTRING(-86.633825 32.453669,-86.633891 32.454133,-86.633971 32.454712,-86.63402 32.455,-86.634075 32.455289,-86.634168 32.455719,-86.634348 32.456432,-86.634839 32.458352,-86.635191 32.459761)\r\n215;253;odd;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.634018 32.45365,-86.634085 32.454113,-86.634167 32.45469,-86.634214 32.454976,-86.634269 32.455261,-86.634362 32.455687,-86.634538 32.456398,-86.635029 32.458318,-86.635381 32.459727)\r\n1056;1098;even;Loren St;Autauga;AL;36067;LINESTRING(-86.462733 32.425963,-86.462718 32.425828,-86.462697 32.425589)\r\n1057;1099;odd;Loren St;Autauga;AL;36067;LINESTRING(-86.462539 32.425979,-86.462522 32.425842,-86.462503 32.425601)\r\n100;148;even;Maple St;Autauga;AL;36067;LINESTRING(-86.475707 32.458645,-86.475638 32.458604,-86.475507 32.458525,-86.475171 32.458304,-86.474359 32.457803)\r\n101;199;odd;Maple St;Autauga;AL;36067;LINESTRING(-86.475601 32.458783,-86.475524 32.458744,-86.475389 32.458659,-86.475053 32.458438,-86.474244 32.457935)\r\n3001;3027;all;State Rte 143;Autauga;AL;36051;LINESTRING(-86.463853 32.699688,-86.463997 32.699786,-86.464199 32.699913,-86.464335 32.699991,-86.464477 32.700061,-86.464698 32.700156,-86.464929 32.700242,-86.467467 32.701089,-86.467784 32.701192)\r\n200;298;even;Doster Rd;Autauga;AL;36067;LINESTRING(-86.470162 32.457113,-86.469724 32.457039,-86.468914 32.456873,-86.468752 32.456845,-86.467941 32.456672,-86.467808 32.45664)\r\n201;299;odd;Doster Rd;Autauga;AL;36067;LINESTRING(-86.470125 32.457274,-86.469682 32.457203,-86.46887 32.457037,-86.468708 32.457009,-86.467887 32.456834,-86.467752 32.456797)\r\n1298;1242;even;Valridge N;Autauga;AL;36066;LINESTRING(-86.439197 32.502556,-86.439194 32.502659)\r\n1249;1299;odd;Valridge N;Autauga;AL;36066;LINESTRING(-86.439392 32.502559,-86.439389 32.502662)\r\n2825;2801;odd;State Rte 14;Autauga;AL;36003;LINESTRING(-86.668669 32.429696,-86.664722 32.430291)\r\n2844;2800;even;State Rte 14;Autauga;AL;36003;LINESTRING(-86.668703 32.429858,-86.664756 32.430453)\r\n731;701;all;Red Fox Hollow Rd;Autauga;AL;36051;LINESTRING(-86.539286 32.651863,-86.539244 32.651863,-86.53857 32.651935,-86.538317 32.651953,-86.537979 32.651967,-86.537639 32.651967,-86.537305 32.651978,-86.536107 32.651988,-86.535505 32.65198,-86.535156 32.651983,-86.534807 32.652001,-86.534544 32.652026,-86.534363 32.652051,-86.534266 32.652076,-86.534175 32.652112,-86.53409 32.652154,-86.534017 32.652207,-86.533949 32.652259,-86.533832 32.652372,-86.533779 32.652433,-86.533391 32.652913,-86.533286 32.653023,-86.533237 32.653053,-86.53325 32.653062)\r\n298;222;all;Tatum Rd;Autauga;AL;36066;LINESTRING(-86.448928 32.51532,-86.44939 32.515323)\r\n1501;1599;all;William Willis Pl;Autauga;AL;36067;LINESTRING(-86.455753 32.528731,-86.455842 32.528615,-86.455989 32.52844,-86.456219 32.528134,-86.456658 32.527601,-86.457083 32.527056,-86.457176 32.526931,-86.457263 32.526803,-86.457345 32.526671,-86.457418 32.526536,-86.457485 32.526379)\r\n210;216;even;Stewart St;Autauga;AL;36067;LINESTRING(-86.475271 32.440696,-86.475169 32.440841,-86.474931 32.441224)\r\n211;215;odd;Stewart St;Autauga;AL;36067;LINESTRING(-86.475439 32.440778,-86.475343 32.440923,-86.475103 32.441301)\r\n2500;2598;all;Sanders Dr;Autauga;AL;36067;LINESTRING(-86.657094 32.52435,-86.657065 32.524495,-86.657015 32.524707,-86.656902 32.525063,-86.656893 32.525222,-86.656911 32.525452,-86.656956 32.525675,-86.657012 32.525829,-86.657148 32.526025,-86.657376 32.526336,-86.657498 32.526519,-86.657567 32.526645,-86.657624 32.526774,-86.657696 32.526978,-86.658011 32.528108,-86.658106 32.528391,-86.658193 32.528601,-86.658259 32.52874,-86.658338 32.528875,-86.658516 32.529128,-86.658662 32.529311,-86.658762 32.529432,-86.658878 32.529545,-86.659119 32.529756,-86.6595 32.53004,-86.659553 32.530087,-86.6596 32.53014,-86.659639 32.530193,-86.659713 32.530316,-86.659787 32.530464)\r\n4437;4401;odd;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.897237 32.587696,-86.897214 32.587783,-86.897148 32.587986,-86.897095 32.588114,-86.896976 32.588371,-86.896542 32.589231,-86.896332 32.589625,-86.89618 32.589879,-86.896006 32.590123,-86.895816 32.590353,-86.895713 32.590463,-86.895603 32.590568,-86.895416 32.590731)\r\n4438;4400;even;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.897429 32.587722,-86.897416 32.587821,-86.897338 32.588038,-86.897281 32.588172,-86.897158 32.588435,-86.896722 32.589297,-86.896512 32.589697,-86.896356 32.589961,-86.896176 32.590215,-86.895976 32.590455,-86.895865 32.590571,-86.895749 32.590684,-86.895554 32.590847)\r\n599;501;odd;Ambrose Ln;Autauga;AL;36066;LINESTRING(-86.429012 32.473034,-86.429047 32.472953,-86.429204 32.472621,-86.42923 32.47257)\r\n508;506;even;Ambrose Ln;Autauga;AL;36066;LINESTRING(-86.428828 32.472979,-86.428861 32.472895,-86.42902 32.472551,-86.429055 32.472497)\r\n100;198;even;Windermere Ct;Autauga;AL;36066;LINESTRING(-86.429748 32.475643,-86.429745 32.47566,-86.42974 32.475939,-86.429757 32.475931)\r\n199;101;odd;Windermere Ct;Autauga;AL;36066;LINESTRING(-86.429942 32.475652,-86.429943 32.475664,-86.42996 32.475971,-86.429939 32.47599)\r\n698;600;even;Malwest St;Autauga;AL;36066;LINESTRING(-86.414322 32.483957,-86.413775 32.483361)\r\n699;601;odd;Malwest St;Autauga;AL;36066;LINESTRING(-86.414169 32.484058,-86.413622 32.483462)\r\n900;998;even;Greencrest Ln;Autauga;AL;36067;LINESTRING(-86.461036 32.488359,-86.460243 32.488373,-86.459387 32.488382,-86.456568 32.48842,-86.456312 32.488429,-86.455977 32.488434)\r\n201;299;odd;Greencrest Ln;Autauga;AL;36067;LINESTRING(-86.46104 32.488524,-86.460247 32.488539,-86.459389 32.488546,-86.456574 32.488586,-86.456318 32.488595,-86.45598 32.488598)\r\n595;591;odd;Marlyn Dr;Autauga;AL;36067;LINESTRING(-86.486278 32.480453,-86.486267 32.480155,-86.486259 32.4798)\r\n594;590;even;Marlyn Dr;Autauga;AL;36067;LINESTRING(-86.486084 32.480458,-86.486071 32.480159,-86.486064 32.479803)\r\n1799;1899;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.563143 32.490122,-86.563219 32.490118,-86.563908 32.490107,-86.564425 32.490108,-86.565116 32.49013,-86.565887 32.490182,-86.566623 32.490246)\r\n1298;1200;all;Rice Park Cir;Autauga;AL;36067;LINESTRING(-86.499544 32.462615,-86.499551 32.462615,-86.499534 32.462418,-86.499562 32.462218,-86.499637 32.462033,-86.49977 32.461851,-86.499993 32.46153,-86.500077 32.46139)\r\n1515;1501;odd;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.525269 32.430498,-86.521527 32.430503,-86.520555 32.430529)\r\n1520;1498;even;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.525269 32.430663,-86.521531 32.430669,-86.520561 32.430693)\r\n298;200;all;Carver St;Autauga;AL;36067;LINESTRING(-86.473484 32.478399,-86.473491 32.477978)\r\n1604;1666;all;Tom Turner Rd;Autauga;AL;36006;LINESTRING(-86.691843 32.660327,-86.691851 32.660882,-86.69189 32.661965,-86.692235 32.661964,-86.694413 32.661922,-86.694837 32.661922,-86.695332 32.661912,-86.696109 32.6619,-86.696221 32.661899)\r\n2300;2398;even;N Ridge Rd;Autauga;AL;36067;LINESTRING(-86.596516 32.491005,-86.59633 32.49128,-86.596249 32.491412,-86.596173 32.491549,-86.596115 32.491699,-86.596103 32.491783,-86.596094 32.492072,-86.596076 32.492211,-86.596012 32.492491,-86.595925 32.492774,-86.595845 32.49313,-86.595803 32.493265,-86.595744 32.493406,-86.595711 32.493565,-86.595729 32.493803,-86.595861 32.49423,-86.595887 32.494366,-86.595895 32.494429,-86.595876 32.494561,-86.595827 32.49477,-86.595807 32.494834,-86.595643 32.495243,-86.595578 32.49537,-86.5955 32.49548,-86.595398 32.495579,-86.595074 32.495815,-86.595012 32.495874,-86.59489 32.495988,-86.594746 32.496189,-86.59469 32.496344,-86.594667 32.4965,-86.594654 32.496649,-86.594652 32.496798,-86.594657 32.49704)\r\n2201;2299;odd;N Ridge Rd;Autauga;AL;36067;LINESTRING(-86.596685 32.491086,-86.596504 32.49136,-86.596429 32.491486,-86.596365 32.491611,-86.596319 32.491739,-86.596307 32.491797,-86.596296 32.492084,-86.596278 32.492237,-86.596206 32.492529,-86.596121 32.49281,-86.596043 32.493168,-86.595995 32.493315,-86.595944 32.49345,-86.595913 32.493575,-86.595937 32.493773,-86.596061 32.494196,-86.596089 32.494348,-86.596091 32.494431,-86.59608 32.494587,-86.596023 32.49481,-86.595997 32.494884,-86.595831 32.495301,-86.595766 32.495448,-86.595672 32.495588,-86.59554 32.495703,-86.595216 32.495939,-86.59516 32.495986,-86.59506 32.496092,-86.594942 32.496263,-86.594894 32.496384,-86.594867 32.496518,-86.594854 32.496657,-86.594848 32.496798,-86.594851 32.497037)\r\n117;101;odd;Gray Dr;Autauga;AL;36067;LINESTRING(-86.472196 32.444037,-86.472129 32.444004,-86.472045 32.443972,-86.471875 32.443915,-86.471686 32.443905,-86.471251 32.443918,-86.470481 32.443924,-86.470229 32.443918,-86.470008 32.443918)\r\n198;100;even;Gray Dr;Autauga;AL;36067;LINESTRING(-86.472106 32.444182,-86.472041 32.444156,-86.471971 32.44413,-86.471827 32.444093,-86.47168 32.444075,-86.471255 32.444084,-86.470479 32.44409,-86.470225 32.444084,-86.470008 32.444083)\r\n706;958;even;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.600139 32.524728,-86.600304 32.525312,-86.60043 32.525732,-86.600464 32.52587,-86.60054 32.526297,-86.600568 32.52651,-86.600603 32.52694,-86.600612 32.527225,-86.600593 32.52751,-86.600545 32.52794,-86.600501 32.528223,-86.60043 32.528577,-86.600345 32.528929,-86.600023 32.530129,-86.599874 32.530692,-86.599811 32.530894,-86.599803 32.530923)\r\n801;899;odd;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.600329 32.52469,-86.600494 32.525272,-86.600624 32.525694,-86.600662 32.52584,-86.600736 32.526275,-86.600766 32.526494,-86.600801 32.526932,-86.60081 32.527227,-86.600791 32.527522,-86.600741 32.527958,-86.600697 32.528247,-86.600624 32.528607,-86.600537 32.528965,-86.600213 32.530165,-86.600068 32.530732,-86.600003 32.530942,-86.599987 32.530975)\r\n638;698;even;Vintage Way;Autauga;AL;36067;LINESTRING(-86.448291 32.427197,-86.44818 32.427218)\r\n641;699;odd;Vintage Way;Autauga;AL;36067;LINESTRING(-86.448332 32.427358,-86.448221 32.427379)\r\n1650;1698;even;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.511352 32.530315,-86.51135 32.530504,-86.511355 32.530782,-86.51129 32.532367,-86.511284 32.532704)\r\n1633;1663;odd;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.511547 32.530316,-86.511546 32.530504,-86.511551 32.530784,-86.511486 32.532371,-86.511479 32.532707)\r\n1805;1899;odd;Thunder Trl;Autauga;AL;36067;LINESTRING(-86.665731 32.632999,-86.665698 32.632997,-86.663722 32.633056,-86.663681 32.633048,-86.663616 32.633008,-86.663578 32.632976,-86.663545 32.632919,-86.663521 32.632834,-86.66351 32.632653,-86.663504 32.632584)\r\n2898;2800;even;Thunder Trl;Autauga;AL;36067;LINESTRING(-86.665731 32.633163,-86.665702 32.633165,-86.663668 32.633246,-86.663587 32.633196,-86.663474 32.63316,-86.663396 32.633076,-86.663341 32.632981,-86.663307 32.632856,-86.663312 32.632659,-86.66331 32.632592)\r\n298;200;even;Rogers Ln;Autauga;AL;36066;LINESTRING(-86.458188 32.579379,-86.457735 32.57939,-86.456543 32.579404,-86.456205 32.579416,-86.456139 32.579404,-86.456009 32.579366,-86.455971 32.57934,-86.455948 32.579307,-86.455931 32.579256,-86.455929 32.579119,-86.455953 32.578832,-86.455956 32.57875,-86.455942 32.578664,-86.45591 32.578576,-86.455841 32.578495,-86.455746 32.578435,-86.455639 32.578411,-86.455541 32.578402,-86.455447 32.578402,-86.454932 32.578417,-86.454679 32.578421,-86.454387 32.578414)\r\n299;201;odd;Rogers Ln;Autauga;AL;36066;LINESTRING(-86.458194 32.579543,-86.457739 32.579556,-86.456549 32.57957,-86.456203 32.579582,-86.456099 32.579586,-86.455901 32.579534,-86.455799 32.579466,-86.455732 32.579369,-86.455725 32.579268,-86.455727 32.579113,-86.455753 32.578826,-86.455748 32.578764,-86.455736 32.578706,-86.455714 32.578662,-86.455683 32.578627,-86.455644 32.578603,-86.455593 32.578585,-86.455523 32.578574,-86.455447 32.578568,-86.454938 32.578583,-86.454677 32.578587,-86.454381 32.578579)\r\n231;299;all;Deer Run Dr;Autauga;AL;36067;LINESTRING(-86.481551 32.453243,-86.482643 32.453239)\r\n1501;1599;odd;Planters Ridge Rd;Autauga;AL;36066;LINESTRING(-86.431516 32.45694,-86.431607 32.456956,-86.431838 32.457014,-86.432209 32.457126)\r\n1500;1598;even;Planters Ridge Rd;Autauga;AL;36066;LINESTRING(-86.431535 32.456776,-86.431651 32.456778,-86.431902 32.456856,-86.432275 32.456972)\r\n2214;2298;all;Wynhaven Dr;Autauga;AL;36067;LINESTRING(-86.515925 32.447067,-86.515996 32.44707,-86.516177 32.447071,-86.51703 32.447064,-86.517108 32.447057,-86.51723 32.447059)\r\n100;214;even;Autauga County 104;Autauga;AL;36066;LINESTRING(-86.460011 32.573025,-86.457693 32.573047,-86.455753 32.573108,-86.455418 32.573161,-86.454914 32.573285,-86.454505 32.573392,-86.454239 32.573461,-86.454074 32.57349,-86.453976 32.573503,-86.453921 32.573502,-86.453858 32.573494,-86.453782 32.573474,-86.453684 32.57344,-86.453523 32.57336,-86.453448 32.57331,-86.453402 32.57327,-86.453346 32.573208,-86.453315 32.573157,-86.45329 32.573103,-86.453269 32.573006,-86.45327 32.572031,-86.453226 32.571912,-86.453165 32.571824,-86.453114 32.571748,-86.453045 32.571642,-86.452888 32.571479,-86.452679 32.571307,-86.452607 32.571258,-86.452561 32.57124,-86.452518 32.571212,-86.452438 32.571182,-86.452298 32.571151,-86.452166 32.571156,-86.451569 32.571151,-86.451474 32.571147,-86.451426 32.571138,-86.451328 32.57111,-86.450824 32.57099,-86.449937 32.570693)\r\n101;199;odd;Autauga County 104;Autauga;AL;36066;LINESTRING(-86.460013 32.57319,-86.457699 32.573213,-86.455775 32.573282,-86.455464 32.573329,-86.45497 32.573445,-86.454565 32.57355,-86.454289 32.573631,-86.454112 32.573654,-86.453992 32.573679,-86.453899 32.573674,-86.453816 32.573662,-86.453712 32.573642,-86.453592 32.573594,-86.453409 32.573506,-86.453304 32.573442,-86.45324 32.573378,-86.453182 32.573302,-86.453125 32.573239,-86.453084 32.573151,-86.453061 32.57302,-86.453052 32.572057,-86.453028 32.571978,-86.452991 32.571904,-86.452944 32.571832,-86.452875 32.571742,-86.452736 32.571597,-86.452543 32.571437,-86.452491 32.571404,-86.452459 32.571384,-86.45242 32.571368,-86.45237 32.57135,-86.45227 32.571331,-86.452162 32.571322,-86.451569 32.571315,-86.45146 32.571321,-86.451372 32.571314,-86.451264 32.571274,-86.450758 32.571154,-86.449864 32.570845)\r\n100;198;even;Abinger Pl;Autauga;AL;36066;LINESTRING(-86.4221 32.476135,-86.422108 32.476205,-86.422118 32.476285)\r\n101;199;odd;Abinger Pl;Autauga;AL;36066;LINESTRING(-86.422293 32.476114,-86.422306 32.476187,-86.422312 32.476273)\r\n359;441;all;Autauga County 4;Autauga;AL;36067;LINESTRING(-86.462574 32.428091,-86.462458 32.428026,-86.461179 32.427257)\r\n2316;2414;even;Autauga County 65;Autauga;AL;36051;LINESTRING(-86.557947 32.631852,-86.557826 32.631955,-86.557407 32.632319,-86.557121 32.63261,-86.556956 32.632962,-86.556872 32.633173,-86.556756 32.63353,-86.556603 32.634027,-86.556449 32.634727,-86.556232 32.635805,-86.556097 32.636611,-86.556067 32.636917,-86.556096 32.637093,-86.556246 32.637318,-86.556493 32.637467,-86.556678 32.63751,-86.55676 32.637526,-86.557256 32.637667,-86.557344 32.638,-86.557348 32.638854,-86.557354 32.639276,-86.557346 32.63949,-86.557346 32.63992,-86.55733 32.640563,-86.557352 32.641211,-86.557345 32.641858,-86.557346 32.642079,-86.557359 32.642443,-86.557362 32.642873,-86.557353 32.643225,-86.557342 32.643469,-86.557338 32.643511,-86.557324 32.644235,-86.557323 32.645024,-86.557345 32.646116,-86.557376 32.646765,-86.557405 32.646984,-86.557535 32.647457)\r\n2317;2403;odd;Autauga County 65;Autauga;AL;36051;LINESTRING(-86.558086 32.631968,-86.557966 32.632071,-86.557559 32.632433,-86.557311 32.632704,-86.557144 32.633022,-86.557064 32.633223,-86.556946 32.633574,-86.556799 32.634063,-86.556643 32.634757,-86.556428 32.635831,-86.556297 32.636629,-86.556269 32.636909,-86.556306 32.637027,-86.556418 32.637188,-86.556595 32.637299,-86.556734 32.637346,-86.556814 32.637364,-86.557454 32.637515,-86.557556 32.637982,-86.557544 32.638854,-86.55755 32.639278,-86.557544 32.639492,-86.557542 32.639922,-86.557526 32.640563,-86.557548 32.641209,-86.557541 32.641858,-86.557544 32.642075,-86.557557 32.642441,-86.557558 32.642875,-86.557551 32.643231,-86.557536 32.643477,-86.557536 32.643515,-86.55752 32.644237,-86.557519 32.645022,-86.557543 32.64611,-86.557578 32.646751,-86.557607 32.646956,-86.557725 32.647421)\r\n2252;2298;all;Autauga County 40;Autauga;AL;36006;LINESTRING(-86.74635 32.553706,-86.749689 32.55464,-86.74987 32.554686)\r\n2199;2101;odd;T R Dr;Autauga;AL;36003;LINESTRING(-86.633732 32.451461,-86.633273 32.45147,-86.63051 32.451451,-86.629412 32.451449,-86.628532 32.451444,-86.627121 32.451431,-86.625094 32.451403,-86.624831 32.451404,-86.624595 32.451408,-86.62441 32.451458,-86.624269 32.451628,-86.62422 32.451851,-86.62423 32.451964,-86.624226 32.452113,-86.624242 32.452275,-86.624306 32.452433,-86.624383 32.452518)\r\n2198;2100;even;T R Dr;Autauga;AL;36003;LINESTRING(-86.633737 32.451625,-86.633275 32.451636,-86.630508 32.451617,-86.629412 32.451615,-86.62853 32.451608,-86.627119 32.451595,-86.625094 32.451567,-86.624839 32.451572,-86.624639 32.45159,-86.624556 32.451622,-86.624479 32.451708,-86.62443 32.451867,-86.624428 32.451962,-86.62443 32.452105,-86.624452 32.452235,-86.6245 32.452353,-86.624546 32.452428)\r\n1916;2004;even;Fairview Ave;Autauga;AL;36066;LINESTRING(-86.415528 32.483467,-86.415363 32.483535,-86.415113 32.483633,-86.414808 32.483773,-86.414474 32.483938,-86.41441 32.483971)\r\n1917;2005;odd;Fairview Ave;Autauga;AL;36066;LINESTRING(-86.415613 32.483616,-86.415447 32.483683,-86.415203 32.483783,-86.414904 32.483919,-86.414574 32.48408,-86.41451 32.484112)\r\n200;398;even;Doster St;Autauga;AL;36067;LINESTRING(-86.467252 32.456472,-86.466006 32.456369,-86.46515 32.456304,-86.465141 32.456305)\r\n201;399;odd;Doster St;Autauga;AL;36067;LINESTRING(-86.467233 32.456636,-86.465988 32.456533,-86.465136 32.45647,-86.46513 32.456469)\r\n2071;2099;all;Fairview Ave;Autauga;AL;36066;LINESTRING(-86.41285 32.485154,-86.412791 32.485198,-86.412353 32.485478)\r\n199;101;odd;Grove Ct;Autauga;AL;36067;LINESTRING(-86.473183 32.44501,-86.473202 32.444991,-86.47333 32.444785)\r\n198;100;even;Grove Ct;Autauga;AL;36067;LINESTRING(-86.472991 32.444986,-86.472986 32.444925,-86.473164 32.4447)\r\n1400;1416;even;Autauga Heights Rd;Autauga;AL;36066;LINESTRING(-86.456788 32.515173,-86.456534 32.515228,-86.456372 32.515279,-86.455965 32.515366,-86.455636 32.515419,-86.45539 32.51544,-86.455052 32.515451,-86.454878 32.515461,-86.454704 32.515485,-86.454449 32.515536,-86.454245 32.5156)\r\n1405;1417;odd;Autauga Heights Rd;Autauga;AL;36066;LINESTRING(-86.456839 32.515332,-86.456596 32.515392,-86.456432 32.515445,-86.456007 32.51553,-86.455666 32.515589,-86.455404 32.515608,-86.455064 32.515619,-86.454902 32.515631,-86.454744 32.515653,-86.454507 32.515702,-86.454309 32.515755)\r\n406;404;all;Autauga County 40;Autauga;AL;36022;LINESTRING(-86.431525 32.591064,-86.431889 32.591129,-86.432307 32.591189,-86.432552 32.591215,-86.432582 32.591221)\r\n2296;2316;even;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.478009 32.612534,-86.478112 32.612599,-86.478447 32.61282,-86.478708 32.613002,-86.478835 32.613096,-86.479265 32.613442,-86.479443 32.613595,-86.479668 32.613805,-86.479988 32.614138,-86.480089 32.614251,-86.480113 32.614278)\r\n2303;2319;odd;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.478123 32.612401,-86.478232 32.612465,-86.478571 32.61269,-86.478836 32.612874,-86.478969 32.612972,-86.479403 32.613322,-86.479587 32.613479,-86.47982 32.613695,-86.480146 32.614034,-86.480249 32.614153,-86.480272 32.614183)\r\n100;198;even;Emma Ct;Autauga;AL;36067;LINESTRING(-86.548628 32.551554,-86.548976 32.553058)\r\n101;199;odd;Emma Ct;Autauga;AL;36067;LINESTRING(-86.548819 32.551522,-86.549167 32.553026)\r\n1263;1247;odd;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.474989 32.49563,-86.475167 32.495488,-86.475676 32.495102,-86.476108 32.49476)\r\n1264;1238;even;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.474855 32.49551,-86.475033 32.495366,-86.475544 32.49498,-86.475975 32.49464)\r\n2122;2130;even;Autauga County 61;Autauga;AL;36067;LINESTRING(-86.501179 32.579937,-86.501088 32.579933,-86.50099 32.579939,-86.500811 32.579972,-86.500564 32.580049,-86.500401 32.580112,-86.499723 32.580423,-86.499497 32.580517,-86.499189 32.580633,-86.498952 32.580706,-86.498411 32.580851)\r\n2101;2143;odd;Autauga County 61;Autauga;AL;36067;LINESTRING(-86.501176 32.580101,-86.501096 32.580103,-86.501022 32.580111,-86.500869 32.58014,-86.50064 32.580207,-86.500491 32.580264,-86.499815 32.580571,-86.499581 32.580669,-86.499265 32.580791,-86.499016 32.580864,-86.49847 32.581008)\r\n1840;1898;even;Tara Dr;Autauga;AL;36066;LINESTRING(-86.419851 32.453732,-86.419728 32.453743,-86.419556 32.453794,-86.419081 32.453965)\r\n1841;1843;odd;Tara Dr;Autauga;AL;36066;LINESTRING(-86.419883 32.453894,-86.419778 32.453915,-86.419626 32.453954,-86.419156 32.454116)\r\n1300;1398;all;Autauga County 11;Autauga;AL;36749;LINESTRING(-86.815366 32.609439,-86.815341 32.609478,-86.815322 32.609556,-86.815306 32.609635,-86.815306 32.609712,-86.815305 32.609792,-86.815318 32.609871,-86.815338 32.609951,-86.815707 32.610849,-86.815833 32.611195,-86.815896 32.611401,-86.815928 32.611539,-86.815948 32.611677,-86.815959 32.611817,-86.815956 32.611959,-86.815944 32.612098,-86.815921 32.612235,-86.815885 32.612369,-86.815837 32.612502,-86.815777 32.612633,-86.815706 32.612761,-86.815381 32.613271,-86.815032 32.61377,-86.814576 32.61438,-86.814045 32.615032,-86.813954 32.615165,-86.813888 32.615305,-86.813857 32.615379,-86.813816 32.615527,-86.813787 32.615676,-86.813757 32.615897,-86.813726 32.616406,-86.813691 32.617122,-86.813674 32.617334,-86.813616 32.617761,-86.813561 32.618032,-86.81352 32.618188)\r\n1001;1053;all;Choctaw Ridge;Autauga;AL;36067;LINESTRING(-86.519977 32.453801,-86.519978 32.453789,-86.51959 32.453868,-86.519324 32.453926,-86.519233 32.45407,-86.519263 32.454211,-86.519314 32.454551,-86.519351 32.45484,-86.519284 32.455153,-86.519207 32.455367,-86.519178 32.455435,-86.519013 32.455781,-86.51887 32.455994,-86.518837 32.456125,-86.518807 32.456451,-86.518745 32.456708,-86.518606 32.456946,-86.518423 32.457105,-86.518234 32.457237,-86.517913 32.457431,-86.517749 32.457581,-86.517473 32.457702,-86.517352 32.457741,-86.517198 32.457789)\r\n1077;1087;all;Choctaw Ridge;Autauga;AL;36067;LINESTRING(-86.520074 32.453944,-86.520058 32.453963,-86.519642 32.454034,-86.519478 32.454092,-86.519451 32.45411,-86.519455 32.454189,-86.51951 32.454531,-86.519549 32.454844,-86.519486 32.455195,-86.519393 32.455419,-86.519366 32.455493,-86.519199 32.455855,-86.519074 32.45606,-86.519043 32.456153,-86.519009 32.456473,-86.518953 32.456764,-86.51879 32.45706,-86.518555 32.457233,-86.518358 32.457371,-86.518057 32.457565,-86.517887 32.457737,-86.517551 32.457862,-86.517418 32.457897,-86.517264 32.457943)\r\n100;198;even;Judson Rd;Autauga;AL;36067;LINESTRING(-86.458576 32.48571,-86.458581 32.485106,-86.458569 32.485006,-86.458553 32.484928,-86.458521 32.484851,-86.458324 32.484671,-86.45823 32.48463,-86.458146 32.484596,-86.457988 32.48454,-86.457989 32.484543)\r\n101;199;odd;Judson Rd;Autauga;AL;36067;LINESTRING(-86.458382 32.48571,-86.458377 32.485114,-86.458367 32.485032,-86.458351 32.484982,-86.458331 32.484953,-86.458184 32.484815,-86.458132 32.48478,-86.458062 32.48475,-86.457906 32.484694,-86.457905 32.484691)\r\n153;199;all;Melissa Robyn Rd;Autauga;AL;36022;LINESTRING(-86.482194 32.661905,-86.482189 32.661934,-86.482157 32.662058,-86.482068 32.662228,-86.481933 32.66227)\r\n2060;2098;even;Airport Rd;Autauga;AL;36022;LINESTRING(-86.440342 32.599367,-86.440348 32.599541,-86.440351 32.600046,-86.440367 32.600694,-86.440369 32.601632,-86.440372 32.60173)\r\n2001;2057;odd;Airport Rd;Autauga;AL;36022;LINESTRING(-86.440537 32.599361,-86.440546 32.599537,-86.440547 32.600044,-86.440563 32.600692,-86.440565 32.60163,-86.440567 32.601727)\r\n100;198;even;Brookhaven Dr;Autauga;AL;36066;LINESTRING(-86.443603 32.474876,-86.443604 32.474867,-86.443567 32.474735,-86.443514 32.474622,-86.443436 32.474485,-86.443367 32.474379,-86.443278 32.474291,-86.443153 32.474181)\r\n101;199;odd;Brookhaven Dr;Autauga;AL;36066;LINESTRING(-86.443411 32.474905,-86.443408 32.474903,-86.443371 32.474787,-86.443328 32.47469,-86.443258 32.474565,-86.443195 32.474479,-86.443126 32.474403,-86.44301 32.474293)\r\n1800;1908;even;Fairview Ave;Autauga;AL;36066;LINESTRING(-86.419953 32.482636,-86.419768 32.482645,-86.419409 32.482654,-86.418949 32.482672,-86.418214 32.482758)\r\n1801;1899;odd;Fairview Ave;Autauga;AL;36066;LINESTRING(-86.419966 32.4828,-86.419778 32.482813,-86.419417 32.48282,-86.418967 32.482842,-86.41824 32.482921)\r\n1913;1915;all;Calumet Pkwy;Autauga;AL;36066;LINESTRING(-86.416013 32.489886,-86.415939 32.489871)\r\n499;401;odd;N Court St;Autauga;AL;36067;LINESTRING(-86.474915 32.468941,-86.475042 32.467695)\r\n498;400;even;N Court St;Autauga;AL;36067;LINESTRING(-86.474722 32.468927,-86.474849 32.467681)\r\n1844;1898;even;E Main St;Autauga;AL;36066;LINESTRING(-86.421507 32.460426,-86.421206 32.460428,-86.420852 32.46043,-86.420425 32.460429,-86.420006 32.46043,-86.419916 32.46042,-86.418738 32.460423,-86.418539 32.46042)\r\n1801;1899;odd;E Main St;Autauga;AL;36066;LINESTRING(-86.421508 32.460591,-86.421208 32.460592,-86.420852 32.460596,-86.420425 32.460595,-86.419996 32.460602,-86.419904 32.460594,-86.418736 32.460589,-86.418535 32.460585)\r\n299;131;all;N Memorial Dr;Autauga;AL;36067;LINESTRING(-86.45177 32.469724,-86.451505 32.468637,-86.451176 32.466976,-86.4511 32.466475)\r\n809;899;all;Hearthstone Dr;Autauga;AL;36067;LINESTRING(-86.480761 32.445421,-86.480752 32.446006)\r\n312;300;all;Autauga County 9;Autauga;AL;36003;LINESTRING(-86.759632 32.43573,-86.760213 32.436306,-86.760549 32.436642,-86.760657 32.436764,-86.760859 32.437007,-86.760952 32.437136,-86.761038 32.437266,-86.761062 32.437314)\r\n154;168;even;Patrick St;Autauga;AL;36067;LINESTRING(-86.457299 32.45255,-86.457464 32.452543,-86.45831 32.452514)\r\n151;153;odd;Patrick St;Autauga;AL;36067;LINESTRING(-86.457288 32.452386,-86.457454 32.452377,-86.458302 32.45235)\r\n2185;2187;all;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.464378 32.601372,-86.464381 32.601417,-86.464364 32.601574,-86.464369 32.60194,-86.464367 32.602013,-86.464373 32.602196)\r\n698;600;even;Pleasant Rd;Autauga;AL;36067;LINESTRING(-86.487085 32.452632,-86.486875 32.452504,-86.486679 32.452374,-86.486623 32.452329,-86.486237 32.451947,-86.486041 32.451709,-86.485978 32.451644,-86.485837 32.451548,-86.485697 32.451454,-86.485547 32.451372,-86.485392 32.451301,-86.48532 32.451268,-86.485265 32.451233,-86.485086 32.45108,-86.485018 32.451029,-86.484823 32.45089,-86.48477 32.450845,-86.484725 32.450798,-86.484659 32.450719)\r\n501;599;odd;Pleasant Rd;Autauga;AL;36067;LINESTRING(-86.486973 32.452766,-86.486757 32.45264,-86.486549 32.452506,-86.486475 32.452451,-86.486077 32.452053,-86.485879 32.451815,-86.48583 32.45177,-86.485711 32.451678,-86.485579 32.451594,-86.485443 32.451518,-86.4853 32.451451,-86.485218 32.45142,-86.485127 32.451373,-86.484944 32.451202,-86.484886 32.451155,-86.484689 32.451016,-86.484622 32.450963,-86.484557 32.450902,-86.484494 32.450805)\r\n100;106;even;Deer Trce;Autauga;AL;36067;LINESTRING(-86.469438 32.453802,-86.46966 32.453693,-86.470024 32.453537,-86.470239 32.453494,-86.470473 32.453517,-86.470485 32.453514)\r\n101;107;odd;Deer Trce;Autauga;AL;36067;LINESTRING(-86.469339 32.45366,-86.469562 32.453547,-86.46995 32.453361,-86.470231 32.453324,-86.470507 32.453345,-86.47053 32.453354)\r\n1247;1241;all;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.418306 32.505939,-86.418301 32.505828)\r\n1151;1123;all;2nd St;Autauga;AL;36703;LINESTRING(-86.788116 32.327201,-86.788507 32.327761,-86.789371 32.32902,-86.790461 32.330595,-86.790956 32.331301)\r\n674;898;even;Autauga County 15;Autauga;AL;36003;LINESTRING(-86.786731 32.529413,-86.78633 32.529969,-86.785462 32.531148,-86.784111 32.533011,-86.78382 32.53337,-86.783617 32.533602,-86.783511 32.533715,-86.78329 32.533935,-86.783058 32.534147,-86.782695 32.534457,-86.781565 32.535357,-86.779679 32.536872,-86.779362 32.53712,-86.777492 32.538619,-86.777053 32.53896,-86.776793 32.539145,-86.776516 32.539315,-86.776377 32.539393,-86.776232 32.539465,-86.775931 32.539599,-86.775778 32.539659,-86.775464 32.53976,-86.774975 32.539885,-86.774482 32.540001,-86.77415 32.540072,-86.772158 32.540517,-86.771656 32.540633,-86.771329 32.540728,-86.771164 32.540782,-86.770846 32.5409,-86.77069 32.540967,-86.770384 32.541105,-86.770085 32.541257,-86.769799 32.541426,-86.769658 32.541516,-86.76939 32.541703,-86.769133 32.541902,-86.768891 32.542114,-86.768773 32.542224,-86.768659 32.54234,-86.768447 32.542573,-86.768249 32.542816,-86.768155 32.542943,-86.76798 32.543202,-86.767822 32.543468,-86.767685 32.54374,-86.767565 32.544019,-86.767464 32.544302,-86.767418 32.544446,-86.767344 32.544734,-86.767288 32.545026,-86.767251 32.545316,-86.767235 32.54561,-86.767237 32.545903,-86.767248 32.546017)\r\n701;799;odd;Autauga County 15;Autauga;AL;36003;LINESTRING(-86.786897 32.529498,-86.786496 32.530055,-86.785628 32.531234,-86.784279 32.533103,-86.783982 32.533468,-86.783773 32.533704,-86.783665 32.533821,-86.783438 32.534047,-86.783202 32.534263,-86.782833 32.534577,-86.781699 32.535477,-86.779813 32.536992,-86.779496 32.53724,-86.777626 32.538741,-86.777185 32.539086,-86.776917 32.539279,-86.77663 32.539455,-86.776481 32.539535,-86.77633 32.539611,-86.776019 32.539751,-86.775856 32.539815,-86.77553 32.539922,-86.775029 32.540045,-86.774532 32.540161,-86.774198 32.540232,-86.77221 32.540677,-86.771716 32.540795,-86.771397 32.540886,-86.77124 32.540938,-86.77093 32.541052,-86.77078 32.541115,-86.770482 32.541251,-86.770195 32.541399,-86.769915 32.541562,-86.769782 32.541648,-86.769522 32.541831,-86.769273 32.542024,-86.769035 32.542228,-86.768923 32.542334,-86.768815 32.542444,-86.768609 32.542673,-86.768415 32.542908,-86.768325 32.543029,-86.768156 32.543282,-86.768004 32.54354,-86.767871 32.543802,-86.767755 32.544073,-86.767654 32.544348,-86.767612 32.544486,-86.76754 32.544766,-86.767486 32.545048,-86.767451 32.54533,-86.767433 32.545614,-86.767437 32.545897,-86.767442 32.546007)\r\n474;614;even;Wetumpka St;Autauga;AL;36067;LINESTRING(-86.461778 32.464033,-86.461205 32.46406,-86.459491 32.464188,-86.457784 32.464314,-86.457701 32.464328,-86.45758 32.464342)\r\n501;599;odd;Wetumpka St;Autauga;AL;36067;LINESTRING(-86.461789 32.464197,-86.461219 32.464226,-86.459509 32.464352,-86.457812 32.464484,-86.457731 32.464496,-86.457602 32.464506)\r\n1185;1163;odd;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.478981 32.489229,-86.479126 32.488207,-86.479266 32.487416,-86.479324 32.487112)\r\n1198;1154;even;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.478788 32.48921,-86.47893 32.488185,-86.479072 32.48739,-86.479132 32.487086)\r\n3971;3901;odd;Mitchell Rd;Autauga;AL;36749;LINESTRING(-86.819811 32.571588,-86.819651 32.571952,-86.819552 32.572147,-86.819438 32.572333,-86.819308 32.572513,-86.819163 32.57269,-86.81907 32.572818,-86.81899 32.572957,-86.818955 32.573032,-86.81893 32.573111,-86.818913 32.573191,-86.818903 32.573271,-86.818904 32.57335,-86.818905 32.573428,-86.818928 32.57358,-86.81902 32.573937,-86.819029 32.574,-86.819026 32.574062,-86.819015 32.574121,-86.818996 32.574178,-86.818967 32.574232,-86.81893 32.574285,-86.818885 32.574335,-86.818778 32.574432,-86.818721 32.574475,-86.818659 32.574514,-86.818593 32.574547,-86.818525 32.574577,-86.818455 32.574599,-86.818383 32.574617,-86.818309 32.574628,-86.818153 32.574641,-86.817995 32.574633,-86.817752 32.574605,-86.817591 32.574575,-86.817179 32.574475,-86.817009 32.574436,-86.816916 32.574423,-86.816735 32.574417,-86.816553 32.57442,-86.816376 32.574441,-86.816117 32.574488,-86.815448 32.574634,-86.815197 32.574692,-86.814865 32.574796,-86.814318 32.575005,-86.814163 32.575048,-86.81409 32.575061,-86.813932 32.575079,-86.813775 32.575066,-86.813605 32.57504,-86.813517 32.575024)\r\n3938;3900;even;Mitchell Rd;Autauga;AL;36749;LINESTRING(-86.819994 32.571644,-86.819837 32.572014,-86.819736 32.572219,-86.819614 32.572417,-86.819476 32.572605,-86.819331 32.572782,-86.819248 32.5729,-86.819176 32.573025,-86.819149 32.573086,-86.819128 32.573149,-86.819113 32.573215,-86.819105 32.573281,-86.8191 32.573348,-86.819107 32.573414,-86.819128 32.57355,-86.819222 32.573909,-86.819233 32.573992,-86.819232 32.574076,-86.819219 32.574159,-86.81919 32.57424,-86.819149 32.574316,-86.819096 32.574383,-86.819041 32.574445,-86.81892 32.574556,-86.818847 32.574609,-86.818773 32.574654,-86.818693 32.574699,-86.818607 32.574733,-86.818519 32.574763,-86.818429 32.574783,-86.818337 32.5748,-86.818157 32.574809,-86.817977 32.574805,-86.817716 32.574773,-86.817541 32.574739,-86.817127 32.574637,-86.816967 32.574604,-86.816894 32.574595,-86.816733 32.574583,-86.816571 32.574592,-86.81641 32.574609,-86.816163 32.574652,-86.8155 32.574794,-86.815259 32.574854,-86.814941 32.574954,-86.814392 32.575167,-86.814217 32.575214,-86.814124 32.575233,-86.813936 32.575247,-86.813745 32.57524,-86.813563 32.575202,-86.813474 32.575184)\r\n4178;4176;all;Autauga County 88;Autauga;AL;36749;LINESTRING(-86.861055 32.534628,-86.860964 32.534609,-86.860804 32.534582,-86.860734 32.534571)\r\n2656;2670;even;Autauga County 85;Autauga;AL;36022;LINESTRING(-86.427663 32.609164,-86.427631 32.609307,-86.427548 32.609579,-86.427333 32.61012,-86.426812 32.611334,-86.426566 32.611916)\r\n2655;2699;odd;Autauga County 85;Autauga;AL;36022;LINESTRING(-86.427855 32.609191,-86.427829 32.609343,-86.427742 32.609627,-86.427519 32.610176,-86.426996 32.61139,-86.42675 32.611971)\r\n800;898;even;Deramus St;Autauga;AL;36066;LINESTRING(-86.444841 32.459324,-86.444839 32.459229,-86.444845 32.458868,-86.444841 32.458697)\r\n801;899;odd;Deramus St;Autauga;AL;36066;LINESTRING(-86.444646 32.459326,-86.444645 32.459229,-86.444649 32.458868,-86.444646 32.4587)\r\n557;501;all;Wallace Ct;Autauga;AL;36003;LINESTRING(-86.80492 32.524634,-86.804958 32.524765,-86.804958 32.52485,-86.804952 32.525012,-86.804909 32.525169,-86.80481 32.525387,-86.804706 32.525516,-86.804614 32.525633,-86.804539 32.525754,-86.804473 32.525885,-86.804384 32.526085,-86.804277 32.526356,-86.804211 32.526497,-86.804134 32.526632,-86.804017 32.526825,-86.803957 32.526949,-86.803937 32.527007,-86.803926 32.527065,-86.803932 32.527199,-86.80395 32.527354)\r\n151;101;odd;Imogene St;Autauga;AL;36067;LINESTRING(-86.457962 32.4508,-86.457911 32.4507,-86.45786 32.450628,-86.457741 32.450506,-86.457603 32.450403,-86.457387 32.450273,-86.456967 32.450029)\r\n152;100;even;Imogene St;Autauga;AL;36067;LINESTRING(-86.457787 32.450871,-86.457731 32.450782,-86.457692 32.45073,-86.457591 32.450628,-86.457475 32.450537,-86.457273 32.450409,-86.456857 32.450164)\r\n1198;1130;all;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.621595 32.569941,-86.619403 32.57085,-86.6172 32.571773)\r\n1053;1039;odd;2nd St;Autauga;AL;36703;LINESTRING(-86.79604 32.3438,-86.796036 32.34386,-86.796031 32.344445,-86.796035 32.345326,-86.796049 32.345766,-86.79624 32.34822)\r\n1044;900;even;2nd St;Autauga;AL;36703;LINESTRING(-86.796234 32.343806,-86.796232 32.343864,-86.796225 32.344445,-86.796231 32.345324,-86.796247 32.345758,-86.796433 32.348209)\r\n4000;4098;even;Blue Ridge Dr;Autauga;AL;36758;LINESTRING(-86.865523 32.62047,-86.865857 32.620332,-86.866066 32.620154,-86.866217 32.620005,-86.86644 32.619844,-86.866806 32.61965,-86.867069 32.619439,-86.867078 32.619286,-86.867097 32.61831,-86.867632 32.617996)\r\n4001;4099;odd;Blue Ridge Dr;Autauga;AL;36758;LINESTRING(-86.865432 32.620325,-86.865727 32.620182,-86.865916 32.620036,-86.866067 32.619879,-86.866318 32.619702,-86.866672 32.619508,-86.866847 32.619347,-86.866872 32.619274,-86.866865 32.618204,-86.867525 32.617859)\r\n899;801;odd;Short St;Autauga;AL;36749;LINESTRING(-86.897863 32.586722,-86.897896 32.586846,-86.897974 32.587344,-86.897976 32.587409,-86.89797 32.587466,-86.897955 32.587536,-86.897936 32.587567,-86.89797 32.587576,-86.897905 32.587568,-86.897667 32.587533,-86.897513 32.58752)\r\n898;800;even;Short St;Autauga;AL;36749;LINESTRING(-86.898051 32.586679,-86.8981 32.586812,-86.89818 32.587332,-86.898178 32.587415,-86.898172 32.587488,-86.898153 32.587574,-86.898106 32.587747,-86.897966 32.587742,-86.897879 32.58774,-86.897637 32.587701,-86.897489 32.587683)\r\n200;298;even;Hand Ln;Autauga;AL;36067;LINESTRING(-86.490385 32.617524,-86.491841 32.617595)\r\n201;299;odd;Hand Ln;Autauga;AL;36067;LINESTRING(-86.490397 32.61736,-86.491853 32.617431)\r\n1200;1298;even;Florida St;Autauga;AL;36067;LINESTRING(-86.488625 32.435633,-86.490422 32.434835)\r\n1201;1299;odd;Florida St;Autauga;AL;36067;LINESTRING(-86.488535 32.435487,-86.490332 32.434689)\r\n734;748;even;Silver Hills Dr;Autauga;AL;36066;LINESTRING(-86.430786 32.456842,-86.430776 32.456823,-86.430706 32.456693,-86.430236 32.455769,-86.430111 32.455497,-86.429981 32.455305)\r\n731;749;odd;Silver Hills Dr;Autauga;AL;36066;LINESTRING(-86.430612 32.456916,-86.430598 32.456895,-86.430526 32.456761,-86.430054 32.455833,-86.429925 32.455571,-86.42981 32.455384)\r\n1799;1795;all;Nathan Dr;Autauga;AL;36067;LINESTRING(-86.702563 32.590538,-86.70252 32.590284,-86.702552 32.589993,-86.702612 32.589803,-86.702567 32.589448,-86.702518 32.589181,-86.702565 32.588876,-86.702545 32.588836)\r\n801;899;all;S McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.418039 32.456443,-86.418052 32.455092,-86.418042 32.45473,-86.418053 32.454666,-86.418045 32.454327,-86.418045 32.454279)\r\n4001;4099;odd;Fig Tree Ln;Autauga;AL;36749;LINESTRING(-86.845166 32.504817,-86.844928 32.504753,-86.844823 32.504753,-86.844739 32.504757,-86.844683 32.50474,-86.844539 32.504688,-86.844074 32.504467)\r\n4098;4000;even;Fig Tree Ln;Autauga;AL;36749;LINESTRING(-86.845113 32.504975,-86.84489 32.504929,-86.844823 32.504917,-86.844733 32.504925,-86.844615 32.50492,-86.844445 32.504836,-86.843978 32.50461)\r\n500;698;even;Cardinal Ln;Autauga;AL;36067;LINESTRING(-86.456352 32.457449,-86.456205 32.457454,-86.455343 32.457472,-86.45441 32.457467,-86.454373 32.457452,-86.454327 32.457424,-86.454293 32.457377,-86.454272 32.457324,-86.454262 32.457261,-86.454257 32.457021)\r\n601;899;odd;Cardinal Ln;Autauga;AL;36067;LINESTRING(-86.456363 32.457613,-86.456213 32.457622,-86.455345 32.457638,-86.454396 32.457643,-86.454267 32.457638,-86.454155 32.45754,-86.454093 32.457449,-86.454066 32.457356,-86.454058 32.457269,-86.454062 32.457022)\r\n1996;1998;even;Calumet Pkwy;Autauga;AL;36066;LINESTRING(-86.415865 32.49445,-86.416069 32.494466,-86.416402 32.494498)\r\n1979;1999;odd;Calumet Pkwy;Autauga;AL;36066;LINESTRING(-86.415882 32.494286,-86.416089 32.4943,-86.416425 32.494335)\r\n101;111;all;Autauga County 100;Autauga;AL;36022;LINESTRING(-86.464137 32.598609,-86.46257 32.598612)\r\n599;583;all;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.827045 32.409178,-86.827057 32.409662,-86.827057 32.409716,-86.827071 32.410085,-86.827085 32.410823,-86.827098 32.411147)\r\n1506;1306;all;Fairview Ave;Autauga;AL;36066;LINESTRING(-86.428851 32.482218,-86.429055 32.482213,-86.430156 32.482142,-86.430583 32.482122,-86.430834 32.482106,-86.431079 32.482079,-86.43132 32.482035,-86.431555 32.481975,-86.431784 32.481899,-86.432784 32.481505,-86.434865 32.480662,-86.435324 32.480468,-86.435469 32.480401,-86.435647 32.480311)\r\n1405;1401;odd;Indian Hills Rd;Autauga;AL;36067;LINESTRING(-86.514639 32.455571,-86.514536 32.455562,-86.514438 32.455561,-86.514256 32.455578,-86.514162 32.455586,-86.513898 32.455636,-86.513723 32.45569,-86.51356 32.455757,-86.513332 32.455876,-86.513116 32.456008,-86.512908 32.456141,-86.512256 32.456578,-86.512059 32.45671,-86.510673 32.45764,-86.510481 32.457769,-86.509869 32.458166,-86.509599 32.458328,-86.50938 32.458447,-86.509171 32.458556,-86.508877 32.458699,-86.508781 32.458743)\r\n1426;1374;even;Indian Hills Rd;Autauga;AL;36067;LINESTRING(-86.514626 32.455735,-86.51453 32.455732,-86.514448 32.455733,-86.514278 32.455744,-86.514198 32.455756,-86.513956 32.455804,-86.513803 32.45585,-86.513658 32.455909,-86.513442 32.456018,-86.513232 32.456142,-86.513028 32.456273,-86.512376 32.456708,-86.512179 32.45684,-86.510795 32.457768,-86.510601 32.457899,-86.509987 32.4583,-86.509711 32.45847,-86.509482 32.458587,-86.509273 32.458698,-86.508973 32.458849,-86.508868 32.45889)\r\n737;727;all;Cranbrook Dr;Autauga;AL;36067;LINESTRING(-86.45887 32.447418,-86.458913 32.447475,-86.458942 32.44751)\r\n1699;1301;all;Fairview Ave;Autauga;AL;36066;LINESTRING(-86.435936 32.480349,-86.435993 32.480315)\r\n1170;1100;even;2nd St;Autauga;AL;36703;LINESTRING(-86.790938 32.331597,-86.790958 32.331627,-86.791143 32.331886,-86.791199 32.331953,-86.791319 32.332078,-86.791466 32.332188,-86.791551 32.332238,-86.791591 32.332252)\r\n1121;1115;odd;2nd St;Autauga;AL;36703;LINESTRING(-86.791105 32.331513,-86.791126 32.331541,-86.791311 32.331792,-86.791359 32.331849,-86.791469 32.331956,-86.791594 32.332052,-86.791659 32.332092,-86.791685 32.332108)\r\n400;412;even;Marlette Dr;Autauga;AL;36067;LINESTRING(-86.45892 32.447572,-86.458855 32.44761,-86.458578 32.447768,-86.458509 32.447801,-86.458362 32.447857,-86.45829 32.447879,-86.458192 32.447904)\r\n401;409;odd;Marlette Dr;Autauga;AL;36067;LINESTRING(-86.459036 32.447704,-86.458969 32.447748,-86.458684 32.447912,-86.458603 32.447953,-86.458438 32.448019,-86.458348 32.448043,-86.45824 32.448063)\r\n1598;1592;all;Autauga County 50;Autauga;AL;36067;LINESTRING(-86.556799 32.404958,-86.556802 32.40496,-86.556724 32.404965,-86.555887 32.404976,-86.555294 32.404988)\r\n100;198;even;Ann Ct;Autauga;AL;36067;LINESTRING(-86.453139 32.448737,-86.453084 32.448789,-86.452989 32.448876)\r\n101;199;odd;Ann Ct;Autauga;AL;36067;LINESTRING(-86.453292 32.448838,-86.453238 32.448905,-86.453126 32.448992)\r\n699;501;all;Golden Nugget Dr;Autauga;AL;36051;LINESTRING(-86.541144 32.68895,-86.541151 32.688968,-86.541193 32.68905,-86.541163 32.689148,-86.540987 32.689344,-86.540684 32.689567,-86.540606 32.689774,-86.540423 32.690629,-86.540365 32.690833,-86.540319 32.690914,-86.54027 32.690963,-86.5402 32.690999,-86.540144 32.691013,-86.540041 32.691009,-86.539972 32.690982,-86.539886 32.690903,-86.539769 32.690886,-86.539447 32.690875,-86.53929 32.690857)\r\n1299;1223;odd;Kenner Creek Cir;Autauga;AL;36022;LINESTRING(-86.432003 32.586273,-86.431996 32.586221,-86.432005 32.586177,-86.432007 32.586114,-86.432005 32.586033,-86.431939 32.585949,-86.431919 32.58588,-86.431578 32.585777,-86.431373 32.585774,-86.431273 32.585768,-86.431169 32.585762,-86.431062 32.585756,-86.430953 32.585749,-86.430722 32.585739,-86.430605 32.585733,-86.430486 32.585727,-86.430365 32.585727,-86.430135 32.585722,-86.430079 32.58572,-86.430026 32.585718,-86.42992 32.585714,-86.429716 32.585703,-86.429623 32.585699,-86.429534 32.585694,-86.429436 32.585688,-86.429364 32.585699)\r\n1298;1218;even;Kenner Creek Cir;Autauga;AL;36022;LINESTRING(-86.43181 32.586292,-86.4318 32.586223,-86.431803 32.586167,-86.431803 32.586122,-86.431789 32.586089,-86.431765 32.586025,-86.431751 32.586038,-86.43153 32.585959,-86.431359 32.585938,-86.431259 32.585932,-86.431155 32.585926,-86.43105 32.58592,-86.430941 32.585915,-86.430712 32.585905,-86.430595 32.585899,-86.43048 32.585895,-86.430361 32.585893,-86.430129 32.585888,-86.430073 32.585886,-86.430018 32.585886,-86.429908 32.58588,-86.429706 32.585869,-86.429611 32.585867,-86.42952 32.58586,-86.429444 32.585858,-86.429391 32.585862)\r\n238;298;even;Primrose Dr;Autauga;AL;36067;LINESTRING(-86.460139 32.474444,-86.460403 32.474552,-86.460625 32.47465,-86.460705 32.4747,-86.460726 32.474694)\r\n239;299;odd;Primrose Dr;Autauga;AL;36067;LINESTRING(-86.460223 32.474296,-86.460491 32.474402,-86.460723 32.474502,-86.460791 32.474528,-86.460774 32.474535)\r\n200;222;all;Autauga County 33;Autauga;AL;36003;LINESTRING(-86.743984 32.458952,-86.744143 32.459126,-86.744227 32.459232,-86.744344 32.459409,-86.74441 32.459535,-86.744467 32.459669,-86.744509 32.459798,-86.744541 32.459931,-86.74456 32.460067,-86.744577 32.46035,-86.744567 32.462443)\r\n2201;2299;all;Autauga County 61;Autauga;AL;36067;LINESTRING(-86.493225 32.584684,-86.49283 32.585103,-86.492555 32.585381,-86.491749 32.586132,-86.49074 32.587016,-86.490576 32.587177,-86.490428 32.587347,-86.490202 32.587647,-86.490037 32.587896,-86.489687 32.588475,-86.489336 32.589052,-86.48923 32.589247,-86.489106 32.589514,-86.489053 32.589647,-86.488964 32.589923,-86.488837 32.590422,-86.488708 32.590874)\r\n299;201;odd;Flowers Ln;Autauga;AL;36022;LINESTRING(-86.483754 32.589443,-86.483814 32.589913,-86.483871 32.590238,-86.483884 32.590284)\r\n298;200;even;Flowers Ln;Autauga;AL;36022;LINESTRING(-86.483948 32.589425,-86.48401 32.589891,-86.484067 32.59021,-86.484075 32.590253)\r\n487;485;odd;Greystone Way;Autauga;AL;36066;LINESTRING(-86.424608 32.465582,-86.424683 32.465668,-86.424883 32.465809,-86.424995 32.465904,-86.425088 32.466008,-86.425161 32.466123,-86.425184 32.46618,-86.425217 32.466279)\r\n484;400;even;Greystone Way;Autauga;AL;36066;LINESTRING(-86.424759 32.465477,-86.424833 32.465544,-86.425017 32.465685,-86.425149 32.465786,-86.425268 32.465912,-86.425347 32.466053,-86.425386 32.46613,-86.425407 32.466245)\r\n1808;1812;even;Seasons Dr;Autauga;AL;36066;LINESTRING(-86.424855 32.455492,-86.424754 32.455488,-86.424321 32.455478,-86.424274 32.455489)\r\n1801;1811;odd;Seasons Dr;Autauga;AL;36066;LINESTRING(-86.424847 32.455656,-86.424748 32.455654,-86.424335 32.455652,-86.424304 32.455651)\r\n2699;101;all;Houser St;Autauga;AL;36003;LINESTRING(-86.657536 32.432296,-86.657203 32.432474,-86.656542 32.432841,-86.656496 32.43287)\r\n401;499;odd;Tram Spur Dr;Autauga;AL;36051;LINESTRING(-86.416712 32.688596,-86.416737 32.688991,-86.416922 32.689127,-86.417002 32.689156,-86.417046 32.689198,-86.417064 32.689265,-86.416985 32.6894,-86.416964 32.689644,-86.416965 32.689818,-86.417048 32.689983,-86.417151 32.690143,-86.417207 32.690298,-86.417351 32.690464,-86.417509 32.690585,-86.417679 32.690751,-86.418084 32.690891,-86.418489 32.691014,-86.418657 32.690979)\r\n400;498;even;Tram Spur Dr;Autauga;AL;36051;LINESTRING(-86.416906 32.68858,-86.416963 32.688897,-86.417044 32.688967,-86.417124 32.688996,-86.417272 32.689104,-86.417282 32.689297,-86.417201 32.689452,-86.417164 32.689648,-86.417183 32.689778,-86.417236 32.689909,-86.417347 32.690071,-86.417405 32.690214,-86.417513 32.690348,-86.417649 32.690467,-86.417811 32.690593,-86.41816 32.690735,-86.418497 32.69085,-86.418604 32.69082)\r\n2401;2419;all;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.487439 32.625478,-86.487561 32.625718,-86.487683 32.625991,-86.487812 32.62631)\r\n700;702;even;Autauga County 175;Autauga;AL;36051;LINESTRING(-86.576146 32.687783,-86.576187 32.687838)\r\n701;703;odd;Autauga County 175;Autauga;AL;36051;LINESTRING(-86.576311 32.687695,-86.576352 32.68775)\r\n213;205;odd;Durden Rd;Autauga;AL;36067;LINESTRING(-86.485925 32.471658,-86.486047 32.471518)\r\n150;142;even;Durden Rd;Autauga;AL;36067;LINESTRING(-86.485768 32.47156,-86.48589 32.47142)\r\n800;898;all;Bunche Ave;Autauga;AL;36067;LINESTRING(-86.472187 32.479056,-86.472202 32.478749,-86.472205 32.478642)\r\n1400;1472;even;US Hwy 31;Autauga;AL;36066;LINESTRING(-86.456879 32.515354,-86.456943 32.515723,-86.456962 32.51587,-86.457018 32.516154,-86.457036 32.516299,-86.457063 32.516439,-86.457084 32.516579,-86.457126 32.517006,-86.457142 32.517293,-86.457147 32.517581,-86.457138 32.517864,-86.457118 32.518151,-86.457087 32.518436,-86.457044 32.518717,-86.456987 32.519001,-86.456809 32.51978,-86.456788 32.51985,-86.456666 32.520351,-86.45665 32.520433,-86.456595 32.52066)\r\n1401;1435;odd;US Hwy 31;Autauga;AL;36067;LINESTRING(-86.457072 32.51533,-86.457139 32.515701,-86.45716 32.515846,-86.457216 32.516132,-86.457234 32.516277,-86.457261 32.516415,-86.45728 32.516563,-86.457324 32.516996,-86.45734 32.517289,-86.457343 32.517581,-86.457336 32.51787,-86.457316 32.518163,-86.457283 32.518454,-86.45724 32.518741,-86.457181 32.519031,-86.457005 32.519818,-86.456982 32.519888,-86.456862 32.520381,-86.456848 32.520463,-86.456785 32.520695)\r\n599;501;odd;Mimosa Rd;Autauga;AL;36067;LINESTRING(-86.457717 32.476335,-86.457716 32.476278,-86.457735 32.476024,-86.457782 32.475821,-86.457806 32.475763,-86.45791 32.475571,-86.457991 32.475444,-86.458101 32.475246,-86.458215 32.475057,-86.458247 32.475005)\r\n598;500;even;Mimosa Rd;Autauga;AL;36067;LINESTRING(-86.457523 32.47634,-86.45752 32.476276,-86.457527 32.476002,-86.457584 32.475777,-86.457614 32.475697,-86.457732 32.475495,-86.457813 32.475368,-86.457923 32.475172,-86.458041 32.474979,-86.458077 32.474926)\r\n2520;2528;all;Wyngate Dr;Autauga;AL;36067;LINESTRING(-86.520154 32.444321,-86.520186 32.444054,-86.520202 32.443308,-86.520231 32.443118,-86.520199 32.44293)\r\n899;801;odd;Carter Rd;Autauga;AL;36067;LINESTRING(-86.490106 32.452033,-86.489499 32.452442,-86.489376 32.452507,-86.489245 32.45256,-86.489119 32.452597,-86.488945 32.452629,-86.488681 32.452662,-86.488269 32.452647,-86.487923 32.45263,-86.487467 32.452597,-86.48738 32.452588)\r\n898;800;even;Carter Rd;Autauga;AL;36067;LINESTRING(-86.490229 32.452161,-86.489617 32.452588,-86.489472 32.452651,-86.489329 32.452732,-86.489167 32.452759,-86.488983 32.452797,-86.488691 32.452834,-86.488259 32.452811,-86.487909 32.452796,-86.487445 32.452765,-86.487352 32.452751)\r\n1174;1198;even;Cooper Ave;Autauga;AL;36066;LINESTRING(-86.443058 32.462331,-86.442761 32.462426,-86.44253 32.462485,-86.442292 32.462516,-86.441973 32.462527)\r\n1167;1221;odd;Cooper Ave;Autauga;AL;36066;LINESTRING(-86.443128 32.462484,-86.442829 32.462584,-86.442578 32.462659,-86.44231 32.46269,-86.441977 32.462691)\r\n701;791;all;Mc Griff St;Autauga;AL;36067;LINESTRING(-86.464906 32.440223,-86.465073 32.440231,-86.465327 32.440227,-86.465756 32.440236,-86.465785 32.440238)\r\n3301;3379;all;Mulberry Rd;Autauga;AL;36003;LINESTRING(-86.756083 32.457632,-86.756194 32.457643,-86.756869 32.457728,-86.762346 32.459176)\r\n599;401;all;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.689871 32.401686,-86.689955 32.401792,-86.690133 32.402037,-86.690216 32.402165,-86.690525 32.402686,-86.690611 32.402817,-86.690791 32.403067,-86.69089 32.403193,-86.690999 32.403313,-86.691123 32.403426,-86.691257 32.403531,-86.691401 32.403626,-86.691554 32.403714,-86.691715 32.403786,-86.691881 32.403845,-86.692284 32.403985,-86.692599 32.4041,-86.69338 32.40441,-86.694557 32.404867,-86.695347 32.405172,-86.696308 32.405516,-86.696626 32.405626,-86.696768 32.405692,-86.696884 32.405774,-86.696913 32.405791,-86.696948 32.405866,-86.696972 32.405967,-86.696926 32.407328,-86.696893 32.408942,-86.696888 32.409246,-86.696896 32.409334,-86.696944 32.409499,-86.697058 32.40965,-86.697156 32.40971,-86.697337 32.409768,-86.697523 32.409785,-86.697866 32.409798,-86.698378 32.409833,-86.698717 32.409864,-86.699052 32.409913,-86.699215 32.409946,-86.69987 32.41011,-86.700612 32.410282,-86.700835 32.410365,-86.700963 32.410437,-86.701071 32.410527,-86.701157 32.410631,-86.701226 32.410747,-86.701282 32.41087,-86.701329 32.411001,-86.701532 32.411707,-86.701699 32.412269,-86.701733 32.412408,-86.701761 32.412549,-86.701783 32.41269,-86.701797 32.412832,-86.70181 32.41312,-86.701789 32.413559,-86.701783 32.413858,-86.701789 32.414018,-86.70183 32.414195,-86.701971 32.414356,-86.702181 32.414413,-86.702359 32.414411,-86.70312 32.414402,-86.703552 32.414402,-86.704851 32.414413,-86.706316 32.41441,-86.706658 32.41442,-86.706805 32.414434)\r\n1563;1501;all;Quinneboquin Rd;Autauga;AL;36067;LINESTRING(-86.457649 32.524283,-86.457659 32.524306,-86.457672 32.524361,-86.457686 32.524412,-86.457695 32.52447,-86.457704 32.52453,-86.457713 32.52459,-86.45772 32.52465,-86.457727 32.524703)\r\n500;506;all;Whispering Wind Way;Autauga;AL;36022;LINESTRING(-86.46819 32.600829,-86.468444 32.600567,-86.468711 32.600161)\r\n2101;2121;all;Maul Dr;Autauga;AL;36006;LINESTRING(-86.708382 32.660482,-86.708301 32.660581)\r\n132;198;even;Lina Dr;Autauga;AL;36067;LINESTRING(-86.453208 32.447378,-86.453157 32.447334,-86.452738 32.447066,-86.452651 32.447009)\r\n129;199;odd;Lina Dr;Autauga;AL;36067;LINESTRING(-86.453077 32.4475,-86.453027 32.447466,-86.452616 32.447198,-86.452529 32.447137)\r\n1100;1120;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.444705 32.452894,-86.444235 32.452389)\r\n1900;1998;even;Clear Branch Rd;Autauga;AL;36022;LINESTRING(-86.420154 32.507132,-86.42026 32.507138)\r\n1505;1599;odd;Clear Branch Rd;Autauga;AL;36022;LINESTRING(-86.420165 32.506968,-86.420271 32.506974)\r\n411;401;all;Durden Rd;Autauga;AL;36067;LINESTRING(-86.485462 32.475704,-86.48525 32.47548,-86.485089 32.475305,-86.485081 32.475302)\r\n3898;3800;all;Edwards Rd;Autauga;AL;36749;LINESTRING(-86.817097 32.583917,-86.816943 32.58382,-86.816149 32.583255,-86.815945 32.583117,-86.81575 32.58296,-86.815577 32.582792,-86.815425 32.582639,-86.815377 32.582608,-86.815326 32.582587,-86.815261 32.582575,-86.815185 32.582573,-86.814929 32.582589,-86.814667 32.582617,-86.814487 32.582618,-86.814306 32.582612,-86.814046 32.582578,-86.813882 32.582558,-86.813808 32.58255,-86.813736 32.582559,-86.813664 32.582571,-86.813508 32.582612,-86.813433 32.582637,-86.812982 32.582819,-86.81284 32.582886,-86.812776 32.582922,-86.812717 32.582963,-86.812665 32.583007,-86.812507 32.583171,-86.812367 32.583336,-86.812274 32.583462,-86.812213 32.58353,-86.812137 32.583592,-86.812049 32.58364,-86.811953 32.583676,-86.811853 32.583697,-86.811346 32.583734,-86.811094 32.583767,-86.810853 32.583811,-86.810785 32.58383,-86.810717 32.583857,-86.810427 32.584007,-86.810346 32.584046,-86.810257 32.584079,-86.810164 32.584104,-86.810066 32.58412,-86.809911 32.584125,-86.8098 32.584132,-86.809112 32.584151,-86.808436 32.584147,-86.808109 32.584158,-86.808013 32.584163)\r\n1800;1898;even;Hampstead Ct;Autauga;AL;36066;LINESTRING(-86.419428 32.465079,-86.419346 32.465076,-86.419178 32.465066,-86.419106 32.465066)\r\n1801;1899;odd;Hampstead Ct;Autauga;AL;36066;LINESTRING(-86.419427 32.465244,-86.419338 32.465246,-86.419168 32.465234,-86.4191 32.465231)\r\n100;198;even;Live Oak Dr;Autauga;AL;36067;LINESTRING(-86.478837 32.477183,-86.47896 32.477182,-86.479053 32.477174,-86.479317 32.477131,-86.479568 32.477045,-86.479879 32.47692,-86.480109 32.47684,-86.480339 32.476788,-86.480582 32.476766,-86.481099 32.47677)\r\n101;199;odd;Live Oak Dr;Autauga;AL;36067;LINESTRING(-86.478829 32.477019,-86.478944 32.477012,-86.479021 32.477004,-86.479257 32.476961,-86.479488 32.476889,-86.479797 32.476768,-86.480039 32.476674,-86.480301 32.476612,-86.480574 32.476596,-86.481101 32.476605)\r\n1198;1100;all;Lower Kingston Rd;Autauga;AL;36067;LINESTRING(-86.503221 32.481213,-86.503138 32.481166,-86.50122 32.479933,-86.500943 32.479763,-86.50066 32.479604,-86.500515 32.479531,-86.500215 32.479395,-86.499862 32.479251,-86.49967 32.479184,-86.499586 32.479155)\r\n163;145;odd;Autauga County 27;Autauga;AL;36067;LINESTRING(-86.537908 32.420515,-86.537911 32.420639,-86.53792 32.421345,-86.537887 32.423533,-86.53789 32.424195,-86.537898 32.424408)\r\n164;148;even;Autauga County 27;Autauga;AL;36067;LINESTRING(-86.538102 32.42051,-86.538107 32.420635,-86.538114 32.421345,-86.538083 32.423533,-86.538086 32.424193,-86.538093 32.424403)\r\n1201;1299;all;Autauga County 7;Autauga;AL;36749;LINESTRING(-86.831958 32.600402,-86.832063 32.600432,-86.832761 32.600617,-86.833003 32.60067,-86.833248 32.600707,-86.833409 32.60072,-86.833657 32.600726,-86.834079 32.600711,-86.835103 32.600662,-86.836044 32.600592,-86.836729 32.60057,-86.837667 32.600495,-86.837933 32.600485,-86.838115 32.600497,-86.838291 32.60052,-86.839223 32.600676,-86.839649 32.60076,-86.840061 32.600869,-86.840474 32.600998,-86.840729 32.601086)\r\n3087;3099;all;State Rte 14;Autauga;AL;36003;LINESTRING(-86.706004 32.445469,-86.70913 32.446519,-86.709772 32.446728,-86.710038 32.446811)\r\n129;125;all;White Oak Ct;Autauga;AL;36067;LINESTRING(-86.472728 32.474235,-86.472756 32.474194,-86.472749 32.474101,-86.47274 32.474022,-86.472732 32.473998)\r\n199;131;all;White Oak Ct;Autauga;AL;36067;LINESTRING(-86.472543 32.474185,-86.472538 32.474164,-86.472547 32.474109,-86.47254 32.474044,-86.47254 32.474024)\r\n2120;2320;all;Big Springs Church Rd;Autauga;AL;36006;LINESTRING(-86.71871 32.63925,-86.718705 32.639349,-86.718702 32.639424)\r\n1339;1323;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.497761 32.430834,-86.497664 32.430837,-86.497077 32.430849)\r\n1672;1600;all;Pebble Creek Dr;Autauga;AL;36066;LINESTRING(-86.428516 32.462337,-86.428805 32.462327,-86.428844 32.462329)\r\n1701;1799;odd;Josh Dr;Autauga;AL;36006;LINESTRING(-86.713719 32.687049,-86.713263 32.68705,-86.712243 32.687074,-86.710617 32.687085,-86.710187 32.687094,-86.709834 32.687096,-86.70956 32.68712)\r\n1700;1798;even;Josh Dr;Autauga;AL;36006;LINESTRING(-86.71372 32.687214,-86.713267 32.687216,-86.712247 32.68724,-86.710621 32.687251,-86.710191 32.68726,-86.709844 32.687266,-86.709578 32.687284)\r\n498;446;all;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.477336 32.470053,-86.476883 32.469198,-86.47687 32.469172)\r\n2095;2131;all;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.549594 32.588935,-86.549548 32.589263)\r\n490;498;even;Kelly Botton Rd;Autauga;AL;36022;LINESTRING(-86.444321 32.641564,-86.444144 32.641522,-86.443723 32.641444,-86.443548 32.641424,-86.44337 32.641416,-86.443107 32.641417,-86.442931 32.641435,-86.442835 32.641444,-86.442827 32.641454)\r\n401;499;odd;Kelly Botton Rd;Autauga;AL;36022;LINESTRING(-86.444271 32.641723,-86.444098 32.641686,-86.443689 32.641612,-86.443528 32.641594,-86.443366 32.641584,-86.443119 32.641589,-86.442959 32.641603,-86.442891 32.641618,-86.442896 32.641608)\r\n138;144;even;Beth Manor Dr;Autauga;AL;36066;LINESTRING(-86.430197 32.448109,-86.429831 32.448109,-86.429434 32.44812)\r\n137;141;odd;Beth Manor Dr;Autauga;AL;36066;LINESTRING(-86.430197 32.448274,-86.429835 32.448275,-86.42944 32.448284)\r\n699;501;odd;N Court St;Autauga;AL;36067;LINESTRING(-86.474764 32.470482,-86.474812 32.469973)\r\n698;500;even;N Court St;Autauga;AL;36067;LINESTRING(-86.47457 32.47047,-86.474618 32.469961)\r\n846;856;even;Autauga County 165;Autauga;AL;36067;LINESTRING(-86.593662 32.489664,-86.593288 32.490004,-86.592777 32.490498,-86.590552 32.492709,-86.590354 32.492909)\r\n835;861;odd;Autauga County 165;Autauga;AL;36067;LINESTRING(-86.593804 32.489775,-86.593434 32.490116,-86.592925 32.490606,-86.590702 32.492815,-86.590503 32.493014)\r\n104;100;all;Durden Rd;Autauga;AL;36067;LINESTRING(-86.48645 32.470752,-86.486632 32.470555)\r\n1000;1006;even;Wright St;Autauga;AL;36066;LINESTRING(-86.448346 32.465545,-86.448244 32.465571)\r\n1001;1013;odd;Wright St;Autauga;AL;36066;LINESTRING(-86.448403 32.465702,-86.448301 32.465728)\r\n200;298;even;Douglas Cir;Autauga;AL;36067;LINESTRING(-86.462954 32.466042,-86.462938 32.46607,-86.46302 32.466179,-86.463235 32.466578)\r\n201;299;odd;Douglas Cir;Autauga;AL;36067;LINESTRING(-86.463148 32.466047,-86.463164 32.466026,-86.4632 32.466105,-86.463412 32.466511)\r\n1344;1312;all;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.415104 32.515445,-86.41559 32.514892,-86.415888 32.514539,-86.416074 32.514301,-86.416251 32.514057,-86.416418 32.513809,-86.416571 32.513556,-86.41671 32.513298,-86.416836 32.513037,-86.417339 32.51192)\r\n1101;1199;all;Lipscomb Ct;Autauga;AL;36067;LINESTRING(-86.44322 32.414317,-86.44287 32.414221,-86.442783 32.414191,-86.44248 32.414053,-86.44233 32.413999,-86.441924 32.413888,-86.441522 32.413768,-86.441444 32.413749,-86.441287 32.41372,-86.44114 32.413704,-86.440982 32.413707,-86.440819 32.413723,-86.440746 32.413737,-86.440714 32.41374)\r\n1320;1398;even;Crows Pass;Autauga;AL;36067;LINESTRING(-86.472877 32.506663,-86.472868 32.506699,-86.472873 32.506802,-86.472873 32.506855,-86.472874 32.506961,-86.472877 32.507076,-86.472879 32.507203,-86.472879 32.507266,-86.472878 32.507387,-86.472875 32.507513,-86.472873 32.507569,-86.472867 32.507628,-86.47286 32.507691,-86.472836 32.50783,-86.472817 32.507898,-86.472788 32.507961,-86.472708 32.508088,-86.472663 32.508142,-86.472606 32.508192,-86.472545 32.508238,-86.472399 32.508327,-86.472326 32.508368,-86.472252 32.508406,-86.472181 32.508441,-86.472113 32.508473,-86.471987 32.50853,-86.471931 32.508555,-86.471881 32.508577,-86.471861 32.508587)\r\n1325;1399;odd;Crows Pass;Autauga;AL;36067;LINESTRING(-86.473071 32.50668,-86.473072 32.506707,-86.473069 32.506802,-86.473069 32.506855,-86.47307 32.506959,-86.473071 32.507074,-86.473073 32.507201,-86.473075 32.507266,-86.473074 32.507389,-86.473073 32.507519,-86.473067 32.507579,-86.473065 32.50764,-86.473058 32.507709,-86.473038 32.507862,-86.473011 32.507946,-86.47298 32.508031,-86.472886 32.508184,-86.472819 32.508254,-86.472746 32.50832,-86.472667 32.508372,-86.472511 32.508467,-86.47243 32.50851,-86.472352 32.508548,-86.472279 32.508585,-86.472207 32.508619,-86.472079 32.508676,-86.472023 32.508701,-86.471971 32.508725,-86.471949 32.508733)\r\n1100;1198;even;Faulk Ave;Autauga;AL;36066;LINESTRING(-86.444601 32.459364,-86.444216 32.459358,-86.443021 32.459363,-86.442895 32.459367)\r\n1101;1199;odd;Faulk Ave;Autauga;AL;36066;LINESTRING(-86.444598 32.459528,-86.444214 32.459524,-86.443025 32.459529,-86.4429 32.459531)\r\n100;198;even;Mill Ridge Ct;Autauga;AL;36066;LINESTRING(-86.416512 32.470263,-86.416488 32.470342,-86.416463 32.470411,-86.416425 32.470566,-86.416447 32.470793,-86.416464 32.470871,-86.416471 32.470902)\r\n101;199;odd;Mill Ridge Ct;Autauga;AL;36066;LINESTRING(-86.416702 32.470298,-86.416682 32.470384,-86.416659 32.470453,-86.416629 32.470576,-86.416649 32.470771,-86.416666 32.470849,-86.416665 32.470888)\r\n900;998;even;Thomas Ave;Autauga;AL;36067;LINESTRING(-86.449738 32.458734,-86.449625 32.458807,-86.449419 32.458933,-86.449086 32.459162,-86.448941 32.459256)\r\n901;999;odd;Thomas Ave;Autauga;AL;36066;LINESTRING(-86.449859 32.458863,-86.449745 32.458941,-86.449541 32.459067,-86.449208 32.459294,-86.449058 32.459388)\r\n3600;3614;even;State Rte 14;Autauga;AL;36003;LINESTRING(-86.79429 32.460453,-86.795648 32.46097)\r\n3601;3615;odd;State Rte 14;Autauga;AL;36003;LINESTRING(-86.79437 32.460303,-86.795728 32.46082)\r\n2006;2098;all;Chancellor Ridge Rd;Autauga;AL;36066;LINESTRING(-86.416793 32.474084,-86.417 32.473933,-86.417318 32.473695,-86.417581 32.473491,-86.417762 32.473362,-86.417869 32.473247,-86.417962 32.473115,-86.417988 32.47305)\r\n2192;2198;even;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.662096 32.651391,-86.661942 32.652141,-86.661714 32.653203,-86.66168 32.653341,-86.661641 32.653477,-86.661594 32.653611,-86.661556 32.653704)\r\n2139;2213;odd;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.662288 32.651419,-86.662134 32.652169,-86.661908 32.653235,-86.661874 32.653377,-86.661833 32.653519,-86.661788 32.653665,-86.661738 32.653764)\r\n1606;1698;all;Autauga County 127;Autauga;AL;36006;LINESTRING(-86.768266 32.641509,-86.76827 32.641557,-86.768307 32.641708,-86.768365 32.641857,-86.768475 32.642067,-86.768757 32.642525,-86.768856 32.642719,-86.768938 32.64292,-86.768982 32.643057,-86.769051 32.643336,-86.769089 32.643549,-86.769114 32.643763,-86.769128 32.64405,-86.769122 32.644193,-86.769107 32.644332,-86.769066 32.644541,-86.769026 32.644675,-86.768921 32.644942,-86.768822 32.645136,-86.768707 32.645327,-86.768538 32.645573,-86.768125 32.646113,-86.768036 32.646239,-86.767996 32.646311,-86.767935 32.646454,-86.767894 32.646602,-86.767879 32.646679,-86.767869 32.646756,-86.767871 32.646907,-86.767877 32.646984,-86.767905 32.64713,-86.767989 32.647382)\r\n1602;1604;all;Autauga County 127;Autauga;AL;36006;LINESTRING(-86.76846 32.641488,-86.76847 32.641529,-86.768505 32.641664,-86.768555 32.641795,-86.768657 32.641993,-86.768939 32.642451,-86.769046 32.642657,-86.76913 32.64287,-86.769176 32.643017,-86.769247 32.643306,-86.769287 32.643527,-86.769316 32.643751,-86.769324 32.64405,-86.769322 32.644203,-86.769307 32.644354,-86.769264 32.644575,-86.76922 32.644723,-86.769111 32.645004,-86.769004 32.64521,-86.768881 32.645407,-86.768708 32.645661,-86.768295 32.646201,-86.768216 32.646319,-86.768184 32.646377,-86.768131 32.646504,-86.768092 32.646636,-86.768079 32.646701,-86.768073 32.646764,-86.768073 32.646901,-86.768079 32.646964,-86.768105 32.647094,-86.768178 32.64734)\r\n3101;3199;all;Go Cart Rd;Autauga;AL;36051;LINESTRING(-86.523021 32.700661,-86.523326 32.700669,-86.523562 32.700677,-86.523724 32.700708,-86.523875 32.700744,-86.524097 32.700824,-86.524359 32.700957,-86.525381 32.701473,-86.525639 32.701619,-86.525825 32.701709,-86.526158 32.701829,-86.526793 32.702067,-86.526982 32.702146,-86.527179 32.702209,-86.527378 32.70225,-86.527811 32.70231,-86.528029 32.702332,-86.528537 32.702419,-86.528758 32.702473,-86.528974 32.702536,-86.529246 32.702657,-86.529901 32.703002,-86.530017 32.703077,-86.53016 32.703156,-86.530274 32.703257,-86.530395 32.703379,-86.530485 32.703478,-86.530679 32.70379,-86.530743 32.703885)\r\n1031;827;odd;Durden Rd;Autauga;AL;36067;LINESTRING(-86.483811 32.493948,-86.484037 32.493786,-86.484371 32.493554,-86.484957 32.493132,-86.485039 32.493068)\r\n1032;818;even;Durden Rd;Autauga;AL;36067;LINESTRING(-86.483685 32.493822,-86.483911 32.493658,-86.484245 32.493426,-86.484827 32.493006,-86.484909 32.492945)\r\n1844;1898;all;Autauga County 117;Autauga;AL;36067;LINESTRING(-86.65197 32.600203,-86.651967 32.600429,-86.651985 32.601487)\r\n500;698;even;Shackleford Ln;Autauga;AL;36003;LINESTRING(-86.689555 32.385506,-86.689552 32.38546,-86.689532 32.385049,-86.68953 32.384794,-86.689533 32.384454,-86.689547 32.384038,-86.689561 32.383672,-86.689571 32.383197,-86.689584 32.382771,-86.689599 32.382175,-86.689608 32.381827,-86.689626 32.381372,-86.68964 32.381266,-86.689662 32.381169,-86.689693 32.381086,-86.689732 32.38101,-86.689754 32.38098,-86.689808 32.380928,-86.689914 32.380856,-86.690002 32.380813,-86.690117 32.380772,-86.690249 32.380738,-86.690563 32.380683,-86.690819 32.380656,-86.691171 32.380633,-86.691534 32.380618,-86.691832 32.380589,-86.692029 32.38054,-86.69223 32.38046,-86.692449 32.380332,-86.692664 32.380199,-86.692876 32.380091,-86.693004 32.379999,-86.693088 32.379864,-86.693097 32.379652,-86.693069 32.379563)\r\n501;699;odd;Shackleford Ln;Autauga;AL;36003;LINESTRING(-86.689363 32.385532,-86.689346 32.385476,-86.689334 32.385051,-86.689336 32.384794,-86.689337 32.384452,-86.689353 32.384034,-86.689365 32.383668,-86.689377 32.383193,-86.68939 32.382767,-86.689405 32.382171,-86.689412 32.381823,-86.689424 32.38136,-86.68944 32.38124,-86.689466 32.381129,-86.689497 32.381026,-86.68955 32.380928,-86.689584 32.38088,-86.689656 32.3808,-86.689798 32.380704,-86.689916 32.380657,-86.690047 32.380612,-86.690197 32.38057,-86.690531 32.380513,-86.690801 32.38049,-86.691159 32.380467,-86.691516 32.380448,-86.69179 32.380415,-86.691955 32.380374,-86.692128 32.380306,-86.692335 32.380194,-86.69255 32.380057,-86.692748 32.379949,-86.692826 32.379883,-86.692868 32.379812,-86.692891 32.379664,-86.692879 32.379599)\r\n100;120;even;Daffadil Ct;Autauga;AL;36067;LINESTRING(-86.470814 32.572169,-86.470787 32.572168,-86.4707 32.57217,-86.470646 32.572171,-86.470584 32.572171,-86.470518 32.572172,-86.470447 32.572172,-86.470374 32.572174,-86.4703 32.572174,-86.470226 32.572176,-86.470152 32.572177,-86.470077 32.572178,-86.470001 32.572177,-86.469774 32.57218,-86.469698 32.572179,-86.469625 32.572182,-86.469553 32.572183,-86.469481 32.572183,-86.469415 32.572184,-86.469336 32.572186,-86.469191 32.572188,-86.469116 32.572187,-86.469039 32.57219,-86.468884 32.572193,-86.468806 32.572194,-86.468731 32.572196,-86.468664 32.572196,-86.468605 32.572192,-86.468591 32.572177,-86.468517 32.572122,-86.468491 32.572099,-86.468469 32.572048,-86.468447 32.571992,-86.468424 32.571928,-86.468367 32.571801,-86.468335 32.571732,-86.468305 32.571665,-86.468276 32.571596,-86.468218 32.57145,-86.468186 32.571376,-86.468154 32.571302,-86.468098 32.571156,-86.468072 32.571084,-86.468047 32.571013,-86.468024 32.570945,-86.467984 32.57082,-86.467967 32.570764,-86.467943 32.570687)\r\n101;129;odd;Daffadil Ct;Autauga;AL;36067;LINESTRING(-86.470827 32.572333,-86.470793 32.572338,-86.470702 32.572336,-86.470648 32.572337,-86.470586 32.572337,-86.47052 32.572338,-86.470449 32.572338,-86.470378 32.572338,-86.470304 32.57234,-86.47023 32.572342,-86.470154 32.572343,-86.470077 32.572342,-86.470003 32.572343,-86.469776 32.572346,-86.469702 32.572347,-86.469629 32.572348,-86.469555 32.572349,-86.469483 32.572349,-86.469419 32.57235,-86.46934 32.572352,-86.469193 32.572354,-86.46912 32.572355,-86.469045 32.572356,-86.468888 32.572359,-86.46881 32.57236,-86.468735 32.572362,-86.46866 32.572364,-86.468587 32.572362,-86.468487 32.572365,-86.468325 32.572232,-86.468305 32.572157,-86.468283 32.5721,-86.468261 32.572044,-86.468236 32.571984,-86.468183 32.571859,-86.468153 32.571792,-86.468121 32.571723,-86.46809 32.57165,-86.468032 32.571506,-86.467998 32.571432,-86.46797 32.571354,-86.46791 32.571206,-86.467884 32.571132,-86.467859 32.571059,-86.467836 32.570989,-86.467794 32.570862,-86.467777 32.570804,-86.467755 32.570728)\r\n615;601;odd;Shadow Ln;Autauga;AL;36066;LINESTRING(-86.448553 32.472478,-86.448621 32.472297,-86.448787 32.471896,-86.448847 32.471765)\r\n616;608;even;Shadow Ln;Autauga;AL;36066;LINESTRING(-86.448367 32.47243,-86.448433 32.472245,-86.448599 32.471836,-86.448667 32.471703)\r\n901;919;all;Geneva St;Autauga;AL;36066;LINESTRING(-86.442638 32.458473,-86.442631 32.45837,-86.44261 32.458163,-86.442585 32.458055,-86.442555 32.457979,-86.442523 32.457913)\r\n2673;2675;all;Co Rd 110;Autauga;AL;36758;LINESTRING(-86.844168 32.659871,-86.844091 32.659884,-86.843946 32.659905,-86.843805 32.659892,-86.843656 32.659859,-86.843186 32.659709,-86.842955 32.659625,-86.842716 32.659535,-86.842452 32.65948,-86.841948 32.659452,-86.841721 32.659416,-86.841502 32.659349,-86.841279 32.659246,-86.841026 32.659165,-86.840755 32.659118,-86.840475 32.659134,-86.840223 32.659196,-86.839801 32.659267,-86.839624 32.65935,-86.839499 32.65946,-86.839314 32.659585,-86.839108 32.659681,-86.838886 32.659758,-86.838665 32.659799,-86.838431 32.659798,-86.838183 32.659769,-86.837927 32.659753,-86.837672 32.659756,-86.837572 32.659759,-86.83744 32.659787,-86.837327 32.65985,-86.837244 32.659931,-86.837202 32.659997,-86.83708 32.66018)\r\n140;198;all;Indian Trl;Autauga;AL;36067;LINESTRING(-86.558031 32.433787,-86.558033 32.433849,-86.558017 32.434358,-86.558004 32.434576,-86.558005 32.434717)\r\n900;998;even;Gipson St;Autauga;AL;36066;LINESTRING(-86.450546 32.464132,-86.450511 32.464134,-86.450342 32.464126,-86.450162 32.464131,-86.449983 32.46415,-86.449082 32.464384,-86.448511 32.464518,-86.448295 32.464565)\r\n901;999;odd;Gipson St;Autauga;AL;36066;LINESTRING(-86.450556 32.464296,-86.450511 32.464298,-86.450342 32.46429,-86.450182 32.464301,-86.450027 32.464322,-86.449136 32.464544,-86.448561 32.464678,-86.448342 32.464724)\r\n332;398;all;E Main St;Autauga;AL;36067;LINESTRING(-86.465866 32.459132,-86.465817 32.459133,-86.46564 32.459127,-86.465555 32.459137,-86.465299 32.459148,-86.464815 32.459175)\r\n700;738;even;Autauga County 68;Autauga;AL;36051;LINESTRING(-86.433683 32.677382,-86.433671 32.677384,-86.433508 32.677447,-86.43299 32.677723,-86.432851 32.677816,-86.432718 32.677918,-86.432591 32.678021,-86.432415 32.678187,-86.432207 32.678428,-86.432035 32.67869,-86.431933 32.6789,-86.431813 32.679258,-86.431771 32.679477,-86.431692 32.679906,-86.431634 32.680263)\r\n719;739;odd;Autauga County 68;Autauga;AL;36051;LINESTRING(-86.433757 32.677534,-86.433753 32.677538,-86.433608 32.677599,-86.433108 32.677865,-86.432981 32.677946,-86.432854 32.67804,-86.432737 32.678139,-86.432575 32.678295,-86.432381 32.678522,-86.432221 32.678766,-86.432127 32.678956,-86.432013 32.679296,-86.431965 32.679505,-86.431886 32.67993,-86.431827 32.680286)\r\n1112;1174;even;S McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.418197 32.447422,-86.418193 32.447149,-86.418179 32.446132)\r\n1113;1175;odd;S McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.418002 32.447423,-86.417999 32.447151,-86.417984 32.446134)\r\n277;247;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.488565 32.570438,-86.487935 32.570432,-86.487225 32.570452,-86.485127 32.570507,-86.484403 32.570526)\r\n298;254;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.488563 32.570602,-86.487937 32.570598,-86.487231 32.570616,-86.485133 32.570671,-86.484409 32.57069)\r\n400;498;even;Ward Owens Dr;Autauga;AL;36067;LINESTRING(-86.483297 32.528605,-86.483488 32.528742,-86.484175 32.529281,-86.484372 32.529422,-86.484765 32.5297,-86.485276 32.530078,-86.485388 32.530177,-86.485546 32.530351,-86.485619 32.530414,-86.485791 32.530502,-86.486062 32.530543,-86.486237 32.530562,-86.486497 32.53058,-86.486839 32.53059,-86.487091 32.530605,-86.487251 32.530624,-86.487318 32.530639,-86.487457 32.530692,-86.487514 32.530722,-86.487702 32.530863,-86.487839 32.530966,-86.488082 32.531064,-86.488398 32.531181,-86.488561 32.531238,-86.48873 32.53128,-86.488901 32.531312,-86.489072 32.531339,-86.489248 32.531363,-86.48944 32.531369,-86.489645 32.531324,-86.489792 32.531198,-86.489798 32.531172)\r\n1799;401;odd;Ward Owens Dr;Autauga;AL;36067;LINESTRING(-86.483422 32.528478,-86.48362 32.528614,-86.484307 32.529155,-86.484498 32.529296,-86.484893 32.529574,-86.485416 32.529954,-86.485542 32.530065,-86.4857 32.530233,-86.485749 32.530268,-86.485871 32.530326,-86.486096 32.530375,-86.486259 32.530394,-86.486509 32.530412,-86.486849 32.530424,-86.487109 32.530437,-86.487287 32.530452,-86.487386 32.530471,-86.487561 32.530534,-86.487642 32.530586,-86.487832 32.530735,-86.487957 32.530814,-86.488168 32.530912,-86.488474 32.531027,-86.488627 32.531076,-86.488782 32.531116,-86.488941 32.531148,-86.489104 32.531173,-86.489264 32.531189,-86.48941 32.531185,-86.489527 32.531152,-86.489622 32.531082,-86.489632 32.531086)\r\n1201;1227;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.44379 32.452355,-86.443721 32.452281,-86.442446 32.450931,-86.442015 32.450485,-86.441631 32.450101,-86.441406 32.44989,-86.441327 32.449818)\r\n199;101;odd;Spring Valley Dr;Autauga;AL;36066;LINESTRING(-86.453121 32.517736,-86.454174 32.517815)\r\n198;100;even;Spring Valley Dr;Autauga;AL;36066;LINESTRING(-86.453138 32.517572,-86.454191 32.517651)\r\n675;601;odd;Wyatt Loop Rd;Autauga;AL;36067;LINESTRING(-86.517417 32.507089,-86.516764 32.507115,-86.516585 32.507128,-86.516492 32.507144,-86.516394 32.507163,-86.516302 32.507207,-86.516222 32.507262,-86.516158 32.507327,-86.516104 32.507401,-86.51607 32.507478,-86.516044 32.507537,-86.516039 32.507545,-86.51606 32.507538,-86.516036 32.507528,-86.515999 32.507482,-86.515975 32.507425,-86.515962 32.507369,-86.515963 32.507314,-86.515997 32.507167,-86.515991 32.507065,-86.515939 32.50698,-86.515875 32.506917,-86.515706 32.506751,-86.515387 32.506414,-86.515295 32.5063,-86.514959 32.505801,-86.514908 32.505733,-86.514796 32.505625,-86.514703 32.505516,-86.514666 32.505462,-86.514633 32.505406,-86.514576 32.505282,-86.514554 32.505221,-86.514465 32.504872,-86.514436 32.504807,-86.514413 32.504745)\r\n798;600;even;Wyatt Loop Rd;Autauga;AL;36067;LINESTRING(-86.517427 32.507253,-86.516778 32.507283,-86.516615 32.507298,-86.51654 32.50731,-86.516476 32.507331,-86.51642 32.507355,-86.51637 32.50739,-86.516328 32.507431,-86.516292 32.507481,-86.516264 32.507534,-86.516246 32.507609,-86.516157 32.507735,-86.515956 32.507732,-86.51586 32.50764,-86.515811 32.507556,-86.515771 32.507475,-86.515752 32.507387,-86.515749 32.507292,-86.515797 32.507159,-86.515779 32.507119,-86.515757 32.507074,-86.515719 32.507023,-86.515554 32.506857,-86.515225 32.506516,-86.515123 32.506392,-86.514787 32.505891,-86.514744 32.505839,-86.514636 32.505731,-86.514537 32.50561,-86.514486 32.505546,-86.514447 32.505474,-86.514386 32.505338,-86.514358 32.505265,-86.514265 32.504922,-86.514236 32.504857,-86.514223 32.504781)\r\n100;198;even;Mara Ct;Autauga;AL;36066;LINESTRING(-86.431544 32.448292,-86.431537 32.448414,-86.431559 32.448777,-86.431563 32.448917,-86.431545 32.4492,-86.431536 32.449264,-86.431519 32.449347)\r\n101;199;odd;Mara Ct;Autauga;AL;36066;LINESTRING(-86.431738 32.448299,-86.431733 32.448414,-86.431757 32.448771,-86.431759 32.448919,-86.431747 32.449214,-86.431734 32.449292,-86.43171 32.44938)\r\n1282;1398;even;E Main St;Autauga;AL;36066;LINESTRING(-86.437309 32.460369,-86.435796 32.460377,-86.435515 32.460376)\r\n1301;1313;odd;E Main St;Autauga;AL;36066;LINESTRING(-86.43731 32.460534,-86.435796 32.460541,-86.435515 32.460541)\r\n2013;2021;all;Red Hawk Rd;Autauga;AL;36067;LINESTRING(-86.471914 32.508807,-86.471975 32.508946,-86.472022 32.509154)\r\n2445;2465;all;Autauga County 61;Autauga;AL;36022;LINESTRING(-86.479534 32.605129,-86.479755 32.606804,-86.479871 32.607735,-86.47989 32.607866)\r\n2500;2598;even;Tobacco Rd;Autauga;AL;36022;LINESTRING(-86.484251 32.627354,-86.484005 32.627625,-86.483885 32.627776,-86.48386 32.628085,-86.483857 32.628346,-86.483988 32.62849,-86.484025 32.628764,-86.48416 32.628963,-86.484321 32.62902,-86.484464 32.629181,-86.484499 32.629334,-86.484405 32.629623)\r\n2501;2599;odd;Tobacco Rd;Autauga;AL;36022;LINESTRING(-86.484407 32.627452,-86.484175 32.627721,-86.484105 32.627838,-86.48406 32.628091,-86.484087 32.628276,-86.484212 32.628414,-86.484245 32.628702,-86.484322 32.628807,-86.484469 32.628862,-86.484686 32.629107,-86.484705 32.629348,-86.484592 32.629668)\r\n2230;2298;even;State Rte 14;Autauga;AL;36003;LINESTRING(-86.63525 32.437171,-86.63629 32.437154,-86.638504 32.437123,-86.63867 32.437116,-86.639184 32.437107,-86.640235 32.43709)\r\n2231;2239;odd;State Rte 14;Autauga;AL;36003;LINESTRING(-86.635246 32.437006,-86.636286 32.43699,-86.638498 32.436955,-86.638664 32.436948,-86.63918 32.436943,-86.640231 32.436925)\r\n901;999;all;Muirfield Dr;Autauga;AL;36067;LINESTRING(-86.499902 32.454868,-86.499971 32.454903)\r\n1622;1624;all;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.651228 32.524211,-86.651731 32.524218)\r\n3089;3099;all;State Rte 143;Autauga;AL;36051;LINESTRING(-86.475878 32.706029,-86.476648 32.707169,-86.47689 32.707539)\r\n199;109;odd;Kingston Pl;Autauga;AL;36067;LINESTRING(-86.481409 32.478064,-86.481468 32.478064,-86.481798 32.47807,-86.482226 32.478089,-86.482495 32.478092,-86.48277 32.478071,-86.482969 32.478027,-86.48307 32.477957,-86.48315 32.477855,-86.483145 32.477744,-86.483112 32.477657,-86.482929 32.477248,-86.482856 32.477112,-86.482781 32.47697,-86.48276 32.476956)\r\n198;106;even;Kingston Pl;Autauga;AL;36067;LINESTRING(-86.481407 32.477899,-86.481468 32.477898,-86.481804 32.477902,-86.482232 32.477921,-86.482485 32.47792,-86.482728 32.477895,-86.482863 32.477855,-86.482902 32.477831,-86.482922 32.477797,-86.482931 32.477766,-86.482918 32.477709,-86.482743 32.477312,-86.482676 32.477182,-86.482601 32.477062,-86.482602 32.477052)\r\n1299;1215;odd;Yorkshire Dr;Autauga;AL;36067;LINESTRING(-86.472432 32.49642,-86.472523 32.496366,-86.472639 32.496257)\r\n1298;1222;even;Yorkshire Dr;Autauga;AL;36067;LINESTRING(-86.472311 32.496292,-86.472383 32.496236,-86.472499 32.496143)\r\n300;306;even;Wetumpka St;Autauga;AL;36067;LINESTRING(-86.467107 32.463653,-86.466839 32.463677,-86.466629 32.463694)\r\n301;323;odd;Wetumpka St;Autauga;AL;36067;LINESTRING(-86.467129 32.463816,-86.466859 32.463843,-86.466646 32.463858)\r\n117;101;odd;Mountain Laurel Rd;Autauga;AL;36066;LINESTRING(-86.459191 32.561702,-86.459248 32.561702,-86.460852 32.561705,-86.46093 32.561709,-86.461617 32.561789,-86.461722 32.561794,-86.461852 32.561769,-86.461876 32.561762)\r\n114;100;even;Mountain Laurel Rd;Autauga;AL;36066;LINESTRING(-86.459189 32.561537,-86.459246 32.561536,-86.46086 32.561533,-86.460952 32.561541,-86.461635 32.561617,-86.461706 32.561618,-86.46181 32.561605,-86.461829 32.561603)\r\n101;199;odd;Medical Center Dr;Autauga;AL;36066;LINESTRING(-86.424686 32.482357,-86.424731 32.479416,-86.42518 32.479414)\r\n298;100;even;Medical Center Dr;Autauga;AL;36066;LINESTRING(-86.424492 32.482355,-86.424537 32.47925,-86.42518 32.47925)\r\n2856;2898;even;State Rte 14;Autauga;AL;36003;LINESTRING(-86.673986 32.430074,-86.674153 32.43017,-86.674425 32.430341,-86.674684 32.430529,-86.674928 32.430726,-86.675407 32.431139,-86.675762 32.431455,-86.67916 32.434434,-86.679209 32.434472)\r\n2857;2899;odd;State Rte 14;Autauga;AL;36003;LINESTRING(-86.674092 32.429937,-86.674267 32.43003,-86.674551 32.430209,-86.674818 32.430403,-86.675068 32.430608,-86.675547 32.431025,-86.675902 32.431341,-86.6793 32.434316,-86.679344 32.434354)\r\n312;328;even;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.473834 32.539645,-86.475483 32.540506,-86.476479 32.541019,-86.476563 32.541056)\r\n315;317;odd;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.473936 32.539505,-86.475585 32.540366,-86.476579 32.540873,-86.476658 32.540912)\r\n1811;1807;odd;Briarwood St;Autauga;AL;36066;LINESTRING(-86.419712 32.464243,-86.420237 32.464245,-86.420493 32.464246,-86.420571 32.464241)\r\n1814;1808;even;Briarwood St;Autauga;AL;36066;LINESTRING(-86.419713 32.464078,-86.420237 32.464081,-86.420489 32.464078,-86.420563 32.464077)\r\n340;368;all;Autauga County 165;Autauga;AL;36003;LINESTRING(-86.648177 32.447768,-86.648163 32.4478)\r\n1001;1041;all;Abe Ct;Autauga;AL;36067;LINESTRING(-86.468899 32.43093,-86.468909 32.430821,-86.468966 32.430536,-86.468979 32.4304,-86.468974 32.430251,-86.468987 32.430097,-86.468995 32.430039)\r\n3210;3290;even;Autauga County 78;Autauga;AL;36003;LINESTRING(-86.713281 32.436103,-86.713871 32.4361,-86.714731 32.436083,-86.71645 32.436068,-86.71688 32.436071,-86.717659 32.43607,-86.717843 32.436067,-86.718032 32.436035,-86.718213 32.435969,-86.718432 32.435813,-86.718537 32.435675,-86.718577 32.435601,-86.718739 32.435264,-86.718876 32.435001,-86.719029 32.434745,-86.719206 32.434502,-86.719306 32.434394,-86.719422 32.434293,-86.719544 32.434204,-86.719676 32.434123,-86.719816 32.434049,-86.720183 32.433874,-86.720561 32.433702,-86.721318 32.433347,-86.721914 32.433059,-86.72206 32.433003,-86.722205 32.432967,-86.722357 32.432953,-86.722519 32.432951,-86.723385 32.432982,-86.723553 32.432997,-86.723719 32.433018,-86.723881 32.433046,-86.72418 32.433108,-86.724864 32.433257,-86.725279 32.433342,-86.726112 32.43352,-86.726263 32.433564,-86.726546 32.433691,-86.726664 32.433773,-86.726958 32.434035,-86.727143 32.434196,-86.727281 32.434293,-86.727562 32.434472,-86.727711 32.434558,-86.727869 32.434631,-86.728034 32.434695,-86.728205 32.434746,-86.728544 32.434826,-86.728722 32.43486,-86.728901 32.434879,-86.729086 32.434883,-86.72927 32.434867,-86.729448 32.434836,-86.729621 32.434793,-86.729959 32.4347,-86.730427 32.434528,-86.730652 32.43447,-86.730884 32.434443,-86.73104 32.434452,-86.731201 32.43447,-86.731355 32.434501,-86.731499 32.434547,-86.731643 32.43461,-86.731786 32.434683,-86.731926 32.43476,-86.732062 32.43484,-86.732867 32.43537,-86.733266 32.435653,-86.733346 32.435698)\r\n53201;53299;odd;Autauga County 78;Autauga;AL;36003;LINESTRING(-86.713279 32.435939,-86.713867 32.435934,-86.714727 32.435917,-86.71645 32.435904,-86.71688 32.435907,-86.717653 32.435902,-86.717817 32.435891,-86.717966 32.435863,-86.718097 32.435811,-86.71827 32.435689,-86.718357 32.435587,-86.718393 32.435531,-86.718557 32.435198,-86.718696 32.434929,-86.718851 32.434663,-86.719036 32.434402,-86.719154 32.43428,-86.719282 32.434167,-86.71942 32.434068,-86.719566 32.433983,-86.719714 32.433905,-86.720089 32.433728,-86.720467 32.433556,-86.721222 32.433203,-86.72182 32.432911,-86.721982 32.432835,-86.722167 32.432791,-86.722349 32.432781,-86.722523 32.432783,-86.723399 32.432814,-86.723579 32.432829,-86.723755 32.432852,-86.723925 32.432882,-86.724228 32.432948,-86.724912 32.433097,-86.725325 32.433182,-86.726164 32.433358,-86.726343 32.433398,-86.72667 32.433541,-86.726806 32.433651,-86.7271 32.433919,-86.727281 32.43407,-86.727405 32.434161,-86.727678 32.434334,-86.727817 32.434412,-86.727959 32.434479,-86.72811 32.434537,-86.728265 32.434584,-86.728592 32.434662,-86.728756 32.43469,-86.728917 32.434707,-86.729078 32.434713,-86.729238 32.434697,-86.7294 32.43467,-86.729563 32.434633,-86.729887 32.43454,-86.730355 32.434368,-86.730608 32.434294,-86.73088 32.434275,-86.731058 32.434284,-86.731235 32.4343,-86.731415 32.434331,-86.731587 32.434389,-86.731741 32.434466,-86.73189 32.434541,-86.732036 32.43462,-86.73218 32.434704,-86.732991 32.43524,-86.73339 32.435519,-86.73346 32.435565)\r\n699;623;odd;Shadow Ln;Autauga;AL;36066;LINESTRING(-86.447882 32.474377,-86.447888 32.47435,-86.447904 32.474215,-86.44795 32.474007,-86.448108 32.473593)\r\n698;626;even;Shadow Ln;Autauga;AL;36066;LINESTRING(-86.447688 32.474377,-86.447682 32.47434,-86.447706 32.474191,-86.447748 32.473963,-86.447924 32.473541)\r\n205;207;all;Simmons Rd;Autauga;AL;36067;LINESTRING(-86.525647 32.441318,-86.525651 32.441378)\r\n4299;4213;odd;Autauga County 88;Autauga;AL;36749;LINESTRING(-86.866428 32.535604,-86.866257 32.535538,-86.866049 32.535468,-86.86578 32.535373,-86.86499 32.535083,-86.86482 32.535031,-86.864708 32.535004,-86.864514 32.534952,-86.864182 32.534884,-86.863922 32.534846,-86.863495 32.534815,-86.863234 32.534801,-86.862972 32.534798,-86.86263 32.534806,-86.862381 32.534795,-86.862222 32.534778,-86.862065 32.534749,-86.861908 32.534708,-86.861431 32.534554,-86.861392 32.534544)\r\n4216;4180;even;Autauga County 88;Autauga;AL;36749;LINESTRING(-86.866348 32.535755,-86.866179 32.535692,-86.865975 32.53562,-86.865704 32.535525,-86.864916 32.535241,-86.864756 32.535191,-86.864652 32.535162,-86.864462 32.535116,-86.864142 32.53505,-86.863896 32.535016,-86.863479 32.534981,-86.863226 32.534969,-86.862972 32.534964,-86.86263 32.534972,-86.862365 32.534967,-86.862188 32.534948,-86.862013 32.534915,-86.861842 32.534868,-86.861363 32.534712,-86.861328 32.5347)\r\n1954;1930;all;Suncrest Dr;Autauga;AL;36067;LINESTRING(-86.524744 32.561776,-86.524731 32.561576,-86.524709 32.561444,-86.524655 32.56124,-86.524441 32.56055,-86.524317 32.560132,-86.524155 32.559638)\r\n600;698;all;S McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.418188 32.460674,-86.418187 32.460582)\r\n109;101;odd;Livingston Ave;Autauga;AL;36066;LINESTRING(-86.451105 32.476452,-86.451182 32.476349,-86.451208 32.476221,-86.451215 32.475975,-86.451201 32.475457)\r\n106;100;even;Livingston Ave;Autauga;AL;36066;LINESTRING(-86.450933 32.476375,-86.450974 32.476287,-86.451 32.476199,-86.451019 32.475973,-86.451006 32.47546)\r\n432;466;even;E 6th St;Autauga;AL;36067;LINESTRING(-86.46292 32.465827,-86.462863 32.465822,-86.462341 32.465784,-86.462311 32.465782)\r\n421;469;odd;E 6th St;Autauga;AL;36067;LINESTRING(-86.462901 32.465991,-86.462845 32.465986,-86.462325 32.465948,-86.462294 32.465946)\r\n1900;1988;even;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.600592 32.651992,-86.600592 32.65201,-86.600612 32.652157,-86.600675 32.652447,-86.600773 32.652804,-86.600892 32.653158,-86.601124 32.653785,-86.60133 32.654332,-86.601499 32.654815,-86.601566 32.655021,-86.601645 32.655296,-86.601728 32.655645,-86.60178 32.655926,-86.602196 32.658909)\r\n1927;1973;odd;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.600787 32.65198,-86.60079 32.651994,-86.60081 32.652131,-86.600871 32.652413,-86.600967 32.652762,-86.601082 32.65311,-86.60131 32.653735,-86.601518 32.654284,-86.601689 32.654769,-86.601756 32.654979,-86.601839 32.65526,-86.601924 32.655615,-86.601976 32.655904,-86.60239 32.65889)\r\n617;601;odd;Castle Brook Dr;Autauga;AL;36066;LINESTRING(-86.412968 32.470349,-86.412967 32.47025,-86.412962 32.469719,-86.41296 32.469317,-86.412961 32.468879,-86.412945 32.468471)\r\n620;600;even;Castle Brook Dr;Autauga;AL;36066;LINESTRING(-86.412774 32.470352,-86.412771 32.470252,-86.412768 32.469721,-86.412764 32.469317,-86.412763 32.468881,-86.412751 32.468476)\r\n917;909;odd;Wilberforce Ave;Autauga;AL;36067;LINESTRING(-86.471449 32.481022,-86.471451 32.480925,-86.471449 32.479949)\r\n912;904;even;Wilberforce Ave;Autauga;AL;36067;LINESTRING(-86.471254 32.48102,-86.471255 32.480925,-86.471255 32.479949)\r\n500;598;even;Julia Ct;Autauga;AL;36066;LINESTRING(-86.441928 32.46249,-86.441936 32.462422,-86.441904 32.462263,-86.441838 32.462111,-86.441684 32.461922,-86.441465 32.461692,-86.441422 32.461664)\r\n501;599;odd;Julia Ct;Autauga;AL;36066;LINESTRING(-86.441734 32.462487,-86.441728 32.462436,-86.4417 32.462311,-86.441646 32.462193,-86.44152 32.462024,-86.441313 32.46181,-86.441287 32.461783)\r\n101;199;odd;Meadowbrook Ct;Autauga;AL;36066;LINESTRING(-86.423911 32.468438,-86.423882 32.468375)\r\n100;198;even;Meadowbrook Ct;Autauga;AL;36066;LINESTRING(-86.42373 32.468498,-86.423701 32.468435)\r\n1950;1994;even;Calumet Pkwy;Autauga;AL;36066;LINESTRING(-86.412629 32.49094,-86.412619 32.490993,-86.412651 32.491075,-86.412678 32.491152,-86.412757 32.49129,-86.412844 32.491419,-86.412934 32.49154,-86.414201 32.493501,-86.414422 32.493813,-86.414515 32.49394,-86.414626 32.494063,-86.414759 32.494165,-86.414834 32.494215,-86.414986 32.494296,-86.415073 32.494329,-86.415161 32.494355,-86.415335 32.49439,-86.415568 32.494419)\r\n1951;1977;odd;Calumet Pkwy;Autauga;AL;36066;LINESTRING(-86.412824 32.490941,-86.412833 32.490971,-86.412843 32.491027,-86.41287 32.491088,-86.412937 32.491212,-86.413016 32.491333,-86.413108 32.491454,-86.414373 32.493417,-86.41459 32.493725,-86.414681 32.49384,-86.41478 32.493943,-86.414891 32.494035,-86.41495 32.494073,-86.415084 32.494142,-86.415149 32.494169,-86.415219 32.494189,-86.415375 32.494222,-86.415599 32.494256)\r\n422;498;even;Shiloh Cr;Autauga;AL;36003;LINESTRING(-86.722221 32.485407,-86.72223 32.485415,-86.722489 32.485349,-86.722815 32.485295,-86.722988 32.485246,-86.723156 32.485189,-86.723311 32.485115,-86.723462 32.485039,-86.723606 32.484956,-86.723889 32.484785,-86.724159 32.484603,-86.724689 32.484234,-86.72496 32.484057,-86.725241 32.483883,-86.725532 32.483719,-86.725598 32.483689,-86.725745 32.483641,-86.725893 32.483609,-86.726051 32.48359,-86.72638 32.483565,-86.726626 32.483564,-86.7267 32.483571,-86.726775 32.483586,-86.726931 32.483628,-86.727002 32.483654,-86.727072 32.483685,-86.727201 32.483761,-86.727355 32.483901,-86.727422 32.484009,-86.72747 32.484134,-86.727543 32.48441,-86.727634 32.484833,-86.727679 32.485119,-86.727744 32.485697,-86.727764 32.48629,-86.727792 32.486445,-86.727907 32.486804,-86.728113 32.48737,-86.728262 32.48773,-86.728313 32.487875,-86.728334 32.487959,-86.728363 32.488019,-86.728402 32.48814,-86.728432 32.488281,-86.72844 32.48835,-86.728444 32.488377)\r\n47236001;47236099;odd;Shiloh Cr;Autauga;AL;36003;LINESTRING(-86.722117 32.485268,-86.722142 32.485243,-86.722443 32.485185,-86.722763 32.485127,-86.722918 32.485086,-86.723068 32.485033,-86.723213 32.484969,-86.723354 32.484897,-86.723494 32.484818,-86.723769 32.484651,-86.724035 32.484473,-86.724565 32.484104,-86.724842 32.483923,-86.725127 32.483747,-86.725426 32.483573,-86.72551 32.483533,-86.725681 32.483471,-86.725857 32.483441,-86.726029 32.483422,-86.72637 32.483395,-86.72664 32.48339,-86.726736 32.483405,-86.726827 32.48342,-86.727001 32.483466,-86.727092 32.483498,-86.727174 32.483539,-86.727339 32.483619,-86.727537 32.483795,-86.727618 32.483945,-86.727666 32.484092,-86.727737 32.484378,-86.72783 32.484807,-86.727875 32.485099,-86.727944 32.485687,-86.727968 32.486274,-86.727992 32.486409,-86.728097 32.486758,-86.728301 32.487318,-86.72845 32.487678,-86.728507 32.487831,-86.728532 32.487907,-86.728557 32.487965,-86.7286 32.488102,-86.728634 32.488257,-86.728642 32.488342,-86.728638 32.488378)\r\n800;824;even;Dee Dr;Autauga;AL;36066;LINESTRING(-86.415252 32.45639,-86.4153 32.456265,-86.415325 32.456115,-86.415344 32.455891,-86.415335 32.455702)\r\n801;833;odd;Dee Dr;Autauga;AL;36066;LINESTRING(-86.415065 32.456346,-86.415098 32.456227,-86.415125 32.456095,-86.415146 32.455887,-86.415141 32.455707)\r\n887;883;all;Mallard Ln;Autauga;AL;36051;LINESTRING(-86.586171 32.601023,-86.586151 32.601024,-86.586076 32.601013,-86.585907 32.601003,-86.584794 32.601006,-86.584193 32.600997,-86.583684 32.601,-86.583208 32.601011,-86.583099 32.601017)\r\n700;706;all;Silver Hills Dr;Autauga;AL;36066;LINESTRING(-86.428861 32.459679,-86.428881 32.459225,-86.428881 32.459209)\r\n424;432;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.517955 32.569103,-86.518132 32.569099,-86.519247 32.569093,-86.519572 32.569092,-86.519866 32.569086)\r\n437;441;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.517947 32.568938,-86.518128 32.568931,-86.519245 32.568929,-86.51957 32.568926,-86.519862 32.568921)\r\n100;198;even;Creely Dr;Autauga;AL;36066;LINESTRING(-86.438362 32.473151,-86.438312 32.473156,-86.437731 32.473278,-86.437486 32.473323,-86.437463 32.473328)\r\n101;199;odd;Creely Dr;Autauga;AL;36066;LINESTRING(-86.438397 32.473313,-86.438354 32.473322,-86.437775 32.47344,-86.437524 32.473487,-86.437496 32.47349)\r\n300;398;even;Water St;Autauga;AL;36067;LINESTRING(-86.466271 32.455075,-86.466123 32.455085,-86.466046 32.455082,-86.465706 32.455051,-86.465287 32.455021)\r\n301;399;odd;Water St;Autauga;AL;36067;LINESTRING(-86.46629 32.455239,-86.466131 32.455255,-86.466032 32.455254,-86.465686 32.455217,-86.46527 32.455185)\r\n612;616;even;River Birch Dr;Autauga;AL;36067;LINESTRING(-86.470928 32.570823,-86.470833 32.570836,-86.470722 32.570846,-86.470496 32.570845,-86.470391 32.570837,-86.470289 32.570821,-86.470191 32.5708,-86.470095 32.570773,-86.470001 32.57074,-86.469933 32.570715)\r\n605;611;odd;River Birch Dr;Autauga;AL;36067;LINESTRING(-86.47097 32.570984,-86.470865 32.571008,-86.470732 32.571018,-86.470484 32.571017,-86.470363 32.571005,-86.470245 32.570989,-86.470133 32.570962,-86.470027 32.570933,-86.469917 32.570898,-86.469844 32.570862)\r\n1642;1698;even;Dodgers Dr;Autauga;AL;36067;LINESTRING(-86.41632 32.429584,-86.41614 32.429489,-86.415634 32.429184,-86.415575 32.429139,-86.415402 32.428972,-86.415291 32.428853,-86.415054 32.428629,-86.414933 32.428523,-86.41491 32.428505)\r\n1641;1699;odd;Dodgers Dr;Autauga;AL;36067;LINESTRING(-86.41622 32.429725,-86.41603 32.429631,-86.4155 32.42932,-86.415427 32.429257,-86.41525 32.429078,-86.415139 32.428963,-86.414908 32.428745,-86.414779 32.428637,-86.414757 32.428607)\r\n102;104;all;Asbury Dr;Autauga;AL;36067;LINESTRING(-86.541193 32.469811,-86.541194 32.469763,-86.541176 32.469609,-86.541127 32.469383,-86.541067 32.469228,-86.540925 32.469022,-86.540862 32.468954,-86.54073 32.468846,-86.540658 32.468785,-86.540632 32.468777)\r\n4041;4001;odd;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.839002 32.598055,-86.837136 32.598649,-86.835536 32.599154,-86.833926 32.59967,-86.831889 32.600317)\r\n4040;4000;even;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.839071 32.598209,-86.837204 32.598803,-86.835604 32.599308,-86.833994 32.599824,-86.831958 32.600471)\r\n399;301;odd;Larsen Ln;Autauga;AL;36022;LINESTRING(-86.422968 32.533003,-86.42304 32.531265,-86.423025 32.530706)\r\n398;300;even;Larsen Ln;Autauga;AL;36022;LINESTRING(-86.422774 32.532998,-86.422844 32.531263,-86.42283 32.530709)\r\n799;719;odd;Lower Kingston Rd;Autauga;AL;36067;LINESTRING(-86.487652 32.471145,-86.48697 32.470541)\r\n768;720;even;Lower Kingston Rd;Autauga;AL;36067;LINESTRING(-86.487511 32.471259,-86.486829 32.470655)\r\n299;201;odd;Lilac Dr;Autauga;AL;36067;LINESTRING(-86.462114 32.480807,-86.462118 32.480547,-86.462098 32.480316,-86.462061 32.480229,-86.462005 32.480156,-86.46194 32.480088,-86.461863 32.480034,-86.461778 32.479987,-86.461681 32.479956,-86.461584 32.479937,-86.461408 32.479928,-86.461342 32.479914,-86.461291 32.479893,-86.461252 32.479864,-86.461218 32.479824,-86.461196 32.479772,-86.461166 32.479634,-86.461148 32.479558,-86.461116 32.47948,-86.461077 32.479407,-86.460943 32.479209,-86.460881 32.479142,-86.4608 32.47908,-86.460698 32.479039,-86.460588 32.479024,-86.460483 32.479027,-86.460386 32.479045,-86.459892 32.479184,-86.459874 32.479193)\r\n898;800;even;Lilac Dr;Autauga;AL;36067;LINESTRING(-86.461919 32.480808,-86.461914 32.480555,-86.461886 32.480356,-86.461867 32.480307,-86.461835 32.480258,-86.46179 32.480214,-86.461739 32.480176,-86.461682 32.480147,-86.461619 32.480124,-86.461552 32.480111,-86.461386 32.480098,-86.461282 32.48009,-86.461173 32.480053,-86.461082 32.479986,-86.461026 32.479902,-86.46099 32.479816,-86.460968 32.479666,-86.46095 32.479604,-86.460926 32.479544,-86.460895 32.479487,-86.460771 32.479309,-86.460729 32.479266,-86.46068 32.479234,-86.46063 32.479213,-86.460572 32.4792,-86.460507 32.479203,-86.460438 32.479213,-86.45996 32.479344,-86.459946 32.479346)\r\n1500;1518;even;Windy Meadows Rd;Autauga;AL;36067;LINESTRING(-86.540653 32.514143,-86.540867 32.514046,-86.541242 32.513857,-86.541392 32.513778,-86.542177 32.513325,-86.54254 32.513134,-86.542836 32.512996,-86.543037 32.512913)\r\n1501;1515;odd;Windy Meadows Rd;Autauga;AL;36067;LINESTRING(-86.540559 32.513999,-86.540769 32.5139,-86.54114 32.513715,-86.541284 32.513638,-86.542069 32.513185,-86.542438 32.512988,-86.542744 32.512844,-86.542955 32.512764)\r\n785;847;all;Autauga County 33;Autauga;AL;36067;LINESTRING(-86.708713 32.519165,-86.70835 32.519339,-86.707446 32.519741,-86.70723 32.519831)\r\n800;898;even;Peachtree St;Autauga;AL;36066;LINESTRING(-86.448885 32.459248,-86.448797 32.459125,-86.448048 32.45833,-86.447863 32.458141)\r\n801;899;odd;Peachtree St;Autauga;AL;36066;LINESTRING(-86.448722 32.459337,-86.448631 32.459225,-86.447896 32.458434,-86.447713 32.458246)\r\n899;503;odd;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.513642 32.379482,-86.513525 32.380166,-86.513394 32.380733,-86.513183 32.381516,-86.513138 32.381729,-86.513096 32.381862,-86.513043 32.381994,-86.512875 32.382331,-86.512796 32.382549,-86.512761 32.382701,-86.512753 32.38278,-86.512744 32.38293,-86.512747 32.383081,-86.512764 32.383302,-86.513063 32.385472,-86.513133 32.386053,-86.513196 32.386676)\r\n698;600;even;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.513835 32.379505,-86.513721 32.380194,-86.513586 32.380767,-86.513379 32.381548,-86.513336 32.381767,-86.513288 32.381912,-86.513231 32.382054,-86.513067 32.382389,-86.512994 32.382591,-86.512961 32.382727,-86.512951 32.382794,-86.512942 32.382932,-86.512945 32.383073,-86.512962 32.383286,-86.513257 32.385454,-86.513329 32.386037,-86.51339 32.386662)\r\n3352;3332;all;Motley Dr;Autauga;AL;36003;LINESTRING(-86.749409 32.491805,-86.749312 32.491882,-86.749186 32.491983,-86.748867 32.492211,-86.748759 32.492307,-86.748662 32.492413,-86.748574 32.492532,-86.748497 32.492654,-86.748428 32.492782,-86.748343 32.492982,-86.748297 32.49312,-86.748279 32.493193,-86.748234 32.493339,-86.748182 32.493489,-86.748131 32.493581)\r\n499;423;all;Sheila Blvd;Autauga;AL;36066;LINESTRING(-86.426099 32.452446,-86.426102 32.451718,-86.426105 32.45138,-86.426107 32.451248)\r\n600;642;all;Autauga County 33;Autauga;AL;36067;LINESTRING(-86.727973 32.503177,-86.727713 32.503251,-86.726905 32.50352,-86.726743 32.503578,-86.72636 32.503752,-86.726137 32.503864,-86.725918 32.503984,-86.725569 32.504201,-86.724958 32.5046,-86.724426 32.504965,-86.724031 32.50525,-86.723995 32.505279)\r\n2038;2098;even;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.504773 32.572547,-86.504772 32.572562,-86.504767 32.572993,-86.504761 32.573137,-86.504702 32.574003,-86.504619 32.575304,-86.504602 32.575738,-86.504608 32.576172,-86.504625 32.576462,-86.504671 32.576895,-86.504849 32.578256,-86.504872 32.578469,-86.504896 32.578898,-86.504896 32.579183,-86.504884 32.579468,-86.504857 32.579754,-86.504832 32.579952)\r\n2005;2099;odd;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.504967 32.57254,-86.50497 32.57256,-86.504963 32.572997,-86.504957 32.573145,-86.504896 32.574013,-86.504815 32.575312,-86.504798 32.57574,-86.504806 32.576166,-86.504823 32.57645,-86.504867 32.576879,-86.505045 32.57824,-86.50507 32.578457,-86.505096 32.578894,-86.505094 32.579187,-86.505082 32.579478,-86.505055 32.57977,-86.505025 32.579971)\r\n1262;1256;all;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.418162 32.507972,-86.418152 32.507821,-86.418154 32.507754,-86.418148 32.507199)\r\n299;201;odd;Edgewood Ave;Autauga;AL;36066;LINESTRING(-86.450372 32.474382,-86.449921 32.474397,-86.44813 32.474417,-86.447965 32.474414,-86.447928 32.474415)\r\n698;600;even;Edgewood Ave;Autauga;AL;36066;LINESTRING(-86.45038 32.474546,-86.449927 32.474563,-86.448128 32.474583,-86.447965 32.474578,-86.447933 32.474579)\r\n2401;2433;all;State Rte 143;Autauga;AL;36022;LINESTRING(-86.414621 32.636373,-86.414821 32.636449,-86.414898 32.636486,-86.415122 32.636602,-86.415403 32.636773,-86.415541 32.636868,-86.415734 32.637014,-86.415919 32.63717,-86.416094 32.63733,-86.416652 32.637878,-86.416872 32.638102,-86.41708 32.638336,-86.417128 32.638399)\r\n1900;1998;even;Barrett Hill Ln;Autauga;AL;36067;LINESTRING(-86.646432 32.604261,-86.646411 32.60439,-86.64638 32.604522,-86.646272 32.604814,-86.646248 32.604917,-86.646249 32.605037,-86.646256 32.605447,-86.646325 32.606472,-86.646327 32.607187,-86.64634 32.608119)\r\n1901;1999;odd;Barrett Hill Ln;Autauga;AL;36067;LINESTRING(-86.646626 32.604282,-86.646609 32.604414,-86.646582 32.604564,-86.646472 32.604856,-86.646456 32.604937,-86.646445 32.605039,-86.646454 32.605441,-86.646525 32.606468,-86.646523 32.607187,-86.646535 32.608117)\r\n826;832;even;Dee Dr;Autauga;AL;36066;LINESTRING(-86.415317 32.455451,-86.415313 32.45537,-86.415263 32.45515,-86.415211 32.455005,-86.415168 32.454908)\r\n835;841;odd;Dee Dr;Autauga;AL;36066;LINESTRING(-86.415123 32.455465,-86.415111 32.455394,-86.415065 32.45519,-86.415021 32.455057,-86.414985 32.454963)\r\n430;486;even;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.897576 32.527227,-86.897547 32.527608,-86.897447 32.528545,-86.897109 32.531428,-86.89703 32.532153,-86.8967 32.534983)\r\n429;487;odd;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.89777 32.527237,-86.897743 32.52762,-86.897641 32.528561,-86.897303 32.531444,-86.897224 32.532169,-86.896894 32.534999)\r\n599;509;odd;Sandstone Trl;Autauga;AL;36066;LINESTRING(-86.427423 32.470003,-86.427722 32.470004,-86.428067 32.469996,-86.428238 32.47,-86.428517 32.469991,-86.428784 32.469876,-86.428985 32.469693,-86.429101 32.469465,-86.429105 32.469295,-86.429068 32.469062,-86.429037 32.468983,-86.428995 32.468887)\r\n598;512;even;Sandstone Trl;Autauga;AL;36066;LINESTRING(-86.427423 32.469839,-86.42772 32.469838,-86.428065 32.46983,-86.428232 32.46983,-86.428455 32.469805,-86.428648 32.469724,-86.428797 32.469589,-86.428883 32.469419,-86.428905 32.469301,-86.428866 32.4691,-86.428847 32.469035,-86.428811 32.468941)\r\n3094;3098;even;Go Cart Rd;Autauga;AL;36051;LINESTRING(-86.520009 32.702933,-86.520098 32.702854,-86.520307 32.70263,-86.520528 32.702401,-86.520713 32.702172,-86.520498 32.701284,-86.520453 32.701082,-86.52034 32.700898,-86.520195 32.700726,-86.520002 32.700616,-86.519494 32.70039)\r\n3095;3099;odd;Go Cart Rd;Autauga;AL;36051;LINESTRING(-86.519865 32.702822,-86.519946 32.702744,-86.520155 32.702528,-86.520366 32.702299,-86.520501 32.702136,-86.520306 32.70132,-86.520249 32.701144,-86.52016 32.700992,-86.520039 32.70086,-86.519892 32.700764,-86.519401 32.700535)\r\n436;414;all;Cargill St;Autauga;AL;36067;LINESTRING(-86.488619 32.476866,-86.48859 32.476862,-86.488561 32.476848)\r\n3108;3128;even;Autauga County 57;Autauga;AL;36091;LINESTRING(-86.556043 32.704526,-86.556103 32.704583,-86.556386 32.704867,-86.556627 32.705082,-86.556871 32.705282,-86.556969 32.705336)\r\n3107;3129;odd;Autauga County 57;Autauga;AL;36091;LINESTRING(-86.556185 32.704413,-86.556253 32.704471,-86.556536 32.704755,-86.556769 32.704962,-86.557005 32.705148,-86.557085 32.705204)\r\n1100;1110;all;Parkview Dr;Autauga;AL;36067;LINESTRING(-86.476151 32.494764,-86.47614 32.494771,-86.476154 32.494803,-86.476169 32.495015,-86.476161 32.495379,-86.47616 32.495602,-86.476174 32.49573,-86.476216 32.49585,-86.476399 32.496029,-86.476522 32.496118)\r\n1100;1198;even;Geneva St;Autauga;AL;36066;LINESTRING(-86.442562 32.457618,-86.442508 32.457526,-86.442449 32.4574,-86.442434 32.457344,-86.442412 32.45714,-86.442417 32.457002)\r\n921;1199;odd;Geneva St;Autauga;AL;36066;LINESTRING(-86.442391 32.457697,-86.442324 32.4576,-86.442251 32.457456,-86.442224 32.457372,-86.442216 32.457142,-86.442223 32.456996)\r\n200;206;even;Camellia Dr;Autauga;AL;36067;LINESTRING(-86.455453 32.473751,-86.456157 32.47405)\r\n201;209;odd;Camellia Dr;Autauga;AL;36067;LINESTRING(-86.45554 32.473604,-86.456244 32.473903)\r\n4499;4439;odd;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.896828 32.584181,-86.896861 32.584303,-86.896891 32.584378,-86.896982 32.584667,-86.897053 32.584878,-86.897071 32.584951,-86.897122 32.58509,-86.897266 32.585584,-86.897296 32.585724,-86.897325 32.585938,-86.897335 32.586079,-86.897327 32.586438,-86.897279 32.587308,-86.897268 32.587459)\r\n4498;4440;even;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.897017 32.58414,-86.897055 32.584255,-86.897085 32.584328,-86.897172 32.584623,-86.897247 32.584836,-86.897267 32.584909,-86.897314 32.585046,-86.897462 32.585548,-86.897496 32.5857,-86.897525 32.585924,-86.897533 32.586077,-86.897525 32.586444,-86.897475 32.587318,-86.897463 32.587469)\r\n799;701;all;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.628075 32.423261,-86.628103 32.42329)\r\n2513;2505;odd;Stanton;Autauga;AL;36066;LINESTRING(-86.416069 32.444439,-86.41627 32.444452,-86.416406 32.44442,-86.416421 32.444338,-86.416435 32.444284,-86.416447 32.443162,-86.416427 32.44312)\r\n2508;2500;even;Stanton;Autauga;AL;36066;LINESTRING(-86.416073 32.444274,-86.416236 32.444268,-86.416218 32.444266,-86.416221 32.444298,-86.416225 32.444268,-86.416235 32.44318,-86.416237 32.443154)\r\n3098;3298;even;US Hwy 82;Autauga;AL;36006;LINESTRING(-86.708127 32.59717,-86.708262 32.597347,-86.709411 32.59893,-86.709864 32.599543,-86.710083 32.599858,-86.71187 32.602329,-86.71232 32.60294,-86.712709 32.60348,-86.714558 32.606043,-86.716441 32.608637,-86.716911 32.609256,-86.717204 32.609615,-86.717525 32.609955,-86.717696 32.610124,-86.717922 32.610319)\r\n3101;3299;odd;US Hwy 82;Autauga;AL;36006;LINESTRING(-86.70829 32.59708,-86.70843 32.597257,-86.709577 32.598842,-86.710034 32.599457,-86.710251 32.599772,-86.712036 32.602243,-86.712486 32.602854,-86.712875 32.603394,-86.714724 32.605957,-86.716607 32.608549,-86.717075 32.609162,-86.717366 32.609513,-86.717679 32.609849,-86.717844 32.61001,-86.718062 32.610205)\r\n1609;1619;all;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.650011 32.524027,-86.650179 32.524027,-86.650395 32.524034)\r\n1321;1315;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.496785 32.430854,-86.496026 32.430869,-86.493584 32.430916,-86.493175 32.430923)\r\n2036;2096;even;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.464217 32.587596,-86.464224 32.588089,-86.464223 32.591053,-86.464195 32.592431,-86.464189 32.593228,-86.464178 32.59366,-86.464179 32.593803,-86.464185 32.593868,-86.464182 32.597122,-86.464185 32.598403)\r\n2101;2159;odd;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.464411 32.587593,-86.46442 32.588087,-86.464419 32.591055,-86.464391 32.592433,-86.464385 32.59323,-86.464372 32.59366,-86.464379 32.593793,-86.464387 32.59386,-86.464376 32.597122,-86.46438 32.598402)\r\n401;499;all;Riverview Ln;Autauga;AL;36003;LINESTRING(-86.662982 32.387155,-86.662724 32.387017,-86.662378 32.386805,-86.661949 32.386552,-86.661797 32.386469,-86.66163 32.386401,-86.661456 32.386355,-86.661282 32.386314,-86.661023 32.386279,-86.660684 32.386234,-86.659376 32.386045)\r\n814;816;all;Autauga County 42;Autauga;AL;36051;LINESTRING(-86.562304 32.605671,-86.562904 32.605239,-86.562967 32.605197)\r\n100;198;even;Timbermill Ct;Autauga;AL;36066;LINESTRING(-86.417442 32.470292,-86.417471 32.470268,-86.417534 32.470221,-86.417535 32.470209)\r\n199;101;odd;Timbermill Ct;Autauga;AL;36066;LINESTRING(-86.417299 32.470181,-86.417327 32.470152,-86.417376 32.470105,-86.41738 32.470111)\r\n100;106;even;Indian Trl;Autauga;AL;36067;LINESTRING(-86.557734 32.429955,-86.557753 32.429955,-86.557925 32.429937,-86.557988 32.42994,-86.557998 32.429951,-86.55801 32.429956,-86.557999 32.430207,-86.557999 32.430598)\r\n101;137;odd;Indian Trl;Autauga;AL;36067;LINESTRING(-86.557714 32.429792,-86.557729 32.429789,-86.557907 32.429765,-86.558022 32.429756,-86.558176 32.429795,-86.558228 32.429926,-86.558199 32.430213,-86.558193 32.430599)\r\n504;798;all;Seaside Rd;Autauga;AL;36003;LINESTRING(-86.659396 32.492187,-86.659431 32.492296,-86.659499 32.492433,-86.659687 32.492844,-86.659902 32.493245,-86.660149 32.493632,-86.660234 32.49376,-86.660325 32.493889,-86.660426 32.494013,-86.660535 32.49413,-86.660871 32.494459,-86.661081 32.494684,-86.661274 32.494917,-86.661358 32.495037,-86.661513 32.495292,-86.661584 32.495422,-86.661649 32.495553,-86.661827 32.495959,-86.661996 32.496374,-86.662064 32.496518,-86.662214 32.496713,-86.662346 32.496822,-86.662667 32.497063,-86.662783 32.497162,-86.663003 32.497375,-86.663104 32.497485,-86.663287 32.49772,-86.663364 32.497842,-86.663505 32.498108,-86.663584 32.498246,-86.663698 32.498366,-86.663801 32.498486,-86.663926 32.498596,-86.664174 32.498795,-86.664287 32.498897,-86.664393 32.499005,-86.664595 32.499235,-86.664837 32.499539,-86.665048 32.499773,-86.665383 32.500115)\r\n2101;2199;all;Big Springs Church Rd;Autauga;AL;36006;LINESTRING(-86.708962 32.631966,-86.709705 32.632347,-86.709849 32.632406,-86.709917 32.632426,-86.710067 32.632455,-86.710226 32.632471,-86.710908 32.632497,-86.711076 32.632498,-86.71193 32.632482,-86.71228 32.632484,-86.712716 32.632502,-86.712893 32.632498)\r\n2599;2501;all;Autauga County 38;Autauga;AL;36067;LINESTRING(-86.73083 32.523122,-86.730763 32.523143,-86.730617 32.523183,-86.730462 32.523213,-86.730134 32.523257,-86.728864 32.523366,-86.728184 32.523411,-86.72733 32.523454,-86.725967 32.523528,-86.724854 32.523554,-86.724675 32.523573,-86.724583 32.523588,-86.724491 32.523609,-86.724311 32.523666,-86.724203 32.523733,-86.723706 32.524049,-86.723687 32.524061)\r\n2698;2600;all;Autauga County 66;Autauga;AL;36067;LINESTRING(-86.548856 32.601161,-86.548665 32.601159,-86.543486 32.601262,-86.541784 32.601282,-86.540754 32.6013,-86.540322 32.601302,-86.540029 32.601292)\r\n1798;1898;even;Autauga County 85;Autauga;AL;36067;LINESTRING(-86.477838 32.533943,-86.477813 32.534158,-86.477793 32.534302,-86.477688 32.535312,-86.477651 32.535597,-86.477627 32.535736,-86.477596 32.535876,-86.477555 32.536011,-86.477502 32.536144,-86.477448 32.536253,-86.477361 32.536391,-86.477274 32.536507,-86.477173 32.53662,-86.477064 32.536725,-86.476946 32.536821,-86.47682 32.536909,-86.476686 32.536988,-86.476544 32.537062,-86.476397 32.537126,-86.476088 32.537235,-86.474238 32.537795,-86.472227 32.538394,-86.472054 32.538444)\r\n1735;1799;odd;Autauga County 85;Autauga;AL;36067;LINESTRING(-86.478032 32.533959,-86.478009 32.534176,-86.477989 32.53432,-86.477884 32.535328,-86.477849 32.535619,-86.477823 32.535764,-86.477792 32.535912,-86.477749 32.536059,-86.47769 32.536204,-86.477632 32.536327,-86.477537 32.536479,-86.477438 32.536605,-86.477329 32.536728,-86.47721 32.536843,-86.47708 32.536949,-86.476942 32.537045,-86.476796 32.53713,-86.476644 32.53721,-86.476483 32.537282,-86.476158 32.537391,-86.474304 32.537951,-86.472291 32.538552,-86.472115 32.5386)\r\n999;901;odd;Newton St;Autauga;AL;36066;LINESTRING(-86.447711 32.462881,-86.448952 32.462574,-86.449192 32.462526,-86.449431 32.462502,-86.450024 32.462491,-86.450191 32.462482,-86.450351 32.462486,-86.450434 32.462493,-86.450555 32.462494)\r\n998;900;even;Newton St;Autauga;AL;36066;LINESTRING(-86.447657 32.462723,-86.4489 32.462414,-86.449154 32.462352,-86.449419 32.462332,-86.450016 32.462323,-86.450187 32.462314,-86.450363 32.462314,-86.45045 32.462323,-86.450563 32.46233)\r\n3050;3098;all;Autauga County 535;Autauga;AL;36051;LINESTRING(-86.46501 32.705827,-86.464868 32.70602,-86.464655 32.706332,-86.464428 32.706635,-86.464144 32.706996,-86.463746 32.707555,-86.463578 32.707781)\r\n100;118;even;Lina Dr;Autauga;AL;36067;LINESTRING(-86.455347 32.449331,-86.455353 32.449331,-86.455468 32.449204,-86.455607 32.448981,-86.455407 32.448776,-86.455329 32.448734,-86.454789 32.448392)\r\n101;117;odd;Lina Dr;Autauga;AL;36067;LINESTRING(-86.455205 32.449219,-86.455199 32.449219,-86.455308 32.449104,-86.455447 32.448995,-86.455277 32.448912,-86.455213 32.44887,-86.454672 32.448523)\r\n201;299;all;Gin Shop Hill Rd;Autauga;AL;36067;LINESTRING(-86.481795 32.463366,-86.481806 32.463237,-86.481815 32.463099,-86.481798 32.462967,-86.481762 32.462835,-86.481736 32.462775,-86.481701 32.462718,-86.481608 32.462606,-86.481499 32.462508,-86.481238 32.462328,-86.480963 32.462152,-86.480693 32.461967,-86.480559 32.461866,-86.480439 32.461754,-86.480381 32.461691,-86.480282 32.461564,-86.480198 32.461429,-86.480132 32.461286,-86.480079 32.461138,-86.480048 32.460986,-86.480039 32.460834,-86.480041 32.460755,-86.480049 32.460604,-86.480076 32.460478)\r\n3560;3598;all;State Rte 14;Autauga;AL;36003;LINESTRING(-86.788244 32.458755,-86.788589 32.458774,-86.788927 32.458801,-86.789265 32.45884,-86.789601 32.458891,-86.789932 32.458954,-86.790431 32.459067,-86.790755 32.459153,-86.791079 32.459249,-86.791235 32.4593,-86.791865 32.459528,-86.793753 32.460249)\r\n3324;3398;even;Autauga County 98;Autauga;AL;36006;LINESTRING(-86.732882 32.643419,-86.733688 32.643386,-86.733847 32.64339,-86.734003 32.643407,-86.734161 32.643436,-86.734569 32.643536,-86.734899 32.643625,-86.735071 32.643659,-86.735416 32.643716,-86.735594 32.64374,-86.735858 32.643754,-86.736192 32.643764,-86.736441 32.643783,-86.736615 32.643785,-86.736711 32.643782,-86.736807 32.643768,-86.736902 32.643742,-86.736993 32.643708,-86.737144 32.643626,-86.737525 32.643453,-86.737676 32.643379,-86.737751 32.643333,-86.737822 32.643285,-86.737892 32.643234,-86.737958 32.643176,-86.738019 32.643113,-86.738309 32.642746,-86.738413 32.642639,-86.738527 32.642543,-86.738654 32.642459,-86.73879 32.642387,-86.73886 32.642359,-86.739013 32.642309,-86.73917 32.642269,-86.7395 32.642203,-86.739666 32.642157,-86.739749 32.642126,-86.740051 32.641993,-86.740201 32.641936,-86.741228 32.641607,-86.7413 32.641589,-86.741371 32.641574,-86.741439 32.641566,-86.741497 32.641574,-86.741551 32.641589,-86.741599 32.641615,-86.741642 32.641653,-86.741771 32.641839,-86.741826 32.641903,-86.741883 32.641968,-86.741955 32.642023,-86.74211 32.642112,-86.7422 32.642146,-86.742371 32.642194,-86.742701 32.642271,-86.742776 32.642292,-86.742846 32.642319,-86.74291 32.642349,-86.742971 32.642386,-86.743027 32.642429,-86.7432 32.642585,-86.743263 32.642641,-86.743336 32.642693,-86.743415 32.64274,-86.743574 32.642814,-86.744045 32.642995,-86.744341 32.643134,-86.744705 32.643321,-86.744938 32.643427,-86.745317 32.643583,-86.745632 32.643701,-86.746611 32.644005,-86.747107 32.64414,-86.747769 32.644302,-86.748271 32.644418,-86.748862 32.644529,-86.749283 32.6446,-86.749459 32.644616,-86.749638 32.644616,-86.749734 32.644608,-86.749827 32.644592,-86.750086 32.644531,-86.750254 32.64448,-86.750416 32.644418,-86.750647 32.644315,-86.75109 32.644095,-86.751308 32.643979,-86.751593 32.643811,-86.751732 32.643722,-86.751866 32.643623,-86.751931 32.643566,-86.751992 32.643504,-86.752047 32.643435,-86.752088 32.643359,-86.752118 32.643283,-86.752145 32.643205,-86.752175 32.643051,-86.752308 32.641893,-86.752374 32.641466,-86.752521 32.640609,-86.752605 32.64019,-86.75264 32.639997,-86.752664 32.639887)\r\n3335;3435;odd;Autauga County 98;Autauga;AL;36006;LINESTRING(-86.732872 32.643255,-86.733684 32.643218,-86.733861 32.643218,-86.734039 32.643235,-86.734213 32.643274,-86.734627 32.643376,-86.734953 32.643461,-86.735113 32.643495,-86.73545 32.64355,-86.735616 32.64357,-86.735868 32.643586,-86.736204 32.643596,-86.736451 32.643613,-86.736611 32.643617,-86.736685 32.64361,-86.736757 32.643598,-86.736828 32.64358,-86.736895 32.643554,-86.737044 32.643478,-86.737427 32.643307,-86.737566 32.643235,-86.737631 32.643197,-86.737694 32.643155,-86.737752 32.64311,-86.737806 32.643062,-86.737855 32.643011,-86.738145 32.642644,-86.738261 32.642523,-86.738391 32.642415,-86.738534 32.642315,-86.738694 32.642235,-86.738782 32.642201,-86.738949 32.642149,-86.739118 32.642105,-86.739444 32.642039,-86.739594 32.641997,-86.739663 32.641972,-86.739963 32.641841,-86.740125 32.64178,-86.741162 32.641449,-86.741246 32.641423,-86.741333 32.641408,-86.741427 32.641394,-86.741535 32.641392,-86.741645 32.641421,-86.741743 32.641475,-86.741816 32.641549,-86.741943 32.641747,-86.741986 32.641801,-86.742035 32.641846,-86.742085 32.641885,-86.742214 32.641958,-86.742278 32.641986,-86.742431 32.642032,-86.742761 32.642109,-86.742846 32.642134,-86.742936 32.642161,-86.743022 32.642203,-86.743099 32.642252,-86.743171 32.642305,-86.743344 32.642469,-86.743401 32.642515,-86.74346 32.642557,-86.743523 32.642594,-86.743666 32.642662,-86.744137 32.642843,-86.744441 32.64299,-86.744805 32.643175,-86.745028 32.643277,-86.745401 32.643431,-86.745708 32.643543,-86.746677 32.643847,-86.747165 32.64398,-86.747823 32.644142,-86.748319 32.644254,-86.748902 32.644365,-86.749313 32.64443,-86.749469 32.644444,-86.749628 32.644444,-86.749704 32.644438,-86.749781 32.644426,-86.750024 32.644369,-86.750178 32.644322,-86.750328 32.644266,-86.750551 32.644167,-86.750986 32.643953,-86.751198 32.643839,-86.751475 32.643675,-86.751604 32.64359,-86.751726 32.643499,-86.751779 32.643452,-86.751826 32.643402,-86.751865 32.643349,-86.751898 32.643293,-86.751926 32.643231,-86.751945 32.643167,-86.751975 32.643029,-86.752112 32.641873,-86.75218 32.641444,-86.752325 32.640583,-86.752411 32.640164,-86.752444 32.639969,-86.752473 32.639855)\r\n200;298;even;N Taylor St;Autauga;AL;36003;LINESTRING(-86.657711 32.432447,-86.658832 32.433862,-86.658893 32.433937)\r\n209;219;odd;N Taylor St;Autauga;AL;36003;LINESTRING(-86.657873 32.432356,-86.658994 32.43377,-86.659053 32.433844)\r\n2430;2438;even;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.433448 32.584343,-86.433514 32.584438,-86.433804 32.584878,-86.433944 32.585131,-86.434104 32.585528,-86.434207 32.586011,-86.434219 32.586212)\r\n2439;2445;odd;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.433616 32.58426,-86.433684 32.584356,-86.433982 32.5848,-86.434134 32.585065,-86.434306 32.585484,-86.434415 32.585993,-86.434414 32.586209)\r\n400;498;even;Danny Lyn Ct;Autauga;AL;36067;LINESTRING(-86.486468 32.470038,-86.486772 32.469791,-86.487206 32.469454,-86.487247 32.469438,-86.48728 32.469441,-86.487328 32.469457,-86.487378 32.46949,-86.487395 32.469497)\r\n401;499;odd;Danny Lyn Ct;Autauga;AL;36067;LINESTRING(-86.486333 32.46992,-86.486636 32.469671,-86.487078 32.469306,-86.487195 32.469248,-86.487338 32.469253,-86.487448 32.469303,-86.48753 32.469366,-86.487546 32.469393)\r\n807;747;odd;Durden Rd;Autauga;AL;36067;LINESTRING(-86.487249 32.490943,-86.487365 32.490774,-86.487718 32.49027,-86.488402 32.489305)\r\n808;800;even;Durden Rd;Autauga;AL;36067;LINESTRING(-86.487081 32.490861,-86.487197 32.49069,-86.48755 32.490186,-86.488235 32.48922)\r\n4064;4046;all;Fig Tree Dr;Autauga;AL;36749;LINESTRING(-86.844436 32.503528,-86.844341 32.503494,-86.844023 32.503368,-86.843815 32.503251)\r\n875;999;odd;Autauga County 140;Autauga;AL;36051;LINESTRING(-86.58949 32.59578,-86.589422 32.595811,-86.589193 32.595902,-86.588951 32.595982,-86.588637 32.596115,-86.588408 32.596227,-86.58826 32.596312,-86.588119 32.596403,-86.587924 32.59655,-86.587679 32.596757,-86.58756 32.596867,-86.587445 32.596982,-86.587348 32.597112,-86.587271 32.597253,-86.587267 32.597279)\r\n876;858;even;Autauga County 140;Autauga;AL;36051;LINESTRING(-86.589598 32.595918,-86.589522 32.595967,-86.589271 32.596056,-86.589035 32.596138,-86.588733 32.596265,-86.588516 32.596371,-86.588378 32.59645,-86.588247 32.596535,-86.588062 32.596674,-86.587823 32.596873,-86.587712 32.596977,-86.587613 32.597084,-86.58753 32.597196,-86.587463 32.597317,-86.587452 32.59733)\r\n299;271;odd;Gardner Rd;Autauga;AL;36067;LINESTRING(-86.473972 32.489121,-86.473833 32.489124,-86.473229 32.489151,-86.472381 32.489181)\r\n298;200;even;Gardner Rd;Autauga;AL;36067;LINESTRING(-86.473978 32.489285,-86.473841 32.48929,-86.473239 32.489317,-86.472389 32.489345)\r\n1899;1817;odd;Jenny Dr;Autauga;AL;36066;LINESTRING(-86.422264 32.446578,-86.422532 32.446572,-86.422864 32.446576,-86.423102 32.446604,-86.423251 32.44664,-86.423316 32.446666,-86.423314 32.446658)\r\n1898;1818;even;Jenny Dr;Autauga;AL;36066;LINESTRING(-86.422258 32.446413,-86.42253 32.446406,-86.422878 32.446402,-86.423146 32.44643,-86.423321 32.446478,-86.423414 32.44651,-86.423417 32.446519)\r\n1600;1698;even;Youngblood;Autauga;AL;36067;LINESTRING(-86.473078 32.539332,-86.473066 32.53939,-86.473066 32.539468,-86.473065 32.539543,-86.473063 32.539618,-86.473064 32.539797,-86.473064 32.539895,-86.473066 32.539942,-86.473068 32.540031,-86.473068 32.540076,-86.473067 32.540126,-86.47307 32.540223,-86.473071 32.540277,-86.473072 32.540333,-86.473072 32.540391,-86.473073 32.540449,-86.473071 32.540567,-86.473074 32.540624,-86.473076 32.540676,-86.473076 32.540726,-86.473074 32.540768,-86.473061 32.540837,-86.473042 32.540867,-86.473039 32.54087,-86.47302 32.540882,-86.472976 32.540893,-86.472916 32.540887,-86.472837 32.540878,-86.472748 32.54087,-86.472662 32.540864,-86.472661 32.540865)\r\n1601;1699;odd;Youngblood;Autauga;AL;36067;LINESTRING(-86.473271 32.539351,-86.473268 32.539404,-86.473262 32.539472,-86.473261 32.539545,-86.473259 32.53962,-86.47326 32.539795,-86.473262 32.539891,-86.473264 32.53994,-86.473262 32.540031,-86.473262 32.540076,-86.473263 32.540124,-86.473264 32.540221,-86.473265 32.540275,-86.473266 32.540331,-86.473268 32.540389,-86.473267 32.540449,-86.473269 32.540565,-86.47327 32.54062,-86.47327 32.540674,-86.473272 32.540724,-86.473274 32.540774,-86.473275 32.540873,-86.47324 32.540977,-86.473153 32.541042,-86.473062 32.541058,-86.47298 32.541059,-86.472894 32.541055,-86.472811 32.541044,-86.47273 32.541036,-86.472642 32.54103,-86.472637 32.541028)\r\n457;449;odd;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.818919 32.425842,-86.818978 32.425977,-86.819051 32.426114,-86.819213 32.426376,-86.819298 32.426506,-86.819484 32.426753,-86.819686 32.426992,-86.819906 32.427222,-86.820139 32.427433,-86.820308 32.427567)\r\n456;448;even;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.8191 32.425782,-86.819162 32.425911,-86.819231 32.42604,-86.819387 32.426296,-86.81947 32.42642,-86.81965 32.426659,-86.819846 32.42689,-86.820058 32.42711,-86.820281 32.427315,-86.820443 32.427448)\r\n455;443;odd;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.494919 32.538672,-86.494761 32.53866,-86.494592 32.538655,-86.494426 32.538657)\r\n452;448;even;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.494904 32.538836,-86.494751 32.538828,-86.494588 32.538823,-86.494426 32.538821)\r\n723;501;odd;Hillcrest Dr;Autauga;AL;36067;LINESTRING(-86.487015 32.487767,-86.48702 32.487523,-86.487029 32.486244)\r\n728;700;even;Hillcrest Dr;Autauga;AL;36067;LINESTRING(-86.486821 32.487764,-86.486824 32.487521,-86.486835 32.486243)\r\n588;602;even;River Birch Dr;Autauga;AL;36067;LINESTRING(-86.473767 32.569972,-86.473737 32.569966,-86.473615 32.569945,-86.473375 32.569936,-86.473248 32.569938,-86.473023 32.569991,-86.472915 32.570033,-86.47281 32.570077,-86.472708 32.570128,-86.472607 32.57018,-86.472505 32.570233,-86.472404 32.570285,-86.472303 32.570334,-86.472286 32.570343)\r\n597;599;odd;River Birch Dr;Autauga;AL;36067;LINESTRING(-86.473727 32.570134,-86.473699 32.57013,-86.473591 32.570117,-86.473377 32.570102,-86.473284 32.570114,-86.473091 32.570157,-86.472999 32.570187,-86.472904 32.570227,-86.472808 32.570272,-86.472709 32.570322,-86.472609 32.570373,-86.472506 32.570429,-86.472397 32.570482,-86.472374 32.57049)\r\n500;548;even;E 6th St;Autauga;AL;36067;LINESTRING(-86.461281 32.465756,-86.460973 32.465768,-86.460519 32.465785,-86.460423 32.465792,-86.460071 32.465805,-86.459947 32.465842,-86.459838 32.465936,-86.459815 32.466046,-86.459822 32.46628,-86.459837 32.466498,-86.459843 32.466734)\r\n481;545;odd;E 6th St;Autauga;AL;36067;LINESTRING(-86.46129 32.465921,-86.460981 32.465932,-86.460531 32.465951,-86.460437 32.465956,-86.460121 32.465987,-86.460075 32.466006,-86.460048 32.466032,-86.460029 32.466068,-86.460022 32.466276,-86.460035 32.466492,-86.460037 32.466731)\r\n1599;1501;odd;Fogarty Rd;Autauga;AL;36067;LINESTRING(-86.532926 32.429974,-86.532852 32.429929,-86.532715 32.429839,-86.532655 32.429793,-86.532537 32.429693,-86.531976 32.429137,-86.531801 32.42897,-86.531737 32.428915,-86.531663 32.428864,-86.531304 32.428655,-86.531222 32.428614,-86.531137 32.42858,-86.530966 32.428527,-86.530791 32.428488,-86.530612 32.428462,-86.530433 32.428448,-86.530251 32.428448,-86.530072 32.428463,-86.529895 32.428485,-86.529718 32.42852,-86.529546 32.428575,-86.529384 32.42864,-86.529226 32.428714,-86.52901 32.428846,-86.528872 32.428939,-86.528294 32.429381,-86.528095 32.429524,-86.527789 32.429779,-86.527664 32.429872,-86.527465 32.430002,-86.527263 32.43012,-86.527183 32.430162,-86.527113 32.430234,-86.527077 32.43032,-86.527064 32.4304,-86.527065 32.430441)\r\n1598;1500;even;Fogarty Rd;Autauga;AL;36067;LINESTRING(-86.532816 32.43011,-86.532734 32.430065,-86.532589 32.429969,-86.532517 32.429919,-86.532389 32.429807,-86.531828 32.429247,-86.531657 32.429088,-86.531601 32.429043,-86.531541 32.429,-86.531196 32.428799,-86.531128 32.428766,-86.531059 32.428738,-86.530906 32.428691,-86.530747 32.428656,-86.530586 32.428632,-86.530423 32.42862,-86.530261 32.42862,-86.530096 32.428631,-86.529935 32.428653,-86.529778 32.428686,-86.529624 32.428733,-86.529476 32.428792,-86.529336 32.42886,-86.52913 32.428982,-86.529002 32.429069,-86.528424 32.429505,-86.528231 32.429648,-86.527925 32.429903,-86.527792 32.430004,-86.527583 32.430138,-86.527379 32.430256,-86.527335 32.430294,-86.527305 32.430328,-86.527281 32.43037,-86.527266 32.430422,-86.527259 32.430453)\r\n1399;1301;odd;Twins Pl;Autauga;AL;36067;LINESTRING(-86.41927 32.431692,-86.419281 32.43111)\r\n1398;1300;even;Twins Pl;Autauga;AL;36067;LINESTRING(-86.419075 32.431689,-86.419086 32.431107)\r\n1360;1302;all;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.643865 32.558811,-86.643684 32.55912,-86.643598 32.559251,-86.643506 32.55938,-86.643406 32.559503,-86.643302 32.559624,-86.643192 32.559744,-86.643071 32.559856,-86.642944 32.559963,-86.64281 32.560062,-86.64267 32.560156,-86.642523 32.560246,-86.642401 32.560301,-86.642367 32.560321,-86.642051 32.560453,-86.641563 32.560613,-86.641055 32.560774)\r\n2800;2848;even;US Hwy 31;Autauga;AL;36051;LINESTRING(-86.490502 32.666935,-86.490679 32.667936,-86.490756 32.668437,-86.490854 32.669229,-86.490921 32.669877,-86.490967 32.670454,-86.491004 32.671247,-86.491017 32.672042,-86.491017 32.672765,-86.491001 32.673561,-86.490975 32.674186)\r\n2759;2847;odd;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.490695 32.666911,-86.490873 32.667912,-86.490952 32.668417,-86.49105 32.669213,-86.491117 32.669865,-86.491165 32.670446,-86.491202 32.671243,-86.491213 32.67204,-86.491213 32.672767,-86.491197 32.673565,-86.49117 32.674192)\r\n1900;2198;even;Autauga County 40;Autauga;AL;36006;LINESTRING(-86.702846 32.524507,-86.703074 32.52459,-86.704969 32.525236,-86.706313 32.52569,-86.706545 32.525774,-86.706695 32.525833,-86.706844 32.525898,-86.70706 32.526006,-86.707268 32.526126,-86.707399 32.526212,-86.707587 32.526352,-86.707706 32.526451,-86.707875 32.526608,-86.70798 32.526718,-86.708126 32.52689,-86.708218 32.527011,-86.7109 32.530814,-86.711081 32.531062,-86.711272 32.531303,-86.711373 32.531426,-86.711479 32.531541,-86.7117 32.531769,-86.71206 32.532084,-86.712788 32.532698,-86.713461 32.533257,-86.713712 32.533461,-86.713981 32.533652,-86.714259 32.533829,-86.714545 32.533995,-86.714769 32.534109,-86.715073 32.534249,-86.718481 32.53576,-86.719172 32.536039,-86.721803 32.537082,-86.722029 32.53718,-86.722325 32.537321,-86.722607 32.537472,-86.722744 32.537554,-86.723013 32.537729,-86.723268 32.537913,-86.724282 32.538685,-86.724482 32.538823,-86.72469 32.53896,-86.725048 32.539166,-86.72527 32.539276,-86.7255 32.539382,-86.726495 32.539808,-86.729695 32.541177,-86.72999 32.541313,-86.730131 32.541388,-86.730337 32.541512,-86.730469 32.541601,-86.730593 32.541694,-86.730769 32.541842,-86.730935 32.542001,-86.731086 32.54217,-86.731224 32.54235,-86.731308 32.542472,-86.731384 32.542598,-86.731488 32.542795,-86.731546 32.542925,-86.731599 32.543061,-86.731666 32.543268,-86.731937 32.544258,-86.732009 32.544471,-86.732075 32.544608,-86.732113 32.54468,-86.732198 32.544811,-86.732299 32.544935,-86.732356 32.544995,-86.732477 32.545106,-86.732609 32.545206,-86.732748 32.5453,-86.732821 32.545345,-86.732898 32.545385,-86.733059 32.545452,-86.733225 32.545508,-86.733399 32.545548,-86.733656 32.54559,-86.734422 32.545682,-86.734847 32.54573,-86.735106 32.545757,-86.735367 32.545772,-86.735542 32.54577,-86.735719 32.545761,-86.735979 32.545729,-86.736233 32.545682,-86.737309 32.545442,-86.737557 32.545396,-86.737634 32.545387,-86.737885 32.54537,-86.738049 32.545372,-86.738211 32.545386,-86.73846 32.545426,-86.738619 32.545462,-86.738693 32.545484,-86.738848 32.545539,-86.738993 32.545602,-86.739132 32.545676,-86.739265 32.545759,-86.739455 32.545897,-86.739571 32.545996,-86.739677 32.546102,-86.739818 32.546275,-86.739937 32.546459,-86.74 32.546586,-86.740074 32.54679,-86.740108 32.546924,-86.740131 32.547062,-86.740144 32.547202,-86.740211 32.549087,-86.740241 32.549295)\r\n1901;2147;odd;Autauga County 40;Autauga;AL;36006;LINESTRING(-86.702922 32.524356,-86.70315 32.524436,-86.705041 32.525082,-86.706389 32.525536,-86.706625 32.525622,-86.706781 32.525683,-86.70694 32.52575,-86.707168 32.525862,-86.707386 32.52599,-86.707527 32.526082,-86.707723 32.526228,-86.707852 32.526333,-86.708025 32.526498,-86.70814 32.526614,-86.708292 32.526796,-86.708386 32.526923,-86.711068 32.530728,-86.711247 32.530972,-86.711434 32.531209,-86.711533 32.531326,-86.711633 32.531437,-86.71185 32.531655,-86.7122 32.531968,-86.712926 32.53258,-86.713597 32.533137,-86.713846 32.533335,-86.714105 32.53352,-86.714375 32.533693,-86.714653 32.533853,-86.714869 32.533963,-86.715167 32.534103,-86.718569 32.53561,-86.719256 32.535889,-86.721891 32.536932,-86.722123 32.537032,-86.722427 32.537177,-86.722719 32.537332,-86.722862 32.53742,-86.723139 32.537597,-86.723398 32.537789,-86.724412 32.538557,-86.724606 32.538693,-86.724808 32.538822,-86.725156 32.539022,-86.725368 32.53913,-86.725592 32.539234,-86.726583 32.539662,-86.729787 32.541029,-86.73009 32.541167,-86.730243 32.541246,-86.730457 32.541378,-86.730597 32.541471,-86.730729 32.54157,-86.730915 32.541726,-86.731093 32.541893,-86.73125 32.542074,-86.731394 32.542262,-86.731482 32.54239,-86.731566 32.542524,-86.731672 32.542731,-86.731734 32.542869,-86.731791 32.543013,-86.731858 32.543228,-86.732131 32.544216,-86.732201 32.544415,-86.732259 32.544542,-86.732293 32.544602,-86.732372 32.544721,-86.732461 32.544833,-86.732508 32.544883,-86.732619 32.544984,-86.732739 32.545078,-86.732868 32.545166,-86.732931 32.545203,-86.732996 32.545235,-86.733141 32.545296,-86.733289 32.545344,-86.733445 32.545382,-86.73369 32.545424,-86.734448 32.545518,-86.734871 32.545566,-86.735124 32.545589,-86.735373 32.545604,-86.735534 32.545602,-86.735697 32.545591,-86.735943 32.545561,-86.736187 32.545518,-86.737263 32.545278,-86.737519 32.54523,-86.73761 32.545217,-86.737879 32.5452,-86.738061 32.545202,-86.738241 32.545216,-86.738506 32.54526,-86.738679 32.5453,-86.738765 32.545326,-86.738932 32.545383,-86.739095 32.545452,-86.739248 32.545536,-86.739389 32.545627,-86.739593 32.545771,-86.739721 32.54588,-86.739839 32.545998,-86.739992 32.546185,-86.740121 32.546385,-86.740192 32.546528,-86.74027 32.546746,-86.740308 32.546894,-86.740329 32.547044,-86.740342 32.547194,-86.740413 32.549075,-86.740434 32.549278)\r\n547;585;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.450608 32.46057,-86.450604 32.46056,-86.450596 32.460463)\r\n1700;1794;even;Co Rd 163;Autauga;AL;36051;LINESTRING(-86.58762 32.630479,-86.58762 32.630511,-86.587606 32.631608)\r\n1701;1775;odd;Co Rd 163;Autauga;AL;36051;LINESTRING(-86.587814 32.630467,-86.58782 32.630505,-86.587801 32.63161)\r\n3099;101;odd;Mushat Dr;Autauga;AL;36051;LINESTRING(-86.468454 32.699152,-86.468424 32.699292,-86.468266 32.699614,-86.468185 32.699792)\r\n100;3098;even;Mushat Dr;Autauga;AL;36051;LINESTRING(-86.468648 32.699169,-86.46864 32.69934,-86.46845 32.699678,-86.468366 32.699852)\r\n309;311;all;Autauga County 4;Autauga;AL;36067;LINESTRING(-86.468945 32.431141,-86.468916 32.431139)\r\n1398;1300;even;Sheffer Rd;Autauga;AL;36067;LINESTRING(-86.486852 32.476884,-86.486864 32.476826,-86.486874 32.47661,-86.486908 32.476499,-86.486929 32.476473,-86.486969 32.476454,-86.487114 32.476428,-86.487452 32.476415,-86.487729 32.476416)\r\n301;1399;odd;Sheffer Rd;Autauga;AL;36067;LINESTRING(-86.486658 32.476863,-86.486662 32.476812,-86.486668 32.476592,-86.486692 32.476417,-86.486781 32.476325,-86.486897 32.476272,-86.487096 32.476256,-86.48745 32.476249,-86.48773 32.476251)\r\n1750;1744;even;Windermere Ave;Autauga;AL;36066;LINESTRING(-86.428479 32.475617,-86.429672 32.475612,-86.42971 32.47561)\r\n1749;1739;odd;Windermere Ave;Autauga;AL;36066;LINESTRING(-86.428478 32.475452,-86.429668 32.475446,-86.429704 32.475446)\r\n600;680;even;Rice St;Autauga;AL;36067;LINESTRING(-86.464903 32.443852,-86.465082 32.443842,-86.465343 32.44381,-86.465612 32.443782,-86.465783 32.443718,-86.465871 32.443626,-86.465925 32.443536,-86.465961 32.443373,-86.465967 32.443145,-86.465974 32.442123,-86.465972 32.442119)\r\n601;735;odd;Rice St;Autauga;AL;36067;LINESTRING(-86.464888 32.443687,-86.46506 32.443674,-86.465313 32.443646,-86.465548 32.443604,-86.465645 32.443562,-86.465691 32.443524,-86.465719 32.443476,-86.465753 32.443351,-86.465769 32.443141,-86.465776 32.442119,-86.465778 32.442112)\r\n1277;1201;odd;McCullough Rd;Autauga;AL;36749;LINESTRING(-86.864306 32.594838,-86.864222 32.594709,-86.864156 32.594585,-86.86413 32.594522,-86.86411 32.594458,-86.864098 32.594393,-86.864088 32.594331,-86.864101 32.594274,-86.864117 32.594217,-86.864144 32.594158,-86.86418 32.594101,-86.864368 32.593857,-86.864447 32.593721,-86.864553 32.593534,-86.864591 32.59349,-86.86464 32.593447,-86.864707 32.593404,-86.86479 32.593351,-86.864856 32.593269,-86.86489 32.593172,-86.864881 32.593009,-86.864863 32.592647,-86.864873 32.592509,-86.864881 32.592444,-86.864895 32.592381,-86.864915 32.592321,-86.86494 32.592269,-86.864963 32.592223)\r\n1298;1200;even;McCullough Rd;Autauga;AL;36749;LINESTRING(-86.864139 32.594922,-86.86404 32.594789,-86.863966 32.594647,-86.863936 32.594572,-86.863912 32.594494,-86.863894 32.594413,-86.863892 32.594329,-86.863893 32.594244,-86.863919 32.594161,-86.86396 32.594084,-86.864004 32.594013,-86.86419 32.593771,-86.864267 32.593649,-86.864367 32.593446,-86.864431 32.593368,-86.864512 32.593315,-86.864579 32.593272,-86.864626 32.593229,-86.864656 32.593189,-86.864672 32.593144,-86.864683 32.593011,-86.864669 32.592647,-86.864671 32.592497,-86.864681 32.59242,-86.864697 32.592345,-86.864719 32.592269,-86.864752 32.592193,-86.864794 32.592142)\r\n199;101;odd;Fireside Loop;Autauga;AL;36067;LINESTRING(-86.480336 32.452201,-86.480199 32.452097,-86.480103 32.452059,-86.480064 32.45204,-86.480045 32.452028,-86.479985 32.451989,-86.47992 32.451944,-86.479853 32.451889,-86.479683 32.451735,-86.479554 32.451621,-86.479361 32.451444,-86.479307 32.451387,-86.479168 32.451276,-86.479114 32.451254,-86.479066 32.451236,-86.479023 32.451223,-86.478978 32.451221,-86.478918 32.451218,-86.47885 32.451216,-86.478775 32.451212,-86.478702 32.451229,-86.47864 32.45126,-86.478572 32.451289,-86.478513 32.451336,-86.478451 32.45139,-86.478401 32.451459,-86.478376 32.451523,-86.478371 32.451565,-86.478345 32.451635,-86.478361 32.452009,-86.478367 32.452225,-86.47837 32.452237)\r\n100;198;even;Fireside Loop;Autauga;AL;36067;LINESTRING(-86.480213 32.452329,-86.480081 32.452247,-86.480001 32.452207,-86.479954 32.45218,-86.479925 32.452164,-86.479859 32.452119,-86.479794 32.45207,-86.479709 32.452015,-86.479539 32.451849,-86.479412 32.451735,-86.479215 32.451556,-86.479161 32.451509,-86.479042 32.451422,-86.479022 32.451408,-86.478994 32.451398,-86.478977 32.451395,-86.478956 32.451389,-86.478904 32.451384,-86.47885 32.45138,-86.478809 32.45139,-86.478778 32.451397,-86.478736 32.45141,-86.478696 32.451435,-86.478657 32.45146,-86.478621 32.451498,-86.478593 32.451537,-86.478576 32.451571,-86.478563 32.451601,-86.478557 32.451653,-86.478557 32.452005,-86.478565 32.452217,-86.478564 32.452225)\r\n495;491;odd;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.515035 32.389718,-86.516566 32.391594,-86.516756 32.391822)\r\n542;492;even;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.515195 32.389625,-86.516726 32.3915,-86.516915 32.391728)\r\n499;401;odd;Riverview Rd;Autauga;AL;36003;LINESTRING(-86.657471 32.384815,-86.657545 32.384818,-86.657651 32.384821,-86.657798 32.384781,-86.657936 32.384715,-86.658059 32.384589,-86.658111 32.384523,-86.658338 32.384215,-86.658384 32.384165,-86.658489 32.384075,-86.65854 32.384045,-86.658599 32.384025,-86.658664 32.384013,-86.658737 32.384008,-86.658901 32.384017,-86.659191 32.384045)\r\n500;400;even;Riverview Rd;Autauga;AL;36003;LINESTRING(-86.657478 32.384651,-86.657543 32.384652,-86.657611 32.384641,-86.65771 32.384615,-86.657796 32.384569,-86.657899 32.384481,-86.657945 32.384429,-86.658172 32.384123,-86.658222 32.384055,-86.658349 32.383935,-86.658442 32.383885,-86.658541 32.383851,-86.658644 32.383839,-86.658741 32.38384,-86.658919 32.383849,-86.659214 32.383881)\r\n1800;1998;even;Big Springs Church Rd;Autauga;AL;36006;LINESTRING(-86.707966 32.597079,-86.707933 32.597118,-86.707846 32.597219,-86.707705 32.597367,-86.707481 32.597579,-86.706367 32.598663,-86.70554 32.599479,-86.704977 32.600005,-86.703566 32.601361,-86.703006 32.601913,-86.702607 32.602296,-86.702062 32.602861,-86.701751 32.603208,-86.701503 32.603504,-86.700746 32.604376,-86.700497 32.60467,-86.700243 32.60496,-86.699984 32.605247,-86.699079 32.606309,-86.69879 32.606663,-86.698373 32.607205,-86.698149 32.607511,-86.697933 32.60782,-86.697489 32.608427,-86.69726 32.608729,-86.696822 32.609347,-86.696606 32.609666,-86.696352 32.610047,-86.69619 32.61031,-86.69612 32.610449,-86.696054 32.610588,-86.695993 32.610727,-86.695939 32.610868,-86.69589 32.611013,-86.695855 32.61116,-86.695828 32.611306,-86.695791 32.611596,-86.695761 32.611889,-86.69575 32.612184,-86.695748 32.612627,-86.695765 32.613059,-86.69578 32.613204,-86.695801 32.61335,-86.695826 32.613492,-86.695857 32.613637,-86.695942 32.613922,-86.696095 32.614341,-86.696155 32.614479,-86.696222 32.614618,-86.696293 32.614752,-86.696373 32.614885,-86.696875 32.615635,-86.697192 32.616146,-86.697475 32.616672,-86.697666 32.617069,-86.697845 32.617472,-86.697945 32.617744,-86.697987 32.617879,-86.698056 32.618159,-86.698108 32.618437,-86.698143 32.618717,-86.698168 32.619004,-86.698224 32.620088,-86.698248 32.620455,-86.698272 32.620976,-86.698269 32.621093)\r\n1801;1999;odd;Big Springs Church Rd;Autauga;AL;36006;LINESTRING(-86.708128 32.59717,-86.708097 32.597214,-86.708004 32.597321,-86.707857 32.597477,-86.707629 32.597689,-86.706515 32.598771,-86.705688 32.599589,-86.705123 32.600115,-86.703714 32.601469,-86.703154 32.602021,-86.702759 32.602404,-86.702218 32.602965,-86.701911 32.603306,-86.701661 32.6036,-86.700904 32.604474,-86.700655 32.604768,-86.700401 32.60506,-86.700142 32.605347,-86.699239 32.606405,-86.698954 32.606755,-86.698539 32.607295,-86.698317 32.607597,-86.698101 32.607906,-86.697655 32.608515,-86.697428 32.608817,-86.696992 32.609431,-86.696776 32.609748,-86.696526 32.610127,-86.696372 32.610382,-86.696302 32.610513,-86.696238 32.610648,-86.696181 32.610781,-86.696129 32.610916,-86.696086 32.611053,-86.696051 32.61119,-86.696026 32.611328,-86.695987 32.611612,-86.695961 32.611899,-86.695948 32.612188,-86.695946 32.612625,-86.695965 32.613049,-86.695978 32.613188,-86.695997 32.613328,-86.696022 32.613464,-86.696053 32.613601,-86.696134 32.613876,-86.696285 32.614287,-86.696341 32.614419,-86.696404 32.614552,-86.696473 32.61468,-86.696549 32.614805,-86.697049 32.615555,-86.697372 32.616072,-86.697657 32.616606,-86.69785 32.617009,-86.698035 32.617416,-86.698137 32.617698,-86.698181 32.617841,-86.698252 32.618129,-86.698306 32.618415,-86.698341 32.618703,-86.698366 32.618994,-86.69842 32.62008,-86.698444 32.620447,-86.698468 32.620974,-86.698464 32.621097)\r\n1216;1234;even;Autauga County 103;Autauga;AL;36749;LINESTRING(-86.893842 32.591961,-86.893871 32.591998,-86.894414 32.592615,-86.894672 32.592901,-86.894918 32.593192,-86.895156 32.593494,-86.895334 32.59374,-86.895499 32.593989,-86.895808 32.594508,-86.896443 32.595632)\r\n1201;1263;odd;Autauga County 103;Autauga;AL;36749;LINESTRING(-86.894002 32.591867,-86.894031 32.5919,-86.89457 32.592515,-86.894832 32.592801,-86.895082 32.593098,-86.895322 32.593404,-86.895506 32.593654,-86.895675 32.593911,-86.895984 32.594436,-86.896619 32.595561)\r\n600;602;even;Vindale Rd;Autauga;AL;36067;LINESTRING(-86.463414 32.451962,-86.46338 32.451892,-86.463193 32.45148,-86.463182 32.45147)\r\n601;699;odd;Vindale Rd;Autauga;AL;36067;LINESTRING(-86.463235 32.452028,-86.463196 32.451956,-86.463007 32.45155,-86.463009 32.451544)\r\n600;698;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.541323 32.571561,-86.541366 32.571572,-86.542561 32.571866,-86.543796 32.572163,-86.544613 32.572367,-86.546669 32.572868,-86.547898 32.573176,-86.547984 32.573195,-86.549131 32.57347,-86.54954 32.573572,-86.550038 32.573687,-86.550536 32.573795,-86.551547 32.574008,-86.551701 32.574033)\r\n599;699;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.541373 32.571402,-86.54142 32.571412,-86.542615 32.571708,-86.54385 32.572003,-86.544667 32.572209,-86.546723 32.57271,-86.547952 32.573016,-86.548036 32.573037,-86.549185 32.573312,-86.549594 32.573412,-86.550088 32.573527,-86.550584 32.573635,-86.551591 32.573844,-86.55174 32.573872)\r\n200;232;even;E Main St;Autauga;AL;36067;LINESTRING(-86.469801 32.459408,-86.468795 32.45933)\r\n201;233;odd;E Main St;Autauga;AL;36067;LINESTRING(-86.469783 32.459572,-86.468777 32.459494)\r\n2200;2298;even;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.660998 32.65449,-86.660917 32.654564,-86.6608 32.654663,-86.660676 32.654758,-86.660547 32.654845,-86.66041 32.654927,-86.660121 32.655078,-86.656105 32.657005,-86.653849 32.658092,-86.653665 32.658181,-86.653521 32.658264,-86.653381 32.658353,-86.653243 32.658446,-86.653114 32.658546,-86.652991 32.658653,-86.652876 32.658767,-86.652766 32.658884,-86.652666 32.659006,-86.652572 32.659134,-86.652488 32.659265,-86.652414 32.659399,-86.652348 32.659536,-86.652296 32.659679,-86.652212 32.659959,-86.652113 32.660384,-86.651866 32.661518,-86.651766 32.661932,-86.651703 32.662137)\r\n2223;2299;odd;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.661145 32.654598,-86.661065 32.65468,-86.660938 32.654785,-86.660806 32.654888,-86.660667 32.654981,-86.66052 32.655069,-86.660221 32.655222,-86.656201 32.657149,-86.653947 32.658236,-86.653773 32.658325,-86.653637 32.658402,-86.653503 32.658485,-86.653375 32.658574,-86.653254 32.658668,-86.653139 32.658767,-86.65303 32.658873,-86.652928 32.658984,-86.652834 32.659098,-86.652746 32.659218,-86.652668 32.659341,-86.652598 32.659467,-86.652538 32.659594,-86.652488 32.659725,-86.652406 32.659997,-86.652305 32.660416,-86.652058 32.66155,-86.651962 32.66197,-86.651891 32.66218)\r\n2500;2586;even;Autauga County 85;Autauga;AL;36022;LINESTRING(-86.431271 32.591246,-86.431281 32.591411,-86.431307 32.591702,-86.431469 32.593284,-86.432149 32.599756,-86.432218 32.600472,-86.432231 32.600682,-86.432207 32.600957,-86.432142 32.601226,-86.432036 32.601486,-86.431926 32.601662,-86.431514 32.602093,-86.431078 32.602425,-86.429568 32.603484,-86.429428 32.603584)\r\n2501;2593;odd;Autauga County 85;Autauga;AL;36022;LINESTRING(-86.431466 32.591237,-86.431477 32.591401,-86.431503 32.591688,-86.431663 32.59327,-86.432343 32.599742,-86.432416 32.600462,-86.432427 32.600682,-86.432413 32.600979,-86.432342 32.601272,-86.432228 32.601554,-86.432106 32.60176,-86.431666 32.602217,-86.431206 32.602551,-86.429694 32.60361,-86.429553 32.60371)\r\n1099;1001;all;Henderson Ln;Autauga;AL;36067;LINESTRING(-86.450376 32.486763,-86.450355 32.486646,-86.450496 32.486269,-86.450717 32.485903,-86.450949 32.485696,-86.451369 32.485563,-86.45149 32.485516)\r\n714;722;even;Summer Ln;Autauga;AL;36066;LINESTRING(-86.426979 32.458437,-86.426935 32.458427,-86.426336 32.458405,-86.426091 32.458383,-86.425941 32.458352,-86.425923 32.458351)\r\n713;725;odd;Summer Ln;Autauga;AL;36066;LINESTRING(-86.426949 32.458599,-86.426915 32.458599,-86.426324 32.458573,-86.426057 32.458559,-86.425875 32.458518,-86.425849 32.458503)\r\n1799;1453;odd;Co Rd 40 W;Autauga;AL;36067;LINESTRING(-86.638264 32.533643,-86.638165 32.533969,-86.638096 32.53426,-86.638057 32.534481,-86.638033 32.534704,-86.638027 32.534926,-86.638031 32.535218,-86.63803 32.536095,-86.638054 32.537265,-86.638071 32.53785,-86.638118 32.53858,-86.63815 32.538944,-86.638188 32.539523,-86.638212 32.540175,-86.638208 32.540611,-86.63821 32.540908,-86.638228 32.541059,-86.638253 32.541207,-86.638286 32.541354,-86.638362 32.541641,-86.638623 32.542488,-86.638723 32.542843,-86.638809 32.543128,-86.638864 32.54327,-86.638929 32.543412,-86.639003 32.543549,-86.63933 32.544067,-86.639499 32.544328,-86.639599 32.544455,-86.639714 32.544576,-86.639845 32.544682,-86.639984 32.544776,-86.640257 32.544957,-86.640399 32.545047,-86.640547 32.545131,-86.640708 32.545206,-86.640877 32.545261,-86.641044 32.545307,-86.641216 32.545347,-86.64139 32.545377,-86.642066 32.545481,-86.642398 32.545544,-86.642723 32.545621,-86.643045 32.54571,-86.643199 32.54576,-86.643353 32.545817,-86.643502 32.54588,-86.644094 32.546165,-86.644219 32.546243,-86.644317 32.546334,-86.644397 32.546448,-86.644532 32.546709,-86.645015 32.547806,-86.645124 32.548088,-86.645169 32.548161)\r\n1798;1400;even;Co Rd 40 W;Autauga;AL;36067;LINESTRING(-86.638453 32.533683,-86.638359 32.534007,-86.638292 32.534288,-86.638255 32.534501,-86.638233 32.534714,-86.638223 32.534928,-86.638227 32.535218,-86.638226 32.536093,-86.63825 32.537261,-86.638269 32.537844,-86.638314 32.53857,-86.638346 32.538934,-86.638384 32.539515,-86.638408 32.540173,-86.638404 32.540611,-86.638412 32.540898,-86.638426 32.541039,-86.638449 32.541179,-86.63848 32.54132,-86.638554 32.541601,-86.638813 32.542448,-86.638913 32.542803,-86.639001 32.54308,-86.639052 32.543214,-86.639113 32.543346,-86.639183 32.543475,-86.639502 32.543987,-86.639671 32.544238,-86.639763 32.544353,-86.639866 32.544458,-86.639981 32.544554,-86.640108 32.544646,-86.640377 32.544825,-86.640513 32.544909,-86.640651 32.544983,-86.640796 32.545048,-86.640945 32.545101,-86.641102 32.545145,-86.641264 32.545183,-86.641428 32.545213,-86.642106 32.545317,-86.642446 32.54538,-86.642781 32.545461,-86.643111 32.54555,-86.643275 32.545604,-86.643437 32.545665,-86.643596 32.545732,-86.644202 32.546019,-86.644361 32.546105,-86.644493 32.546228,-86.644579 32.546372,-86.644718 32.546647,-86.645201 32.54775,-86.645314 32.548024,-86.645346 32.548092)\r\n699;621;odd;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.823367 32.39825,-86.824393 32.400837,-86.824673 32.401528,-86.825505 32.403604,-86.825913 32.404646,-86.826314 32.405686,-86.826455 32.406029,-86.826742 32.406789,-86.826829 32.40707,-86.826878 32.407262)\r\n698;620;even;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.823552 32.398198,-86.824577 32.400783,-86.824857 32.401474,-86.825689 32.403552,-86.826099 32.404594,-86.8265 32.405632,-86.826641 32.405977,-86.826934 32.406741,-86.827023 32.407032,-86.827069 32.407228)\r\n2499;2323;odd;Autauga County 40;Autauga;AL;36006;LINESTRING(-86.768409 32.549044,-86.768357 32.549062,-86.764525 32.550517,-86.764211 32.550628,-86.763894 32.550726,-86.763573 32.550809,-86.763164 32.550894,-86.762837 32.550945,-86.762077 32.551018,-86.761477 32.551068,-86.761401 32.551075,-86.761056 32.551108,-86.760712 32.551164,-86.760372 32.551231,-86.760037 32.55132,-86.759712 32.551426,-86.759391 32.55155,-86.759159 32.551653,-86.759006 32.551728,-86.758644 32.551926,-86.758501 32.552014,-86.758295 32.552151,-86.755131 32.554365,-86.754859 32.554528,-86.754721 32.554601)\r\n2418;2300;even;Autauga County 40;Autauga;AL;36006;LINESTRING(-86.768484 32.549196,-86.768435 32.549214,-86.764603 32.550669,-86.764285 32.550784,-86.763958 32.550886,-86.763627 32.550973,-86.763206 32.551058,-86.762867 32.551113,-86.762097 32.551182,-86.761497 32.551232,-86.761423 32.551239,-86.761086 32.551276,-86.760754 32.551328,-86.760426 32.551395,-86.760103 32.55148,-86.75979 32.551582,-86.759479 32.551702,-86.759255 32.551801,-86.75911 32.551872,-86.758756 32.552066,-86.758621 32.552148,-86.758419 32.552281,-86.755253 32.554501,-86.754969 32.55467,-86.754821 32.554742)\r\n2400;2422;all;Alma Ln;Autauga;AL;36067;LINESTRING(-86.643059 32.570234,-86.642995 32.570264,-86.642761 32.570363,-86.642365 32.570509,-86.642244 32.570552)\r\n399;301;odd;Walnut St;Autauga;AL;36067;LINESTRING(-86.478032 32.466669,-86.478084 32.466336)\r\n398;300;even;Walnut St;Autauga;AL;36067;LINESTRING(-86.477839 32.466647,-86.477891 32.466314)\r\n2599;2501;odd;Dutch Bend St;Autauga;AL;36003;LINESTRING(-86.657577 32.434717,-86.656579 32.435289,-86.656551 32.435307)\r\n1398;1300;even;Dutch Bend St;Autauga;AL;36003;LINESTRING(-86.657686 32.434853,-86.656687 32.435433,-86.656649 32.435448)\r\n751;801;all;Red Eagle Rd;Autauga;AL;36067;LINESTRING(-86.519156 32.449198,-86.51751 32.449953,-86.51743 32.449976)\r\n399;301;odd;Woodvale Rd;Autauga;AL;36067;LINESTRING(-86.456167 32.472479,-86.456543 32.471846)\r\n398;300;even;Woodvale Rd;Autauga;AL;36067;LINESTRING(-86.455994 32.472405,-86.45637 32.471772)\r\n100;198;all;High Place Dr;Autauga;AL;36067;LINESTRING(-86.506281 32.461233,-86.506405 32.461366)\r\n1502;1500;all;Jennifer Cir;Autauga;AL;36022;LINESTRING(-86.42063 32.533633,-86.4209 32.533481,-86.42093 32.533467)\r\n793;799;all;Mc Griff St;Autauga;AL;36067;LINESTRING(-86.466084 32.440248,-86.466103 32.440247,-86.46627 32.440251,-86.466528 32.440245,-86.466793 32.440247,-86.466987 32.440259)\r\n800;848;all;Autauga County 32;Autauga;AL;36091;LINESTRING(-86.587865 32.688244,-86.587954 32.688257,-86.588449 32.688336,-86.588616 32.68836,-86.588879 32.688389,-86.589234 32.688412,-86.58992 32.688495,-86.590762 32.688641,-86.591199 32.688698)\r\n1951;2041;all;Maul Dr;Autauga;AL;36006;LINESTRING(-86.717175 32.659917,-86.717157 32.659935,-86.717063 32.65997,-86.716895 32.660014,-86.716591 32.660083,-86.716528 32.660098)\r\n1101;1223;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.430579 32.43828,-86.430291 32.438292,-86.42977 32.438322,-86.429603 32.438316,-86.429486 32.438321)\r\n800;898;even;Davis St;Autauga;AL;36067;LINESTRING(-86.451007 32.4578,-86.450468 32.457216,-86.44987 32.456591,-86.449854 32.456579)\r\n823;899;odd;Davis St;Autauga;AL;36067;LINESTRING(-86.450854 32.457902,-86.450314 32.45732,-86.449718 32.456701,-86.44971 32.45669)\r\n1200;1698;even;Rowe Dr;Autauga;AL;36067;LINESTRING(-86.494937 32.538872,-86.494894 32.539071,-86.494874 32.539134,-86.494817 32.539266,-86.494748 32.539383,-86.494603 32.539537,-86.494487 32.539627,-86.494351 32.539713,-86.494134 32.539852,-86.494022 32.539993,-86.493992 32.540081,-86.493983 32.54017,-86.493991 32.540332,-86.494022 32.540421,-86.494161 32.540622,-86.494234 32.540681,-86.494429 32.54084,-86.494579 32.540916,-86.494689 32.541002,-86.494884 32.54123,-86.495493 32.541922,-86.495548 32.541983,-86.495668 32.542095,-86.495809 32.542192,-86.495966 32.542284,-86.496167 32.542324,-86.496322 32.542307,-86.49645 32.542304,-86.496708 32.542242,-86.496952 32.542177,-86.497194 32.542122,-86.497861 32.542033,-86.498025 32.542017,-86.498103 32.54201,-86.498259 32.542025,-86.498418 32.54205,-86.498488 32.542069,-86.498628 32.542124,-86.498681 32.542156,-86.498726 32.542196,-86.49876 32.542242,-86.498804 32.542317)\r\n1601;1699;odd;Rowe Dr;Autauga;AL;36067;LINESTRING(-86.49513 32.538898,-86.495094 32.539109,-86.495066 32.539188,-86.495003 32.53933,-86.494934 32.539479,-86.494755 32.539663,-86.494611 32.539759,-86.494473 32.539845,-86.494298 32.539978,-86.49422 32.540075,-86.494198 32.540121,-86.494183 32.540176,-86.494201 32.540298,-86.49422 32.540349,-86.494333 32.540514,-86.494376 32.540561,-86.494557 32.540696,-86.494707 32.540772,-86.494851 32.540882,-86.495046 32.541132,-86.495649 32.54182,-86.4957 32.541871,-86.49581 32.541967,-86.495931 32.542052,-86.496056 32.542112,-86.496185 32.542148,-86.496304 32.542143,-86.496414 32.542128,-86.496654 32.54208,-86.496896 32.542017,-86.49715 32.541952,-86.497835 32.541867,-86.498007 32.541849,-86.498103 32.541846,-86.498287 32.541851,-86.498466 32.541884,-86.49856 32.541905,-86.498734 32.541968,-86.498821 32.54202,-86.498894 32.542086,-86.49895 32.542162,-86.498985 32.542257)\r\n1748;1798;all;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.673841 32.61004,-86.673867 32.610049,-86.674229 32.610137,-86.674567 32.610203)\r\n800;898;even;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.891641 32.58029,-86.89161 32.580359,-86.89159 32.580433,-86.891562 32.580577,-86.891546 32.580728,-86.891548 32.580882,-86.891564 32.581036,-86.891599 32.581184,-86.891642 32.581329,-86.891699 32.581474,-86.89177 32.581615,-86.891861 32.58175,-86.891962 32.581875,-86.892125 32.582056,-86.89226 32.582161,-86.892534 32.582343,-86.894794 32.583654,-86.894819 32.583667)\r\n843;899;odd;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.891826 32.580341,-86.891806 32.580405,-86.891788 32.580467,-86.891762 32.580599,-86.891748 32.580734,-86.89175 32.580874,-86.891766 32.581012,-86.891795 32.581148,-86.891836 32.581281,-86.891889 32.581412,-86.891954 32.581539,-86.892033 32.58166,-86.892124 32.581775,-86.892279 32.581938,-86.892392 32.582031,-86.892654 32.582207,-86.894904 32.583516,-86.894925 32.583529)\r\n933;945;all;Fireside Dr;Autauga;AL;36067;LINESTRING(-86.479536 32.446239,-86.479429 32.446247,-86.479127 32.446231,-86.47897 32.446337,-86.478885 32.446497,-86.47886 32.446995,-86.478836 32.447808,-86.478861 32.447936,-86.478864 32.447963)\r\n2152;2148;even;Chancellor Ridge Rd;Autauga;AL;36066;LINESTRING(-86.417715 32.471832,-86.417906 32.472612,-86.417869 32.472758,-86.417872 32.472774)\r\n2159;2151;odd;Chancellor Ridge Rd;Autauga;AL;36066;LINESTRING(-86.417906 32.471799,-86.4181 32.47261,-86.418071 32.47278,-86.418066 32.472788)\r\n800;898;all;E Main St;Autauga;AL;36067;LINESTRING(-86.452319 32.460181,-86.452075 32.460182,-86.451817 32.460176,-86.451589 32.460183)\r\n398;300;all;N McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.420271 32.476001,-86.420267 32.475935,-86.420236 32.475517,-86.420214 32.475372,-86.420205 32.475322)\r\n559;699;all;N Pickett St;Autauga;AL;36003;LINESTRING(-86.66652 32.446584,-86.666767 32.446787,-86.66738 32.447303,-86.667575 32.447474)\r\n599;501;odd;Washington Ferry Rd;Autauga;AL;36067;LINESTRING(-86.513162 32.386706,-86.513026 32.386703,-86.51259 32.386712,-86.511902 32.386698,-86.510792 32.386661,-86.509852 32.386644,-86.50959 32.386645,-86.509248 32.386668,-86.50916 32.38668,-86.509063 32.386696,-86.508971 32.38674,-86.50889 32.386788,-86.508817 32.38684,-86.508373 32.387189,-86.508297 32.387252)\r\n598;500;even;Washington Ferry Rd;Autauga;AL;36067;LINESTRING(-86.513156 32.386871,-86.513026 32.386867,-86.51259 32.386876,-86.511896 32.386864,-86.510786 32.386827,-86.509852 32.38681,-86.5096 32.386815,-86.509272 32.386838,-86.509202 32.386848,-86.509139 32.386866,-86.509077 32.38689,-86.509012 32.386926,-86.508949 32.386968,-86.508507 32.387311,-86.508432 32.387371)\r\n1698;1600;even;Vernon Sheppard Rd;Autauga;AL;36758;LINESTRING(-86.850566 32.619904,-86.850501 32.61991,-86.85044 32.620019,-86.850424 32.620111,-86.850422 32.620409,-86.850419 32.620756,-86.850411 32.620818,-86.850394 32.620882,-86.85037 32.620942,-86.85034 32.621,-86.850302 32.621056,-86.85026 32.621111,-86.850161 32.621221,-86.850001 32.62138,-86.849583 32.621739,-86.849468 32.621855,-86.849416 32.62192,-86.849324 32.622052,-86.849285 32.622121,-86.849218 32.622261,-86.849165 32.622405,-86.84912 32.62255,-86.84909 32.622699,-86.849078 32.622851,-86.849083 32.623004,-86.849127 32.623436,-86.849129 32.623574,-86.849109 32.623864,-86.849107 32.624016,-86.849117 32.624096,-86.849131 32.624174,-86.849179 32.624323,-86.849244 32.624465,-86.849323 32.624601,-86.849451 32.624789,-86.849483 32.624848,-86.849509 32.62491,-86.849528 32.624972,-86.849541 32.625036,-86.849547 32.6251,-86.849548 32.625166,-86.849531 32.625301,-86.849518 32.625362,-86.849495 32.625428,-86.849467 32.625488,-86.849432 32.625544,-86.84939 32.625594,-86.849343 32.62564,-86.849224 32.625731,-86.849096 32.625814,-86.848886 32.625933,-86.848664 32.626057,-86.848591 32.626113,-86.848524 32.62617,-86.848466 32.626235,-86.848413 32.626299,-86.848324 32.626428,-86.848198 32.626625,-86.848124 32.626765,-86.848091 32.626846,-86.848081 32.626936,-86.848084 32.627023,-86.848105 32.627104,-86.848183 32.627316,-86.848271 32.627527,-86.848344 32.627667,-86.848432 32.627802,-86.848585 32.627987,-86.848633 32.628049)\r\n1601;1699;odd;Vernon Sheppard Rd;Autauga;AL;36758;LINESTRING(-86.850643 32.620055,-86.850669 32.620064,-86.85065 32.620081,-86.850634 32.620129,-86.85062 32.620411,-86.850623 32.620766,-86.850613 32.620846,-86.850592 32.620928,-86.85056 32.621008,-86.850518 32.621078,-86.850474 32.621146,-86.850422 32.621209,-86.850317 32.621327,-86.850149 32.621494,-86.849733 32.621853,-86.84963 32.621959,-86.849586 32.622012,-86.849502 32.622132,-86.849469 32.622189,-86.849408 32.622319,-86.849357 32.622451,-86.849318 32.622586,-86.849292 32.622719,-86.849278 32.622855,-86.849283 32.622994,-86.849329 32.623428,-86.849329 32.623578,-86.849309 32.623868,-86.849311 32.624008,-86.849317 32.624074,-86.849331 32.624138,-86.849373 32.624269,-86.84943 32.624397,-86.849501 32.624521,-86.849631 32.624711,-86.849671 32.624784,-86.849703 32.624858,-86.849728 32.624936,-86.849741 32.625016,-86.849749 32.625092,-86.84975 32.625172,-86.849735 32.625327,-86.849714 32.625404,-86.849687 32.625482,-86.849653 32.625558,-86.84961 32.625632,-86.849554 32.625704,-86.849485 32.625762,-86.849354 32.625863,-86.849212 32.625952,-86.848996 32.626071,-86.84879 32.626195,-86.848731 32.626237,-86.848678 32.626284,-86.848628 32.626335,-86.848583 32.626391,-86.848498 32.62651,-86.84838 32.626699,-86.848316 32.626825,-86.848297 32.626884,-86.848283 32.626942,-86.84829 32.627001,-86.848303 32.627062,-86.848373 32.627264,-86.848459 32.627463,-86.848526 32.627591,-86.848606 32.627712,-86.848753 32.627895,-86.848799 32.627964)\r\n800;832;even;Autauga County 113;Autauga;AL;36067;LINESTRING(-86.590695 32.515403,-86.590663 32.515442,-86.590535 32.515721,-86.590486 32.515866,-86.590427 32.516084,-86.590358 32.516465,-86.59032 32.516653,-86.590215 32.517076,-86.590114 32.517502,-86.59002 32.517857,-86.589896 32.518358,-86.589874 32.51851,-86.58987 32.518662,-86.589877 32.518817,-86.58999 32.519243,-86.589999 32.519307,-86.590001 32.51937,-86.589995 32.519436,-86.589968 32.519579,-86.589953 32.519731,-86.589953 32.519813,-86.589975 32.519967,-86.589999 32.520047,-86.590034 32.520121,-86.590308 32.520648,-86.590358 32.520776,-86.590375 32.520837,-86.590414 32.521071)\r\n807;839;odd;Autauga County 113;Autauga;AL;36067;LINESTRING(-86.590866 32.515483,-86.590851 32.515516,-86.590727 32.515777,-86.59068 32.515908,-86.590625 32.516116,-86.59055 32.516491,-86.590516 32.516683,-86.590407 32.51711,-86.590306 32.517536,-86.590212 32.517891,-86.590096 32.518386,-86.590076 32.518524,-86.590068 32.51866,-86.590083 32.518793,-86.590192 32.519215,-86.590203 32.519295,-86.590203 32.519376,-86.590193 32.519456,-86.590168 32.519599,-86.590155 32.519737,-86.590157 32.519801,-86.590177 32.519935,-86.590195 32.519995,-86.59022 32.520057,-86.590496 32.520586,-86.590558 32.52073,-86.590575 32.520809,-86.590607 32.52105)\r\n556;568;even;Jasmine Trl;Autauga;AL;36066;LINESTRING(-86.428242 32.475662,-86.428251 32.475856,-86.428261 32.476004,-86.428288 32.476161)\r\n555;565;odd;Jasmine Trl;Autauga;AL;36066;LINESTRING(-86.428436 32.475655,-86.428447 32.475846,-86.428461 32.475988,-86.428481 32.47614)\r\n1500;1538;all;US Hwy 31;Autauga;AL;36067;LINESTRING(-86.455143 32.529071,-86.455151 32.529158,-86.455159 32.529246)\r\n2046;2098;all;Autauga County 66;Autauga;AL;36022;LINESTRING(-86.471659 32.581567,-86.471867 32.581982,-86.471972 32.582198)\r\n540;598;even;Pratt St;Autauga;AL;36067;LINESTRING(-86.465225 32.454966,-86.465231 32.454882,-86.465203 32.454797,-86.465163 32.45472,-86.465116 32.454646,-86.464753 32.454239,-86.464712 32.454181,-86.464678 32.454122,-86.464655 32.454062,-86.464626 32.453934,-86.464628 32.453876,-86.46464 32.453816,-86.464663 32.453758,-86.464696 32.453703,-86.464788 32.453599,-86.464839 32.453556,-86.4649 32.453518,-86.464967 32.453485,-86.465041 32.453455,-86.465134 32.453409)\r\n539;599;odd;Pratt St;Autauga;AL;36067;LINESTRING(-86.465031 32.454971,-86.465019 32.454908,-86.465005 32.454853,-86.464979 32.454796,-86.464942 32.454742,-86.464587 32.454335,-86.464532 32.454265,-86.46449 32.454188,-86.464453 32.454108,-86.464418 32.453948,-86.46442 32.453858,-86.464438 32.453772,-86.464471 32.45369,-86.464518 32.453611,-86.46463 32.453479,-86.464709 32.45342,-86.46479 32.453374,-86.464873 32.453333,-86.464951 32.453303,-86.46504 32.453264)\r\n2383;2499;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.628684 32.525597,-86.62869 32.525599,-86.631243 32.527638,-86.635937 32.53139,-86.636251 32.531639,-86.636552 32.531881)\r\n1322;1328;even;Hare Cir;Autauga;AL;36067;LINESTRING(-86.424207 32.434107,-86.424384 32.434201)\r\n1323;1329;odd;Hare Cir;Autauga;AL;36067;LINESTRING(-86.424311 32.433968,-86.424488 32.434062)\r\n3599;3587;odd;Netezen Ln;Autauga;AL;36749;LINESTRING(-86.786739 32.587028,-86.786644 32.586978)\r\n3598;3592;even;Netezen Ln;Autauga;AL;36749;LINESTRING(-86.786637 32.587168,-86.786542 32.587118)\r\n209;211;all;Winchester Way;Autauga;AL;36067;LINESTRING(-86.475295 32.449549,-86.475939 32.449543,-86.476005 32.449542)\r\n119;175;odd;Lancelot Cir;Autauga;AL;36067;LINESTRING(-86.47335 32.435573,-86.473354 32.435474,-86.473359 32.4354,-86.473358 32.435313,-86.473346 32.435222,-86.473303 32.435128,-86.47323 32.435049,-86.473141 32.43499,-86.473041 32.434945,-86.472857 32.434916,-86.472763 32.434917,-86.472161 32.434918,-86.471038 32.43492,-86.470861 32.434928,-86.470678 32.434942,-86.470494 32.434979,-86.4704 32.435013,-86.470312 32.43505,-86.470232 32.435093,-86.470012 32.435215,-86.469943 32.435249,-86.469779 32.435316,-86.469687 32.435356,-86.469607 32.43541,-86.469532 32.435486,-86.469475 32.435655,-86.469476 32.435741,-86.469473 32.435969,-86.46948 32.436061,-86.469519 32.436163,-86.469604 32.436247,-86.469717 32.436294,-86.469818 32.436307,-86.470072 32.436351,-86.470139 32.436357)\r\n176;198;even;Lancelot Cir;Autauga;AL;36067;LINESTRING(-86.473156 32.435573,-86.473152 32.435466,-86.473161 32.435396,-86.473154 32.435331,-86.473138 32.43527,-86.473113 32.43522,-86.473076 32.435177,-86.473025 32.435142,-86.472969 32.435119,-86.472831 32.435092,-86.472759 32.435085,-86.472161 32.435082,-86.471044 32.435088,-86.470877 32.435096,-86.470714 32.435114,-86.470556 32.435147,-86.470482 32.435169,-86.47041 32.4352,-86.470338 32.435235,-86.470118 32.435361,-86.470035 32.435399,-86.469873 32.435466,-86.469807 32.435502,-86.469761 32.435536,-86.469732 32.435574,-86.469687 32.435687,-86.469676 32.435747,-86.469677 32.435959,-86.46969 32.436019,-86.469715 32.436067,-86.469746 32.436097,-86.469793 32.436122,-86.46986 32.436143,-86.470106 32.436185,-86.470166 32.436194)\r\n2699;2401;odd;Fulton Dr;Autauga;AL;36003;LINESTRING(-86.672279 32.440915,-86.672263 32.441014,-86.67227 32.441234,-86.672306 32.441957,-86.672318 32.442321,-86.672388 32.443558,-86.67236 32.443669,-86.672308 32.443723,-86.672198 32.443748,-86.671015 32.443759,-86.669733 32.443756,-86.667585 32.443765,-86.667161 32.443756,-86.667064 32.443749,-86.666997 32.443742,-86.666834 32.443717,-86.666677 32.443682,-86.666028 32.443474,-86.665842 32.44344,-86.665743 32.443443,-86.665559 32.443444,-86.665377 32.443473,-86.6652 32.443519,-86.665034 32.443581,-86.664726 32.443707,-86.664575 32.443752,-86.664422 32.443779,-86.664 32.443802,-86.663399 32.443813,-86.663312 32.443808,-86.663196 32.443799,-86.663082 32.443834,-86.663052 32.443878)\r\n2698;2500;even;Fulton Dr;Autauga;AL;36003;LINESTRING(-86.672472 32.440932,-86.672465 32.441022,-86.672466 32.44123,-86.672502 32.441951,-86.672514 32.442315,-86.672584 32.44356,-86.672588 32.443745,-86.672432 32.443909,-86.672212 32.443922,-86.671015 32.443923,-86.669733 32.44392,-86.667585 32.443931,-86.667147 32.44393,-86.667042 32.443915,-86.666969 32.44391,-86.66679 32.443885,-86.666615 32.443846,-86.66597 32.443644,-86.665816 32.443616,-86.665743 32.443607,-86.665581 32.443618,-86.665425 32.443641,-86.66527 32.443681,-86.665118 32.443735,-86.664806 32.443867,-86.664631 32.443922,-86.664448 32.443953,-86.664008 32.44397,-86.663395 32.443981,-86.663306 32.443976,-86.663238 32.443987,-86.663206 32.443998,-86.663189 32.443994)\r\n1200;1298;even;Wright St;Autauga;AL;36066;LINESTRING(-86.444212 32.466535,-86.44379 32.466637,-86.443626 32.46669,-86.44339 32.46677,-86.443314 32.466792,-86.443071 32.466851,-86.442827 32.466902,-86.442614 32.466935)\r\n1201;1299;odd;Wright St;Autauga;AL;36066;LINESTRING(-86.444267 32.466693,-86.443854 32.466799,-86.443698 32.466846,-86.44346 32.466928,-86.443374 32.466952,-86.443123 32.467013,-86.442869 32.46707,-86.442646 32.467097)\r\n1208;1298;even;Josephine Ave;Autauga;AL;36066;LINESTRING(-86.441372 32.458535,-86.441252 32.458538,-86.441088 32.458537,-86.440842 32.45852,-86.440713 32.458501,-86.440621 32.458477,-86.440515 32.458429,-86.440453 32.458381,-86.440383 32.458283,-86.440237 32.457804,-86.440221 32.45772,-86.440148 32.457658)\r\n1201;1299;odd;Josephine Ave;Autauga;AL;36066;LINESTRING(-86.441381 32.4587,-86.441256 32.458706,-86.44108 32.458707,-86.440818 32.45869,-86.440667 32.458673,-86.440543 32.458643,-86.440397 32.458581,-86.440281 32.458505,-86.440177 32.458353,-86.440045 32.457846,-86.440019 32.457806,-86.439992 32.457756)\r\n699;639;odd;Autauga County 97;Autauga;AL;36749;LINESTRING(-86.827007 32.534849,-86.826981 32.534953,-86.826964 32.53517,-86.826963 32.535319,-86.826973 32.535472,-86.827 32.535622,-86.827078 32.535908,-86.827144 32.536124,-86.827202 32.536268,-86.827305 32.536471,-86.827388 32.536607,-86.827442 32.536671,-86.827554 32.536791,-86.827677 32.536898,-86.828111 32.53725,-86.82835 32.537457,-86.828539 32.537611,-86.828673 32.537709,-86.828813 32.537803,-86.829034 32.537928,-86.829266 32.538037,-86.829584 32.538164,-86.829908 32.538273,-86.83003 32.53831)\r\n698;638;even;Autauga County 97;Autauga;AL;36749;LINESTRING(-86.827199 32.534878,-86.827183 32.534975,-86.827164 32.535176,-86.827163 32.535315,-86.827175 32.535454,-86.827198 32.53559,-86.82727 32.535868,-86.827336 32.536074,-86.82739 32.536206,-86.827487 32.536397,-86.827564 32.536517,-86.827604 32.536569,-86.827708 32.536679,-86.827819 32.53678,-86.828251 32.537132,-86.82849 32.537339,-86.828673 32.537487,-86.828799 32.537579,-86.828931 32.537665,-86.82914 32.537782,-86.829358 32.537885,-86.829664 32.538008,-86.82998 32.538117,-86.830098 32.538156)\r\n1109;1199;all;Lower Kingston Rd;Autauga;AL;36067;LINESTRING(-86.499464 32.47894,-86.499412 32.478926)\r\n1203;1201;all;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.412603 32.503583,-86.412469 32.50359)\r\n1799;1701;odd;Lincoln Dr;Autauga;AL;36067;LINESTRING(-86.559449 32.532235,-86.559433 32.532227,-86.558927 32.532112,-86.558588 32.532045,-86.558419 32.532017,-86.558258 32.531983,-86.558104 32.53194,-86.558039 32.531913,-86.55791 32.53184,-86.557789 32.531748,-86.557658 32.531645,-86.557511 32.531558,-86.557065 32.531331,-86.556774 32.531184,-86.556685 32.531135)\r\n1798;1700;even;Lincoln Dr;Autauga;AL;36067;LINESTRING(-86.559385 32.53239,-86.559373 32.532389,-86.558879 32.532274,-86.558546 32.532209,-86.558377 32.532181,-86.558202 32.532149,-86.55803 32.5321,-86.557939 32.532067,-86.557778 32.53198,-86.557653 32.53187,-86.55753 32.531781,-86.557399 32.5317,-86.556965 32.531473,-86.556662 32.531328,-86.556571 32.531268)\r\n3034;3098;all;Mushat Ln;Autauga;AL;36051;LINESTRING(-86.469224 32.700992,-86.469328 32.701042,-86.46956 32.701139,-86.469936 32.70131,-86.470089 32.70137,-86.470294 32.701473,-86.470738 32.701807,-86.470901 32.701871)\r\n301;399;all;Point Comfort Ln;Autauga;AL;36067;LINESTRING(-86.551271 32.404866,-86.551258 32.403605)\r\n1000;1048;all;Choctaw Ridge;Autauga;AL;36067;LINESTRING(-86.52298 32.454049,-86.522976 32.454046,-86.522812 32.453889,-86.522546 32.453885,-86.522296 32.453918,-86.52207 32.453927,-86.521837 32.453852,-86.521732 32.453768,-86.521539 32.453626,-86.521354 32.453507,-86.52117 32.453475,-86.520833 32.453468,-86.520249 32.453687)\r\n589;501;odd;Marlyn Dr;Autauga;AL;36067;LINESTRING(-86.486252 32.479552,-86.486241 32.479229,-86.486225 32.478953)\r\n588;500;even;Marlyn Dr;Autauga;AL;36067;LINESTRING(-86.486057 32.479557,-86.486045 32.479235,-86.486031 32.478961)\r\n1689;1501;odd;Hawthorne St;Autauga;AL;36066;LINESTRING(-86.421475 32.473804,-86.421506 32.473753,-86.421622 32.473568,-86.42189 32.473196,-86.422024 32.473047,-86.422056 32.473011)\r\n1682;1666;even;Hawthorne St;Autauga;AL;36066;LINESTRING(-86.421296 32.47374,-86.421322 32.473679,-86.421448 32.473484,-86.421722 32.4731,-86.421866 32.472935,-86.421913 32.472899)\r\n199;101;odd;Tew St;Autauga;AL;36066;LINESTRING(-86.449047 32.468573,-86.448483 32.468333,-86.446971 32.467684,-86.446213 32.467357,-86.446121 32.467332,-86.446033 32.467316,-86.445949 32.467307)\r\n198;100;even;Tew St;Autauga;AL;36066;LINESTRING(-86.44896 32.46872,-86.448395 32.468481,-86.446883 32.467832,-86.446133 32.467519,-86.446065 32.467498,-86.445993 32.467482,-86.445917 32.467469)\r\n2201;2225;all;Autauga County 123;Autauga;AL;36051;LINESTRING(-86.577742 32.697199,-86.577472 32.697463,-86.576908 32.698001,-86.576789 32.698118,-86.576169 32.698721)\r\n196;198;even;Seaside Rd;Autauga;AL;36003;LINESTRING(-86.658406 32.447869,-86.658437 32.447907,-86.658578 32.44808,-86.658589 32.448093)\r\n183;197;odd;Seaside Rd;Autauga;AL;36003;LINESTRING(-86.658563 32.447773,-86.658597 32.447811,-86.658742 32.447988,-86.658753 32.448004)\r\n4244;4272;all;Autauga County 60;Autauga;AL;36749;LINESTRING(-86.860837 32.5716,-86.860897 32.57167,-86.861028 32.571838,-86.861194 32.572083,-86.861545 32.572644,-86.861847 32.573152,-86.862011 32.57341,-86.862157 32.573597,-86.862265 32.573716,-86.862549 32.573995,-86.862731 32.574154,-86.862917 32.574309,-86.863123 32.574451)\r\n1399;1345;odd;Brandy Ln;Autauga;AL;36067;LINESTRING(-86.425115 32.435217,-86.425125 32.43525,-86.42515 32.43528,-86.42513 32.435335,-86.425103 32.435392,-86.425078 32.435437,-86.425069 32.435442,-86.425014 32.435505)\r\n1378;1346;even;Brandy Ln;Autauga;AL;36067;LINESTRING(-86.425262 32.435109,-86.425345 32.435166,-86.425344 32.435282,-86.425334 32.435381,-86.425295 32.435476,-86.425244 32.435527,-86.425237 32.435544,-86.425164 32.435611)\r\n699;601;all;Thornton Pl;Autauga;AL;36066;LINESTRING(-86.422832 32.472266,-86.422937 32.472285,-86.423197 32.472328,-86.423383 32.472322,-86.42364 32.472292,-86.423896 32.472273,-86.42416 32.472242,-86.424419 32.47217,-86.424532 32.472116,-86.424592 32.47206)\r\n799;733;all;Red Fox Hollow Rd;Autauga;AL;36051;LINESTRING(-86.542674 32.650182,-86.542507 32.650308,-86.542038 32.650637,-86.541727 32.650837,-86.541363 32.65109,-86.541193 32.651213,-86.541042 32.651369,-86.540938 32.651452,-86.540858 32.651501,-86.540707 32.651561,-86.540454 32.651623,-86.54025 32.651688,-86.540054 32.651748,-86.539971 32.651766,-86.539892 32.651788,-86.539738 32.65182,-86.53958 32.651841,-86.539577 32.651844)\r\n499;401;odd;Gardner Rd;Autauga;AL;36067;LINESTRING(-86.478734 32.489245,-86.478604 32.489231,-86.476723 32.489084,-86.476635 32.489082)\r\n498;400;even;Gardner Rd;Autauga;AL;36067;LINESTRING(-86.47871 32.489409,-86.478584 32.489397,-86.476709 32.489252,-86.476626 32.489247)\r\n271;201;odd;Autauga County 70;Autauga;AL;36022;LINESTRING(-86.469384 32.65449,-86.470038 32.654472,-86.470219 32.654458,-86.470312 32.654439,-86.470401 32.654414,-86.470489 32.654384,-86.470647 32.654312,-86.470725 32.654269,-86.470866 32.654172,-86.470993 32.654065,-86.471218 32.653842,-86.471378 32.653669,-86.471726 32.653258,-86.471984 32.652975,-86.472035 32.65293,-86.472091 32.65289,-86.472151 32.652859,-86.472213 32.652836,-86.472281 32.65282,-86.472351 32.652812,-86.472421 32.652815,-86.472492 32.652824,-86.472565 32.65284,-86.473446 32.6531,-86.475237 32.653591,-86.475642 32.653708,-86.476539 32.653951,-86.476941 32.654067,-86.477173 32.654149,-86.47732 32.654211,-86.477537 32.654316,-86.477747 32.654431,-86.478303 32.654768,-86.478589 32.654929,-86.478792 32.655053,-86.478916 32.655142,-86.47903 32.655239,-86.479082 32.655289,-86.479233 32.655458,-86.479516 32.65581,-86.479595 32.655929,-86.479627 32.655988,-86.479653 32.65605,-86.479671 32.656111,-86.479694 32.656243,-86.479702 32.65638,-86.479729 32.656814,-86.479728 32.657317)\r\n290;200;even;Autauga County 70;Autauga;AL;36022;LINESTRING(-86.469376 32.654325,-86.470024 32.654302,-86.470185 32.654286,-86.470258 32.654273,-86.470331 32.654254,-86.470401 32.654228,-86.470543 32.654164,-86.470605 32.654129,-86.47073 32.654044,-86.470845 32.653949,-86.471064 32.653736,-86.471218 32.653569,-86.471566 32.653158,-86.471828 32.652865,-86.471893 32.652804,-86.471967 32.65275,-86.472051 32.652701,-86.472147 32.652668,-86.472243 32.65265,-86.472341 32.65264,-86.472441 32.652641,-86.472536 32.652656,-86.472625 32.652678,-86.47351 32.652942,-86.475299 32.653433,-86.475704 32.65355,-86.476601 32.653793,-86.477013 32.653907,-86.477257 32.653995,-86.477414 32.654063,-86.477643 32.65417,-86.477859 32.654293,-86.478415 32.65463,-86.478701 32.654791,-86.478916 32.654917,-86.479054 32.655016,-86.47918 32.655123,-86.479238 32.655185,-86.479395 32.65536,-86.479688 32.65572,-86.479777 32.655851,-86.479815 32.655924,-86.479847 32.655998,-86.479873 32.656075,-86.4799 32.656229,-86.4799 32.656374,-86.479929 32.65681,-86.479923 32.657318)\r\n601;699;odd;Old Farm Ln N;Autauga;AL;36066;LINESTRING(-86.415729 32.483341,-86.415534 32.482982,-86.415232 32.48246,-86.415012 32.482133,-86.414929 32.482071)\r\n600;698;even;Old Farm Ln N;Autauga;AL;36066;LINESTRING(-86.415552 32.483411,-86.415356 32.483054,-86.415054 32.48254,-86.41484 32.482243,-86.414788 32.482184)\r\n1217;1299;all;E Main St;Autauga;AL;36066;LINESTRING(-86.440873 32.46051,-86.440721 32.460513)\r\n1699;1643;odd;Autauga County 24;Autauga;AL;36006;LINESTRING(-86.70201 32.667254,-86.701979 32.667267,-86.700956 32.66781,-86.700662 32.667955,-86.700515 32.668022,-86.700364 32.668083,-86.700052 32.668189,-86.699879 32.668238)\r\n1698;1640;even;Autauga County 24;Autauga;AL;36006;LINESTRING(-86.702106 32.667397,-86.702081 32.667411,-86.701058 32.667952,-86.70076 32.668101,-86.700605 32.668172,-86.700446 32.668237,-86.70012 32.668351,-86.699936 32.668395)\r\n1766;1798;all;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.544058 32.545018,-86.544209 32.545251,-86.544443 32.545634,-86.544514 32.545763,-86.544641 32.546024,-86.544753 32.546296,-86.544803 32.54643,-86.544888 32.546703,-86.544936 32.546891)\r\n2005;2001;odd;Lambert Ln;Autauga;AL;36067;LINESTRING(-86.484916 32.572269,-86.484889 32.572251,-86.484792 32.572188,-86.484699 32.572122,-86.484609 32.572053,-86.484451 32.571925,-86.484395 32.571871,-86.484365 32.571824,-86.484337 32.571773,-86.484323 32.571718,-86.484304 32.57159,-86.484303 32.571521,-86.484309 32.571444,-86.484326 32.57128,-86.484342 32.571011,-86.484344 32.570858,-86.484343 32.570797,-86.484345 32.570752,-86.484343 32.570743)\r\n2012;2000;even;Lambert Ln;Autauga;AL;36067;LINESTRING(-86.484804 32.572404,-86.484773 32.572387,-86.484666 32.57232,-86.484569 32.572246,-86.484477 32.572175,-86.484303 32.572047,-86.484233 32.571977,-86.484167 32.571906,-86.484143 32.571819,-86.484121 32.57175,-86.484098 32.5716,-86.484101 32.571511,-86.484113 32.57143,-86.484128 32.571268,-86.484144 32.571005,-86.484148 32.570858,-86.484147 32.570799,-86.484143 32.570746,-86.484149 32.570727)\r\n1593;1501;odd;Topaz St;Autauga;AL;36067;LINESTRING(-86.496597 32.526702,-86.496687 32.526724,-86.496782 32.526726,-86.496957 32.526727,-86.49773 32.526715,-86.498336 32.526684)\r\n1590;1500;even;Topaz St;Autauga;AL;36067;LINESTRING(-86.496638 32.526541,-86.496717 32.52655,-86.496792 32.526558,-86.496957 32.526563,-86.497722 32.526547,-86.498325 32.52652)\r\n600;698;even;Stirling Ridge;Autauga;AL;36067;LINESTRING(-86.478783 32.476982,-86.478784 32.476058,-86.478756 32.475895,-86.478656 32.475749,-86.478589 32.475682,-86.478442 32.475574,-86.478255 32.475513,-86.478067 32.475504,-86.477677 32.475499)\r\n601;699;odd;Stirling Ridge;Autauga;AL;36067;LINESTRING(-86.478589 32.476983,-86.478574 32.476074,-86.478544 32.475957,-86.47848 32.475851,-86.478439 32.475808,-86.478328 32.475736,-86.478203 32.475693,-86.478055 32.475674,-86.477673 32.475664)\r\n100;198;even;Pineborough Pt;Autauga;AL;36022;LINESTRING(-86.468594 32.599894,-86.468193 32.599773)\r\n101;199;odd;Pineborough Pt;Autauga;AL;36022;LINESTRING(-86.468529 32.600049,-86.468128 32.599928)\r\n1815;1801;odd;Jenny Dr;Autauga;AL;36066;LINESTRING(-86.42352 32.4468,-86.423592 32.446875,-86.423704 32.447039,-86.423757 32.447226,-86.423763 32.447507,-86.423751 32.44794,-86.423751 32.44805,-86.423748 32.448228,-86.423741 32.448443)\r\n1816;1800;even;Jenny Dr;Autauga;AL;36066;LINESTRING(-86.42366 32.446686,-86.423764 32.446765,-86.423912 32.446969,-86.423969 32.447208,-86.423959 32.447509,-86.423947 32.447942,-86.423945 32.448052,-86.423944 32.448232,-86.423935 32.448448)\r\n721;701;odd;N Memorial Dr;Autauga;AL;36067;LINESTRING(-86.452133 32.476369,-86.452105 32.475902,-86.452079 32.475418)\r\n698;600;even;N Memorial Dr;Autauga;AL;36066;LINESTRING(-86.451939 32.476378,-86.451909 32.47591,-86.451885 32.475425)\r\n103;101;all;N Memorial Dr;Autauga;AL;36067;LINESTRING(-86.451055 32.464972,-86.451057 32.464961,-86.451046 32.464802)\r\n2008;2098;all;Calumet Pkwy;Autauga;AL;36066;LINESTRING(-86.417235 32.494585,-86.417408 32.494606,-86.417501 32.494617,-86.417914 32.494661,-86.417928 32.494662)\r\n800;806;even;Mountain Lake Ct;Autauga;AL;36067;LINESTRING(-86.486114 32.454264,-86.486478 32.454417,-86.48673 32.454488,-86.487184 32.454637)\r\n801;805;odd;Mountain Lake Ct;Autauga;AL;36067;LINESTRING(-86.486199 32.454116,-86.486556 32.454257,-86.486798 32.45433,-86.487255 32.454484)\r\n947;901;odd;Langford Ln;Autauga;AL;36067;LINESTRING(-86.460058 32.428955,-86.460044 32.429116,-86.460047 32.429556,-86.460054 32.429846,-86.460058 32.430055)\r\n946;900;even;Langford Ln;Autauga;AL;36067;LINESTRING(-86.460252 32.428965,-86.460244 32.42912,-86.460243 32.429554,-86.46025 32.429844,-86.460252 32.430053)\r\n403;367;odd;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.671016 32.396727,-86.669145 32.398369,-86.668913 32.398592,-86.668639 32.398879,-86.668432 32.39912,-86.668203 32.399413)\r\n402;350;even;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.671156 32.396841,-86.669291 32.398483,-86.669065 32.3987,-86.668797 32.398981,-86.668594 32.399216,-86.668365 32.399504)\r\n614;698;all;Coleman Way;Autauga;AL;36067;LINESTRING(-86.478745 32.49957,-86.478756 32.500026)\r\n201;299;all;N Washington St;Autauga;AL;36003;LINESTRING(-86.657472 32.434171,-86.65754 32.434246,-86.657632 32.434372,-86.657763 32.434567)\r\n157;101;odd;State Rte 14 E;Autauga;AL;36066;LINESTRING(-86.450566 32.466597,-86.450695 32.466494,-86.4507 32.466476)\r\n144;100;even;State Rte 14 E;Autauga;AL;36066;LINESTRING(-86.450418 32.46649,-86.450565 32.466318,-86.450651 32.466316)\r\n400;498;even;Warren Cir;Autauga;AL;36067;LINESTRING(-86.462284 32.465751,-86.462302 32.465694,-86.462269 32.46533,-86.462187 32.46519,-86.462045 32.465142,-86.461808 32.465163,-86.461741 32.465244,-86.461505 32.465307,-86.461384 32.465426,-86.461314 32.465579,-86.46133 32.465712)\r\n401;499;odd;Warren Cir;Autauga;AL;36067;LINESTRING(-86.462094 32.465714,-86.4621 32.465684,-86.462051 32.465386,-86.462015 32.465336,-86.462013 32.46532,-86.461944 32.465345,-86.461885 32.465414,-86.461633 32.465477,-86.461576 32.465526,-86.461534 32.465613,-86.461525 32.465708)\r\n154;198;even;Beth Manor Dr;Autauga;AL;36066;LINESTRING(-86.42807 32.448146,-86.427869 32.448143,-86.427286 32.448154)\r\n149;199;odd;Beth Manor Dr;Autauga;AL;36066;LINESTRING(-86.428068 32.448311,-86.427869 32.448309,-86.42729 32.448319)\r\n2099;2001;all;Camp Tukabatchee Rd;Autauga;AL;36067;LINESTRING(-86.517928 32.571497,-86.517949 32.572492,-86.518024 32.572784,-86.518192 32.573084,-86.518877 32.574015,-86.519917 32.574767,-86.520217 32.575026,-86.520323 32.575318,-86.520305 32.575394)\r\n900;952;even;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.60034 32.524678,-86.600813 32.524702,-86.601236 32.524733,-86.601399 32.524754,-86.60164 32.524804,-86.601713 32.524825,-86.601855 32.524883,-86.602044 32.524997,-86.602148 32.525092,-86.602236 32.525203,-86.602313 32.525324,-86.602455 32.525588,-86.602757 32.526113,-86.603072 32.52663,-86.603214 32.52689,-86.603411 32.527295,-86.603488 32.527431,-86.603576 32.527562,-86.603678 32.527689,-86.603795 32.527809,-86.603929 32.527914,-86.604069 32.528009,-86.604212 32.528096,-86.604357 32.528179,-86.604652 32.528332,-86.604793 32.528411,-86.605072 32.528579,-86.60536 32.528746,-86.605513 32.528825,-86.605594 32.528861,-86.605756 32.528923,-86.606155 32.529059,-86.606465 32.529178,-86.606606 32.529244,-86.60674 32.529321,-86.606861 32.529408,-86.60697 32.529505,-86.607067 32.529613,-86.607146 32.529727,-86.607214 32.529853,-86.607271 32.529985,-86.607319 32.53012,-86.607397 32.530399,-86.607425 32.530538,-86.607487 32.530975,-86.607595 32.531475,-86.607609 32.531612,-86.607608 32.531751,-86.607596 32.53189,-86.60755 32.532176,-86.607529 32.532329,-86.607535 32.532492,-86.607584 32.532649,-86.607661 32.532768,-86.607668 32.532792,-86.607768 32.532922,-86.607887 32.533038,-86.60801 32.533146,-86.608156 32.533255)\r\n901;979;odd;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.600351 32.524514,-86.600827 32.524536,-86.60126 32.524563,-86.601439 32.524586,-86.601698 32.524638,-86.601789 32.524667,-86.601959 32.524727,-86.602188 32.524861,-86.602314 32.524984,-86.602414 32.525115,-86.602493 32.525252,-86.602633 32.525518,-86.602933 32.526039,-86.60325 32.526556,-86.603396 32.526822,-86.603593 32.527225,-86.603666 32.527351,-86.603748 32.527472,-86.60384 32.527585,-86.603945 32.527689,-86.604063 32.527786,-86.604191 32.527875,-86.604326 32.527958,-86.604465 32.528037,-86.604758 32.52819,-86.604905 32.528273,-86.605184 32.528443,-86.605468 32.528604,-86.605611 32.528677,-86.605682 32.528709,-86.605834 32.528769,-86.606233 32.528905,-86.606553 32.529026,-86.606712 32.529096,-86.606864 32.529183,-86.607001 32.529282,-86.607126 32.529393,-86.607239 32.529515,-86.60733 32.529649,-86.607398 32.529791,-86.607463 32.529931,-86.607513 32.530076,-86.607593 32.530365,-86.607623 32.530514,-86.607685 32.530949,-86.607799 32.531453,-86.607809 32.531606,-86.607808 32.531757,-86.607798 32.531908,-86.607746 32.532198,-86.607727 32.532333,-86.607745 32.532462,-86.607784 32.532587,-86.607837 32.532698,-86.607848 32.532706,-86.607934 32.532818,-86.608037 32.532924,-86.60815 32.533024,-86.608287 32.533134)\r\n2588;2592;all;Autauga County 85;Autauga;AL;36022;LINESTRING(-86.429204 32.603744,-86.428916 32.603948,-86.428649 32.60414,-86.428467 32.604314,-86.428409 32.604418)\r\n2407;2409;all;Big Springs Church Rd;Autauga;AL;36006;LINESTRING(-86.715304 32.6525,-86.715242 32.652522,-86.715065 32.652556,-86.714886 32.652578,-86.714708 32.652588,-86.714446 32.652594,-86.714278 32.652606,-86.714199 32.652616,-86.71412 32.65263,-86.714043 32.65265,-86.713968 32.652675,-86.713893 32.652706,-86.713826 32.652742,-86.713764 32.652783,-86.713756 32.652784)\r\n299;201;all;N Court St;Autauga;AL;36067;LINESTRING(-86.475273 32.465922,-86.475387 32.46567,-86.475394 32.46544,-86.475471 32.464605)\r\n298;200;even;High Pointe Ridge;Autauga;AL;36066;LINESTRING(-86.430535 32.471244,-86.430529 32.470684,-86.430517 32.470531,-86.430476 32.470445,-86.430411 32.470359,-86.430286 32.470305,-86.430135 32.470271,-86.430091 32.470276)\r\n299;201;odd;High Pointe Ridge;Autauga;AL;36066;LINESTRING(-86.430341 32.471247,-86.430327 32.470694,-86.430305 32.470575,-86.430286 32.470533,-86.430255 32.470505,-86.430204 32.470475,-86.430099 32.470449,-86.430078 32.47044)\r\n200;298;even;College St;Autauga;AL;36067;LINESTRING(-86.468561 32.460862,-86.468579 32.460724,-86.468652 32.460214,-86.468689 32.459775,-86.468721 32.459533)\r\n201;299;odd;College St;Autauga;AL;36067;LINESTRING(-86.468368 32.460846,-86.468383 32.460706,-86.468454 32.460198,-86.468491 32.459759,-86.468527 32.459514)\r\n498;400;all;Autauga County 62;Autauga;AL;36067;LINESTRING(-86.536481 32.63246,-86.536387 32.632472,-86.536038 32.6325,-86.535776 32.632507,-86.535516 32.632505,-86.535257 32.63249,-86.534664 32.632431,-86.534417 32.632418,-86.533997 32.632424,-86.532974 32.632466,-86.532373 32.632472,-86.5316 32.632462,-86.531172 32.63245,-86.530574 32.632455,-86.530152 32.632471,-86.529903 32.632491,-86.529699 32.632513)\r\n400;412;even;Cargill St;Autauga;AL;36067;LINESTRING(-86.486909 32.477023,-86.4871 32.476958,-86.48722 32.476926,-86.487458 32.476888,-86.487563 32.476877,-86.487641 32.47688)\r\n401;407;odd;Cargill St;Autauga;AL;36067;LINESTRING(-86.486833 32.476872,-86.487028 32.476798,-86.487168 32.476756,-86.487432 32.476716,-86.487561 32.476711,-86.487652 32.476716)\r\n300;398;even;Hazel St;Autauga;AL;36067;LINESTRING(-86.466451 32.431022,-86.465928 32.431025,-86.465417 32.431017,-86.465101 32.431021)\r\n365;399;odd;Hazel St;Autauga;AL;36067;LINESTRING(-86.466453 32.431186,-86.465928 32.431191,-86.465417 32.431183,-86.465103 32.431186)\r\n118;198;even;Edgefield Mnr;Autauga;AL;36067;LINESTRING(-86.459841 32.513609,-86.46007 32.513617,-86.460533 32.513616)\r\n115;199;odd;Edgefield Mnr;Autauga;AL;36067;LINESTRING(-86.459848 32.513444,-86.460074 32.513449,-86.460533 32.513451)\r\n1800;1808;even;Wynford St;Autauga;AL;36066;LINESTRING(-86.421167 32.467319,-86.421136 32.467278,-86.421032 32.467232,-86.420841 32.467199,-86.420574 32.467197,-86.42023 32.467198,-86.419752 32.467203)\r\n1801;1899;odd;Wynford St;Autauga;AL;36066;LINESTRING(-86.42103 32.467435,-86.421004 32.467428,-86.420956 32.467406,-86.420815 32.467377,-86.42057 32.467365,-86.42023 32.467364,-86.419754 32.467367)\r\n2199;2101;all;Bear Dr;Autauga;AL;36006;LINESTRING(-86.703029 32.657811,-86.703307 32.657833,-86.703622 32.657885,-86.703778 32.657922,-86.704019 32.657995,-86.704123 32.65803)\r\n2514;2518;all;Wyngate Dr;Autauga;AL;36067;LINESTRING(-86.520102 32.445852,-86.520094 32.445518,-86.520104 32.445081,-86.520113 32.444932,-86.520113 32.44486,-86.520132 32.444565)\r\n2368;2398;even;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.60974 32.703783,-86.609741 32.704085,-86.609765 32.704378,-86.609797 32.704736,-86.609802 32.704805)\r\n2369;2399;odd;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.609935 32.703782,-86.609941 32.704079,-86.609961 32.704366,-86.609997 32.704726,-86.609997 32.7048)\r\n1456;1498;even;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.41358 32.530635,-86.413767 32.530914,-86.414602 32.532178,-86.414788 32.532437,-86.41485 32.5325,-86.414967 32.532615,-86.415096 32.532716,-86.415231 32.532814,-86.415386 32.532904,-86.415555 32.532977,-86.415644 32.533003,-86.415729 32.533028,-86.415782 32.533043)\r\n1457;1467;odd;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.413749 32.530554,-86.413937 32.530832,-86.414774 32.532092,-86.414956 32.532337,-86.415004 32.532392,-86.415113 32.532495,-86.41523 32.53259,-86.415355 32.532676,-86.415492 32.532754,-86.415639 32.532819,-86.415714 32.532847,-86.415793 32.532872,-86.415845 32.532887)\r\n198;100;even;Whitetail Ct;Autauga;AL;36067;LINESTRING(-86.48495 32.453282,-86.485119 32.452993)\r\n199;101;odd;Whitetail Ct;Autauga;AL;36067;LINESTRING(-86.484776 32.453209,-86.484945 32.45292)\r\n2000;2098;even;Church St;Autauga;AL;36006;LINESTRING(-86.719717 32.659018,-86.719701 32.659036,-86.719521 32.659244,-86.719279 32.659544,-86.719006 32.659908,-86.718751 32.660209,-86.718578 32.660422)\r\n2001;2099;odd;Church St;Autauga;AL;36006;LINESTRING(-86.719881 32.659108,-86.719865 32.659132,-86.719683 32.65934,-86.719445 32.659636,-86.719172 32.660004,-86.718911 32.660305,-86.718738 32.660515)\r\n1705;1799;all;Look Out Dr;Autauga;AL;36067;LINESTRING(-86.558486 32.445381,-86.558536 32.445386,-86.558611 32.445502,-86.55862 32.445604,-86.558607 32.445754,-86.558583 32.445852,-86.55845 32.446294,-86.558448 32.446357,-86.558473 32.44641,-86.558506 32.446456,-86.558683 32.446612,-86.55885 32.446784,-86.558936 32.446914,-86.559032 32.447133,-86.559117 32.447432,-86.559123 32.447601,-86.559085 32.44771,-86.558969 32.447794,-86.55884 32.447821,-86.558737 32.447818,-86.558579 32.447834,-86.558454 32.447868,-86.558346 32.447936,-86.558257 32.448034,-86.558197 32.448144,-86.558167 32.448265,-86.558159 32.448326,-86.558176 32.448455,-86.558246 32.448809,-86.558284 32.448935,-86.55835 32.449072,-86.558518 32.449289)\r\n805;811;all;Bluegrass Dr;Autauga;AL;36066;LINESTRING(-86.414934 32.490579,-86.415059 32.49077,-86.415353 32.491214)\r\n393;301;odd;W 4th St;Autauga;AL;36067;LINESTRING(-86.485955 32.463679,-86.485834 32.463674,-86.485024 32.463621,-86.484036 32.463554,-86.482751 32.463473,-86.482033 32.463424)\r\n426;400;even;W 4th St;Autauga;AL;36067;LINESTRING(-86.485949 32.463843,-86.485822 32.463842,-86.485008 32.463785,-86.48402 32.463718,-86.482735 32.463637,-86.482018 32.463588)\r\n809;801;all;Bunche Ave;Autauga;AL;36067;LINESTRING(-86.472414 32.477738,-86.47242 32.477511,-86.472447 32.477071,-86.472445 32.476851,-86.472442 32.476747,-86.472437 32.476664,-86.472398 32.476576,-86.472301 32.476514,-86.472188 32.476475,-86.471901 32.476472,-86.471634 32.476516,-86.471526 32.476542)\r\n1072;1098;even;Spring St;Autauga;AL;36067;LINESTRING(-86.466054 32.42897,-86.465956 32.429018,-86.465809 32.429123,-86.465626 32.429381,-86.465529 32.429496,-86.465461 32.429584)\r\n1077;1099;odd;Spring St;Autauga;AL;36067;LINESTRING(-86.466161 32.429108,-86.466082 32.429158,-86.465977 32.429243,-86.465792 32.429477,-86.465691 32.429592,-86.465622 32.429676)\r\n100;198;even;Burning Embers Ct;Autauga;AL;36067;LINESTRING(-86.481586 32.448474,-86.481567 32.448354)\r\n101;199;odd;Burning Embers Ct;Autauga;AL;36067;LINESTRING(-86.481393 32.448496,-86.481374 32.448376)\r\n1717;1715;odd;Meadowbrook Dr;Autauga;AL;36066;LINESTRING(-86.42384 32.47043,-86.423405 32.470326,-86.423194 32.470267,-86.423117 32.470226,-86.423069 32.47017,-86.423039 32.470114,-86.42313 32.469763,-86.423118 32.469768)\r\n1734;1720;even;Meadowbrook Dr;Autauga;AL;36066;LINESTRING(-86.423787 32.470588,-86.423353 32.470484,-86.423112 32.470437,-86.422965 32.470372,-86.422853 32.470248,-86.422845 32.470112,-86.422926 32.469709,-86.422939 32.469703)\r\n425;415;odd;Bedford Ter;Autauga;AL;36066;LINESTRING(-86.440028 32.474639,-86.441297 32.474628)\r\n424;410;even;Bedford Ter;Autauga;AL;36066;LINESTRING(-86.440026 32.474474,-86.441295 32.474463)\r\n100;114;even;Autauga County 40;Autauga;AL;36066;LINESTRING(-86.464067 32.58217,-86.463738 32.582423,-86.463613 32.582524,-86.463197 32.582887,-86.462895 32.583141,-86.462478 32.583504,-86.462158 32.583776)\r\n101;111;odd;Autauga County 40;Autauga;AL;36066;LINESTRING(-86.464198 32.582291,-86.463872 32.582545,-86.463753 32.582642,-86.463337 32.583003,-86.463035 32.583257,-86.462618 32.58362,-86.462296 32.583893)\r\n412;498;even;Frazer Ln;Autauga;AL;36003;LINESTRING(-86.78829 32.492498,-86.788373 32.492489,-86.788627 32.492468,-86.788817 32.492473)\r\n499;413;odd;Frazer Ln;Autauga;AL;36003;LINESTRING(-86.788263 32.492335,-86.788349 32.492323,-86.788621 32.4923,-86.788825 32.492309)\r\n2900;2998;even;Marbury Heights Rd;Autauga;AL;36051;LINESTRING(-86.47524 32.693138,-86.475237 32.693244,-86.475239 32.693322,-86.475251 32.693399,-86.47527 32.693474,-86.475293 32.693551,-86.475354 32.693693,-86.475687 32.694283,-86.475808 32.69448,-86.476144 32.69498,-86.476208 32.695104,-86.476256 32.695232,-86.47629 32.695365,-86.476319 32.695572,-86.476328 32.695708,-86.476318 32.695843,-86.476296 32.695979,-86.476189 32.696326,-86.476177 32.696407,-86.476172 32.696559,-86.476184 32.696777,-86.476175 32.696914,-86.476165 32.696977,-86.476146 32.697034,-86.47612 32.697086,-86.476082 32.697138,-86.476035 32.697188,-86.475982 32.697232,-86.475858 32.697317,-86.475723 32.697392,-86.475424 32.69753,-86.474978 32.697739,-86.474831 32.697825,-86.474629 32.69797,-86.474585 32.698012,-86.474447 32.698126,-86.474382 32.698173,-86.474308 32.698231,-86.47425 32.69831,-86.474215 32.6984,-86.474213 32.698493,-86.474217 32.698585,-86.474257 32.698675,-86.474321 32.698745,-86.47444 32.69886,-86.474566 32.698967,-86.474702 32.699063,-86.474978 32.699232,-86.475038 32.699275,-86.475093 32.699319,-86.475264 32.699485,-86.475339 32.699536,-86.47548 32.699622,-86.475626 32.699707,-86.476211 32.700005,-86.476266 32.700043,-86.476307 32.700085,-86.476335 32.700127,-86.47635 32.700175,-86.476351 32.700225,-86.476339 32.700278,-86.476183 32.700606,-86.476087 32.700812,-86.476015 32.701019)\r\n2901;2999;odd;Marbury Heights Rd;Autauga;AL;36051;LINESTRING(-86.475435 32.693141,-86.475435 32.693242,-86.475441 32.693306,-86.475451 32.693371,-86.475466 32.693436,-86.475487 32.693499,-86.475542 32.693627,-86.475865 32.694209,-86.475982 32.6944,-86.476326 32.694902,-86.4764 32.695042,-86.476454 32.695188,-86.47649 32.695337,-86.476521 32.695558,-86.476524 32.69571,-86.476518 32.695857,-86.4765 32.696011,-86.476391 32.69636,-86.476379 32.696423,-86.476366 32.696559,-86.47638 32.696775,-86.476379 32.696928,-86.476367 32.697009,-86.476346 32.697092,-86.476304 32.69717,-86.476248 32.69724,-86.476187 32.697302,-86.47612 32.697362,-86.475978 32.697457,-86.475825 32.697538,-86.47552 32.697676,-86.475086 32.697885,-86.474955 32.697961,-86.474767 32.698096,-86.474725 32.698128,-86.474587 32.698252,-86.474522 32.698299,-86.474478 32.698343,-86.474446 32.698388,-86.474425 32.698438,-86.474409 32.698491,-86.474427 32.698541,-86.474449 32.698589,-86.474483 32.698639,-86.474588 32.698744,-86.474704 32.698841,-86.474826 32.698929,-86.475102 32.699098,-86.475174 32.699147,-86.475239 32.699203,-86.47541 32.699359,-86.475465 32.699402,-86.475596 32.699486,-86.475734 32.699565,-86.476329 32.699861,-86.476408 32.699913,-86.476483 32.699977,-86.476537 32.700059,-86.476566 32.700151,-86.476565 32.700245,-86.476539 32.700332,-86.476367 32.700668,-86.476277 32.700868,-86.476202 32.701067)\r\n1600;1610;even;Guiding Way;Autauga;AL;36067;LINESTRING(-86.504241 32.461706,-86.50455 32.461711,-86.504808 32.461722,-86.50507 32.461726,-86.505339 32.461708,-86.505522 32.461659,-86.505752 32.461537,-86.506059 32.461328)\r\n1603;1607;odd;Guiding Way;Autauga;AL;36067;LINESTRING(-86.504245 32.461541,-86.504556 32.461545,-86.504814 32.461554,-86.50506 32.461554,-86.505295 32.46153,-86.505432 32.461493,-86.505636 32.461393,-86.505939 32.461198)\r\n1763;1813;all;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.676405 32.600624,-86.676382 32.600733,-86.676261 32.601168,-86.676159 32.601454,-86.675027 32.604502,-86.67501 32.604548)\r\n238;320;even;Autauga County 165;Autauga;AL;36003;LINESTRING(-86.64946 32.439849,-86.649789 32.440743,-86.64995 32.441183,-86.650046 32.441462,-86.650086 32.441599,-86.65015 32.441881,-86.650174 32.442022,-86.650207 32.442306,-86.650215 32.442447,-86.650218 32.44259,-86.650213 32.442731,-86.650189 32.443018,-86.65017 32.443159,-86.650144 32.443299,-86.650075 32.443577,-86.650034 32.443716,-86.649937 32.443992,-86.649882 32.444136)\r\n213;299;odd;Autauga County 165;Autauga;AL;36003;LINESTRING(-86.649645 32.4398,-86.649975 32.440695,-86.650138 32.441135,-86.650238 32.441418,-86.65028 32.441563,-86.650346 32.441853,-86.650372 32.442002,-86.650405 32.442294,-86.650413 32.442443,-86.650414 32.44259,-86.650411 32.442739,-86.650387 32.443034,-86.650366 32.443181,-86.65034 32.443329,-86.650269 32.443615,-86.650224 32.44376,-86.650127 32.444042,-86.650066 32.444189)\r\n193;101;odd;Riverview Ct;Autauga;AL;36003;LINESTRING(-86.658846 32.379232,-86.659014 32.37932,-86.659337 32.379425,-86.659368 32.379453,-86.659398 32.379452,-86.659366 32.379463,-86.659339 32.3795,-86.659215 32.379577,-86.659186 32.379588,-86.658873 32.379641,-86.658698 32.379672,-86.658527 32.379727,-86.658434 32.379762,-86.658349 32.379817,-86.658275 32.379885,-86.658219 32.379962,-86.658187 32.380045,-86.658111 32.380328,-86.658032 32.380616,-86.658027 32.380701,-86.658029 32.380851,-86.658058 32.381216,-86.658058 32.381355,-86.658043 32.381493,-86.657959 32.381925,-86.657934 32.382079,-86.657936 32.382235,-86.657946 32.38232,-86.657971 32.382403,-86.658157 32.382822,-86.658231 32.382968,-86.658291 32.383036,-86.658354 32.383099,-86.658481 32.383203,-86.658616 32.383293,-86.658871 32.383481,-86.659215 32.383755)\r\n498;400;even;Riverview Ct;Autauga;AL;36003;LINESTRING(-86.658942 32.379089,-86.659104 32.37916,-86.659425 32.379267,-86.659546 32.379311,-86.659588 32.379442,-86.659566 32.379569,-86.659473 32.37963,-86.659329 32.379733,-86.659252 32.379764,-86.658913 32.379807,-86.658756 32.37984,-86.658607 32.379885,-86.658546 32.379914,-86.658491 32.379949,-86.658445 32.379993,-86.658411 32.38004,-86.658383 32.380095,-86.658303 32.380366,-86.658236 32.380642,-86.658227 32.380707,-86.658229 32.380845,-86.658258 32.38121,-86.65826 32.381363,-86.658243 32.381515,-86.658155 32.381949,-86.658138 32.382089,-86.65814 32.382225,-86.65815 32.38229,-86.658167 32.382351,-86.658343 32.382756,-86.658415 32.38288,-86.658453 32.382932,-86.658502 32.382981,-86.658615 32.383075,-86.658742 32.383165,-86.659005 32.383357,-86.659349 32.383635)\r\n937;975;all;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.600441 32.534138,-86.600453 32.534353,-86.60045 32.534503,-86.60043 32.534725,-86.600399 32.534874,-86.600341 32.535095,-86.600258 32.53531,-86.600153 32.535519,-86.599993 32.535785,-86.599903 32.535911,-86.599736 32.536167,-86.599642 32.536293,-86.599538 32.536416,-86.599475 32.53647,-86.599252 32.536688,-86.599018 32.536893,-86.598725 32.537145,-86.598619 32.537249,-86.598471 32.537418,-86.598388 32.537533,-86.598312 32.53766,-86.598122 32.538015)\r\n300;398;even;Bent Tree Ct;Autauga;AL;36067;LINESTRING(-86.467003 32.471637,-86.466938 32.471863,-86.466933 32.471887)\r\n301;399;odd;Bent Tree Ct;Autauga;AL;36067;LINESTRING(-86.467193 32.471675,-86.467132 32.471905,-86.46712 32.471932)\r\n1418;1430;even;Autauga Heights Rd;Autauga;AL;36066;LINESTRING(-86.453393 32.516165,-86.453372 32.516193,-86.453259 32.516395,-86.453164 32.516601,-86.453077 32.51681,-86.453009 32.517026,-86.452943 32.517314,-86.45291 32.517509)\r\n1419;1429;odd;Autauga Heights Rd;Autauga;AL;36066;LINESTRING(-86.453564 32.516245,-86.45355 32.516271,-86.453443 32.516463,-86.45335 32.516659,-86.453269 32.51686,-86.453205 32.517064,-86.453139 32.517342,-86.453102 32.517533)\r\n100;140;even;Carol St;Autauga;AL;36067;LINESTRING(-86.455381 32.452389,-86.455382 32.452334,-86.455404 32.452208,-86.455421 32.452148,-86.455481 32.45202,-86.455591 32.451826,-86.455737 32.451557,-86.45587 32.451292,-86.455947 32.451173,-86.456786 32.450174)\r\n101;139;odd;Carol St;Autauga;AL;36067;LINESTRING(-86.455186 32.452394,-86.45518 32.452326,-86.455198 32.452172,-86.455229 32.452092,-86.455295 32.45195,-86.455413 32.451754,-86.455555 32.451491,-86.455686 32.451218,-86.455771 32.451081,-86.456628 32.450078)\r\n2440;2498;even;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.434227 32.58646,-86.434226 32.586502,-86.434189 32.586854,-86.434047 32.587857,-86.433969 32.58828,-86.433861 32.588698,-86.433774 32.588974,-86.433725 32.589108,-86.433609 32.589374,-86.433448 32.589704,-86.433143 32.590283)\r\n2447;2499;odd;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.434422 32.586455,-86.434426 32.586508,-86.434385 32.586872,-86.434243 32.587879,-86.434167 32.588312,-86.434055 32.588738,-86.433966 32.58902,-86.433913 32.589162,-86.433795 32.589436,-86.433628 32.58977,-86.433321 32.59035)\r\n198;100;even;Lake Haven Pl;Autauga;AL;36066;LINESTRING(-86.432727 32.468637,-86.432654 32.468667,-86.432613 32.468688)\r\n199;101;odd;Lake Haven Pl;Autauga;AL;36066;LINESTRING(-86.432834 32.468775,-86.432748 32.468833,-86.432673 32.468844)\r\n2299;2201;odd;Gathering Way;Autauga;AL;36066;LINESTRING(-86.418682 32.494703,-86.418658 32.49506,-86.418803 32.495392,-86.419057 32.495699,-86.419306 32.495821,-86.419545 32.495865,-86.420302 32.495862,-86.420627 32.495864)\r\n2298;2200;even;Gathering Way;Autauga;AL;36066;LINESTRING(-86.418877 32.494708,-86.418878 32.49503,-86.418997 32.495306,-86.419213 32.495555,-86.419388 32.495647,-86.419571 32.495685,-86.420304 32.495698,-86.420628 32.495699)\r\n468;598;all;Jason Rd;Autauga;AL;36067;LINESTRING(-86.636987 32.485494,-86.637091 32.485723,-86.637323 32.486114,-86.637464 32.486375,-86.637525 32.486505,-86.637631 32.486777,-86.63767 32.48691,-86.637695 32.487048,-86.63771 32.487188,-86.637714 32.487328,-86.637705 32.487468,-86.637628 32.488196,-86.637604 32.488491,-86.637602 32.489151,-86.637616 32.489517,-86.637702 32.490969,-86.637718 32.49133,-86.637798 32.492784,-86.637857 32.4938,-86.637861 32.494086,-86.637832 32.494742,-86.63772 32.496414,-86.637681 32.496846,-86.637652 32.497081)\r\n326;398;even;Landcaster Dr;Autauga;AL;36022;LINESTRING(-86.438121 32.601719,-86.437084 32.601713,-86.437014 32.601677,-86.436983 32.601634,-86.436943 32.601093)\r\n2001;2099;odd;Landcaster Dr;Autauga;AL;36022;LINESTRING(-86.438123 32.601883,-86.437018 32.601907,-86.43685 32.601817,-86.436755 32.601694,-86.436748 32.601099)\r\n1500;1526;even;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.421227 32.533054,-86.421314 32.53305,-86.421476 32.533046,-86.421727 32.533054,-86.421975 32.533072,-86.422224 32.5331,-86.422556 32.533151,-86.422702 32.533177)\r\n1519;1527;odd;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.421212 32.53289,-86.421304 32.532882,-86.421478 32.53288,-86.421739 32.532886,-86.421997 32.532904,-86.422254 32.532934,-86.422596 32.532985,-86.422745 32.533016)\r\n1630;1668;even;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.534136 32.524351,-86.535044 32.52567,-86.535228 32.525918,-86.537024 32.528121,-86.537332 32.528469,-86.537437 32.528586,-86.537551 32.5287,-86.537789 32.528911,-86.538158 32.529215,-86.538721 32.529656,-86.538972 32.529847)\r\n1659;1665;odd;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.534305 32.524268,-86.535214 32.525584,-86.535394 32.525826,-86.537186 32.528023,-86.537488 32.528369,-86.537591 32.52848,-86.537699 32.528586,-86.537931 32.528793,-86.538294 32.529095,-86.538853 32.529534,-86.539103 32.529724)\r\n100;198;even;Paradise Ct;Autauga;AL;36022;LINESTRING(-86.420044 32.509251,-86.420041 32.509511,-86.420051 32.509575,-86.420047 32.509629)\r\n101;199;odd;Paradise Ct;Autauga;AL;36022;LINESTRING(-86.420239 32.50925,-86.420243 32.509503,-86.420247 32.509573,-86.420242 32.509639)\r\n200;210;even;Ridgewood Rd;Autauga;AL;36067;LINESTRING(-86.458296 32.486777,-86.458016 32.486802,-86.457845 32.486813,-86.457678 32.486829,-86.45752 32.486833,-86.457366 32.486816,-86.457138 32.486761,-86.457002 32.486705,-86.456797 32.486588,-86.456329 32.48628,-86.456026 32.486071)\r\n207;213;odd;Ridgewood Rd;Autauga;AL;36067;LINESTRING(-86.458318 32.48694,-86.458036 32.486968,-86.457865 32.486981,-86.457694 32.487001,-86.45751 32.487005,-86.457326 32.486988,-86.45706 32.486931,-86.456896 32.486853,-86.456679 32.486724,-86.456207 32.48641,-86.455902 32.486199)\r\n400;406;all;Greg St;Autauga;AL;36067;LINESTRING(-86.488191 32.481076,-86.488384 32.481,-86.48862 32.480922,-86.48872 32.480891)\r\n1654;1662;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.657355 32.524327,-86.657644 32.524336,-86.659103 32.524346,-86.65942 32.524344)\r\n1659;1661;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.657361 32.524163,-86.657648 32.52417,-86.659103 32.524182,-86.659418 32.52418)\r\n1862;1914;even;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.547279 32.556465,-86.547349 32.556704,-86.54746 32.557057,-86.54766 32.557757,-86.548176 32.559521,-86.54829 32.559943,-86.548531 32.560929,-86.548656 32.561495,-86.548761 32.562064,-86.548879 32.56278,-86.548948 32.563274)\r\n1853;1911;odd;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.547468 32.556425,-86.547539 32.556662,-86.54765 32.557017,-86.54785 32.557717,-86.548366 32.559483,-86.548482 32.559907,-86.548723 32.560897,-86.54885 32.561467,-86.548955 32.56204,-86.549075 32.562758,-86.549141 32.563255)\r\n126;128;all;Beth Manor Dr;Autauga;AL;36066;LINESTRING(-86.431968 32.448078,-86.431789 32.448085)\r\n4400;4476;all;Little Rd;Autauga;AL;36749;LINESTRING(-86.897569 32.583912,-86.897157 32.582198,-86.897246 32.581941,-86.897663 32.581815,-86.897733 32.58172)\r\n899;801;all;Jackson Trl;Autauga;AL;36051;LINESTRING(-86.418596 32.68999,-86.418644 32.689991,-86.418826 32.68993,-86.419081 32.68984,-86.419424 32.689638,-86.419522 32.689604,-86.419677 32.689582,-86.41984 32.689588,-86.420043 32.689633,-86.420167 32.689668,-86.420318 32.689662,-86.420676 32.689674,-86.420842 32.689688,-86.420979 32.689723,-86.421149 32.689801,-86.421367 32.689918,-86.421508 32.689965,-86.421629 32.690024,-86.421733 32.690102,-86.422632 32.690415)\r\n234;242;all;Golson Rd;Autauga;AL;36067;LINESTRING(-86.551506 32.445261,-86.551599 32.445447)\r\n626;600;all;2nd St;Autauga;AL;36703;LINESTRING(-86.793891 32.39431,-86.793873 32.394404,-86.793815 32.394633,-86.793803 32.394691,-86.793758 32.394837,-86.793611 32.39526,-86.793555 32.395401,-86.793404 32.395747,-86.793204 32.396154,-86.792595 32.397203,-86.792461 32.397467,-86.792401 32.397603,-86.792351 32.397738,-86.792307 32.397878,-86.792236 32.398162,-86.792211 32.398304,-86.792194 32.398452,-86.792176 32.398744)\r\n807;801;odd;Hearthstone Dr;Autauga;AL;36067;LINESTRING(-86.48076 32.445172,-86.480756 32.444998,-86.480748 32.444665,-86.480751 32.444492,-86.480772 32.444379,-86.480783 32.444319,-86.480804 32.444237,-86.480846 32.444096,-86.480865 32.444039)\r\n898;800;even;Hearthstone Dr;Autauga;AL;36067;LINESTRING(-86.480566 32.445175,-86.480562 32.445002,-86.480552 32.444669,-86.480543 32.444478,-86.480572 32.444355,-86.480575 32.444287,-86.48061 32.444197,-86.480644 32.444044,-86.480685 32.443977)\r\n2112;2100;all;Maul Dr;Autauga;AL;36006;LINESTRING(-86.708689 32.659962,-86.708842 32.659983,-86.710699 32.66023)\r\n2503;2501;all;Stanton;Autauga;AL;36066;LINESTRING(-86.416375 32.442913,-86.416354 32.442827)\r\n1616;1648;even;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.433238 32.537016,-86.433614 32.537021,-86.434471 32.537023,-86.435331 32.537035,-86.436268 32.537039,-86.436601 32.537056,-86.436933 32.537092,-86.437095 32.537117,-86.437341 32.537166,-86.437663 32.537247,-86.437972 32.537346,-86.438272 32.537466,-86.438324 32.537487)\r\n1619;1657;odd;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.43324 32.536851,-86.433616 32.536855,-86.434473 32.536857,-86.435333 32.536869,-86.436274 32.536871,-86.436619 32.536886,-86.436965 32.536924,-86.437137 32.536953,-86.437391 32.537002,-86.437727 32.537085,-86.438052 32.537188,-86.438366 32.537314,-86.438421 32.537344)\r\n420;434;all;Autauga County 165;Autauga;AL;36003;LINESTRING(-86.641992 32.460095,-86.641632 32.460883,-86.641435 32.461323)\r\n100;198;all;Fleetwood Rd;Autauga;AL;36067;LINESTRING(-86.463685 32.449011,-86.46346 32.449024,-86.463286 32.449042,-86.462961 32.449058,-86.462922 32.449055)\r\n400;456;even;Autauga County 122;Autauga;AL;36022;LINESTRING(-86.429201 32.581431,-86.429118 32.58152,-86.429013 32.581623,-86.42872 32.581873,-86.428613 32.581997,-86.42852 32.582126,-86.428361 32.582387,-86.427693 32.583645,-86.427619 32.58377,-86.427537 32.583887,-86.427393 32.584058,-86.427235 32.584222,-86.426661 32.584753,-86.426551 32.584871,-86.426499 32.584937,-86.426454 32.585006,-86.426382 32.585145,-86.426292 32.58535,-86.426222 32.585474,-86.426139 32.58559,-86.426042 32.5857,-86.425935 32.585803,-86.425932 32.585809)\r\n401;457;odd;Autauga County 122;Autauga;AL;36022;LINESTRING(-86.429356 32.581529,-86.429274 32.581626,-86.429161 32.581737,-86.428878 32.581987,-86.428781 32.582093,-86.428696 32.58221,-86.428541 32.582461,-86.427873 32.583715,-86.427797 32.58385,-86.427707 32.583981,-86.427553 32.584162,-86.427385 32.584332,-86.426815 32.584863,-86.426715 32.584971,-86.426673 32.585025,-86.426636 32.585082,-86.426568 32.585209,-86.42648 32.585416,-86.426404 32.585556,-86.426307 32.585686,-86.426198 32.585808,-86.426081 32.585921,-86.426067 32.585928)\r\n1001;1007;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.482019 32.434424,-86.482089 32.434393)\r\n601;699;all;Autauga County 170;Autauga;AL;36091;LINESTRING(-86.555861 32.704454,-86.555765 32.70461,-86.555434 32.705302,-86.554692 32.706787)\r\n134;136;even;Beth Manor Dr;Autauga;AL;36066;LINESTRING(-86.430952 32.448089,-86.430681 32.448099,-86.430486 32.448105)\r\n133;135;odd;Beth Manor Dr;Autauga;AL;36066;LINESTRING(-86.430961 32.448253,-86.430689 32.448265,-86.430492 32.448269)\r\n500;586;even;River Birch Dr;Autauga;AL;36067;LINESTRING(-86.475944 32.573376,-86.475929 32.573363,-86.47589 32.573331,-86.475847 32.573292,-86.475796 32.573253,-86.475743 32.573209,-86.475683 32.573167,-86.475622 32.573121,-86.475555 32.573078,-86.475489 32.573034,-86.475423 32.572987,-86.475363 32.57294,-86.47531 32.572891,-86.475272 32.572842,-86.475212 32.572724,-86.475196 32.572666,-86.475186 32.572595,-86.475193 32.57252,-86.475202 32.572438,-86.475214 32.572354,-86.475228 32.572268,-86.475245 32.572177,-86.47526 32.572084,-86.475272 32.57199,-86.475283 32.571892,-86.475288 32.571794,-86.475293 32.571696,-86.475291 32.571499,-86.47529 32.571401,-86.47529 32.571303,-86.475291 32.571206,-86.475293 32.571111,-86.475296 32.571014,-86.475297 32.570917,-86.475297 32.570818,-86.475289 32.570717,-86.475269 32.570616,-86.475237 32.570518,-86.475186 32.570426,-86.475121 32.570343,-86.475044 32.570267,-86.47495 32.570204,-86.474844 32.570157,-86.474734 32.570129,-86.474624 32.570113,-86.474514 32.570101,-86.474408 32.570088,-86.474301 32.570072,-86.474193 32.570054,-86.474083 32.570033,-86.474055 32.570027)\r\n501;595;odd;River Birch Dr;Autauga;AL;36067;LINESTRING(-86.475807 32.573494,-86.475791 32.573481,-86.475752 32.573447,-86.475709 32.573412,-86.475662 32.573373,-86.475611 32.573335,-86.475555 32.573293,-86.475496 32.573251,-86.475433 32.573208,-86.475365 32.573162,-86.475295 32.573115,-86.475223 32.573064,-86.475152 32.573003,-86.475086 32.572932,-86.475006 32.572776,-86.47499 32.572686,-86.474992 32.572595,-86.474993 32.572508,-86.475004 32.572418,-86.47502 32.57233,-86.475036 32.572244,-86.475051 32.572155,-86.475064 32.572064,-86.475076 32.571974,-86.475085 32.57188,-86.475092 32.571786,-86.475095 32.571694,-86.475095 32.571499,-86.475096 32.571401,-86.475096 32.571303,-86.475095 32.571204,-86.475097 32.571107,-86.4751 32.571012,-86.475101 32.570917,-86.475097 32.570826,-86.475087 32.570739,-86.475069 32.570656,-86.475041 32.57058,-86.475004 32.570512,-86.474955 32.570449,-86.474898 32.570397,-86.474834 32.570354,-86.474762 32.570321,-86.474682 32.570297,-86.47459 32.570279,-86.474488 32.570265,-86.474378 32.570254,-86.474263 32.570238,-86.474151 32.570216,-86.474037 32.570193,-86.474009 32.570187)\r\n509;501;all;N Memorial Dr;Autauga;AL;36067;LINESTRING(-86.451975 32.473383,-86.451952 32.472729)\r\n750;778;even;Summer Ln;Autauga;AL;36066;LINESTRING(-86.423131 32.456205,-86.423133 32.456205,-86.422938 32.456084,-86.422716 32.455968,-86.422562 32.455896,-86.422321 32.455801,-86.422075 32.455726,-86.421906 32.455683,-86.421735 32.455646,-86.42148 32.455597,-86.421304 32.455572,-86.421042 32.455554,-86.420702 32.455543,-86.420459 32.455517,-86.420309 32.455484,-86.42017 32.455433,-86.419975 32.455321,-86.419919 32.45528,-86.419752 32.455125,-86.419533 32.454895,-86.419492 32.454864)\r\n751;799;odd;Summer Ln;Autauga;AL;36066;LINESTRING(-86.423024 32.456343,-86.423021 32.456343,-86.422826 32.456226,-86.422616 32.456114,-86.422472 32.456048,-86.422243 32.455959,-86.422011 32.455886,-86.421852 32.455845,-86.421689 32.455808,-86.421442 32.455763,-86.42128 32.455742,-86.42103 32.455722,-86.420686 32.455715,-86.420421 32.455689,-86.420243 32.45565,-86.420068 32.455591,-86.419845 32.455459,-86.419775 32.4554,-86.4196 32.455235,-86.419381 32.455009,-86.419352 32.454978)\r\n1540;1548;even;US Hwy 31;Autauga;AL;36067;LINESTRING(-86.45518 32.529493,-86.455242 32.530165,-86.455327 32.531002)\r\n1501;1547;odd;US Hwy 31;Autauga;AL;36067;LINESTRING(-86.455374 32.529481,-86.455436 32.530151,-86.455521 32.530988)\r\n2200;2228;even;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.436473 32.559723,-86.436462 32.559735,-86.436278 32.559981,-86.436108 32.560237,-86.435878 32.560622,-86.435832 32.560709,-86.434494 32.563107,-86.434282 32.563502,-86.43415 32.56377,-86.434038 32.564045,-86.433943 32.56432,-86.433917 32.564432)\r\n2213;2235;odd;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.436635 32.559814,-86.436628 32.559825,-86.43645 32.560067,-86.436284 32.560317,-86.436056 32.560696,-86.436008 32.560779,-86.434672 32.563177,-86.434464 32.563568,-86.434338 32.56383,-86.434228 32.564097,-86.434137 32.564362,-86.434107 32.564467)\r\n519;501;all;Wesson Dr;Autauga;AL;36067;LINESTRING(-86.528755 32.466483,-86.528757 32.466528)\r\n2199;2087;all;Briarwood St;Autauga;AL;36066;LINESTRING(-86.416665 32.464841,-86.416339 32.465037)\r\n600;698;even;Bob Rd;Autauga;AL;36067;LINESTRING(-86.732663 32.501896,-86.732667 32.501928,-86.732686 32.501982,-86.732674 32.502045,-86.732443 32.502822,-86.732309 32.503168,-86.73229 32.503336,-86.732322 32.50343,-86.73239 32.503514,-86.732493 32.503577,-86.732601 32.5036,-86.73287 32.503636,-86.733386 32.50368,-86.733648 32.503712,-86.733834 32.503712,-86.734183 32.503683,-86.734369 32.50366)\r\n501;699;odd;Bob Rd;Autauga;AL;36067;LINESTRING(-86.732841 32.50183,-86.732877 32.501876,-86.732886 32.501976,-86.732882 32.502075,-86.732635 32.502868,-86.732517 32.503204,-86.7325 32.503316,-86.732518 32.503346,-86.73255 32.503382,-86.732593 32.503409,-86.732649 32.50343,-86.732898 32.503468,-86.733408 32.503514,-86.733662 32.503538,-86.733826 32.503542,-86.734161 32.503517,-86.734342 32.503497)\r\n1881;1899;all;Autauga County 85;Autauga;AL;36067;LINESTRING(-86.463942 32.532719,-86.463781 32.532728,-86.46362 32.532744,-86.463466 32.532769,-86.463233 32.532826,-86.46308 32.532876,-86.462935 32.532935,-86.462795 32.533003,-86.462584 32.533119,-86.46048 32.534345,-86.460447 32.534364)\r\n2850;3026;even;US Hwy 31;Autauga;AL;36051;LINESTRING(-86.490964 32.674432,-86.490936 32.675025,-86.490896 32.67719,-86.490883 32.678634,-86.490841 32.680798,-86.490802 32.683684,-86.490804 32.684698,-86.490825 32.685277,-86.490857 32.685859,-86.49093 32.686652,-86.490994 32.687229,-86.49107 32.687805,-86.491156 32.688379,-86.491235 32.688812,-86.491438 32.689814,-86.491612 32.690595,-86.49246 32.694211,-86.492621 32.69492,-86.492691 32.695274,-86.492748 32.695629,-86.492782 32.695914,-86.492804 32.696199,-86.492821 32.696556,-86.492824 32.696699,-86.492815 32.696985,-86.492789 32.697345,-86.492755 32.69763,-86.492709 32.697914,-86.49264 32.698266,-86.492571 32.698546,-86.492449 32.698963,-86.492331 32.699308,-86.492226 32.69958,-86.492112 32.699849,-86.491958 32.700183,-86.491891 32.700314,-86.491556 32.700894,-86.491425 32.701098,-86.491052 32.701737,-86.490628 32.702445,-86.490468 32.702701)\r\n2849;3045;odd;US Hwy 31;Autauga;AL;36051;LINESTRING(-86.491159 32.674438,-86.491134 32.675029,-86.491092 32.677192,-86.491079 32.678636,-86.491037 32.6808,-86.490998 32.683684,-86.491002 32.684696,-86.491021 32.685271,-86.491055 32.685849,-86.491126 32.686638,-86.49119 32.687213,-86.491266 32.687785,-86.491352 32.688355,-86.491429 32.688786,-86.491632 32.689784,-86.491804 32.690563,-86.492652 32.694179,-86.492815 32.69489,-86.492887 32.695248,-86.492946 32.695609,-86.49298 32.6959,-86.493002 32.696191,-86.493019 32.696552,-86.49302 32.696699,-86.493013 32.696993,-86.492987 32.697359,-86.492951 32.69765,-86.492905 32.697938,-86.492836 32.698296,-86.492765 32.698584,-86.492641 32.699007,-86.492521 32.699358,-86.492414 32.699634,-86.492298 32.699907,-86.492142 32.700247,-86.492071 32.700384,-86.491734 32.70097,-86.491601 32.701176,-86.491228 32.701811,-86.490804 32.702521,-86.49064 32.702779)\r\n1300;1302;even;Persimmon Pl;Autauga;AL;36067;LINESTRING(-86.534322 32.524215,-86.534416 32.524175,-86.534564 32.524083,-86.534707 32.52399,-86.534837 32.52388,-86.534948 32.523759,-86.535192 32.523472,-86.535296 32.523355)\r\n1301;1305;odd;Persimmon Pl;Autauga;AL;36067;LINESTRING(-86.534227 32.524071,-86.534306 32.524029,-86.534444 32.523949,-86.534571 32.52386,-86.534685 32.523764,-86.53479 32.523657,-86.535034 32.523374,-86.53514 32.523256)\r\n499;301;all;N Memorial Dr;Autauga;AL;36067;LINESTRING(-86.451937 32.472478,-86.451923 32.472323,-86.451839 32.471177,-86.451816 32.470948)\r\n199;151;odd;8th St;Autauga;AL;36067;LINESTRING(-86.474666 32.468967,-86.473641 32.468913)\r\n198;118;even;8th St;Autauga;AL;36067;LINESTRING(-86.474654 32.469131,-86.473629 32.469077)\r\n103;101;odd;Sycamore Dr;Autauga;AL;36066;LINESTRING(-86.444637 32.475803,-86.444649 32.475559,-86.444641 32.47519,-86.444632 32.475005)\r\n108;100;even;Sycamore Dr;Autauga;AL;36066;LINESTRING(-86.444443 32.475796,-86.444453 32.475557,-86.444445 32.475194,-86.444437 32.475011)\r\n413;401;odd;Bedford Ter;Autauga;AL;36066;LINESTRING(-86.441586 32.474629,-86.441883 32.474635,-86.442097 32.474626,-86.442194 32.474618,-86.442369 32.474575,-86.442456 32.474544,-86.442617 32.474478,-86.442694 32.474438,-86.442917 32.474319,-86.442941 32.474291)\r\n408;400;even;Bedford Ter;Autauga;AL;36066;LINESTRING(-86.44159 32.474464,-86.441879 32.474467,-86.442079 32.474456,-86.442152 32.474446,-86.442303 32.474411,-86.442374 32.474388,-86.442521 32.474328,-86.442588 32.474296,-86.442787 32.474179,-86.442809 32.474171)\r\n1510;1500;all;Onyx Dr;Autauga;AL;36067;LINESTRING(-86.494348 32.524916,-86.494333 32.524901,-86.494312 32.524844,-86.494035 32.524398,-86.493776 32.523941,-86.493697 32.523795,-86.493691 32.523625,-86.493742 32.523471,-86.49392 32.523045)\r\n1811;1801;odd;Tara Dr;Autauga;AL;36066;LINESTRING(-86.424025 32.453803,-86.425546 32.453803,-86.425882 32.453791)\r\n1812;1800;even;Tara Dr;Autauga;AL;36066;LINESTRING(-86.424025 32.453639,-86.425542 32.453635,-86.425875 32.453627)\r\n1490;1464;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.421689 32.435051,-86.42172 32.435067,-86.421974 32.43526,-86.422069 32.435326)\r\n100;198;even;Dale Dr;Autauga;AL;36067;LINESTRING(-86.474383 32.44202,-86.474183 32.441947,-86.473799 32.441787,-86.473194 32.441507,-86.473037 32.441439,-86.472795 32.441347,-86.47262 32.441302,-86.472354 32.441264,-86.472176 32.441257,-86.471666 32.441252,-86.471512 32.441253)\r\n101;199;odd;Dale Dr;Autauga;AL;36067;LINESTRING(-86.474308 32.442172,-86.474099 32.442101,-86.473707 32.441935,-86.473102 32.441655,-86.472953 32.441593,-86.472723 32.441511,-86.472572 32.441472,-86.47233 32.441436,-86.472168 32.441425,-86.471666 32.441418,-86.471513 32.441418)\r\n1699;1601;odd;Beaumont Dr;Autauga;AL;36022;LINESTRING(-86.41342 32.530458,-86.413302 32.530493,-86.412981 32.530655,-86.412793 32.530896,-86.412707 32.531542,-86.412706 32.532143,-86.412743 32.532308,-86.412835 32.532381,-86.412973 32.532433,-86.413079 32.532424)\r\n1600;1698;even;Beaumont Dr;Autauga;AL;36022;LINESTRING(-86.413495 32.53061,-86.413398 32.530651,-86.413143 32.530795,-86.413013 32.530964,-86.412913 32.531552,-86.41292 32.532121,-86.412953 32.53221,-86.412963 32.532223,-86.413025 32.532245,-86.413087 32.53226)\r\n198;118;all;Sheila Blvd;Autauga;AL;36066;LINESTRING(-86.427551 32.444133,-86.427805 32.443878,-86.427896 32.443797)\r\n501;599;odd;Wendy Valley Ln;Autauga;AL;36067;LINESTRING(-86.575629 32.492811,-86.575679 32.492781,-86.575792 32.492726,-86.575951 32.492685,-86.576121 32.492639,-86.576208 32.492609,-86.576363 32.492537,-86.576665 32.492389,-86.576813 32.492305,-86.576957 32.492211,-86.57714 32.492062,-86.577337 32.491932,-86.577356 32.491919)\r\n500;598;even;Wendy Valley Ln;Autauga;AL;36067;LINESTRING(-86.575483 32.492702,-86.575539 32.492631,-86.575714 32.492556,-86.575895 32.492523,-86.576051 32.492479,-86.576122 32.492453,-86.576267 32.492391,-86.576559 32.492245,-86.576695 32.492167,-86.576823 32.492081,-86.577006 32.49193,-86.577221 32.491796,-86.577245 32.491784)\r\n1371;1391;all;Autauga County 103;Autauga;AL;36758;LINESTRING(-86.901908 32.612743,-86.901859 32.613138,-86.901844 32.613276)\r\n1101;917;odd;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.47953 32.486067,-86.47955 32.485987,-86.479626 32.485705,-86.479671 32.485566,-86.479795 32.485219,-86.479902 32.484946,-86.480352 32.483922,-86.480491 32.483574,-86.480619 32.483224,-86.480781 32.482729,-86.480893 32.482297,-86.481004 32.48171,-86.481007 32.481677)\r\n1104;900;even;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.479339 32.486038,-86.479354 32.485953,-86.479434 32.485663,-86.479481 32.48552,-86.479607 32.485169,-86.479716 32.48489,-86.480166 32.483866,-86.480303 32.483522,-86.480429 32.483178,-86.480587 32.482689,-86.480697 32.482265,-86.480808 32.481686,-86.480814 32.481656)\r\n199;101;all;Cyrus Ct;Autauga;AL;36003;LINESTRING(-86.643856 32.437949,-86.643854 32.438165,-86.643844 32.438315,-86.643825 32.438463,-86.643779 32.438751,-86.643748 32.439041,-86.643424 32.441009)\r\n220;216;all;Deerwood Dr;Autauga;AL;36067;LINESTRING(-86.481258 32.456063,-86.48071 32.456065,-86.480424 32.456056)\r\n1199;1055;odd;Old Ridge Rd;Autauga;AL;36067;LINESTRING(-86.440561 32.495084,-86.440581 32.495083,-86.441084 32.495037,-86.441591 32.495001,-86.442439 32.494936,-86.443288 32.494882,-86.443347 32.494879)\r\n1098;1068;even;Old Ridge Rd;Autauga;AL;36066;LINESTRING(-86.440527 32.494921,-86.440553 32.494915,-86.441066 32.494871,-86.441575 32.494837,-86.442423 32.49477,-86.443276 32.494716,-86.443337 32.494714)\r\n100;198;even;Cottonwood Ct;Autauga;AL;36067;LINESTRING(-86.469085 32.471368,-86.468933 32.471314,-86.468668 32.471235)\r\n101;199;odd;Cottonwood Ct;Autauga;AL;36067;LINESTRING(-86.469011 32.47152,-86.468861 32.47147,-86.468603 32.47139)\r\n2499;2401;odd;Clyde Lee Dr;Autauga;AL;36022;LINESTRING(-86.482363 32.627592,-86.482315 32.627454,-86.482299 32.627331,-86.482314 32.627278,-86.482337 32.627217,-86.482547 32.626826,-86.482624 32.626703,-86.48269 32.626558,-86.482726 32.626479,-86.482748 32.626246,-86.482711 32.626085,-86.48261 32.625878,-86.482467 32.625611,-86.482341 32.625394,-86.482149 32.625307,-86.482106 32.625313)\r\n2498;2400;even;Clyde Lee Dr;Autauga;AL;36022;LINESTRING(-86.482181 32.627651,-86.482097 32.627494,-86.482093 32.627319,-86.482112 32.627228,-86.482151 32.627151,-86.482369 32.626754,-86.482438 32.626633,-86.4825 32.626502,-86.482516 32.626443,-86.482546 32.626256,-86.482511 32.626137,-86.482426 32.625944,-86.482287 32.625689,-86.482171 32.625538,-86.482073 32.625487,-86.482073 32.625475)\r\n3530;3558;even;State Rte 14;Autauga;AL;36003;LINESTRING(-86.783311 32.45823,-86.783542 32.458298,-86.78388 32.458387,-86.784216 32.458462,-86.784556 32.458529,-86.784896 32.458586,-86.785239 32.458632,-86.785584 32.458662,-86.785929 32.458685,-86.786703 32.45871,-86.787955 32.458743)\r\n3501;3599;odd;State Rte 14;Autauga;AL;36003;LINESTRING(-86.783375 32.458074,-86.783604 32.45814,-86.783934 32.458225,-86.784264 32.4583,-86.784598 32.458365,-86.78493 32.45842,-86.785265 32.458464,-86.785602 32.458496,-86.785941 32.458517,-86.786711 32.458544,-86.787961 32.458579)\r\n499;401;odd;Walker St;Autauga;AL;36066;LINESTRING(-86.450561 32.473443,-86.450519 32.472798)\r\n498;400;even;Walker St;Autauga;AL;36066;LINESTRING(-86.450367 32.473452,-86.450325 32.472807)\r\n800;898;even;Wingard St;Autauga;AL;36066;LINESTRING(-86.446005 32.458613,-86.446005 32.458594,-86.445929 32.458389,-86.445886 32.458191,-86.445898 32.458063,-86.445915 32.458012,-86.446023 32.45784,-86.446123 32.457743,-86.446311 32.457606,-86.446762 32.457311)\r\n751;899;odd;Wingard St;Autauga;AL;36066;LINESTRING(-86.445814 32.458647,-86.445807 32.458638,-86.445729 32.458431,-86.445682 32.458201,-86.445688 32.458037,-86.445711 32.457946,-86.445847 32.457734,-86.445979 32.457615,-86.446187 32.457474,-86.446644 32.457181)\r\n252;298;even;Autauga County 68;Autauga;AL;36022;LINESTRING(-86.472842 32.661019,-86.47262 32.661146,-86.472262 32.661332,-86.471664 32.661611,-86.471359 32.661732,-86.471045 32.66184,-86.470807 32.661915,-86.470485 32.662006,-86.47024 32.662069,-86.470079 32.662107,-86.46975 32.662173,-86.469417 32.662226,-86.469141 32.66226)\r\n251;299;odd;Autauga County 68;Autauga;AL;36022;LINESTRING(-86.472953 32.661155,-86.47273 32.661288,-86.472362 32.661478,-86.471756 32.661763,-86.471439 32.661888,-86.471117 32.661996,-86.470873 32.662073,-86.470545 32.662166,-86.470296 32.662229,-86.470129 32.662269,-86.469792 32.662339,-86.469449 32.662392,-86.469168 32.662423)\r\n1535;1599;odd;White Cloud Dr;Autauga;AL;36022;LINESTRING(-86.451518 32.539428,-86.451555 32.53936,-86.451586 32.539284,-86.451611 32.539208,-86.451635 32.539053,-86.451638 32.538832,-86.45164 32.538616,-86.451649 32.538401,-86.45165 32.538253,-86.451649 32.538176,-86.451634 32.538093,-86.451575 32.537946,-86.451435 32.537678,-86.451263 32.537344,-86.451216 32.537254,-86.451083 32.537198,-86.450947 32.537214,-86.450916 32.537237)\r\n1536;1598;even;White Cloud Dr;Autauga;AL;36022;LINESTRING(-86.451338 32.539364,-86.451367 32.5393,-86.451392 32.539236,-86.451409 32.539174,-86.451431 32.539039,-86.451442 32.53883,-86.451442 32.538612,-86.451451 32.538397,-86.451452 32.538257,-86.451445 32.538194,-86.451432 32.538135,-86.451385 32.538006,-86.451255 32.537744,-86.451081 32.537422,-86.451046 32.537392,-86.451045 32.537376,-86.451019 32.537388,-86.451003 32.537384)\r\n422;490;even;Autauga County 68 W;Autauga;AL;36022;LINESTRING(-86.527279 32.658618,-86.528416 32.658736)\r\n401;421;odd;Autauga County 68 W;Autauga;AL;36022;LINESTRING(-86.527303 32.658454,-86.52844 32.658572)\r\n120;130;even;Lina Dr;Autauga;AL;36067;LINESTRING(-86.454559 32.448242,-86.454235 32.448028,-86.45348 32.447532,-86.453425 32.447511)\r\n119;127;odd;Lina Dr;Autauga;AL;36067;LINESTRING(-86.454439 32.448372,-86.454115 32.448158,-86.453366 32.447678,-86.453329 32.447654)\r\n198;100;all;Tichnor Ave;Autauga;AL;36067;LINESTRING(-86.47539 32.460846,-86.475238 32.460833,-86.473824 32.460729)\r\n1899;1823;odd;Alpine Ln;Autauga;AL;36022;LINESTRING(-86.417116 32.580032,-86.416944 32.58001,-86.416771 32.580003,-86.41577 32.579907,-86.415716 32.579888,-86.415679 32.579864,-86.415648 32.579827,-86.415626 32.579773,-86.415525 32.579202,-86.415409 32.57856,-86.415376 32.57841,-86.41529 32.578243,-86.414977 32.578222,-86.414492 32.578247,-86.414306 32.578241,-86.41429 32.578231,-86.414228 32.578187,-86.414142 32.578077,-86.414078 32.57796,-86.413933 32.577523)\r\n1898;1856;even;Alpine Ln;Autauga;AL;36022;LINESTRING(-86.417092 32.580195,-86.416926 32.58018,-86.416755 32.580171,-86.41573 32.580081,-86.415616 32.58006,-86.415509 32.579994,-86.415448 32.579899,-86.415422 32.579809,-86.415331 32.579226,-86.415211 32.578592,-86.415172 32.57847,-86.415136 32.578423,-86.414971 32.578392,-86.414498 32.578417,-86.41428 32.578423,-86.41417 32.578407,-86.414056 32.578299,-86.413966 32.578159,-86.413878 32.578024,-86.413745 32.577564)\r\n500;582;even;Autauga County 64;Autauga;AL;36022;LINESTRING(-86.441442 32.641985,-86.44135 32.642012,-86.441035 32.642131,-86.440433 32.642394,-86.440283 32.642447,-86.44005 32.64251,-86.439809 32.642553,-86.439563 32.642583,-86.439231 32.642606,-86.438303 32.642626,-86.437462 32.64268,-86.436785 32.642702,-86.436524 32.642729,-86.436268 32.64278,-86.43602 32.642845,-86.434571 32.643268,-86.434249 32.64335,-86.434007 32.643402,-86.433845 32.64343,-86.433599 32.643461,-86.432841 32.643528,-86.432246 32.643587,-86.430898 32.643776,-86.430312 32.643867,-86.429219 32.644007,-86.428713 32.644059,-86.428459 32.644076,-86.428158 32.644114)\r\n501;599;odd;Autauga County 64;Autauga;AL;36022;LINESTRING(-86.441511 32.642139,-86.441426 32.642168,-86.441123 32.642283,-86.440519 32.642548,-86.440355 32.642609,-86.440102 32.642678,-86.439843 32.642719,-86.439585 32.642751,-86.439241 32.642774,-86.438313 32.642794,-86.437474 32.642846,-86.436803 32.642872,-86.43656 32.642899,-86.43632 32.642944,-86.436082 32.643005,-86.434633 32.643428,-86.434303 32.643512,-86.434051 32.643566,-86.433879 32.643596,-86.433623 32.643627,-86.432863 32.643692,-86.432274 32.643753,-86.430932 32.64394,-86.430344 32.644031,-86.429245 32.644173,-86.428733 32.644225,-86.428481 32.644244,-86.428185 32.644277)\r\n604;698;all;Vindale Rd;Autauga;AL;36067;LINESTRING(-86.463071 32.451253,-86.46301 32.451106,-86.462987 32.45104,-86.462951 32.450906,-86.462925 32.450767,-86.462867 32.450336,-86.462779 32.449392,-86.462784 32.449328,-86.462797 32.44927,-86.462797 32.44925)\r\n2752;2798;even;Autauga County 57;Autauga;AL;36051;LINESTRING(-86.533529 32.659074,-86.533541 32.659293,-86.533557 32.659442,-86.53358 32.659593,-86.533614 32.659742,-86.533682 32.65996,-86.533836 32.660309,-86.533993 32.660575,-86.53413 32.660763,-86.534551 32.661312,-86.535377 32.662418,-86.535977 32.663208,-86.536104 32.663386,-86.536285 32.663657)\r\n2753;2799;odd;Autauga County 57;Autauga;AL;36051;LINESTRING(-86.533724 32.659065,-86.533739 32.659281,-86.533755 32.659424,-86.533778 32.659565,-86.53381 32.659704,-86.533876 32.659908,-86.534024 32.660241,-86.534171 32.660493,-86.534298 32.660675,-86.534717 32.661224,-86.535543 32.66233,-86.536145 32.66312,-86.536276 32.663302,-86.536455 32.663577)\r\n858;800;even;Mallard Ln;Autauga;AL;36051;LINESTRING(-86.582614 32.600852,-86.582526 32.600846,-86.582413 32.600859,-86.582206 32.600869,-86.582098 32.600871,-86.581982 32.60087,-86.581527 32.600901,-86.581526 32.600901)\r\n873;801;odd;Mallard Ln;Autauga;AL;36051;LINESTRING(-86.582608 32.601016,-86.582534 32.601018,-86.582431 32.601027,-86.582212 32.601039,-86.5821 32.601037,-86.58199 32.60104,-86.581541 32.601065,-86.581538 32.601065)\r\n1547;1501;odd;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.546265 32.502617,-86.546243 32.502619,-86.545987 32.502665,-86.545647 32.502739,-86.544577 32.503026,-86.544085 32.503146,-86.54376 32.503209,-86.543595 32.503232,-86.543397 32.503253)\r\n1538;1500;even;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.5463 32.502779,-86.546281 32.502783,-86.546033 32.502829,-86.545703 32.502901,-86.544635 32.503186,-86.544135 32.50331,-86.543798 32.503377,-86.543621 32.503398,-86.543419 32.503416)\r\n211;201;odd;Gardner Rd;Autauga;AL;36067;LINESTRING(-86.47063 32.489239,-86.470317 32.489247,-86.469891 32.489247,-86.469639 32.489239,-86.469638 32.48924)\r\n198;176;even;Gardner Rd;Autauga;AL;36067;LINESTRING(-86.470638 32.489403,-86.470321 32.489415,-86.469887 32.489415,-86.469629 32.489405,-86.469625 32.489404)\r\n1099;1067;all;Walkers Lake Rd;Autauga;AL;36749;LINESTRING(-86.870401 32.574628,-86.870406 32.574539,-86.870408 32.574459,-86.870347 32.574174,-86.870326 32.573969,-86.870349 32.573546,-86.870368 32.573409,-86.870384 32.573345,-86.870406 32.573289,-86.870474 32.573166,-86.870572 32.573013)\r\n2799;2701;all;Dutch Island Cir;Autauga;AL;36003;LINESTRING(-86.679266 32.363285,-86.678971 32.363383,-86.67863 32.363474,-86.678203 32.363604,-86.677884 32.363723,-86.677604 32.363836,-86.677453 32.363904,-86.677193 32.364085,-86.677138 32.364113,-86.677062 32.364142,-86.676952 32.364165,-86.676842 32.364171,-86.676635 32.364161,-86.676258 32.364145,-86.676174 32.364125,-86.676115 32.364099,-86.676037 32.364046,-86.675907 32.363945,-86.675792 32.36388,-86.675668 32.363856,-86.675571 32.363845)\r\n936;946;all;Peachtree St;Autauga;AL;36066;LINESTRING(-86.446805 32.457023,-86.446739 32.456948,-86.446581 32.456801)\r\n300;302;all;Somerset Dr;Autauga;AL;36067;LINESTRING(-86.483542 32.525517,-86.483483 32.525561)\r\n2000;2018;all;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.551782 32.574108,-86.551817 32.574407,-86.551902 32.575263,-86.551955 32.575883)\r\n144;198;all;Guilford Ln;Autauga;AL;36066;LINESTRING(-86.436879 32.470699,-86.436846 32.470676)\r\n4367;4201;all;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.888279 32.591542,-86.887957 32.591513,-86.887608 32.591489)\r\n2700;2850;even;Autauga County 53;Autauga;AL;36006;LINESTRING(-86.648842 32.69122,-86.64847 32.691256,-86.647433 32.691341,-86.646589 32.691401,-86.64581 32.691429,-86.645465 32.691446,-86.645289 32.691463,-86.645116 32.691483,-86.64494 32.691515,-86.644769 32.691562,-86.644604 32.691625,-86.64445 32.691706,-86.644306 32.691795,-86.644039 32.69198,-86.643261 32.692539,-86.642275 32.693225,-86.641494 32.693775,-86.641363 32.693857,-86.641228 32.693929,-86.641086 32.69399,-86.640938 32.694038,-86.640615 32.694117,-86.640452 32.694167,-86.640288 32.694225,-86.640129 32.694293,-86.639973 32.694364,-86.639817 32.694442,-86.639673 32.694538,-86.639543 32.694642,-86.639425 32.694754,-86.639316 32.694874,-86.638876 32.695406,-86.638637 32.69571,-86.638547 32.695837,-86.638386 32.696096,-86.638063 32.696683,-86.637927 32.696948,-86.637868 32.697086,-86.63781 32.697228,-86.63778 32.697382,-86.637762 32.697536,-86.637762 32.697689,-86.637785 32.698275,-86.637802 32.698986,-86.637824 32.69948,-86.637828 32.699624,-86.637819 32.699912,-86.637808 32.700071,-86.637799 32.7002,-86.637778 32.700558,-86.63775 32.70084,-86.63773 32.700979,-86.637703 32.701115,-86.637585 32.701536,-86.63749 32.701814,-86.637383 32.702089,-86.637295 32.702289,-86.637282 32.702318)\r\n2701;2823;odd;Autauga County 53;Autauga;AL;36006;LINESTRING(-86.648865 32.691383,-86.648492 32.691422,-86.647451 32.691505,-86.646601 32.691569,-86.64582 32.691595,-86.645483 32.691614,-86.645315 32.691629,-86.645152 32.691651,-86.644994 32.691681,-86.644843 32.691724,-86.6447 32.691779,-86.644562 32.691848,-86.644428 32.691929,-86.644165 32.692108,-86.643387 32.692667,-86.642401 32.693353,-86.641618 32.693907,-86.641479 32.693999,-86.641328 32.694079,-86.64117 32.694148,-86.641002 32.6942,-86.640677 32.694279,-86.640524 32.694325,-86.640372 32.694379,-86.640221 32.694441,-86.640073 32.69451,-86.639935 32.694584,-86.639807 32.694668,-86.639689 32.694762,-86.639579 32.694864,-86.639476 32.694974,-86.63904 32.6955,-86.638805 32.6958,-86.638721 32.695919,-86.638564 32.69617,-86.638243 32.696751,-86.638113 32.69701,-86.638056 32.69714,-86.638012 32.69727,-86.63798 32.697406,-86.637964 32.697546,-86.637958 32.697687,-86.637981 32.698271,-86.637998 32.698982,-86.638022 32.699476,-86.638024 32.699624,-86.638017 32.69992,-86.638004 32.700081,-86.637995 32.700208,-86.637976 32.700568,-86.637948 32.700856,-86.637928 32.701003,-86.637901 32.701149,-86.637779 32.70158,-86.63768 32.701864,-86.637571 32.702145,-86.637479 32.702351,-86.637462 32.702382)\r\n1101;1199;all;Doster Rd;Autauga;AL;36067;LINESTRING(-86.442332 32.43961,-86.441784 32.439845,-86.441027 32.440185,-86.44041 32.440477)\r\n200;208;all;Leigh Dr;Autauga;AL;36067;LINESTRING(-86.447733 32.452482,-86.44778 32.452427,-86.44778 32.452329,-86.447754 32.451709)\r\n100;198;even;N Taylor St;Autauga;AL;36003;LINESTRING(-86.657092 32.431654,-86.657249 32.43187,-86.657543 32.432233,-86.65755 32.43224)\r\n101;199;odd;N Taylor St;Autauga;AL;36003;LINESTRING(-86.657257 32.431567,-86.657415 32.431778,-86.657707 32.432141,-86.657713 32.432151)\r\n1906;1998;all;Regent Rd;Autauga;AL;36066;LINESTRING(-86.417376 32.46626,-86.417293 32.466258,-86.417258 32.46626)\r\n100;198;even;Griffith Ave;Autauga;AL;36066;LINESTRING(-86.45088 32.476387,-86.450745 32.476312,-86.450587 32.476235,-86.450438 32.476185,-86.450308 32.47617,-86.45013 32.476162,-86.449872 32.47616,-86.449446 32.476165,-86.448879 32.476167)\r\n101;113;odd;Griffith Ave;Autauga;AL;36066;LINESTRING(-86.450776 32.476526,-86.450643 32.476458,-86.450499 32.476395,-86.450382 32.476359,-86.450284 32.476342,-86.450122 32.47633,-86.449872 32.476324,-86.449448 32.476331,-86.448879 32.476332)\r\n109;101;odd;Larry St;Autauga;AL;36067;LINESTRING(-86.487204 32.433408,-86.487144 32.433287,-86.487098 32.433158,-86.487021 32.432805,-86.486963 32.432506)\r\n110;100;even;Larry St;Autauga;AL;36067;LINESTRING(-86.487028 32.433479,-86.486946 32.433349,-86.4869 32.433196,-86.486829 32.432833,-86.486771 32.432532)\r\n1200;1298;all;Terrell;Autauga;AL;36749;LINESTRING(-86.878333 32.593635,-86.878313 32.593631,-86.878119 32.593471,-86.877724 32.593121,-86.877649 32.593036,-86.877639 32.592908,-86.877694 32.592805,-86.877765 32.592743,-86.87789 32.592627,-86.878038 32.592525,-86.87822 32.592447,-86.878423 32.592432,-86.878619 32.592443,-86.878723 32.592474,-86.878817 32.592527,-86.878891 32.592601,-86.878936 32.592685,-86.878974 32.592765,-86.87898 32.592857,-86.878977 32.592953,-86.878939 32.593038,-86.878891 32.593112,-86.878698 32.593356,-86.878666 32.593408,-86.878643 32.593458,-86.878627 32.593511,-86.87862 32.593522)\r\n411;499;all;New Moon Dr;Autauga;AL;36067;LINESTRING(-86.461658 32.456531,-86.461639 32.456497,-86.461602 32.456347,-86.46159 32.456267,-86.461589 32.456185,-86.461609 32.45598)\r\n2000;2004;all;Oak Brook Ln;Autauga;AL;36022;LINESTRING(-86.460474 32.671644,-86.460531 32.671755,-86.460653 32.67195,-86.46074 32.672077,-86.461008 32.672433,-86.461046 32.672493,-86.46105 32.672496)\r\n1147;1141;odd;Perrydale Loop;Autauga;AL;36066;LINESTRING(-86.441062 32.455123,-86.441026 32.455009,-86.440867 32.454593,-86.440604 32.453838,-86.440558 32.453721)\r\n1148;1138;even;Perrydale Loop;Autauga;AL;36066;LINESTRING(-86.440874 32.455167,-86.440836 32.455057,-86.440679 32.454643,-86.440416 32.453888,-86.440373 32.453772)\r\n2700;2798;even;Wynfrey Dr;Autauga;AL;36067;LINESTRING(-86.519918 32.442766,-86.519788 32.442782,-86.518252 32.442832,-86.517386 32.442793,-86.517336 32.442778,-86.51729 32.44276,-86.517241 32.442699,-86.517198 32.442605,-86.517199 32.442121)\r\n2701;2799;odd;Wynfrey Dr;Autauga;AL;36067;LINESTRING(-86.519959 32.442926,-86.519814 32.44296,-86.51825 32.442998,-86.51738 32.442961,-86.517234 32.442976,-86.517148 32.442874,-86.517045 32.442803,-86.516978 32.442635,-86.517004 32.442117)\r\n2499;2401;odd;Dutch Bend St;Autauga;AL;36003;LINESTRING(-86.656299 32.43544,-86.656288 32.435443,-86.655992 32.435589,-86.655703 32.435742,-86.655626 32.435776,-86.655205 32.436016,-86.655175 32.436036)\r\n2498;2400;even;Dutch Bend St;Autauga;AL;36003;LINESTRING(-86.656407 32.435577,-86.656394 32.435587,-86.656094 32.435733,-86.655805 32.43589,-86.65573 32.435924,-86.655317 32.436154,-86.655287 32.43617)\r\n1700;1706;all;Meadowbrook Dr;Autauga;AL;36066;LINESTRING(-86.424912 32.46866,-86.424656 32.468593,-86.424332 32.468498,-86.424156 32.46846,-86.424002 32.468458)\r\n142;154;even;Melmar Dr;Autauga;AL;36067;LINESTRING(-86.48492 32.484104,-86.484956 32.484056,-86.485 32.483944,-86.48518 32.483227,-86.485351 32.482524,-86.485365 32.482344,-86.485339 32.482181,-86.485298 32.482101,-86.485239 32.482004)\r\n141;199;odd;Melmar Dr;Autauga;AL;36067;LINESTRING(-86.484747 32.48403,-86.484764 32.483988,-86.484802 32.483898,-86.484988 32.483193,-86.485147 32.4825,-86.485163 32.482352,-86.485133 32.482227,-86.485112 32.482169,-86.485063 32.482075)\r\n227;299;all;Spring Valley Dr;Autauga;AL;36066;LINESTRING(-86.448372 32.517801,-86.448387 32.517815,-86.448397 32.517795,-86.448401 32.517802,-86.448324 32.51833,-86.448281 32.518379,-86.448231 32.518402,-86.4482 32.518422,-86.448161 32.518455,-86.448119 32.518466,-86.448077 32.518492,-86.448039 32.5185,-86.447988 32.518525,-86.447914 32.51854,-86.447836 32.518544,-86.447117 32.518539)\r\n1400;1410;all;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.488293 32.505305,-86.489644 32.506492)\r\n1506;1598;all;Autauga County 112;Autauga;AL;36067;LINESTRING(-86.65227 32.604155,-86.65242 32.60415,-86.652696 32.604128,-86.652907 32.604096,-86.652961 32.604092,-86.65355 32.603973,-86.654138 32.603873,-86.6543 32.603855,-86.654374 32.603848,-86.654447 32.603855,-86.654523 32.603864,-86.654685 32.603898,-86.654924 32.603966,-86.655236 32.604076,-86.655465 32.604168,-86.655609 32.604234,-86.655745 32.604308,-86.656079 32.604524,-86.656151 32.604565,-86.656231 32.604605,-86.656321 32.604634,-86.656411 32.604656,-86.656505 32.604676,-86.656602 32.604686,-86.656696 32.604689,-86.65739 32.604688,-86.658073 32.604704,-86.658236 32.604717,-86.658312 32.604729,-86.658385 32.604746,-86.658537 32.604797,-86.658998 32.604991,-86.659396 32.605142,-86.659641 32.605226,-86.65989 32.605299,-86.660142 32.605357,-86.660887 32.605511,-86.661551 32.605663,-86.6617 32.60569,-86.66172 32.605698,-86.661985 32.60573,-86.662164 32.605738,-86.662427 32.605733,-86.662935 32.605692,-86.663092 32.605684,-86.663249 32.605698,-86.663323 32.605708,-86.6634 32.605725,-86.663557 32.605771,-86.663782 32.605857,-86.663917 32.60592,-86.663946 32.605932)\r\n898;838;even;Simuel Ln;Autauga;AL;36067;LINESTRING(-86.581488 32.561263,-86.58147 32.561209,-86.581338 32.561175,-86.581235 32.56117,-86.581054 32.561166,-86.580596 32.561184)\r\n899;855;odd;Simuel Ln;Autauga;AL;36067;LINESTRING(-86.581325 32.561352,-86.581316 32.561371,-86.581286 32.561353,-86.581217 32.56134,-86.581054 32.56133,-86.580605 32.561348)\r\n2268;2298;even;Maul Dr;Autauga;AL;36006;LINESTRING(-86.702985 32.673039,-86.70301 32.673134,-86.703111 32.673552,-86.703182 32.673901,-86.703453 32.675191,-86.703519 32.675474,-86.703555 32.675615,-86.703715 32.676042)\r\n2261;2299;odd;Maul Dr;Autauga;AL;36006;LINESTRING(-86.703175 32.673002,-86.703202 32.673098,-86.703305 32.673522,-86.703374 32.673873,-86.703647 32.675161,-86.703713 32.67544,-86.703751 32.675571,-86.703901 32.675994)\r\n100;142;all;Wildwood Dr;Autauga;AL;36067;LINESTRING(-86.455503 32.464463,-86.45549 32.464006,-86.455491 32.463786)\r\n1732;1798;even;Twelve Oaks Ln;Autauga;AL;36066;LINESTRING(-86.42341 32.464266,-86.4239 32.464265,-86.424065 32.464257,-86.424301 32.464278,-86.424386 32.464303,-86.424475 32.464351,-86.424474 32.464341)\r\n1717;1799;odd;Twelve Oaks Ln;Autauga;AL;36066;LINESTRING(-86.423408 32.464102,-86.423894 32.464097,-86.424067 32.464091,-86.424341 32.464098,-86.424486 32.464133,-86.424611 32.464215,-86.424612 32.464225)\r\n2498;2412;all;Hollon Run Rd;Autauga;AL;36067;LINESTRING(-86.512042 32.605382,-86.512037 32.605397,-86.511725 32.605822,-86.51112 32.606525,-86.511062 32.606595)\r\n200;298;even;Woodley Ave;Autauga;AL;36066;LINESTRING(-86.450624 32.473645,-86.450823 32.473634,-86.451406 32.473608)\r\n201;299;odd;Woodley Ave;Autauga;AL;36066;LINESTRING(-86.450611 32.47348,-86.450811 32.473468,-86.451396 32.473444)\r\n750;784;all;Old Ridge Rd N;Autauga;AL;36066;LINESTRING(-86.417917 32.492456,-86.417926 32.491638,-86.417949 32.490844,-86.417942 32.490268,-86.417946 32.49016)\r\n4463;4401;all;Fischer Ln;Autauga;AL;36758;LINESTRING(-86.90199 32.612667,-86.90211 32.612651,-86.902277 32.612639,-86.902793 32.612632,-86.904841 32.612643)\r\n2194;2198;even;Airport Rd;Autauga;AL;36022;LINESTRING(-86.435409 32.610162,-86.435344 32.610162)\r\n2189;2199;odd;Airport Rd;Autauga;AL;36022;LINESTRING(-86.435409 32.610326,-86.435344 32.610326)\r\n1300;1306;even;Carson Dr;Autauga;AL;36067;LINESTRING(-86.478889 32.497233,-86.47896 32.497291,-86.479039 32.497275)\r\n1301;1305;odd;Carson Dr;Autauga;AL;36067;LINESTRING(-86.478994 32.497095,-86.479028 32.497095,-86.479039 32.497111)\r\n1401;1499;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.423324 32.436698,-86.422782 32.436292)\r\n1701;1779;odd;Alpine Dr;Autauga;AL;36022;LINESTRING(-86.417736 32.571852,-86.417765 32.571864,-86.417828 32.571882,-86.417889 32.571913,-86.417947 32.57195,-86.418002 32.571997,-86.418104 32.572097,-86.418153 32.572157,-86.418193 32.572212,-86.418257 32.572335,-86.418304 32.572463,-86.418342 32.572611,-86.418403 32.572889,-86.418446 32.573036,-86.418636 32.573512,-86.418702 32.573687,-86.418891 32.574202,-86.419115 32.574902,-86.419192 32.575112,-86.419419 32.575574,-86.419468 32.575704,-86.419503 32.575838,-86.419552 32.576126,-86.419581 32.576273,-86.419634 32.576419,-86.419667 32.576493,-86.419707 32.576563,-86.419802 32.576694,-86.419862 32.576758,-86.420045 32.576917,-86.42024 32.577066,-86.420384 32.577154,-86.42046 32.577196,-86.420541 32.577232,-86.420702 32.577299,-86.421032 32.577394,-86.421183 32.577447,-86.421253 32.577476,-86.421318 32.577511,-86.42137 32.577548,-86.421472 32.577644,-86.421509 32.577693,-86.421537 32.577749,-86.421553 32.577805,-86.421565 32.577864,-86.421558 32.577927,-86.421535 32.578062,-86.421469 32.57834,-86.421406 32.578546,-86.421357 32.578683,-86.421245 32.578952,-86.421154 32.579149,-86.421085 32.579272,-86.421048 32.579325,-86.421004 32.579372,-86.420894 32.579464,-86.420836 32.579502,-86.420774 32.579532,-86.420712 32.579553,-86.420564 32.57958,-86.420403 32.579591,-86.420328 32.579588,-86.420167 32.579572,-86.420005 32.579542,-86.419846 32.579504,-86.419437 32.579391,-86.41918 32.579339,-86.419006 32.579311,-86.418658 32.579281,-86.418229 32.579268,-86.4178 32.57927,-86.417548 32.579279,-86.417403 32.579291)\r\n1600;1798;even;Alpine Dr;Autauga;AL;36022;LINESTRING(-86.417764 32.571689,-86.417821 32.571688,-86.41792 32.571724,-86.418009 32.571767,-86.418085 32.571822,-86.418154 32.571881,-86.418256 32.571993,-86.418325 32.572057,-86.418375 32.572132,-86.418453 32.572273,-86.418502 32.572423,-86.418534 32.572579,-86.418599 32.572853,-86.41864 32.572988,-86.418824 32.57346,-86.418888 32.573637,-86.419081 32.574156,-86.419305 32.574854,-86.419382 32.575054,-86.419609 32.575514,-86.419664 32.57566,-86.419701 32.575808,-86.419748 32.576098,-86.419781 32.576233,-86.419826 32.576365,-86.419853 32.576425,-86.419885 32.576479,-86.41997 32.576594,-86.420016 32.576644,-86.420185 32.576795,-86.420368 32.576932,-86.420498 32.577014,-86.420564 32.57705,-86.420631 32.577082,-86.42078 32.577139,-86.421102 32.577236,-86.421269 32.577289,-86.421351 32.577328,-86.421432 32.577367,-86.421514 32.577416,-86.42164 32.577538,-86.421693 32.577611,-86.421735 32.577691,-86.421761 32.577775,-86.421763 32.577862,-86.421762 32.577945,-86.421729 32.578092,-86.421665 32.578378,-86.421596 32.578592,-86.421547 32.578735,-86.421431 32.57901,-86.42134 32.579215,-86.421265 32.579352,-86.42122 32.579419,-86.421162 32.57949,-86.421028 32.579594,-86.420954 32.579644,-86.42087 32.57969,-86.420774 32.579725,-86.42059 32.579754,-86.420409 32.579761,-86.420314 32.579764,-86.420131 32.57974,-86.419955 32.579706,-86.419788 32.579662,-86.419383 32.579555,-86.419138 32.579505,-86.418978 32.579481,-86.418644 32.579451,-86.418225 32.579436,-86.417804 32.579438,-86.41756 32.579447,-86.417419 32.579455)\r\n100;198;even;Waverly Ct;Autauga;AL;36067;LINESTRING(-86.485464 32.484819,-86.485429 32.484855,-86.48523 32.485062)\r\n701;799;odd;Waverly Ct;Autauga;AL;36067;LINESTRING(-86.485619 32.484919,-86.485585 32.484959,-86.485381 32.485167)\r\n199;101;odd;Chatam Ln;Autauga;AL;36066;LINESTRING(-86.442348 32.471509,-86.442386 32.471524,-86.442536 32.47157,-86.442655 32.471594,-86.442808 32.471606,-86.443069 32.471603,-86.443235 32.471599)\r\n198;100;even;Chatam Ln;Autauga;AL;36066;LINESTRING(-86.442421 32.471356,-86.442456 32.471366,-86.442592 32.471404,-86.442689 32.471422,-86.442818 32.471434,-86.443067 32.471437,-86.443231 32.471435)\r\n3101;3181;all;State Rte 14;Autauga;AL;36003;LINESTRING(-86.710312 32.446893,-86.711068 32.447113,-86.711722 32.447291,-86.712381 32.447459,-86.712713 32.44754,-86.713713 32.447761,-86.714548 32.447932,-86.715894 32.448181,-86.717154 32.448419,-86.717575 32.448494,-86.721605 32.449247)\r\n206;200;all;Deer Trce;Autauga;AL;36067;LINESTRING(-86.473927 32.453003,-86.473813 32.452996,-86.473741 32.452999,-86.473507 32.453033,-86.4732 32.453137,-86.47289 32.453275)\r\n906;998;all;Autauga County 113;Autauga;AL;36067;LINESTRING(-86.59526 32.530091,-86.595277 32.530102,-86.595451 32.530133,-86.595706 32.530175,-86.596214 32.530237,-86.596523 32.530282,-86.596715 32.530312,-86.59696 32.530357,-86.597115 32.530397,-86.597429 32.530499,-86.597742 32.530614,-86.598285 32.530825,-86.598429 32.530891,-86.598643 32.531005,-86.598795 32.531084,-86.59888 32.531116,-86.598967 32.53114,-86.599059 32.531165,-86.599157 32.531176,-86.599337 32.531175,-86.599594 32.531159,-86.599708 32.531154)\r\n700;1098;even;Durden Ct;Autauga;AL;36067;LINESTRING(-86.487565 32.482664,-86.487583 32.482666,-86.487842 32.482679,-86.488045 32.482665,-86.488202 32.482588,-86.488263 32.482574,-86.488325 32.482568,-86.488398 32.482576,-86.488414 32.482576)\r\n701;799;odd;Durden Ct;Autauga;AL;36067;LINESTRING(-86.487563 32.4825,-86.487587 32.482498,-86.487834 32.482509,-86.487975 32.482483,-86.48812 32.482422,-86.488227 32.482392,-86.488337 32.482394,-86.488436 32.482408,-86.48846 32.482416)\r\n719;701;all;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.470835 32.474441,-86.470811 32.474307,-86.470753 32.473951,-86.47073 32.473773)\r\n1626;1698;even;Keith Ln;Autauga;AL;36067;LINESTRING(-86.472446 32.541312,-86.472445 32.541356,-86.472554 32.541495,-86.472623 32.541554,-86.472751 32.541657,-86.472834 32.541722,-86.472867 32.541765,-86.47289 32.541788)\r\n1627;1699;odd;Keith Ln;Autauga;AL;36067;LINESTRING(-86.472635 32.541273,-86.472651 32.541282,-86.472722 32.541387,-86.472767 32.541434,-86.472885 32.541529,-86.47299 32.541596,-86.473071 32.541679,-86.473077 32.541744)\r\n554;550;all;Jasmine Trl;Autauga;AL;36066;LINESTRING(-86.42725 32.473455,-86.427224 32.473421,-86.427235 32.473186,-86.427238 32.473152)\r\n1500;1530;even;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.497584 32.51351,-86.497889 32.513926,-86.499368 32.515971,-86.500562 32.517606)\r\n1501;1521;odd;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.49775 32.513424,-86.498055 32.51384,-86.499534 32.515885,-86.500728 32.51752)\r\n1100;1198;even;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.453865 32.493311,-86.45391 32.493541,-86.454063 32.494179,-86.454432 32.49568,-86.455104 32.498418,-86.455458 32.499826,-86.455976 32.501942,-86.456105 32.502459)\r\n1237;1315;odd;US Hwy 31;Autauga;AL;36067;LINESTRING(-86.454057 32.493283,-86.454104 32.493511,-86.454255 32.494145,-86.454622 32.495646,-86.455294 32.498384,-86.455648 32.499792,-86.456166 32.501908,-86.456295 32.502425)\r\n199;101;odd;Patti Loop;Autauga;AL;36066;LINESTRING(-86.428103 32.443617,-86.428099 32.443592,-86.427997 32.443455,-86.427871 32.443338,-86.427751 32.443242,-86.427667 32.443141,-86.427648 32.443097,-86.427638 32.44305,-86.427653 32.442999,-86.427803 32.442675,-86.427839 32.442629,-86.427881 32.442593,-86.427932 32.442565,-86.42799 32.442549,-86.428046 32.44254,-86.428101 32.442556,-86.428161 32.442578,-86.428222 32.442614,-86.428924 32.443135,-86.428979 32.443182,-86.429021 32.443229,-86.429053 32.443277,-86.429077 32.44333,-86.429095 32.443389,-86.429098 32.443396)\r\n198;100;even;Patti Loop;Autauga;AL;36066;LINESTRING(-86.427922 32.443678,-86.427911 32.443672,-86.427829 32.443561,-86.427725 32.44346,-86.427593 32.443362,-86.427475 32.443229,-86.427432 32.443137,-86.42743 32.443036,-86.427455 32.442947,-86.427615 32.442597,-86.427667 32.442517,-86.427745 32.442449,-86.42784 32.442401,-86.427946 32.442369,-86.428062 32.442366,-86.428179 32.442384,-86.428269 32.44243,-86.428348 32.442478,-86.429058 32.443011,-86.429127 32.443064,-86.429195 32.443127,-86.429247 32.443205,-86.429275 32.443286,-86.429289 32.443357,-86.42929 32.443367)\r\n1300;1398;all;Moten Rd;Autauga;AL;36749;LINESTRING(-86.879004 32.596434,-86.879088 32.596651,-86.879156 32.596856,-86.879182 32.59699,-86.879211 32.597339,-86.879218 32.597477,-86.879212 32.597764,-86.879202 32.59798,-86.879211 32.598275,-86.879228 32.598423,-86.879265 32.59864,-86.879353 32.599069,-86.879368 32.599206,-86.87937 32.599342,-86.879359 32.599483,-86.879326 32.599698,-86.879315 32.599987,-86.879315 32.600204,-86.879346 32.600418,-86.879353 32.600561,-86.879333 32.601149,-86.879334 32.601298,-86.879363 32.601589,-86.879375 32.601803,-86.879372 32.602089,-86.879391 32.602303,-86.879395 32.602445,-86.87938 32.602876,-86.87938 32.603225,-86.87937 32.603572,-86.879383 32.603785,-86.879398 32.603918,-86.879427 32.604029,-86.879548 32.604103,-86.879672 32.604108,-86.879774 32.604108,-86.87987 32.604087,-86.879958 32.604054,-86.879983 32.604039)\r\n546;584;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.450981 32.46084,-86.450975 32.460574,-86.450964 32.460469)\r\n1100;1496;even;Autauga County 79;Autauga;AL;36006;LINESTRING(-86.705911 32.536016,-86.705989 32.536094,-86.706089 32.536204,-86.70618 32.536321,-86.706261 32.53644,-86.70637 32.53663,-86.706497 32.536894,-86.706579 32.537095,-86.706649 32.537301,-86.706746 32.53765,-86.706825 32.538004,-86.706874 32.538288,-86.706959 32.538938,-86.707009 32.5393,-86.707049 32.539522,-86.707239 32.54016,-86.707327 32.540443,-86.707434 32.540723,-86.707525 32.540933,-86.707636 32.541136,-86.707765 32.54133,-86.707988 32.54164,-86.70846 32.542329,-86.708911 32.543027,-86.709428 32.543863,-86.709799 32.544438,-86.710285 32.545123,-86.710488 32.54544,-86.710597 32.545631,-86.71073 32.545893,-86.710848 32.546161,-86.710922 32.546364,-86.710982 32.54657,-86.711028 32.546778,-86.711073 32.547062,-86.711099 32.547347,-86.711129 32.548069,-86.711153 32.549445,-86.711156 32.550315,-86.711179 32.550896,-86.711186 32.551404,-86.711212 32.55242,-86.711204 32.552776,-86.711186 32.552909,-86.711171 32.552972,-86.711124 32.553102,-86.710936 32.553504,-86.710728 32.553982,-86.710647 32.554193,-86.710579 32.554408,-86.710532 32.554628,-86.710477 32.555063,-86.710378 32.555707,-86.710309 32.556062,-86.710209 32.556484,-86.710141 32.556794)\r\n1345;1497;odd;Autauga County 79;Autauga;AL;36006;LINESTRING(-86.706056 32.535906,-86.706145 32.535986,-86.706253 32.536106,-86.706352 32.536231,-86.706439 32.53636,-86.706554 32.536562,-86.706685 32.536834,-86.706769 32.537045,-86.706841 32.537259,-86.70694 32.537616,-86.707021 32.537976,-86.70707 32.538268,-86.707153 32.53892,-86.707205 32.539276,-86.707247 32.539488,-86.707429 32.540118,-86.707519 32.540395,-86.707622 32.540667,-86.707711 32.540867,-86.707816 32.541058,-86.707937 32.541246,-86.708158 32.541556,-86.708632 32.542247,-86.709085 32.542949,-86.709602 32.543785,-86.709971 32.544354,-86.710459 32.545039,-86.710664 32.545364,-86.710779 32.545561,-86.710916 32.545831,-86.711038 32.546107,-86.711116 32.546318,-86.711178 32.546534,-86.711226 32.546752,-86.711271 32.547044,-86.711297 32.547337,-86.711325 32.548065,-86.711349 32.549443,-86.711354 32.550313,-86.711375 32.550892,-86.711382 32.551402,-86.711408 32.552418,-86.711408 32.552786,-86.711388 32.552937,-86.711367 32.553016,-86.711314 32.55316,-86.71112 32.553564,-86.710916 32.554036,-86.710839 32.554241,-86.710777 32.554444,-86.710732 32.554652,-86.710673 32.555083,-86.710574 32.555731,-86.710505 32.556092,-86.710401 32.556516,-86.710333 32.556824)\r\n612;698;even;McQueen Village Rd;Autauga;AL;36066;LINESTRING(-86.418474 32.463215,-86.418514 32.463236,-86.418613 32.463252,-86.418712 32.463247,-86.419397 32.463234,-86.419999 32.463241,-86.420341 32.46323,-86.420591 32.463237,-86.420713 32.463237,-86.420845 32.463142,-86.42084 32.462975,-86.420699 32.462892,-86.420576 32.462888,-86.420057 32.462894,-86.419723 32.462885,-86.419199 32.4629,-86.418785 32.462898,-86.418618 32.462891,-86.418485 32.462886,-86.418423 32.462951)\r\n619;699;odd;McQueen Village Rd;Autauga;AL;36066;LINESTRING(-86.418545 32.463062,-86.418574 32.463064,-86.418635 32.463074,-86.418712 32.463081,-86.419397 32.463068,-86.419997 32.463075,-86.420339 32.463064,-86.420581 32.463065,-86.420619 32.463049,-86.420615 32.463056,-86.420612 32.463081,-86.420611 32.463078,-86.420562 32.463062,-86.420053 32.463062,-86.419723 32.463049,-86.419203 32.463068,-86.418779 32.463068,-86.41862 32.463057,-86.418579 32.463076,-86.418548 32.463077)\r\n900;998;even;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.471581 32.439763,-86.471759 32.439638,-86.471821 32.439595)\r\n885;899;odd;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.471456 32.439638,-86.471633 32.43951,-86.471698 32.439467)\r\n600;698;even;McKetchen Rd;Autauga;AL;36067;LINESTRING(-86.488135 32.449234,-86.488129 32.449222,-86.488072 32.449236,-86.487909 32.449236,-86.48678 32.449144,-86.486599 32.449142,-86.486501 32.449151,-86.486332 32.449195,-86.48617 32.449249,-86.485944 32.44939,-86.485816 32.44949,-86.48575 32.449554,-86.48565 32.449677,-86.485608 32.44973,-86.485568 32.449762,-86.48552 32.449787,-86.48546 32.449799,-86.485404 32.449799,-86.485352 32.449788,-86.48528 32.44976,-86.485062 32.449643,-86.485031 32.449608,-86.485015 32.449616)\r\n601;699;odd;McKetchen Rd;Autauga;AL;36067;LINESTRING(-86.488228 32.449378,-86.488199 32.449406,-86.488084 32.44941,-86.487899 32.449408,-86.48677 32.449316,-86.486611 32.449316,-86.486545 32.449325,-86.4864 32.449359,-86.486276 32.449407,-86.486074 32.449526,-86.485962 32.449612,-86.485912 32.44966,-86.485824 32.449767,-86.485784 32.44984,-86.485702 32.449914,-86.485596 32.449957,-86.485488 32.449981,-86.485374 32.449983,-86.48527 32.449954,-86.485178 32.449906,-86.484948 32.449785,-86.484837 32.44973,-86.484832 32.449673)\r\n1075;1059;all;Arrowhead Dr;Autauga;AL;36067;LINESTRING(-86.52525 32.45902,-86.525324 32.459013,-86.526787 32.458902,-86.527207 32.458867,-86.527467 32.458828,-86.527564 32.458793,-86.52773 32.458709,-86.527924 32.458539,-86.527986 32.458393)\r\n200;298;even;Autauga County 64;Autauga;AL;36022;LINESTRING(-86.476832 32.627347,-86.476674 32.627492,-86.476178 32.627991,-86.475954 32.628208,-86.47547 32.628716,-86.475031 32.629159,-86.47447 32.629704,-86.474353 32.629814)\r\n201;225;odd;Autauga County 64;Autauga;AL;36022;LINESTRING(-86.476976 32.627458,-86.476824 32.627602,-86.476328 32.628099,-86.476106 32.628316,-86.475622 32.628822,-86.475181 32.629267,-86.474618 32.629814,-86.474497 32.629925)\r\n1364;1436;even;Autauga County 43;Autauga;AL;36067;LINESTRING(-86.612662 32.582776,-86.612662 32.583032,-86.612678 32.583755,-86.612678 32.584118,-86.612694 32.584844,-86.612693 32.585567,-86.612716 32.58701,-86.612717 32.587733,-86.612711 32.588241,-86.612713 32.588389,-86.612733 32.588538,-86.612769 32.588688,-86.612826 32.588834,-86.612899 32.588972,-86.613061 32.589233,-86.61323 32.589484,-86.613308 32.589609,-86.613379 32.589734,-86.613442 32.589865,-86.613495 32.589998,-86.613534 32.59011,-86.613582 32.590274,-86.613821 32.591189,-86.614148 32.5926,-86.614366 32.593487)\r\n1371;1433;odd;Autauga County 43;Autauga;AL;36067;LINESTRING(-86.612857 32.582775,-86.612858 32.58303,-86.612874 32.583753,-86.612874 32.584116,-86.61289 32.584842,-86.612889 32.585565,-86.612912 32.587008,-86.612913 32.587733,-86.612907 32.588239,-86.612915 32.588377,-86.612933 32.58851,-86.612967 32.588644,-86.613016 32.588772,-86.613081 32.588898,-86.613235 32.589153,-86.613404 32.589404,-86.613486 32.589533,-86.613561 32.589666,-86.61363 32.589805,-86.613689 32.589948,-86.613722 32.590068,-86.613776 32.590234,-86.614015 32.591155,-86.61434 32.592568,-86.614557 32.593453)\r\n531;513;odd;Old Mill Way;Autauga;AL;36067;LINESTRING(-86.449719 32.428043,-86.449723 32.428043,-86.449774 32.427999,-86.449828 32.427953,-86.449927 32.427865,-86.449975 32.427822,-86.450025 32.427778,-86.450071 32.427733,-86.450115 32.427691,-86.450159 32.427649,-86.450245 32.427569,-86.450287 32.427532,-86.450361 32.427473,-86.450408 32.427439,-86.45045 32.42741,-86.450471 32.427394)\r\n532;518;even;Old Mill Way;Autauga;AL;36067;LINESTRING(-86.449577 32.427932,-86.449581 32.427925,-86.449636 32.427881,-86.449688 32.427837,-86.449785 32.427751,-86.449833 32.427708,-86.449879 32.427666,-86.449925 32.427623,-86.449969 32.427581,-86.450013 32.427539,-86.450101 32.427455,-86.450147 32.427414,-86.450227 32.427347,-86.450282 32.427307,-86.450326 32.42728,-86.450347 32.427267)\r\n2000;2010;even;Wynfield Dr;Autauga;AL;36067;LINESTRING(-86.513289 32.449638,-86.513273 32.44936,-86.513231 32.44907,-86.51322 32.448928,-86.513228 32.448716,-86.513298 32.448134,-86.513312 32.447911,-86.513311 32.447759,-86.513298 32.447608,-86.513241 32.447278)\r\n2001;2009;odd;Wynfield Dr;Autauga;AL;36067;LINESTRING(-86.513095 32.449648,-86.513073 32.449376,-86.513029 32.449084,-86.513024 32.44893,-86.513026 32.448706,-86.5131 32.44812,-86.513114 32.447907,-86.513111 32.447767,-86.513098 32.447626,-86.513048 32.4473)\r\n2307;2301;odd;Autauga County 46;Autauga;AL;36067;LINESTRING(-86.61816 32.519694,-86.617212 32.519935,-86.617111 32.519989)\r\n2306;2300;even;Autauga County 46;Autauga;AL;36067;LINESTRING(-86.618217 32.519851,-86.617294 32.520101,-86.617203 32.520134)\r\n1708;1798;all;Autauga County 128;Autauga;AL;36067;LINESTRING(-86.673886 32.625347,-86.674072 32.625306,-86.674292 32.625265,-86.674421 32.625285,-86.674556 32.625328,-86.674835 32.625466,-86.674898 32.625493,-86.675284 32.625669,-86.675444 32.625735,-86.675615 32.625787,-86.675791 32.625818,-86.675968 32.625837,-86.676142 32.625847,-86.676316 32.62585,-86.678277 32.62585,-86.678625 32.625838,-86.678798 32.625823,-86.679134 32.625783,-86.679636 32.625736,-86.679796 32.625729,-86.679959 32.625737,-86.680121 32.625753,-86.680283 32.625777,-86.680445 32.625809,-86.6811 32.625953,-86.681517 32.626059,-86.681764 32.626117,-86.681936 32.626149,-86.682111 32.626176,-86.682458 32.626223,-86.682633 32.626241,-86.682809 32.626252,-86.682985 32.626255,-86.683817 32.626206,-86.684499 32.626185,-86.684848 32.62617,-86.685201 32.626132,-86.685376 32.626108,-86.685662 32.626055,-86.685713 32.626048,-86.685876 32.626027,-86.686212 32.626001,-86.68664 32.625984,-86.68681 32.625981,-86.686978 32.625986,-86.686996 32.625984)\r\n115;101;odd;Alecia Dr;Autauga;AL;36066;LINESTRING(-86.428938 32.449565,-86.429196 32.449353,-86.429353 32.449146,-86.429393 32.448906,-86.429391 32.448538,-86.429389 32.448329)\r\n112;100;even;Alecia Dr;Autauga;AL;36066;LINESTRING(-86.428799 32.44945,-86.429026 32.449241,-86.429139 32.449078,-86.429185 32.44889,-86.429197 32.448538,-86.429195 32.44833)\r\n2251;2255;all;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.470189 32.608553,-86.470225 32.608574)\r\n2200;2286;even;Autauga County 21;Autauga;AL;36091;LINESTRING(-86.605232 32.686451,-86.605208 32.686708,-86.6052 32.687072,-86.605212 32.687367,-86.605257 32.687662,-86.60531 32.687879,-86.605401 32.688165,-86.605535 32.688511,-86.60655 32.691031,-86.606668 32.691444,-86.606713 32.691795,-86.606711 32.692003,-86.606649 32.692493,-86.606494 32.693127,-86.606415 32.693485,-86.606366 32.693775,-86.606349 32.693997,-86.606347 32.694217,-86.606367 32.694515,-86.606461 32.694952,-86.606906 32.696353,-86.606987 32.696564,-86.607194 32.696971,-86.607354 32.697234,-86.60758 32.697545,-86.608117 32.698162)\r\n2201;2287;odd;Autauga County 21;Autauga;AL;36091;LINESTRING(-86.605426 32.686463,-86.605408 32.686716,-86.605396 32.68707,-86.605414 32.687353,-86.605457 32.687634,-86.605506 32.687841,-86.605593 32.688117,-86.605721 32.688459,-86.606746 32.690983,-86.606872 32.691414,-86.606917 32.691787,-86.606915 32.692013,-86.606851 32.692521,-86.606688 32.693159,-86.606611 32.693511,-86.606566 32.693793,-86.606549 32.694003,-86.606547 32.694213,-86.606571 32.694495,-86.606659 32.694914,-86.607098 32.696305,-86.607177 32.696504,-86.607376 32.696899,-86.60753 32.69715,-86.607748 32.697449,-86.608275 32.698065)\r\n446;498;even;Cargill St;Autauga;AL;36067;LINESTRING(-86.488714 32.47784,-86.488721 32.478287,-86.488746 32.478653,-86.488734 32.478707,-86.488747 32.478711)\r\n447;499;odd;Cargill St;Autauga;AL;36067;LINESTRING(-86.488909 32.477837,-86.488919 32.478281,-86.488946 32.478649,-86.488956 32.478741,-86.48893 32.478768)\r\n300;398;even;Lanes End;Autauga;AL;36067;LINESTRING(-86.481671 32.520241,-86.48169 32.520485,-86.481718 32.520567,-86.481914 32.520982,-86.481972 32.521056,-86.482042 32.521118,-86.48224 32.521253,-86.482287 32.521297,-86.482329 32.521346,-86.482406 32.521464,-86.482616 32.521853,-86.48271 32.522048,-86.482732 32.522108,-86.482747 32.52217,-86.482774 32.522378,-86.482826 32.523024,-86.482836 32.523239,-86.48283 32.523522,-86.482794 32.5241,-86.482792 32.524681,-86.482804 32.524913,-86.482873 32.525067,-86.482971 32.525201,-86.483081 32.525322,-86.483142 32.525382,-86.483207 32.52544,-86.483242 32.52546)\r\n301;399;odd;Lanes End;Autauga;AL;36067;LINESTRING(-86.481865 32.520226,-86.481898 32.520453,-86.481914 32.520511,-86.482102 32.520898,-86.482138 32.520946,-86.482184 32.52099,-86.482382 32.521125,-86.482451 32.521187,-86.482503 32.521256,-86.482586 32.521388,-86.482796 32.521787,-86.482902 32.521988,-86.48293 32.522066,-86.482947 32.522144,-86.482972 32.522364,-86.483024 32.523016,-86.483032 32.523237,-86.483028 32.523528,-86.482994 32.524104,-86.482994 32.524675,-86.483018 32.524875,-86.483065 32.524991,-86.483141 32.525105,-86.483237 32.525216,-86.48329 32.525268,-86.483345 32.525314,-86.483368 32.525335)\r\n824;820;all;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.469479 32.483245,-86.469472 32.482977,-86.469464 32.482115)\r\n200;222;even;Lewis St;Autauga;AL;36067;LINESTRING(-86.471294 32.434355,-86.471207 32.434353,-86.471107 32.434356,-86.470924 32.434401,-86.470684 32.434481,-86.470612 32.434497,-86.470592 32.434504)\r\n201;899;odd;Lewis St;Autauga;AL;36067;LINESTRING(-86.471297 32.434519,-86.471217 32.434523,-86.471143 32.434532,-86.47099 32.434565,-86.470748 32.434649,-86.470648 32.434669,-86.470614 32.434667)\r\n2594;2624;even;Autauga County 85;Autauga;AL;36022;LINESTRING(-86.428267 32.604634,-86.428162 32.604774,-86.428083 32.605073,-86.428051 32.605296,-86.428032 32.605516,-86.427961 32.606452,-86.427916 32.606956,-86.427853 32.607749,-86.42782 32.608252,-86.427805 32.608396,-86.427767 32.608674,-86.427715 32.608919)\r\n2597;2639;odd;Autauga County 85;Autauga;AL;36022;LINESTRING(-86.428437 32.604714,-86.428366 32.604842,-86.428285 32.605105,-86.428249 32.605314,-86.428228 32.605528,-86.428157 32.606464,-86.428112 32.606968,-86.428049 32.607759,-86.428018 32.608264,-86.427999 32.608412,-86.427969 32.6087,-86.427907 32.608951)\r\n1299;1201;odd;Camellia Woods Ct;Autauga;AL;36067;LINESTRING(-86.460575 32.472288,-86.460606 32.472253,-86.460707 32.472136,-86.460841 32.471953,-86.460993 32.471807,-86.461075 32.471761,-86.461178 32.471732,-86.461222 32.47172,-86.461312 32.471732,-86.461328 32.47173)\r\n1298;1200;even;Camellia Woods Ct;Autauga;AL;36067;LINESTRING(-86.46041 32.472202,-86.460438 32.472157,-86.460539 32.47204,-86.460671 32.471851,-86.460847 32.471663,-86.460985 32.471599,-86.46113 32.471554,-86.46122 32.471554,-86.461346 32.471558,-86.461375 32.47157)\r\n1301;1381;all;Autauga County 11;Autauga;AL;36749;LINESTRING(-86.822318 32.602613,-86.822323 32.60279,-86.822339 32.60374,-86.822352 32.604174,-86.822345 32.604255,-86.822324 32.604335,-86.822294 32.604418,-86.822243 32.604493,-86.822182 32.604564,-86.822101 32.604628,-86.822002 32.604667,-86.821904 32.604693,-86.821804 32.604707,-86.821619 32.604705,-86.821438 32.604699,-86.821012 32.604661,-86.82076 32.604648,-86.820598 32.604648,-86.820522 32.604654,-86.820447 32.604664,-86.820293 32.604698,-86.820145 32.604746,-86.820003 32.604807,-86.819868 32.604881,-86.819673 32.60501,-86.819489 32.605153,-86.819254 32.605359,-86.819088 32.60552,-86.81861 32.606037,-86.818378 32.606268)\r\n400;410;even;Frazer Ln;Autauga;AL;36003;LINESTRING(-86.787509 32.492625,-86.788008 32.492539)\r\n401;411;odd;Frazer Ln;Autauga;AL;36003;LINESTRING(-86.787471 32.492464,-86.78797 32.492378)\r\n499;429;odd;Bedford Ter;Autauga;AL;36066;LINESTRING(-86.439154 32.475312,-86.439138 32.475221,-86.43912 32.475084,-86.439119 32.474953,-86.439143 32.474875,-86.439165 32.474818)\r\n498;426;even;Bedford Ter;Autauga;AL;36066;LINESTRING(-86.438962 32.47534,-86.43894 32.475245,-86.438918 32.475096,-86.438911 32.474939,-86.438933 32.474811,-86.438994 32.474739)\r\n600;668;all;Autauga County 19;Autauga;AL;36003;LINESTRING(-86.674196 32.453769,-86.674196 32.45377,-86.674716 32.454349,-86.675122 32.454818,-86.67521 32.454936,-86.675366 32.455185,-86.675433 32.455313,-86.675491 32.455444,-86.675539 32.455576,-86.675579 32.455714,-86.675582 32.455721)\r\n700;712;even;Briarcliff Pl;Autauga;AL;36066;LINESTRING(-86.418961 32.470034,-86.418964 32.470236,-86.418985 32.470528)\r\n701;709;odd;Briarcliff Pl;Autauga;AL;36066;LINESTRING(-86.419155 32.470031,-86.419162 32.47023,-86.419179 32.470519)\r\n1417;1455;all;Indian Hills Rd;Autauga;AL;36067;LINESTRING(-86.5005 32.459235,-86.5006 32.459226,-86.501045 32.459223,-86.501085 32.459223)\r\n318;300;all;Autauga County 27;Autauga;AL;36067;LINESTRING(-86.540193 32.40217,-86.54019 32.402296,-86.540163 32.402448,-86.540129 32.402571,-86.540126 32.402595,-86.540053 32.402809,-86.539805 32.403513,-86.539378 32.404704)\r\n506;508;even;Cook Rd;Autauga;AL;36067;LINESTRING(-86.484112 32.452917,-86.484096 32.452883,-86.484073 32.452833,-86.484057 32.452766,-86.484041 32.452667,-86.484031 32.452577,-86.484038 32.452456,-86.483999 32.452408)\r\n507;509;odd;Cook Rd;Autauga;AL;36067;LINESTRING(-86.483959 32.453018,-86.483902 32.452973,-86.483861 32.452873,-86.483859 32.452788,-86.483837 32.452685,-86.483835 32.452585,-86.483818 32.452498,-86.48382 32.452473)\r\n299;209;odd;Gail St;Autauga;AL;36066;LINESTRING(-86.43879 32.469599,-86.438779 32.469496,-86.438741 32.469285,-86.438667 32.46881)\r\n298;210;even;Gail St;Autauga;AL;36066;LINESTRING(-86.438597 32.469616,-86.438583 32.469518,-86.438547 32.469307,-86.438474 32.468831)\r\n223;205;all;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.511763 32.419125,-86.511693 32.419253,-86.511578 32.419442,-86.511404 32.419687,-86.511263 32.419858,-86.511051 32.420079,-86.510686 32.420422)\r\n438;448;even;Forge Rd;Autauga;AL;36022;LINESTRING(-86.441445 32.542942,-86.441433 32.542975,-86.44142 32.543125,-86.441403 32.543193,-86.441392 32.543297,-86.441395 32.543533,-86.441416 32.543801,-86.441443 32.543868)\r\n437;447;odd;Forge Rd;Autauga;AL;36022;LINESTRING(-86.441637 32.54297,-86.441637 32.542995,-86.44163 32.543151,-86.441607 32.543223,-86.441596 32.543305,-86.441597 32.543525,-86.441624 32.543773,-86.441632 32.543828)\r\n716;728;even;Kingsley Dr;Autauga;AL;36066;LINESTRING(-86.420284 32.469557,-86.420248 32.46959,-86.420137 32.469766,-86.42005 32.469898,-86.420004 32.470092,-86.419974 32.47029,-86.419983 32.470411)\r\n717;727;odd;Kingsley Dr;Autauga;AL;36066;LINESTRING(-86.42044 32.469655,-86.420422 32.469684,-86.420313 32.469844,-86.420254 32.46996,-86.420204 32.470122,-86.420178 32.470298,-86.420177 32.470406)\r\n2012;2014;even;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.464193 32.584063,-86.464197 32.584488)\r\n2001;2011;odd;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.464388 32.584062,-86.464392 32.584487)\r\n1200;1246;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.632622 32.565939,-86.632652 32.565849,-86.632941 32.564585,-86.632979 32.564442,-86.633049 32.564232,-86.633138 32.564024,-86.633208 32.563891,-86.633336 32.563691,-86.633386 32.563622)\r\n1201;1247;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.632433 32.565898,-86.632456 32.565811,-86.632747 32.564551,-86.632785 32.564402,-86.632857 32.56418,-86.63295 32.56396,-86.633026 32.563815,-86.633162 32.563601,-86.633224 32.56353)\r\n110;198;all;Janice St;Autauga;AL;36066;LINESTRING(-86.431005 32.447106,-86.430989 32.446896,-86.430978 32.446472)\r\n801;899;all;Rosa Mae Ln;Autauga;AL;36003;LINESTRING(-86.707881 32.520739,-86.707897 32.520819,-86.707889 32.52092,-86.707845 32.520974,-86.70775 32.521005,-86.707666 32.521005)\r\n100;112;even;Graylynn Dr;Autauga;AL;36066;LINESTRING(-86.439149 32.474522,-86.439113 32.474476,-86.439027 32.474358,-86.438921 32.474174,-86.43887 32.474046,-86.438829 32.47391,-86.438739 32.473557,-86.438655 32.473307)\r\n101;111;odd;Graylynn Dr;Autauga;AL;36066;LINESTRING(-86.438987 32.474613,-86.438951 32.474568,-86.438849 32.474444,-86.438727 32.47424,-86.438678 32.474092,-86.438637 32.473948,-86.438545 32.473597,-86.438468 32.473351)\r\n464;592;even;Autauga County 133;Autauga;AL;36003;LINESTRING(-86.68492 32.392454,-86.68476 32.392486,-86.683998 32.392659,-86.68367 32.392743,-86.683506 32.39278,-86.683345 32.392807,-86.68318 32.392825,-86.683013 32.392834,-86.681832 32.392855,-86.681395 32.392869,-86.678818 32.392911,-86.677095 32.392918,-86.676237 32.392933,-86.675331 32.392944)\r\n465;593;odd;Autauga County 133;Autauga;AL;36003;LINESTRING(-86.684966 32.392614,-86.684808 32.392648,-86.684052 32.392819,-86.683724 32.392903,-86.683554 32.392944,-86.683377 32.392977,-86.683198 32.392993,-86.683021 32.393002,-86.681838 32.393021,-86.681401 32.393035,-86.67882 32.393077,-86.677097 32.393084,-86.676241 32.393099,-86.675334 32.393109)\r\n1736;1798;even;Meadowbrook Dr;Autauga;AL;36066;LINESTRING(-86.424047 32.470669,-86.424176 32.470729,-86.424449 32.470754,-86.424817 32.470802)\r\n1719;1799;odd;Meadowbrook Dr;Autauga;AL;36066;LINESTRING(-86.424127 32.470519,-86.424238 32.470551,-86.424479 32.470592,-86.424846 32.470639)\r\n1236;1268;all;Autauga County 103;Autauga;AL;36749;LINESTRING(-86.896569 32.595855,-86.897206 32.596982,-86.897607 32.597707,-86.897704 32.597904,-86.897845 32.59824,-86.897891 32.598375,-86.898012 32.598798,-86.898449 32.600438,-86.898533 32.600765)\r\n100;198;all;Pelham Ln;Autauga;AL;36067;LINESTRING(-86.454118 32.449039,-86.454303 32.448838,-86.454597 32.448531)\r\n400;498;even;Tower Dr;Autauga;AL;36022;LINESTRING(-86.447116 32.542593,-86.447061 32.542899,-86.447061 32.543231,-86.447115 32.543493,-86.447236 32.543736,-86.44718 32.543874,-86.447081 32.544029,-86.447015 32.54408,-86.44688 32.544122,-86.446687 32.544092,-86.445655 32.543869)\r\n401;499;odd;Tower Dr;Autauga;AL;36022;LINESTRING(-86.447309 32.542615,-86.447267 32.542911,-86.447271 32.543215,-86.447319 32.543445,-86.447432 32.543726,-86.447382 32.54394,-86.447259 32.544135,-86.447137 32.54426,-86.446886 32.544288,-86.446645 32.54426,-86.445606 32.544029)\r\n1501;1599;odd;Ruby Ct;Autauga;AL;36067;LINESTRING(-86.496559 32.527633,-86.496548 32.527498,-86.496536 32.526858,-86.496552 32.526728)\r\n1598;1500;even;Ruby Ct;Autauga;AL;36067;LINESTRING(-86.496365 32.527647,-86.496348 32.527506,-86.496332 32.526848,-86.496359 32.526706)\r\n800;898;even;Autauga County 49;Autauga;AL;36051;LINESTRING(-86.559241 32.62994,-86.559375 32.629976,-86.559562 32.629991,-86.559737 32.630013,-86.559912 32.63003,-86.560263 32.630054,-86.560615 32.630063,-86.560877 32.63006,-86.561312 32.630038,-86.561656 32.629997,-86.562248 32.629909,-86.562752 32.629847,-86.563257 32.629775,-86.563506 32.629746,-86.563921 32.629712,-86.564165 32.629701,-86.564499 32.629694,-86.564999 32.629702,-86.565152 32.629709,-86.56548 32.629733,-86.565747 32.629744,-86.566782 32.629877,-86.569764 32.630236,-86.570192 32.630278,-86.570535 32.630305,-86.570966 32.630322,-86.571903 32.630337,-86.573075 32.630324)\r\n803;899;odd;Autauga County 49;Autauga;AL;36051;LINESTRING(-86.559291 32.629781,-86.559415 32.629804,-86.559588 32.629825,-86.559763 32.629847,-86.559932 32.629864,-86.560275 32.629886,-86.560617 32.629897,-86.560869 32.629892,-86.561292 32.629868,-86.561626 32.629831,-86.562216 32.629745,-86.562722 32.629683,-86.563227 32.629611,-86.563482 32.629578,-86.563907 32.629546,-86.564157 32.629533,-86.564499 32.62953,-86.565007 32.629534,-86.565166 32.629543,-86.565492 32.629565,-86.565767 32.629572,-86.56681 32.629713,-86.56979 32.63007,-86.570212 32.630112,-86.570549 32.630137,-86.570972 32.630156,-86.571903 32.630171,-86.573073 32.630159)\r\n199;119;odd;Mountain Laurel Rd;Autauga;AL;36066;LINESTRING(-86.45736 32.561361,-86.457396 32.561383,-86.457541 32.561453,-86.45777 32.561557,-86.457933 32.56162,-86.45802 32.561645,-86.458195 32.561685,-86.458291 32.561693,-86.458468 32.561699,-86.458897 32.561702)\r\n198;116;even;Mountain Laurel Rd;Autauga;AL;36066;LINESTRING(-86.457466 32.561223,-86.4575 32.561239,-86.457637 32.561307,-86.457858 32.561405,-86.458007 32.56146,-86.458078 32.561481,-86.458233 32.561513,-86.458309 32.561523,-86.458474 32.561531,-86.458899 32.561537)\r\n902;800;all;N Memorial Dr;Autauga;AL;36066;LINESTRING(-86.451722 32.480825,-86.451723 32.480782)\r\n2000;2076;even;Keenland Cmn;Autauga;AL;36066;LINESTRING(-86.415993 32.489932,-86.415965 32.490096)\r\n2001;2077;odd;Keenland Cmn;Autauga;AL;36066;LINESTRING(-86.416186 32.489955,-86.416158 32.490119)\r\n2100;2198;even;Forest Ridge Rd;Autauga;AL;36067;LINESTRING(-86.58553 32.497499,-86.585734 32.497484,-86.585907 32.497394,-86.586269 32.497178,-86.586919 32.496931,-86.587597 32.496801,-86.588196 32.4968,-86.588646 32.49675,-86.589412 32.4967,-86.589535 32.496736,-86.589577 32.49679,-86.589593 32.496784,-86.589574 32.496862,-86.589561 32.496887,-86.589016 32.497338,-86.588858 32.497542,-86.588844 32.497759,-86.588772 32.498114,-86.588875 32.499615,-86.58908 32.500245,-86.589156 32.500481,-86.589146 32.500578,-86.589114 32.500605,-86.589055 32.500627,-86.58888 32.500652,-86.588352 32.500537,-86.58816 32.500501,-86.587847 32.500517,-86.587487 32.50065,-86.587344 32.500721)\r\n2101;2199;odd;Forest Ridge Rd;Autauga;AL;36067;LINESTRING(-86.5855 32.497337,-86.58566 32.497304,-86.585797 32.497248,-86.586163 32.497022,-86.586851 32.496761,-86.587573 32.496621,-86.588184 32.496626,-86.588626 32.496584,-86.589426 32.496526,-86.589685 32.49656,-86.589801 32.49673,-86.589789 32.496784,-86.589794 32.496908,-86.589747 32.496997,-86.589184 32.497454,-86.589078 32.497606,-86.589042 32.497783,-86.588976 32.498124,-86.589085 32.499587,-86.58927 32.500199,-86.589374 32.500455,-86.589378 32.500674,-86.589222 32.500775,-86.589101 32.500801,-86.588868 32.500822,-86.588306 32.500701,-86.588148 32.500673,-86.587899 32.500699,-86.587575 32.500806,-86.587437 32.500865)\r\n1206;1228;even;Mill Village Ln;Autauga;AL;36066;LINESTRING(-86.447155 32.493957,-86.447169 32.494018,-86.447237 32.494083,-86.447296 32.494147,-86.447422 32.494246,-86.447469 32.494294,-86.447501 32.494344,-86.447517 32.494389,-86.44753 32.494403)\r\n1205;1229;odd;Mill Village Ln;Autauga;AL;36066;LINESTRING(-86.447337 32.4939,-86.447363 32.49393,-86.447395 32.493979,-86.447446 32.494027,-86.44757 32.494126,-86.447635 32.49419,-86.447699 32.494264,-86.447737 32.494359,-86.447724 32.494402)\r\n300;398;even;S Northington St;Autauga;AL;36067;LINESTRING(-86.46746 32.45919,-86.467467 32.459117,-86.46759 32.457957)\r\n301;399;odd;S Northington St;Autauga;AL;36067;LINESTRING(-86.467266 32.45918,-86.467271 32.459105,-86.467396 32.457943)\r\n900;1110;even;S McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.418248 32.454037,-86.418261 32.453894,-86.41826 32.453231,-86.41825 32.452868,-86.418251 32.452288,-86.418245 32.452001,-86.418252 32.451062,-86.418248 32.450254,-86.418221 32.449927,-86.418202 32.449001,-86.418198 32.447669)\r\n901;1111;odd;S McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.418054 32.454027,-86.418061 32.453888,-86.418064 32.453233,-86.418054 32.45287,-86.418055 32.45229,-86.418049 32.452001,-86.418058 32.451062,-86.418048 32.45026,-86.418021 32.449935,-86.418006 32.449003,-86.418004 32.44767)\r\n1900;1998;all;Davis Rd;Autauga;AL;36067;LINESTRING(-86.491599 32.562431,-86.490353 32.562242,-86.489787 32.562372,-86.489073 32.562633,-86.488766 32.562632)\r\n1303;1301;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.491304 32.430953,-86.490746 32.430961,-86.490614 32.430974)\r\n272;698;even;Easy St;Autauga;AL;36067;LINESTRING(-86.474759 32.471346,-86.47492 32.471286,-86.475228 32.47115,-86.476009 32.470843,-86.476933 32.470445,-86.477318 32.470287,-86.477391 32.470258)\r\n201;699;odd;Easy St;Autauga;AL;36067;LINESTRING(-86.474678 32.471196,-86.474832 32.471134,-86.47514 32.471,-86.475923 32.470693,-86.476845 32.470297,-86.477234 32.470135,-86.477311 32.470107)\r\n732;798;all;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.608563 32.517198,-86.608171 32.517277,-86.607589 32.517407,-86.607258 32.517471,-86.607009 32.517508,-86.606847 32.517522,-86.606596 32.517528,-86.606335 32.517542,-86.606159 32.517559,-86.605983 32.517588,-86.605811 32.51763,-86.605564 32.517708,-86.604778 32.517991,-86.604464 32.518092,-86.604309 32.518132,-86.60415 32.518164,-86.60399 32.518187,-86.603742 32.518206,-86.60264 32.518246,-86.602219 32.518243,-86.601794 32.51822,-86.60153 32.518215,-86.601385 32.518224)\r\n684;600;even;Yosemite Pkwy;Autauga;AL;36067;LINESTRING(-86.54681 32.578654,-86.546369 32.578669,-86.546198 32.578671,-86.545528 32.578709,-86.545463 32.578712)\r\n683;601;odd;Yosemite Pkwy;Autauga;AL;36067;LINESTRING(-86.546819 32.578818,-86.546375 32.578837,-86.546206 32.578839,-86.545538 32.578875,-86.545471 32.578877)\r\n100;134;even;First St;Autauga;AL;36067;LINESTRING(-86.472611 32.458118,-86.472507 32.458108,-86.472308 32.458096)\r\n101;121;odd;First St;Autauga;AL;36067;LINESTRING(-86.472592 32.458282,-86.472489 32.458274,-86.472293 32.45826)\r\n729;715;odd;Mimosa Rd;Autauga;AL;36067;LINESTRING(-86.460512 32.480842,-86.460124 32.48084)\r\n730;728;even;Mimosa Rd;Autauga;AL;36067;LINESTRING(-86.46051 32.481006,-86.460122 32.481004)\r\n1198;1000;all;Norton Rd;Autauga;AL;36051;LINESTRING(-86.592008 32.652215,-86.591969 32.648855,-86.591971 32.648629,-86.592034 32.648466,-86.592173 32.648322,-86.592365 32.648244,-86.592559 32.648211,-86.592743 32.648198,-86.593868 32.648183,-86.594694 32.648191,-86.596055 32.648157,-86.596166 32.648162)\r\n1398;1300;all;Dunn Ln;Autauga;AL;36067;LINESTRING(-86.426664 32.437855,-86.426057 32.437863,-86.425877 32.437856,-86.425762 32.437848,-86.425637 32.4379)\r\n100;198;even;Dockery Ct;Autauga;AL;36066;LINESTRING(-86.41569 32.492148,-86.415545 32.492239,-86.415263 32.4924,-86.415194 32.492441,-86.415178 32.492456)\r\n101;199;odd;Dockery Ct;Autauga;AL;36066;LINESTRING(-86.415809 32.492278,-86.415663 32.492377,-86.415381 32.492538,-86.415308 32.492591,-86.415268 32.492601)\r\n399;301;all;Autauga County 70;Autauga;AL;36022;LINESTRING(-86.454373 32.657238,-86.454411 32.657238,-86.454469 32.657237)\r\n3601;3999;odd;Eric Dr;Autauga;AL;36758;LINESTRING(-86.84557 32.633461,-86.845602 32.633469,-86.845582 32.633433,-86.845595 32.632998,-86.845612 32.632859,-86.845655 32.632651,-86.845781 32.632232,-86.845819 32.632082,-86.845824 32.631927,-86.845821 32.631842,-86.845796 32.631761,-86.845766 32.631683,-86.84572 32.631606,-86.845655 32.631538,-86.845573 32.631482,-86.84548 32.63144,-86.845301 32.631402,-86.845046 32.631352,-86.844936 32.631342)\r\n3900;3998;even;Eric Dr;Autauga;AL;36758;LINESTRING(-86.845418 32.633564,-86.845372 32.633541,-86.845384 32.633435,-86.845393 32.632986,-86.845414 32.632835,-86.845457 32.632615,-86.845585 32.632194,-86.845613 32.63206,-86.845626 32.631929,-86.845615 32.63187,-86.8456 32.631809,-86.845574 32.631753,-86.845542 32.631706,-86.845503 32.631666,-86.845455 32.631632,-86.8454 32.631608,-86.845251 32.631566,-86.84501 32.63152,-86.844909 32.631505)\r\n299;233;odd;N Chestnut St;Autauga;AL;36067;LINESTRING(-86.472297 32.465098,-86.472334 32.464719,-86.472371 32.464376)\r\n230;200;even;N Chestnut St;Autauga;AL;36067;LINESTRING(-86.472103 32.465084,-86.47214 32.464705,-86.472178 32.464361)\r\n100;198;even;Amelia Dr;Autauga;AL;36066;LINESTRING(-86.428629 32.45087,-86.428627 32.450946,-86.428625 32.451036)\r\n101;199;odd;Amelia Dr;Autauga;AL;36066;LINESTRING(-86.428823 32.450871,-86.428823 32.450948,-86.42882 32.45104)\r\n400;434;even;Water St;Autauga;AL;36067;LINESTRING(-86.464995 32.455,-86.464852 32.45499,-86.463493 32.454871,-86.463474 32.45487)\r\n401;431;odd;Water St;Autauga;AL;36067;LINESTRING(-86.46498 32.455165,-86.464834 32.455156,-86.463469 32.455037,-86.463447 32.455033)\r\n501;599;all;Riverchase North Blvd;Autauga;AL;36066;LINESTRING(-86.422759 32.485562,-86.422766 32.485512)\r\n600;606;even;Little Farm Rd;Autauga;AL;36066;LINESTRING(-86.417393 32.4666,-86.417396 32.466712,-86.417404 32.467077)\r\n601;607;odd;Little Farm Rd;Autauga;AL;36066;LINESTRING(-86.417587 32.466597,-86.41759 32.466708,-86.417598 32.467074)\r\n1800;1810;even;Riverton Dr;Autauga;AL;36066;LINESTRING(-86.418198 32.488428,-86.419236 32.488415,-86.419668 32.488417,-86.419815 32.4884)\r\n1811;1899;odd;Riverton Dr;Autauga;AL;36066;LINESTRING(-86.418195 32.488264,-86.419234 32.488249,-86.419656 32.488245,-86.419795 32.488236)\r\n1280;1398;even;Cooper Ave;Autauga;AL;36066;LINESTRING(-86.440133 32.462177,-86.440127 32.462143,-86.440112 32.462083,-86.440099 32.461949,-86.440131 32.461751,-86.440151 32.461693,-86.440228 32.461566,-86.440295 32.461425,-86.440319 32.461336,-86.440313 32.46123,-86.440218 32.461063,-86.440022 32.460962,-86.439804 32.460967,-86.439473 32.461066,-86.43932 32.461085,-86.438821 32.461077,-86.438795 32.461078)\r\n1287;1399;odd;Cooper Ave;Autauga;AL;36066;LINESTRING(-86.43995 32.462232,-86.439923 32.462189,-86.439908 32.462103,-86.439901 32.461945,-86.439919 32.461709,-86.439963 32.461623,-86.440042 32.461494,-86.440099 32.461371,-86.440117 32.461326,-86.440099 32.461286,-86.440042 32.461201,-86.439958 32.461156,-86.439842 32.461153,-86.439521 32.461242,-86.43933 32.461257,-86.438821 32.461243,-86.438802 32.461243)\r\n616;698;even;Wetumpka St;Autauga;AL;36067;LINESTRING(-86.457161 32.464374,-86.456751 32.464411,-86.456072 32.464454,-86.455564 32.464496,-86.455548 32.464498)\r\n601;699;odd;Wetumpka St;Autauga;AL;36067;LINESTRING(-86.457183 32.464538,-86.456769 32.464579,-86.456088 32.46462,-86.45558 32.464662,-86.455561 32.464662)\r\n1618;1614;all;Martin Dr;Autauga;AL;36022;LINESTRING(-86.444256 32.546973,-86.444281 32.546512,-86.444231 32.546086)\r\n280;298;all;Norris Rd;Autauga;AL;36067;LINESTRING(-86.515462 32.471061,-86.515501 32.47071,-86.515504 32.470692)\r\n1733;1723;odd;Benson St;Autauga;AL;36066;LINESTRING(-86.421572 32.490087,-86.423232 32.490074)\r\n1746;1722;even;Benson St;Autauga;AL;36066;LINESTRING(-86.42157 32.489923,-86.42323 32.48991)\r\n930;998;even;Autauga County 1;Autauga;AL;36749;LINESTRING(-86.806884 32.558915,-86.80676 32.55919,-86.806716 32.559332,-86.806667 32.559541,-86.806627 32.559756,-86.806189 32.562566)\r\n901;969;odd;Autauga County 1;Autauga;AL;36749;LINESTRING(-86.807067 32.558971,-86.806954 32.559242,-86.806912 32.55937,-86.806863 32.559571,-86.806823 32.55978,-86.806382 32.562587)\r\n200;220;even;Floyd St;Autauga;AL;36066;LINESTRING(-86.450826 32.516403,-86.449664 32.516404)\r\n201;217;odd;Floyd St;Autauga;AL;36066;LINESTRING(-86.450826 32.516567,-86.449664 32.516568)\r\n156;1098;even;Narrow Rd;Autauga;AL;36749;LINESTRING(-86.862025 32.477523,-86.862008 32.477546,-86.861974 32.477705,-86.861983 32.477863,-86.862006 32.478006,-86.86205 32.47828,-86.862052 32.478337,-86.862042 32.478397,-86.862019 32.478439,-86.861996 32.478461,-86.861954 32.478485,-86.861883 32.478504,-86.861772 32.478524,-86.861635 32.478543,-86.861547 32.478562,-86.861468 32.478585,-86.861415 32.478604,-86.861412 32.478581,-86.861404 32.478579,-86.861412 32.478429,-86.861338 32.478335,-86.861271 32.478265,-86.861187 32.478212,-86.860969 32.478094,-86.860693 32.477921,-86.860556 32.477835,-86.860363 32.477699,-86.860313 32.477655,-86.860281 32.477611,-86.860262 32.477575,-86.860273 32.477545,-86.860289 32.477526,-86.860317 32.477511,-86.860376 32.477496,-86.86071 32.477507,-86.861147 32.477507,-86.862018 32.477515)\r\n157;199;odd;Narrow Rd;Autauga;AL;36749;LINESTRING(-86.862208 32.477578,-86.86221 32.477592,-86.862182 32.477717,-86.862185 32.477849,-86.862202 32.477984,-86.862258 32.478266,-86.862256 32.478345,-86.862248 32.478431,-86.862223 32.478531,-86.862136 32.478621,-86.862018 32.478653,-86.861925 32.478668,-86.861808 32.478686,-86.861679 32.478709,-86.861605 32.478726,-86.861526 32.478749,-86.861407 32.478768,-86.861244 32.478743,-86.86118 32.478619,-86.861186 32.478477,-86.861166 32.478437,-86.861121 32.478393,-86.861067 32.478352,-86.860853 32.478234,-86.860577 32.478055,-86.860434 32.477969,-86.860227 32.477827,-86.860157 32.477771,-86.860085 32.477701,-86.860048 32.477599,-86.860049 32.477483,-86.860127 32.477376,-86.860257 32.477323,-86.860374 32.47733,-86.860714 32.477339,-86.861149 32.477341,-86.86202 32.47735)\r\n444;400;all;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.476739 32.468949,-86.476336 32.468232,-86.476084 32.467794)\r\n101;199;odd;Seth Dr;Autauga;AL;36022;LINESTRING(-86.464805 32.604429,-86.464888 32.604331,-86.464996 32.604153,-86.4653 32.603725,-86.465527 32.603469,-86.465698 32.603304,-86.466176 32.603084,-86.466391 32.602978,-86.466578 32.602832,-86.466631 32.602793)\r\n100;198;even;Seth Dr;Autauga;AL;36022;LINESTRING(-86.464643 32.604338,-86.464712 32.604243,-86.464822 32.604071,-86.46513 32.603627,-86.465373 32.603369,-86.46555 32.603152,-86.466078 32.602936,-86.466267 32.602834,-86.46645 32.602708,-86.466504 32.602669)\r\n2600;2798;even;Autauga County 55;Autauga;AL;36006;LINESTRING(-86.667467 32.695653,-86.667484 32.695743,-86.667512 32.695952,-86.667527 32.696386,-86.667547 32.696537,-86.667581 32.696686,-86.667631 32.696828,-86.667793 32.697232,-86.667838 32.697365,-86.667875 32.697501,-86.667929 32.69779,-86.667973 32.69794,-86.668036 32.698084,-86.668131 32.698214,-86.668216 32.698334,-86.668284 32.698455,-86.66833 32.698579,-86.668388 32.698855,-86.668648 32.70071,-86.668672 32.700992,-86.668685 32.701345,-86.668683 32.701637,-86.668695 32.701788,-86.668729 32.70194,-86.66878 32.702084,-86.668887 32.702356,-86.668932 32.702491,-86.66901 32.702768,-86.669077 32.703047,-86.66913 32.703322,-86.669149 32.703458,-86.669159 32.703593,-86.669158 32.70373,-86.669127 32.704017,-86.669076 32.704296,-86.66904 32.704427,-86.668987 32.704552,-86.668916 32.704667,-86.668824 32.704771,-86.66871 32.704869,-86.668583 32.70496,-86.668038 32.705312,-86.667659 32.705592,-86.667404 32.705766,-86.667121 32.705938,-86.667099 32.705953)\r\n2601;2721;odd;Autauga County 55;Autauga;AL;36006;LINESTRING(-86.667659 32.695624,-86.667682 32.695717,-86.667714 32.69594,-86.667729 32.696374,-86.667747 32.696511,-86.667779 32.696646,-86.667821 32.696778,-86.667981 32.697182,-86.668034 32.697321,-86.668073 32.697469,-86.668129 32.697756,-86.668169 32.697888,-86.668226 32.698008,-86.668301 32.698128,-86.668396 32.69825,-86.668478 32.698391,-86.668532 32.698539,-86.668586 32.698831,-86.668846 32.700694,-86.668872 32.700984,-86.668883 32.701343,-86.668885 32.701631,-86.668899 32.701766,-86.668927 32.7019,-86.66897 32.702034,-86.669077 32.702306,-86.669126 32.702449,-86.669204 32.702732,-86.669273 32.703017,-86.669326 32.703298,-86.669347 32.703442,-86.669361 32.703587,-86.669362 32.703738,-86.669327 32.704037,-86.669274 32.704326,-86.669238 32.704475,-86.669179 32.704622,-86.669094 32.704761,-86.66898 32.704887,-86.668846 32.704997,-86.668707 32.70509,-86.668166 32.705444,-86.667787 32.70572,-86.667526 32.705902,-86.667237 32.706072,-86.667215 32.706085)\r\n1519;1501;odd;Northington Rd;Autauga;AL;36067;LINESTRING(-86.512497 32.450001,-86.511942 32.449982,-86.511333 32.449971,-86.510979 32.449975,-86.510658 32.44997,-86.508861 32.449907,-86.508423 32.449884,-86.508135 32.449875)\r\n1598;1500;even;Northington Rd;Autauga;AL;36067;LINESTRING(-86.512489 32.450165,-86.511936 32.450148,-86.511331 32.450137,-86.510979 32.450139,-86.510652 32.450138,-86.508851 32.450073,-86.508413 32.45005,-86.508127 32.450039)\r\n2206;2298;all;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.412238 32.521945,-86.412232 32.52264,-86.412236 32.523369,-86.412219 32.523658,-86.412206 32.523823)\r\n3099;3001;odd;Bridgewater Ct;Autauga;AL;36051;LINESTRING(-86.467455 32.701939,-86.467098 32.701819)\r\n3098;3000;even;Bridgewater Ct;Autauga;AL;36051;LINESTRING(-86.467383 32.702092,-86.467026 32.701972)\r\n900;998;all;Avalon Dr;Autauga;AL;36067;LINESTRING(-86.461083 32.488318,-86.46108 32.488223,-86.461077 32.487243)\r\n913;999;odd;Running Brook Dr;Autauga;AL;36066;LINESTRING(-86.433422 32.456087,-86.433503 32.45605,-86.433738 32.455963,-86.433965 32.455837,-86.434035 32.455773,-86.434172 32.455627,-86.434224 32.455499,-86.434253 32.45542,-86.434261 32.455263,-86.434252 32.455096,-86.43416 32.454948,-86.434063 32.454862)\r\n914;998;even;Running Brook Dr;Autauga;AL;36066;LINESTRING(-86.433319 32.455947,-86.433405 32.455896,-86.433636 32.455807,-86.433829 32.455697,-86.433879 32.455659,-86.43398 32.455537,-86.43403 32.455445,-86.434045 32.455388,-86.434065 32.455265,-86.434036 32.45515,-86.43398 32.455048,-86.433913 32.454967)\r\n421;401;odd;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.490363 32.53881,-86.490158 32.538821,-86.489812 32.538857,-86.48958 32.538897,-86.48947 32.538912,-86.489134 32.538982,-86.488804 32.539064,-86.488638 32.539113,-86.488424 32.53918,-86.488001 32.53931,-86.487864 32.539351)\r\n422;404;even;Autauga County 82;Autauga;AL;36067;LINESTRING(-86.490378 32.538974,-86.490178 32.538989,-86.489844 32.539025,-86.489616 32.539059,-86.489512 32.539078,-86.489186 32.539144,-86.488864 32.539224,-86.488704 32.539269,-86.488492 32.539334,-86.488067 32.539468,-86.487926 32.539507)\r\n105;101;odd;Till St;Autauga;AL;36066;LINESTRING(-86.44483 32.467754,-86.444808 32.467711,-86.444788 32.467675,-86.444778 32.467544,-86.444809 32.467329,-86.444795 32.466818,-86.444774 32.466629)\r\n106;100;even;Till St;Autauga;AL;36066;LINESTRING(-86.444688 32.467866,-86.444596 32.467805,-86.444578 32.467697,-86.444576 32.467536,-86.444605 32.467321,-86.444595 32.466826,-86.444581 32.466642)\r\n400;430;even;E 6th St;Autauga;AL;36067;LINESTRING(-86.46533 32.465958,-86.465114 32.465973,-86.464361 32.465932,-86.463597 32.465875,-86.463342 32.465861,-86.463211 32.465851)\r\n301;419;odd;E 6th St;Autauga;AL;36067;LINESTRING(-86.465347 32.466122,-86.465116 32.466139,-86.464347 32.466098,-86.463583 32.466041,-86.463326 32.466027,-86.463192 32.466015)\r\n2320;2398;even;Autauga County 38;Autauga;AL;36006;LINESTRING(-86.751127 32.547583,-86.7511 32.548196,-86.751081 32.548993,-86.75108 32.549072,-86.751133 32.549362,-86.751138 32.549428,-86.751138 32.549565,-86.751122 32.549702,-86.751033 32.550127,-86.75102 32.550206,-86.751024 32.55036,-86.751043 32.550507,-86.75108 32.550721,-86.751104 32.550934,-86.751115 32.551146,-86.751103 32.551281,-86.751091 32.551343,-86.751071 32.551401,-86.751042 32.551457,-86.751003 32.551511,-86.750957 32.551562,-86.750906 32.55161,-86.750848 32.551655,-86.75058 32.551833,-86.75039 32.551985,-86.750267 32.552092,-86.750153 32.552207,-86.750047 32.55233,-86.750002 32.552399,-86.749963 32.552473,-86.749934 32.552548,-86.749912 32.552629,-86.749892 32.552783,-86.749904 32.553296,-86.749922 32.553803,-86.749946 32.554306,-86.749946 32.554442,-86.749945 32.554517)\r\n2321;2399;odd;Autauga County 38;Autauga;AL;36006;LINESTRING(-86.751321 32.547589,-86.751296 32.5482,-86.751277 32.548991,-86.751284 32.549056,-86.751331 32.549342,-86.751342 32.54942,-86.751342 32.549575,-86.751322 32.549726,-86.751231 32.550153,-86.751224 32.550214,-86.751226 32.55035,-86.751241 32.550487,-86.751278 32.550701,-86.751304 32.550922,-86.751311 32.551146,-86.751307 32.551299,-86.751293 32.551379,-86.751267 32.551461,-86.751224 32.551539,-86.751171 32.551609,-86.751113 32.551672,-86.75105 32.55173,-86.75098 32.551785,-86.750712 32.551963,-86.75053 32.552105,-86.750417 32.552206,-86.750313 32.552311,-86.750221 32.552422,-86.750184 32.552477,-86.750153 32.552535,-86.75013 32.552594,-86.750114 32.552657,-86.750096 32.552791,-86.7501 32.553292,-86.750118 32.553797,-86.750144 32.554302,-86.750144 32.554444,-86.75014 32.554522)\r\n698;478;all;Autauga County 41;Autauga;AL;36067;LINESTRING(-86.571612 32.38641,-86.570322 32.386486)\r\n4336;4424;even;Autauga County 88;Autauga;AL;36749;LINESTRING(-86.887274 32.54361,-86.887579 32.543808,-86.888075 32.544099,-86.888363 32.544263,-86.888523 32.544329,-86.88861 32.544362,-86.889107 32.544484,-86.889508 32.5446,-86.889664 32.544651,-86.88989 32.54474,-86.889938 32.544759)\r\n4375;4383;odd;Autauga County 88;Autauga;AL;36749;LINESTRING(-86.887392 32.543479,-86.887695 32.543672,-86.888185 32.543961,-86.888465 32.544113,-86.888607 32.544175,-86.888678 32.544198,-86.889167 32.544324,-86.889576 32.544444,-86.88974 32.544495,-86.889984 32.544586,-86.890036 32.544617)\r\n2300;2498;even;Manning Rd;Autauga;AL;36067;LINESTRING(-86.507382 32.616189,-86.507385 32.616276,-86.507413 32.616688,-86.507446 32.617338,-86.507438 32.617626,-86.507426 32.617768,-86.507404 32.617906,-86.507316 32.618254,-86.507183 32.618659,-86.506655 32.620173,-86.506543 32.620442,-86.506378 32.620771,-86.506267 32.620959,-86.506184 32.62108,-86.50614 32.621143,-86.505495 32.621996,-86.505395 32.622107,-86.505285 32.62221,-86.505036 32.62241,-86.504745 32.622675,-86.504489 32.622864,-86.504374 32.622978,-86.504212 32.623149,-86.504116 32.623275,-86.503987 32.623466,-86.5038 32.623796,-86.50366 32.624066,-86.503574 32.624277,-86.503503 32.624493,-86.503428 32.624782,-86.503356 32.625141,-86.503182 32.626144,-86.503052 32.626782,-86.502924 32.627272,-86.502772 32.627767,-86.502748 32.627919,-86.502745 32.628074,-86.50276 32.628229,-86.50278 32.628307,-86.503034 32.629078,-86.503065 32.629211,-86.503074 32.629276,-86.503079 32.629339,-86.503072 32.629406,-86.503063 32.629469,-86.503028 32.629601,-86.502977 32.629729,-86.502908 32.629854,-86.502825 32.629975,-86.502685 32.630156,-86.502401 32.630557)\r\n2301;2499;odd;Manning Rd;Autauga;AL;36067;LINESTRING(-86.507576 32.616182,-86.507581 32.616268,-86.507609 32.61668,-86.507642 32.617336,-86.507636 32.617632,-86.507628 32.617784,-86.507604 32.617936,-86.50751 32.618294,-86.507371 32.618705,-86.506845 32.620225,-86.506729 32.620502,-86.506562 32.620843,-86.506443 32.621041,-86.506354 32.621164,-86.506312 32.621229,-86.505661 32.622094,-86.505551 32.622217,-86.505429 32.62233,-86.50518 32.62253,-86.504889 32.622799,-86.504635 32.622988,-86.504528 32.623086,-86.504378 32.623249,-86.504288 32.623363,-86.504165 32.623546,-86.50398 32.623866,-86.503848 32.624128,-86.503766 32.624327,-86.503697 32.624533,-86.503624 32.624814,-86.50355 32.625167,-86.503376 32.62617,-86.503248 32.626814,-86.503116 32.62731,-86.502974 32.627799,-86.502952 32.627933,-86.502945 32.628068,-86.502962 32.628203,-86.502976 32.628267,-86.50323 32.629038,-86.503267 32.629185,-86.503276 32.629264,-86.503275 32.629341,-86.503274 32.62942,-86.503263 32.629497,-86.503228 32.629647,-86.503167 32.629795,-86.503088 32.629934,-86.502995 32.630065,-86.502853 32.630246,-86.502568 32.630642)\r\n414;428;all;Golson Rd;Autauga;AL;36067;LINESTRING(-86.5462 32.465059,-86.546143 32.465181,-86.546053 32.465383,-86.545939 32.465657,-86.545423 32.466847)\r\n1000;1098;even;Oates Rd;Autauga;AL;36066;LINESTRING(-86.44626 32.456689,-86.446081 32.456697,-86.445063 32.45672,-86.444879 32.456722)\r\n1001;1099;odd;Oates Rd;Autauga;AL;36066;LINESTRING(-86.446271 32.456853,-86.446089 32.456863,-86.445067 32.456886,-86.444881 32.456887)\r\n700;798;all;Shady Lane Farm Rd;Autauga;AL;36067;LINESTRING(-86.452286 32.442193,-86.453633 32.442198)\r\n819;899;all;E Main St;Autauga;AL;36067;LINESTRING(-86.452318 32.460491,-86.451697 32.460494)\r\n151;101;odd;Durden Rd;Autauga;AL;36067;LINESTRING(-86.486444 32.471025,-86.486478 32.470988)\r\n122;106;even;Durden Rd;Autauga;AL;36067;LINESTRING(-86.486291 32.470924,-86.486325 32.470887)\r\n1300;1398;even;Huie St;Autauga;AL;36066;LINESTRING(-86.43786 32.463162,-86.437844 32.463139,-86.43767 32.46291,-86.437556 32.462732,-86.437521 32.462615,-86.437522 32.461543,-86.437534 32.460821,-86.437545 32.460578)\r\n1301;1399;odd;Huie St;Autauga;AL;36066;LINESTRING(-86.437694 32.463248,-86.437678 32.463227,-86.437502 32.462998,-86.43735 32.462802,-86.437309 32.462635,-86.437326 32.461541,-86.437336 32.460817,-86.437351 32.460571)\r\n600;698;even;State Rte 111;Autauga;AL;36022;LINESTRING(-86.42777 32.647671,-86.427664 32.647719,-86.427469 32.647876,-86.426551 32.64863,-86.426495 32.648665,-86.426434 32.648693,-86.426368 32.648714,-86.426209 32.648743,-86.425961 32.648773,-86.425797 32.648786,-86.425374 32.648801,-86.424182 32.648813,-86.422563 32.648839,-86.422225 32.648838,-86.422089 32.648841)\r\n601;699;odd;State Rte 111;Autauga;AL;36022;LINESTRING(-86.427874 32.64781,-86.427792 32.647861,-86.427605 32.647998,-86.426687 32.648758,-86.426613 32.648813,-86.426518 32.648857,-86.42642 32.648882,-86.426243 32.648909,-86.425985 32.648941,-86.425809 32.648954,-86.42538 32.648967,-86.424186 32.648979,-86.422565 32.649005,-86.422227 32.649004,-86.422093 32.649006)\r\n1500;1598;all;Lucas Ct;Autauga;AL;36067;LINESTRING(-86.492944 32.538659,-86.493014 32.538445,-86.493058 32.538266,-86.493065 32.538114,-86.492926 32.538042,-86.492825 32.538038,-86.492675 32.538041,-86.492505 32.538043,-86.492509 32.538045,-86.492502 32.538039,-86.492487 32.537964,-86.49265 32.537649,-86.492865 32.537396,-86.493085 32.537444,-86.493201 32.537444,-86.493512 32.537482,-86.493654 32.537601,-86.493682 32.537656,-86.493636 32.537772,-86.493599 32.537818,-86.493502 32.53789,-86.493538 32.538058,-86.493542 32.538236,-86.493684 32.538393,-86.493868 32.538555,-86.494069 32.53865,-86.494117 32.538684)\r\n900;916;all;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.76298 32.509045,-86.763032 32.509069,-86.76326 32.509179,-86.763401 32.50926,-86.763538 32.509348,-86.763669 32.509442,-86.76379 32.50954,-86.763906 32.509645,-86.764013 32.509755,-86.764112 32.50987,-86.764203 32.509989,-86.764286 32.510112,-86.764438 32.510369,-86.764735 32.510937)\r\n200;498;even;Booth St;Autauga;AL;36067;LINESTRING(-86.465323 32.466089,-86.465214 32.466229,-86.465162 32.466288,-86.465113 32.466356,-86.465038 32.466493,-86.464883 32.466833,-86.464821 32.466971,-86.464742 32.467188,-86.464726 32.467404,-86.464698 32.467472,-86.464656 32.467512,-86.464632 32.467533,-86.464481 32.467515,-86.463913 32.467428,-86.463676 32.467373,-86.463515 32.467326,-86.463264 32.467268,-86.463092 32.467239,-86.462833 32.467212,-86.46275 32.467215)\r\n201;499;odd;Booth St;Autauga;AL;36067;LINESTRING(-86.465487 32.466177,-86.46538 32.466323,-86.465332 32.466382,-86.465293 32.466438,-86.465222 32.466561,-86.465067 32.466891,-86.465013 32.467023,-86.464952 32.46722,-86.46493 32.467428,-86.464912 32.467556,-86.464784 32.467696,-86.464636 32.467699,-86.464451 32.467681,-86.463867 32.467596,-86.463616 32.467533,-86.463457 32.467488,-86.463218 32.467434,-86.46306 32.467407,-86.462819 32.467384,-86.462747 32.467379)\r\n801;899;odd;Carver St;Autauga;AL;36067;LINESTRING(-86.473689 32.477734,-86.473689 32.477714,-86.473677 32.476479,-86.473692 32.47603)\r\n198;100;even;Carver St;Autauga;AL;36067;LINESTRING(-86.473494 32.477732,-86.473495 32.477714,-86.473481 32.476477,-86.473497 32.476025)\r\n800;812;even;Bluegrass Dr;Autauga;AL;36066;LINESTRING(-86.414504 32.489699,-86.414479 32.489785,-86.414471 32.48994,-86.414471 32.490022,-86.414497 32.490177,-86.414525 32.490254,-86.414555 32.490334,-86.414626 32.490438)\r\n801;803;odd;Bluegrass Dr;Autauga;AL;36066;LINESTRING(-86.414695 32.48973,-86.414683 32.489807,-86.414669 32.489942,-86.414675 32.490006,-86.414699 32.490141,-86.414717 32.490204,-86.414745 32.490264,-86.414798 32.490363)\r\n329;307;odd;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.520404 32.4012,-86.520341 32.401236,-86.519589 32.401751,-86.518478 32.402508,-86.517682 32.403052,-86.517141 32.403411,-86.517005 32.403498,-86.516864 32.403584,-86.516434 32.403831,-86.51642 32.403841)\r\n328;306;even;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.520517 32.401334,-86.520461 32.40137,-86.519711 32.401879,-86.5186 32.402636,-86.517804 32.403182,-86.517261 32.403545,-86.517121 32.40363,-86.516978 32.40372,-86.516542 32.403973,-86.51652 32.403982)\r\n1799;1751;all;Autauga County 87;Autauga;AL;36022;LINESTRING(-86.440529 32.548572,-86.440307 32.548484,-86.439987 32.548377,-86.439678 32.548267,-86.439587 32.548247,-86.439493 32.548228,-86.439389 32.548227,-86.439355 32.548235)\r\n1899;1845;all;Tara Dr;Autauga;AL;36066;LINESTRING(-86.418281 32.454245,-86.418363 32.45425,-86.418636 32.454247,-86.418863 32.454196)\r\n199;193;all;Houston St;Autauga;AL;36066;LINESTRING(-86.429617 32.491166,-86.429736 32.491219,-86.429956 32.49128,-86.430227 32.491277,-86.430258 32.491265)\r\n1043;1099;all;Abe Ct;Autauga;AL;36067;LINESTRING(-86.469007 32.429802,-86.468998 32.429681,-86.468975 32.42955,-86.468955 32.429469)\r\n1190;1198;all;Old Hwy 31;Autauga;AL;36067;LINESTRING(-86.439703 32.450093,-86.439594 32.45,-86.439531 32.449913)\r\n299;201;odd;Walnut St;Autauga;AL;36067;LINESTRING(-86.478119 32.466089,-86.47816 32.465746,-86.4782 32.465381,-86.47823 32.465163,-86.478263 32.464802,-86.478264 32.46478)\r\n298;200;even;Walnut St;Autauga;AL;36067;LINESTRING(-86.477925 32.466072,-86.477966 32.46573,-86.478004 32.465365,-86.478032 32.465147,-86.478065 32.464784,-86.478071 32.464759)\r\n399;301;odd;Walker St;Autauga;AL;36066;LINESTRING(-86.450505 32.472552,-86.450476 32.471958,-86.450467 32.471595,-86.450459 32.471514,-86.450438 32.47143,-86.450397 32.471353,-86.450353 32.471273,-86.450278 32.4712,-86.45005 32.471076,-86.449899 32.471,-86.449411 32.470768)\r\n398;300;even;Walker St;Autauga;AL;36066;LINESTRING(-86.450311 32.472559,-86.45028 32.471964,-86.450265 32.471607,-86.450255 32.471542,-86.450238 32.471484,-86.450213 32.471427,-86.450175 32.471377,-86.450134 32.471338,-86.449942 32.471218,-86.449799 32.471144,-86.449315 32.470911)\r\n101;115;odd;Fox Run;Autauga;AL;36022;LINESTRING(-86.424097 32.626552,-86.420537 32.62653)\r\n100;120;even;Fox Run;Autauga;AL;36022;LINESTRING(-86.424095 32.626716,-86.420535 32.626694)\r\n100;198;all;Stakely Dr;Autauga;AL;36067;LINESTRING(-86.472101 32.445861,-86.472101 32.445963,-86.472112 32.448111)\r\n201;299;odd;Oak Hill Dr;Autauga;AL;36022;LINESTRING(-86.412324 32.520734,-86.412311 32.520734)\r\n2;198;even;Oak Hill Dr;Autauga;AL;36022;LINESTRING(-86.412324 32.520898,-86.412311 32.520898)\r\n2200;2204;all;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.412238 32.520938,-86.412236 32.521039,-86.412239 32.521699)\r\n2100;2198;even;Autauga County 123;Autauga;AL;36051;LINESTRING(-86.587076 32.688407,-86.586939 32.688582,-86.586784 32.688755,-86.586505 32.689026,-86.586331 32.689176,-86.585891 32.689515,-86.585505 32.689796,-86.58389 32.690863,-86.58342 32.691179,-86.583292 32.691281,-86.583048 32.691488,-86.582875 32.691652,-86.582717 32.691822,-86.582271 32.692343,-86.581933 32.692764,-86.581792 32.692952,-86.581462 32.693462,-86.581326 32.693639,-86.581279 32.693692,-86.581227 32.693741,-86.581112 32.693839,-86.580545 32.694272,-86.580123 32.694629,-86.579607 32.695097,-86.579565 32.695134)\r\n2079;2199;odd;Autauga County 123;Autauga;AL;36051;LINESTRING(-86.58724 32.688495,-86.587105 32.68868,-86.58694 32.688861,-86.586653 32.689142,-86.586469 32.689298,-86.586023 32.689639,-86.585631 32.689926,-86.584012 32.690993,-86.583552 32.691307,-86.58343 32.691401,-86.583194 32.691604,-86.583029 32.69176,-86.582875 32.691924,-86.582433 32.692439,-86.582099 32.692856,-86.581966 32.693038,-86.581636 32.69355,-86.58149 32.693737,-86.581435 32.693798,-86.581375 32.693859,-86.581248 32.693961,-86.580683 32.694394,-86.580265 32.694745,-86.579749 32.695213,-86.579702 32.69525)\r\n1303;1301;odd;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.418328 32.50964,-86.418363 32.509292)\r\n1298;1272;even;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.418134 32.509626,-86.418169 32.509278)\r\n100;198;even;Circle C Dr;Autauga;AL;36022;LINESTRING(-86.48712 32.625428,-86.487062 32.625473,-86.487005 32.625513,-86.486883 32.625602,-86.486723 32.625825,-86.486664 32.625876,-86.486471 32.62598,-86.486387 32.626048,-86.486327 32.626129,-86.486234 32.626276,-86.486068 32.626539,-86.48598 32.626597,-86.485912 32.626618,-86.485528 32.626608,-86.484238 32.626511)\r\n101;199;odd;Circle C Dr;Autauga;AL;36022;LINESTRING(-86.48726 32.625543,-86.4872 32.625601,-86.487139 32.625641,-86.487053 32.625718,-86.486893 32.625943,-86.486792 32.626016,-86.486603 32.62612,-86.486551 32.626164,-86.486501 32.626219,-86.486412 32.626354,-86.48625 32.626663,-86.48608 32.626775,-86.48593 32.626794,-86.485514 32.626776,-86.484221 32.626675)\r\n1198;900;even;Autauga County 93;Autauga;AL;36749;LINESTRING(-86.842905 32.56645,-86.84287 32.566505,-86.842833 32.566562,-86.842784 32.566614,-86.842734 32.566653,-86.842609 32.566718,-86.842379 32.56678,-86.842128 32.566825,-86.841954 32.566862,-86.841786 32.566917,-86.841701 32.566953,-86.841624 32.566994,-86.841545 32.567039,-86.841411 32.567141,-86.84123 32.567302,-86.841061 32.567473,-86.840959 32.567594,-86.840908 32.567658,-86.840717 32.567983,-86.840676 32.568039,-86.840633 32.568089,-86.840584 32.568137,-86.840528 32.568179,-86.84047 32.568217,-86.840332 32.568288,-86.840263 32.568317,-86.840022 32.568396,-86.839929 32.56844,-86.83985 32.568509,-86.839798 32.568592,-86.839769 32.568682,-86.839772 32.568773,-86.839819 32.568922,-86.839861 32.569061,-86.839912 32.569273,-86.839947 32.569486,-86.839973 32.569768,-86.839976 32.569905,-86.83997 32.569972,-86.839956 32.570038,-86.839915 32.570171,-86.839628 32.570856,-86.839435 32.571333,-86.839375 32.571458,-86.839305 32.571583,-86.839267 32.571639,-86.839178 32.571754,-86.838968 32.571986,-86.83887 32.572117,-86.838757 32.572322,-86.83869 32.572462,-86.838636 32.572607,-86.838614 32.572684,-86.838604 32.572764,-86.838605 32.572842,-86.838604 32.57292,-86.838657 32.573279,-86.838668 32.573418,-86.838666 32.573483,-86.838659 32.573549,-86.838644 32.573612,-86.838598 32.573739,-86.838532 32.573859,-86.838449 32.573975,-86.838354 32.574089,-86.838093 32.574372,-86.837642 32.574897,-86.837404 32.575196,-86.837179 32.575508,-86.837096 32.575641,-86.837022 32.575777,-86.836959 32.575921,-86.83692 32.576071,-86.836894 32.576218,-86.83688 32.576368,-86.83687 32.576652,-86.836832 32.576932,-86.836765 32.577214,-86.836638 32.57763,-86.836565 32.577835,-86.836484 32.578035,-86.836422 32.578162,-86.836348 32.578281,-86.836259 32.578395,-86.836156 32.578505,-86.835871 32.578776,-86.83571 32.578949,-86.835507 32.579186,-86.835312 32.57943,-86.835135 32.579683,-86.834976 32.579946,-86.83474 32.580408,-86.834666 32.580531,-86.834626 32.580586,-86.834581 32.580636,-86.834297 32.580903,-86.83419 32.581018,-86.834136 32.581082,-86.834047 32.581211,-86.834005 32.581281,-86.833968 32.581355,-86.833944 32.581433,-86.833925 32.581511,-86.833905 32.581661,-86.833896 32.581812,-86.833902 32.582177,-86.83393 32.582758,-86.83393 32.582968,-86.833918 32.583104,-86.833906 32.58317,-86.833886 32.583231,-86.833861 32.583292,-86.833827 32.583351,-86.833787 32.583405,-86.83369 32.583511,-86.833577 32.583612,-86.833137 32.583956,-86.833011 32.584059,-86.832896 32.584178,-86.832797 32.584308,-86.832672 32.584504,-86.832386 32.585032,-86.832042 32.585613,-86.831972 32.585752,-86.831914 32.585894,-86.831869 32.586042,-86.831841 32.586191,-86.831761 32.586832,-86.831745 32.586894,-86.831724 32.586953,-86.831693 32.587007,-86.831654 32.587058,-86.831605 32.587106,-86.831551 32.58715,-86.831282 32.58733,-86.831152 32.587434,-86.830862 32.587691,-86.830806 32.58773,-86.830745 32.58776,-86.830681 32.587782,-86.830613 32.587796,-86.830454 32.587811,-86.829609 32.587798,-86.829348 32.587796,-86.828404 32.587765,-86.827883 32.587736,-86.827041 32.587687,-86.826445 32.587645,-86.826271 32.587643,-86.826177 32.587651,-86.826076 32.587663,-86.825981 32.587703,-86.825896 32.587752,-86.825825 32.587812,-86.825763 32.587878,-86.825713 32.587954,-86.825679 32.588034,-86.825657 32.588115,-86.825651 32.588198,-86.825653 32.588283,-86.82567 32.588361,-86.825791 32.588785,-86.8258 32.588848,-86.8258 32.588907,-86.825785 32.588958,-86.825759 32.589005,-86.825719 32.589049,-86.825668 32.589089,-86.825536 32.589163,-86.825314 32.589259,-86.825009 32.589374,-86.824302 32.589608,-86.82384 32.589797,-86.823604 32.589867,-86.823028 32.590002,-86.822782 32.590071,-86.822695 32.590096,-86.82261 32.59013,-86.822531 32.590172,-86.822451 32.590214,-86.82238 32.590269,-86.822314 32.590328,-86.822255 32.590393,-86.822163 32.590528,-86.822024 32.5908,-86.821743 32.591393,-86.82169 32.591498)\r\n901;1099;odd;Autauga County 93;Autauga;AL;36749;LINESTRING(-86.843085 32.566515,-86.843056 32.566587,-86.842999 32.566656,-86.842944 32.566726,-86.842872 32.566795,-86.842699 32.566888,-86.842427 32.566944,-86.842174 32.566989,-86.842018 32.567026,-86.841868 32.567075,-86.841799 32.567103,-86.841734 32.567136,-86.841673 32.567175,-86.841551 32.567265,-86.84138 32.567416,-86.841221 32.567577,-86.841125 32.567688,-86.841086 32.567744,-86.840893 32.568065,-86.840846 32.568133,-86.840791 32.568197,-86.84073 32.568255,-86.840662 32.568315,-86.840582 32.568361,-86.84043 32.568436,-86.840347 32.568473,-86.840116 32.568554,-86.840065 32.568584,-86.840026 32.568619,-86.839998 32.56866,-86.839983 32.568704,-86.839984 32.568751,-86.840011 32.568882,-86.840055 32.569023,-86.84011 32.569245,-86.840145 32.569468,-86.840175 32.56976,-86.840176 32.569909,-86.84017 32.56999,-86.840158 32.570074,-86.840109 32.570223,-86.839814 32.57091,-86.839623 32.571391,-86.839559 32.571526,-86.839483 32.571659,-86.839441 32.571727,-86.839342 32.571852,-86.839136 32.572084,-86.83905 32.572201,-86.838941 32.57239,-86.83888 32.57252,-86.838832 32.572651,-86.838816 32.572714,-86.838806 32.572778,-86.838799 32.572842,-86.838806 32.572906,-86.838857 32.573263,-86.838868 32.573414,-86.838868 32.573491,-86.838859 32.573571,-86.838846 32.573652,-86.838794 32.573803,-86.838712 32.573943,-86.838617 32.574069,-86.838512 32.574189,-86.838251 32.574472,-86.837804 32.574993,-86.837572 32.575286,-86.837353 32.575592,-86.837276 32.575715,-86.83721 32.575841,-86.837157 32.575971,-86.837118 32.576103,-86.837094 32.576238,-86.83708 32.576376,-86.837074 32.576664,-86.837032 32.57696,-86.836959 32.577252,-86.836828 32.577674,-86.836755 32.577885,-86.836672 32.578095,-86.836606 32.578234,-86.836524 32.578369,-86.836423 32.578497,-86.836308 32.578613,-86.836025 32.578884,-86.835868 32.579051,-86.835669 32.579282,-86.835482 32.57952,-86.835311 32.579765,-86.835158 32.580018,-86.834922 32.58048,-86.834844 32.580615,-86.834794 32.580682,-86.834739 32.580746,-86.834451 32.581013,-86.83435 32.58112,-86.834306 32.581174,-86.834223 32.581293,-86.834189 32.581351,-86.834162 32.581411,-86.83414 32.581473,-86.834125 32.581537,-86.834105 32.581675,-86.834094 32.581816,-86.8341 32.582173,-86.834128 32.582754,-86.83413 32.582974,-86.83412 32.583124,-86.834104 32.583204,-86.834082 32.583283,-86.834047 32.583358,-86.834007 32.583431,-86.833959 32.583503,-86.833844 32.583625,-86.833717 32.583732,-86.833275 32.584076,-86.833163 32.584175,-86.833062 32.58428,-86.832971 32.584396,-86.832852 32.58458,-86.832564 32.585104,-86.832224 32.585683,-86.83216 32.585812,-86.832108 32.585942,-86.832067 32.586078,-86.832039 32.586213,-86.831959 32.586854,-86.831947 32.586934,-86.831918 32.587015,-86.831875 32.587095,-86.831818 32.587164,-86.831753 32.587228,-86.831681 32.58728,-86.831414 32.58746,-86.831294 32.587554,-86.831004 32.587819,-86.830926 32.587872,-86.830841 32.587918,-86.830743 32.587952,-86.830645 32.587968,-86.830462 32.587981,-86.829607 32.587964,-86.829344 32.587964,-86.828394 32.587931,-86.827869 32.5879,-86.827027 32.587853,-86.826437 32.587815,-86.826281 32.587815,-86.826207 32.587821,-86.826144 32.587837,-86.826085 32.587857,-86.82603 32.58789,-86.825979 32.58793,-86.825937 32.587976,-86.825903 32.588028,-86.825877 32.588084,-86.825861 32.588143,-86.825849 32.588202,-86.825857 32.588263,-86.825868 32.588327,-86.825991 32.588753,-86.826006 32.588834,-86.82601 32.588923,-86.825991 32.589016,-86.825941 32.589101,-86.825873 32.589173,-86.825794 32.589229,-86.825638 32.589313,-86.8254 32.589411,-86.825087 32.58953,-86.824384 32.589764,-86.823918 32.589959,-86.823662 32.590029,-86.823086 32.590164,-86.822848 32.590229,-86.822775 32.590254,-86.822706 32.590282,-86.822639 32.590314,-86.822579 32.590352,-86.822522 32.590393,-86.82247 32.59044,-86.822427 32.590489,-86.822345 32.590606,-86.822206 32.590864,-86.821927 32.591459,-86.821867 32.591566)\r\n587;529;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.486651 32.446963,-86.486557 32.446851,-86.48637 32.446652)\r\n586;528;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.486494 32.44706,-86.486399 32.446953,-86.486217 32.446754)\r\n142;198;all;Country Club Dr;Autauga;AL;36067;LINESTRING(-86.47129 32.442341,-86.471292 32.442748,-86.471288 32.44297)\r\n100;198;even;Manchester Ct;Autauga;AL;36067;LINESTRING(-86.532452 32.465695,-86.532443 32.465849,-86.532474 32.466282,-86.532505 32.466327)\r\n101;199;odd;Manchester Ct;Autauga;AL;36067;LINESTRING(-86.532646 32.465702,-86.532641 32.465845,-86.532688 32.466242,-86.532688 32.46627)\r\n3699;3651;all;Autauga County 44;Autauga;AL;36003;LINESTRING(-86.797776 32.500959,-86.796357 32.502463,-86.795811 32.503026,-86.795582 32.503236,-86.795337 32.503432,-86.795211 32.503521,-86.795077 32.503603,-86.794938 32.503679,-86.794795 32.503751,-86.794647 32.503817,-86.794496 32.503878,-86.794341 32.503934,-86.794186 32.503983,-86.794025 32.504026,-86.793863 32.504062,-86.793701 32.504092,-86.793193 32.504167,-86.787619 32.504901)\r\n2500;2598;even;Tanner Dr;Autauga;AL;36067;LINESTRING(-86.651914 32.598656,-86.651718 32.598642,-86.651306 32.598639,-86.651039 32.598738,-86.650844 32.598854,-86.650627 32.598959,-86.650451 32.598996,-86.65032 32.598973,-86.649908 32.598741,-86.649616 32.598555,-86.649377 32.598538,-86.648925 32.59856,-86.648298 32.598588,-86.646782 32.598512,-86.646433 32.59852,-86.646135 32.598668,-86.645888 32.598801,-86.645621 32.598853,-86.645347 32.599028,-86.644895 32.59925)\r\n2501;2599;odd;Tanner Dr;Autauga;AL;36067;LINESTRING(-86.6519 32.59882,-86.651712 32.59881,-86.651352 32.598827,-86.651139 32.598896,-86.65095 32.598992,-86.650711 32.599139,-86.650459 32.599166,-86.650236 32.599163,-86.649794 32.598877,-86.64953 32.598739,-86.649367 32.598708,-86.648935 32.598724,-86.648298 32.598752,-86.646784 32.598678,-86.646499 32.598708,-86.646241 32.598816,-86.64598 32.598977,-86.645715 32.599029,-86.645457 32.599174,-86.644991 32.599393)\r\n100;198;even;Howard St;Autauga;AL;36067;LINESTRING(-86.469703 32.479928,-86.4698 32.479926,-86.470137 32.479909,-86.47039 32.479906,-86.470818 32.479912,-86.471207 32.479909)\r\n101;199;odd;Howard St;Autauga;AL;36067;LINESTRING(-86.469696 32.479764,-86.46979 32.47976,-86.470129 32.479741,-86.47039 32.47974,-86.470818 32.479746,-86.471205 32.479745)\r\n700;798;even;Chambliss St;Autauga;AL;36066;LINESTRING(-86.448997 32.460179,-86.44899 32.45997,-86.448994 32.459607,-86.448987 32.459515)\r\n701;799;odd;Chambliss St;Autauga;AL;36066;LINESTRING(-86.448802 32.460184,-86.448794 32.459972,-86.448796 32.459611,-86.448793 32.459523)\r\n898;800;all;Rosa Mae Ln;Autauga;AL;36003;LINESTRING(-86.707772 32.520656,-86.70758 32.52063,-86.707485 32.52068,-86.707386 32.520762,-86.707267 32.520888,-86.707304 32.520906,-86.707355 32.520943,-86.7074 32.520966)\r\n1200;1298;even;Autauga County 73;Autauga;AL;36006;LINESTRING(-86.746138 32.553709,-86.746103 32.554342,-86.746084 32.554562,-86.746067 32.555071,-86.746062 32.555287,-86.746021 32.555864,-86.745992 32.556075,-86.745961 32.55621,-86.745916 32.556343,-86.745856 32.55647,-86.745781 32.556593,-86.745694 32.556712,-86.745598 32.556826,-86.74544 32.556993,-86.745214 32.557215,-86.745108 32.557336,-86.744929 32.557589,-86.744291 32.558536,-86.744154 32.558714,-86.744001 32.558881,-86.743777 32.559093,-86.743598 32.559244,-86.743409 32.559381,-86.743276 32.559463,-86.743137 32.559535,-86.742991 32.559597,-86.742591 32.559728,-86.742509 32.559768,-86.74243 32.559805,-86.742355 32.559853,-86.742283 32.559904,-86.742218 32.559959,-86.742155 32.560017,-86.7421 32.560081,-86.74205 32.560148,-86.742006 32.56022,-86.741975 32.560296,-86.741951 32.560373,-86.741934 32.560452,-86.741921 32.560602,-86.741917 32.560823,-86.741929 32.56119,-86.742031 32.562637,-86.742042 32.562921,-86.742035 32.562987,-86.742015 32.56312,-86.742 32.563182,-86.741977 32.563242,-86.741981 32.563245)\r\n1201;1299;odd;Autauga County 73;Autauga;AL;36006;LINESTRING(-86.746333 32.553716,-86.746301 32.554352,-86.746282 32.55457,-86.746263 32.555075,-86.746262 32.555293,-86.746221 32.555878,-86.746192 32.556101,-86.746159 32.55625,-86.746108 32.556399,-86.746042 32.556542,-86.745957 32.556677,-86.745862 32.556806,-86.745758 32.556928,-86.745592 32.557099,-86.745372 32.557321,-86.745276 32.557432,-86.745099 32.557673,-86.744463 32.558624,-86.744318 32.558812,-86.744157 32.558991,-86.743921 32.559209,-86.743736 32.559368,-86.743535 32.559515,-86.743388 32.559605,-86.743235 32.559685,-86.743073 32.559753,-86.742677 32.559886,-86.742607 32.559914,-86.742542 32.559949,-86.742479 32.559987,-86.742419 32.56003,-86.742364 32.560075,-86.742313 32.560125,-86.742268 32.560177,-86.742228 32.560232,-86.742196 32.560288,-86.742169 32.560348,-86.742149 32.560411,-86.742136 32.560474,-86.742121 32.56061,-86.742113 32.560823,-86.742127 32.561182,-86.742229 32.562629,-86.742236 32.562921,-86.742239 32.562999,-86.742217 32.56315,-86.742194 32.563226,-86.742169 32.5633,-86.742161 32.563306)\r\n725;711;odd;Ruth St;Autauga;AL;36067;LINESTRING(-86.487784 32.486042,-86.48708 32.486038)\r\n700;798;even;Ruth St;Autauga;AL;36067;LINESTRING(-86.487782 32.486207,-86.487078 32.486203)\r\n1513;1459;all;Indian Hills Rd;Autauga;AL;36067;LINESTRING(-86.501955 32.459254,-86.501699 32.459254)\r\n3000;3098;even;April St;Autauga;AL;36067;LINESTRING(-86.70022 32.58891,-86.700301 32.588895,-86.700371 32.588885,-86.700455 32.588878,-86.700709 32.58888,-86.701135 32.588863,-86.701391 32.588863,-86.702241 32.58883,-86.702262 32.588828)\r\n3001;3099;odd;April St;Autauga;AL;36067;LINESTRING(-86.700167 32.588751,-86.700257 32.588725,-86.700349 32.588713,-86.700449 32.58871,-86.700705 32.588712,-86.701131 32.588695,-86.701387 32.588695,-86.702235 32.588662,-86.70226 32.588663)\r\n751;701;odd;N Court St;Autauga;AL;36067;LINESTRING(-86.474464 32.473182,-86.474518 32.472937,-86.474555 32.472717,-86.474602 32.472351,-86.474673 32.471451)\r\n746;700;even;N Court St;Autauga;AL;36067;LINESTRING(-86.474272 32.473153,-86.474322 32.472911,-86.474359 32.472697,-86.474404 32.472337,-86.474479 32.471439)\r\n299;201;odd;S Washington St;Autauga;AL;36003;LINESTRING(-86.653266 32.429086,-86.654125 32.430191)\r\n298;216;even;S Washington St;Autauga;AL;36003;LINESTRING(-86.653428 32.428996,-86.654287 32.430101)\r\n828;898;even;Sweet Ridge Rd;Autauga;AL;36066;LINESTRING(-86.430842 32.452917,-86.430891 32.452919,-86.431074 32.452879,-86.431315 32.452775,-86.431686 32.452588,-86.431908 32.452472,-86.432055 32.452385,-86.432253 32.452233,-86.432364 32.452113,-86.432514 32.451941,-86.432676 32.451798,-86.432865 32.451704,-86.433 32.451663,-86.433058 32.451643)\r\n831;899;odd;Sweet Ridge Rd;Autauga;AL;36066;LINESTRING(-86.430822 32.452754,-86.430853 32.452745,-86.431 32.452711,-86.431219 32.452625,-86.431584 32.452446,-86.431796 32.452332,-86.431925 32.452251,-86.432101 32.452113,-86.432206 32.452009,-86.432354 32.451833,-86.432536 32.451652,-86.432781 32.451536,-86.432938 32.451503,-86.432992 32.451489)\r\n300;332;even;Janice St;Autauga;AL;36066;LINESTRING(-86.430956 32.445316,-86.43095 32.445198,-86.430953 32.445123,-86.430948 32.445036,-86.430877 32.444879,-86.430808 32.444811,-86.430683 32.444701,-86.430553 32.444598,-86.430445 32.444523,-86.4303 32.444463,-86.430107 32.444469,-86.428912 32.444488,-86.428572 32.444488,-86.428234 32.444491,-86.428133 32.444481,-86.428037 32.44446,-86.427959 32.44443,-86.427705 32.444284)\r\n201;333;odd;Janice St;Autauga;AL;36066;LINESTRING(-86.430762 32.445327,-86.43075 32.445202,-86.430749 32.445131,-86.430736 32.44508,-86.430685 32.444969,-86.430652 32.444923,-86.430541 32.444821,-86.430423 32.44473,-86.430335 32.444679,-86.430248 32.444651,-86.430105 32.444635,-86.428914 32.444654,-86.428574 32.444654,-86.42823 32.444659,-86.428103 32.444659,-86.427961 32.444632,-86.427851 32.44458,-86.427593 32.444419)\r\n299;233;odd;Deerwood Dr;Autauga;AL;36067;LINESTRING(-86.484494 32.455569,-86.484422 32.455507,-86.484236 32.455361,-86.484001 32.455195,-86.483663 32.455185,-86.483408 32.455324,-86.483346 32.455374,-86.483235 32.455449,-86.483229 32.455455)\r\n298;232;even;Deerwood Dr;Autauga;AL;36067;LINESTRING(-86.484358 32.455686,-86.484286 32.455629,-86.484106 32.455493,-86.483919 32.455389,-86.483721 32.455377,-86.483528 32.455468,-86.48347 32.455502,-86.483363 32.455577,-86.483359 32.455578)\r\n899;801;odd;Cobblestone Curve;Autauga;AL;36067;LINESTRING(-86.471871 32.439305,-86.471823 32.439239,-86.471764 32.439176,-86.471643 32.43907,-86.471587 32.439008,-86.471316 32.4388,-86.471213 32.438767,-86.471122 32.438747,-86.471031 32.438733,-86.47094 32.438729,-86.470414 32.43873,-86.470237 32.438745,-86.47006 32.438744,-86.469948 32.438764,-86.46985 32.43882,-86.469776 32.438893,-86.46973 32.438977,-86.469709 32.439062,-86.469694 32.439142,-86.469695 32.439293,-86.469698 32.439443,-86.469715 32.439528,-86.469752 32.439617,-86.46983 32.439696,-86.469929 32.439745,-86.470031 32.439772,-86.470131 32.439788,-86.470314 32.439787,-86.470485 32.439787,-86.470564 32.439792,-86.470637 32.439802,-86.470706 32.43982,-86.470763 32.439846,-86.470815 32.439879,-86.470867 32.439921,-86.470911 32.439962)\r\n898;800;even;Cobblestone Curve;Autauga;AL;36067;LINESTRING(-86.471711 32.439397,-86.471661 32.439341,-86.471612 32.43929,-86.471493 32.439184,-86.471437 32.439132,-86.471196 32.438958,-86.471143 32.438933,-86.471076 32.438915,-86.471005 32.438905,-86.470934 32.438899,-86.470424 32.438902,-86.470249 32.438915,-86.470088 32.438924,-86.470038 32.438938,-86.469994 32.43896,-86.469958 32.438995,-86.46993 32.439039,-86.469909 32.439096,-86.4699 32.439156,-86.469891 32.439291,-86.469904 32.439423,-86.469919 32.439478,-86.469944 32.439521,-86.469976 32.439554,-86.470021 32.439581,-86.470083 32.439602,-86.470153 32.439612,-86.470316 32.439621,-86.470489 32.439619,-86.470584 32.43962,-86.470681 32.439632,-86.47078 32.439654,-86.470879 32.439692,-86.470959 32.439751,-86.471015 32.439811,-86.471058 32.439855)\r\n2500;2616;even;Autauga County 57;Autauga;AL;36051;LINESTRING(-86.537651 32.632328,-86.537506 32.633152,-86.537375 32.633942,-86.537296 32.634444,-86.537257 32.634656,-86.53721 32.634867,-86.537151 32.635072,-86.537073 32.635273,-86.536979 32.635468,-86.536871 32.635659,-86.536752 32.635845,-86.536616 32.636023,-86.536519 32.636134,-86.536356 32.636297,-86.536122 32.636506,-86.535156 32.637327,-86.534915 32.637536,-86.534577 32.637873,-86.534383 32.63812,-86.534226 32.638385,-86.53412 32.638587,-86.533966 32.639008,-86.533853 32.639509,-86.533756 32.640007,-86.533706 32.640214,-86.5336 32.640557,-86.533459 32.640889,-86.53323 32.641266,-86.532989 32.641549,-86.532586 32.641912,-86.531865 32.642523,-86.531393 32.642947,-86.531172 32.643173,-86.531022 32.643356,-86.530844 32.643625)\r\n2501;2591;odd;Autauga County 57;Autauga;AL;36051;LINESTRING(-86.537844 32.632352,-86.5377 32.633176,-86.537569 32.633964,-86.537492 32.634468,-86.537453 32.634684,-86.537406 32.634901,-86.537347 32.635118,-86.537263 32.635331,-86.537163 32.635536,-86.537049 32.635735,-86.536926 32.635931,-86.536782 32.636121,-86.536675 32.63624,-86.536504 32.636409,-86.536264 32.636622,-86.535296 32.637443,-86.535065 32.63765,-86.534741 32.637977,-86.534561 32.638208,-86.534408 32.638457,-86.534312 32.638647,-86.534164 32.63905,-86.534047 32.639539,-86.533952 32.640037,-86.5339 32.640252,-86.533794 32.640607,-86.533649 32.640959,-86.533408 32.641358,-86.533149 32.641661,-86.532728 32.642028,-86.532007 32.642639,-86.531545 32.643059,-86.531334 32.643277,-86.531194 32.643448,-86.531013 32.643707)\r\n2825;2827;all;Autauga County 53;Autauga;AL;36091;LINESTRING(-86.637342 32.702611,-86.637342 32.702617,-86.637257 32.702747,-86.637157 32.702876,-86.637132 32.702894)\r\n1141;1181;all;Autauga County 19;Autauga;AL;36003;LINESTRING(-86.699565 32.511013,-86.699568 32.511651,-86.699559 32.51238,-86.699559 32.513835,-86.699563 32.514562,-86.699589 32.515357,-86.699626 32.515786,-86.699683 32.516215,-86.699747 32.516571,-86.699795 32.516783,-86.699943 32.517347,-86.700243 32.518331,-86.700402 32.518818,-86.700645 32.519509,-86.70088 32.520127,-86.701356 32.521292,-86.701436 32.5215,-86.701483 32.521645,-86.701561 32.521929,-86.701576 32.522007)\r\n2500;2528;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.640103 32.535887,-86.640348 32.536268,-86.640748 32.536914,-86.640863 32.53709)\r\n1078;1000;even;Copper Ridge Rd;Autauga;AL;36067;LINESTRING(-86.530177 32.458805,-86.530333 32.458828,-86.53084 32.458866,-86.531096 32.458869,-86.53127 32.458864,-86.531362 32.458855,-86.531622 32.458804,-86.531869 32.458719,-86.532025 32.458653,-86.532174 32.458574,-86.532316 32.458482,-86.532502 32.458333,-86.532577 32.458233)\r\n1095;1001;odd;Copper Ridge Rd;Autauga;AL;36067;LINESTRING(-86.530207 32.458643,-86.530357 32.45866,-86.530852 32.458696,-86.531094 32.458703,-86.531252 32.458694,-86.531326 32.458685,-86.53156 32.458636,-86.531785 32.458563,-86.531925 32.458503,-86.532058 32.458432,-86.532182 32.45835,-86.532342 32.458217,-86.532419 32.458137)\r\n134;132;all;Autauga County 64;Autauga;AL;36022;LINESTRING(-86.482432 32.62762,-86.482631 32.627563,-86.483031 32.627432,-86.483203 32.627391,-86.483344 32.627368,-86.483542 32.627328,-86.484258 32.627241)\r\n1605;1609;all;Autauga County 87;Autauga;AL;36022;LINESTRING(-86.430693 32.537557,-86.430767 32.537712,-86.43087 32.537924,-86.430932 32.538046,-86.431179 32.538602)\r\n699;601;all;Jasmine Trl;Autauga;AL;36066;LINESTRING(-86.428802 32.482179,-86.428802 32.482042,-86.428793 32.4819,-86.42879 32.481759,-86.428811 32.481112,-86.428814 32.480031,-86.42882 32.479729)\r\n1471;1479;all;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.537417 32.500655,-86.537725 32.500938,-86.538476 32.501633,-86.538834 32.501939,-86.539134 32.502168)\r\n2677;2699;all;Co Rd 110;Autauga;AL;36758;LINESTRING(-86.836925 32.660374,-86.836898 32.660393,-86.836788 32.660482,-86.836597 32.660608,-86.836234 32.660823)\r\n100;198;even;Pecan Ave;Autauga;AL;36067;LINESTRING(-86.533609 32.426132,-86.533413 32.426108,-86.533144 32.426106,-86.532887 32.426107,-86.532732 32.426091,-86.532666 32.426076,-86.532599 32.426051,-86.532537 32.426017,-86.532122 32.42573)\r\n101;199;odd;Pecan Ave;Autauga;AL;36067;LINESTRING(-86.533585 32.426296,-86.533399 32.42628,-86.533144 32.426272,-86.532881 32.426277,-86.532692 32.426269,-86.53259 32.426242,-86.532499 32.426203,-86.532415 32.426157,-86.531998 32.425856)\r\n1399;1301;odd;Expos Ct;Autauga;AL;36067;LINESTRING(-86.420174 32.431087,-86.42017 32.430998,-86.420166 32.430064)\r\n1398;1300;even;Expos Ct;Autauga;AL;36067;LINESTRING(-86.41998 32.431097,-86.41997 32.431004,-86.419972 32.430064)\r\n1239;1201;all;Jamestown Dr;Autauga;AL;36067;LINESTRING(-86.472501 32.496072,-86.472475 32.496054,-86.472409 32.495982,-86.472363 32.495873,-86.472327 32.495763,-86.472317 32.49553,-86.472321 32.49465,-86.47231 32.493924,-86.472312 32.493488,-86.472318 32.493385)\r\n1915;1999;all;Regent Rd;Autauga;AL;36066;LINESTRING(-86.415774 32.46644,-86.415673 32.466441,-86.415515 32.466452,-86.415285 32.466496,-86.415144 32.466544,-86.415129 32.466544)\r\n1001;1099;all;Fireside Dr;Autauga;AL;36067;LINESTRING(-86.478331 32.452435,-86.478104 32.452433)\r\n699;627;odd;Woodvale Rd;Autauga;AL;36067;LINESTRING(-86.45453 32.478759,-86.454531 32.478609)\r\n698;636;even;Woodvale Rd;Autauga;AL;36067;LINESTRING(-86.454335 32.478758,-86.454336 32.478608)\r\n2190;2198;even;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.464187 32.602448,-86.464206 32.60301,-86.464219 32.603178,-86.464228 32.603318,-86.464273 32.603608,-86.4643 32.603753,-86.464352 32.603969,-86.464467 32.604319,-86.464503 32.604397)\r\n2189;2199;odd;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.464382 32.602443,-86.464404 32.603002,-86.464415 32.603168,-86.464428 32.603302,-86.464469 32.603584,-86.464496 32.603723,-86.464548 32.603929,-86.464659 32.604269,-86.464686 32.604342)\r\n398;242;all;Shady Valley Rd;Autauga;AL;36003;LINESTRING(-86.788333 32.438166,-86.788348 32.438177,-86.788388 32.438227,-86.788438 32.438271,-86.788626 32.438406)\r\n100;198;even;Sandstone Ct;Autauga;AL;36066;LINESTRING(-86.428727 32.468738,-86.42863 32.468755,-86.428616 32.468761)\r\n101;199;odd;Sandstone Ct;Autauga;AL;36066;LINESTRING(-86.428772 32.468898,-86.428682 32.468919,-86.428673 32.468919)\r\n1800;1820;all;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.674857 32.610257,-86.675591 32.61038,-86.676254 32.610512,-86.677088 32.610697,-86.67733 32.610761,-86.677487 32.610811,-86.677638 32.610872,-86.677679 32.610889)\r\n115;101;odd;Bryan St;Autauga;AL;36066;LINESTRING(-86.437036 32.467727,-86.437041 32.467788,-86.437093 32.468004,-86.437228 32.468714,-86.437316 32.469211,-86.437385 32.469624)\r\n116;100;even;Bryan St;Autauga;AL;36066;LINESTRING(-86.43723 32.467708,-86.437241 32.467762,-86.437287 32.467974,-86.437422 32.468688,-86.43751 32.469187,-86.437578 32.469601)\r\n1801;1815;odd;Edinburgh St;Autauga;AL;36066;LINESTRING(-86.428605 32.478071,-86.426949 32.47814,-86.426928 32.478142)\r\n1800;1814;even;Edinburgh St;Autauga;AL;36066;LINESTRING(-86.428615 32.478235,-86.426961 32.478306,-86.426941 32.478306)\r\n199;1;odd;Bradford Ct;Autauga;AL;36067;LINESTRING(-86.700251 32.554769,-86.700241 32.554742,-86.700219 32.55469,-86.700195 32.55463,-86.70017 32.554564,-86.700142 32.554499,-86.700117 32.554436,-86.70009 32.554373,-86.700054 32.554312,-86.700021 32.554249,-86.69999 32.554189,-86.699932 32.55407,-86.699901 32.554007,-86.699834 32.553863,-86.699798 32.55379,-86.699765 32.553721,-86.699731 32.553652,-86.6997 32.553584,-86.699629 32.55345,-86.6996 32.553386,-86.699575 32.553325,-86.69955 32.553257,-86.699525 32.553185,-86.699496 32.55311,-86.699467 32.553037,-86.699437 32.552968,-86.699411 32.5529,-86.699387 32.552831,-86.699365 32.552762,-86.699348 32.552692,-86.699335 32.552626,-86.699328 32.552568,-86.699323 32.55251,-86.699324 32.552392,-86.699328 32.552338,-86.699334 32.552276,-86.699344 32.552215,-86.699374 32.552057,-86.69939 32.551969,-86.699431 32.551791,-86.699457 32.551701,-86.699487 32.551614,-86.699552 32.55145,-86.699585 32.551381,-86.699619 32.551322,-86.699702 32.551201,-86.699749 32.551139,-86.699801 32.551075,-86.699857 32.55101,-86.699957 32.550877,-86.699996 32.550815,-86.700047 32.550755,-86.700042 32.550728)\r\n100;198;even;Bradford Ct;Autauga;AL;36067;LINESTRING(-86.700068 32.554825,-86.700055 32.554796,-86.700035 32.554742,-86.700011 32.554682,-86.699984 32.554618,-86.699958 32.554555,-86.699931 32.554494,-86.699904 32.554439,-86.699874 32.55438,-86.699841 32.554315,-86.69981 32.554253,-86.699748 32.554134,-86.699719 32.554067,-86.699652 32.553925,-86.699618 32.553852,-86.699583 32.553783,-86.699551 32.553714,-86.699518 32.55365,-86.699449 32.553516,-86.699412 32.553446,-86.699385 32.553375,-86.699362 32.553303,-86.699337 32.553235,-86.69931 32.553162,-86.699281 32.553091,-86.699253 32.553022,-86.699223 32.552952,-86.699193 32.552875,-86.699175 32.552798,-86.699154 32.552726,-86.699135 32.552652,-86.699124 32.55258,-86.699127 32.552512,-86.699126 32.55239,-86.699126 32.552326,-86.699138 32.552256,-86.699148 32.552191,-86.69918 32.552031,-86.699194 32.551941,-86.699235 32.551753,-86.699267 32.551657,-86.699297 32.551564,-86.699364 32.551394,-86.699399 32.551313,-86.699441 32.55124,-86.699534 32.551111,-86.699587 32.551047,-86.699639 32.550981,-86.699691 32.550916,-86.699785 32.550791,-86.699824 32.550735,-86.699841 32.550689,-86.699852 32.550692)\r\n825;819;all;Durden Rd;Autauga;AL;36067;LINESTRING(-86.485257 32.492906,-86.485716 32.492573,-86.485847 32.492474,-86.486151 32.492222,-86.486197 32.492172)\r\n1400;1402;all;Breakfast Creek Rd;Autauga;AL;36067;LINESTRING(-86.497827 32.511072,-86.497731 32.511184,-86.497696 32.511265,-86.497663 32.511341,-86.497636 32.511421,-86.497602 32.511571,-86.497604 32.511597)\r\n1600;1698;even;Autauga County 7;Autauga;AL;36758;LINESTRING(-86.865326 32.620602,-86.865351 32.62065,-86.865451 32.620846,-86.865571 32.621116,-86.865708 32.62146,-86.865888 32.621945,-86.865952 32.622086,-86.866069 32.622284,-86.866364 32.622728,-86.866437 32.622853,-86.8665 32.622981,-86.866581 32.623183,-86.866641 32.623385,-86.866832 32.624361,-86.866886 32.624796,-86.866937 32.625299,-86.866979 32.625874,-86.866998 32.626304,-86.867069 32.627516,-86.867087 32.627943,-86.86709 32.628229)\r\n1601;1699;odd;Autauga County 7;Autauga;AL;36758;LINESTRING(-86.8655 32.620529,-86.865533 32.620578,-86.865635 32.620784,-86.865757 32.62106,-86.865894 32.621408,-86.866078 32.621889,-86.866138 32.622016,-86.866247 32.622206,-86.86654 32.62265,-86.866619 32.622783,-86.86669 32.622921,-86.866775 32.623135,-86.866839 32.623351,-86.867032 32.624339,-86.867082 32.62478,-86.867133 32.625287,-86.867175 32.625866,-86.867194 32.626296,-86.867265 32.627508,-86.867285 32.627939,-86.867285 32.628228)\r\n100;198;all;Railroad St;Autauga;AL;36067;LINESTRING(-86.473107 32.466201,-86.473144 32.465989)\r\n2770;2798;all;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.490101 32.664665,-86.490459 32.666691)\r\n817;809;odd;Durden Rd;Autauga;AL;36067;LINESTRING(-86.486387 32.491984,-86.48656 32.491813,-86.486727 32.491639,-86.486931 32.491399,-86.4871 32.491157)\r\n816;810;even;Durden Rd;Autauga;AL;36067;LINESTRING(-86.486238 32.491878,-86.486408 32.491707,-86.486567 32.491537,-86.486763 32.491305,-86.486933 32.491072)\r\n1000;1098;even;Haley Ct;Autauga;AL;36067;LINESTRING(-86.464857 32.42864,-86.464831 32.428624,-86.464765 32.428593,-86.464704 32.428554,-86.464653 32.428516,-86.464567 32.428425,-86.464523 32.42831,-86.464512 32.427955,-86.464525 32.427517,-86.464551 32.427168,-86.46457 32.427147,-86.46458 32.427138,-86.464645 32.42712,-86.464806 32.42712,-86.464858 32.427121)\r\n1001;1099;odd;Haley Ct;Autauga;AL;36067;LINESTRING(-86.464782 32.428792,-86.464733 32.428782,-86.464651 32.428733,-86.464578 32.428688,-86.464513 32.428642,-86.464361 32.428525,-86.464307 32.428334,-86.464316 32.427953,-86.464329 32.427511,-86.464345 32.427146,-86.464358 32.427027,-86.464498 32.426952,-86.464633 32.426948,-86.464812 32.426954,-86.464867 32.426957)\r\n200;298;even;S Washington St;Autauga;AL;36067;LINESTRING(-86.469858 32.460952,-86.469875 32.460802,-86.470019 32.459632)\r\n201;299;odd;S Washington St;Autauga;AL;36067;LINESTRING(-86.469665 32.460936,-86.469681 32.460786,-86.469825 32.459615)\r\n1099;1001;odd;Wind Rush Ln;Autauga;AL;36067;LINESTRING(-86.525413 32.454292,-86.525513 32.454281,-86.526338 32.454223,-86.526586 32.454217,-86.526817 32.454225)\r\n1098;1000;even;Wind Rush Ln;Autauga;AL;36067;LINESTRING(-86.525381 32.454129,-86.525487 32.454111,-86.526328 32.454053,-86.526588 32.454051,-86.526825 32.45406)\r\n1100;1198;even;Sycamore Ct;Autauga;AL;36066;LINESTRING(-86.443336 32.479236,-86.443338 32.479693,-86.443335 32.479856,-86.443338 32.479879)\r\n1101;1199;odd;Sycamore Ct;Autauga;AL;36066;LINESTRING(-86.44353 32.479235,-86.443536 32.479689,-86.443553 32.479884,-86.443522 32.479932)\r\n800;898;even;Winter Pl;Autauga;AL;36066;LINESTRING(-86.421839 32.453891,-86.42184 32.453926,-86.421822 32.454043,-86.42176 32.454233,-86.421658 32.454411,-86.421567 32.454504,-86.421455 32.454569,-86.421241 32.454623,-86.421084 32.454634,-86.420926 32.454628,-86.420706 32.454587,-86.420587 32.454531,-86.420416 32.454393,-86.420365 32.454342,-86.420224 32.45417,-86.420154 32.45405,-86.420136 32.453997,-86.42012 32.453908)\r\n801;899;odd;Winter Pl;Autauga;AL;36066;LINESTRING(-86.422033 32.453883,-86.422036 32.453928,-86.422032 32.454073,-86.421958 32.454295,-86.42184 32.454507,-86.421719 32.45464,-86.421551 32.454741,-86.421273 32.454803,-86.421088 32.454802,-86.420906 32.454808,-86.420626 32.454765,-86.420455 32.454675,-86.420264 32.454509,-86.420205 32.454446,-86.420046 32.454262,-86.419954 32.454114,-86.419928 32.454027,-86.419926 32.453922)\r\n488;798;even;Autauga County 1;Autauga;AL;36749;LINESTRING(-86.848438 32.537628,-86.848338 32.537703,-86.848014 32.53792,-86.847812 32.538038,-86.847596 32.538149,-86.847378 32.538243,-86.847068 32.538355,-86.846757 32.538449,-86.846435 32.538524,-86.846107 32.53858,-86.845857 32.538612,-86.845697 32.538624,-86.845278 32.538632,-86.843661 32.538586,-86.842889 32.538566,-86.842456 32.538571,-86.842197 32.538584,-86.842022 32.5386,-86.841766 32.538631,-86.841423 32.538684,-86.841087 32.538753,-86.840832 32.538813,-86.840665 32.538862,-86.840341 32.538968,-86.840183 32.539028,-86.839871 32.539154,-86.839714 32.539222,-86.839488 32.539333,-86.838752 32.539704,-86.835526 32.541343,-86.835158 32.541515,-86.834855 32.541638,-86.834546 32.541747,-86.834391 32.541795,-86.834152 32.54186,-86.834085 32.541878)\r\n501;699;odd;Autauga County 1;Autauga;AL;36749;LINESTRING(-86.848571 32.537748,-86.84847 32.537833,-86.848134 32.538056,-86.84792 32.53818,-86.847694 32.538297,-86.847464 32.538397,-86.847142 32.538513,-86.846817 32.538611,-86.846481 32.53869,-86.846141 32.538746,-86.845883 32.53878,-86.845709 32.538796,-86.845276 32.538798,-86.843655 32.53875,-86.842887 32.538732,-86.842464 32.538739,-86.842213 32.538752,-86.842046 32.538766,-86.841798 32.538797,-86.841465 32.53885,-86.841137 32.538915,-86.840892 32.538975,-86.840733 32.53902,-86.840417 32.539124,-86.840265 32.53918,-86.839959 32.539304,-86.83981 32.53937,-86.839588 32.539477,-86.838852 32.539846,-86.835626 32.541487,-86.83525 32.541665,-86.834937 32.541792,-86.834618 32.541905,-86.834455 32.541953,-86.83421 32.542022,-86.834137 32.542037)\r\n1496;1486;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.519762 32.430716,-86.51512 32.430795)\r\n400;418;even;Reynolds Mill Rd;Autauga;AL;36067;LINESTRING(-86.464968 32.425468,-86.46458 32.425444,-86.464424 32.42544,-86.464321 32.425431,-86.464159 32.425432,-86.463823 32.425419,-86.463658 32.425422)\r\n401;419;odd;Reynolds Mill Rd;Autauga;AL;36067;LINESTRING(-86.464955 32.425632,-86.464572 32.425612,-86.464412 32.42561,-86.464311 32.425603,-86.464153 32.4256,-86.463819 32.425587,-86.46366 32.425586)\r\n206;298;even;10th St;Autauga;AL;36067;LINESTRING(-86.467316 32.473628,-86.466986 32.473629,-86.466649 32.473619,-86.466392 32.47362,-86.465967 32.473625,-86.465519 32.473637)\r\n201;299;odd;10th St;Autauga;AL;36067;LINESTRING(-86.467317 32.473793,-86.466984 32.473795,-86.466645 32.473787,-86.466394 32.473786,-86.465971 32.473791,-86.465525 32.473802)\r\n772;780;all;Autauga County 49;Autauga;AL;36051;LINESTRING(-86.55564 32.628251,-86.556289 32.628754,-86.556787 32.629059,-86.556842 32.629082)\r\n1600;1624;even;Keith Ln;Autauga;AL;36067;LINESTRING(-86.472361 32.538964,-86.472321 32.539072,-86.472329 32.539159,-86.472342 32.539306,-86.472386 32.539667,-86.472391 32.539739,-86.4724 32.540168,-86.472406 32.540314,-86.472411 32.540747,-86.47241 32.540807)\r\n1601;1625;odd;Keith Ln;Autauga;AL;36067;LINESTRING(-86.47255 32.539002,-86.472535 32.539092,-86.472529 32.539153,-86.47254 32.539292,-86.472588 32.539655,-86.472587 32.539735,-86.472596 32.540164,-86.472604 32.54031,-86.472607 32.540749,-86.472605 32.540811)\r\n900;998;even;Brookwood Dr;Autauga;AL;36066;LINESTRING(-86.451832 32.478014,-86.451484 32.478007,-86.450036 32.478015)\r\n901;999;odd;Brookwood Dr;Autauga;AL;36066;LINESTRING(-86.451828 32.478179,-86.451482 32.478173,-86.450037 32.47818)\r\n196;298;all;Co Rd 102;Autauga;AL;36066;LINESTRING(-86.453211 32.583813,-86.453078 32.583815)\r\n101;199;odd;February Dr;Autauga;AL;36066;LINESTRING(-86.455116 32.529288,-86.454969 32.529293,-86.4547 32.529285,-86.454417 32.529285,-86.454144 32.529297)\r\n100;198;even;February Dr;Autauga;AL;36066;LINESTRING(-86.455125 32.529452,-86.454971 32.529459,-86.454696 32.529453,-86.454421 32.529453,-86.454152 32.529461)\r\n1698;900;even;October Ln;Autauga;AL;36051;LINESTRING(-86.578946 32.613073,-86.578978 32.615257,-86.578983 32.615599,-86.579041 32.616245,-86.579088 32.617701)\r\n1699;1601;odd;October Ln;Autauga;AL;36051;LINESTRING(-86.579141 32.613071,-86.579174 32.615255,-86.579183 32.615591,-86.579241 32.616237,-86.579283 32.617697)\r\n406;418;even;Sydney Dr N;Autauga;AL;36066;LINESTRING(-86.422858 32.493635,-86.422853 32.493635,-86.422588 32.493888,-86.422468 32.494,-86.422387 32.494096,-86.422315 32.494231,-86.422255 32.494314,-86.422243 32.494413,-86.422224 32.494681)\r\n401;417;odd;Sydney Dr N;Autauga;AL;36066;LINESTRING(-86.423012 32.493736,-86.423009 32.493745,-86.422736 32.493998,-86.42263 32.494106,-86.422567 32.494186,-86.422491 32.494303,-86.422465 32.49437,-86.422445 32.494433,-86.422418 32.494693)\r\n674;730;even;Washington Ferry Rd;Autauga;AL;36067;LINESTRING(-86.464827 32.443646,-86.464776 32.443302,-86.464767 32.443091,-86.464769 32.442803,-86.464791 32.442142,-86.464791 32.442113)\r\n677;741;odd;Washington Ferry Rd;Autauga;AL;36067;LINESTRING(-86.464634 32.443668,-86.464572 32.443316,-86.464571 32.443093,-86.464573 32.442801,-86.464591 32.442132,-86.464597 32.442099)\r\n1299;1205;odd;Perrydale Loop;Autauga;AL;36066;LINESTRING(-86.441631 32.456714,-86.441639 32.4567,-86.441608 32.456672,-86.441579 32.456613,-86.441504 32.456412,-86.441298 32.455785,-86.44125 32.455676)\r\n1198;1154;even;Perrydale Loop;Autauga;AL;36066;LINESTRING(-86.441531 32.456855,-86.441467 32.45684,-86.441418 32.456744,-86.441389 32.456667,-86.441316 32.456458,-86.441106 32.455835,-86.441066 32.455731)\r\n101;199;all;S Northington St;Autauga;AL;36067;LINESTRING(-86.467152 32.463606,-86.467125 32.463401,-86.467087 32.462896,-86.467019 32.462169,-86.467017 32.462095,-86.466998 32.461946,-86.466998 32.461733,-86.467071 32.460996)\r\n1005;901;all;Autauga County 24;Autauga;AL;36091;LINESTRING(-86.605184 32.686264,-86.604843 32.686289,-86.604671 32.686316,-86.604415 32.686367,-86.604243 32.686411,-86.604074 32.686471,-86.603991 32.686509,-86.60391 32.686552,-86.603836 32.686602,-86.603324 32.68698,-86.60326 32.68702,-86.603195 32.687054,-86.603128 32.68708,-86.603062 32.6871,-86.602996 32.68711,-86.602931 32.687116,-86.602865 32.687106,-86.602797 32.687092,-86.602725 32.68707,-86.602272 32.686894,-86.602202 32.686858,-86.602112 32.686828,-86.602018 32.686807,-86.601919 32.686802,-86.601738 32.686804,-86.601645 32.686813,-86.601554 32.686829,-86.601466 32.686851,-86.601305 32.686903,-86.601151 32.686969,-86.601001 32.687042,-86.600783 32.68716,-86.60065 32.687261,-86.600529 32.687366,-86.600297 32.687583,-86.599806 32.688082,-86.599632 32.688231,-86.599443 32.68837,-86.599303 32.688461)\r\n2100;2124;even;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.444174 32.547072,-86.442109 32.547804,-86.441559 32.548007,-86.441398 32.548071,-86.441247 32.548145,-86.441099 32.548225,-86.440959 32.548315,-86.440754 32.548458,-86.440653 32.548552)\r\n2101;2125;odd;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.444249 32.547224,-86.442187 32.547956,-86.441641 32.548159,-86.441492 32.548221,-86.441351 32.548289,-86.441215 32.548365,-86.441083 32.548447,-86.440894 32.548584,-86.440793 32.548667)\r\n463;459;odd;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.818518 32.424101,-86.818513 32.424248,-86.818542 32.424546,-86.818586 32.424839,-86.818653 32.42513,-86.818695 32.425275,-86.818743 32.42542,-86.818819 32.425606)\r\n462;458;even;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.818712 32.424102,-86.818715 32.424242,-86.81874 32.424528,-86.818784 32.424813,-86.818847 32.425094,-86.818887 32.425233,-86.818933 32.42537,-86.819003 32.425554)\r\n1858;1880;even;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.464183 32.570933,-86.464182 32.571537,-86.464192 32.572626,-86.464184 32.573058,-86.464183 32.574802)\r\n1855;1885;odd;US Hwy 31;Autauga;AL;36067;LINESTRING(-86.464377 32.570933,-86.464378 32.571537,-86.464388 32.572626,-86.46438 32.57306,-86.464378 32.574802)\r\n101;199;all;Hughes St;Autauga;AL;36067;LINESTRING(-86.470332 32.485627,-86.471121 32.48562)\r\n100;198;even;Faulk Qtrs;Autauga;AL;36067;LINESTRING(-86.473602 32.468874,-86.473608 32.468869,-86.473609 32.468713,-86.473563 32.46828)\r\n101;199;odd;Faulk Qtrs;Autauga;AL;36067;LINESTRING(-86.473409 32.468855,-86.473404 32.468857,-86.473409 32.468719,-86.473369 32.468294)\r\n1301;1369;all;Autauga County 103;Autauga;AL;36758;LINESTRING(-86.902227 32.609955,-86.902081 32.611241)\r\n200;298;even;Emmett Ave;Autauga;AL;36067;LINESTRING(-86.50809 32.469704,-86.508103 32.469684,-86.508127 32.46954,-86.50819 32.469314)\r\n201;299;odd;Emmett Ave;Autauga;AL;36067;LINESTRING(-86.507903 32.469659,-86.507901 32.469646,-86.507927 32.469506,-86.508002 32.469273)\r\n900;998;even;Bowman Curve Rd;Autauga;AL;36067;LINESTRING(-86.592672 32.527745,-86.592655 32.52786,-86.592642 32.527921,-86.592619 32.527982,-86.59259 32.528044,-86.592482 32.528241,-86.592415 32.528382,-86.592366 32.528531,-86.59234 32.528685,-86.592339 32.528769,-86.59235 32.528856,-86.592384 32.528939,-86.592428 32.529011,-86.59247 32.529073,-86.592689 32.529456,-86.592712 32.529514,-86.592763 32.529731,-86.592802 32.529812,-86.592855 32.529885,-86.592915 32.529953,-86.592987 32.530009,-86.593064 32.530063,-86.593155 32.530106,-86.593251 32.530133,-86.593347 32.53015,-86.593442 32.530156,-86.593536 32.530158,-86.593964 32.530125,-86.594127 32.530124,-86.594382 32.530138,-86.594558 32.53014,-86.594736 32.530135,-86.594765 32.530129)\r\n901;993;odd;Bowman Curve Rd;Autauga;AL;36067;LINESTRING(-86.592866 32.527757,-86.592861 32.527886,-86.592838 32.527965,-86.592809 32.52804,-86.592774 32.528112,-86.592666 32.528307,-86.592609 32.528436,-86.592568 32.528567,-86.592546 32.528699,-86.592543 32.528759,-86.592556 32.528816,-86.592576 32.528873,-86.592606 32.528931,-86.592648 32.528993,-86.592881 32.52939,-86.592912 32.529468,-86.592965 32.529679,-86.59299 32.529734,-86.593025 32.529787,-86.593071 32.529835,-86.593121 32.529879,-86.59318 32.529915,-86.593241 32.529944,-86.593307 32.529965,-86.593379 32.529978,-86.593454 32.529986,-86.59353 32.529988,-86.593954 32.529953,-86.594133 32.529954,-86.59439 32.52997,-86.594556 32.529974,-86.59472 32.529965,-86.594743 32.529966)\r\n700;798;all;Coleman Way;Autauga;AL;36067;LINESTRING(-86.478759 32.500271,-86.478759 32.501337)\r\n199;101;odd;Hunts Aly;Autauga;AL;36067;LINESTRING(-86.47395 32.461493,-86.473926 32.46205,-86.473902 32.462234,-86.473979 32.462325,-86.474092 32.46234,-86.475254 32.462378)\r\n198;100;even;Hunts Aly;Autauga;AL;36067;LINESTRING(-86.474144 32.461499,-86.47412 32.462056,-86.474132 32.462172,-86.474117 32.462151,-86.474124 32.462162,-86.475263 32.462214)\r\n998;934;all;Greencrest St;Autauga;AL;36067;LINESTRING(-86.455736 32.488679,-86.455736 32.488598)\r\n746;776;all;S McQueen Smith Rd;Autauga;AL;36066;LINESTRING(-86.418204 32.458286,-86.418212 32.457757,-86.41822 32.457615)\r\n1601;1699;all;Timber Trl;Autauga;AL;36022;LINESTRING(-86.450052 32.543972,-86.450502 32.544129,-86.450587 32.544167,-86.450737 32.544257,-86.45081 32.544316,-86.450877 32.544384,-86.450922 32.544466,-86.450951 32.544549,-86.450969 32.544631,-86.450978 32.544785,-86.450971 32.544939,-86.450902 32.545438,-86.450893 32.545574,-86.450903 32.545634,-86.450939 32.545759,-86.451001 32.545876,-86.451038 32.545925,-86.451143 32.546027,-86.451199 32.546072,-86.45193 32.546564,-86.452065 32.546648,-86.45213 32.546682,-86.452271 32.546742,-86.452417 32.546784,-86.452572 32.546811,-86.452817 32.546837,-86.452877 32.546842)\r\n1537;1517;odd;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.527008 32.430485,-86.526916 32.430482,-86.52556 32.430496)\r\n1530;1522;even;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.527003 32.430649,-86.526914 32.430648,-86.525562 32.430661)\r\n1420;1438;all;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.491007 32.507618,-86.491044 32.507648,-86.493827 32.509765,-86.494331 32.510161)\r\n398;330;all;Larry St;Autauga;AL;36067;LINESTRING(-86.489423 32.436773,-86.489365 32.436802,-86.489261 32.436843,-86.489092 32.436846,-86.489008 32.436748,-86.488966 32.436656)\r\n1568;1572;all;Rolling Hills Dr;Autauga;AL;36067;LINESTRING(-86.546353 32.447244,-86.546673 32.447244,-86.546964 32.447238)\r\n1258;1298;even;Huie St;Autauga;AL;36066;LINESTRING(-86.441709 32.464557,-86.441597 32.46458,-86.44151 32.464603,-86.441194 32.464713,-86.44104 32.464756,-86.440801 32.464806,-86.440477 32.464843,-86.440151 32.46483,-86.439829 32.464783,-86.4396 32.46472,-86.439303 32.464598,-86.439162 32.464528,-86.438969 32.464407,-86.43875 32.464203,-86.438493 32.463917,-86.438345 32.463742,-86.438204 32.463559,-86.438019 32.463358)\r\n1259;1299;odd;Huie St;Autauga;AL;36066;LINESTRING(-86.441759 32.464716,-86.441653 32.464742,-86.44158 32.464763,-86.441264 32.464873,-86.441096 32.46492,-86.440839 32.464978,-86.440485 32.465013,-86.440129 32.465004,-86.439779 32.464955,-86.43952 32.464884,-86.439209 32.464746,-86.439052 32.464674,-86.438823 32.464543,-86.438594 32.464309,-86.438333 32.464015,-86.438183 32.463836,-86.43804 32.463657,-86.437864 32.463458)\r\n212;298;even;Summer Ct;Autauga;AL;36066;LINESTRING(-86.419147 32.454849,-86.419139 32.454852,-86.419001 32.454942,-86.418891 32.455017,-86.418816 32.455141,-86.418784 32.455272,-86.418778 32.455424,-86.418799 32.455508)\r\n201;299;odd;Summer Ct;Autauga;AL;36066;LINESTRING(-86.419272 32.454974,-86.419265 32.454982,-86.419133 32.455072,-86.419069 32.455133,-86.41902 32.455205,-86.418992 32.455296,-86.418982 32.455414,-86.418991 32.455481)\r\n401;499;odd;Shiloh Dr;Autauga;AL;36003;LINESTRING(-86.733295 32.486756,-86.733284 32.48679,-86.733314 32.486773,-86.733662 32.486785,-86.733856 32.486773,-86.733934 32.486753,-86.734039 32.486768,-86.734054 32.486772,-86.734125 32.486882,-86.734238 32.487078,-86.734294 32.487207,-86.734363 32.487469,-86.734415 32.487611,-86.734482 32.48775,-86.73469 32.488153,-86.734751 32.488285,-86.734802 32.488418,-86.73484 32.488551,-86.734892 32.488832,-86.735078 32.490202,-86.735241 32.491285,-86.735294 32.49172,-86.735309 32.492007,-86.73527 32.492609)\r\n3198;3100;even;Shiloh Dr;Autauga;AL;36003;LINESTRING(-86.733155 32.486641,-86.733184 32.486592,-86.733316 32.486607,-86.733656 32.486615,-86.733814 32.486597,-86.733908 32.486573,-86.734151 32.486574,-86.73424 32.486672,-86.734303 32.48681,-86.734422 32.487008,-86.734496 32.487155,-86.734559 32.487427,-86.734605 32.487555,-86.734664 32.487686,-86.734872 32.488089,-86.734939 32.488227,-86.734998 32.48837,-86.735038 32.488519,-86.735088 32.48881,-86.735272 32.490182,-86.735437 32.491265,-86.735496 32.491708,-86.735505 32.492009,-86.735464 32.492618)\r\n1947;1949;all;Calumet Pkwy;Autauga;AL;36066;LINESTRING(-86.412897 32.490673,-86.412893 32.49069,-86.412867 32.490733,-86.412857 32.49074)\r\n1000;1098;even;E Main St;Autauga;AL;36066;LINESTRING(-86.4473 32.460244,-86.447143 32.460247,-86.446117 32.46025)\r\n1001;1099;odd;E Main St;Autauga;AL;36066;LINESTRING(-86.447305 32.460409,-86.447145 32.460413,-86.446117 32.460415)\r\n2000;2044;even;Autauga County 66;Autauga;AL;36022;LINESTRING(-86.470786 32.578526,-86.47082 32.578614,-86.470862 32.57876,-86.471095 32.580132,-86.471143 32.58035,-86.471229 32.580635,-86.471308 32.580847,-86.471499 32.581253,-86.471544 32.58134)\r\n2001;2081;odd;Autauga County 66;Autauga;AL;36022;LINESTRING(-86.470967 32.578465,-86.47102 32.578562,-86.471062 32.578728,-86.471291 32.580104,-86.471339 32.580314,-86.471421 32.580589,-86.471498 32.580791,-86.471681 32.581189,-86.471723 32.581275)\r\n400;498;even;Dogwoods Dr;Autauga;AL;36022;LINESTRING(-86.420983 32.533108,-86.420993 32.533301,-86.420996 32.533326)\r\n401;499;odd;Dogwoods Dr;Autauga;AL;36022;LINESTRING(-86.421178 32.533101,-86.421189 32.533291,-86.42119 32.533315)\r\n200;298;even;E Poplar St;Autauga;AL;36066;LINESTRING(-86.441822 32.467603,-86.441672 32.467541,-86.440695 32.467108,-86.440161 32.46688,-86.439648 32.466648)\r\n201;299;odd;E Poplar St;Autauga;AL;36066;LINESTRING(-86.441738 32.467751,-86.441584 32.467691,-86.440605 32.467256,-86.440071 32.467028,-86.439556 32.466793)\r\n1682;1728;even;Autauga County 85;Autauga;AL;36067;LINESTRING(-86.482705 32.528809,-86.482562 32.528916,-86.482048 32.5293,-86.479468 32.531191,-86.479214 32.531389,-86.479094 32.531494,-86.478865 32.531714,-86.478759 32.531834,-86.478563 32.532074,-86.478472 32.532198,-86.478384 32.532328,-86.478305 32.532461,-86.478232 32.532596,-86.478105 32.532867,-86.478047 32.533006,-86.477997 32.533148,-86.477918 32.533433,-86.477888 32.533579,-86.477872 32.533695)\r\n1701;1733;odd;Autauga County 85;Autauga;AL;36067;LINESTRING(-86.482834 32.528932,-86.48269 32.52904,-86.482176 32.529424,-86.4796 32.531315,-86.479354 32.531509,-86.47924 32.531608,-86.479021 32.531822,-86.478921 32.531932,-86.478729 32.532166,-86.478642 32.532284,-86.47856 32.532408,-86.478485 32.532533,-86.478416 32.532662,-86.478291 32.532925,-86.478237 32.533058,-86.478191 32.533192,-86.478114 32.533467,-86.478084 32.533605,-86.478065 32.533716)\r\n399;391;odd;Greystone Way;Autauga;AL;36066;LINESTRING(-86.42488 32.46886,-86.424868 32.468875,-86.42481 32.468963,-86.424697 32.46909,-86.424542 32.46927,-86.424457 32.469402,-86.424244 32.469793,-86.42424 32.469804)\r\n398;300;even;Greystone Way;Autauga;AL;36066;LINESTRING(-86.425061 32.46892,-86.425054 32.468945,-86.424988 32.469061,-86.424857 32.469192,-86.424716 32.469362,-86.424637 32.46948,-86.424422 32.469869,-86.424411 32.469882)\r\n399;301;odd;Hidden Hills Rd;Autauga;AL;36022;LINESTRING(-86.439318 32.548209,-86.439317 32.548073,-86.439267 32.547614,-86.439191 32.547091,-86.43908 32.546942,-86.438832 32.546801,-86.438378 32.54676,-86.438091 32.546771,-86.437937 32.546717,-86.437751 32.546621,-86.437617 32.546499)\r\n300;398;even;Hidden Hills Rd;Autauga;AL;36022;LINESTRING(-86.439124 32.548214,-86.439117 32.548083,-86.439069 32.547634,-86.438975 32.547159,-86.438914 32.547078,-86.438748 32.546985,-86.438372 32.546928,-86.438051 32.546957,-86.437847 32.546869,-86.437603 32.546769,-86.437465 32.546602)\r\n203;201;odd;Cherry Dr;Autauga;AL;36067;LINESTRING(-86.455362 32.478391,-86.455048 32.478396,-86.454877 32.478396,-86.454578 32.478401)\r\n210;200;even;Cherry Dr;Autauga;AL;36067;LINESTRING(-86.455366 32.478556,-86.45505 32.478562,-86.454879 32.478562,-86.454581 32.478565)\r\n799;701;odd;Wedgewood Ct;Autauga;AL;36067;LINESTRING(-86.49776 32.452984,-86.497736 32.451854,-86.497711 32.45128,-86.497714 32.451019)\r\n798;700;even;Wedgewood Ct;Autauga;AL;36067;LINESTRING(-86.497565 32.452987,-86.49754 32.451858,-86.497515 32.451282,-86.49752 32.451017)\r\n600;652;even;Autauga County 68;Autauga;AL;36051;LINESTRING(-86.450954 32.674847,-86.449263 32.674926,-86.443382 32.675211,-86.441079 32.67532,-86.440393 32.675365,-86.440131 32.675397,-86.439872 32.67544,-86.43964 32.675495)\r\n601;665;odd;Autauga County 68;Autauga;AL;36022;LINESTRING(-86.450964 32.675011,-86.449275 32.67509,-86.443394 32.675375,-86.441093 32.675486,-86.440415 32.675533,-86.440165 32.675563,-86.439918 32.675606,-86.43969 32.675654)\r\n2601;2671;all;Co Rd 110;Autauga;AL;36758;LINESTRING(-86.844512 32.659769,-86.844471 32.659781,-86.844414 32.659805)\r\n212;298;even;Ridgewood Rd;Autauga;AL;36067;LINESTRING(-86.455795 32.485916,-86.455478 32.485707,-86.454934 32.485354,-86.454785 32.48527,-86.454543 32.485171,-86.45437 32.485127,-86.454196 32.485093,-86.45393 32.485077,-86.453574 32.485094,-86.453519 32.485106)\r\n215;299;odd;Ridgewood Rd;Autauga;AL;36067;LINESTRING(-86.455676 32.486046,-86.455358 32.485839,-86.454818 32.485494,-86.454683 32.485422,-86.454467 32.485335,-86.454318 32.485293,-86.454164 32.485265,-86.453928 32.485243,-86.453598 32.485266,-86.453552 32.485268)\r\n454;508;all;E Main St;Autauga;AL;36067;LINESTRING(-86.46248 32.45934,-86.461871 32.459384)\r\n2551;2365;odd;Autauga County 46;Autauga;AL;36067;LINESTRING(-86.63499 32.52125,-86.63488 32.521249,-86.634804 32.521244,-86.634727 32.521235,-86.634654 32.52122,-86.634502 32.521178,-86.634352 32.521125,-86.634205 32.521062,-86.633614 32.520779,-86.633324 32.520634,-86.632605 32.520249,-86.632241 32.520057,-86.632008 32.519954,-86.631845 32.519896,-86.631678 32.519847,-86.631427 32.519782,-86.630843 32.519677,-86.630437 32.519588,-86.630281 32.519544,-86.630051 32.519466,-86.629904 32.519406,-86.629382 32.519163,-86.627578 32.518341,-86.627209 32.518161,-86.626755 32.517956,-86.626519 32.51786,-86.626353 32.517802,-86.626178 32.517764,-86.626084 32.517751,-86.625905 32.51774,-86.625726 32.51774,-86.625548 32.517754,-86.625456 32.517767,-86.625285 32.517806,-86.62479 32.51793,-86.623246 32.518341,-86.62268 32.518497,-86.62178 32.518721,-86.621132 32.5189,-86.619186 32.519424,-86.618439 32.519621)\r\n2498;2308;even;Autauga County 46;Autauga;AL;36067;LINESTRING(-86.634992 32.521415,-86.634874 32.521419,-86.634782 32.521414,-86.634691 32.521403,-86.6346 32.521386,-86.63443 32.52134,-86.634266 32.521279,-86.634111 32.52121,-86.633516 32.520923,-86.63322 32.520776,-86.632501 32.520389,-86.632141 32.520205,-86.631922 32.520108,-86.631773 32.520054,-86.631616 32.520007,-86.631377 32.519948,-86.630797 32.519841,-86.630381 32.51975,-86.630213 32.519704,-86.629969 32.519622,-86.629812 32.519554,-86.629288 32.519309,-86.627482 32.518487,-86.627113 32.518307,-86.626665 32.518106,-86.626439 32.518016,-86.626289 32.517968,-86.626134 32.517932,-86.62606 32.517921,-86.625899 32.51791,-86.625736 32.517912,-86.625574 32.517924,-86.625498 32.517935,-86.625337 32.517968,-86.624848 32.518088,-86.623306 32.518499,-86.622738 32.518657,-86.621838 32.518881,-86.621192 32.519058,-86.619244 32.519582,-86.618496 32.519778)\r\n200;298;even;Howard St;Autauga;AL;36067;LINESTRING(-86.471496 32.479911,-86.472174 32.479922,-86.472944 32.479912,-86.473291 32.479921,-86.47341 32.479924,-86.473453 32.479886)\r\n201;299;odd;Howard St;Autauga;AL;36067;LINESTRING(-86.4715 32.479746,-86.472174 32.479758,-86.472944 32.479748,-86.473285 32.479751,-86.47334 32.479736,-86.473355 32.479745)\r\n100;198;even;E 4th St;Autauga;AL;36067;LINESTRING(-86.472309 32.462777,-86.471379 32.462687,-86.470332 32.462611,-86.469743 32.462577)\r\n101;199;odd;E 4th St;Autauga;AL;36067;LINESTRING(-86.472287 32.462941,-86.471359 32.462853,-86.470316 32.462777,-86.46973 32.462742)\r\n926;900;all;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.59655 32.574272,-86.595375 32.574309,-86.595126 32.574333,-86.594964 32.574359,-86.594888 32.574375,-86.594731 32.574419,-86.594655 32.574445,-86.594431 32.574533,-86.59421 32.574635,-86.594068 32.574708,-86.593931 32.574786,-86.59142 32.576366)\r\n1099;1023;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.612501 32.573373,-86.612301 32.573411,-86.611991 32.57345,-86.611492 32.573476,-86.610985 32.573483,-86.609282 32.573473,-86.608597 32.573482,-86.608083 32.5735,-86.607568 32.573529,-86.607224 32.573574,-86.604096 32.574038)\r\n1098;1006;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.612547 32.573533,-86.612341 32.573579,-86.612011 32.57362,-86.6115 32.573644,-86.610985 32.573649,-86.609282 32.573639,-86.608603 32.573648,-86.608095 32.573666,-86.60759 32.573699,-86.607256 32.573738,-86.60413 32.5742)\r\n201;299;odd;Washington St;Autauga;AL;36067;LINESTRING(-86.469488 32.46465,-86.469493 32.464575)\r\n200;298;even;Washington St;Autauga;AL;36067;LINESTRING(-86.469294 32.464642,-86.469299 32.464567)\r\n2810;2898;all;Whitwood Ln;Autauga;AL;36067;LINESTRING(-86.648899 32.661996,-86.648895 32.66217,-86.649019 32.662271,-86.649134 32.662345,-86.649274 32.662372,-86.649988 32.662354)\r\n1600;1604;even;Autauga County 163;Autauga;AL;36051;LINESTRING(-86.583407 32.613592,-86.583389 32.613769)\r\n1601;1605;odd;Autauga County 163;Autauga;AL;36051;LINESTRING(-86.583602 32.613606,-86.583584 32.613783)\r\n2409;2401;odd;Wyncove Way;Autauga;AL;36067;LINESTRING(-86.5173 32.447112,-86.517337 32.447367,-86.517303 32.447575,-86.517257 32.447795,-86.517258 32.44795,-86.51731 32.448374,-86.51731 32.448435,-86.517304 32.448524)\r\n2410;2400;even;Wyncove Way;Autauga;AL;36067;LINESTRING(-86.517493 32.447093,-86.517531 32.447367,-86.517499 32.447599,-86.517465 32.447809,-86.517462 32.447942,-86.517512 32.448368,-86.517508 32.448443,-86.517498 32.448536)\r\n899;801;odd;Strickland Landing Rd;Autauga;AL;36003;LINESTRING(-86.636338 32.403858,-86.635876 32.403886,-86.63578 32.403903,-86.635683 32.403937,-86.635586 32.403988,-86.635512 32.404068,-86.635473 32.404161,-86.635468 32.404249,-86.635471 32.404477,-86.635477 32.404899,-86.635461 32.404949,-86.635429 32.404997,-86.635214 32.405212,-86.635094 32.405318,-86.634981 32.405429,-86.634924 32.405489,-86.634872 32.405558,-86.634825 32.405631,-86.6348 32.405711,-86.634782 32.405796,-86.634792 32.405964,-86.634838 32.406054,-86.634906 32.406121,-86.634973 32.406183,-86.635176 32.406335,-86.635399 32.406467,-86.635702 32.40661,-86.635917 32.406726,-86.636125 32.40685,-86.636804 32.407297,-86.637021 32.407426,-86.637181 32.407501,-86.63735 32.40756,-86.637523 32.407604,-86.63778 32.407648,-86.638787 32.407824,-86.639451 32.407949)\r\n898;816;even;Strickland Landing Rd;Autauga;AL;36003;LINESTRING(-86.636354 32.404022,-86.635908 32.40406,-86.635844 32.404073,-86.635785 32.404095,-86.635738 32.404126,-86.635706 32.40416,-86.635685 32.404203,-86.635672 32.404259,-86.635669 32.404475,-86.635693 32.404923,-86.635657 32.405017,-86.635609 32.405101,-86.635358 32.405324,-86.635242 32.40543,-86.635135 32.405535,-86.63509 32.405587,-86.63505 32.405642,-86.635021 32.405697,-86.634998 32.405753,-86.634984 32.405804,-86.635006 32.405918,-86.635026 32.405962,-86.635062 32.406011,-86.635115 32.406059,-86.635302 32.406199,-86.635507 32.406321,-86.635806 32.406464,-86.636027 32.406588,-86.636243 32.406714,-86.636922 32.407161,-86.637129 32.40728,-86.637269 32.407345,-86.637418 32.407398,-86.637573 32.407438,-86.63782 32.407486,-86.638829 32.407662,-86.639494 32.407789)\r\n1000;1098;even;Autauga County 6;Autauga;AL;36067;LINESTRING(-86.571068 32.550536,-86.571205 32.550504,-86.571363 32.55048,-86.571699 32.550456,-86.572898 32.550428,-86.573235 32.550433,-86.573393 32.550446,-86.573547 32.550473,-86.573697 32.550517,-86.573842 32.550575,-86.573982 32.550645,-86.574122 32.550723,-86.574537 32.550983,-86.574683 32.551066,-86.574979 32.551219,-86.575504 32.551466,-86.575875 32.551651,-86.575945 32.551675)\r\n1001;1157;odd;Autauga County 6;Autauga;AL;36067;LINESTRING(-86.571006 32.55038,-86.571155 32.55033,-86.571339 32.55031,-86.571689 32.550288,-86.572896 32.550262,-86.573243 32.550263,-86.573423 32.550272,-86.573603 32.550305,-86.573777 32.550357,-86.573938 32.550425,-86.57409 32.550501,-86.574236 32.550587,-86.574651 32.550845,-86.574791 32.550924,-86.575079 32.551075,-86.5756 32.551322,-86.575969 32.551499,-86.576029 32.551527)\r\n201;223;odd;Givens Ct;Autauga;AL;36022;LINESTRING(-86.485387 32.590288,-86.485384 32.590219,-86.485426 32.589723,-86.485465 32.589521,-86.485469 32.589426,-86.48546 32.589316,-86.485413 32.58923,-86.485306 32.589103)\r\n200;242;even;Givens Ct;Autauga;AL;36022;LINESTRING(-86.485192 32.590295,-86.485188 32.590217,-86.485224 32.589703,-86.485261 32.589503,-86.485267 32.589432,-86.485248 32.589364,-86.485227 32.589314,-86.485143 32.589193)\r\n1377;1367;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.645515 32.552911,-86.645653 32.553944,-86.645681 32.554234,-86.645689 32.554375,-86.645678 32.554663,-86.645651 32.554951,-86.645629 32.55509,-86.645598 32.555231,-86.645559 32.555371,-86.645515 32.555509,-86.645509 32.555531)\r\n1386;1372;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.645708 32.552892,-86.645849 32.553928,-86.645881 32.554224,-86.645885 32.554375,-86.645878 32.554671,-86.645851 32.554969,-86.645825 32.555118,-86.645792 32.555265,-86.645751 32.555411,-86.645705 32.555555,-86.645695 32.555579)\r\n1300;1398;even;Myrtle Wood Ln;Autauga;AL;36067;LINESTRING(-86.543175 32.503478,-86.543201 32.503877,-86.543267 32.50417,-86.543419 32.50474,-86.54368 32.505508,-86.5438 32.505784,-86.543934 32.506133,-86.543974 32.506204,-86.544144 32.506462,-86.544405 32.506829,-86.544515 32.507019,-86.544572 32.507146,-86.544615 32.50728,-86.544662 32.507487,-86.544685 32.507613,-86.544683 32.50762)\r\n1301;1399;odd;Myrtle Wood Ln;Autauga;AL;36067;LINESTRING(-86.54337 32.503467,-86.543405 32.503855,-86.543461 32.504136,-86.543613 32.504698,-86.543872 32.505456,-86.543986 32.50573,-86.544124 32.506069,-86.544154 32.506128,-86.544316 32.506378,-86.544583 32.506747,-86.544703 32.506951,-86.544766 32.507094,-86.544813 32.507242,-86.544858 32.507461,-86.544881 32.507617,-86.544874 32.50765)\r\n1399;1305;odd;Wright St;Autauga;AL;36066;LINESTRING(-86.442084 32.469565,-86.442085 32.469379,-86.442053 32.468744)\r\n1398;1300;even;Wright St;Autauga;AL;36066;LINESTRING(-86.441889 32.469566,-86.441887 32.469383,-86.441859 32.468751)\r\n100;198;even;Regent Ct;Autauga;AL;36066;LINESTRING(-86.415809 32.466473,-86.415796 32.46657,-86.415774 32.466674,-86.415744 32.46676,-86.415701 32.466845,-86.415619 32.466958,-86.415467 32.467104,-86.415395 32.467158)\r\n101;199;odd;Regent Ct;Autauga;AL;36066;LINESTRING(-86.416003 32.466489,-86.415994 32.46659,-86.415976 32.46671,-86.41594 32.466822,-86.415881 32.466923,-86.415793 32.467062,-86.415611 32.467238,-86.41551 32.467291)\r\n100;128;even;Palmer Rd;Autauga;AL;36003;LINESTRING(-86.684023 32.437305,-86.683946 32.437336,-86.683894 32.437351,-86.683472 32.437367,-86.683129 32.43738,-86.68296 32.437384,-86.682443 32.437377,-86.682247 32.437373,-86.682036 32.437468,-86.681991 32.437669,-86.682037 32.437853,-86.682384 32.4382,-86.682485 32.438316,-86.682671 32.438557,-86.68275 32.43868,-86.682811 32.438805,-86.682852 32.438936,-86.682873 32.439069,-86.682879 32.439208,-86.682869 32.439354,-86.68287 32.439513,-86.682917 32.439671,-86.683006 32.439813,-86.683115 32.43994,-86.683492 32.440335,-86.68369 32.440565,-86.683773 32.440682,-86.683844 32.440807,-86.683902 32.440937,-86.683943 32.44107,-86.683958 32.441136,-86.683993 32.441422,-86.684002 32.441559,-86.684005 32.441617)\r\n101;145;odd;Palmer Rd;Autauga;AL;36003;LINESTRING(-86.684137 32.437438,-86.684042 32.437512,-86.683922 32.437531,-86.68348 32.437533,-86.683135 32.437548,-86.68296 32.437548,-86.682447 32.437545,-86.682311 32.437563,-86.682232 32.437604,-86.682177 32.437669,-86.682237 32.437761,-86.68254 32.438098,-86.682649 32.438218,-86.682843 32.438469,-86.682934 32.438604,-86.683007 32.438749,-86.683054 32.438902,-86.683079 32.439055,-86.683079 32.439212,-86.683065 32.439356,-86.68308 32.439487,-86.683117 32.439607,-86.683184 32.439723,-86.683275 32.439838,-86.683648 32.440233,-86.683858 32.440469,-86.683953 32.4406,-86.68403 32.440739,-86.684096 32.440885,-86.684143 32.441034,-86.684156 32.441114,-86.684191 32.441408,-86.6842 32.441553,-86.6842 32.441613)\r\n1500;1698;even;Autauga County 1;Autauga;AL;36006;LINESTRING(-86.751841 32.624206,-86.751683 32.624277,-86.750085 32.624991,-86.749851 32.625099,-86.749628 32.625224,-86.749556 32.625273,-86.749358 32.625422,-86.749295 32.625479,-86.749236 32.625542,-86.749081 32.625722,-86.749033 32.625791,-86.748993 32.625862,-86.748918 32.626002,-86.748808 32.626283,-86.748016 32.628435,-86.747956 32.628563,-86.747921 32.628625,-86.747837 32.628748,-86.747744 32.62886,-86.747696 32.628909,-86.747644 32.628954,-86.747521 32.629044,-86.747459 32.629082,-86.747323 32.629153,-86.747255 32.629182,-86.747104 32.629232,-86.746866 32.629286,-86.74671 32.629308,-86.746301 32.629338,-86.745272 32.629383,-86.744841 32.629393,-86.744502 32.629383,-86.744081 32.62935,-86.743567 32.629292,-86.743133 32.629255,-86.742782 32.62925,-86.742511 32.629256,-86.742242 32.629287,-86.741697 32.629376,-86.741267 32.629456)\r\n1601;1699;odd;Autauga County 1;Autauga;AL;36006;LINESTRING(-86.751933 32.624351,-86.751775 32.624423,-86.750179 32.625137,-86.749957 32.625245,-86.749748 32.625362,-86.749686 32.625403,-86.7495 32.625544,-86.749447 32.625591,-86.749396 32.625644,-86.749251 32.625816,-86.749211 32.625873,-86.749173 32.625934,-86.749108 32.626064,-86.748996 32.626335,-86.748208 32.628493,-86.74814 32.628631,-86.748099 32.628703,-86.748009 32.62884,-86.747906 32.628964,-86.747846 32.629025,-86.747782 32.629078,-86.747647 32.629178,-86.747571 32.629224,-86.747423 32.629301,-86.747339 32.629338,-86.74717 32.629398,-86.746908 32.629456,-86.746734 32.629476,-86.746315 32.629504,-86.74528 32.629549,-86.744841 32.629557,-86.74449 32.629553,-86.744059 32.629516,-86.743545 32.629458,-86.743121 32.629425,-86.742784 32.629416,-86.742529 32.629428,-86.742274 32.629455,-86.741737 32.62954,-86.741308 32.629616)\r\n600;610;even;Vintage Way;Autauga;AL;36067;LINESTRING(-86.451332 32.42574,-86.451292 32.425748,-86.451225 32.425762,-86.451025 32.42582,-86.450978 32.425838)\r\n601;607;odd;Vintage Way;Autauga;AL;36067;LINESTRING(-86.45138 32.425899,-86.451344 32.425908,-86.451285 32.425924,-86.451095 32.425978,-86.451052 32.425991)\r\n498;426;all;Autauga County 21;Autauga;AL;36003;LINESTRING(-86.608513 32.394012,-86.6086 32.394168,-86.608737 32.394439,-86.608919 32.394853,-86.609072 32.395277,-86.60916 32.395561,-86.609455 32.396703,-86.610545 32.400982,-86.610829 32.402122,-86.610911 32.402478,-86.610919 32.402539)\r\n800;898;even;Nora Ln;Autauga;AL;36067;LINESTRING(-86.649765 32.52423,-86.649764 32.524307,-86.649769 32.52467,-86.649765 32.525177,-86.649768 32.525394,-86.649761 32.525754,-86.649761 32.525896,-86.649748 32.52618,-86.649726 32.52649)\r\n801;899;odd;Nora Ln;Autauga;AL;36067;LINESTRING(-86.649959 32.524232,-86.649958 32.524307,-86.649965 32.52467,-86.649961 32.525177,-86.649964 32.525394,-86.649957 32.525754,-86.649959 32.525898,-86.649944 32.526188,-86.64992 32.5265)\r\n1210;1298;even;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.487977 32.431985,-86.488085 32.431936,-86.489007 32.431537,-86.489222 32.431451)\r\n1053;1299;odd;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.487886 32.431839,-86.487995 32.43179,-86.488921 32.431387,-86.489141 32.431302)\r\n750;742;all;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.559938 32.575605,-86.558913 32.575585,-86.558394 32.575556,-86.55805 32.575512,-86.557878 32.575485,-86.557626 32.575437,-86.557133 32.575315,-86.556861 32.575242)\r\n1600;1798;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.536034 32.484324,-86.538306 32.485872,-86.539309 32.48656,-86.542265 32.488573,-86.542936 32.489032,-86.543346 32.489302,-86.543629 32.489473,-86.543923 32.48963,-86.544225 32.489778,-86.544381 32.489844,-86.544695 32.489975,-86.545016 32.490093,-86.545181 32.490146,-86.54551 32.490246,-86.54584 32.490331,-86.546011 32.490372,-86.546351 32.490437,-86.546526 32.490464,-86.546873 32.490504,-86.547392 32.490542,-86.547742 32.490547,-86.548432 32.490543,-86.548806 32.490535,-86.552216 32.490474,-86.553934 32.490448,-86.556425 32.490404)\r\n1601;1747;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.536156 32.484196,-86.538428 32.485744,-86.539431 32.486432,-86.542387 32.488445,-86.543058 32.488902,-86.543464 32.489168,-86.543741 32.489333,-86.544025 32.489486,-86.544321 32.48963,-86.544469 32.489696,-86.544779 32.489823,-86.545092 32.489937,-86.545249 32.48999,-86.545572 32.490086,-86.545896 32.490171,-86.546059 32.490208,-86.546391 32.490273,-86.546556 32.490298,-86.546895 32.490336,-86.547402 32.490372,-86.547744 32.490381,-86.54843 32.490377,-86.548802 32.490371,-86.552212 32.49031,-86.55393 32.490284,-86.556421 32.490239)\r\n309;301;all;Autauga County 36;Autauga;AL;36051;LINESTRING(-86.463493 32.704013,-86.463797 32.703975,-86.464214 32.703933,-86.464461 32.703922,-86.464624 32.703933,-86.464786 32.70395,-86.465451 32.704057,-86.465528 32.704075,-86.465683 32.704119,-86.465915 32.704201,-86.466061 32.704263,-86.466136 32.704298)\r\n4498;4400;even;Marvin Ct;Autauga;AL;36758;LINESTRING(-86.902115 32.61144,-86.902368 32.611445,-86.902792 32.611463,-86.903162 32.611464,-86.9033 32.611475,-86.903443 32.611501,-86.90352 32.611519)\r\n4401;4499;odd;Marvin Ct;Autauga;AL;36758;LINESTRING(-86.902118 32.611276,-86.902374 32.611277,-86.902798 32.611295,-86.903168 32.611294,-86.90333 32.611299,-86.903499 32.611335,-86.903582 32.611363)\r\n134;198;even;Scott Ln;Autauga;AL;36066;LINESTRING(-86.434757 32.464347,-86.434756 32.464274,-86.434761 32.463698,-86.434746 32.463048,-86.434742 32.462898,-86.434715 32.46277,-86.434638 32.462664,-86.43451 32.462599,-86.434315 32.462558,-86.434187 32.462558,-86.43412 32.46261)\r\n149;199;odd;Scott Ln;Autauga;AL;36066;LINESTRING(-86.434563 32.464351,-86.43456 32.464276,-86.434565 32.4637,-86.434548 32.463054,-86.434534 32.462922,-86.434507 32.462842,-86.434474 32.462802,-86.43442 32.462769,-86.434295 32.462734,-86.434261 32.462746,-86.434222 32.46275)\r\n700;702;all;Windmill Dr;Autauga;AL;36067;LINESTRING(-86.487162 32.491145,-86.487817 32.491505,-86.488705 32.491959,-86.489432 32.492339)\r\n1307;1399;odd;Dorchester Dr;Autauga;AL;36067;LINESTRING(-86.471796 32.496676,-86.471659 32.496547,-86.471532 32.496436,-86.471405 32.496364,-86.471392 32.496364)\r\n1306;1308;even;Dorchester Dr;Autauga;AL;36067;LINESTRING(-86.471653 32.496788,-86.471515 32.496665,-86.471398 32.496574,-86.471299 32.496514,-86.471303 32.49651)\r\n1301;1265;odd;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.473591 32.496763,-86.474652 32.495908,-86.47478 32.4958)\r\n1318;1266;even;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.473456 32.496644,-86.474516 32.495788,-86.474644 32.495683)\r\n298;200;all;Caldwell Ln;Autauga;AL;36067;LINESTRING(-86.490711 32.441034,-86.490687 32.440726,-86.490662 32.440135,-86.490657 32.440051)\r\n733;709;odd;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.820932 32.392735,-86.821162 32.393137,-86.821516 32.393804,-86.821902 32.394617,-86.822309 32.395577,-86.822741 32.396685,-86.822786 32.396794)\r\n732;708;even;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.821107 32.392663,-86.82134 32.393067,-86.821698 32.393738,-86.822088 32.394557,-86.822495 32.395523,-86.822927 32.396633,-86.82297 32.396741)\r\n2730;2748;even;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.489238 32.65945,-86.489395 32.660636,-86.489481 32.661207,-86.489486 32.661281,-86.489533 32.661497,-86.489646 32.662138,-86.489841 32.663187)\r\n2739;2749;odd;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.489431 32.659431,-86.489591 32.660616,-86.489681 32.661191,-86.489688 32.661261,-86.489727 32.661471,-86.48984 32.662114,-86.490034 32.663161)\r\n900;1000;all;Deramus St;Autauga;AL;36066;LINESTRING(-86.444839 32.458452,-86.444841 32.458362,-86.444829 32.458071,-86.444825 32.45783)\r\n4000;4098;all;Cecil Smedley Rd;Autauga;AL;36749;LINESTRING(-86.836423 32.508835,-86.836537 32.508817,-86.836649 32.50886,-86.836862 32.508979,-86.837024 32.509044,-86.837169 32.50915,-86.837205 32.509196,-86.837276 32.509273,-86.837425 32.509447,-86.837633 32.509675,-86.837796 32.509839,-86.83797 32.509998,-86.838152 32.510145,-86.838279 32.510231,-86.838415 32.510307,-86.838484 32.510336,-86.83871 32.510413,-86.838864 32.510445,-86.83903 32.510465,-86.839885 32.510537,-86.840229 32.510575,-86.840575 32.510622,-86.840753 32.510659,-86.840922 32.510717,-86.841162 32.510819,-86.841311 32.5109,-86.84146 32.510983,-86.8416 32.511076,-86.841732 32.511173,-86.84186 32.511275,-86.842349 32.511683,-86.842731 32.511976,-86.842852 32.512084,-86.842969 32.512197,-86.843294 32.512541,-86.843461 32.512705,-86.843577 32.512805,-86.8437 32.512898,-86.843832 32.512986,-86.843971 32.51307,-86.844177 32.513186)\r\n798;716;all;State Rte 14 E;Autauga;AL;36066;LINESTRING(-86.443653 32.474904,-86.443773 32.474878,-86.443942 32.474855,-86.444197 32.474827,-86.444375 32.474814)\r\n1998;1900;all;Siesta Dr;Autauga;AL;36067;LINESTRING(-86.524925 32.557758,-86.524501 32.558181,-86.523961 32.558515)\r\n3043;3045;all;Autauga County 535;Autauga;AL;36051;LINESTRING(-86.46563 32.705321,-86.465403 32.705622,-86.465333 32.705709)\r\n2983;2999;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.697262 32.586647,-86.697757 32.587073,-86.699344 32.588461,-86.699773 32.588836)\r\n802;898;even;Bel Ru Lndg;Autauga;AL;36067;LINESTRING(-86.590926 32.367235,-86.590946 32.367157,-86.590977 32.367058,-86.591011 32.366959,-86.591051 32.36686,-86.591093 32.366759,-86.591139 32.366655,-86.591187 32.366549,-86.591241 32.36644,-86.591297 32.366328,-86.591355 32.366214,-86.591412 32.366099,-86.591467 32.365983,-86.591521 32.36587,-86.591575 32.365757,-86.591628 32.365646,-86.591681 32.365537,-86.591782 32.365326,-86.59183 32.365227,-86.591875 32.365137,-86.591915 32.365058,-86.591941 32.365005)\r\n801;899;odd;Bel Ru Lndg;Autauga;AL;36067;LINESTRING(-86.590736 32.3672,-86.590756 32.367121,-86.590781 32.367012,-86.590825 32.366907,-86.590867 32.366806,-86.590909 32.366703,-86.590953 32.366595,-86.591007 32.366487,-86.591061 32.366376,-86.591117 32.366264,-86.591175 32.36615,-86.591232 32.366035,-86.591287 32.365921,-86.591341 32.365808,-86.591393 32.365695,-86.591448 32.365584,-86.591501 32.365475,-86.591602 32.365264,-86.59165 32.365163,-86.591695 32.365073,-86.591735 32.364994,-86.591762 32.364941)\r\n1098;1000;even;Corley Ln;Autauga;AL;36067;LINESTRING(-86.419381 32.424052,-86.419472 32.424304,-86.4195 32.424423,-86.419503 32.424545,-86.419461 32.424739,-86.419418 32.424963,-86.419414 32.425038,-86.419394 32.425079,-86.419304 32.425183,-86.419263 32.425291,-86.419272 32.425422,-86.419375 32.425495,-86.419492 32.42557)\r\n1099;1001;odd;Corley Ln;Autauga;AL;36067;LINESTRING(-86.419567 32.424003,-86.419664 32.424258,-86.419716 32.424399,-86.419715 32.424563,-86.419657 32.424769,-86.419622 32.424979,-86.41962 32.425056,-86.41961 32.425161,-86.419494 32.425277,-86.419469 32.425309,-86.41949 32.42533,-86.419513 32.425367,-86.419614 32.425442)\r\n409;421;all;Buena Vista Way;Autauga;AL;36067;LINESTRING(-86.451328 32.430844,-86.45059 32.430856)\r\n900;998;even;Trotter Trl;Autauga;AL;36066;LINESTRING(-86.417345 32.492405,-86.41734 32.492221,-86.417348 32.491861,-86.417349 32.491712,-86.41734 32.491562,-86.417328 32.491484,-86.417302 32.491404,-86.417268 32.49133,-86.417225 32.49123,-86.417127 32.4912)\r\n901;999;odd;Trotter Trl;Autauga;AL;36066;LINESTRING(-86.417151 32.49241,-86.417144 32.492221,-86.417152 32.491859,-86.417149 32.491718,-86.417138 32.49158,-86.417126 32.491518,-86.417108 32.491458,-86.417082 32.4914,-86.417049 32.49137,-86.41703 32.491343)\r\n800;898;even;Gin Shop Hill Rd;Autauga;AL;36067;LINESTRING(-86.487381 32.45259,-86.487482 32.452453,-86.487802 32.452038,-86.487939 32.451846,-86.488133 32.451514,-86.488229 32.451305,-86.488372 32.450959,-86.488707 32.449975,-86.48874 32.449867)\r\n801;899;odd;Gin Shop Hill Rd;Autauga;AL;36067;LINESTRING(-86.487215 32.452504,-86.487316 32.452363,-86.487634 32.45195,-86.487761 32.451764,-86.487949 32.451444,-86.488043 32.451247,-86.488182 32.450907,-86.488517 32.449931,-86.488552 32.449825)\r\n116;142;even;Autauga County 40;Autauga;AL;36066;LINESTRING(-86.461952 32.58395,-86.461453 32.584366,-86.461207 32.584562,-86.460956 32.584755,-86.460634 32.58499,-86.460175 32.58531,-86.459439 32.585797,-86.459038 32.586067,-86.458564 32.586376,-86.458497 32.586423,-86.458445 32.586459)\r\n113;149;odd;Autauga County 40;Autauga;AL;36066;LINESTRING(-86.462089 32.584067,-86.461591 32.584486,-86.461341 32.584684,-86.461086 32.584879,-86.460762 32.585118,-86.460299 32.58544,-86.459561 32.585927,-86.45916 32.586197,-86.45869 32.586506,-86.458623 32.586555,-86.458561 32.586591)\r\n1671;1685;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.415513 32.430394,-86.41421 32.429136,-86.413832 32.428772,-86.41338 32.428328)\r\n1560;1628;all;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.525526 32.517301,-86.528424 32.520405,-86.528747 32.520745,-86.528975 32.520962,-86.529216 32.521173,-86.529472 32.52137,-86.52974 32.521555,-86.530021 32.521723,-86.530315 32.52188,-86.530572 32.522001,-86.530613 32.522022,-86.530766 32.522092,-86.531051 32.522208,-86.531989 32.522598,-86.532282 32.522736,-86.532424 32.522812,-86.532697 32.522974,-86.532965 32.523151,-86.533092 32.523242,-86.533216 32.523339,-86.533333 32.523439,-86.533559 32.52365,-86.533666 32.523759,-86.533765 32.523869,-86.533942 32.524086,-86.533987 32.524143)\r\n500;598;even;Marlette Ct;Autauga;AL;36067;LINESTRING(-86.458122 32.447871,-86.458063 32.44772)\r\n501;599;odd;Marlette Ct;Autauga;AL;36067;LINESTRING(-86.457937 32.447922,-86.457878 32.447771)\r\n850;892;even;Autauga County 32;Autauga;AL;36091;LINESTRING(-86.591488 32.688736,-86.591513 32.688743,-86.591751 32.688791,-86.591907 32.688832,-86.592136 32.688905,-86.592755 32.689129,-86.593779 32.689491,-86.59392 32.689554,-86.594054 32.689628,-86.594367 32.689834,-86.594506 32.689919,-86.594639 32.690013,-86.594719 32.690062,-86.594808 32.690101,-86.594898 32.690136,-86.594976 32.690148)\r\n829;899;odd;Autauga County 32;Autauga;AL;36091;LINESTRING(-86.591519 32.688574,-86.591553 32.688575,-86.591803 32.688629,-86.591973 32.68867,-86.592212 32.688751,-86.592831 32.688977,-86.593863 32.689337,-86.594026 32.689404,-86.594172 32.689492,-86.594487 32.6897,-86.59463 32.689785,-86.594763 32.689877,-86.594827 32.689914,-86.594896 32.689947,-86.594966 32.68997,-86.595027 32.689989)\r\n343;301;odd;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.830067 32.436467,-86.830662 32.438743,-86.830795 32.439316,-86.830884 32.439746,-86.831011 32.440402)\r\n386;330;even;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.830256 32.436432,-86.830854 32.438709,-86.830987 32.439286,-86.831078 32.439718,-86.831203 32.440376)\r\n1241;1245;all;Mill Village Ln;Autauga;AL;36066;LINESTRING(-86.447746 32.495645,-86.447748 32.495725)\r\n1780;1798;even;Autauga County 81;Autauga;AL;36067;LINESTRING(-86.556302 32.536071,-86.556301 32.536135,-86.556371 32.537229,-86.556398 32.537807,-86.556402 32.538096,-86.556389 32.538382,-86.556347 32.538816,-86.556322 32.539109,-86.556309 32.539401,-86.556308 32.539694,-86.556354 32.540788,-86.556347 32.540946)\r\n1737;1799;odd;Autauga County 81;Autauga;AL;36067;LINESTRING(-86.556496 32.536068,-86.556499 32.536129,-86.556567 32.537221,-86.556596 32.537803,-86.556598 32.538098,-86.556589 32.538392,-86.556543 32.538828,-86.55652 32.539117,-86.556507 32.539405,-86.556506 32.539692,-86.556548 32.540788,-86.556542 32.540951)\r\n698;672;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.488522 32.449669,-86.488309 32.449395)\r\n2200;2210;even;Maul Dr;Autauga;AL;36006;LINESTRING(-86.702069 32.665483,-86.702069 32.66552,-86.702073 32.666425,-86.702085 32.667143)\r\n2207;2213;odd;Maul Dr;Autauga;AL;36006;LINESTRING(-86.702264 32.665482,-86.702265 32.66552,-86.702269 32.666423,-86.70228 32.66714)\r\n701;757;odd;Strickland Landing Rd;Autauga;AL;36003;LINESTRING(-86.639794 32.408947,-86.639771 32.408959,-86.639628 32.409058,-86.639563 32.409123,-86.639506 32.40919,-86.639378 32.409389,-86.639301 32.409526,-86.639234 32.409668,-86.639205 32.409741,-86.639135 32.409961,-86.639104 32.410113,-86.639087 32.410266,-86.639088 32.410347,-86.639107 32.410499,-86.639201 32.411001,-86.639392 32.41223,-86.639434 32.412447,-86.639482 32.412669,-86.639576 32.412957,-86.63964 32.4131,-86.639707 32.413239,-86.639864 32.413508,-86.639952 32.41364,-86.640087 32.413833,-86.640221 32.414008)\r\n798;752;even;Strickland Landing Rd;Autauga;AL;36003;LINESTRING(-86.639912 32.409078,-86.639897 32.409091,-86.639774 32.409184,-86.639723 32.409231,-86.63968 32.409282,-86.639556 32.409467,-86.639485 32.409594,-86.639422 32.409726,-86.639397 32.409789,-86.639333 32.409997,-86.639304 32.410135,-86.639289 32.410272,-86.63929 32.410337,-86.639305 32.410477,-86.639395 32.410977,-86.639588 32.412206,-86.639628 32.412419,-86.639678 32.412631,-86.639768 32.412905,-86.639824 32.413038,-86.639889 32.413169,-86.64004 32.41343,-86.640122 32.413556,-86.640255 32.413745,-86.640385 32.41392)\r\n101;141;all;Grouby Airport Rd;Autauga;AL;36067;LINESTRING(-86.507609 32.43085,-86.507746 32.43184,-86.507833 32.432566,-86.507929 32.433292,-86.507954 32.433588,-86.507989 32.434324,-86.50799 32.435053,-86.507995 32.435538,-86.507999 32.435781,-86.507998 32.435978)\r\n100;198;even;Thomas Ct;Autauga;AL;36067;LINESTRING(-86.477169 32.453677,-86.47721 32.453641,-86.477263 32.453591,-86.477337 32.453519)\r\n101;199;odd;Thomas Ct;Autauga;AL;36067;LINESTRING(-86.477015 32.453577,-86.477054 32.453525,-86.477119 32.453475,-86.477193 32.453408)\r\n468;498;even;E 6th St;Autauga;AL;36067;LINESTRING(-86.462017 32.465764,-86.461636 32.465745,-86.461574 32.465747)\r\n471;479;odd;E 6th St;Autauga;AL;36067;LINESTRING(-86.462006 32.465928,-86.461634 32.465911,-86.46158 32.465912)\r\n797;793;odd;Old Ridge Rd N;Autauga;AL;36066;LINESTRING(-86.418149 32.488225,-86.418165 32.486001,-86.41818 32.485593,-86.418257 32.485331)\r\n786;798;even;Old Ridge Rd N;Autauga;AL;36066;LINESTRING(-86.417955 32.488224,-86.417971 32.486001,-86.417962 32.485567,-86.41807 32.485286)\r\n412;400;all;Lower Grainesville Rd;Autauga;AL;36067;LINESTRING(-86.54165 32.473323,-86.541243 32.473281,-86.541065 32.47325,-86.540973 32.473221,-86.540885 32.473185,-86.540802 32.473141,-86.540728 32.473088,-86.540659 32.473033,-86.540596 32.47297,-86.54054 32.472903,-86.540495 32.47283,-86.540459 32.472755,-86.540434 32.472676,-86.540414 32.472598,-86.540406 32.472519,-86.540404 32.472438,-86.540416 32.472287,-86.540441 32.47214,-86.540511 32.471861,-86.540572 32.471583)\r\n100;1998;even;Sunrise Dr;Autauga;AL;36067;LINESTRING(-86.519951 32.563213,-86.519949 32.56327,-86.519945 32.564553,-86.519936 32.565276,-86.519931 32.566866,-86.519919 32.567799,-86.519918 32.568381,-86.51991 32.568674,-86.519912 32.568878)\r\n101;1999;odd;Sunrise Dr;Autauga;AL;36067;LINESTRING(-86.520146 32.563216,-86.520145 32.563272,-86.520141 32.564555,-86.520132 32.565278,-86.520127 32.566868,-86.520115 32.567801,-86.520114 32.568383,-86.520106 32.568676,-86.520107 32.568877)\r\n515;501;odd;Breckinridge Ln;Autauga;AL;36066;LINESTRING(-86.431646 32.477176,-86.431921 32.477164,-86.432174 32.477149,-86.432769 32.477131,-86.433028 32.47713,-86.433206 32.47711,-86.433316 32.477089)\r\n514;500;even;Breckinridge Ln;Autauga;AL;36066;LINESTRING(-86.431636 32.477011,-86.431909 32.476998,-86.432164 32.476981,-86.432763 32.476965,-86.433014 32.476958,-86.433174 32.476942,-86.433279 32.476928)\r\n1721;1701;odd;Benson St;Autauga;AL;36066;LINESTRING(-86.423523 32.490073,-86.423919 32.490073)\r\n1720;1700;even;Benson St;Autauga;AL;36066;LINESTRING(-86.423523 32.489909,-86.423919 32.489909)\r\n3130;3198;even;Autauga County 57;Autauga;AL;36091;LINESTRING(-86.557212 32.70548,-86.557491 32.705642,-86.558312 32.706041,-86.558825 32.706303,-86.559492 32.706627,-86.559636 32.706698)\r\n3131;3199;odd;Autauga County 57;Autauga;AL;36091;LINESTRING(-86.557321 32.705344,-86.557597 32.705498,-86.558412 32.705899,-86.558925 32.706159,-86.559592 32.706483,-86.559736 32.706557)\r\n289;241;odd;2nd St;Autauga;AL;36703;LINESTRING(-86.804195 32.442354,-86.80421 32.445471,-86.804223 32.446198,-86.804246 32.446772)\r\n298;244;even;2nd St;Autauga;AL;36703;LINESTRING(-86.80439 32.442353,-86.804406 32.445469,-86.804419 32.446194,-86.80444 32.446767)\r\n1099;1045;odd;Autauga County 42;Autauga;AL;36051;LINESTRING(-86.592649 32.610981,-86.592322 32.61069,-86.592196 32.610582,-86.591989 32.610437,-86.591834 32.610354,-86.591672 32.610283,-86.591507 32.610224,-86.59134 32.610175,-86.59117 32.610132,-86.590835 32.610061,-86.590332 32.60996,-86.589327 32.609788,-86.588906 32.609723,-86.588399 32.60965,-86.588225 32.60963,-86.588049 32.609615,-86.587703 32.6096,-86.587528 32.609599,-86.587351 32.609604,-86.587177 32.609618,-86.586832 32.609655,-86.58649 32.609707,-86.58615 32.609768,-86.586001 32.609811)\r\n1098;1044;even;Autauga County 42;Autauga;AL;36051;LINESTRING(-86.592509 32.611095,-86.592182 32.610808,-86.59206 32.61071,-86.591867 32.610577,-86.591732 32.610502,-86.591586 32.610437,-86.591435 32.610382,-86.591278 32.610335,-86.591116 32.610294,-86.590789 32.610223,-86.59029 32.610124,-86.589289 32.609952,-86.588872 32.609887,-86.588369 32.609816,-86.588201 32.609796,-86.588035 32.609783,-86.587697 32.609768,-86.58753 32.609765,-86.587365 32.609772,-86.587199 32.609784,-86.586862 32.609821,-86.586528 32.609871,-86.586202 32.609934,-86.586058 32.609968)\r\n1306;1318;even;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.516388 32.486612,-86.517574 32.486444,-86.517591 32.486441,-86.518682 32.486299,-86.519019 32.486264,-86.519225 32.486246,-86.519274 32.486244,-86.519338 32.486239)\r\n1301;1317;odd;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.516356 32.48645,-86.517544 32.486278,-86.517563 32.486277,-86.518654 32.486133,-86.518997 32.486098,-86.519207 32.486082,-86.51926 32.486076,-86.519328 32.486075)\r\n998;912;all;Autauga County 140;Autauga;AL;36051;LINESTRING(-86.594851 32.593807,-86.594664 32.593817,-86.593025 32.593836,-86.59047 32.593849,-86.590239 32.593852,-86.590244 32.593844)\r\n567;569;all;Jasmine Trl;Autauga;AL;36066;LINESTRING(-86.428526 32.476379,-86.42855 32.476479,-86.428573 32.476605)\r\n1298;1200;even;Ousley Dr;Autauga;AL;36749;LINESTRING(-86.839269 32.597964,-86.83928 32.597917,-86.839241 32.597841,-86.83921 32.597769,-86.83918 32.597699,-86.839128 32.597575,-86.839109 32.59753,-86.839091 32.597488,-86.839057 32.597402,-86.839018 32.597321,-86.838983 32.597245,-86.838945 32.597164,-86.838926 32.597123,-86.838907 32.597081,-86.838889 32.597036,-86.838796 32.596764,-86.83878 32.596712,-86.838752 32.596608,-86.838739 32.596556,-86.838715 32.596445,-86.838704 32.59639,-86.838692 32.596334,-86.838681 32.596278,-86.838671 32.596222,-86.83865 32.596109,-86.838641 32.596055,-86.838626 32.595948,-86.838619 32.595895,-86.838617 32.595847,-86.838613 32.595802,-86.838609 32.595756,-86.838606 32.595709,-86.838604 32.595662,-86.838602 32.595613,-86.838598 32.595561,-86.838595 32.595508,-86.838593 32.595457,-86.838592 32.595411,-86.838597 32.595334,-86.838605 32.595278,-86.838607 32.595222,-86.838595 32.595168,-86.838584 32.595073,-86.838577 32.594995,-86.838571 32.594864,-86.838575 32.594784,-86.838579 32.594691,-86.838575 32.594585,-86.838503 32.594493,-86.838379 32.594467,-86.838268 32.594456,-86.838113 32.59446,-86.838052 32.594464)\r\n1201;1299;odd;Ousley Dr;Autauga;AL;36749;LINESTRING(-86.839074 32.597965,-86.839062 32.597947,-86.839053 32.597893,-86.839026 32.597825,-86.838996 32.597755,-86.838944 32.597631,-86.838925 32.597586,-86.838907 32.597542,-86.838871 32.59746,-86.838836 32.597381,-86.838801 32.597305,-86.838763 32.597226,-86.838742 32.597185,-86.838721 32.597139,-86.838699 32.597088,-86.838604 32.596808,-86.838588 32.59675,-86.83856 32.596642,-86.838547 32.596588,-86.838521 32.596475,-86.83851 32.596418,-86.838498 32.596362,-86.838487 32.596304,-86.838477 32.596248,-86.838456 32.596135,-86.838445 32.596077,-86.838428 32.595964,-86.838425 32.595909,-86.838417 32.595857,-86.838417 32.59581,-86.838415 32.595764,-86.838412 32.595717,-86.838408 32.59567,-86.838406 32.595619,-86.838404 32.595569,-86.838401 32.595516,-86.838397 32.595463,-86.838394 32.595409,-86.838401 32.595322,-86.838403 32.595272,-86.838401 32.595234,-86.838397 32.595186,-86.838386 32.595087,-86.838381 32.595003,-86.838375 32.594864,-86.838377 32.594782,-86.838373 32.594701,-86.838355 32.594655,-86.838355 32.594659,-86.838329 32.594641,-86.838254 32.59463,-86.838117 32.594628,-86.83806 32.594628)\r\n1386;1388;all;Brandy Ln;Autauga;AL;36067;LINESTRING(-86.424091 32.436259,-86.424135 32.436228,-86.424156 32.436218)\r\n1000;1098;even;Gillespie St;Autauga;AL;36066;LINESTRING(-86.447693 32.463707,-86.447431 32.463764,-86.446528 32.463976,-86.44628 32.464032)\r\n1001;1099;odd;Gillespie St;Autauga;AL;36066;LINESTRING(-86.447742 32.463866,-86.447483 32.463924,-86.44658 32.464136,-86.44633 32.464191)\r\n101;105;all;Richmond Way;Autauga;AL;36066;LINESTRING(-86.441786 32.471786,-86.441901 32.47168,-86.44205 32.471525,-86.442098 32.471462)\r\n1900;1926;even;Cedar Ridge Loop;Autauga;AL;36067;LINESTRING(-86.472504 32.574028,-86.472439 32.574043,-86.472331 32.574067,-86.472222 32.57409,-86.472116 32.574108,-86.472012 32.574121,-86.471912 32.574127,-86.471808 32.574131,-86.471699 32.574131,-86.471594 32.574129,-86.471493 32.574127,-86.471398 32.574122,-86.471316 32.574111,-86.471249 32.574098,-86.471192 32.574077,-86.471143 32.57405,-86.471104 32.574017,-86.471079 32.573978,-86.471041 32.573865,-86.47103 32.573799,-86.471028 32.573723,-86.471028 32.573639,-86.471029 32.573554,-86.471031 32.573464,-86.471033 32.573374,-86.471036 32.573282,-86.471039 32.573094,-86.471042 32.573,-86.471045 32.572812,-86.471046 32.572719,-86.471047 32.572628,-86.471052 32.572453,-86.471056 32.572371,-86.471054 32.572371)\r\n1913;1935;odd;Cedar Ridge Loop;Autauga;AL;36067;LINESTRING(-86.472556 32.574187,-86.472491 32.574203,-86.472381 32.574229,-86.472266 32.574252,-86.472152 32.574274,-86.472036 32.574289,-86.47192 32.574299,-86.471808 32.574295,-86.471699 32.574295,-86.47159 32.574297,-86.471483 32.574293,-86.471382 32.574288,-86.471284 32.574285,-86.471187 32.574266,-86.471094 32.574237,-86.471009 32.57419,-86.470938 32.574131,-86.470873 32.574054,-86.470831 32.573891,-86.470832 32.573805,-86.470832 32.573723,-86.470832 32.573637,-86.470835 32.57355,-86.470837 32.57346,-86.470839 32.57337,-86.47084 32.57328,-86.470843 32.57309,-86.470846 32.572996,-86.470849 32.57281,-86.47085 32.572717,-86.470853 32.572624,-86.470856 32.572449,-86.470858 32.572363,-86.47086 32.572361)\r\n2000;2002;all;Summit Pkwy;Autauga;AL;36066;LINESTRING(-86.418142 32.479543,-86.418142 32.47923)\r\n2101;2199;all;Selma Hwy;Autauga;AL;36003;LINESTRING(-86.630375 32.437072,-86.631724 32.437057,-86.632586 32.437042,-86.632765 32.437042)\r\n1900;1998;even;Autauga County 173;Autauga;AL;36758;LINESTRING(-86.871789 32.650156,-86.871744 32.650153,-86.871683 32.650143,-86.871532 32.650104,-86.871362 32.650075,-86.871183 32.650057,-86.871086 32.650057,-86.870741 32.650084,-86.870315 32.650128,-86.869971 32.65018,-86.869716 32.65024,-86.869391 32.650327,-86.869231 32.650361,-86.869155 32.650372,-86.868994 32.650384,-86.868737 32.650382,-86.86864 32.650386,-86.868546 32.650402,-86.868455 32.650421,-86.868366 32.650449,-86.86828 32.65048,-86.868197 32.650517,-86.868047 32.650602,-86.867499 32.650957,-86.86695 32.651289,-86.866533 32.651544,-86.866121 32.651812,-86.865987 32.651911,-86.86586 32.652023,-86.865798 32.652087,-86.865702 32.652221,-86.865662 32.652297,-86.865631 32.652375,-86.865609 32.652456,-86.865596 32.652536,-86.865588 32.652616,-86.865588 32.652696,-86.865596 32.652773,-86.865651 32.653057,-86.86567 32.653195,-86.86568 32.653334,-86.865676 32.653471,-86.865663 32.65361,-86.865641 32.653748,-86.865608 32.653885,-86.865563 32.654017,-86.865505 32.654145,-86.865397 32.654333,-86.865143 32.654704,-86.864605 32.655446,-86.864168 32.656066,-86.864084 32.656196,-86.864013 32.656336,-86.863953 32.656477,-86.8639 32.65662,-86.863863 32.65677,-86.86385 32.656922,-86.863843 32.657213,-86.86383 32.657352,-86.863818 32.657418,-86.863799 32.657481,-86.863773 32.657544,-86.863741 32.657599,-86.863701 32.657653,-86.863654 32.657704,-86.863602 32.657751,-86.863483 32.657847,-86.863294 32.657985,-86.863028 32.65816,-86.862964 32.658195,-86.862821 32.658256,-86.86275 32.658282,-86.862676 32.658299,-86.86252 32.658325,-86.862267 32.658344,-86.86209 32.658368,-86.861918 32.658412,-86.861673 32.658494,-86.861512 32.658555,-86.861349 32.658627,-86.861272 32.65868,-86.861201 32.658733,-86.861139 32.658794,-86.861083 32.658859,-86.860808 32.659222,-86.860654 32.65938,-86.860538 32.659462,-86.860399 32.659531,-86.860201 32.659609)\r\n2601;2699;odd;Autauga County 173;Autauga;AL;36758;LINESTRING(-86.871793 32.65032,-86.871732 32.650325,-86.871635 32.650317,-86.87148 32.650272,-86.87133 32.650245,-86.871169 32.650229,-86.871094 32.650227,-86.870763 32.65025,-86.870345 32.650296,-86.870015 32.650348,-86.869772 32.650402,-86.869447 32.650489,-86.869275 32.650527,-86.869181 32.650542,-86.869002 32.650554,-86.868743 32.650552,-86.868666 32.650558,-86.86859 32.650568,-86.868515 32.650585,-86.86844 32.650607,-86.868368 32.650634,-86.868301 32.650665,-86.868163 32.65074,-86.867617 32.651091,-86.867064 32.651423,-86.866651 32.651678,-86.866249 32.651942,-86.866127 32.652035,-86.866014 32.652135,-86.865968 32.652187,-86.865884 32.652303,-86.865852 32.652361,-86.865827 32.652423,-86.865809 32.652488,-86.865796 32.652556,-86.86579 32.652622,-86.86579 32.652688,-86.865796 32.652753,-86.865847 32.653033,-86.86587 32.653181,-86.865878 32.653332,-86.865876 32.653479,-86.865863 32.653628,-86.865839 32.653776,-86.865806 32.653925,-86.865757 32.654071,-86.865691 32.654213,-86.865575 32.654413,-86.865313 32.65479,-86.864773 32.655532,-86.864342 32.656148,-86.864266 32.65627,-86.864199 32.656398,-86.864143 32.656529,-86.864098 32.656662,-86.864067 32.656794,-86.86405 32.656932,-86.864041 32.657221,-86.864032 32.657372,-86.864016 32.657452,-86.863995 32.657529,-86.863965 32.657608,-86.863923 32.657685,-86.863867 32.657755,-86.863806 32.657816,-86.863744 32.657871,-86.863617 32.657973,-86.86342 32.658115,-86.863148 32.658302,-86.863066 32.658345,-86.862905 32.658416,-86.862816 32.65844,-86.862728 32.658467,-86.862548 32.658497,-86.862293 32.658514,-86.862136 32.658538,-86.861984 32.658574,-86.861751 32.65865,-86.861602 32.658707,-86.861463 32.658775,-86.861402 32.658812,-86.861347 32.658855,-86.861297 32.658902,-86.861249 32.658955,-86.860974 32.659322,-86.860808 32.659508,-86.860656 32.65961,-86.860489 32.659685,-86.86028 32.659759)\r\n601;699;all;Molly Cove Ln;Autauga;AL;36003;LINESTRING(-86.677163 32.361168,-86.677062 32.361248)\r\n101;171;odd;Bridge St;Autauga;AL;36067;LINESTRING(-86.480071 32.460264,-86.479573 32.46018,-86.479415 32.460146,-86.47926 32.460104,-86.479191 32.460078,-86.478979 32.45998,-86.478914 32.459945,-86.478786 32.459859,-86.478668 32.459768,-86.478562 32.459668,-86.478468 32.459559,-86.478385 32.45944,-86.477653 32.458128,-86.477606 32.458054,-86.477543 32.457988,-86.477477 32.457927,-86.477399 32.457873,-86.477319 32.457828,-86.477234 32.457788,-86.477145 32.457753,-86.477047 32.457728,-86.476947 32.457717,-86.476832 32.457712,-86.476722 32.457729,-86.476611 32.45776,-86.476511 32.457813,-86.476384 32.457931,-86.475784 32.458633)\r\n100;198;even;Bridge St;Autauga;AL;36067;LINESTRING(-86.480033 32.460426,-86.479531 32.460344,-86.479361 32.46031,-86.479192 32.460264,-86.479103 32.460236,-86.478871 32.460128,-86.478796 32.460079,-86.478656 32.459991,-86.478522 32.45989,-86.478402 32.459776,-86.478298 32.459653,-86.478205 32.45952,-86.477473 32.458206,-86.477434 32.458152,-86.477389 32.4581,-86.477335 32.458053,-86.477277 32.458011,-86.477213 32.457974,-86.477144 32.457942,-86.477073 32.457917,-86.477003 32.4579,-86.476927 32.457889,-86.476848 32.457886,-86.476778 32.457899,-86.476705 32.457924,-86.476649 32.457955,-86.476542 32.458043,-86.475941 32.45873)\r\n1516;1598;even;Autauga County 161;Autauga;AL;36051;LINESTRING(-86.593104 32.604786,-86.593199 32.605058,-86.593277 32.605324,-86.593309 32.605461,-86.593391 32.605886,-86.593584 32.606739,-86.593655 32.607092,-86.593674 32.607231,-86.593685 32.607368,-86.593673 32.607503,-86.59365 32.607637,-86.593612 32.607769,-86.593534 32.607966,-86.59321 32.608635,-86.593153 32.608774,-86.592991 32.609188,-86.592898 32.60947,-86.592776 32.6099,-86.592686 32.610333,-86.592633 32.6107,-86.592598 32.610996)\r\n1501;1599;odd;Autauga County 161;Autauga;AL;36051;LINESTRING(-86.593291 32.604738,-86.593393 32.605014,-86.593471 32.605288,-86.593503 32.605431,-86.593585 32.605856,-86.593778 32.606709,-86.593853 32.607068,-86.593876 32.607217,-86.593879 32.607368,-86.593877 32.607519,-86.59385 32.607669,-86.593808 32.607817,-86.593722 32.608026,-86.593396 32.608695,-86.593339 32.608828,-86.593181 32.609236,-86.59309 32.609512,-86.592972 32.609934,-86.592884 32.610359,-86.592829 32.610718,-86.592792 32.611013)\r\n700;710;all;Autauga County 32;Autauga;AL;36091;LINESTRING(-86.576235 32.687784,-86.576311 32.687804)\r\n900;998;even;Portree Dr;Autauga;AL;36067;LINESTRING(-86.476341 32.476683,-86.47631 32.477032,-86.476298 32.477393)\r\n901;999;odd;Portree Dr;Autauga;AL;36067;LINESTRING(-86.476536 32.476695,-86.476508 32.47704,-86.476492 32.477398)\r\n1279;1201;odd;Tallant Dr;Autauga;AL;36067;LINESTRING(-86.519555 32.482149,-86.519565 32.482125,-86.519632 32.481967,-86.519696 32.481834,-86.519769 32.481699,-86.519908 32.481429,-86.520021 32.481231,-86.520065 32.481144,-86.520069 32.481018,-86.519897 32.480871,-86.519019 32.480725,-86.518767 32.480682,-86.518603 32.480649,-86.518432 32.480608,-86.518262 32.48058,-86.517439 32.480386,-86.517106 32.480303,-86.51644 32.480153,-86.516321 32.480124)\r\n1270;1200;even;Tallant Dr;Autauga;AL;36067;LINESTRING(-86.519371 32.482096,-86.519381 32.482071,-86.519444 32.481907,-86.519514 32.481766,-86.519589 32.481631,-86.519728 32.481361,-86.519833 32.481165,-86.519847 32.481116,-86.519837 32.481102,-86.519779 32.481051,-86.518979 32.480887,-86.518725 32.480846,-86.518553 32.480811,-86.518386 32.480774,-86.518216 32.480746,-86.517385 32.480546,-86.517052 32.480463,-86.516384 32.480315,-86.516263 32.480281)\r\n154;170;even;Lawrence St;Autauga;AL;36067;LINESTRING(-86.453091 32.450184,-86.453021 32.450261,-86.452973 32.450333,-86.45294 32.450411,-86.452913 32.450488,-86.452899 32.450567,-86.452893 32.450649,-86.452915 32.451166,-86.452917 32.451233)\r\n149;171;odd;Lawrence St;Autauga;AL;36067;LINESTRING(-86.45325 32.450279,-86.453195 32.450353,-86.453161 32.450407,-86.453132 32.450465,-86.453113 32.450526,-86.453099 32.450589,-86.453091 32.450653,-86.453111 32.451162,-86.453112 32.45123)\r\n1400;1530;even;Autauga County 103;Autauga;AL;36758;LINESTRING(-86.903106 32.622283,-86.903219 32.622689,-86.903411 32.623398,-86.904665 32.627923,-86.904827 32.628487,-86.904928 32.628769,-86.90504 32.629047,-86.905165 32.62932,-86.905735 32.630456,-86.905852 32.630726,-86.905951 32.630998,-86.90601 32.631203,-86.90604 32.631343,-86.906073 32.631554,-86.906093 32.631767,-86.9061 32.632052,-86.906089 32.632266,-86.906074 32.632407,-86.906073 32.632424,-86.906053 32.632547,-86.905869 32.63348,-86.905832 32.633699,-86.905819 32.63385,-86.905816 32.634076,-86.905834 32.634302,-86.905865 32.634452,-86.905905 32.634599,-86.905949 32.634745,-86.906033 32.634957,-86.9061 32.635099,-86.906223 32.635302,-86.906362 32.635492,-86.906522 32.635675,-86.906618 32.635762)\r\n1501;1521;odd;Autauga County 103;Autauga;AL;36758;LINESTRING(-86.903296 32.622245,-86.903409 32.622651,-86.903601 32.62336,-86.904855 32.627885,-86.905019 32.628443,-86.905116 32.628717,-86.905226 32.628989,-86.905349 32.629258,-86.905921 32.630394,-86.90604 32.630672,-86.906145 32.630952,-86.906206 32.631169,-86.906238 32.631317,-86.906271 32.631536,-86.906293 32.631759,-86.906298 32.632054,-86.906287 32.632276,-86.906272 32.632425,-86.906267 32.632446,-86.906249 32.632571,-86.906065 32.633506,-86.906032 32.633717,-86.906019 32.633858,-86.906016 32.63407,-86.906036 32.634282,-86.906061 32.63442,-86.906097 32.634559,-86.906141 32.634697,-86.906221 32.634899,-86.906284 32.635027,-86.906399 32.635218,-86.90653 32.635396,-86.90668 32.635567,-86.906764 32.635653)\r\n1240;1266;even;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.511453 32.483241,-86.51263 32.484056)\r\n1249;1255;odd;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.511577 32.483113,-86.512754 32.483928)\r\n1800;1898;even;Sheila Ct;Autauga;AL;36066;LINESTRING(-86.425918 32.45703,-86.425849 32.457028,-86.425595 32.457038,-86.425518 32.457035,-86.425457 32.457033)\r\n1801;1899;odd;Sheila Ct;Autauga;AL;36066;LINESTRING(-86.425917 32.457195,-86.425853 32.457196,-86.425599 32.457206,-86.425506 32.457207,-86.425437 32.457197)\r\n600;672;even;Washington Ferry Rd;Autauga;AL;36067;LINESTRING(-86.466243 32.446218,-86.4662 32.446137,-86.46541 32.444783,-86.465 32.444065,-86.464896 32.443861)\r\n601;675;odd;Washington Ferry Rd;Autauga;AL;36067;LINESTRING(-86.466066 32.446288,-86.466022 32.446209,-86.465234 32.444855,-86.464818 32.444135,-86.464717 32.443925)\r\n699;601;odd;Ashton Oak Dr;Autauga;AL;36066;LINESTRING(-86.425812 32.484963,-86.425721 32.485009,-86.425637 32.48505,-86.425557 32.485087,-86.425473 32.485127,-86.425385 32.485166,-86.425297 32.485209,-86.425208 32.485253,-86.425118 32.485296,-86.42503 32.485334,-86.424986 32.485351,-86.424893 32.485381,-86.424804 32.485402,-86.424742 32.485416)\r\n698;600;even;Ashton Oak Dr;Autauga;AL;36066;LINESTRING(-86.425914 32.485103,-86.425823 32.485151,-86.425733 32.485196,-86.425651 32.485233,-86.425567 32.485271,-86.425481 32.485312,-86.425395 32.485353,-86.425306 32.485397,-86.425214 32.485442,-86.425118 32.485486,-86.425064 32.485507,-86.424959 32.485541,-86.424852 32.485572,-86.424775 32.485578)\r\n1700;1798;even;Grandview Rd;Autauga;AL;36067;LINESTRING(-86.55117 32.44424,-86.551329 32.444248,-86.55149 32.444228,-86.551609 32.444192,-86.551763 32.444139,-86.551896 32.444099,-86.551993 32.444079,-86.552071 32.444064,-86.552187 32.444074,-86.552403 32.444098,-86.552498 32.444114,-86.552674 32.444134,-86.552825 32.444139,-86.552965 32.444139,-86.553131 32.444142,-86.553185 32.444156,-86.553204 32.444153,-86.553243 32.444193,-86.553307 32.444276,-86.553358 32.444405,-86.553555 32.444608,-86.55371 32.444779,-86.553786 32.444845,-86.553882 32.444869,-86.553923 32.444892,-86.554006 32.444914,-86.554078 32.444906,-86.554215 32.444901,-86.554379 32.444888,-86.554693 32.444791,-86.554818 32.444724,-86.554897 32.44468,-86.554963 32.444636,-86.555061 32.444579,-86.555165 32.444493,-86.555268 32.444421,-86.555346 32.444377,-86.555444 32.444298,-86.555511 32.444256,-86.555559 32.444229,-86.555624 32.444217,-86.555653 32.444212,-86.555714 32.444207,-86.555756 32.444208,-86.555788 32.444209,-86.555841 32.444224,-86.555883 32.44424,-86.555931 32.444266,-86.555971 32.444301,-86.55602 32.444357,-86.556108 32.4445,-86.556148 32.444573,-86.556225 32.444621,-86.556275 32.444653,-86.556303 32.444667,-86.556336 32.444694,-86.556396 32.444716,-86.556438 32.444719,-86.556492 32.444733,-86.55656 32.44474,-86.556674 32.444746,-86.556758 32.444758,-86.55684 32.444761,-86.556909 32.444741,-86.557001 32.444726,-86.557085 32.444716,-86.557118 32.444714,-86.557199 32.444701,-86.557261 32.444705,-86.557313 32.444711,-86.557397 32.444736,-86.557479 32.444771,-86.557594 32.444805,-86.5577 32.444853,-86.55777 32.444859,-86.557849 32.444879,-86.557911 32.444888,-86.557984 32.444891,-86.558032 32.444875,-86.55806 32.444871,-86.558112 32.444865,-86.558165 32.444872,-86.558266 32.444844,-86.558314 32.444802,-86.558339 32.444776,-86.558374 32.444744,-86.55846 32.444687,-86.558509 32.444623,-86.558579 32.444551,-86.558651 32.444482,-86.558739 32.444399,-86.559041 32.444161,-86.559206 32.444049,-86.55942 32.443916,-86.559564 32.443848,-86.559606 32.443827)\r\n1601;1799;odd;Grandview Rd;Autauga;AL;36067;LINESTRING(-86.551175 32.444076,-86.551315 32.444074,-86.551442 32.444056,-86.551541 32.444032,-86.551693 32.443981,-86.551834 32.443939,-86.551949 32.443905,-86.552067 32.443898,-86.552209 32.44391,-86.552435 32.44393,-86.55253 32.443946,-86.552692 32.443964,-86.552831 32.443971,-86.552969 32.443975,-86.553131 32.443978,-86.553279 32.44396,-86.553342 32.444033,-86.553407 32.444075,-86.553501 32.444194,-86.553554 32.444315,-86.553711 32.444506,-86.553862 32.444657,-86.553906 32.444683,-86.553968 32.444713,-86.554003 32.444724,-86.554036 32.44473,-86.554072 32.444738,-86.554197 32.444731,-86.554329 32.444712,-86.554603 32.444629,-86.554714 32.44458,-86.554783 32.444542,-86.554847 32.444504,-86.554929 32.444447,-86.555033 32.444369,-86.555142 32.444283,-86.555218 32.444239,-86.555304 32.444176,-86.555389 32.444084,-86.555507 32.444071,-86.555578 32.444051,-86.555619 32.444044,-86.5557 32.444033,-86.555774 32.444032,-86.555828 32.444043,-86.555907 32.444054,-86.555985 32.444082,-86.556063 32.444128,-86.556137 32.444185,-86.556198 32.444271,-86.556284 32.444418,-86.55632 32.444453,-86.556353 32.444487,-86.556389 32.444509,-86.556417 32.444523,-86.556444 32.444534,-86.556448 32.444534,-86.556488 32.444537,-86.55655 32.444561,-86.556586 32.44457,-86.556694 32.44458,-86.55677 32.444584,-86.556818 32.444581,-86.556869 32.444579,-86.556963 32.444562,-86.557059 32.444544,-86.557092 32.444542,-86.557185 32.444527,-86.557287 32.444529,-86.557361 32.444545,-86.557479 32.444568,-86.557565 32.444611,-86.557674 32.444647,-86.55777 32.444681,-86.557816 32.444697,-86.557889 32.444709,-86.557925 32.444712,-86.557956 32.444709,-86.55799 32.444707,-86.558038 32.444701,-86.5581 32.444701,-86.558119 32.44469,-86.558148 32.444678,-86.55815 32.444682,-86.558175 32.444644,-86.558248 32.44461,-86.558304 32.444563,-86.558353 32.444517,-86.558431 32.444443,-86.558501 32.444374,-86.558589 32.444279,-86.558911 32.444031,-86.559086 32.443919,-86.559304 32.443772,-86.559476 32.443678,-86.559552 32.443669)\r\n1315;1301;odd;Huckleberry Ln;Autauga;AL;36067;LINESTRING(-86.6136 32.539772,-86.613571 32.539708,-86.613484 32.539577,-86.613395 32.539453,-86.613145 32.539074,-86.613036 32.538882,-86.613012 32.538824,-86.612946 32.53855,-86.612935 32.538418,-86.612948 32.538282,-86.612991 32.538082,-86.613042 32.537955,-86.613076 32.537892,-86.613237 32.537632,-86.613347 32.537419,-86.613374 32.537257,-86.613371 32.537107,-86.613404 32.536749,-86.613423 32.53646,-86.613461 32.536173,-86.613496 32.535882,-86.613507 32.535659,-86.613507 32.535576)\r\n1332;1300;even;Huckleberry Ln;Autauga;AL;36067;LINESTRING(-86.613421 32.539838,-86.613389 32.539784,-86.613312 32.539661,-86.613225 32.539537,-86.612969 32.539152,-86.612848 32.53895,-86.612812 32.538872,-86.612738 32.538572,-86.612737 32.538416,-86.612746 32.538262,-86.612785 32.538034,-86.612858 32.537891,-86.612896 32.537818,-86.613053 32.53756,-86.613139 32.537369,-86.613166 32.537243,-86.613169 32.537101,-86.613206 32.536737,-86.613223 32.536446,-86.613265 32.536155,-86.613296 32.53587,-86.613309 32.535655,-86.613312 32.535574)\r\n574;598;even;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.895346 32.545819,-86.89523 32.546994,-86.895208 32.54722,-86.89507 32.548669,-86.894891 32.550326,-86.894833 32.550755,-86.894792 32.550967,-86.894739 32.551175,-86.894671 32.551381,-86.894591 32.551583,-86.894468 32.551839,-86.8944 32.551961,-86.894321 32.552088)\r\n601;621;odd;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.89554 32.545833,-86.895424 32.547008,-86.895402 32.547234,-86.895266 32.548683,-86.895087 32.550342,-86.895031 32.550779,-86.894988 32.550999,-86.894933 32.551215,-86.894863 32.551431,-86.894779 32.551641,-86.894652 32.551907,-86.89458 32.552039,-86.894492 32.552168)\r\n505;1999;all;Cyrus Dr;Autauga;AL;36003;LINESTRING(-86.643723 32.437969,-86.643648 32.438036,-86.643569 32.438086,-86.643487 32.438126,-86.643327 32.438194,-86.64301 32.438307,-86.642866 32.438383,-86.64261 32.438474,-86.642498 32.438486,-86.642295 32.438475,-86.642196 32.438425,-86.642113 32.438371,-86.64199 32.438255,-86.641737 32.437949,-86.641679 32.437882,-86.64164 32.437802,-86.641613 32.437721,-86.641601 32.437637,-86.6416 32.43755,-86.641624 32.437471,-86.641662 32.437314,-86.641713 32.437206,-86.641775 32.4372)\r\n801;899;all;Northington Ln;Autauga;AL;36067;LINESTRING(-86.512652 32.451301,-86.512657 32.451357,-86.512675 32.4515,-86.512675 32.451647,-86.512657 32.451937,-86.512638 32.452152,-86.512616 32.4523,-86.512575 32.452441,-86.51251 32.452796,-86.512462 32.453007,-86.512453 32.453023)\r\n171;143;all;Autauga County 68;Autauga;AL;36022;LINESTRING(-86.479992 32.657488,-86.48039 32.657399,-86.480679 32.657347)\r\n1904;1998;even;Holly Brooke Ln;Autauga;AL;36066;LINESTRING(-86.417317 32.495769,-86.416861 32.495725,-86.416084 32.495642)\r\n1905;1999;odd;Holly Brooke Ln;Autauga;AL;36066;LINESTRING(-86.417295 32.495933,-86.416837 32.495889,-86.41606 32.495805)\r\n899;801;odd;Dozier Ave;Autauga;AL;36067;LINESTRING(-86.448833 32.457235,-86.448926 32.457183,-86.44899 32.45713,-86.449594 32.456717,-86.449636 32.456686)\r\n898;800;even;Dozier Ave;Autauga;AL;36066;LINESTRING(-86.448718 32.457103,-86.448794 32.457049,-86.448856 32.457,-86.449468 32.456589,-86.44951 32.45656)\r\n2000;2008;even;Goose Pointe Lndg;Autauga;AL;36067;LINESTRING(-86.541833 32.503435,-86.541819 32.503565,-86.541807 32.503934,-86.541768 32.504665,-86.541768 32.50489,-86.541789 32.505042,-86.541821 32.505183,-86.541833 32.505244,-86.541832 32.505255)\r\n2001;2007;odd;Goose Pointe Lndg;Autauga;AL;36067;LINESTRING(-86.542027 32.503447,-86.542017 32.503575,-86.542003 32.50394,-86.541966 32.504667,-86.541972 32.50488,-86.541989 32.505016,-86.542023 32.505157,-86.542029 32.505242,-86.542026 32.505267)\r\n249;299;all;Autauga County 4;Autauga;AL;36067;LINESTRING(-86.469742 32.431192,-86.469645 32.431189)\r\n1700;1798;even;Silver Hills Ct;Autauga;AL;36066;LINESTRING(-86.429046 32.45461,-86.428978 32.454618,-86.428644 32.454646)\r\n1701;1799;odd;Silver Hills Ct;Autauga;AL;36066;LINESTRING(-86.429087 32.454771,-86.429008 32.45479,-86.42866 32.45481)\r\n2100;2106;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.589174 32.512907,-86.589176 32.512914,-86.589385 32.513146,-86.589614 32.513365,-86.58979 32.513526,-86.590105 32.513778,-86.590431 32.514019,-86.590695 32.514204,-86.590969 32.514379,-86.591251 32.514547,-86.59169 32.514781,-86.591841 32.514853,-86.592145 32.51499,-86.592454 32.51512,-86.594168 32.515771,-86.595734 32.516357,-86.596517 32.516641,-86.598992 32.517559)\r\n2109;2183;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.589334 32.512814,-86.589338 32.512814,-86.589541 32.513038,-86.58976 32.513253,-86.589932 32.513406,-86.590239 32.513654,-86.590559 32.513891,-86.590819 32.514072,-86.591085 32.514243,-86.591361 32.514407,-86.591792 32.514637,-86.591937 32.514707,-86.592235 32.514842,-86.592538 32.514968,-86.594248 32.515621,-86.595812 32.516205,-86.596595 32.516489,-86.59907 32.517408)\r\n3583;3571;odd;Netezen Ln;Autauga;AL;36749;LINESTRING(-86.786405 32.586872,-86.786333 32.586837,-86.786247 32.586785,-86.786183 32.58674)\r\n3590;3582;even;Netezen Ln;Autauga;AL;36749;LINESTRING(-86.786324 32.587021,-86.786231 32.586991,-86.786107 32.586925,-86.786041 32.586852)\r\n745;639;odd;Durden Rd;Autauga;AL;36067;LINESTRING(-86.488795 32.488704,-86.48883 32.488646,-86.488924 32.488435,-86.488975 32.488292,-86.489045 32.488077,-86.489077 32.487929,-86.489102 32.487782,-86.489122 32.487636,-86.489135 32.487486,-86.489138 32.487264,-86.489129 32.486392,-86.489124 32.486241)\r\n798;700;even;Durden Rd;Autauga;AL;36067;LINESTRING(-86.488618 32.488636,-86.488644 32.48858,-86.488734 32.488379,-86.488785 32.488246,-86.488849 32.488039,-86.488881 32.487901,-86.488906 32.48776,-86.488924 32.48762,-86.488935 32.487478,-86.488942 32.487264,-86.488933 32.486394,-86.48893 32.486244)\r\n2000;2098;even;Autauga County 123;Autauga;AL;36051;LINESTRING(-86.58971 32.663017,-86.589443 32.663173,-86.589169 32.663353,-86.588979 32.663507,-86.588743 32.663719,-86.588571 32.663878,-86.588454 32.663974,-86.588332 32.664061,-86.5882 32.664142,-86.587703 32.664411,-86.587281 32.664653,-86.586863 32.66491,-86.586725 32.665007,-86.586534 32.665163,-86.586475 32.665229,-86.586425 32.665299,-86.586386 32.665374,-86.586359 32.665452,-86.586324 32.665602,-86.586286 32.665896,-86.58621 32.66662,-86.586178 32.66698,-86.586145 32.667267,-86.586043 32.668624,-86.586003 32.668904,-86.585959 32.669113,-86.585902 32.66932,-86.58583 32.669526,-86.585602 32.670068,-86.585502 32.670348,-86.585356 32.670841,-86.585312 32.671062,-86.585262 32.67135,-86.585245 32.671497,-86.585245 32.671649,-86.585267 32.671941,-86.585369 32.672733,-86.585417 32.673168,-86.585533 32.67403,-86.585588 32.674317,-86.58566 32.674675,-86.585719 32.674891,-86.58619 32.676287,-86.586404 32.676843,-86.586601 32.677248,-86.586938 32.67791,-86.587508 32.679108,-86.58756 32.67924,-86.587623 32.679442,-86.587671 32.679648,-86.587732 32.680001,-86.587755 32.680215,-86.587763 32.680428,-86.587754 32.68064,-86.587733 32.680851,-86.587622 32.681496,-86.587608 32.681716,-86.587595 32.682225,-86.5876 32.682735,-86.58762 32.683171,-86.587679 32.683819,-86.587746 32.684391,-86.587773 32.684743,-86.587782 32.685025,-86.587772 32.68531,-86.587742 32.68574,-86.587683 32.686166,-86.587426 32.687654,-86.587426 32.687666)\r\n1901;2077;odd;Autauga County 123;Autauga;AL;36051;LINESTRING(-86.589823 32.663151,-86.589563 32.663309,-86.589303 32.663483,-86.589121 32.663627,-86.588887 32.663833,-86.588715 32.663994,-86.58859 32.6641,-86.588456 32.664197,-86.588312 32.664282,-86.587811 32.664551,-86.587395 32.664789,-86.586987 32.665044,-86.586861 32.665133,-86.58669 32.665279,-86.586645 32.665327,-86.586609 32.665379,-86.58658 32.665434,-86.586557 32.665494,-86.586524 32.665628,-86.586482 32.665914,-86.586406 32.666634,-86.586374 32.666994,-86.586343 32.667281,-86.586243 32.66864,-86.586201 32.66893,-86.586153 32.669147,-86.586098 32.669364,-86.58602 32.669578,-86.585792 32.67012,-86.585694 32.670392,-86.585554 32.670877,-86.585508 32.671088,-86.58546 32.67137,-86.585447 32.671505,-86.585445 32.671645,-86.585465 32.671927,-86.585565 32.672717,-86.585613 32.67315,-86.585731 32.674008,-86.585782 32.674289,-86.585856 32.674641,-86.585913 32.674849,-86.58638 32.676237,-86.586594 32.676785,-86.586783 32.677184,-86.58712 32.677846,-86.587696 32.67905,-86.587754 32.67919,-86.587819 32.679404,-86.587867 32.67962,-86.587932 32.679981,-86.587955 32.680205,-86.587959 32.680428,-86.587954 32.68065,-86.587933 32.680871,-86.587824 32.681514,-86.587806 32.681724,-86.587791 32.682227,-86.587798 32.682731,-86.587818 32.683161,-86.587875 32.683805,-86.587944 32.684377,-86.587973 32.684735,-86.587978 32.685025,-86.58797 32.685316,-86.587942 32.685754,-86.587879 32.686188,-86.587624 32.687684,-86.587617 32.687701)\r\n237;201;odd;Primrose Dr;Autauga;AL;36067;LINESTRING(-86.459963 32.474188,-86.459506 32.473991,-86.459057 32.473785,-86.458301 32.473452,-86.456629 32.472736,-86.45619 32.472538)\r\n236;200;even;Primrose Dr;Autauga;AL;36067;LINESTRING(-86.459875 32.474335,-86.459414 32.474139,-86.458965 32.473931,-86.458211 32.4736,-86.456537 32.472884,-86.456098 32.472683)\r\n1066;1098;even;Hill St;Autauga;AL;36067;LINESTRING(-86.468816 32.429715,-86.468819 32.429593,-86.468807 32.429366)\r\n1043;1061;odd;Hill St;Autauga;AL;36067;LINESTRING(-86.468621 32.429712,-86.468623 32.429595,-86.468612 32.429373)\r\n1343;1301;odd;Brandy Ln;Autauga;AL;36067;LINESTRING(-86.424823 32.435676,-86.424766 32.435721,-86.42468 32.435787,-86.424327 32.436083)\r\n1344;1300;even;Brandy Ln;Autauga;AL;36067;LINESTRING(-86.424955 32.435797,-86.424898 32.435841,-86.424816 32.435907,-86.424463 32.4362)\r\n2698;2500;all;Autauga County 40;Autauga;AL;36749;LINESTRING(-86.806879 32.558908,-86.806829 32.558908,-86.805756 32.558943,-86.801481 32.559068,-86.799766 32.559132,-86.798255 32.559183)\r\n100;140;even;Hazel St;Autauga;AL;36067;LINESTRING(-86.469115 32.431038,-86.468989 32.431068)\r\n301;317;odd;Hazel St;Autauga;AL;36067;LINESTRING(-86.469169 32.431196,-86.469043 32.431226)\r\n1902;1914;even;Calumet Pkwy;Autauga;AL;36066;LINESTRING(-86.417455 32.489912,-86.417293 32.489896,-86.416873 32.489845,-86.416537 32.489795,-86.416372 32.489764,-86.416287 32.489749,-86.416264 32.489751)\r\n1447;1911;odd;Calumet Pkwy;Autauga;AL;36066;LINESTRING(-86.417435 32.490076,-86.417269 32.490062,-86.416841 32.490011,-86.416499 32.489959,-86.416334 32.489928,-86.416259 32.489919,-86.416246 32.489915)\r\n300;498;even;Booth Ln;Autauga;AL;36067;LINESTRING(-86.462516 32.467424,-86.462521 32.467515,-86.462539 32.467661,-86.46258 32.467875,-86.462597 32.46801,-86.462591 32.468165)\r\n301;599;odd;Booth Ln;Autauga;AL;36067;LINESTRING(-86.46271 32.467413,-86.462719 32.467501,-86.462737 32.467639,-86.462778 32.467853,-86.462797 32.468004,-86.462786 32.468172)\r\n1086;1098;even;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.782882 32.526292,-86.782961 32.526356,-86.783076 32.526456,-86.783187 32.526564,-86.783512 32.526906,-86.783739 32.527131,-86.784436 32.527785,-86.784773 32.528121,-86.784892 32.528233,-86.78502 32.528338,-86.785151 32.528439,-86.785291 32.528532,-86.785509 32.528663,-86.786036 32.528926,-86.786327 32.529083,-86.786463 32.529165,-86.786715 32.529336)\r\n1087;1099;odd;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.783012 32.526169,-86.783103 32.526232,-86.783224 32.526344,-86.783339 32.526456,-86.783664 32.5268,-86.783887 32.527021,-86.784584 32.527675,-86.784921 32.528011,-86.785036 32.528115,-86.785156 32.528216,-86.785281 32.528309,-86.785411 32.528396,-86.785619 32.528519,-86.78614 32.528784,-86.786437 32.528943,-86.786585 32.529029,-86.786839 32.529208)\r\n2500;2512;even;Wyngate Dr;Autauga;AL;36067;LINESTRING(-86.519268 32.448921,-86.519264 32.448908,-86.519163 32.448666,-86.519135 32.448542,-86.519145 32.44835,-86.519282 32.448045,-86.519522 32.447762,-86.51963 32.447641,-86.519843 32.447312,-86.519952 32.447102,-86.519981 32.447024,-86.520045 32.446806,-86.520074 32.446656,-86.520093 32.446508,-86.520116 32.446287,-86.520108 32.446099)\r\n2501;2599;odd;Wyngate Dr;Autauga;AL;36067;LINESTRING(-86.51909 32.448987,-86.51908 32.448972,-86.518959 32.448714,-86.518925 32.448556,-86.518923 32.448314,-86.51909 32.447955,-86.519364 32.447664,-86.519456 32.447549,-86.519661 32.447236,-86.519762 32.44704,-86.519787 32.446978,-86.519847 32.446772,-86.519876 32.446632,-86.519897 32.446492,-86.519916 32.446281,-86.519914 32.446102)\r\n713;709;odd;Mimosa Rd;Autauga;AL;36067;LINESTRING(-86.459832 32.480838,-86.459673 32.480834,-86.459257 32.480857,-86.459137 32.480825,-86.459102 32.480819)\r\n726;712;even;Mimosa Rd;Autauga;AL;36067;LINESTRING(-86.45983 32.481002,-86.459679 32.481004,-86.459243 32.481031,-86.459029 32.481005,-86.458972 32.480942)\r\n3001;3027;all;Autauga County 535;Autauga;AL;36051;LINESTRING(-86.467595 32.702205,-86.46749 32.702447,-86.467278 32.70285)\r\n398;200;even;Sparrow Pointe Ct;Autauga;AL;36022;LINESTRING(-86.418367 32.505762,-86.418377 32.505764,-86.418596 32.505723,-86.418723 32.505704,-86.418912 32.505655)\r\n399;305;odd;Sparrow Pointe Ct;Autauga;AL;36022;LINESTRING(-86.41831 32.505605,-86.418327 32.505596,-86.418558 32.505561,-86.418675 32.505538,-86.418859 32.505497)\r\n2324;2348;even;Hilltop Farm Rd;Autauga;AL;36067;LINESTRING(-86.601798 32.49217,-86.601851 32.492271,-86.602032 32.492676,-86.602098 32.492815,-86.602315 32.49321,-86.602407 32.493406,-86.602422 32.493464,-86.602435 32.493592,-86.602408 32.493723,-86.602385 32.493793,-86.60236 32.493939,-86.602324 32.494075,-86.60216 32.494569,-86.602129 32.494713,-86.602088 32.49485,-86.601887 32.495403,-86.601774 32.495676,-86.601744 32.495736,-86.601707 32.495796,-86.601621 32.495913,-86.601574 32.495966,-86.601524 32.496018,-86.601341 32.496178,-86.601288 32.496235,-86.601108 32.496388,-86.600993 32.496505,-86.600927 32.496572,-86.60086 32.496727,-86.60083 32.496881,-86.600816 32.497035,-86.600815 32.497187,-86.600826 32.497477,-86.600805 32.497761,-86.600787 32.497909,-86.600781 32.498104)\r\n2327;2599;odd;Hilltop Farm Rd;Autauga;AL;36067;LINESTRING(-86.601973 32.492098,-86.602039 32.492203,-86.602216 32.492616,-86.60228 32.492747,-86.602497 32.493142,-86.602605 32.49335,-86.602632 32.493438,-86.602639 32.493602,-86.602606 32.493759,-86.602585 32.493829,-86.602558 32.493971,-86.602518 32.494117,-86.602358 32.494607,-86.602325 32.494751,-86.602278 32.494896,-86.602075 32.495455,-86.601962 32.495736,-86.601926 32.495808,-86.601885 32.49588,-86.601787 32.496009,-86.601732 32.496074,-86.60167 32.49613,-86.601497 32.49629,-86.601444 32.496351,-86.601258 32.496504,-86.601153 32.496609,-86.601119 32.49666,-86.601064 32.496775,-86.601032 32.496905,-86.601016 32.497043,-86.601011 32.497185,-86.601024 32.497479,-86.601001 32.497775,-86.600987 32.497919,-86.600976 32.49811)\r\n1700;1798;even;Pearson Pond Rd;Autauga;AL;36067;LINESTRING(-86.440547 32.448644,-86.440605 32.448584,-86.440638 32.44849,-86.440633 32.448326,-86.440611 32.448305)\r\n1701;1799;odd;Pearson Pond Rd;Autauga;AL;36067;LINESTRING(-86.440383 32.448555,-86.440407 32.448506,-86.440424 32.448466,-86.440415 32.448362,-86.440428 32.448361)\r\n1262;1298;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.440343 32.448559,-86.439901 32.44822,-86.439644 32.44803,-86.439119 32.44766,-86.438297 32.447097)\r\n1391;1397;all;Serenity Dr;Autauga;AL;36067;LINESTRING(-86.424074 32.435176,-86.423919 32.435311,-86.423646 32.435561,-86.423625 32.435579)\r\n1112;1128;even;Parkview Dr;Autauga;AL;36067;LINESTRING(-86.476599 32.496266,-86.4766 32.496492,-86.476602 32.497369,-86.476626 32.49846,-86.476614 32.498675,-86.476616 32.498682)\r\n1101;1127;odd;Parkview Dr;Autauga;AL;36067;LINESTRING(-86.476793 32.496265,-86.476796 32.496492,-86.476798 32.497367,-86.476824 32.498462,-86.476812 32.498673,-86.47681 32.498668)\r\n948;998;even;Peachtree St;Autauga;AL;36066;LINESTRING(-86.446402 32.456616,-86.446252 32.456443,-86.446041 32.456214,-86.44577 32.455938,-86.445678 32.455831,-86.445551 32.45565,-86.445497 32.45553,-86.445457 32.455318,-86.44541 32.455245)\r\n945;999;odd;Peachtree St;Autauga;AL;36066;LINESTRING(-86.446246 32.456714,-86.446096 32.456543,-86.445887 32.456318,-86.445616 32.456042,-86.445508 32.455929,-86.445363 32.455728,-86.445289 32.455578,-86.445249 32.455368,-86.445231 32.45531)\r\n1540;1598;even;Jade St;Autauga;AL;36067;LINESTRING(-86.498385 32.526722,-86.498392 32.526909,-86.498395 32.527125,-86.498406 32.527489,-86.498424 32.528758)\r\n1539;1599;odd;Jade St;Autauga;AL;36067;LINESTRING(-86.498579 32.526715,-86.49859 32.526905,-86.498591 32.527123,-86.498602 32.527485,-86.498619 32.528756)\r\n899;801;odd;Wynwood Dr;Autauga;AL;36067;LINESTRING(-86.451947 32.480845,-86.451986 32.48086,-86.452011 32.480873,-86.452128 32.480956,-86.452306 32.481114,-86.452497 32.481267,-86.452643 32.48136,-86.452876 32.48147,-86.453039 32.481528,-86.45329 32.481599,-86.453463 32.481631,-86.453639 32.481653,-86.4539 32.481651,-86.45424 32.481648,-86.455909 32.481648)\r\n898;800;even;Wynwood Dr;Autauga;AL;36067;LINESTRING(-86.451984 32.480683,-86.452054 32.480686,-86.452139 32.480717,-86.452268 32.48084,-86.452446 32.480994,-86.452629 32.481135,-86.452755 32.481214,-86.452966 32.481314,-86.453111 32.481368,-86.453344 32.481433,-86.453499 32.481463,-86.453655 32.481479,-86.4539 32.481487,-86.454238 32.481482,-86.455909 32.481484)\r\n918;968;all;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.764852 32.511163,-86.765817 32.513039,-86.76589 32.513174,-86.76605 32.513437,-86.766134 32.513569,-86.766324 32.513817,-86.766429 32.513939,-86.766648 32.514169,-86.766768 32.51428,-86.766889 32.514389,-86.767151 32.514584,-86.767424 32.514766,-86.768616 32.515487,-86.76982 32.516195)\r\n1236;1298;even;Kingston Garden Rd;Autauga;AL;36067;LINESTRING(-86.474424 32.491815,-86.47442 32.491906,-86.474411 32.491987,-86.474431 32.492101,-86.474538 32.492177,-86.474656 32.49219,-86.474769 32.492192,-86.475275 32.49218,-86.475395 32.492198)\r\n1273;1299;odd;Kingston Garden Rd;Autauga;AL;36067;LINESTRING(-86.474618 32.491815,-86.474622 32.491912,-86.474619 32.491971,-86.474639 32.491993,-86.474644 32.491999,-86.474686 32.492016,-86.474771 32.492026,-86.475295 32.492002,-86.475441 32.492038)\r\n157;101;odd;Northington St;Autauga;AL;36067;LINESTRING(-86.46748 32.464964,-86.467433 32.464472)\r\n140;100;even;Northington St;Autauga;AL;36067;LINESTRING(-86.467286 32.464978,-86.467239 32.464486)\r\n999;809;odd;Newton St;Autauga;AL;36067;LINESTRING(-86.451063 32.462426,-86.451906 32.462372,-86.453104 32.462302,-86.453265 32.462306,-86.453423 32.462325,-86.453498 32.462341,-86.453571 32.462362,-86.453641 32.462387,-86.453701 32.462418,-86.453831 32.462497,-86.453987 32.462608)\r\n898;740;even;Newton St;Autauga;AL;36067;LINESTRING(-86.451048 32.462262,-86.451892 32.462208,-86.453098 32.462132,-86.453283 32.46213,-86.453465 32.462157,-86.453556 32.462177,-86.453643 32.462202,-86.453727 32.462233,-86.453815 32.462266,-86.453957 32.462367,-86.454114 32.462483)\r\n1578;1698;all;Hawthorne Ln;Autauga;AL;36066;LINESTRING(-86.425057 32.472858,-86.425059 32.472802,-86.425051 32.472507,-86.425026 32.472352,-86.424969 32.472203,-86.424927 32.472129,-86.424873 32.472047,-86.424798 32.471967)\r\n500;598;even;Fiveash Oak;Autauga;AL;36066;LINESTRING(-86.431633 32.47167,-86.431728 32.471986,-86.431807 32.47234,-86.431851 32.472639,-86.431926 32.472901,-86.431946 32.473087,-86.431917 32.473281,-86.431741 32.47414)\r\n501;599;odd;Fiveash Oak;Autauga;AL;36066;LINESTRING(-86.431821 32.471628,-86.431926 32.471948,-86.432003 32.472314,-86.432053 32.472607,-86.432134 32.472873,-86.432146 32.473093,-86.432113 32.473307,-86.431933 32.474169)\r\n200;212;all;Spring Valley Dr;Autauga;AL;36066;LINESTRING(-86.452837 32.517562,-86.452445 32.517563,-86.452019 32.517571,-86.451249 32.517577,-86.450677 32.517594)\r\n501;533;all;Autauga County 19;Autauga;AL;36003;LINESTRING(-86.667777 32.447652,-86.668198 32.44802)\r\n700;716;all;Smith Ave;Autauga;AL;36067;LINESTRING(-86.450373 32.454827,-86.450238 32.45483,-86.449887 32.454829)\r\n1500;1502;even;Jade St;Autauga;AL;36067;LINESTRING(-86.493024 32.522291,-86.493099 32.522382,-86.493243 32.522573,-86.493362 32.522689,-86.493436 32.522742,-86.49358 32.522832,-86.493809 32.52294,-86.493886 32.522971)\r\n1501;1503;odd;Jade St;Autauga;AL;36067;LINESTRING(-86.493182 32.522195,-86.493263 32.522286,-86.493409 32.522467,-86.49351 32.522565,-86.493564 32.522608,-86.493692 32.522686,-86.493905 32.522792,-86.493975 32.522825)\r\n742;748;all;Old Ridge Rd N;Autauga;AL;36066;LINESTRING(-86.417974 32.494481,-86.41795 32.494305,-86.417947 32.494159,-86.417938 32.494087,-86.417932 32.493798,-86.417921 32.493655,-86.417907 32.493289,-86.41791 32.493193)\r\n400;402;all;Sydney Dr N;Autauga;AL;36066;LINESTRING(-86.422573 32.492519,-86.4227 32.492679,-86.422857 32.492868,-86.422867 32.492879)\r\n1900;1968;even;Autauga County 63;Autauga;AL;36067;LINESTRING(-86.57595 32.551614,-86.575867 32.551632,-86.575706 32.551699,-86.575394 32.551832,-86.575239 32.551906,-86.575164 32.551947,-86.574739 32.552206,-86.574601 32.552302,-86.574469 32.552407,-86.574347 32.552517,-86.574232 32.552633,-86.574126 32.552752,-86.574023 32.552873,-86.573926 32.552996,-86.573835 32.553126,-86.573753 32.553262,-86.573687 32.553405,-86.573635 32.553551,-86.573597 32.553698,-86.573544 32.553994,-86.573515 32.554289,-86.573508 32.554439,-86.573509 32.554589,-86.573523 32.554738,-86.573661 32.555748,-86.573697 32.55618,-86.57372 32.556907,-86.573742 32.558062,-86.573729 32.558639,-86.573706 32.559003,-86.573704 32.559154,-86.573714 32.559313,-86.573769 32.559474,-86.573878 32.559617,-86.57402 32.559732,-86.574252 32.559845,-86.574375 32.559926,-86.574486 32.560022,-86.574592 32.560131,-86.574695 32.560244,-86.574946 32.560536,-86.57508 32.560714,-86.575151 32.560834,-86.575198 32.560958,-86.575222 32.561084,-86.575221 32.56122,-86.575207 32.561363,-86.575205 32.561426)\r\n1939;1999;odd;Autauga County 63;Autauga;AL;36067;LINESTRING(-86.57601 32.55177,-86.575943 32.551794,-86.575792 32.551849,-86.575488 32.55198,-86.575343 32.55205,-86.575276 32.552087,-86.574861 32.55234,-86.574733 32.55243,-86.574611 32.552527,-86.574497 32.552629,-86.574388 32.552739,-86.574284 32.552852,-86.574187 32.552967,-86.574096 32.553086,-86.574011 32.553208,-86.573939 32.553332,-86.573879 32.553461,-86.573831 32.553595,-86.573795 32.55373,-86.573744 32.554014,-86.573713 32.554299,-86.573706 32.554441,-86.573709 32.554581,-86.573721 32.554722,-86.573859 32.555732,-86.573895 32.556172,-86.573916 32.556903,-86.573936 32.558062,-86.573927 32.558645,-86.573906 32.559007,-86.573906 32.559148,-86.573924 32.559279,-86.573969 32.559396,-86.574046 32.559501,-86.574152 32.559588,-86.574366 32.559701,-86.574517 32.559794,-86.574638 32.559912,-86.574748 32.560027,-86.574853 32.560144,-86.57511 32.56044,-86.575258 32.560628,-86.575343 32.560766,-86.575404 32.560918,-86.575428 32.561074,-86.575423 32.56123,-86.575405 32.561375,-86.5754 32.561433)\r\n1023;1075;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.445389 32.454049,-86.444996 32.453644,-86.444905 32.453538)\r\n599;501;odd;Walker St;Autauga;AL;36066;LINESTRING(-86.450613 32.474332,-86.4506 32.474037,-86.450577 32.47369)\r\n598;500;even;Walker St;Autauga;AL;36066;LINESTRING(-86.450419 32.474339,-86.450404 32.474045,-86.450383 32.473699)\r\n600;698;even;Summit Pkwy;Autauga;AL;36066;LINESTRING(-86.418185 32.482736,-86.418197 32.482484,-86.418208 32.482306,-86.41821 32.48215,-86.418199 32.482035,-86.418175 32.481933,-86.418142 32.481797,-86.418126 32.481665,-86.418139 32.481451,-86.418134 32.481151)\r\n601;699;odd;Summit Pkwy;Autauga;AL;36066;LINESTRING(-86.417991 32.482729,-86.418003 32.482478,-86.41801 32.482302,-86.418008 32.482158,-86.417997 32.482059,-86.417979 32.481969,-86.417932 32.481823,-86.417932 32.481665,-86.417941 32.481449,-86.417939 32.481152)\r\n625;699;all;Prairie View Dr;Autauga;AL;36067;LINESTRING(-86.477904 32.497974,-86.478045 32.497974)\r\n1804;1898;all;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.514842 32.543224,-86.514879 32.543396,-86.514901 32.543534,-86.514926 32.543811,-86.514927 32.544093,-86.514919 32.544232,-86.514878 32.544585,-86.514747 32.545435,-86.514708 32.545648,-86.514613 32.546295,-86.514236 32.548667,-86.514085 32.549648)\r\n122;198;even;Daffadil Ct;Autauga;AL;36067;LINESTRING(-86.467872 32.570448,-86.467866 32.570422,-86.467853 32.570366,-86.467843 32.57032,-86.467868 32.57017,-86.467878 32.570134,-86.467898 32.570098,-86.467921 32.570066,-86.467933 32.570046)\r\n131;199;odd;Daffadil Ct;Autauga;AL;36067;LINESTRING(-86.467683 32.570488,-86.467674 32.57046,-86.467655 32.570398,-86.467643 32.570326,-86.467656 32.570132,-86.467686 32.570068,-86.467718 32.570014,-86.467753 32.569968,-86.467779 32.569946)\r\n899;801;odd;Eswick Dr;Autauga;AL;36067;LINESTRING(-86.483313 32.478816,-86.483272 32.4788,-86.483218 32.478782,-86.483156 32.478762,-86.483098 32.478741,-86.483054 32.478719,-86.483006 32.478693,-86.482925 32.478661,-86.48286 32.478643,-86.4828 32.478622,-86.482726 32.478605,-86.482637 32.478599,-86.482574 32.478605,-86.482503 32.478602,-86.482413 32.478617,-86.482354 32.478623,-86.482254 32.478632,-86.482168 32.47863,-86.482074 32.478646,-86.481983 32.478655,-86.481878 32.478664,-86.481733 32.478691,-86.481638 32.478726,-86.481556 32.478748,-86.481474 32.47878,-86.481415 32.478804)\r\n198;100;even;Eswick Dr;Autauga;AL;36067;LINESTRING(-86.483253 32.478973,-86.483196 32.478962,-86.483138 32.478936,-86.48308 32.478914,-86.48302 32.478893,-86.482954 32.478873,-86.482904 32.478845,-86.482845 32.478819,-86.482792 32.478799,-86.48274 32.478786,-86.482686 32.478775,-86.482643 32.478765,-86.482588 32.478779,-86.482513 32.478774,-86.482449 32.478781,-86.482382 32.478797,-86.482264 32.478802,-86.482186 32.478806,-86.4821 32.478814,-86.482005 32.478821,-86.481914 32.478834,-86.481795 32.478859,-86.481706 32.478884,-86.481628 32.478908,-86.481554 32.478932,-86.481496 32.478953)\r\n598;576;all;Jasmine Trl;Autauga;AL;36066;LINESTRING(-86.428651 32.478028,-86.428633 32.477813,-86.428611 32.477678,-86.428539 32.477364)\r\n2598;2596;even;Autauga County 121;Autauga;AL;36022;LINESTRING(-86.427912 32.644214,-86.427895 32.64423,-86.427879 32.644266)\r\n2599;2597;odd;Autauga County 121;Autauga;AL;36022;LINESTRING(-86.428078 32.6443,-86.428073 32.644314,-86.428053 32.64434)\r\n2700;2798;even;Autauga County 67;Autauga;AL;36006;LINESTRING(-86.679114 32.700866,-86.679149 32.70104,-86.679216 32.701397,-86.679381 32.702248,-86.679401 32.702388,-86.679412 32.702528,-86.679445 32.704483,-86.679454 32.704844,-86.679469 32.705204,-86.679483 32.705882)\r\n2701;2799;odd;Autauga County 67;Autauga;AL;36006;LINESTRING(-86.679306 32.700837,-86.679343 32.701012,-86.67941 32.701371,-86.679579 32.702224,-86.679599 32.702372,-86.679612 32.70252,-86.679641 32.704481,-86.67965 32.70484,-86.679667 32.7052,-86.679678 32.705879)\r\n199;117;odd;Alecia Dr;Autauga;AL;36066;LINESTRING(-86.428144 32.450254,-86.428735 32.449742)\r\n198;114;even;Alecia Dr;Autauga;AL;36066;LINESTRING(-86.428005 32.450139,-86.428596 32.449627)\r\n1000;1098;even;Florida St;Autauga;AL;36067;LINESTRING(-86.482886 32.438143,-86.483016 32.438114,-86.483517 32.437894,-86.484072 32.437651,-86.48523 32.437134,-86.485995 32.436801,-86.486157 32.436738,-86.486268 32.436677)\r\n1001;1099;odd;Florida St;Autauga;AL;36067;LINESTRING(-86.482826 32.437986,-86.482936 32.43795,-86.483429 32.437746,-86.483982 32.437505,-86.48514 32.436988,-86.485907 32.436651,-86.486061 32.436586,-86.486168 32.436536)\r\n1085;1199;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.444462 32.453065,-86.444414 32.453013,-86.444047 32.45263,-86.443983 32.452579,-86.443966 32.45255)\r\n1089;1077;all;Arrowhead Dr;Autauga;AL;36067;LINESTRING(-86.52149 32.459145,-86.522136 32.459147,-86.522483 32.459158,-86.522828 32.459179,-86.523087 32.459178,-86.523436 32.459163,-86.523785 32.459142,-86.524957 32.459047)\r\n100;198;even;Oak Ridge Ct;Autauga;AL;36066;LINESTRING(-86.428257 32.462535,-86.428181 32.462982)\r\n101;199;odd;Oak Ridge Ct;Autauga;AL;36066;LINESTRING(-86.42845 32.462558,-86.428374 32.463005)\r\n1829;1801;all;Autauga County 85;Autauga;AL;36067;LINESTRING(-86.470727 32.537366,-86.471038 32.53771,-86.471604 32.538339)\r\n2000;2098;even;Autauga County 72;Autauga;AL;36006;LINESTRING(-86.710005 32.557099,-86.710061 32.557138)\r\n2097;2099;odd;Autauga County 72;Autauga;AL;36006;LINESTRING(-86.710129 32.556972,-86.710185 32.557011)\r\n800;898;even;Olmstead Dr;Autauga;AL;36067;LINESTRING(-86.578226 32.567058,-86.578498 32.567066,-86.57867 32.567063,-86.579302 32.566938,-86.580396 32.56674,-86.581202 32.566576,-86.581284 32.566562)\r\n899;801;odd;Olmstead Dr;Autauga;AL;36067;LINESTRING(-86.578232 32.566894,-86.578496 32.5669,-86.57864 32.566887,-86.57926 32.566776,-86.580352 32.566578,-86.581162 32.56641,-86.581252 32.5664)\r\n200;298;even;Juniper Ct;Autauga;AL;36067;LINESTRING(-86.457017 32.470321,-86.457148 32.470304,-86.457395 32.47027,-86.45763 32.470264,-86.457772 32.470295,-86.45792 32.470348,-86.458375 32.470554,-86.458553 32.470615,-86.458756 32.470619,-86.458949 32.470578,-86.459113 32.47049,-86.459247 32.470385,-86.459837 32.469865,-86.459958 32.469778,-86.46006 32.469726,-86.460147 32.469699,-86.460289 32.469674)\r\n201;299;odd;Juniper Ct;Autauga;AL;36067;LINESTRING(-86.456987 32.470158,-86.457114 32.47014,-86.457373 32.470096,-86.457654 32.470084,-86.457844 32.470127,-86.458008 32.470196,-86.458459 32.470394,-86.458597 32.470431,-86.458732 32.470439,-86.458863 32.470406,-86.458987 32.470346,-86.459107 32.470261,-86.459697 32.469743,-86.45983 32.469636,-86.459966 32.469562,-86.460097 32.469523,-86.460262 32.469511)\r\n511;501;odd;McGriff St;Autauga;AL;36067;LINESTRING(-86.468133 32.439839,-86.468095 32.439888,-86.468001 32.439993,-86.467824 32.440128,-86.467688 32.440194,-86.467618 32.44022,-86.467467 32.44025,-86.467271 32.440263)\r\n510;500;even;McGriff St;Autauga;AL;36067;LINESTRING(-86.468305 32.439917,-86.468271 32.439982,-86.468159 32.440113,-86.46795 32.440276,-86.467774 32.440356,-86.46768 32.44038,-86.467501 32.440434,-86.467275 32.440428)\r\n2800;2998;even;McGee Rd;Autauga;AL;36067;LINESTRING(-86.676582 32.599965,-86.676943 32.599924,-86.677183 32.599906,-86.677259 32.599906,-86.677434 32.599914,-86.677536 32.599913,-86.677718 32.599878,-86.677891 32.599833,-86.678283 32.599696,-86.678442 32.599653,-86.678857 32.599575,-86.679266 32.599493,-86.679499 32.599437,-86.679573 32.599425,-86.679649 32.599418,-86.679726 32.599421,-86.679799 32.599431,-86.679873 32.599448,-86.679946 32.599473,-86.680019 32.599503,-86.680083 32.599538,-86.680212 32.599621,-86.680459 32.599818,-86.680542 32.599861,-86.680629 32.599903,-86.68073 32.599931,-86.680831 32.599925,-86.680926 32.599927,-86.681263 32.599876,-86.681438 32.599863,-86.6817 32.599809,-86.681948 32.599745,-86.682025 32.59973,-86.682183 32.599709,-86.682353 32.599697,-86.682613 32.599651,-86.682936 32.599579,-86.683004 32.599571,-86.683074 32.599562,-86.683145 32.599574,-86.683212 32.59959,-86.683277 32.599616,-86.683342 32.599651,-86.683403 32.599694,-86.683645 32.599889,-86.683783 32.599988,-86.683929 32.600077,-86.684082 32.600153,-86.684245 32.600219,-86.684491 32.600296,-86.684659 32.600337,-86.684833 32.600366,-86.685182 32.600402,-86.685442 32.600418,-86.685874 32.600418,-86.686119 32.600416)\r\n1701;1799;odd;McGee Rd;Autauga;AL;36067;LINESTRING(-86.676555 32.599802,-86.676919 32.599756,-86.677173 32.599734,-86.677267 32.599734,-86.677434 32.59975,-86.677506 32.599739,-86.677666 32.599712,-86.677821 32.599671,-86.678213 32.599534,-86.67839 32.599487,-86.678813 32.599413,-86.679214 32.599331,-86.679449 32.599271,-86.679543 32.599253,-86.679643 32.599248,-86.679742 32.599247,-86.679845 32.599259,-86.679941 32.599286,-86.68003 32.599317,-86.680115 32.599355,-86.680199 32.599394,-86.680344 32.599489,-86.680589 32.599678,-86.680646 32.599713,-86.680709 32.599737,-86.680766 32.599749,-86.680831 32.599761,-86.680904 32.599753,-86.681237 32.599706,-86.681404 32.599691,-86.681648 32.599645,-86.681896 32.599581,-86.681987 32.599562,-86.682159 32.599543,-86.682323 32.599527,-86.682567 32.599487,-86.68289 32.599415,-86.682976 32.599395,-86.683076 32.599396,-86.683185 32.599396,-86.68329 32.599424,-86.683383 32.599466,-86.683462 32.599515,-86.683537 32.599564,-86.683779 32.599763,-86.683907 32.599854,-86.684039 32.599933,-86.684178 32.600001,-86.684325 32.600061,-86.684555 32.600134,-86.684707 32.600171,-86.684865 32.600198,-86.685202 32.600234,-86.68545 32.600248,-86.685874 32.600254,-86.686117 32.600251)\r\n1650;1666;all;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.439455 32.538111,-86.439477 32.538126,-86.439549 32.538169,-86.439781 32.538299)\r\n2544;2500;all;Beaver Creek Rd;Autauga;AL;36067;LINESTRING(-86.651756 32.581986,-86.651674 32.581982,-86.651204 32.581827,-86.651047 32.581788,-86.650805 32.581743,-86.650375 32.581695,-86.650196 32.581672,-86.650101 32.581647,-86.650015 32.581616,-86.64985 32.581557,-86.649696 32.581481,-86.649335 32.581297,-86.648826 32.581001,-86.648752 32.580967,-86.648679 32.580943,-86.648667 32.580933)\r\n220;298;even;N Pickett St;Autauga;AL;36003;LINESTRING(-86.654656 32.435746,-86.65495 32.436117)\r\n219;223;odd;N Pickett St;Autauga;AL;36003;LINESTRING(-86.654817 32.435655,-86.655111 32.436026)\r\n2492;2486;all;Chancellor Ridge Rd;Autauga;AL;36066;LINESTRING(-86.41731 32.470462,-86.417312 32.470477,-86.417389 32.47059,-86.417415 32.470647,-86.417457 32.470779,-86.417505 32.471004)\r\n899;811;all;Bunche Ave;Autauga;AL;36067;LINESTRING(-86.472403 32.478397,-86.472405 32.478192,-86.472409 32.477985)\r\n2700;2758;even;Autauga County 99;Autauga;AL;36022;LINESTRING(-86.492118 32.658181,-86.492254 32.658301,-86.49261 32.658595,-86.492742 32.658689,-86.49286 32.658785,-86.49297 32.658888,-86.49307 32.658997,-86.49316 32.659114,-86.493241 32.659236,-86.493345 32.659424,-86.493426 32.659616,-86.493463 32.659742,-86.493487 32.659874,-86.493529 32.660291,-86.49356 32.660866,-86.49358 32.661662,-86.4936 32.661881,-86.493632 32.662102,-86.493698 32.662392,-86.493805 32.66275,-86.493861 32.662899,-86.493903 32.662971,-86.493988 32.663104,-86.49413 32.663293,-86.494235 32.663421,-86.494361 32.663533,-86.494416 32.66359,-86.494555 32.663758,-86.494616 32.663814,-86.494912 32.664067,-86.495136 32.66428,-86.495347 32.664502,-86.4958 32.665023,-86.495935 32.665201,-86.496053 32.665384,-86.496116 32.665508,-86.496139 32.665568,-86.496156 32.665631,-86.496176 32.665764,-86.496183 32.665898,-86.496176 32.665961,-86.496151 32.666097,-86.496133 32.66616,-86.495867 32.666827)\r\n2701;2761;odd;Autauga County 99;Autauga;AL;36022;LINESTRING(-86.492258 32.658066,-86.492394 32.658183,-86.492746 32.658469,-86.492876 32.658563,-86.493004 32.658667,-86.493126 32.658778,-86.493236 32.658899,-86.493334 32.659026,-86.493419 32.659158,-86.493533 32.659358,-86.493622 32.659566,-86.493663 32.65971,-86.493687 32.659854,-86.493727 32.660281,-86.493758 32.66086,-86.49378 32.661654,-86.493798 32.661865,-86.49383 32.662076,-86.493894 32.662356,-86.493999 32.662702,-86.494053 32.662835,-86.494083 32.662895,-86.494162 32.663018,-86.494296 32.663199,-86.494395 32.663311,-86.494515 32.663421,-86.494576 32.663488,-86.494715 32.66365,-86.494762 32.663698,-86.495058 32.663951,-86.495288 32.664172,-86.495505 32.6644,-86.495964 32.664927,-86.496109 32.665113,-86.496237 32.665308,-86.496308 32.665448,-86.496335 32.665524,-86.496356 32.665601,-86.496382 32.66575,-86.496383 32.665902,-86.496378 32.665981,-86.496351 32.666131,-86.496327 32.666208,-86.496052 32.66688)\r\n703;701;odd;Cranbrook Dr;Autauga;AL;36067;LINESTRING(-86.462426 32.447289,-86.462427 32.44727,-86.462424 32.447129,-86.46243 32.446835)\r\n704;702;even;Cranbrook Dr;Autauga;AL;36067;LINESTRING(-86.462231 32.447299,-86.462227 32.447276,-86.462228 32.447127,-86.462235 32.446832)\r\n1400;1412;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.512371 32.471563,-86.512759 32.471685,-86.514237 32.472151,-86.514725 32.47231,-86.515192 32.472456)\r\n1401;1415;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.512439 32.471409,-86.512827 32.471531,-86.514307 32.471997,-86.514795 32.472156,-86.51526 32.472302)\r\n2000;2098;even;Animal Acres Dr;Autauga;AL;36022;LINESTRING(-86.417642 32.571608,-86.417598 32.571505,-86.417578 32.571456,-86.417534 32.57135,-86.417507 32.571291,-86.417472 32.571241,-86.417446 32.571196,-86.41742 32.571143,-86.417392 32.571094,-86.41737 32.571047,-86.417325 32.570941,-86.417281 32.570818,-86.417253 32.570744,-86.417196 32.570676,-86.417141 32.570595,-86.416961 32.570518,-86.416869 32.570509,-86.416796 32.570498,-86.416733 32.570482,-86.416693 32.570465,-86.416665 32.57045,-86.416576 32.57037,-86.416539 32.570322,-86.416503 32.570262,-86.416466 32.570208,-86.416449 32.570164,-86.416427 32.570051,-86.416426 32.56999,-86.416426 32.569933,-86.416438 32.569887,-86.416482 32.56976,-86.416514 32.569688,-86.416568 32.569538,-86.416595 32.56947,-86.416621 32.569406,-86.416646 32.569357,-86.416699 32.569264,-86.416732 32.569212,-86.416805 32.569106,-86.416836 32.569056,-86.416872 32.569008,-86.416896 32.568975,-86.417007 32.568852)\r\n2001;2099;odd;Animal Acres Dr;Autauga;AL;36022;LINESTRING(-86.417461 32.571668,-86.417408 32.571561,-86.41739 32.57151,-86.417348 32.571412,-86.417323 32.571367,-86.417294 32.571319,-86.417264 32.571264,-86.417238 32.571211,-86.417212 32.571162,-86.417182 32.571109,-86.417137 32.570993,-86.417091 32.570874,-86.417063 32.570824,-86.41703 32.570772,-86.416989 32.570743,-86.416885 32.570692,-86.416829 32.570673,-86.416756 32.57066,-86.416677 32.57065,-86.416593 32.570631,-86.416521 32.570586,-86.416414 32.570478,-86.416357 32.57041,-86.416323 32.570346,-86.416278 32.570288,-86.416237 32.570208,-86.416225 32.570057,-86.41623 32.569992,-86.416224 32.569925,-86.416232 32.569847,-86.416294 32.569704,-86.416326 32.569632,-86.416382 32.569488,-86.416409 32.569416,-86.416437 32.56935,-86.416458 32.569291,-86.416519 32.569182,-86.416562 32.569128,-86.416633 32.569024,-86.416664 32.568978,-86.416684 32.568936,-86.416702 32.568875,-86.416862 32.568742)\r\n800;998;even;Red Eagle Rd;Autauga;AL;36067;LINESTRING(-86.517108 32.450024,-86.516658 32.450843,-86.516197 32.451789,-86.516087 32.452066,-86.51555 32.453448,-86.515286 32.45414,-86.51506 32.454691,-86.514874 32.455166,-86.514819 32.455292,-86.514732 32.455518)\r\n803;999;odd;Red Eagle Rd;Autauga;AL;36067;LINESTRING(-86.517285 32.450094,-86.51684 32.450911,-86.516385 32.451849,-86.516273 32.452118,-86.515736 32.4535,-86.515472 32.454192,-86.515246 32.454745,-86.51506 32.455222,-86.515005 32.455348,-86.514916 32.45557)\r\n1021;1001;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.603811 32.574075,-86.603778 32.574077,-86.603104 32.574132,-86.602684 32.574152,-86.60235 32.574158,-86.602011 32.574152,-86.601267 32.57413)\r\n1004;1000;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.603837 32.574238,-86.6038 32.574243,-86.60312 32.5743,-86.60269 32.57432,-86.60235 32.574322,-86.602005 32.574318,-86.60126 32.574295)\r\n399;201;odd;Autauga County 62;Autauga;AL;36067;LINESTRING(-86.529381 32.632387,-86.528543 32.632499,-86.528216 32.632533,-86.528056 32.632542,-86.527896 32.632538,-86.527651 32.632518,-86.527408 32.632482,-86.526913 32.632388,-86.526657 32.632352,-86.526311 32.632331,-86.525965 32.632325,-86.525282 32.632338,-86.524852 32.632363,-86.524593 32.632389,-86.524421 32.632423,-86.524335 32.632444,-86.52425 32.632471,-86.524165 32.632502,-86.524085 32.632543,-86.52401 32.632587,-86.523873 32.632684,-86.523697 32.632846,-86.523582 32.632956,-86.523512 32.633041,-86.523477 32.633076,-86.523383 32.6332,-86.523261 32.633392,-86.523196 32.633527,-86.523113 32.633728,-86.522973 32.633978,-86.522935 32.634028,-86.522887 32.634073,-86.522832 32.63411,-86.52277 32.634142,-86.522702 32.634168,-86.522627 32.634187,-86.522554 32.6342,-86.522477 32.634208,-86.521615 32.634199,-86.520926 32.634201,-86.519898 32.63422,-86.51803 32.634309,-86.517267 32.634331,-86.515732 32.634337,-86.515135 32.634332,-86.514708 32.634336,-86.513522 32.634334,-86.513361 32.634323,-86.513284 32.634313,-86.513208 32.634296,-86.513133 32.634276,-86.513061 32.634249,-86.512994 32.634218,-86.51286 32.634142,-86.512802 32.6341,-86.512687 32.634002,-86.512639 32.633952,-86.512548 32.633838,-86.512383 32.633589,-86.512193 32.633266,-86.511898 32.632823,-86.511765 32.632638,-86.511669 32.632516,-86.511564 32.6324,-86.511505 32.632338,-86.511372 32.632237,-86.511164 32.632105,-86.510804 32.631899,-86.510505 32.631747,-86.510272 32.631644,-86.510034 32.631553,-86.509713 32.631444,-86.508818 32.631189,-86.508482 32.631107,-86.508143 32.631046,-86.50714 32.630873,-86.505977 32.630703,-86.505464 32.630645,-86.505118 32.630622,-86.503828 32.630617,-86.503318 32.63062,-86.502826 32.630616,-86.502553 32.630621)\r\n398;200;even;Autauga County 62;Autauga;AL;36067;LINESTRING(-86.529412 32.63255,-86.528571 32.632665,-86.528234 32.632701,-86.528062 32.63271,-86.527884 32.63271,-86.527623 32.632688,-86.527368 32.632646,-86.526875 32.632554,-86.526633 32.632522,-86.526301 32.632499,-86.525965 32.632489,-86.525292 32.632506,-86.524872 32.632531,-86.524629 32.632559,-86.524471 32.632587,-86.524399 32.632606,-86.524326 32.632629,-86.524259 32.632656,-86.524195 32.632687,-86.524134 32.632723,-86.524015 32.63281,-86.523845 32.632958,-86.52374 32.633062,-86.523668 32.633139,-86.523643 32.633172,-86.523557 32.633286,-86.523445 32.633466,-86.523384 32.633587,-86.523303 32.633792,-86.523157 32.634066,-86.523099 32.634136,-86.523031 32.634201,-86.52295 32.634256,-86.522862 32.634298,-86.522772 32.634328,-86.522681 32.634355,-86.522584 32.634372,-86.522485 32.634378,-86.521613 32.634365,-86.520928 32.634367,-86.519906 32.634388,-86.518038 32.634475,-86.517271 32.634497,-86.515732 32.634503,-86.515135 32.634496,-86.51471 32.634502,-86.513514 32.634506,-86.513335 32.634493,-86.513244 32.634479,-86.51315 32.634462,-86.513061 32.634434,-86.512975 32.634405,-86.512888 32.634368,-86.512738 32.634278,-86.512664 32.634228,-86.512535 32.634116,-86.512475 32.634054,-86.512376 32.633926,-86.512207 32.633667,-86.512017 32.633344,-86.511726 32.632907,-86.511597 32.632728,-86.511505 32.632614,-86.511408 32.632506,-86.511357 32.63246,-86.511242 32.632369,-86.511048 32.632243,-86.510696 32.632041,-86.510407 32.631895,-86.510184 32.631796,-86.509956 32.631707,-86.509643 32.631602,-86.508758 32.631349,-86.508432 32.631271,-86.508103 32.631208,-86.507104 32.631037,-86.505947 32.630869,-86.505444 32.630813,-86.50511 32.630792,-86.503828 32.630781,-86.503318 32.630784,-86.502826 32.630782,-86.502557 32.630785)\r\n201;205;all;Hummingbird Dr;Autauga;AL;36022;LINESTRING(-86.481449 32.616399,-86.481176 32.616529,-86.481012 32.616596,-86.480757 32.616668,-86.480453 32.616717)\r\n2400;2498;even;W Valley Rd;Autauga;AL;36067;LINESTRING(-86.601982 32.492081,-86.602139 32.492059,-86.602476 32.491981,-86.602891 32.491879,-86.603306 32.491787,-86.60448 32.491561,-86.605418 32.491357)\r\n2401;2499;odd;W Valley Rd;Autauga;AL;36067;LINESTRING(-86.601946 32.491919,-86.602095 32.491893,-86.602424 32.491821,-86.602839 32.491719,-86.603258 32.491625,-86.604434 32.491399,-86.60537 32.491198)\r\n1576;1598;even;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.427134 32.534853,-86.427145 32.53486,-86.428158 32.535386,-86.429892 32.536282)\r\n1575;1599;odd;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.42723 32.53471,-86.427247 32.534716,-86.42826 32.535246,-86.429993 32.536141)\r\n2000;2098;even;Landcaster Ct;Autauga;AL;36022;LINESTRING(-86.43977 32.601676,-86.439773 32.60112)\r\n2001;2099;odd;Landcaster Ct;Autauga;AL;36022;LINESTRING(-86.439575 32.601675,-86.439578 32.601119)\r\n3047;3099;all;Autauga County 535;Autauga;AL;36051;LINESTRING(-86.466312 32.704438,-86.466002 32.704831,-86.465788 32.705113)\r\n1100;1198;all;Turner Crs;Autauga;AL;36067;LINESTRING(-86.512361 32.479461,-86.509814 32.478483)\r\n1799;1735;odd;Benson St;Autauga;AL;36066;LINESTRING(-86.418834 32.490739,-86.418839 32.49013,-86.418855 32.490084,-86.418848 32.490093,-86.41884 32.490104,-86.420679 32.490084)\r\n1780;1750;even;Benson St;Autauga;AL;36066;LINESTRING(-86.41864 32.490738,-86.418643 32.49013,-86.418627 32.49004,-86.418666 32.489975,-86.418752 32.489906,-86.420679 32.48992)\r\n2558;2546;all;Beaver Creek Rd;Autauga;AL;36067;LINESTRING(-86.656381 32.580555,-86.656363 32.58056,-86.655284 32.580773,-86.654963 32.580859,-86.653599 32.581289,-86.653366 32.581374,-86.653073 32.581505,-86.652709 32.581692,-86.652415 32.581855,-86.652257 32.581936,-86.652163 32.581977,-86.652078 32.581982)\r\n2400;2466;even;Autauga County 8;Autauga;AL;36006;LINESTRING(-86.755355 32.557873,-86.75551 32.558153,-86.755646 32.558415,-86.755804 32.55875,-86.756217 32.559751,-86.756422 32.560265,-86.756503 32.560406,-86.75656 32.560472,-86.756622 32.560535,-86.756751 32.560639,-86.757343 32.561049,-86.757525 32.561194,-86.757634 32.561296,-86.757733 32.561408,-86.75782 32.561524,-86.757897 32.561647,-86.757962 32.561773,-86.758042 32.561972,-86.758104 32.562175,-86.7582 32.5626,-86.758265 32.562818,-86.758327 32.562962,-86.758436 32.563167,-86.758525 32.563298,-86.758668 32.563486,-86.759662 32.564663,-86.760316 32.565424,-86.761256 32.566543,-86.761565 32.566892,-86.761981 32.567347,-86.762492 32.567926,-86.762634 32.568103,-86.762714 32.568221,-86.76278 32.568347,-86.762804 32.568408,-86.76284 32.56854,-86.762873 32.568749,-86.762892 32.569032,-86.762898 32.569463,-86.76289 32.56968,-86.762859 32.570047,-86.762858 32.5702,-86.762868 32.57028,-86.762883 32.570357,-86.762905 32.570431,-86.762933 32.570506,-86.762969 32.570579,-86.763051 32.57071,-86.76315 32.570836,-86.763262 32.570952,-86.763448 32.571111,-86.763645 32.571257,-86.763982 32.571487,-86.764468 32.571789,-86.765555 32.572481,-86.766689 32.573252,-86.766969 32.573435,-86.767127 32.573514,-86.767216 32.573547,-86.767388 32.573602,-86.767567 32.573635,-86.768068 32.573695,-86.768227 32.573725,-86.768376 32.573765,-86.768444 32.57379,-86.768508 32.573822,-86.76857 32.573858,-86.768693 32.57395,-86.768746 32.573997,-86.768826 32.574084)\r\n2449;2499;odd;Autauga County 8;Autauga;AL;36006;LINESTRING(-86.755531 32.557802,-86.75569 32.558083,-86.755828 32.558351,-86.75599 32.558692,-86.756401 32.559697,-86.756612 32.560197,-86.756683 32.560316,-86.756722 32.560368,-86.756772 32.560417,-86.756885 32.560511,-86.757475 32.560921,-86.757671 32.561074,-86.75779 32.561188,-86.757899 32.56131,-86.757994 32.561438,-86.758079 32.561573,-86.75815 32.561711,-86.758236 32.561924,-86.7583 32.562139,-86.758396 32.562564,-86.758459 32.562768,-86.758515 32.562898,-86.758618 32.563089,-86.758697 32.56321,-86.758834 32.563392,-86.75982 32.564567,-86.760476 32.565328,-86.761416 32.566445,-86.761721 32.566792,-86.762137 32.567247,-86.762654 32.567828,-86.762804 32.568011,-86.762896 32.568143,-86.76297 32.568285,-86.763 32.56836,-86.763042 32.56851,-86.763073 32.568733,-86.76309 32.569026,-86.763094 32.569465,-86.763088 32.569688,-86.763061 32.570053,-86.763062 32.570192,-86.763068 32.570258,-86.763081 32.570323,-86.763099 32.570385,-86.763123 32.570446,-86.763153 32.570505,-86.763227 32.570622,-86.763314 32.570734,-86.763414 32.570838,-86.763586 32.570987,-86.763773 32.571129,-86.764104 32.571355,-86.764584 32.571657,-86.765677 32.572349,-86.766811 32.57312,-86.767083 32.573291,-86.767221 32.57336,-86.767292 32.573389,-86.767446 32.573434,-86.767605 32.573467,-86.768104 32.573527,-86.768277 32.573559,-86.76845 32.573601,-86.768538 32.573638,-86.768618 32.573676,-86.768694 32.573724,-86.768839 32.573824,-86.768904 32.573889,-86.768983 32.573987)\r\n298;218;all;Allenville Rd;Autauga;AL;36067;LINESTRING(-86.485619 32.466329,-86.485633 32.466247,-86.485677 32.465959,-86.48571 32.465708)\r\n617;699;all;Autauga County 4;Autauga;AL;36067;LINESTRING(-86.456763 32.424593,-86.456553 32.424536,-86.456385 32.424497,-86.456218 32.424464,-86.455367 32.424335,-86.454526 32.424221,-86.454099 32.424165,-86.453589 32.424099)\r\n535;573;all;Autauga County 19;Autauga;AL;36003;LINESTRING(-86.672529 32.451908,-86.673003 32.452334,-86.673469 32.452765,-86.673919 32.453212,-86.674165 32.453473)\r\n319;333;all;Hazel St;Autauga;AL;36067;LINESTRING(-86.468236 32.431186,-86.468185 32.431189,-86.468113 32.431189)\r\n800;1038;even;Corley Rd;Autauga;AL;36067;LINESTRING(-86.425382 32.424822,-86.42534 32.424897,-86.425232 32.425044,-86.425172 32.425112,-86.42509 32.425187,-86.424861 32.425343,-86.424619 32.425476,-86.42429 32.425709,-86.423992 32.425938,-86.423927 32.425985,-86.423895 32.425994,-86.423836 32.426017,-86.42381 32.426028,-86.423788 32.426036,-86.423733 32.426047,-86.423685 32.426053,-86.423628 32.426043,-86.423587 32.426033,-86.423544 32.426021,-86.423464 32.425998,-86.42339 32.425973,-86.422957 32.425793,-86.422282 32.425563,-86.421946 32.425439,-86.421608 32.425382,-86.421253 32.425373,-86.420594 32.425384,-86.420154 32.425433,-86.419796 32.425482)\r\n1035;1099;odd;Corley Rd;Autauga;AL;36067;LINESTRING(-86.425566 32.424875,-86.425536 32.424979,-86.425394 32.425142,-86.425328 32.425216,-86.42524 32.425317,-86.424979 32.425483,-86.424741 32.425616,-86.42442 32.425837,-86.424122 32.426066,-86.424051 32.426113,-86.424007 32.426158,-86.423924 32.426179,-86.423896 32.426194,-86.423836 32.426208,-86.423759 32.426215,-86.423681 32.426219,-86.423592 32.426213,-86.423523 32.426201,-86.423474 32.426181,-86.42339 32.42616,-86.423306 32.426125,-86.422875 32.425949,-86.422208 32.425715,-86.421884 32.425611,-86.421582 32.425558,-86.421251 32.425539,-86.42061 32.425556,-86.420182 32.425599,-86.419826 32.425645)\r\n100;198;even;Flintlock Close;Autauga;AL;36067;LINESTRING(-86.470032 32.454672,-86.470203 32.454586,-86.470358 32.454514)\r\n107;199;odd;Flintlock Close;Autauga;AL;36067;LINESTRING(-86.469931 32.454531,-86.470105 32.45444,-86.470266 32.454369)\r\n1514;1598;even;Trolley Rd;Autauga;AL;36066;LINESTRING(-86.425356 32.486563,-86.425352 32.486569,-86.425322 32.48662,-86.425297 32.486672,-86.425271 32.486721,-86.425245 32.48677,-86.425218 32.486819,-86.42519 32.486865,-86.42516 32.486912,-86.425129 32.486954,-86.425097 32.486995,-86.425027 32.48707,-86.424994 32.487099,-86.424958 32.487127,-86.42492 32.487147,-86.42488 32.487167,-86.424837 32.487182,-86.42479 32.487195,-86.424738 32.487206,-86.424684 32.487213,-86.424623 32.487221,-86.424563 32.487226,-86.424499 32.487231,-86.424431 32.487237,-86.424363 32.487242,-86.424294 32.487246,-86.424222 32.487251,-86.42415 32.487255,-86.424006 32.48726,-86.423933 32.487258,-86.423853 32.487255,-86.423688 32.487257,-86.423507 32.487267,-86.423467 32.487268,-86.423408 32.487274,-86.42321 32.487289,-86.423112 32.487295,-86.422924 32.487305,-86.422835 32.487308,-86.422748 32.487312,-86.422583 32.487321,-86.422503 32.487324,-86.422425 32.48733,-86.422358 32.487331,-86.422291 32.487328,-86.422209 32.487338,-86.422073 32.487376,-86.422005 32.487427,-86.421966 32.487493,-86.421946 32.487558,-86.421942 32.487621,-86.421941 32.48768,-86.421939 32.487741,-86.421936 32.487802,-86.42193 32.487863,-86.421922 32.487921,-86.421909 32.487979,-86.421892 32.488036,-86.421869 32.488091,-86.421842 32.488142,-86.421814 32.488181,-86.421799 32.488207)\r\n1511;1599;odd;Trolley Rd;Autauga;AL;36066;LINESTRING(-86.425531 32.486635,-86.425528 32.486641,-86.425502 32.48669,-86.425477 32.486736,-86.425453 32.486789,-86.425423 32.48684,-86.425396 32.486891,-86.425366 32.486943,-86.425332 32.486994,-86.425299 32.487044,-86.425261 32.487093,-86.425183 32.487182,-86.425136 32.487225,-86.425084 32.487261,-86.42503 32.487297,-86.424966 32.487323,-86.424905 32.487344,-86.424842 32.487359,-86.424778 32.48737,-86.424712 32.487381,-86.424647 32.487385,-86.424583 32.487394,-86.424515 32.487397,-86.424449 32.487401,-86.424379 32.487408,-86.424308 32.487412,-86.424236 32.487417,-86.42416 32.487421,-86.424006 32.487424,-86.423927 32.487422,-86.423853 32.487421,-86.423696 32.487425,-86.423517 32.487435,-86.423479 32.487436,-86.423424 32.487438,-86.423226 32.487453,-86.423126 32.487461,-86.422934 32.487471,-86.422845 32.487474,-86.42276 32.487478,-86.422593 32.487487,-86.422515 32.48749,-86.422439 32.487494,-86.422364 32.487501,-86.422309 32.487504,-86.422263 32.487512,-86.422189 32.48754,-86.422179 32.487547,-86.422164 32.487563,-86.422152 32.487592,-86.422142 32.487635,-86.422137 32.487686,-86.422135 32.487747,-86.422132 32.48781,-86.42213 32.487877,-86.42212 32.487945,-86.422107 32.488015,-86.422086 32.488086,-86.422057 32.488155,-86.422024 32.488218,-86.421988 32.488277,-86.421954 32.488306)\r\n1000;1098;even;Cooper Ave;Autauga;AL;36066;LINESTRING(-86.447298 32.462223,-86.446332 32.462232,-86.446135 32.462229)\r\n1001;1099;odd;Cooper Ave;Autauga;AL;36066;LINESTRING(-86.4473 32.462388,-86.446332 32.462396,-86.446133 32.462394)\r\n700;798;even;Spencer St;Autauga;AL;36066;LINESTRING(-86.447536 32.460195,-86.447534 32.460125,-86.447535 32.459763,-86.447527 32.459549)\r\n701;799;odd;Spencer St;Autauga;AL;36066;LINESTRING(-86.447342 32.460205,-86.447334 32.460129,-86.447339 32.459765,-86.447333 32.459554)\r\n701;717;all;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.744755 32.497475,-86.744851 32.497549,-86.744986 32.49765,-86.745261 32.497838,-86.745542 32.498011,-86.745836 32.498169,-86.745907 32.498205)\r\n199;197;all;Autauga County 29;Autauga;AL;36067;LINESTRING(-86.510317 32.420774,-86.510235 32.420853)\r\n399;301;odd;Gardner Rd;Autauga;AL;36067;LINESTRING(-86.476341 32.489075,-86.476151 32.489071,-86.47521 32.489077,-86.474263 32.489112,-86.474264 32.489113)\r\n398;300;even;Gardner Rd;Autauga;AL;36067;LINESTRING(-86.476337 32.489239,-86.476151 32.489237,-86.475216 32.489245,-86.474271 32.489278,-86.47427 32.489277)\r\n1440;1498;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.518892 32.473639,-86.519099 32.473706,-86.519654 32.473899,-86.520204 32.474106,-86.520664 32.474293,-86.521101 32.474487)\r\n1429;1499;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.518961 32.473485,-86.519171 32.473552,-86.519732 32.473745,-86.520286 32.473954,-86.520754 32.474143,-86.521192 32.474341)\r\n907;901;odd;Wilberforce Ave;Autauga;AL;36067;LINESTRING(-86.471451 32.479703,-86.471455 32.479549,-86.471466 32.47941,-86.471484 32.479341,-86.471506 32.47927)\r\n902;888;even;Wilberforce Ave;Autauga;AL;36067;LINESTRING(-86.471256 32.479702,-86.471255 32.479543,-86.471266 32.479394,-86.471274 32.479295,-86.471326 32.479209)\r\n1400;1498;all;Avation Way;Autauga;AL;36067;LINESTRING(-86.508049 32.43618,-86.510682 32.436126,-86.511336 32.436113)\r\n219;201;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.479839 32.570837,-86.479776 32.570859,-86.479616 32.570924,-86.479382 32.571033,-86.479162 32.571158,-86.478956 32.571297,-86.478571 32.571591,-86.478019 32.572023)\r\n216;200;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.479919 32.570987,-86.47986 32.571011,-86.479708 32.571074,-86.479488 32.571179,-86.479282 32.571296,-86.479086 32.571427,-86.478703 32.571713,-86.478151 32.572144)\r\n2501;2533;all;State Rte 143;Autauga;AL;36022;LINESTRING(-86.420656 32.645512,-86.420972 32.646215,-86.421086 32.646491,-86.421325 32.64711,-86.421784 32.648272,-86.421958 32.648681,-86.421972 32.648722)\r\n1641;1623;odd;Autauga County 24;Autauga;AL;36006;LINESTRING(-86.699606 32.668296,-86.699573 32.668299,-86.699409 32.668319,-86.699244 32.668332,-86.69908 32.668339,-86.697982 32.668349,-86.697636 32.668366,-86.697461 32.668384,-86.697286 32.668406,-86.696946 32.668479,-86.696773 32.668521,-86.696512 32.668608)\r\n1638;1622;even;Autauga County 24;Autauga;AL;36006;LINESTRING(-86.699644 32.668458,-86.699605 32.668467,-86.699431 32.668485,-86.699258 32.6685,-86.699086 32.668505,-86.69799 32.668517,-86.697654 32.668534,-86.697489 32.66855,-86.697326 32.668574,-86.696998 32.668641,-86.696837 32.668683,-86.696581 32.668762)\r\n1399;1301;all;Co Rd 63;Autauga;AL;36051;LINESTRING(-86.486136 32.707346,-86.48604 32.707347,-86.485865 32.707359,-86.485445 32.707395,-86.485189 32.707424,-86.484935 32.707463,-86.484806 32.707489)\r\n127;101;odd;Cosby Ct;Autauga;AL;36067;LINESTRING(-86.469662 32.470629,-86.469882 32.47015,-86.469996 32.469972,-86.470092 32.469871,-86.470568 32.469462,-86.470691 32.469379,-86.470895 32.469282,-86.471116 32.469223,-86.471264 32.469206,-86.471591 32.469234,-86.471601 32.46923)\r\n198;100;even;Cosby Ct;Autauga;AL;36067;LINESTRING(-86.46948 32.470572,-86.469694 32.470078,-86.469818 32.46987,-86.469944 32.469755,-86.47043 32.469336,-86.470569 32.469231,-86.470809 32.469118,-86.471074 32.469043,-86.471266 32.46904,-86.471623 32.46906,-86.471645 32.46907)\r\n746;740;all;2nd St;Autauga;AL;36703;LINESTRING(-86.7963 32.378066,-86.796239 32.378361,-86.796139 32.378795,-86.796099 32.378929)\r\n1124;1298;even;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.627883 32.540247,-86.627985 32.540345,-86.628089 32.540455,-86.628183 32.54057,-86.62827 32.540689,-86.628348 32.540813,-86.628419 32.54094,-86.628484 32.541072,-86.628603 32.541342,-86.628711 32.541615,-86.629058 32.542587,-86.629145 32.542864,-86.629261 32.543287,-86.629324 32.543569,-86.629364 32.543852,-86.629445 32.544871,-86.629554 32.545962,-86.629646 32.546758,-86.629657 32.546901,-86.629669 32.54719,-86.629665 32.547477,-86.629639 32.548133,-86.629639 32.548355,-86.629642 32.548503,-86.629653 32.548652,-86.629671 32.548799,-86.629718 32.549091,-86.62985 32.549735,-86.62987 32.54988,-86.629949 32.550386,-86.629997 32.550749,-86.630059 32.551113,-86.630121 32.551404,-86.630164 32.55155,-86.630212 32.551694,-86.63032 32.551973,-86.63052 32.552454,-86.630831 32.553135,-86.631003 32.553544,-86.631054 32.553681,-86.631144 32.55396,-86.631224 32.55424,-86.631294 32.554524,-86.631354 32.554808,-86.631442 32.555313,-86.63165 32.556392,-86.631866 32.557466,-86.632008 32.558113,-86.632068 32.558333,-86.632135 32.55848,-86.63223 32.558618,-86.63234 32.558739,-86.632399 32.558799,-86.632755 32.559121,-86.633784 32.560003,-86.634033 32.560209,-86.634428 32.560499,-86.634706 32.560677,-86.634852 32.560763,-86.635001 32.560842,-86.635153 32.560918,-86.635458 32.561057,-86.636382 32.561443,-86.636838 32.561649,-86.637158 32.561769,-86.637323 32.561825,-86.637498 32.561864,-86.637671 32.561897,-86.638184 32.561972,-86.638361 32.561987,-86.638536 32.561998,-86.638881 32.562013,-86.639265 32.562039)\r\n1125;1299;odd;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.628026 32.540135,-86.628139 32.540233,-86.628249 32.540355,-86.628351 32.540476,-86.628444 32.540605,-86.628526 32.540739,-86.628601 32.540872,-86.62867 32.54101,-86.628789 32.541286,-86.628899 32.541565,-86.629248 32.542541,-86.629337 32.542824,-86.629455 32.543253,-86.629522 32.543543,-86.629564 32.543836,-86.629641 32.544859,-86.62975 32.545946,-86.629844 32.546744,-86.629855 32.546893,-86.629865 32.547188,-86.629863 32.547481,-86.629837 32.548137,-86.629835 32.548353,-86.62984 32.548495,-86.629851 32.548638,-86.629867 32.548779,-86.629914 32.549065,-86.630048 32.549711,-86.630066 32.54986,-86.630145 32.550366,-86.630193 32.550727,-86.630255 32.551085,-86.630317 32.551368,-86.630356 32.551508,-86.630402 32.551646,-86.630506 32.551919,-86.630706 32.552396,-86.631015 32.553077,-86.631193 32.55349,-86.631244 32.553635,-86.631336 32.553918,-86.631418 32.554204,-86.631488 32.554492,-86.63155 32.554782,-86.631636 32.555287,-86.631842 32.556364,-86.63206 32.557436,-86.632204 32.558077,-86.632266 32.558281,-86.632323 32.558404,-86.632402 32.558522,-86.632498 32.558635,-86.632549 32.558687,-86.632897 32.559005,-86.633922 32.559885,-86.634169 32.560085,-86.634554 32.560367,-86.634824 32.560541,-86.634962 32.560623,-86.635105 32.5607,-86.635251 32.560772,-86.63555 32.560909,-86.636472 32.561295,-86.636926 32.561497,-86.637234 32.561613,-86.637387 32.561661,-86.637546 32.5617,-86.637709 32.561731,-86.638212 32.561804,-86.638379 32.561821,-86.638548 32.561832,-86.638895 32.561845,-86.639282 32.561875)\r\n600;698;even;Pebble Creek Ct;Autauga;AL;36066;LINESTRING(-86.424275 32.462229,-86.424296 32.462113,-86.424327 32.461955)\r\n601;699;odd;Pebble Creek Ct;Autauga;AL;36066;LINESTRING(-86.424083 32.462205,-86.424102 32.462087,-86.424135 32.461928)\r\n598;500;even;Avery St;Autauga;AL;36022;LINESTRING(-86.429093 32.585709,-86.429039 32.585705,-86.428888 32.585699,-86.428729 32.585695,-86.428678 32.585683,-86.428575 32.585643,-86.428546 32.585622,-86.428522 32.585593,-86.428506 32.585556,-86.428494 32.585512,-86.428494 32.585454,-86.428498 32.585389,-86.428519 32.585244,-86.428527 32.585097,-86.42853 32.585023,-86.428533 32.584951,-86.428538 32.584876,-86.428541 32.584801,-86.428541 32.584778)\r\n501;509;odd;Avery St;Autauga;AL;36022;LINESTRING(-86.429081 32.585873,-86.429029 32.585871,-86.428884 32.585867,-86.428713 32.585869,-86.428614 32.585863,-86.428453 32.585799,-86.42838 32.585742,-86.42833 32.585675,-86.428296 32.5856,-86.42829 32.585522,-86.428292 32.585446,-86.428302 32.585373,-86.428319 32.58523,-86.428331 32.585089,-86.428334 32.585017,-86.428339 32.584943,-86.428342 32.58487,-86.428345 32.584795,-86.428346 32.584773)\r\n684;698;all;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.89093 32.560014,-86.890891 32.560246,-86.890821 32.560827,-86.89078 32.561261,-86.890759 32.561843,-86.890747 32.562715,-86.890747 32.562835)\r\n599;509;odd;Bedford Ter;Autauga;AL;36066;LINESTRING(-86.437901 32.476832,-86.437973 32.476823,-86.438235 32.476743,-86.438785 32.476542,-86.438954 32.476495,-86.438997 32.47646)\r\n598;508;even;Bedford Ter;Autauga;AL;36066;LINESTRING(-86.437858 32.476671,-86.437917 32.476655,-86.438161 32.476585,-86.438711 32.476386,-86.438854 32.476333,-86.438888 32.476324)\r\n2100;2198;even;Addison Way;Autauga;AL;36066;LINESTRING(-86.42112 32.493631,-86.420191 32.493618,-86.419764 32.493618,-86.419547 32.493614,-86.419392 32.493617,-86.419297 32.493615,-86.419183 32.493661,-86.419052 32.493709,-86.418933 32.493795,-86.418859 32.493887,-86.418774 32.493957,-86.418722 32.494165,-86.4187 32.494452)\r\n2101;2199;odd;Addison Way;Autauga;AL;36066;LINESTRING(-86.421117 32.493795,-86.420189 32.493784,-86.419762 32.493784,-86.419547 32.49378,-86.419402 32.493785,-86.419347 32.493797,-86.419265 32.493817,-86.41917 32.493863,-86.419087 32.493921,-86.419013 32.493989,-86.418982 32.494043,-86.418928 32.494195,-86.418893 32.494466)\r\n199;101;odd;Marshall Dr;Autauga;AL;36067;LINESTRING(-86.488774 32.439886,-86.488044 32.439914,-86.485538 32.439973,-86.484662 32.440001,-86.484516 32.440005)\r\n584;500;even;Marshall Dr;Autauga;AL;36067;LINESTRING(-86.488783 32.440051,-86.488052 32.44008,-86.485544 32.440139,-86.484668 32.440167,-86.484521 32.440169)\r\n400;498;even;Parkwood Dr;Autauga;AL;36067;LINESTRING(-86.461959 32.456676,-86.462036 32.456667,-86.462453 32.456551,-86.462614 32.456471,-86.462837 32.45634,-86.462975 32.456234,-86.463096 32.456111,-86.463193 32.455974,-86.463268 32.455829,-86.463316 32.455675,-86.463354 32.455452,-86.463398 32.455066)\r\n401;499;odd;Parkwood Dr;Autauga;AL;36067;LINESTRING(-86.461918 32.456515,-86.461982 32.456499,-86.462367 32.456387,-86.462506 32.456325,-86.462707 32.456204,-86.462825 32.456112,-86.462926 32.456009,-86.463009 32.455894,-86.463072 32.455771,-86.463116 32.455639,-86.463156 32.45543,-86.463204 32.455049)\r\n1367;1437;all;Autauga County 73;Autauga;AL;36006;LINESTRING(-86.741052 32.564958,-86.741021 32.565113,-86.740956 32.565403,-86.740903 32.565548,-86.740873 32.565623,-86.740795 32.565763,-86.740702 32.565894,-86.740594 32.566016,-86.740416 32.566184,-86.738994 32.567442,-86.738808 32.567597,-86.738546 32.56779,-86.738475 32.56784,-86.738322 32.567923,-86.738162 32.567995,-86.737916 32.568078,-86.737587 32.568172,-86.737011 32.568315,-86.73636 32.568473,-86.735637 32.56868,-86.735308 32.568764,-86.73489 32.568853,-86.734471 32.568934,-86.734215 32.568974,-86.734039 32.568995,-86.733777 32.569005,-86.733436 32.569017,-86.733277 32.569032,-86.733202 32.569045,-86.732963 32.569104,-86.732732 32.569179,-86.73212 32.569424,-86.731517 32.569691,-86.731292 32.569799,-86.731133 32.569866,-86.73097 32.569921,-86.730882 32.56995,-86.730852 32.569949)\r\n1497;1499;all;Autauga County 43;Autauga;AL;36067;LINESTRING(-86.614866 32.597237,-86.614863 32.597257,-86.614861 32.597271)\r\n4498;4400;all;Seldom Work Rd;Autauga;AL;36749;LINESTRING(-86.905414 32.60936,-86.904474 32.60983)\r\n798;744;all;Mimosa Rd;Autauga;AL;36067;LINESTRING(-86.462466 32.481023,-86.462398 32.481022)\r\n2013;2001;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.60103 32.437242,-86.599417 32.437254,-86.598855 32.437263)\r\n401;235;odd;Autauga County 133;Autauga;AL;36003;LINESTRING(-86.684186 32.396721,-86.684125 32.396793,-86.684022 32.396909,-86.683914 32.397025,-86.683498 32.397496,-86.683286 32.397726,-86.683186 32.397843,-86.68308 32.397956,-86.682743 32.398287,-86.681936 32.399043,-86.681597 32.399381,-86.681272 32.399725,-86.681068 32.39996,-86.680974 32.40009,-86.680809 32.400356,-86.680599 32.400762,-86.679989 32.401973,-86.678958 32.404048,-86.678892 32.404184,-86.678862 32.404257,-86.67882 32.404406,-86.678802 32.404561,-86.67879 32.404862,-86.678797 32.4055,-86.678805 32.407104,-86.678787 32.407144,-86.678723 32.407222,-86.678606 32.407275,-86.678539 32.40729,-86.67837 32.407303,-86.67656 32.407335,-86.675802 32.407338,-86.675624 32.407339,-86.675418 32.407414,-86.675345 32.407522,-86.675307 32.407696,-86.675304 32.407855,-86.675298 32.408451,-86.675298 32.408816,-86.67529 32.409489,-86.675293 32.409865,-86.675306 32.410238,-86.675312 32.411198,-86.675314 32.411713,-86.675357 32.414248,-86.675366 32.414548)\r\n400;234;even;Autauga County 133;Autauga;AL;36003;LINESTRING(-86.684345 32.396816,-86.684283 32.396891,-86.684178 32.397011,-86.68407 32.397127,-86.683654 32.397596,-86.683444 32.397826,-86.683344 32.397945,-86.683232 32.398064,-86.682891 32.398397,-86.682084 32.399153,-86.681749 32.399487,-86.68143 32.399827,-86.681236 32.400056,-86.681148 32.400174,-86.680989 32.40043,-86.680779 32.400828,-86.680169 32.402037,-86.67914 32.40411,-86.67908 32.404242,-86.679058 32.404303,-86.679022 32.404436,-86.679002 32.404573,-86.678988 32.404864,-86.678991 32.405498,-86.679009 32.407112,-86.679009 32.407214,-86.678877 32.407376,-86.678672 32.407449,-86.678565 32.407462,-86.67838 32.407471,-86.676562 32.407501,-86.67581 32.407508,-86.67568 32.407525,-86.675578 32.407568,-86.675553 32.407594,-86.675515 32.407718,-86.675502 32.407859,-86.675494 32.408451,-86.675494 32.408816,-86.675484 32.409489,-86.675489 32.409861,-86.675502 32.410236,-86.675506 32.411198,-86.67551 32.411711,-86.675553 32.414244,-86.675561 32.414544)\r\n527;435;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.48618 32.446459,-86.485468 32.44577,-86.484987 32.445325,-86.48478 32.445129)\r\n526;434;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.486034 32.446567,-86.485322 32.44588,-86.484841 32.445435,-86.484635 32.445239)\r\n1400;1430;even;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.468992 32.500338,-86.468918 32.500437,-86.468747 32.500688,-86.468599 32.500953,-86.468002 32.502077,-86.467493 32.503069,-86.467326 32.503406,-86.467269 32.503549,-86.467226 32.50369,-86.467207 32.503766,-86.467193 32.503847,-86.467193 32.504138,-86.467188 32.504267)\r\n1321;1437;odd;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.469158 32.500424,-86.469088 32.500523,-86.468925 32.500768,-86.468777 32.501023,-86.468182 32.502143,-86.467673 32.503133,-86.467514 32.503466,-86.467461 32.503597,-86.46742 32.503728,-86.467405 32.503794,-86.467397 32.503859,-86.467389 32.504142,-86.467383 32.504273)\r\n200;208;even;Autauga County 21;Autauga;AL;36003;LINESTRING(-86.633787 32.451666,-86.633816 32.452611,-86.633808 32.453413)\r\n201;213;odd;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.633981 32.451661,-86.634012 32.452609,-86.634003 32.453414)\r\n2599;2523;all;Stanton;Autauga;AL;36066;LINESTRING(-86.413176 32.444292,-86.413176 32.444442,-86.414351 32.444439)\r\n3300;3398;even;Dudley Quarters;Autauga;AL;36003;LINESTRING(-86.749538 32.491787,-86.749693 32.491852,-86.749942 32.491936,-86.750268 32.492032,-86.750337 32.492058,-86.750351 32.492059)\r\n3301;3399;odd;Dudley Quarters;Autauga;AL;36003;LINESTRING(-86.749622 32.491638,-86.749773 32.491696,-86.750012 32.491778,-86.750336 32.491876,-86.750421 32.4919,-86.750441 32.491914)\r\n164;216;even;Golson Rd;Autauga;AL;36067;LINESTRING(-86.546743 32.437551,-86.546935 32.437715,-86.547193 32.437899,-86.547592 32.438179,-86.547868 32.438358,-86.54903 32.439029,-86.550273 32.439755,-86.550539 32.439937,-86.550712 32.440082,-86.550762 32.440135,-86.550938 32.440359,-86.550972 32.440415,-86.551057 32.440608,-86.551107 32.440802,-86.551092 32.441359,-86.551046 32.441648,-86.550987 32.442015,-86.550922 32.442374,-86.550852 32.442813,-86.550838 32.442962,-86.550823 32.443254,-86.550828 32.443408,-86.550841 32.44356,-86.550887 32.44402,-86.550901 32.444052)\r\n101;199;odd;Golson Rd;Autauga;AL;36067;LINESTRING(-86.546879 32.437434,-86.547071 32.437589,-86.547319 32.437771,-86.547716 32.438047,-86.547986 32.438222,-86.54914 32.438893,-86.550393 32.439619,-86.550677 32.439807,-86.550852 32.439966,-86.550928 32.440021,-86.551118 32.440273,-86.551158 32.440347,-86.551257 32.440556,-86.551317 32.440784,-86.551298 32.441375,-86.55124 32.441672,-86.551181 32.442039,-86.551116 32.442398,-86.55105 32.442831,-86.551036 32.442972,-86.551019 32.443256,-86.551026 32.4434,-86.551037 32.443546,-86.551091 32.443994,-86.551091 32.444017)\r\n541;531;odd;Overton Dr;Autauga;AL;36066;LINESTRING(-86.424444 32.486308,-86.422816 32.486394)\r\n538;526;even;Overton Dr;Autauga;AL;36066;LINESTRING(-86.424456 32.486472,-86.422828 32.486558)\r\n318;498;even;Autauga County 33;Autauga;AL;36003;LINESTRING(-86.738161 32.477698,-86.738147 32.477987,-86.738093 32.483238,-86.7381 32.483679,-86.73812 32.483974,-86.738177 32.484411,-86.738231 32.484701,-86.738331 32.485131,-86.739403 32.489421,-86.739672 32.490568,-86.739716 32.490853,-86.739729 32.490997,-86.73974 32.49129,-86.739738 32.491352,-86.739731 32.491432,-86.739698 32.491711,-86.739672 32.491851,-86.739606 32.492131,-86.739099 32.493707)\r\n363;499;odd;Autauga County 33;Autauga;AL;36003;LINESTRING(-86.738355 32.477704,-86.738345 32.477991,-86.738289 32.483238,-86.738298 32.483673,-86.738318 32.48396,-86.738375 32.484389,-86.738427 32.484673,-86.738523 32.485099,-86.739595 32.489387,-86.73987 32.49054,-86.739916 32.490837,-86.739927 32.490989,-86.739934 32.49129,-86.739932 32.491356,-86.739933 32.491444,-86.739896 32.491733,-86.739868 32.491881,-86.739802 32.492169,-86.739286 32.493751)\r\n408;498;all;Greg St;Autauga;AL;36067;LINESTRING(-86.488965 32.480819,-86.489072 32.480787)\r\n594;636;even;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.616157 32.498457,-86.616164 32.498792,-86.616294 32.499665,-86.616352 32.500027,-86.616555 32.501478,-86.616649 32.502209,-86.61668 32.502357,-86.616749 32.502648,-86.616791 32.502792,-86.617004 32.503498,-86.61709 32.503851,-86.617252 32.504639,-86.617301 32.504925,-86.617338 32.505181)\r\n615;655;odd;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.616351 32.498452,-86.616366 32.49878,-86.616488 32.499643,-86.616546 32.500007,-86.616749 32.50146,-86.616847 32.502185,-86.616874 32.502327,-86.616943 32.502612,-86.616981 32.502752,-86.617198 32.50346,-86.617284 32.503819,-86.617448 32.504613,-86.617495 32.504903,-86.617531 32.505162)\r\n199;113;odd;Till St;Autauga;AL;36066;LINESTRING(-86.448555 32.469375,-86.44848 32.469343,-86.446599 32.468526,-86.446369 32.468431,-86.446312 32.468407)\r\n198;118;even;Till St;Autauga;AL;36066;LINESTRING(-86.448468 32.469522,-86.448392 32.469491,-86.446511 32.468674,-86.446281 32.468579,-86.446224 32.468553)\r\n228;298;even;Camellia Dr;Autauga;AL;36067;LINESTRING(-86.458316 32.474987,-86.4585 32.475069,-86.459217 32.475375)\r\n229;299;odd;Camellia Dr;Autauga;AL;36067;LINESTRING(-86.458406 32.474841,-86.45859 32.474921,-86.459305 32.475228)\r\n1399;1301;odd;Giants Dr;Autauga;AL;36067;LINESTRING(-86.418427 32.431473,-86.418415 32.431228,-86.418409 32.431018)\r\n1398;1300;even;Giants Dr;Autauga;AL;36067;LINESTRING(-86.418233 32.43148,-86.418219 32.431234,-86.418215 32.431021)\r\n100;198;even;Canterbury Ct;Autauga;AL;36067;LINESTRING(-86.471649 32.496839,-86.471391 32.497014,-86.471331 32.497053,-86.471302 32.497077)\r\n101;199;odd;Canterbury Ct;Autauga;AL;36067;LINESTRING(-86.471773 32.496965,-86.471529 32.497142,-86.471459 32.497215,-86.471374 32.49723)\r\n200;298;even;Doris St;Autauga;AL;36066;LINESTRING(-86.441005 32.468506,-86.440995 32.46847,-86.440956 32.468375,-86.440867 32.468312,-86.44064 32.46819,-86.440252 32.468029,-86.439728 32.467792,-86.439358 32.467613,-86.439047 32.467482,-86.438886 32.467442,-86.438776 32.467433,-86.438672 32.467432,-86.438489 32.467464)\r\n201;299;odd;Doris St;Autauga;AL;36066;LINESTRING(-86.44082 32.468558,-86.440805 32.468532,-86.44077 32.468487,-86.440737 32.468452,-86.440538 32.46834,-86.440162 32.468177,-86.439634 32.467938,-86.439264 32.467763,-86.438971 32.467648,-86.438844 32.467616,-86.438764 32.467607,-86.43869 32.467608,-86.438521 32.467626)\r\n98;2;all;Indian Hills Rd;Autauga;AL;36067;LINESTRING(-86.508692 32.458963,-86.50865 32.458979)\r\n2719;2797;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.666865 32.560232,-86.668667 32.561795,-86.673768 32.566231,-86.674929 32.567238,-86.675572 32.567795,-86.676042 32.568204)\r\n2798;2722;even;Alt Rte Route County Road 59;Autauga;AL;36022;LINESTRING(-86.509177 32.649453,-86.509171 32.649455,-86.509094 32.649526,-86.509004 32.6496,-86.508795 32.64975,-86.508594 32.649875,-86.508454 32.649946,-86.508234 32.650038,-86.507448 32.65032,-86.506583 32.650655,-86.506278 32.650784,-86.505976 32.650923,-86.505824 32.651001,-86.505608 32.65113,-86.503317 32.652642,-86.502647 32.653088,-86.502315 32.653316,-86.502299 32.653335)\r\n2799;2723;odd;Alt Rte Route County Road 59;Autauga;AL;36022;LINESTRING(-86.509331 32.649554,-86.509325 32.649565,-86.509238 32.649644,-86.509138 32.649724,-86.508921 32.649884,-86.508708 32.650017,-86.508552 32.650098,-86.508316 32.650192,-86.507528 32.650472,-86.506669 32.650805,-86.50637 32.650932,-86.506076 32.651069,-86.505934 32.651143,-86.505726 32.651266,-86.503437 32.652772,-86.502771 32.653218,-86.502451 32.653444,-86.502436 32.653452)\r\n2079;2099;all;Keenland Cmn;Autauga;AL;36066;LINESTRING(-86.416141 32.490297,-86.416144 32.490366)\r\n3400;3488;even;Autauga County 9;Autauga;AL;36003;LINESTRING(-86.76398 32.455084,-86.76432 32.455228,-86.764632 32.455356,-86.76495 32.455472,-86.765272 32.455577,-86.765602 32.455672,-86.765934 32.45576,-86.766269 32.455832,-86.766606 32.455897,-86.766948 32.455952,-86.767462 32.456015,-86.767805 32.456041,-86.768151 32.456059,-86.768498 32.456061,-86.769017 32.456056,-86.773919 32.455892,-86.774678 32.455869,-86.775019 32.455868,-86.775359 32.45588,-86.775698 32.455908,-86.776036 32.455949,-86.776369 32.456002,-86.776518 32.45603)\r\n3401;3489;odd;Autauga County 9;Autauga;AL;36003;LINESTRING(-86.764067 32.454937,-86.764406 32.45508,-86.764714 32.455204,-86.765024 32.455316,-86.76534 32.455419,-86.765664 32.455514,-86.765988 32.455598,-86.766315 32.45567,-86.766646 32.455733,-86.76698 32.455786,-86.767486 32.455847,-86.767821 32.455875,-86.768159 32.455891,-86.768498 32.455897,-86.769011 32.45589,-86.773911 32.455728,-86.774674 32.455701,-86.775023 32.4557,-86.775373 32.455712,-86.775722 32.45574,-86.776068 32.455783,-86.776411 32.455838,-86.776562 32.45587)\r\n700;798;even;Davis St;Autauga;AL;36067;LINESTRING(-86.452386 32.459256,-86.451187 32.457993)\r\n701;821;odd;Davis St;Autauga;AL;36067;LINESTRING(-86.452234 32.459359,-86.451035 32.458096)\r\n1099;1001;odd;Newton St;Autauga;AL;36066;LINESTRING(-86.446113 32.463501,-86.446426 32.46337,-86.446805 32.463202,-86.447101 32.463063,-86.447324 32.462979,-86.447429 32.462949)\r\n1038;1000;even;Newton St;Autauga;AL;36066;LINESTRING(-86.446026 32.463353,-86.446336 32.463222,-86.446711 32.463056,-86.447009 32.462911,-86.447252 32.462813,-86.447378 32.46279)\r\n1000;1098;even;Gaddis Ave;Autauga;AL;36066;LINESTRING(-86.447315 32.461255,-86.446179 32.461252,-86.44613 32.461256)\r\n1001;1099;odd;Gaddis Ave;Autauga;AL;36066;LINESTRING(-86.447315 32.461419,-86.446183 32.46142,-86.446138 32.46142)\r\n4698;4600;all;Marshall Dr;Autauga;AL;36067;LINESTRING(-86.490662 32.441221,-86.490489 32.441208,-86.490294 32.441185,-86.489456 32.441091,-86.489284 32.441074)\r\n201;221;all;S Court St;Autauga;AL;36067;LINESTRING(-86.475394 32.461348,-86.475419 32.461102,-86.475438 32.460893)\r\n400;498;even;N Pickett St;Autauga;AL;36003;LINESTRING(-86.657481 32.439371,-86.657798 32.439752,-86.658824 32.440924,-86.659141 32.441272,-86.65936 32.4415,-86.659592 32.441721,-86.659833 32.441932,-86.660083 32.442137,-86.660342 32.442333,-86.66061 32.442521,-86.661016 32.442792,-86.661837 32.443321,-86.662645 32.44387,-86.662843 32.444008)\r\n401;499;odd;N Pickett St;Autauga;AL;36003;LINESTRING(-86.65764 32.439276,-86.657958 32.439654,-86.65898 32.440824,-86.659295 32.441168,-86.659512 32.441392,-86.659738 32.441607,-86.659973 32.441814,-86.660219 32.442015,-86.660472 32.442207,-86.660734 32.442391,-86.661136 32.44266,-86.661959 32.443189,-86.662769 32.443742,-86.662967 32.443881)\r\n3000;3022;even;Autauga County 155;Autauga;AL;36091;LINESTRING(-86.556664 32.692615,-86.556656 32.692628,-86.556694 32.692652,-86.55673 32.6927,-86.556763 32.692755,-86.557196 32.693668,-86.557311 32.693933,-86.557385 32.694137,-86.557484 32.69449,-86.557535 32.694636,-86.55757 32.694711,-86.557612 32.694782,-86.557706 32.694915,-86.557814 32.695039,-86.557932 32.695155,-86.558115 32.695313,-86.558515 32.695683,-86.558642 32.695788,-86.558799 32.695887)\r\n3001;3023;odd;Autauga County 155;Autauga;AL;36051;LINESTRING(-86.556743 32.692465,-86.556798 32.69247,-86.556862 32.69255,-86.556912 32.692618,-86.556947 32.692689,-86.55738 32.693608,-86.557499 32.693879,-86.557581 32.694091,-86.557678 32.694446,-86.557727 32.69458,-86.557756 32.694641,-86.55779 32.6947,-86.557876 32.694821,-86.557972 32.694933,-86.55808 32.695041,-86.558259 32.695199,-86.558659 32.695565,-86.558776 32.695658,-86.558919 32.695758)\r\n122;148;all;Old Autaugaville Rd;Autauga;AL;36067;LINESTRING(-86.500932 32.433478,-86.499338 32.435242)\r\n400;458;even;Dawson St;Autauga;AL;36067;LINESTRING(-86.486012 32.46528,-86.486112 32.46529,-86.486732 32.465354)\r\n401;461;odd;Dawson St;Autauga;AL;36067;LINESTRING(-86.486032 32.465116,-86.486134 32.465124,-86.486756 32.465191)\r\n1100;1128;all;Peoples Rd;Autauga;AL;36749;LINESTRING(-86.863622 32.575985,-86.863626 32.576026,-86.863689 32.576095,-86.8638 32.576208,-86.863901 32.576316)\r\n2500;2598;all;Galson St;Autauga;AL;36003;LINESTRING(-86.651022 32.42823,-86.651514 32.427956,-86.651798 32.427792,-86.652093 32.427631)\r\n100;108;even;Janice St;Autauga;AL;36066;LINESTRING(-86.431195 32.44804,-86.431195 32.447964,-86.431191 32.447885,-86.431146 32.447664,-86.431102 32.44752,-86.431057 32.447381,-86.431043 32.447339)\r\n101;199;odd;Janice St;Autauga;AL;36066;LINESTRING(-86.431001 32.448044,-86.430997 32.447972,-86.430989 32.447905,-86.430948 32.447698,-86.43091 32.447562,-86.430861 32.447421,-86.430853 32.447372)\r\n1289;1281;odd;Tallant Dr;Autauga;AL;36067;LINESTRING(-86.520646 32.484968,-86.520862 32.483969,-86.520879 32.483893,-86.520881 32.483808,-86.520869 32.483708,-86.520751 32.483557,-86.52065 32.483503,-86.520321 32.483394,-86.52025 32.483364,-86.520186 32.483328,-86.520062 32.483244,-86.520007 32.483198,-86.519961 32.483147,-86.519531 32.482537,-86.519486 32.48243,-86.519493 32.482372)\r\n1298;1272;even;Tallant Dr;Autauga;AL;36067;LINESTRING(-86.520454 32.484939,-86.520666 32.483943,-86.520673 32.483879,-86.520673 32.483822,-86.520655 32.48378,-86.520587 32.483691,-86.520548 32.483663,-86.520235 32.48355,-86.520152 32.483512,-86.520068 32.483472,-86.519922 32.483374,-86.519855 32.483312,-86.519791 32.483249,-86.519331 32.482611,-86.519282 32.482442,-86.5193 32.48235)\r\n1398;1300;all;Soledad Ranch Rd;Autauga;AL;36749;LINESTRING(-86.833039 32.609342,-86.833036 32.609361,-86.833139 32.609603,-86.833271 32.6099,-86.833383 32.61006,-86.833612 32.610163,-86.834051 32.610076,-86.834472 32.61004,-86.834744 32.61021,-86.834951 32.610413,-86.835046 32.610534)\r\n1199;1187;all;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.478904 32.489822,-86.478948 32.489473)\r\n732;752;all;Washington Ferry Rd;Autauga;AL;36067;LINESTRING(-86.464808 32.441876,-86.464812 32.441766)\r\n100;198;even;Ivey Ct;Autauga;AL;36066;LINESTRING(-86.433312 32.447336,-86.43338 32.447332,-86.433544 32.447323,-86.433801 32.447324,-86.434339 32.447331,-86.434424 32.44728)\r\n101;199;odd;Ivey Ct;Autauga;AL;36066;LINESTRING(-86.433283 32.447173,-86.43336 32.447158,-86.433542 32.447157,-86.433801 32.447158,-86.434285 32.447139,-86.434338 32.447132)\r\n1199;1101;all;Autauga County 20;Autauga;AL;36051;LINESTRING(-86.600466 32.648081,-86.600245 32.648082,-86.599506 32.648101,-86.598387 32.64814,-86.597535 32.648163,-86.596671 32.648175,-86.596457 32.64817)\r\n199;101;odd;Walker St;Autauga;AL;36066;LINESTRING(-86.448088 32.470177,-86.447997 32.47014,-86.447617 32.469975,-86.447307 32.469847,-86.447138 32.469793,-86.446963 32.469758,-86.446707 32.469725,-86.446189 32.469663)\r\n198;100;even;Walker St;Autauga;AL;36066;LINESTRING(-86.448008 32.470327,-86.447911 32.470292,-86.447529 32.470125,-86.447227 32.470005,-86.447078 32.469959,-86.446923 32.469926,-86.446677 32.469889,-86.446162 32.469826)\r\n100;198;even;Beth Manor Ct;Autauga;AL;36066;LINESTRING(-86.428125 32.448357,-86.428127 32.448423,-86.428123 32.448562,-86.428114 32.448626,-86.428097 32.448682,-86.428093 32.448707)\r\n101;199;odd;Beth Manor Ct;Autauga;AL;36066;LINESTRING(-86.428319 32.448349,-86.428325 32.448421,-86.428323 32.44857,-86.428318 32.448652,-86.428299 32.448736,-86.428273 32.448771)\r\n599;543;odd;Overton Dr;Autauga;AL;36066;LINESTRING(-86.425411 32.486364,-86.425321 32.486325,-86.425228 32.486309,-86.425126 32.486282,-86.42499 32.486277,-86.424735 32.486292)\r\n598;540;even;Overton Dr;Autauga;AL;36066;LINESTRING(-86.425335 32.486515,-86.425253 32.486491,-86.425178 32.486469,-86.425092 32.486456,-86.424988 32.486443,-86.424748 32.486456)\r\n2446;2498;even;Autauga County 65;Autauga;AL;36091;LINESTRING(-86.557972 32.65063,-86.557946 32.650899,-86.55789 32.651176,-86.557592 32.652299,-86.55753 32.652659,-86.557471 32.652942,-86.557353 32.653585,-86.557326 32.653806,-86.5573 32.65417,-86.557294 32.654463,-86.557306 32.655625,-86.557281 32.657062,-86.55728 32.657186,-86.557273 32.657784,-86.557275 32.65793,-86.557269 32.658515,-86.557261 32.658942)\r\n2453;2499;odd;Autauga County 65;Autauga;AL;36091;LINESTRING(-86.558167 32.650641,-86.55815 32.650919,-86.558086 32.65121,-86.55779 32.652331,-86.557724 32.652685,-86.557665 32.652968,-86.557551 32.653607,-86.557524 32.65382,-86.557498 32.654176,-86.55749 32.654463,-86.557502 32.655625,-86.557477 32.657064,-86.557476 32.657188,-86.557469 32.657784,-86.557471 32.65793,-86.557465 32.658517,-86.557456 32.658945)\r\n1620;1698;even;Pink Lilly Rd;Autauga;AL;36067;LINESTRING(-86.478674 32.544175,-86.478677 32.544504,-86.478696 32.545011,-86.478724 32.545443,-86.478728 32.545587,-86.47874 32.545732,-86.478799 32.546157,-86.478804 32.546178)\r\n1615;1699;odd;Pink Lilly Rd;Autauga;AL;36067;LINESTRING(-86.478869 32.544174,-86.478873 32.5445,-86.478892 32.545003,-86.47892 32.545435,-86.478926 32.545579,-86.478938 32.545716,-86.478995 32.546135,-86.478997 32.546152)\r\n1446;1474;even;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.601867 32.593652,-86.603016 32.594873,-86.603212 32.595103,-86.603392 32.595341,-86.60356 32.595589,-86.603713 32.595842,-86.603782 32.59597,-86.60391 32.596234,-86.604018 32.596502,-86.60411 32.596777,-86.604182 32.597053,-86.604212 32.597193,-86.604258 32.597476,-86.604286 32.597759,-86.604295 32.598046,-86.604292 32.598841,-86.604305 32.600285,-86.604299 32.600825)\r\n1437;1467;odd;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.602019 32.593549,-86.603176 32.594771,-86.603376 32.595009,-86.603564 32.595253,-86.603736 32.595509,-86.603893 32.59577,-86.603964 32.595904,-86.604098 32.596174,-86.604208 32.596452,-86.604306 32.596735,-86.604376 32.597021,-86.604408 32.597167,-86.604456 32.597458,-86.604486 32.597751,-86.604491 32.598044,-86.604488 32.598841,-86.604501 32.600285,-86.604494 32.600826)\r\n1555;1573;all;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.652188 32.596745,-86.652294 32.596833,-86.652412 32.597062,-86.652525 32.597232,-86.652658 32.597405,-86.652759 32.597513,-86.652872 32.597614,-86.653057 32.597755,-86.653187 32.597837,-86.653398 32.597954,-86.65391 32.598214,-86.654173 32.598341)\r\n503;501;all;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.471871 32.469083,-86.471879 32.468981)\r\n700;798;even;William Wood Dr;Autauga;AL;36067;LINESTRING(-86.45634 32.447622,-86.456338 32.447363)\r\n701;799;odd;William Wood Dr;Autauga;AL;36067;LINESTRING(-86.456145 32.447623,-86.456143 32.447364)\r\n1703;1799;all;Childers Ln;Autauga;AL;36008;LINESTRING(-86.572064 32.500984,-86.572143 32.501023,-86.572575 32.501251,-86.572649 32.501288)\r\n144;198;all;Wildwood Dr;Autauga;AL;36067;LINESTRING(-86.455489 32.463537,-86.45549 32.46341,-86.455438 32.46287)\r\n100;198;even;Lee Cir;Autauga;AL;36067;LINESTRING(-86.464624 32.439719,-86.464532 32.439713,-86.464356 32.439711,-86.464192 32.439699,-86.463683 32.439622,-86.463335 32.43961,-86.463102 32.439597,-86.463076 32.439583,-86.463063 32.439566,-86.463049 32.439519,-86.463064 32.439373,-86.463071 32.439149,-86.46308 32.438947,-86.463096 32.438929,-86.463119 32.438914,-86.463177 32.438898,-86.463435 32.438903,-86.463702 32.438909,-86.464214 32.438848,-86.464458 32.438843,-86.464624 32.438853)\r\n101;199;odd;Lee Cir;Autauga;AL;36067;LINESTRING(-86.464614 32.439883,-86.464526 32.439881,-86.464348 32.439881,-86.464166 32.439871,-86.463659 32.439796,-86.463327 32.439778,-86.46306 32.439783,-86.462912 32.439743,-86.462833 32.439616,-86.462847 32.439511,-86.462864 32.439363,-86.462873 32.439147,-86.462864 32.438923,-86.462894 32.438799,-86.463049 32.438726,-86.463171 32.43873,-86.463439 32.438737,-86.463688 32.438735,-86.464198 32.438674,-86.464466 32.438673,-86.464641 32.438689)\r\n1720;1740;even;Autauga County 81;Autauga;AL;36067;LINESTRING(-86.563873 32.528871,-86.56376 32.528931,-86.563535 32.529042,-86.56339 32.529133,-86.563249 32.529226,-86.56299 32.529426,-86.562866 32.529538,-86.562753 32.529656,-86.562346 32.530128,-86.56214 32.530357,-86.561815 32.530692,-86.561591 32.530906,-86.561473 32.531009,-86.561225 32.531204,-86.559756 32.532277)\r\n1701;1735;odd;Autauga County 81;Autauga;AL;36067;LINESTRING(-86.563979 32.529008,-86.563866 32.529073,-86.563647 32.529186,-86.56351 32.529267,-86.563379 32.529356,-86.563132 32.529548,-86.563018 32.52965,-86.562911 32.52976,-86.562504 32.530226,-86.562296 32.530461,-86.561965 32.5308,-86.561737 32.53102,-86.561613 32.531129,-86.561357 32.531328,-86.559883 32.532402)\r\n1400;1450;all;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.686471 32.553576,-86.686404 32.553634,-86.686243 32.553808,-86.686141 32.55393,-86.686053 32.554061,-86.685979 32.554198,-86.685887 32.554407,-86.685814 32.554621,-86.685755 32.554837,-86.685712 32.555057,-86.685692 32.555205,-86.685678 32.555645,-86.685655 32.556879,-86.68558 32.557747,-86.685573 32.557966,-86.685576 32.558187,-86.685601 32.558484,-86.685637 32.558703,-86.685698 32.558991,-86.685719 32.559059)\r\n2701;2715;all;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.489164 32.656229,-86.48922 32.657049,-86.489254 32.657405)\r\n299;201;odd;Challenge Ave;Autauga;AL;36067;LINESTRING(-86.474817 32.431161,-86.474817 32.431261,-86.474819 32.431433,-86.474829 32.431582,-86.474844 32.43232,-86.474859 32.434165)\r\n200;298;even;Challenge Ave;Autauga;AL;36067;LINESTRING(-86.475011 32.43116,-86.475013 32.431259,-86.475017 32.431427,-86.475027 32.431576,-86.47504 32.432318,-86.475053 32.434164)\r\n498;400;even;Shady Hill Rd;Autauga;AL;36067;LINESTRING(-86.461322 32.443356,-86.461012 32.443493,-86.460832 32.443552,-86.46061 32.443504,-86.460279 32.443564,-86.460126 32.443725,-86.459795 32.444,-86.459335 32.444526,-86.459242 32.444585,-86.459129 32.444635,-86.458989 32.444684,-86.458883 32.444654,-86.458539 32.44457,-86.458172 32.444545,-86.457966 32.444499,-86.457721 32.44442,-86.457376 32.44447,-86.457042 32.444522,-86.456711 32.44473,-86.456546 32.444891,-86.456442 32.445034,-86.45627 32.445177,-86.456077 32.445279,-86.455885 32.445338)\r\n301;399;odd;Shady Hill Rd;Autauga;AL;36067;LINESTRING(-86.461417 32.4435,-86.461096 32.443659,-86.460836 32.443714,-86.460612 32.443664,-86.460405 32.443736,-86.46027 32.443841,-86.459955 32.444114,-86.459489 32.444672,-86.459344 32.444729,-86.459219 32.444805,-86.458989 32.444844,-86.458833 32.444814,-86.458503 32.444746,-86.458134 32.444721,-86.457902 32.444663,-86.457701 32.444594,-86.457414 32.444636,-86.457136 32.4447,-86.456855 32.444864,-86.456716 32.444997,-86.456612 32.445148,-86.456402 32.445317,-86.456169 32.445449,-86.455941 32.445496)\r\n793;799;all;Stapleford Trce;Autauga;AL;36066;LINESTRING(-86.414488 32.472321,-86.41435 32.472267,-86.414128 32.472165,-86.413903 32.472057)\r\n1798;1700;even;Lakeview Dr;Autauga;AL;36067;LINESTRING(-86.512466 32.545095,-86.512675 32.545764,-86.512703 32.547002,-86.512571 32.547479,-86.512454 32.548645)\r\n1753;1799;odd;Lakeview Dr;Autauga;AL;36067;LINESTRING(-86.512654 32.545051,-86.512891 32.545738,-86.512915 32.547022,-86.512777 32.547507,-86.512648 32.548659)\r\n2500;2568;even;State Rte 143;Autauga;AL;36022;LINESTRING(-86.421903 32.64907,-86.421995 32.64929,-86.42217 32.649626,-86.422283 32.649826,-86.422411 32.650019,-86.422502 32.650146,-86.422658 32.650324,-86.422881 32.65055,-86.423188 32.65081,-86.423451 32.651002,-86.423726 32.651182,-86.424013 32.65135,-86.424546 32.651593,-86.424943 32.651736,-86.42739 32.652577,-86.427725 32.652695)\r\n2535;2599;odd;State Rte 143;Autauga;AL;36022;LINESTRING(-86.422086 32.649014,-86.422181 32.649228,-86.42235 32.649556,-86.422461 32.649748,-86.422583 32.649933,-86.42267 32.65005,-86.422816 32.65022,-86.423031 32.650434,-86.423326 32.650686,-86.423579 32.650872,-86.423844 32.651046,-86.424119 32.651202,-86.424634 32.651439,-86.425019 32.651582,-86.427464 32.652425,-86.427799 32.652543)\r\n1261;1281;all;Mill Village Ln;Autauga;AL;36066;LINESTRING(-86.447761 32.49653,-86.447763 32.496682)\r\n1761;1725;odd;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.676164 32.524135,-86.675919 32.524147,-86.674379 32.524216,-86.672926 32.524272,-86.672673 32.524277,-86.672459 32.524278,-86.672334 32.524277,-86.671136 32.524263,-86.670285 32.524244,-86.668238 32.52421)\r\n1798;1720;even;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.676176 32.524299,-86.675931 32.524313,-86.674389 32.52438,-86.672932 32.524438,-86.672675 32.524443,-86.672459 32.524442,-86.672332 32.524443,-86.671132 32.524429,-86.670281 32.52441,-86.668234 32.524375)\r\n1688;1698;even;Autauga County 87;Autauga;AL;36022;LINESTRING(-86.433232 32.547923,-86.433194 32.548275,-86.433153 32.548708,-86.433119 32.548917,-86.433082 32.54905,-86.433058 32.549114,-86.433027 32.549171,-86.43299 32.549229,-86.432951 32.54929,-86.432907 32.549347,-86.432869 32.549402,-86.4328 32.549488)\r\n1673;1695;odd;Autauga County 87;Autauga;AL;36022;LINESTRING(-86.433426 32.547937,-86.43339 32.548289,-86.433351 32.548726,-86.433319 32.548947,-86.433278 32.549096,-86.433248 32.549172,-86.433215 32.549249,-86.433168 32.549311,-86.433131 32.54938,-86.433079 32.549439,-86.433041 32.549496,-86.432957 32.549585)\r\n200;298;all;Janice St;Autauga;AL;36066;LINESTRING(-86.430969 32.446223,-86.430954 32.44589,-86.430962 32.44582,-86.430964 32.44557)\r\n1352;1398;even;Hare Cir;Autauga;AL;36067;LINESTRING(-86.425468 32.433303,-86.425459 32.433258,-86.425371 32.433201,-86.425294 32.433142,-86.425168 32.433106,-86.425021 32.433117,-86.424927 32.433184,-86.424171 32.433826)\r\n1353;1399;odd;Hare Cir;Autauga;AL;36067;LINESTRING(-86.425292 32.433373,-86.425275 32.433372,-86.425239 32.433331,-86.425184 32.433302,-86.425146 32.43328,-86.425113 32.433297,-86.425063 32.433318,-86.424308 32.433943)\r\n521;509;odd;Jasmine Trl;Autauga;AL;36066;LINESTRING(-86.427377 32.469799,-86.42738 32.469673,-86.427379 32.468871,-86.427369 32.468642,-86.427322 32.468485,-86.427244 32.468337,-86.427077 32.468154,-86.426961 32.468042,-86.426561 32.467663,-86.426501 32.467617)\r\n524;506;even;Jasmine Trl;Autauga;AL;36066;LINESTRING(-86.427182 32.469796,-86.427184 32.469671,-86.427179 32.468877,-86.427159 32.46867,-86.427122 32.468543,-86.42706 32.468429,-86.426919 32.46826,-86.426813 32.468152,-86.426417 32.467781,-86.426366 32.467735)\r\n2108;2156;all;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.600931 32.518283,-86.601072 32.518337)\r\n600;698;all;E Main St;Autauga;AL;36067;LINESTRING(-86.45871 32.459678,-86.457215 32.459867,-86.456853 32.459903)\r\n1656;1680;all;Autauga County 85;Autauga;AL;36067;LINESTRING(-86.484338 32.525705,-86.484232 32.525884,-86.48416 32.52602,-86.484098 32.526158,-86.484041 32.526297,-86.483946 32.526576,-86.483713 32.527348,-86.483621 32.527619,-86.483506 32.527883,-86.483321 32.528203,-86.483243 32.528315)\r\n2658;2798;even;State Rte 143;Autauga;AL;36022;LINESTRING(-86.436592 32.661357,-86.437319 32.662266,-86.437755 32.6628,-86.437944 32.663042,-86.438675 32.663935,-86.438825 32.664111,-86.439134 32.664459,-86.439459 32.664801,-86.439752 32.665066,-86.439997 32.665273,-86.440675 32.665824,-86.441585 32.666586,-86.442156 32.667057,-86.442322 32.66719,-86.44336 32.668053,-86.444461 32.668962,-86.445599 32.669935,-86.445951 32.670248,-86.446639 32.670886,-86.447852 32.672013,-86.448146 32.672279,-86.450556 32.674518,-86.450935 32.674883)\r\n2601;2799;odd;State Rte 143;Autauga;AL;36022;LINESTRING(-86.436754 32.661265,-86.437481 32.662172,-86.437919 32.662708,-86.438108 32.662948,-86.438835 32.663839,-86.438983 32.664013,-86.43929 32.664357,-86.439611 32.664689,-86.439896 32.66495,-86.440135 32.665155,-86.440813 32.665706,-86.441723 32.666468,-86.442292 32.666937,-86.442458 32.66707,-86.443496 32.667935,-86.444599 32.668844,-86.445741 32.669819,-86.446095 32.670136,-86.446783 32.670776,-86.447996 32.671901,-86.44829 32.672167,-86.450704 32.674408,-86.451082 32.674775)\r\n742;770;even;Cranbrook Dr;Autauga;AL;36067;LINESTRING(-86.458871 32.447129,-86.458695 32.446917)\r\n739;799;odd;Cranbrook Dr;Autauga;AL;36067;LINESTRING(-86.458712 32.447223,-86.458536 32.447011)\r\n1300;1398;even;Autauga County 137;Autauga;AL;36067;LINESTRING(-86.694628 32.541523,-86.69476 32.541714,-86.694867 32.541837,-86.694993 32.54195,-86.695133 32.542048,-86.695348 32.542175,-86.695927 32.542487,-86.696133 32.542609,-86.696466 32.542829,-86.697123 32.543298,-86.697264 32.543388,-86.697416 32.543472,-86.697501 32.543505,-86.697812 32.543623,-86.697951 32.543691,-86.698152 32.543812,-86.698414 32.54399,-86.698533 32.544085,-86.698587 32.544133,-86.698747 32.5443,-86.698915 32.544468,-86.699093 32.544632,-86.699408 32.544878,-86.699516 32.544978,-86.699611 32.545085,-86.699647 32.545138,-86.699676 32.545194,-86.699699 32.545255,-86.699715 32.545319,-86.699736 32.545455,-86.699755 32.545744,-86.699791 32.546104,-86.699803 32.546314,-86.699801 32.546599,-86.699779 32.546884,-86.699759 32.547025,-86.699658 32.547523,-86.699628 32.547743,-86.699621 32.547895,-86.699621 32.548051,-86.699651 32.548208,-86.699713 32.548354,-86.699923 32.548761,-86.700009 32.548896,-86.700063 32.548962,-86.700124 32.549023,-86.700189 32.549079,-86.70038 32.549229,-86.70071 32.549467,-86.700982 32.549648,-86.701173 32.549786,-86.701602 32.550137,-86.702191 32.550658,-86.702295 32.550764,-86.702338 32.550816,-86.70246 32.550999,-86.702602 32.551261,-86.702686 32.551393,-86.702784 32.551521,-86.703139 32.551927,-86.703222 32.552043,-86.703248 32.552097,-86.703276 32.55216)\r\n1301;1399;odd;Autauga County 137;Autauga;AL;36067;LINESTRING(-86.694794 32.541438,-86.694928 32.541618,-86.695025 32.541725,-86.695135 32.541824,-86.695257 32.541912,-86.69546 32.542035,-86.696037 32.542347,-86.696251 32.542473,-86.696592 32.542699,-86.697247 32.543166,-86.697378 32.543248,-86.697518 32.543322,-86.697585 32.543353,-86.697904 32.543469,-86.698063 32.543545,-86.698274 32.543678,-86.698544 32.543862,-86.698679 32.543963,-86.698739 32.544023,-86.698899 32.544194,-86.699063 32.544356,-86.699235 32.544512,-86.69955 32.544758,-86.699672 32.544866,-86.699783 32.544989,-86.699831 32.54506,-86.699868 32.545134,-86.699895 32.545213,-86.699915 32.545291,-86.699936 32.545441,-86.699953 32.545732,-86.699987 32.546092,-86.700003 32.54631,-86.700001 32.546605,-86.699979 32.5469,-86.699955 32.547049,-86.699856 32.547547,-86.699828 32.547757,-86.699817 32.547897,-86.699827 32.548033,-86.699855 32.548164,-86.699903 32.548292,-86.700105 32.548685,-86.700183 32.548806,-86.700225 32.548858,-86.700274 32.548909,-86.700329 32.548959,-86.700512 32.549103,-86.700836 32.549337,-86.701106 32.549518,-86.701309 32.54966,-86.701742 32.550019,-86.702339 32.550544,-86.702457 32.550658,-86.702512 32.550724,-86.70264 32.550921,-86.702782 32.551185,-86.70286 32.551307,-86.70295 32.551425,-86.703309 32.551831,-86.7034 32.551961,-86.703448 32.552035,-86.703465 32.552119)\r\n706;798;even;Yellowstone Dr;Autauga;AL;36067;LINESTRING(-86.546891 32.580621,-86.546896 32.581246,-86.546907 32.581704)\r\n705;799;odd;Yellowstone Dr;Autauga;AL;36067;LINESTRING(-86.547086 32.58062,-86.547092 32.581244,-86.547102 32.581701)\r\n452;450;all;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.675022 32.392916,-86.674993 32.392986)\r\n100;104;even;Kingston Pl;Autauga;AL;36067;LINESTRING(-86.481393 32.47677,-86.481868 32.476769,-86.482034 32.476782,-86.482182 32.476811,-86.482396 32.476889,-86.482421 32.476893)\r\n101;107;odd;Kingston Pl;Autauga;AL;36067;LINESTRING(-86.481391 32.476606,-86.481874 32.476599,-86.482064 32.476608,-86.482246 32.476641,-86.482506 32.476729,-86.48254 32.476763)\r\n807;801;odd;Newton St;Autauga;AL;36067;LINESTRING(-86.454173 32.462733,-86.45424 32.462772)\r\n738;700;even;Newton St;Autauga;AL;36067;LINESTRING(-86.454284 32.462598,-86.454351 32.462637)\r\n398;100;all;Go Kart Rd;Autauga;AL;36051;LINESTRING(-86.508005 32.701538,-86.507772 32.70153,-86.507439 32.701508,-86.507372 32.701503,-86.507283 32.701486,-86.507129 32.701449,-86.506981 32.701399,-86.506836 32.701337,-86.506702 32.701264,-86.506581 32.701181,-86.506528 32.701136,-86.50648 32.701087,-86.506441 32.701033,-86.50637 32.700915,-86.506343 32.700857,-86.5063 32.700715,-86.506221 32.700561)\r\n126;134;even;Bryan St;Autauga;AL;36066;LINESTRING(-86.436994 32.466257,-86.436996 32.466226,-86.43698 32.465862,-86.43697 32.465028)\r\n127;133;odd;Bryan St;Autauga;AL;36066;LINESTRING(-86.4368 32.466257,-86.436798 32.46623,-86.436782 32.465866,-86.436775 32.465029)\r\n1298;1228;even;Jamestown Dr;Autauga;AL;36067;LINESTRING(-86.47339 32.496643,-86.472887 32.496183,-86.472841 32.496143)\r\n1299;1241;odd;Jamestown Dr;Autauga;AL;36067;LINESTRING(-86.473247 32.496754,-86.472745 32.496297,-86.472701 32.496257)\r\n699;581;odd;Anderson St;Autauga;AL;36067;LINESTRING(-86.496644 32.438156,-86.496324 32.438128,-86.494931 32.438118,-86.493586 32.4381,-86.492462 32.438068,-86.492156 32.438061,-86.491919 32.438033,-86.491626 32.438019,-86.491345 32.437999,-86.491123 32.437985,-86.490948 32.438007,-86.490887 32.438055)\r\n698;600;even;Anderson St;Autauga;AL;36067;LINESTRING(-86.496626 32.43832,-86.496314 32.438298,-86.494929 32.438282,-86.493582 32.438266,-86.492458 32.438234,-86.49214 32.438235,-86.491897 32.438203,-86.491612 32.438185,-86.491331 32.438165,-86.491137 32.438159,-86.491034 32.438185,-86.490993 32.438193)\r\n2506;2548;even;Autauga County 129;Autauga;AL;36022;LINESTRING(-86.415956 32.649011,-86.415953 32.64907,-86.415925 32.649503,-86.415908 32.650591,-86.415916 32.6516,-86.415935 32.652106,-86.415935 32.652685,-86.415946 32.65319,-86.415939 32.653913,-86.415954 32.654346,-86.415955 32.655858,-86.415973 32.656149,-86.416047 32.656864,-86.416095 32.65751,-86.416122 32.6578,-86.416215 32.658357)\r\n2553;2599;odd;Autauga County 129;Autauga;AL;36022;LINESTRING(-86.416151 32.649012,-86.416153 32.649076,-86.416123 32.649509,-86.416104 32.650591,-86.416114 32.651596,-86.416133 32.652104,-86.416131 32.652683,-86.416142 32.65319,-86.416137 32.653911,-86.416152 32.654344,-86.416155 32.655854,-86.416171 32.656137,-86.416243 32.656852,-86.416291 32.657498,-86.41632 32.657782,-86.416408 32.658335)\r\n132;100;all;Autauga County 20;Autauga;AL;36051;LINESTRING(-86.484345 32.700925,-86.484501 32.700965,-86.484752 32.701016,-86.484922 32.701061,-86.485086 32.701117,-86.485327 32.701204,-86.485457 32.701265,-86.485483 32.701273,-86.485705 32.701394,-86.48613 32.701638,-86.487339 32.702308,-86.48748 32.702376,-86.487627 32.702437,-86.487858 32.702519,-86.488013 32.702567,-86.488251 32.702627,-86.488411 32.702658,-86.488658 32.702695,-86.488819 32.702711,-86.489021 32.702721,-86.490006 32.70275,-86.490343 32.702762)\r\n1239;1235;all;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.418277 32.505587,-86.418267 32.505503,-86.418203 32.505212,-86.418141 32.504997,-86.418104 32.504907)\r\n853;801;odd;Autauga County 150;Autauga;AL;36051;LINESTRING(-86.581509 32.607221,-86.581369 32.607694,-86.581334 32.607838,-86.581279 32.60813,-86.581263 32.60828,-86.581259 32.608429,-86.581265 32.608721,-86.581302 32.609157,-86.581357 32.609589,-86.581399 32.610017,-86.581473 32.6111,-86.581521 32.612183,-86.581533 32.612909,-86.581527 32.613179)\r\n860;800;even;Autauga County 150;Autauga;AL;36051;LINESTRING(-86.581698 32.607261,-86.581563 32.60773,-86.58153 32.607868,-86.581479 32.60815,-86.581463 32.60829,-86.581455 32.608429,-86.581465 32.608713,-86.5815 32.609143,-86.581553 32.609573,-86.581597 32.610005,-86.581669 32.611092,-86.581719 32.612179,-86.581729 32.612909,-86.581722 32.613182)\r\n901;999;all;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.77017 32.516205,-86.770274 32.516268,-86.771055 32.516734)\r\n146;100;all;N Memorial Dr;Autauga;AL;36067;LINESTRING(-86.450641 32.465612,-86.450618 32.465428,-86.450615 32.465239)\r\n999;801;odd;Lower Kingston Rd;Autauga;AL;36067;LINESTRING(-86.491568 32.474624,-86.490038 32.473258,-86.487935 32.471392,-86.487919 32.471378)\r\n906;770;even;Lower Kingston Rd;Autauga;AL;36067;LINESTRING(-86.491427 32.474737,-86.489896 32.473372,-86.487793 32.471506,-86.487777 32.471491)\r\n390;398;all;Autauga County 15;Autauga;AL;36003;LINESTRING(-86.809657 32.496725,-86.809548 32.497022,-86.809481 32.497256)\r\n704;798;all;Autauga County 33;Autauga;AL;36003;LINESTRING(-86.723779 32.505447,-86.723777 32.505447,-86.723409 32.50575,-86.722714 32.506388,-86.72195 32.507069,-86.721891 32.507116,-86.721767 32.507203,-86.721567 32.50732,-86.721352 32.507422,-86.72113 32.507513,-86.720903 32.507591,-86.720669 32.507651,-86.72051 32.507681,-86.720348 32.507701,-86.720098 32.507717,-86.718819 32.507754,-86.718478 32.507772,-86.718305 32.507785,-86.71825 32.507792,-86.718133 32.507802,-86.717961 32.50783,-86.717705 32.507885,-86.717373 32.507972,-86.717206 32.508027,-86.716969 32.508122,-86.716738 32.508222,-86.715912 32.508603,-86.715216 32.50891)\r\n1000;1098;even;Gipson St;Autauga;AL;36066;LINESTRING(-86.448009 32.464633,-86.447937 32.464651,-86.447611 32.464727,-86.447367 32.464792,-86.446605 32.464974)\r\n1001;1099;odd;Gipson St;Autauga;AL;36066;LINESTRING(-86.448067 32.46479,-86.447993 32.464811,-86.447667 32.464887,-86.447423 32.464952,-86.446658 32.465132)\r\n1943;1963;all;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.674264 32.614002,-86.67423 32.614551,-86.674205 32.615205,-86.674195 32.615932,-86.674196 32.616296,-86.674225 32.617306,-86.674273 32.618532)\r\n1618;1668;all;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.681222 32.576145,-86.681191 32.576271,-86.6808 32.577724,-86.680736 32.578013,-86.680679 32.578307,-86.680641 32.578673,-86.680626 32.578968,-86.680623 32.579259,-86.680627 32.582295,-86.680616 32.582655,-86.680588 32.58294,-86.680531 32.583301,-86.680485 32.583514,-86.680394 32.583866,-86.680306 32.584172)\r\n1300;1312;even;Adell Pl;Autauga;AL;36066;LINESTRING(-86.438938 32.462681,-86.438859 32.462578,-86.43879 32.462462,-86.43875 32.462343,-86.438731 32.462145,-86.438739 32.461999,-86.438725 32.461707,-86.438728 32.461495,-86.438741 32.461293)\r\n1301;1313;odd;Adell Pl;Autauga;AL;36066;LINESTRING(-86.438778 32.462775,-86.438685 32.462668,-86.438592 32.462532,-86.438536 32.462373,-86.438535 32.462143,-86.438545 32.461999,-86.438527 32.461711,-86.438528 32.461489,-86.438547 32.461283)\r\n700;798;even;E 6th St;Autauga;AL;36067;LINESTRING(-86.454501 32.468438,-86.45439 32.468464,-86.45422 32.468506,-86.454053 32.468569,-86.453753 32.468716,-86.452698 32.46926)\r\n701;799;odd;E 6th St;Autauga;AL;36067;LINESTRING(-86.454555 32.468596,-86.454446 32.468624,-86.454292 32.468668,-86.454145 32.468723,-86.453853 32.46886,-86.452799 32.4694)\r\n900;998;all;Muirfield Dr;Autauga;AL;36067;LINESTRING(-86.499974 32.45489,-86.500224 32.454988)\r\n251;399;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.450597 32.46323,-86.450597 32.463192,-86.450606 32.462539)\r\n331;301;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.482221 32.443052,-86.482091 32.44295,-86.481592 32.442589,-86.481285 32.442378)\r\n330;300;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.482091 32.443174,-86.481961 32.443076,-86.481466 32.442717,-86.481162 32.442506)\r\n1701;1723;all;Lakeview Dr;Autauga;AL;36067;LINESTRING(-86.513119 32.540446,-86.513126 32.540544,-86.513127 32.540839,-86.513109 32.541131,-86.513098 32.541277,-86.513016 32.541852,-86.512983 32.542114)\r\n613;617;all;Vintage Way;Autauga;AL;36067;LINESTRING(-86.45029 32.426365,-86.449994 32.426573)\r\n2599;2501;odd;State Rte 14;Autauga;AL;36003;LINESTRING(-86.655403 32.431903,-86.65528 32.431964,-86.655061 32.432083,-86.654336 32.432504)\r\n2598;2500;even;State Rte 14;Autauga;AL;36003;LINESTRING(-86.655502 32.432045,-86.655384 32.432106,-86.655169 32.432223,-86.654445 32.43264)\r\n970;1064;even;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.771185 32.51701,-86.771646 32.517278,-86.772595 32.51777,-86.773636 32.518275,-86.774079 32.518499,-86.774212 32.518579,-86.774327 32.51867,-86.774424 32.518773,-86.774504 32.518887,-86.774604 32.519076,-86.774916 32.519759,-86.775051 32.52003,-86.775205 32.520357,-86.775306 32.520579,-86.775379 32.520712,-86.775467 32.520845,-86.775674 32.521083,-86.775996 32.52142,-86.776093 32.521536,-86.776175 32.521654,-86.776318 32.521909,-86.776594 32.522445,-86.776673 32.522578,-86.776838 32.522837,-86.777021 32.523091,-86.777123 32.523213,-86.777444 32.523552,-86.777566 32.523662,-86.777702 32.523766,-86.777852 32.523858,-86.77801 32.523937,-86.77833 32.524054,-86.778477 32.524119,-86.778622 32.524195,-86.778763 32.524278,-86.778913 32.524361,-86.779068 32.524437,-86.77994 32.524773,-86.780162 32.524877,-86.780302 32.524956,-86.78045 32.525035,-86.780752 32.525174,-86.781206 32.525375,-86.781839 32.525686)\r\n1029;1065;odd;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.771294 32.516874,-86.771754 32.517136,-86.772695 32.517626,-86.773736 32.518131,-86.774187 32.518357,-86.774342 32.518441,-86.774481 32.51855,-86.774596 32.518673,-86.774688 32.518809,-86.774788 32.519012,-86.7751 32.519697,-86.775233 32.519968,-86.775387 32.520297,-86.77549 32.520511,-86.775559 32.520634,-86.775639 32.520751,-86.775832 32.520981,-86.776156 32.521318,-86.776261 32.521442,-86.776357 32.521572,-86.776498 32.521841,-86.776774 32.522373,-86.776849 32.5225,-86.777012 32.522753,-86.777189 32.522997,-86.777283 32.523111,-86.777596 32.52344,-86.777708 32.52354,-86.77783 32.523632,-86.777964 32.523714,-86.778104 32.523783,-86.778416 32.5239,-86.778577 32.523971,-86.778732 32.524053,-86.778875 32.52414,-86.779017 32.524217,-86.77916 32.524285,-86.78003 32.524621,-86.78027 32.524729,-86.780412 32.524816,-86.780552 32.524889,-86.780846 32.525028,-86.781302 32.525227,-86.781937 32.525544)\r\n1200;1298;even;Ridge Trl;Autauga;AL;36066;LINESTRING(-86.443744 32.494995,-86.443744 32.494998,-86.443734 32.495367,-86.44373 32.49796,-86.443737 32.498466,-86.443736 32.499045,-86.443745 32.499767,-86.443749 32.499922)\r\n1001;1099;odd;Ridge Trl;Autauga;AL;36066;LINESTRING(-86.443938 32.494998,-86.443938 32.495002,-86.44393 32.495369,-86.443926 32.49796,-86.443933 32.498466,-86.443932 32.499045,-86.443941 32.499765,-86.443944 32.499919)\r\n1566;1598;all;Autauga County 111;Autauga;AL;36067;LINESTRING(-86.608582 32.606874,-86.608612 32.607615,-86.608653 32.608337,-86.608669 32.608698,-86.60869 32.609058,-86.608751 32.60969)\r\n2570;2598;all;State Rte 143;Autauga;AL;36022;LINESTRING(-86.427993 32.652791,-86.428244 32.652884,-86.42855 32.65301,-86.429298 32.653349,-86.429964 32.653668,-86.430401 32.653884,-86.43061 32.653995,-86.430644 32.654013)\r\n3301;3399;all;Lavon Rd;Autauga;AL;36003;LINESTRING(-86.754211 32.424506,-86.754168 32.424491,-86.754125 32.424396,-86.754092 32.424316,-86.754043 32.424171,-86.753606 32.423137,-86.753575 32.423034)\r\n199;101;odd;Strength St;Autauga;AL;36067;LINESTRING(-86.44652 32.451597,-86.446846 32.451647,-86.447199 32.451683,-86.447464 32.45168,-86.447511 32.451676)\r\n198;100;even;Strength St;Autauga;AL;36067;LINESTRING(-86.446553 32.451435,-86.446874 32.451479,-86.447211 32.451509,-86.44746 32.451512,-86.447501 32.451512)\r\n104;108;all;Live Oak;Autauga;AL;36067;LINESTRING(-86.474043 32.475984,-86.474596 32.475975)\r\n1664;1656;all;Hawthorne St;Autauga;AL;36066;LINESTRING(-86.422119 32.47272,-86.42223 32.472623,-86.422336 32.472519,-86.422478 32.47235,-86.422551 32.472243,-86.422558 32.472238)\r\n1300;1362;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.504052 32.46893,-86.504234 32.468988,-86.504518 32.469082,-86.504642 32.469124,-86.50477 32.469171,-86.506014 32.469565,-86.506299 32.469648)\r\n1301;1361;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.504121 32.468776,-86.504304 32.468834,-86.50459 32.468928,-86.504718 32.46897,-86.504844 32.469015,-86.50608 32.469409,-86.506363 32.469492)\r\n127;119;all;Gray Dr;Autauga;AL;36067;LINESTRING(-86.473247 32.444503,-86.473167 32.444459,-86.472635 32.444225,-86.472454 32.444149)\r\n2000;2098;even;Jessica Bay Ct;Autauga;AL;36022;LINESTRING(-86.461037 32.672515,-86.460976 32.672518,-86.460793 32.672528,-86.46044 32.672551,-86.460265 32.672584,-86.460102 32.672615,-86.459676 32.67266,-86.459585 32.67268,-86.459497 32.672704,-86.459402 32.672733,-86.459312 32.672793,-86.459255 32.672873,-86.459215 32.672957,-86.459205 32.673048,-86.459226 32.673275,-86.459255 32.673489,-86.459273 32.673772,-86.459253 32.674781)\r\n2001;2099;odd;Jessica Bay Ct;Autauga;AL;36022;LINESTRING(-86.461065 32.672677,-86.460996 32.67269,-86.460807 32.672696,-86.46047 32.672723,-86.460309 32.672748,-86.460138 32.672785,-86.459714 32.67283,-86.459641 32.672844,-86.459571 32.672864,-86.459516 32.672891,-86.459478 32.672919,-86.459445 32.672955,-86.459423 32.673005,-86.459407 32.673054,-86.459424 32.673259,-86.459457 32.673475,-86.459471 32.67377,-86.459448 32.674784)\r\n2104;2220;even;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.504728 32.580656,-86.504624 32.581288,-86.504521 32.582009,-86.504236 32.583876,-86.50415 32.584301,-86.504081 32.58458,-86.503993 32.584856,-86.503892 32.585131,-86.502816 32.587707,-86.502572 32.588249,-86.502412 32.588581,-86.502275 32.588843,-86.501841 32.589624,-86.50143 32.590337,-86.501283 32.590599,-86.501054 32.590985,-86.500603 32.591762,-86.500396 32.592162,-86.500285 32.592438,-86.500232 32.592579,-86.500144 32.592863,-86.500068 32.593145,-86.499884 32.593996,-86.499814 32.594277,-86.49973 32.594551,-86.499585 32.594881,-86.499429 32.595124,-86.499235 32.595351,-86.498956 32.595613,-86.498774 32.595753,-86.497505 32.596596,-86.497243 32.596765)\r\n2109;2299;odd;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.504921 32.580678,-86.504818 32.58131,-86.504715 32.582029,-86.504432 32.5839,-86.504346 32.584333,-86.504275 32.58462,-86.504183 32.584902,-86.50408 32.585183,-86.503002 32.587765,-86.502754 32.588309,-86.502594 32.588647,-86.502453 32.588913,-86.502017 32.589696,-86.501606 32.590409,-86.501461 32.590671,-86.50123 32.591059,-86.500783 32.591832,-86.500584 32.592224,-86.500473 32.59249,-86.500424 32.592625,-86.500336 32.592903,-86.500262 32.593179,-86.500078 32.594028,-86.500008 32.594315,-86.499926 32.594601,-86.499775 32.594953,-86.499603 32.595218,-86.499393 32.595459,-86.499102 32.595735,-86.498904 32.595883,-86.497625 32.596728,-86.497361 32.596896)\r\n1901;1999;odd;Old Stagecoach Trl;Autauga;AL;36067;LINESTRING(-86.488832 32.570414,-86.488847 32.570397,-86.488872 32.570345,-86.48896 32.570231,-86.489064 32.570122,-86.489423 32.569809,-86.489537 32.569691,-86.489591 32.569622,-86.489604 32.569586)\r\n1900;1998;even;Old Stagecoach Trl;Autauga;AL;36067;LINESTRING(-86.488641 32.570385,-86.488639 32.570341,-86.488688 32.570257,-86.488798 32.570129,-86.48891 32.570008,-86.489271 32.569695,-86.489371 32.569589,-86.489409 32.569538,-86.489427 32.569518)\r\n136;172;even;Seaside Rd;Autauga;AL;36003;LINESTRING(-86.652842 32.441822,-86.652875 32.441875,-86.652988 32.441993,-86.653101 32.442104,-86.653802 32.442837,-86.654865 32.443982,-86.655 32.444125,-86.655611 32.444781,-86.656297 32.445555)\r\n107;181;odd;Seaside Rd;Autauga;AL;36003;LINESTRING(-86.653008 32.441735,-86.653043 32.441775,-86.653142 32.441887,-86.653253 32.441998,-86.653956 32.442733,-86.655019 32.44388,-86.655152 32.444023,-86.655767 32.444679,-86.656453 32.445457)\r\n894;898;all;Autauga County 32;Autauga;AL;36091;LINESTRING(-86.595288 32.690181,-86.595365 32.690187,-86.595448 32.690163)\r\n1709;1701;odd;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.573231 32.503063,-86.572875 32.503046,-86.571847 32.502976,-86.571424 32.502936,-86.571091 32.502892,-86.571073 32.502891)\r\n1698;1670;even;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.57322 32.503227,-86.572861 32.503212,-86.571829 32.503142,-86.571398 32.503104,-86.571053 32.503058,-86.57103 32.503051)\r\n2621;2699;all;Derby St;Autauga;AL;36006;LINESTRING(-86.720972 32.659475,-86.721004 32.659481,-86.72116 32.659565,-86.721299 32.659647,-86.72219 32.660188)\r\n101;117;odd;Lancelot Cir;Autauga;AL;36067;LINESTRING(-86.47144 32.436422,-86.471712 32.436413,-86.471969 32.436414,-86.472666 32.436407,-86.473094 32.436418)\r\n100;124;even;Lancelot Cir;Autauga;AL;36067;LINESTRING(-86.471431 32.436258,-86.471708 32.436245,-86.471969 32.43625,-86.472668 32.436241,-86.4731 32.436254)\r\n200;252;all;Clubview Dr;Autauga;AL;36067;LINESTRING(-86.471238 32.443011,-86.47118 32.443009,-86.470498 32.443026,-86.470157 32.443031,-86.469958 32.443027,-86.469845 32.443097,-86.469781 32.443188,-86.469735 32.443353,-86.469745 32.443584,-86.46976 32.44388)\r\n433;421;odd;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.823098 32.429347,-86.823164 32.429389,-86.823711 32.429742,-86.827781 32.432549,-86.827964 32.432681)\r\n432;420;even;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.823212 32.429214,-86.823282 32.429255,-86.823833 32.42961,-86.827907 32.432421,-86.828091 32.432556)\r\n1255;1399;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.428304 32.438387,-86.428222 32.438392,-86.426588 32.438483,-86.426414 32.438488,-86.426383 32.438492)\r\n3199;3101;odd;Autauga County 84;Autauga;AL;36006;LINESTRING(-86.708524 32.636551,-86.708488 32.636664,-86.70847 32.636817,-86.708469 32.636967,-86.708484 32.637121,-86.708515 32.637269,-86.708559 32.637415,-86.708704 32.637757,-86.708744 32.637889,-86.708768 32.638024,-86.708779 32.638159,-86.708777 32.639105,-86.708767 32.639398,-86.70875 32.639539,-86.708735 32.639602,-86.708708 32.639658,-86.708674 32.639699,-86.708635 32.639728,-86.708581 32.639751,-86.708516 32.639766,-86.708445 32.639773,-86.708057 32.639782,-86.707381 32.639799,-86.705983 32.639796,-86.705317 32.639812,-86.705063 32.639811,-86.704472 32.639796,-86.703459 32.639809,-86.702766 32.639822,-86.702508 32.63982,-86.702344 32.639806,-86.702275 32.639793,-86.702208 32.639771,-86.702144 32.639742,-86.702082 32.639707,-86.701888 32.639576,-86.701636 32.639384,-86.701528 32.639287,-86.701325 32.639071,-86.701208 32.638958,-86.701139 32.638906,-86.70107 32.638856,-86.700786 32.638685,-86.700343 32.638436,-86.700257 32.638399,-86.700167 32.63837,-86.699673 32.638256,-86.69952 32.638209,-86.699371 32.638151,-86.699145 32.638045,-86.698985 32.637978,-86.698815 32.637922,-86.698722 32.637904,-86.698628 32.637891,-86.698533 32.63789,-86.698438 32.637896,-86.69835 32.637911,-86.698261 32.637932,-86.698176 32.637959,-86.69809 32.63799,-86.698011 32.638033,-86.697937 32.638075,-86.697802 32.638169,-86.697427 32.638469,-86.697299 32.63856,-86.697095 32.638687,-86.696959 32.638762,-86.696678 32.638925,-86.696536 32.639014,-86.696404 32.63912,-86.696163 32.639325,-86.696037 32.639412,-86.695974 32.639446,-86.6959 32.639477,-86.695848 32.639497)\r\n4398;3212;even;Autauga County 84;Autauga;AL;36006;LINESTRING(-86.708714 32.636588,-86.708692 32.636692,-86.708674 32.636827,-86.708671 32.636961,-86.708686 32.637099,-86.708713 32.637233,-86.708753 32.637365,-86.708898 32.637707,-86.708944 32.637855,-86.70897 32.638006,-86.708979 32.638155,-86.708975 32.639107,-86.708967 32.639408,-86.708954 32.639565,-86.708933 32.639648,-86.708904 32.639734,-86.708844 32.639823,-86.708749 32.639888,-86.708645 32.639921,-86.70855 32.639936,-86.708459 32.639945,-86.708061 32.639948,-86.707383 32.639965,-86.705985 32.639962,-86.705319 32.639978,-86.705059 32.639977,-86.70447 32.639962,-86.703463 32.639975,-86.702768 32.639988,-86.7025 32.63999,-86.702312 32.63998,-86.702213 32.639961,-86.702118 32.639929,-86.702034 32.639888,-86.70196 32.639841,-86.70176 32.639704,-86.701492 32.639508,-86.701374 32.639397,-86.701171 32.639179,-86.701062 32.639078,-86.701007 32.639032,-86.700946 32.63899,-86.700674 32.638823,-86.700239 32.638586,-86.700173 32.638557,-86.700103 32.638534,-86.699613 32.638418,-86.699442 32.638369,-86.699279 32.638303,-86.699053 32.638195,-86.698905 32.638136,-86.698753 32.638088,-86.698682 32.638072,-86.698608 32.638063,-86.698539 32.638058,-86.698468 32.638066,-86.698396 32.638077,-86.698325 32.638094,-86.698252 32.638117,-86.698186 32.638144,-86.698119 32.638175,-86.698059 32.638211,-86.697936 32.638297,-86.697561 32.638593,-86.697425 32.638694,-86.697209 32.638827,-86.697069 32.638902,-86.696796 32.639061,-86.696668 32.639146,-86.696544 32.63924,-86.696303 32.639453,-86.696157 32.639556,-86.69607 32.639598,-86.69598 32.639633,-86.69592 32.63965)\r\n2008;2198;all;Summit Pkwy;Autauga;AL;36066;LINESTRING(-86.418151 32.478989,-86.418169 32.47879,-86.418169 32.47864,-86.41815 32.478536)\r\n600;698;even;Partridge Ln;Autauga;AL;36067;LINESTRING(-86.453985 32.455911,-86.453571 32.455907,-86.452192 32.455921,-86.451614 32.455921,-86.451262 32.45601,-86.451148 32.456112)\r\n601;699;odd;Partridge Ln;Autauga;AL;36067;LINESTRING(-86.453983 32.456076,-86.453571 32.456071,-86.452196 32.456087,-86.451648 32.456105,-86.451374 32.45618,-86.451277 32.456235)\r\n700;704;even;Yellowstone Dr;Autauga;AL;36067;LINESTRING(-86.546863 32.578853,-86.546861 32.57918,-86.546888 32.580122,-86.546889 32.580374)\r\n701;703;odd;Yellowstone Dr;Autauga;AL;36067;LINESTRING(-86.547057 32.578853,-86.547059 32.579178,-86.547084 32.58012,-86.547084 32.580373)\r\n1962;1978;all;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.514236 32.565172,-86.51419 32.565298,-86.513932 32.565987,-86.513648 32.566767)\r\n1400;1598;even;Autauga County 51;Autauga;AL;36067;LINESTRING(-86.540434 32.514274,-86.540594 32.51466,-86.540687 32.514891,-86.540813 32.515211,-86.540911 32.515417,-86.54106 32.515684,-86.541228 32.515938,-86.541821 32.516735,-86.541996 32.516984,-86.542331 32.517491,-86.542603 32.517942,-86.542669 32.518069,-86.542783 32.518338,-86.543025 32.519031,-86.543224 32.519657,-86.543253 32.519794,-86.54327 32.519933,-86.543286 32.520219,-86.54328 32.520362,-86.543258 32.520574,-86.543231 32.520713,-86.543192 32.520849,-86.543139 32.520982,-86.542795 32.521649,-86.542296 32.522736,-86.542159 32.522998,-86.541844 32.523514,-86.54174 32.523715,-86.541649 32.523926,-86.541547 32.524208,-86.541438 32.524559,-86.540927 32.52587,-86.540589 32.52677,-86.540377 32.527319,-86.540273 32.527594,-86.540125 32.527928,-86.540024 32.528124,-86.539949 32.528249,-86.539781 32.528494,-86.539505 32.528865,-86.539416 32.528996,-86.539338 32.529131,-86.539275 32.529275,-86.539225 32.529419,-86.539203 32.529485,-86.539105 32.529724)\r\n1401;1599;odd;Autauga County 51;Autauga;AL;36067;LINESTRING(-86.540618 32.514219,-86.540778 32.514606,-86.540871 32.514837,-86.541001 32.515153,-86.541095 32.515349,-86.541238 32.515606,-86.5414 32.515852,-86.541989 32.516649,-86.542166 32.5169,-86.542505 32.517411,-86.542783 32.517868,-86.542857 32.518005,-86.542973 32.518286,-86.543215 32.518985,-86.543422 32.519619,-86.543455 32.51977,-86.54347 32.519921,-86.543482 32.520217,-86.54348 32.520372,-86.543458 32.520594,-86.543429 32.520747,-86.543386 32.520897,-86.543329 32.521044,-86.542979 32.521713,-86.54248 32.5228,-86.542339 32.523072,-86.542026 32.523586,-86.541926 32.523779,-86.541839 32.52398,-86.541739 32.524254,-86.54163 32.524607,-86.541113 32.525922,-86.540775 32.52682,-86.540563 32.527369,-86.540463 32.527648,-86.540311 32.527992,-86.540204 32.528194,-86.540127 32.528331,-86.539949 32.52858,-86.539675 32.528951,-86.539594 32.529074,-86.539524 32.529199,-86.539465 32.529329,-86.539417 32.529463,-86.539399 32.529535,-86.539288 32.52978)\r\n1370;1362;all;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.645598 32.555818,-86.64553 32.555978,-86.64548 32.556066)\r\n1120;1198;even;Autauga County 49;Autauga;AL;36051;LINESTRING(-86.592289 32.641048,-86.592365 32.641143,-86.592868 32.641819,-86.593129 32.642193,-86.593378 32.642575,-86.593647 32.643025,-86.593866 32.643414,-86.594173 32.644008,-86.595704 32.647138,-86.596126 32.648042,-86.596171 32.648156)\r\n1103;1199;odd;Autauga County 49;Autauga;AL;36051;LINESTRING(-86.592449 32.640954,-86.592531 32.641051,-86.593036 32.641733,-86.593301 32.642111,-86.593554 32.642497,-86.593825 32.642951,-86.594046 32.643344,-86.594355 32.643944,-86.595886 32.647076,-86.596316 32.647986,-86.596357 32.648107)\r\n400;498;even;New Moon Dr;Autauga;AL;36067;LINESTRING(-86.462177 32.457791,-86.462185 32.457789,-86.462139 32.457664,-86.462123 32.4576,-86.46205 32.457092,-86.462006 32.456943,-86.461929 32.456718)\r\n401;409;odd;New Moon Dr;Autauga;AL;36067;LINESTRING(-86.462003 32.457864,-86.461987 32.457853,-86.461941 32.457704,-86.461925 32.457626,-86.461848 32.457122,-86.461814 32.456985,-86.461742 32.456763)\r\n1700;1842;even;E Main St;Autauga;AL;36066;LINESTRING(-86.425402 32.460417,-86.423805 32.460426,-86.423747 32.460434,-86.4218 32.460427)\r\n1701;1799;odd;E Main St;Autauga;AL;36066;LINESTRING(-86.425404 32.460582,-86.423825 32.460602,-86.423765 32.460612,-86.421798 32.460591)\r\n300;398;even;Ellen Ct;Autauga;AL;36067;LINESTRING(-86.460557 32.477496,-86.460493 32.477487,-86.460422 32.477474,-86.460348 32.477456,-86.46033 32.477452)\r\n301;399;odd;Ellen Ct;Autauga;AL;36067;LINESTRING(-86.460539 32.477659,-86.460465 32.477657,-86.46037 32.477644,-86.460278 32.477614,-86.460257 32.477605)\r\n111;101;odd;Thames Dr;Autauga;AL;36066;LINESTRING(-86.425894 32.444813,-86.426133 32.44452,-86.426289 32.444345,-86.426424 32.444158,-86.426573 32.44398,-86.426625 32.443896)\r\n112;100;even;Thames Dr;Autauga;AL;36066;LINESTRING(-86.425733 32.44472,-86.425971 32.444422,-86.426121 32.444249,-86.426256 32.444064,-86.426401 32.443888,-86.426457 32.443814)\r\n1399;1351;odd;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.500429 32.430788,-86.498377 32.430833)\r\n1398;1346;even;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.500434 32.430952,-86.498382 32.430997)\r\n218;298;even;Deer Run Dr;Autauga;AL;36067;LINESTRING(-86.480433 32.45342,-86.481261 32.45341)\r\n225;229;odd;Deer Run Dr;Autauga;AL;36067;LINESTRING(-86.480431 32.453255,-86.481259 32.453245)\r\n198;100;all;Oak Creek Cir;Autauga;AL;36067;LINESTRING(-86.472069 32.458039,-86.472071 32.457916,-86.47214 32.457743)\r\n801;899;all;Thomas Ave;Autauga;AL;36067;LINESTRING(-86.450968 32.45809,-86.450331 32.458527,-86.450262 32.458571,-86.450193 32.458616)\r\n1900;2098;all;Davies Dr;Autauga;AL;36067;LINESTRING(-86.489699 32.569364,-86.489728 32.569269)\r\n187;179;all;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.476946 32.572861,-86.476151 32.573485)\r\n1235;1201;odd;Autauga County 42;Autauga;AL;36067;LINESTRING(-86.608707 32.618993,-86.607943 32.619006,-86.60726 32.619,-86.606836 32.618985,-86.606233 32.618976,-86.604791 32.618988,-86.604588 32.618995)\r\n1210;1200;even;Autauga County 42;Autauga;AL;36067;LINESTRING(-86.608711 32.619158,-86.607945 32.619172,-86.607254 32.619168,-86.60683 32.619151,-86.606233 32.619142,-86.604795 32.619154,-86.604596 32.61916)\r\n1798;1792;all;Adrian Dr;Autauga;AL;36067;LINESTRING(-86.699865 32.588083,-86.699853 32.587237)\r\n3540;3538;all;Netezen Ln;Autauga;AL;36749;LINESTRING(-86.78878 32.581311,-86.788811 32.581292,-86.788954 32.581203,-86.789165 32.581057,-86.789244 32.581015,-86.789348 32.580914,-86.789397 32.580851,-86.789431 32.580784,-86.789437 32.580712,-86.789435 32.580641,-86.789409 32.580578,-86.789371 32.580531,-86.78934 32.580476,-86.789298 32.580426,-86.789256 32.580371,-86.789155 32.580263,-86.788992 32.580098,-86.788779 32.579876,-86.788556 32.579642,-86.788397 32.579471,-86.788224 32.579351,-86.788091 32.579293,-86.787818 32.579284,-86.787604 32.579323,-86.787448 32.579425,-86.787401 32.579457)\r\n3518;3500;all;Netezen Ln;Autauga;AL;36749;LINESTRING(-86.788657 32.581183,-86.788689 32.581158,-86.788832 32.581069,-86.789043 32.580923,-86.7891 32.580881,-86.789182 32.580806,-86.789209 32.580769,-86.789225 32.580734,-86.789239 32.580708,-86.789227 32.580681,-86.789215 32.580648,-86.789199 32.580609,-86.789166 32.580564,-86.789134 32.580518,-86.789094 32.580471,-86.789001 32.580367,-86.78884 32.580202,-86.788627 32.57998,-86.788404 32.579748,-86.788247 32.579599,-86.788108 32.579505,-86.788033 32.579479,-86.787836 32.57946,-86.787696 32.579497,-86.787564 32.579561,-86.787518 32.579588)\r\n1199;1175;all;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.467445 32.489109,-86.467466 32.489058,-86.467521 32.488925,-86.467721 32.488502)\r\n1298;1222;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.428506 32.438741,-86.42869 32.438728,-86.429128 32.438695,-86.429499 32.438671)\r\n100;102;all;Live Oak;Autauga;AL;36067;LINESTRING(-86.473702 32.475986,-86.473792 32.475986)\r\n1699;1627;odd;Astros Ave;Autauga;AL;36067;LINESTRING(-86.415348 32.428112,-86.415346 32.428127,-86.415535 32.428277,-86.415875 32.428617,-86.416008 32.428725,-86.416193 32.428846,-86.416273 32.428908,-86.416357 32.428952,-86.416411 32.428976,-86.41644 32.428995,-86.416525 32.429028,-86.416689 32.429082,-86.416854 32.429136,-86.417028 32.429172)\r\n1698;1600;even;Astros Ave;Autauga;AL;36067;LINESTRING(-86.415403 32.427954,-86.41547 32.427955,-86.415683 32.428165,-86.416023 32.428499,-86.416142 32.428595,-86.416319 32.428716,-86.416397 32.428768,-86.416463 32.428808,-86.416509 32.428834,-86.416536 32.428843,-86.416605 32.428872,-86.416759 32.428926,-86.416916 32.428972,-86.417079 32.429013)\r\n2000;2052;even;Autauga County 77;Autauga;AL;36006;LINESTRING(-86.698189 32.621201,-86.698027 32.621266,-86.697888 32.621342,-86.697753 32.621425,-86.697618 32.621509,-86.695967 32.622629,-86.695292 32.623072,-86.694631 32.623524,-86.693956 32.623961,-86.692605 32.624855,-86.692053 32.62521,-86.691843 32.625354,-86.691707 32.625464,-86.69165 32.625523)\r\n2001;2099;odd;Autauga County 77;Autauga;AL;36006;LINESTRING(-86.698277 32.621347,-86.698127 32.621416,-86.698 32.621482,-86.697869 32.621559,-86.69774 32.621641,-86.696089 32.622759,-86.695414 32.623202,-86.694753 32.623656,-86.694076 32.624091,-86.692725 32.624985,-86.692177 32.625342,-86.691977 32.625482,-86.691853 32.625582,-86.691797 32.625632)\r\n177;179;odd;Co Rd 100;Autauga;AL;36022;LINESTRING(-86.448343 32.602334,-86.448444 32.602346)\r\n210;200;even;Co Rd 100;Autauga;AL;36022;LINESTRING(-86.448369 32.602171,-86.44847 32.602183)\r\n1278;1398;all;Autauga County 103;Autauga;AL;36749;LINESTRING(-86.898932 32.602247,-86.898995 32.602443,-86.899113 32.60272,-86.899246 32.602995,-86.899404 32.603262,-86.899575 32.603519,-86.899762 32.603768,-86.900064 32.604125,-86.900886 32.605059,-86.901184 32.605411,-86.901593 32.605878,-86.901685 32.605994,-86.901811 32.60617,-86.901856 32.606238,-86.901928 32.60636,-86.902052 32.606621,-86.902152 32.60689,-86.90219 32.607025,-86.902247 32.607303,-86.902274 32.607585,-86.902269 32.607865,-86.902253 32.608081,-86.902083 32.609541,-86.902063 32.609692)\r\n2600;2656;all;State Rte 143;Autauga;AL;36022;LINESTRING(-86.430895 32.654149,-86.431866 32.654646,-86.432886 32.655179,-86.43324 32.655376,-86.433442 32.655503,-86.433696 32.655685,-86.433988 32.655937,-86.434142 32.656102,-86.434283 32.656277,-86.434497 32.656583,-86.434526 32.656628,-86.434708 32.656969,-86.434811 32.657237,-86.434872 32.657444,-86.435078 32.658295,-86.435149 32.65858,-86.43526 32.658933,-86.435309 32.659074,-86.435414 32.659351,-86.435568 32.659691,-86.43573 32.660031,-86.435943 32.66043,-86.436144 32.66075,-86.436273 32.660941,-86.43643 32.661149)\r\n820;898;even;Joan Ln;Autauga;AL;36067;LINESTRING(-86.460509 32.481693,-86.459986 32.481703,-86.458456 32.481684,-86.458419 32.481685)\r\n819;899;odd;Joan Ln;Autauga;AL;36067;LINESTRING(-86.460514 32.481857,-86.459988 32.481869,-86.458448 32.481854,-86.458406 32.481849)\r\n1962;1998;even;Big Spring;Autauga;AL;36006;LINESTRING(-86.712889 32.628287,-86.712891 32.629105,-86.712905 32.629391,-86.712994 32.630761,-86.713002 32.631049,-86.712999 32.631188,-86.71297 32.631615,-86.712937 32.631972,-86.712927 32.632186,-86.712927 32.632324,-86.712937 32.632457)\r\n1971;1999;odd;Big Spring;Autauga;AL;36006;LINESTRING(-86.713084 32.628286,-86.713089 32.629101,-86.713101 32.629383,-86.713192 32.630755,-86.713198 32.631047,-86.713199 32.631194,-86.713166 32.631627,-86.713135 32.631982,-86.713125 32.632188,-86.713127 32.63232,-86.713132 32.632449)\r\n998;900;all;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.903484 32.583532,-86.90328 32.583581,-86.901626 32.583964,-86.901287 32.584034,-86.900944 32.584084,-86.900747 32.584105)\r\n2201;2219;all;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.5491 32.601204,-86.5491 32.601455,-86.54908 32.601899,-86.549051 32.602772,-86.549037 32.603291)\r\n1070;1084;even;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.782715 32.52617,-86.782746 32.526191)\r\n1071;1085;odd;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.782836 32.526042,-86.782867 32.526063)\r\n1681;1699;all;Autauga County 85;Autauga;AL;36067;LINESTRING(-86.483217 32.528609,-86.48305 32.528757)\r\n2598;2696;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.64677 32.546424,-86.646833 32.546509,-86.647089 32.546807,-86.647251 32.546977,-86.647424 32.547142,-86.647545 32.547251,-86.64779 32.547461,-86.648041 32.547664,-86.648307 32.547855,-86.648853 32.548213,-86.649813 32.548831,-86.65164 32.549991,-86.652229 32.550365,-86.654636 32.551905,-86.654878 32.552057,-86.655326 32.552342,-86.656008 32.552786,-86.659452 32.554981,-86.659792 32.555204,-86.660133 32.555423,-86.660482 32.55564,-86.662409 32.556875,-86.662953 32.557232,-86.663177 32.557388)\r\n2601;2649;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.646933 32.546334,-86.646997 32.546413,-86.647247 32.546705,-86.647403 32.546869,-86.64757 32.54703,-86.647687 32.547135,-86.647928 32.547341,-86.648175 32.547538,-86.648433 32.547725,-86.648973 32.548081,-86.649931 32.548699,-86.651756 32.549859,-86.652347 32.550233,-86.654754 32.551773,-86.654994 32.551925,-86.655444 32.55221,-86.656126 32.552654,-86.659572 32.554849,-86.659912 32.555072,-86.660251 32.555291,-86.6606 32.555508,-86.662529 32.556743,-86.663077 32.557102,-86.663302 32.557262)\r\n799;701;odd;Stonewall Dr;Autauga;AL;36067;LINESTRING(-86.446508 32.451383,-86.446523 32.451302,-86.44662 32.450279,-86.446636 32.450059)\r\n798;700;even;Stonewall Dr;Autauga;AL;36067;LINESTRING(-86.446315 32.451362,-86.446325 32.451284,-86.446424 32.450267,-86.446442 32.450049)\r\n1938;1976;all;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.67409 32.618785,-86.674179 32.620603,-86.674196 32.621041)\r\n1300;1310;even;Crows Pass;Autauga;AL;36067;LINESTRING(-86.467424 32.504477,-86.467647 32.504481,-86.468073 32.504479,-86.468923 32.504487,-86.469603 32.504475,-86.469851 32.504483,-86.469926 32.504491,-86.469997 32.504508,-86.470063 32.50453,-86.470122 32.504562,-86.470186 32.504604,-86.470263 32.504656,-86.47043 32.504729,-86.470525 32.504753,-86.470621 32.504773,-86.470711 32.504769,-86.470733 32.504767)\r\n1301;1309;odd;Crows Pass;Autauga;AL;36067;LINESTRING(-86.467428 32.504313,-86.467649 32.504315,-86.468073 32.504313,-86.468923 32.504321,-86.469603 32.504311,-86.469867 32.504309,-86.469966 32.504321,-86.470063 32.50434,-86.470155 32.504374,-86.470246 32.504416,-86.470312 32.50447,-86.470375 32.504506,-86.47051 32.504565,-86.470577 32.504585,-86.470643 32.504593,-86.470721 32.504597,-86.470752 32.504603)\r\n103;101;odd;Stakley Dr;Autauga;AL;36067;LINESTRING(-86.472074 32.444876,-86.472087 32.444775,-86.472143 32.444576,-86.472238 32.444394,-86.472288 32.444315)\r\n104;100;even;Stakley Dr;Autauga;AL;36067;LINESTRING(-86.47188 32.444871,-86.471875 32.444751,-86.471943 32.444518,-86.472056 32.444312,-86.472121 32.44423)\r\n175;121;all;2nd St;Autauga;AL;36703;LINESTRING(-86.804358 32.452537,-86.804322 32.45365,-86.804312 32.454233,-86.804311 32.454674,-86.804394 32.458682,-86.804413 32.459507)\r\n223;201;odd;Woodvale Rd;Autauga;AL;36067;LINESTRING(-86.456921 32.470121,-86.456899 32.470023,-86.456873 32.469887,-86.456844 32.469683,-86.456858 32.46962,-86.456872 32.469584,-86.456914 32.469523,-86.456994 32.469457,-86.457128 32.469386,-86.457352 32.469245,-86.457455 32.469138,-86.457512 32.469014,-86.457545 32.468851,-86.457541 32.468623,-86.457538 32.468603)\r\n222;200;even;Woodvale Rd;Autauga;AL;36067;LINESTRING(-86.456731 32.470156,-86.456701 32.470055,-86.456677 32.469909,-86.456646 32.469687,-86.456646 32.469586,-86.456674 32.469508,-86.456744 32.469413,-86.456858 32.469309,-86.457014 32.46924,-86.4572 32.469115,-86.457265 32.469044,-86.457306 32.468964,-86.457335 32.468835,-86.457343 32.468625,-86.457344 32.468609)\r\n4173;4001;all;State Rte 14;Autauga;AL;36749;LINESTRING(-86.864788 32.473831,-86.861358 32.475153)\r\n799;741;all;Gaddis Pit Rd;Autauga;AL;36067;LINESTRING(-86.488566 32.489129,-86.488798 32.489208,-86.488874 32.489226,-86.488939 32.489238,-86.489002 32.48924,-86.489152 32.489215,-86.489484 32.489133,-86.489584 32.489119,-86.489762 32.489123,-86.490107 32.489107,-86.490282 32.489107,-86.490509 32.48911,-86.49124 32.489117,-86.491845 32.489119,-86.49203 32.489119,-86.492233 32.489169,-86.492324 32.489247)\r\n2699;2601;odd;Duffey Cir;Autauga;AL;36067;LINESTRING(-86.645744 32.552857,-86.647215 32.552814,-86.64821 32.552838,-86.649117 32.552826,-86.650276 32.552811)\r\n2698;2600;even;Duffey Cir;Autauga;AL;36067;LINESTRING(-86.645738 32.552692,-86.647215 32.552648,-86.648212 32.552672,-86.649115 32.552662,-86.650273 32.552647)\r\n2501;2599;all;Derby St;Autauga;AL;36006;LINESTRING(-86.719047 32.658405,-86.719739 32.658789,-86.719806 32.658825)\r\n1313;1305;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.492883 32.430928,-86.492236 32.430939,-86.491596 32.430948)\r\n1499;1427;all;Old Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.494585 32.509946,-86.494586 32.509906,-86.494493 32.509713,-86.494391 32.50949,-86.494231 32.509237,-86.494079 32.509236,-86.494024 32.509275,-86.494015 32.50927,-86.493988 32.50926,-86.493895 32.509185,-86.493025 32.50818,-86.492943 32.508096,-86.492955 32.508113)\r\n1425;1423;all;Old Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.494393 32.509972,-86.49438 32.509952,-86.494309 32.509773,-86.494205 32.509568,-86.494099 32.509431,-86.494149 32.509432,-86.49408 32.509463,-86.493945 32.509456,-86.49385 32.509408,-86.493737 32.509297,-86.492843 32.508272,-86.492761 32.508068,-86.492822 32.507993)\r\n2677;2601;all;Rollins Rd;Autauga;AL;36051;LINESTRING(-86.417879 32.683306,-86.41788 32.683408)\r\n100;198;even;N Washington St;Autauga;AL;36003;LINESTRING(-86.655577 32.432059,-86.655611 32.432102,-86.656273 32.432951)\r\n101;199;odd;N Washington St;Autauga;AL;36003;LINESTRING(-86.65574 32.431969,-86.655773 32.432012,-86.656435 32.432861)\r\n814;832;even;Bluegrass Dr;Autauga;AL;36066;LINESTRING(-86.415906 32.492281,-86.415981 32.492346,-86.416133 32.492436,-86.416294 32.492511,-86.416467 32.492568,-86.41656 32.492589,-86.416657 32.492602,-86.41701 32.492624,-86.417111 32.492619)\r\n823;829;odd;Bluegrass Dr;Autauga;AL;36066;LINESTRING(-86.416038 32.49216,-86.416111 32.49221,-86.416241 32.492288,-86.416382 32.492353,-86.416531 32.492404,-86.416604 32.492421,-86.416681 32.492432,-86.417014 32.492458,-86.417101 32.492455)\r\n1068;1062;all;Arrowhead Dr;Autauga;AL;36067;LINESTRING(-86.52786 32.458124,-86.52785 32.45809,-86.527824 32.457972,-86.527802 32.457912,-86.52774 32.457782,-86.527668 32.457657,-86.527587 32.457538,-86.527493 32.457425,-86.527387 32.457322,-86.52727 32.457226,-86.526753 32.456845,-86.526431 32.456593,-86.52637 32.456531,-86.52631 32.456473,-86.526213 32.456335,-86.526103 32.456131,-86.525849 32.455597)\r\n1825;1899;all;Maul Dr;Autauga;AL;36006;LINESTRING(-86.729984 32.643364,-86.729868 32.643711,-86.729696 32.644346,-86.729634 32.64463,-86.729565 32.644991,-86.729518 32.645273,-86.729341 32.646716,-86.729244 32.647441,-86.729098 32.648304,-86.729031 32.648737,-86.729024 32.648792,-86.728997 32.649055)\r\n2700;2730;even;Autauga County 85;Autauga;AL;36022;LINESTRING(-86.424841 32.617133,-86.42482 32.61735,-86.424667 32.619513,-86.424578 32.620683)\r\n2701;2731;odd;Autauga County 85;Autauga;AL;36022;LINESTRING(-86.425035 32.617145,-86.425016 32.617362,-86.424861 32.619523,-86.424773 32.620693)\r\n3918;3936;even;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.824283 32.600706,-86.824308 32.600718,-86.824682 32.600813,-86.824932 32.600863,-86.82511 32.600885,-86.825205 32.600893,-86.825456 32.600921,-86.825718 32.600931,-86.827136 32.600966,-86.828926 32.60101,-86.829218 32.601005)\r\n3919;3929;odd;Autauga County 16;Autauga;AL;36749;LINESTRING(-86.824353 32.600553,-86.824374 32.600556,-86.824734 32.600649,-86.82497 32.600695,-86.825136 32.600719,-86.825227 32.600729,-86.825474 32.600751,-86.825726 32.600765,-86.827142 32.600802,-86.828928 32.600844,-86.829215 32.600841)\r\n768;766;all;Glenbrooke Blvd;Autauga;AL;36066;LINESTRING(-86.422489 32.492208,-86.422526 32.492186)\r\n1001;1199;all;Reuben Rd;Autauga;AL;36067;LINESTRING(-86.457011 32.424422,-86.45724 32.424307,-86.458134 32.423984,-86.458456 32.423881,-86.45863 32.423834,-86.458726 32.42382,-86.458908 32.423801,-86.459001 32.423802,-86.459265 32.423811,-86.459449 32.423828)\r\n1301;1305;odd;Dorchester Dr;Autauga;AL;36067;LINESTRING(-86.472529 32.497324,-86.471994 32.496855)\r\n1300;1304;even;Dorchester Dr;Autauga;AL;36067;LINESTRING(-86.472389 32.497438,-86.471854 32.496969)\r\n399;301;all;N Court St;Autauga;AL;36067;LINESTRING(-86.475067 32.467449,-86.475105 32.467047)\r\n1901;1999;all;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.70172 32.523817,-86.702017 32.523946,-86.70224 32.524059,-86.702313 32.524093,-86.702486 32.52418)\r\n1800;1898;even;E Autumn Ct;Autauga;AL;36066;LINESTRING(-86.423757 32.454594,-86.423474 32.454604,-86.423129 32.454606,-86.423028 32.454615,-86.422925 32.454645,-86.422841 32.4547,-86.422766 32.454759,-86.422679 32.454882)\r\n1801;1899;odd;E Autumn Ct;Autauga;AL;36066;LINESTRING(-86.423766 32.454758,-86.42348 32.45477,-86.423145 32.45478,-86.42308 32.454791,-86.423027 32.454809,-86.422975 32.454836,-86.42293 32.454875,-86.422839 32.454974)\r\n498;400;even;Clear Creek Vw;Autauga;AL;36067;LINESTRING(-86.542304 32.425713,-86.54227 32.425736,-86.542217 32.425776,-86.542158 32.425802,-86.542012 32.425843,-86.541939 32.425855,-86.541774 32.425865,-86.541001 32.425845,-86.539285 32.42582,-86.538769 32.425805,-86.538144 32.425799)\r\n499;401;odd;Clear Creek Vw;Autauga;AL;36067;LINESTRING(-86.542455 32.425817,-86.542422 32.425864,-86.542337 32.42592,-86.542246 32.42597,-86.542056 32.426017,-86.541957 32.426023,-86.541778 32.426031,-86.540997 32.426011,-86.539279 32.425986,-86.538765 32.425971,-86.538142 32.425964)\r\n1100;1128;even;Eds Dr;Autauga;AL;36067;LINESTRING(-86.497864 32.478479,-86.498261 32.47827)\r\n1101;1111;odd;Eds Dr;Autauga;AL;36067;LINESTRING(-86.497761 32.47834,-86.498158 32.478131)\r\n1530;1552;even;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.422987 32.533232,-86.423136 32.533261,-86.423877 32.533415,-86.424033 32.533454,-86.424351 32.533547,-86.42465 32.533646,-86.424815 32.533706,-86.425114 32.533833,-86.425553 32.53405,-86.425697 32.53413,-86.426143 32.534354,-86.426803 32.534704,-86.42688 32.534735)\r\n1537;1557;odd;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.42303 32.533071,-86.42318 32.533099,-86.423929 32.533251,-86.424095 32.533294,-86.424421 32.533389,-86.424724 32.533492,-86.424899 32.53355,-86.42521 32.533683,-86.425657 32.533908,-86.425803 32.533988,-86.426245 32.534212,-86.426903 32.534556,-86.426971 32.53459)\r\n1899;1877;odd;Pendlebrook Dr;Autauga;AL;36066;LINESTRING(-86.418914 32.494682,-86.419021 32.494696,-86.419104 32.49471,-86.419421 32.494773,-86.419623 32.494799,-86.419799 32.494809,-86.42 32.49481,-86.420151 32.494795,-86.420345 32.494776,-86.420624 32.494758,-86.420806 32.494753,-86.420976 32.49476,-86.421071 32.494765)\r\n1898;1876;even;Pendlebrook Dr;Autauga;AL;36066;LINESTRING(-86.418943 32.494519,-86.419051 32.494532,-86.419144 32.494542,-86.419459 32.494605,-86.419645 32.494629,-86.419807 32.494639,-86.41999 32.494638,-86.420131 32.494629,-86.420325 32.49461,-86.420614 32.49459,-86.420808 32.494587,-86.420988 32.494594,-86.421086 32.494601)\r\n2000;2024;all;Billingsley Park Rd;Autauga;AL;36006;LINESTRING(-86.718472 32.658061,-86.718461 32.658049,-86.718406 32.658008,-86.718327 32.657963,-86.71823 32.657899,-86.718082 32.657897,-86.717899 32.657982,-86.71783 32.658045,-86.717774 32.658105,-86.717671 32.658223,-86.717362 32.658632)\r\n570;574;even;Jasmine Trl;Autauga;AL;36066;LINESTRING(-86.428431 32.476876,-86.428484 32.47712)\r\n571;599;odd;Jasmine Trl;Autauga;AL;36066;LINESTRING(-86.428623 32.476847,-86.428676 32.477091)\r\n423;499;all;Buena Vista Way;Autauga;AL;36067;LINESTRING(-86.450298 32.430861,-86.449864 32.430869)\r\n501;599;all;Autauga County 9;Autauga;AL;36003;LINESTRING(-86.766677 32.497809,-86.766499 32.498063,-86.766306 32.498314,-86.76571 32.49904,-86.764032 32.500988,-86.763169 32.501983,-86.763073 32.502099,-86.762984 32.502218,-86.762902 32.502341,-86.762831 32.502468,-86.762771 32.502596,-86.762722 32.502729,-86.762682 32.502863,-86.762649 32.503001,-86.762625 32.503141,-86.762597 32.503424,-86.762592 32.503564,-86.762599 32.503704,-86.762715 32.504945,-86.762744 32.50531,-86.763047 32.508554,-86.763054 32.508698,-86.763049 32.508776,-86.763022 32.508826)\r\n1300;1358;all;Chilton County 446;Autauga;AL;36051;LINESTRING(-86.532021 32.705722,-86.532371 32.706101,-86.532423 32.706151,-86.532657 32.70635,-86.533233 32.706775,-86.533359 32.706876)\r\n2549;2561;all;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.488262 32.635725,-86.48823 32.636106,-86.488153 32.637119,-86.488055 32.638243)\r\n200;206;all;Spruce St;Autauga;AL;36067;LINESTRING(-86.480385 32.455851,-86.480396 32.455682,-86.480393 32.455163)\r\n654;698;even;Autauga County 68;Autauga;AL;36051;LINESTRING(-86.439356 32.675563,-86.439286 32.675579,-86.438473 32.675822,-86.436222 32.676531,-86.434187 32.677212)\r\n667;699;odd;Autauga County 68;Autauga;AL;36051;LINESTRING(-86.439412 32.675721,-86.439348 32.675739,-86.438541 32.675978,-86.436292 32.676687,-86.434259 32.677365)\r\n100;198;even;Danya Ct;Autauga;AL;36067;LINESTRING(-86.450571 32.452268,-86.450916 32.452269,-86.451778 32.45227,-86.451865 32.452263,-86.45192 32.452265)\r\n101;199;odd;Danya Ct;Autauga;AL;36067;LINESTRING(-86.450572 32.452103,-86.450916 32.452105,-86.451772 32.4521,-86.451863 32.452097,-86.451929 32.4521)\r\n800;898;all;Smith Ave;Autauga;AL;36067;LINESTRING(-86.447302 32.454864,-86.447295 32.454861,-86.447025 32.454876,-86.446672 32.454897)\r\n499;407;odd;Mockingbird St;Autauga;AL;36067;LINESTRING(-86.488641 32.478774,-86.48844 32.478776,-86.488361 32.478777)\r\n498;410;even;Mockingbird St;Autauga;AL;36067;LINESTRING(-86.488643 32.478939,-86.488442 32.478942,-86.488361 32.478941)\r\n800;898;even;Hideway Ln;Autauga;AL;36067;LINESTRING(-86.599961 32.524343,-86.599891 32.52436,-86.599724 32.524483,-86.599656 32.52452,-86.599563 32.524558,-86.599494 32.524576,-86.599245 32.524608,-86.599148 32.52462,-86.599041 32.524656,-86.598952 32.524729,-86.598908 32.524817,-86.598836 32.525028,-86.59856 32.525633,-86.59841 32.525974,-86.598244 32.5263,-86.598207 32.526344,-86.598165 32.52637,-86.598123 32.526384,-86.597779 32.526391)\r\n801;899;odd;Hideway Ln;Autauga;AL;36067;LINESTRING(-86.600042 32.524492,-86.600007 32.524516,-86.599846 32.524619,-86.599762 32.524672,-86.599639 32.524726,-86.599536 32.524748,-86.599279 32.524776,-86.599214 32.524792,-86.599167 32.524814,-86.599134 32.524841,-86.599104 32.524881,-86.599028 32.525084,-86.598744 32.525693,-86.598594 32.526034,-86.598432 32.526384,-86.598371 32.526464,-86.598281 32.526538,-86.598157 32.52657,-86.597777 32.526556)\r\n782;798;all;Redman Ln;Autauga;AL;36067;LINESTRING(-86.460767 32.446248,-86.460771 32.446146)\r\n100;198;even;Trina Ct;Autauga;AL;36067;LINESTRING(-86.457649 32.512577,-86.457855 32.512596,-86.458365 32.512606,-86.458876 32.512607,-86.45913 32.512604,-86.459381 32.512609,-86.459551 32.512616,-86.46048 32.512615,-86.460499 32.512615)\r\n101;199;odd;Trina Ct;Autauga;AL;36067;LINESTRING(-86.457667 32.512413,-86.457867 32.512426,-86.458367 32.51244,-86.458874 32.512441,-86.45913 32.512438,-86.459387 32.512443,-86.459555 32.512448,-86.460482 32.512449,-86.460503 32.51245)\r\n100;198;even;Cynthia St;Autauga;AL;36066;LINESTRING(-86.431294 32.445353,-86.431263 32.445342,-86.43101 32.445357)\r\n101;199;odd;Cynthia St;Autauga;AL;36066;LINESTRING(-86.431254 32.445514,-86.431247 32.445518,-86.431019 32.445522)\r\n599;539;all;Ashton Oak Dr;Autauga;AL;36066;LINESTRING(-86.422508 32.485522,-86.422501 32.48552,-86.420399 32.485611)\r\n799;781;odd;Glenbrooke Blvd;Autauga;AL;36066;LINESTRING(-86.418848 32.492666,-86.420646 32.492682)\r\n798;780;even;Glenbrooke Blvd;Autauga;AL;36066;LINESTRING(-86.41885 32.492501,-86.420648 32.492517)\r\n1614;1698;all;Autauga County 85;Autauga;AL;36066;LINESTRING(-86.456021 32.537102,-86.456193 32.538115,-86.456358 32.539026)\r\n1600;1698;even;Pete's Ln;Autauga;AL;36067;LINESTRING(-86.646851 32.524163,-86.646923 32.524617,-86.646971 32.524907,-86.647015 32.525054,-86.647065 32.525201,-86.647249 32.525535,-86.647311 32.525666,-86.647361 32.525797,-86.64742 32.526027,-86.647437 32.526136,-86.647431 32.526211,-86.647411 32.526333,-86.647374 32.526474,-86.64733 32.526691,-86.647269 32.526893,-86.647206 32.527017,-86.647035 32.527262,-86.646988 32.527317,-86.646759 32.527543,-86.646666 32.52769,-86.64661 32.527924,-86.646612 32.528083,-86.646632 32.528526,-86.646635 32.528683,-86.646665 32.528786,-86.646758 32.528864,-86.646867 32.528911,-86.64706 32.528928,-86.647125 32.528929)\r\n1501;1599;odd;Pete's Ln;Autauga;AL;36067;LINESTRING(-86.647044 32.524141,-86.647117 32.524593,-86.647171 32.524873,-86.647209 32.52501,-86.647259 32.525139,-86.647431 32.525469,-86.647501 32.525606,-86.647559 32.525751,-86.647624 32.525999,-86.647635 32.526132,-86.647631 32.526225,-86.647613 32.526363,-86.64757 32.526508,-86.647526 32.526725,-86.647471 32.526951,-86.647386 32.527097,-86.647203 32.527352,-86.647152 32.527421,-86.646937 32.527643,-86.646872 32.527752,-86.64682 32.527946,-86.646808 32.528083,-86.646828 32.528518,-86.646847 32.528651,-86.646867 32.528686,-86.646892 32.528712,-86.646935 32.528731,-86.647082 32.528758,-86.647138 32.528764)\r\n600;698;all;Silver Hills Dr;Autauga;AL;36066;LINESTRING(-86.428873 32.460643,-86.428901 32.461485,-86.428917 32.461751)\r\n501;599;odd;Wooten St;Autauga;AL;36067;LINESTRING(-86.488588 32.48342,-86.488509 32.48342,-86.488337 32.483413,-86.488075 32.483414,-86.487818 32.483421,-86.487205 32.483409)\r\n500;598;even;Wooten St;Autauga;AL;36067;LINESTRING(-86.488591 32.483584,-86.488507 32.483586,-86.488333 32.483581,-86.488077 32.48358,-86.487818 32.483585,-86.487201 32.483573)\r\n199;101;odd;Gardner Rd;Autauga;AL;36067;LINESTRING(-86.469346 32.489224,-86.467827 32.489144,-86.46748 32.489132,-86.467464 32.489133)\r\n174;100;even;Gardner Rd;Autauga;AL;36067;LINESTRING(-86.469334 32.489389,-86.467817 32.48931,-86.467466 32.4893,-86.467446 32.489297)\r\n1586;1648;even;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.506107 32.524117,-86.506131 32.524134,-86.507075 32.524746,-86.507405 32.524971,-86.507593 32.525112,-86.507773 32.525261,-86.507946 32.525418,-86.508055 32.525525,-86.50816 32.525636,-86.508469 32.525983,-86.508669 32.526218,-86.509731 32.527455,-86.509896 32.52764)\r\n1601;1631;odd;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.506215 32.52398,-86.506249 32.523996,-86.507197 32.524616,-86.507533 32.524841,-86.507729 32.524988,-86.507917 32.525143,-86.508094 32.525306,-86.508207 32.525419,-86.508316 32.525534,-86.508629 32.525885,-86.508827 32.526122,-86.509889 32.527357,-86.510051 32.527541)\r\n328;300;all;Autauga County 1;Autauga;AL;36703;LINESTRING(-86.831293 32.440901,-86.831325 32.441091,-86.831393 32.441451,-86.831513 32.442173,-86.831842 32.444051,-86.831883 32.444344,-86.831909 32.444639,-86.83191 32.44479,-86.831898 32.445088,-86.831882 32.445238,-86.831825 32.445533,-86.831787 32.445679,-86.831692 32.445967,-86.831637 32.44611,-86.831575 32.446252,-86.831507 32.446391,-86.831433 32.446529,-86.831266 32.44679,-86.830917 32.447308)\r\n324;320;all;Autauga County 27;Autauga;AL;36067;LINESTRING(-86.539155 32.40041,-86.539297 32.400489,-86.539437 32.400589,-86.539625 32.400753,-86.539736 32.400876,-86.539837 32.401002,-86.539928 32.401134,-86.540039 32.401338,-86.540124 32.401555,-86.540179 32.401773,-86.540187 32.401913)\r\n899;841;odd;Heather Dr;Autauga;AL;36066;LINESTRING(-86.41211 32.453188,-86.412071 32.453399,-86.412074 32.453559,-86.412137 32.453783,-86.412204 32.453925,-86.4123 32.454123,-86.412314 32.45415)\r\n898;842;even;Heather Dr;Autauga;AL;36066;LINESTRING(-86.412303 32.453211,-86.412275 32.453407,-86.412284 32.453535,-86.412335 32.453733,-86.412388 32.453863,-86.41249 32.454063,-86.4125 32.454101)\r\n999;975;all;Tremontana Dr;Autauga;AL;36067;LINESTRING(-86.484437 32.445114,-86.484063 32.445401,-86.483867 32.445542,-86.483402 32.445852,-86.483159 32.44603,-86.483017 32.446142,-86.482742 32.446338)\r\n2158;2146;all;Autauga County 66;Autauga;AL;36022;LINESTRING(-86.485148 32.590795,-86.484739 32.590714,-86.484157 32.590613)\r\n800;898;all;Lipscomb Ct;Autauga;AL;36067;LINESTRING(-86.439705 32.413962,-86.439682 32.413976,-86.439663 32.413999)\r\n100;198;all;Branch St;Autauga;AL;36067;LINESTRING(-86.473149 32.464184,-86.473186 32.463261)\r\n1401;1499;all;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.645279 32.548095,-86.645309 32.548019,-86.645411 32.547822,-86.645577 32.547562,-86.645672 32.547434,-86.64582 32.547252,-86.646431 32.54655,-86.646609 32.546332)\r\n199;111;odd;Sheila Blvd;Autauga;AL;36066;LINESTRING(-86.428239 32.443787,-86.428347 32.443753,-86.428417 32.443733,-86.428744 32.443674,-86.428912 32.44365,-86.429085 32.443623,-86.429105 32.443615)\r\n116;114;even;Sheila Blvd;Autauga;AL;36066;LINESTRING(-86.42816 32.443637,-86.428277 32.443585,-86.428371 32.443569,-86.428708 32.44351,-86.428876 32.443486,-86.429039 32.443457,-86.429053 32.443457)\r\n301;399;odd;High Pointe Ridge;Autauga;AL;36066;LINESTRING(-86.430348 32.471495,-86.430366 32.471979,-86.430331 32.472181,-86.430264 32.472379,-86.43017 32.472573,-86.430055 32.472767,-86.429982 32.472909,-86.429886 32.473342,-86.429846 32.473476,-86.429819 32.473554)\r\n300;398;even;High Pointe Ridge;Autauga;AL;36066;LINESTRING(-86.430543 32.471489,-86.430568 32.471987,-86.430537 32.472217,-86.430456 32.472437,-86.430352 32.472643,-86.430239 32.472837,-86.430184 32.472961,-86.430078 32.473376,-86.430042 32.473524,-86.430003 32.473607)\r\n2180;2100;even;Shangri la Rd;Autauga;AL;36022;LINESTRING(-86.436277 32.610112,-86.436281 32.610114,-86.436306 32.609472,-86.436297 32.60911,-86.436265 32.608391,-86.436256 32.60796,-86.436269 32.607238,-86.436265 32.607018,-86.436257 32.606938,-86.436237 32.606853,-86.436192 32.606764,-86.436105 32.606692,-86.436001 32.606654,-86.435902 32.606631,-86.435804 32.606626,-86.434948 32.606627,-86.434705 32.606623)\r\n2101;2171;odd;Shangri la Rd;Autauga;AL;36022;LINESTRING(-86.436084 32.610131,-86.436079 32.610122,-86.43611 32.60947,-86.436101 32.609114,-86.436067 32.608395,-86.436062 32.60796,-86.436073 32.60724,-86.436063 32.60703,-86.436053 32.606966,-86.436035 32.606913,-86.436008 32.606874,-86.435975 32.606846,-86.435927 32.606822,-86.435864 32.606807,-86.435794 32.606798,-86.434946 32.606793,-86.434701 32.606787)\r\n142;198;even;Carol St;Autauga;AL;36067;LINESTRING(-86.456956 32.449973,-86.457137 32.449758)\r\n141;199;odd;Carol St;Autauga;AL;36067;LINESTRING(-86.456798 32.449878,-86.456979 32.449663)\r\n715;717;all;Doster Rd;Autauga;AL;36067;LINESTRING(-86.463541 32.447215,-86.463493 32.446951,-86.463462 32.446814,-86.463421 32.446665)\r\n101;199;odd;Hargis Dr;Autauga;AL;36067;LINESTRING(-86.450641 32.453167,-86.45086 32.453171,-86.451462 32.453167,-86.452327 32.453175,-86.452505 32.453167,-86.452682 32.45315,-86.452774 32.453136,-86.452872 32.453113,-86.452963 32.453065,-86.453039 32.45301,-86.453106 32.452947,-86.453311 32.452699,-86.453353 32.452617)\r\n198;100;even;Hargis Dr;Autauga;AL;36067;LINESTRING(-86.450644 32.453003,-86.450862 32.453005,-86.451462 32.453003,-86.452323 32.453007,-86.452487 32.452999,-86.45265 32.452982,-86.452722 32.452968,-86.452784 32.452947,-86.452841 32.452921,-86.452895 32.452884,-86.452944 32.452839,-86.453133 32.452609,-86.45318 32.452543)\r\n1598;1500;all;Wadsworth Ln;Autauga;AL;36067;LINESTRING(-86.536222 32.419034,-86.535936 32.419007,-86.535418 32.418991,-86.535165 32.41897,-86.534827 32.418928,-86.533733 32.418755,-86.533574 32.418718,-86.533498 32.418694,-86.533348 32.418636,-86.533203 32.418566,-86.533064 32.418488,-86.532378 32.418049,-86.53191 32.417728,-86.531502 32.417455,-86.531352 32.417369,-86.531193 32.417297,-86.531026 32.417239,-86.530937 32.417214,-86.530845 32.417194,-86.530666 32.417172,-86.530325 32.41717,-86.530255 32.417162,-86.530193 32.417148,-86.530137 32.417125,-86.53009 32.417092,-86.530051 32.41705,-86.530022 32.416998,-86.530005 32.416939,-86.529987 32.416801,-86.529983 32.416654,-86.529962 32.416502,-86.529947 32.416424,-86.529922 32.416346,-86.529888 32.416276,-86.529852 32.416203,-86.529794 32.416129,-86.529717 32.416063,-86.529624 32.416016,-86.529531 32.415983,-86.529435 32.415958,-86.529337 32.415951,-86.529247 32.415943,-86.529153 32.415942,-86.529064 32.415944,-86.528379 32.415958,-86.52727 32.41597,-86.527104 32.41596,-86.527029 32.41595,-86.526964 32.415933,-86.526903 32.41591,-86.52685 32.415876,-86.526779 32.415821)\r\n401;389;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.484073 32.44451,-86.484005 32.444455,-86.483487 32.444031)\r\n400;388;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.483942 32.444631,-86.483869 32.444577,-86.483352 32.444149)\r\n559;599;all;Geneva Ln;Autauga;AL;36067;LINESTRING(-86.734478 32.501843,-86.734482 32.501836,-86.73455 32.501904,-86.734615 32.501954,-86.734657 32.501996,-86.734697 32.502031,-86.73476 32.502074,-86.734804 32.502109,-86.734873 32.502154,-86.734905 32.502212,-86.734953 32.502267,-86.73498 32.502327,-86.73502 32.502389,-86.735052 32.502446,-86.735082 32.502477,-86.735124 32.50251,-86.735178 32.50256,-86.735247 32.502605,-86.7353 32.502631,-86.735369 32.502665,-86.735441 32.5027,-86.735501 32.502734,-86.735553 32.502763,-86.735608 32.502792,-86.735664 32.502824,-86.735755 32.502877,-86.735822 32.502936,-86.735856 32.502962,-86.735904 32.502997,-86.735976 32.503042,-86.735994 32.503056)\r\n1324;1498;even;Autauga County 7;Autauga;AL;36749;LINESTRING(-86.840919 32.601335,-86.841393 32.601522,-86.841945 32.601726,-86.842172 32.601821,-86.842316 32.601891,-86.842455 32.601969,-86.842588 32.602055,-86.842711 32.602148,-86.842887 32.602302,-86.843105 32.602519,-86.843374 32.602801,-86.843834 32.603238,-86.844131 32.603502,-86.844376 32.603705,-86.844696 32.603954,-86.844835 32.60405,-86.844978 32.60414,-86.845207 32.604258,-86.845737 32.604515,-86.84604 32.604651,-86.846133 32.60469)\r\n1301;1499;odd;Autauga County 7;Autauga;AL;36749;LINESTRING(-86.841002 32.601186,-86.841473 32.60137,-86.842029 32.601572,-86.842266 32.601673,-86.842422 32.601747,-86.842573 32.601831,-86.842716 32.601925,-86.842851 32.602024,-86.843037 32.602188,-86.843257 32.602413,-86.843526 32.602693,-86.84398 32.603124,-86.844273 32.603384,-86.844512 32.603583,-86.844828 32.603826,-86.844957 32.603916,-86.845092 32.603998,-86.845309 32.604114,-86.845833 32.604369,-86.84613 32.604503,-86.846221 32.604544)\r\n1799;1701;odd;Ponderosa Rd;Autauga;AL;36022;LINESTRING(-86.4307 32.552585,-86.430723 32.55258,-86.430889 32.552527,-86.431049 32.552457,-86.431129 32.552409,-86.431203 32.552356,-86.431267 32.552292,-86.431319 32.552225,-86.431362 32.552156,-86.432213 32.550671,-86.432441 32.550333,-86.432743 32.549849,-86.432789 32.549784)\r\n1798;1700;even;Ponderosa Rd;Autauga;AL;36022;LINESTRING(-86.430635 32.552429,-86.430653 32.552422,-86.430803 32.552369,-86.430943 32.552307,-86.431003 32.552273,-86.431055 32.552232,-86.431103 32.552186,-86.431145 32.552135,-86.431184 32.552078,-86.432035 32.550591,-86.432267 32.550253,-86.432565 32.549759,-86.432629 32.54969)\r\n613;799;all;Coleman Way;Autauga;AL;36067;LINESTRING(-86.478934 32.499316,-86.478935 32.49938)\r\n701;999;all;Brady Ln;Autauga;AL;36749;LINESTRING(-86.817266 32.561304,-86.81724 32.561321,-86.817086 32.561753,-86.817017 32.561971,-86.817002 32.562054,-86.816997 32.562127,-86.816976 32.562253,-86.816887 32.562599,-86.816875 32.562677,-86.816876 32.562757,-86.81688 32.562836,-86.81689 32.562915,-86.816915 32.562993,-86.816987 32.563206,-86.817095 32.563483,-86.817112 32.563547,-86.817121 32.563609,-86.817115 32.56367,-86.817103 32.563733,-86.817083 32.563794,-86.81696 32.564059,-86.816916 32.564207,-86.816902 32.564287,-86.816892 32.564437,-86.816902 32.564729,-86.816893 32.564943,-86.816867 32.565235,-86.816834 32.565743,-86.816801 32.566106,-86.816795 32.566256,-86.816802 32.566478,-86.816825 32.566624,-86.816928 32.567125,-86.817038 32.567555,-86.817086 32.567701,-86.817145 32.567845,-86.81735 32.568255,-86.817461 32.568462,-86.817721 32.568836,-86.817791 32.568959,-86.81785 32.569088,-86.817925 32.569297,-86.818015 32.569501,-86.818061 32.569633,-86.818125 32.569912,-86.818152 32.569989,-86.818188 32.570063,-86.818231 32.570133,-86.818277 32.570204,-86.818334 32.570269,-86.818394 32.570328,-86.818514 32.570442,-86.819072 32.570886,-86.819646 32.571333,-86.81977 32.571445,-86.819784 32.571456)\r\n900;998;even;Burns Ln;Autauga;AL;36003;LINESTRING(-86.766391 32.522609,-86.766454 32.522611,-86.766978 32.522603,-86.767409 32.522588,-86.768183 32.522578,-86.768784 32.522564,-86.769656 32.522535,-86.770664 32.522524,-86.77082 32.522522,-86.770832 32.52252)\r\n901;999;odd;Burns Ln;Autauga;AL;36003;LINESTRING(-86.766397 32.522444,-86.766456 32.522445,-86.766972 32.522437,-86.767403 32.522422,-86.768179 32.522412,-86.768778 32.522398,-86.76965 32.522369,-86.77066 32.522358,-86.77083 32.52235,-86.770857 32.522357)\r\n199;121;odd;Quail Run;Autauga;AL;36067;LINESTRING(-86.477223 32.455402,-86.476625 32.455417,-86.476464 32.455404,-86.47615 32.455339,-86.474748 32.454803,-86.474502 32.454721,-86.474477 32.454714)\r\n138;122;even;Quail Run;Autauga;AL;36067;LINESTRING(-86.477229 32.455567,-86.476623 32.455583,-86.476434 32.45558,-86.47608 32.455509,-86.47467 32.454959,-86.474424 32.454877,-86.474397 32.454864)\r\n100;198;even;Kenalay Ct;Autauga;AL;36066;LINESTRING(-86.414604 32.490513,-86.41443 32.490611,-86.414289 32.49068,-86.414087 32.490767)\r\n101;199;odd;Kenalay Ct;Autauga;AL;36066;LINESTRING(-86.414715 32.490648,-86.414538 32.490757,-86.414381 32.490828,-86.414174 32.490914)\r\n1494;1400;even;Autauga County 73;Autauga;AL;36006;LINESTRING(-86.730449 32.569804,-86.730357 32.569797,-86.729941 32.569757,-86.72936 32.569681,-86.7292 32.56965,-86.729047 32.569609,-86.728899 32.569556,-86.728528 32.569393,-86.728318 32.569285,-86.728116 32.569162,-86.727991 32.569073,-86.727683 32.568823,-86.72736 32.56858,-86.727148 32.568445,-86.726998 32.568365,-86.726838 32.568295,-86.726667 32.56824,-86.726492 32.568204,-86.726317 32.56818,-86.72614 32.568164,-86.725963 32.568161,-86.725782 32.568165,-86.725524 32.568194,-86.725349 32.56822,-86.725177 32.568255,-86.725008 32.568302,-86.724764 32.568392,-86.724533 32.568498,-86.723783 32.568852,-86.723487 32.569,-86.722981 32.569274,-86.722768 32.569403,-86.722568 32.569541,-86.722114 32.56987,-86.721668 32.570207,-86.721472 32.570339,-86.721337 32.570415,-86.72127 32.570446,-86.721199 32.570473,-86.721123 32.570496,-86.721048 32.570513,-86.720889 32.570536,-86.72064 32.570554,-86.720128 32.570563,-86.7191 32.570563,-86.7179 32.570576,-86.715251 32.570621,-86.714483 32.570648,-86.714318 32.570641,-86.714118 32.570627)\r\n1471;1495;odd;Autauga County 73;Autauga;AL;36006;LINESTRING(-86.730437 32.569968,-86.730339 32.569965,-86.729915 32.569923,-86.729324 32.569847,-86.729148 32.569816,-86.728975 32.569773,-86.728811 32.56971,-86.72843 32.569541,-86.728206 32.569427,-86.727992 32.569296,-86.727857 32.569199,-86.727549 32.568947,-86.727232 32.568712,-86.727034 32.568587,-86.726898 32.568515,-86.726754 32.568453,-86.726605 32.568406,-86.72645 32.568372,-86.726289 32.568348,-86.726126 32.568334,-86.725963 32.568325,-86.7258 32.568335,-86.725554 32.56836,-86.725391 32.568386,-86.725233 32.568419,-86.72508 32.568462,-86.724852 32.568546,-86.724627 32.568644,-86.723881 32.568996,-86.723591 32.569142,-86.723093 32.569414,-86.72289 32.569537,-86.722694 32.569669,-86.722244 32.569996,-86.721798 32.570335,-86.721592 32.570477,-86.721443 32.570563,-86.721358 32.570602,-86.721273 32.570631,-86.721185 32.570658,-86.721094 32.570681,-86.720915 32.570708,-86.72065 32.570722,-86.72013 32.570729,-86.719102 32.570729,-86.717904 32.570742,-86.715257 32.570787,-86.714483 32.570814,-86.714304 32.570811,-86.714099 32.570791)\r\n499;401;odd;S Autauga St;Autauga;AL;36003;LINESTRING(-86.649666 32.419399,-86.649667 32.419596,-86.649679 32.421692,-86.649684 32.422477,-86.649696 32.42456,-86.649695 32.425291,-86.649704 32.426172,-86.649716 32.426547,-86.649735 32.426711,-86.649778 32.426814)\r\n400;498;even;S Autauga St;Autauga;AL;36003;LINESTRING(-86.64986 32.419398,-86.649861 32.419596,-86.649873 32.421692,-86.649878 32.422477,-86.64989 32.42456,-86.649891 32.425291,-86.6499 32.426168,-86.649918 32.426535,-86.649941 32.426675,-86.649965 32.426769)\r\n2654;2698;even;Autauga County 67;Autauga;AL;36006;LINESTRING(-86.678751 32.693323,-86.678316 32.693763,-86.67821 32.693884,-86.678119 32.694019,-86.678055 32.694163,-86.678014 32.694314,-86.677951 32.694745,-86.677873 32.695172,-86.677835 32.695463,-86.677827 32.695611,-86.677825 32.69576,-86.677844 32.696341,-86.677863 32.696633,-86.677877 32.696777,-86.677898 32.696922,-86.677924 32.697064,-86.678114 32.69786,-86.678192 32.698144,-86.67828 32.698426,-86.678411 32.698766,-86.678908 32.700141,-86.679038 32.700546,-86.67906 32.700625)\r\n2633;2699;odd;Autauga County 67;Autauga;AL;36006;LINESTRING(-86.678901 32.693428,-86.678476 32.693867,-86.678384 32.693978,-86.678309 32.694093,-86.678253 32.694215,-86.678216 32.694344,-86.678147 32.694769,-86.678071 32.695194,-86.678035 32.695477,-86.678025 32.695617,-86.678021 32.69576,-86.678042 32.696333,-86.678061 32.696621,-86.678075 32.696761,-86.678094 32.696898,-86.67812 32.697034,-86.678308 32.697824,-86.678384 32.698104,-86.678472 32.698378,-86.678599 32.698716,-86.679098 32.700095,-86.679234 32.700506,-86.679252 32.700593)\r\n399;301;odd;Bent Tree Dr;Autauga;AL;36067;LINESTRING(-86.467259 32.471435,-86.467391 32.470969,-86.467439 32.470835,-86.467503 32.470719,-86.467648 32.470557,-86.467889 32.470357,-86.468073 32.470201,-86.468308 32.469996,-86.468638 32.469765,-86.468767 32.469659,-86.469058 32.46939,-86.469359 32.469136,-86.469441 32.469068)\r\n342;300;even;Bent Tree Dr;Autauga;AL;36067;LINESTRING(-86.46707 32.471397,-86.467199 32.470927,-86.467243 32.470777,-86.467317 32.470625,-86.467494 32.470439,-86.467751 32.470237,-86.467931 32.470085,-86.468168 32.469868,-86.468504 32.469637,-86.468623 32.469541,-86.468914 32.469274,-86.469221 32.469016,-86.469308 32.468949)\r\n101;199;odd;Henry Cir;Autauga;AL;36066;LINESTRING(-86.459239 32.577603,-86.45948 32.577596,-86.459729 32.577579,-86.460315 32.577567,-86.460333 32.577565)\r\n100;198;even;Henry Cir;Autauga;AL;36066;LINESTRING(-86.459231 32.577438,-86.459468 32.577428,-86.459719 32.577411,-86.460327 32.577393,-86.460362 32.577402)\r\n2012;2098;even;Wynfield Dr;Autauga;AL;36067;LINESTRING(-86.513203 32.447034,-86.513172 32.44681,-86.51316 32.446671,-86.513164 32.446458,-86.513173 32.446321,-86.513181 32.446126)\r\n2011;2099;odd;Wynfield Dr;Autauga;AL;36067;LINESTRING(-86.51301 32.447055,-86.512974 32.446826,-86.51296 32.446677,-86.512964 32.446452,-86.512977 32.446313,-86.512987 32.446119)\r\n700;740;all;Old Ridge Rd N;Autauga;AL;36066;LINESTRING(-86.418162 32.496754,-86.418109 32.496154,-86.418099 32.49606)\r\n399;305;odd;Abington St;Autauga;AL;36066;LINESTRING(-86.421761 32.46432,-86.421761 32.464357,-86.421767 32.466373,-86.421739 32.466577,-86.421666 32.466765,-86.421545 32.46694,-86.421299 32.467225,-86.421216 32.467316)\r\n398;302;even;Abington St;Autauga;AL;36066;LINESTRING(-86.421952 32.464288,-86.421973 32.464339,-86.421971 32.466381,-86.421949 32.466615,-86.421862 32.466843,-86.421711 32.467036,-86.421457 32.467327,-86.421369 32.467418)\r\n950;998;even;Autauga County 6;Autauga;AL;36067;LINESTRING(-86.564581 32.542518,-86.564611 32.54255,-86.564734 32.542681,-86.564815 32.542799,-86.564882 32.542925,-86.564934 32.543054,-86.564971 32.543186,-86.564994 32.543323,-86.565005 32.543464,-86.56501 32.543755,-86.565041 32.544342,-86.56509 32.544779,-86.565152 32.545217,-86.565276 32.545864,-86.565339 32.546222,-86.565425 32.546799,-86.56548 32.547087,-86.565513 32.547293,-86.565491 32.547416,-86.565445 32.547531,-86.565367 32.547641,-86.564971 32.548023,-86.564911 32.548093,-86.564823 32.548241,-86.564791 32.54841,-86.564794 32.548502,-86.564834 32.548661,-86.564914 32.548806,-86.565008 32.548939,-86.565109 32.549061,-86.565469 32.549475,-86.565942 32.549999,-86.566124 32.550164,-86.5662 32.550223,-86.566327 32.550279)\r\n901;951;odd;Autauga County 6;Autauga;AL;36067;LINESTRING(-86.564699 32.542387,-86.564769 32.54242,-86.564906 32.542587,-86.564997 32.542721,-86.56507 32.542861,-86.565132 32.543006,-86.565171 32.543156,-86.565194 32.543307,-86.565205 32.543458,-86.565208 32.543751,-86.565239 32.54433,-86.565286 32.544761,-86.565348 32.545193,-86.56547 32.545838,-86.565533 32.5462,-86.565621 32.546775,-86.565676 32.547063,-86.565711 32.547289,-86.565705 32.547454,-86.565639 32.547609,-86.565535 32.547747,-86.565133 32.548131,-86.565093 32.548183,-86.565031 32.548299,-86.564997 32.548422,-86.565002 32.548478,-86.565036 32.548605,-86.565096 32.548726,-86.565178 32.548847,-86.565271 32.548965,-86.565627 32.549375,-86.566098 32.549887,-86.566266 32.55004,-86.566324 32.550079,-86.566426 32.550138)\r\n3598;3572;all;Autauga County 44;Autauga;AL;36003;LINESTRING(-86.781231 32.506497,-86.780316 32.506844,-86.780008 32.506969,-86.779861 32.507037,-86.779423 32.507264,-86.779145 32.507429,-86.778878 32.507607,-86.77875 32.5077,-86.778625 32.507797,-86.778384 32.508002,-86.77827 32.508107,-86.778158 32.508218,-86.777944 32.508443,-86.777845 32.508556,-86.776689 32.510001)\r\n2360;2398;all;Co Rd 2;Autauga;AL;36003;LINESTRING(-86.652345 32.445204,-86.652433 32.4452,-86.65251 32.445197,-86.652672 32.445208,-86.652828 32.445233,-86.653061 32.445298,-86.653121 32.445325,-86.653306 32.445447,-86.653344 32.445486,-86.653409 32.445602,-86.653457 32.445735,-86.653502 32.445892,-86.653616 32.446041,-86.653789 32.446139,-86.653981 32.446178,-86.654588 32.446225,-86.655449 32.446292,-86.655639 32.446301,-86.655914 32.446238,-86.656005 32.446188,-86.656148 32.446085,-86.656265 32.445966,-86.656378 32.445853,-86.656457 32.445753)\r\n100;198;even;Old Prestwick Ct;Autauga;AL;36066;LINESTRING(-86.418054 32.473027,-86.418078 32.473036,-86.418137 32.473068,-86.418167 32.473085,-86.418212 32.473125,-86.418393 32.473341,-86.418764 32.473855,-86.418782 32.473851)\r\n101;199;odd;Old Prestwick Ct;Autauga;AL;36066;LINESTRING(-86.418128 32.472875,-86.418154 32.472884,-86.418251 32.472908,-86.418317 32.472957,-86.418374 32.473021,-86.418557 32.473249,-86.418994 32.473797,-86.418977 32.473849)\r\n199;165;odd;Autauga County 27;Autauga;AL;36067;LINESTRING(-86.537865 32.419338,-86.537867 32.419468,-86.537899 32.420268)\r\n194;174;even;Autauga County 27;Autauga;AL;36067;LINESTRING(-86.53806 32.419335,-86.538063 32.419464,-86.538093 32.420263)\r\n799;701;odd;Dozier Ave;Autauga;AL;36066;LINESTRING(-86.449859 32.456529,-86.449919 32.45649,-86.45013 32.456357,-86.450466 32.456127,-86.450606 32.456038,-86.450664 32.455992)\r\n798;700;even;Dozier Ave;Autauga;AL;36066;LINESTRING(-86.449736 32.456401,-86.449797 32.456358,-86.450008 32.456225,-86.450344 32.455995,-86.45048 32.455906,-86.450537 32.455868)\r\n432;468;even;Autauga County 68;Autauga;AL;36022;LINESTRING(-86.462746 32.663789,-86.462721 32.66382,-86.462661 32.663951,-86.4626 32.664091,-86.46256 32.664239,-86.462498 32.664526,-86.462471 32.66482,-86.462435 32.665761,-86.462415 32.666701,-86.462405 32.666915,-86.462381 32.667198,-86.462342 32.66748,-86.462301 32.667691,-86.462232 32.667969,-86.462168 32.668173,-86.462064 32.668444,-86.461941 32.668709,-86.461802 32.668965,-86.461686 32.669157,-86.461522 32.669404,-86.461295 32.669701,-86.461147 32.669871,-86.46099 32.670038,-86.460827 32.670197,-86.460713 32.670299,-86.460409 32.670545,-86.46022 32.670684,-86.460129 32.670747)\r\n401;437;odd;Autauga County 68;Autauga;AL;36022;LINESTRING(-86.462918 32.663867,-86.462907 32.663894,-86.462847 32.664011,-86.462796 32.664139,-86.462756 32.664273,-86.4627 32.664548,-86.462671 32.66483,-86.462631 32.665765,-86.462611 32.666705,-86.462603 32.666923,-86.462579 32.667214,-86.46254 32.667504,-86.462497 32.667721,-86.462428 32.668007,-86.46236 32.668221,-86.462252 32.6685,-86.462127 32.668775,-86.46198 32.669039,-86.461862 32.669235,-86.461694 32.669492,-86.461461 32.669797,-86.461305 32.669973,-86.461144 32.670144,-86.460975 32.670311,-86.460855 32.670417,-86.460543 32.670671,-86.460346 32.670812,-86.460252 32.670875)\r\n1606;1616;even;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.681717 32.57432,-86.681542 32.574951,-86.681511 32.575068,-86.681285 32.575901)\r\n1629;1699;odd;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.681907 32.574358,-86.681732 32.574989,-86.681701 32.575104,-86.681475 32.575938)\r\n300;398;all;Cheeks Ln;Autauga;AL;36067;LINESTRING(-86.478895 32.542257,-86.479004 32.542285,-86.479343 32.542352,-86.479518 32.542376,-86.4797 32.54238,-86.479868 32.542367,-86.480035 32.542379,-86.480221 32.542381,-86.480408 32.542342,-86.480578 32.542274,-86.480731 32.542185,-86.480804 32.542132,-86.480872 32.54207,-86.480872 32.542055)\r\n199;107;odd;Buckner St;Autauga;AL;36066;LINESTRING(-86.445795 32.468113,-86.445878 32.467933,-86.445896 32.467703,-86.445888 32.46749)\r\n198;110;even;Buckner St;Autauga;AL;36066;LINESTRING(-86.445611 32.468061,-86.445666 32.467895,-86.445694 32.467697,-86.445694 32.467493)\r\n2011;2009;all;Regent Rd;Autauga;AL;36066;LINESTRING(-86.414338 32.465727,-86.414262 32.465644,-86.414084 32.465503,-86.413939 32.465425,-86.41382 32.465397,-86.413707 32.465402,-86.413574 32.465423,-86.41341 32.465468,-86.413318 32.465514,-86.413273 32.465567,-86.412414 32.466277,-86.412197 32.466438,-86.412128 32.466513,-86.412107 32.466608,-86.412091 32.466744,-86.412096 32.466847,-86.412091 32.467774,-86.412089 32.468034,-86.412205 32.46821)\r\n2309;2325;all;Hilltop Farm Rd;Autauga;AL;36067;LINESTRING(-86.596846 32.490921,-86.597111 32.491032,-86.597419 32.491143,-86.597576 32.49119,-86.597733 32.491227,-86.598059 32.491276,-86.598124 32.491284)\r\n670;600;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.488149 32.449189,-86.488095 32.449122,-86.487676 32.448621,-86.487435 32.448317,-86.487199 32.448005,-86.486879 32.447555,-86.486874 32.447535)\r\n539;531;odd;Jasmine Trl;Autauga;AL;36066;LINESTRING(-86.427447 32.472914,-86.427455 32.47283,-86.427454 32.472609,-86.427429 32.471449,-86.427413 32.471204)\r\n548;534;even;Jasmine Trl;Autauga;AL;36066;LINESTRING(-86.427252 32.472904,-86.427255 32.472824,-86.427258 32.472611,-86.427231 32.471455,-86.427219 32.471212)\r\n1398;1326;all;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.472822 32.497152,-86.473004 32.497009)\r\n601;597;odd;Marlyn Dr;Autauga;AL;36067;LINESTRING(-86.48632 32.481395,-86.486315 32.481268,-86.486312 32.48105,-86.486306 32.48098,-86.48629 32.480698)\r\n606;596;even;Marlyn Dr;Autauga;AL;36067;LINESTRING(-86.486125 32.481401,-86.486119 32.481272,-86.486114 32.481056,-86.486112 32.480988,-86.486096 32.480706)\r\n141;101;odd;Autauga County 68;Autauga;AL;36022;LINESTRING(-86.48096 32.657305,-86.48104 32.657297,-86.481373 32.65727,-86.481707 32.657257,-86.482043 32.657258,-86.482547 32.657288,-86.483042 32.657351,-86.484024 32.657566,-86.485094 32.657821,-86.485674 32.657952,-86.486094 32.658041,-86.486357 32.658076,-86.486621 32.658096,-86.486971 32.658105,-86.487412 32.658085,-86.487758 32.658019,-86.488091 32.65793,-86.488257 32.657883,-86.488819 32.657706,-86.489054 32.657647)\r\n116;100;even;Autauga County 68;Autauga;AL;36022;LINESTRING(-86.480933 32.657142,-86.481016 32.657131,-86.481359 32.657102,-86.481703 32.657089,-86.482049 32.657088,-86.482569 32.657118,-86.483084 32.657181,-86.484076 32.657406,-86.485146 32.657661,-86.485722 32.65779,-86.486134 32.657873,-86.486383 32.657908,-86.486633 32.657928,-86.486967 32.657939,-86.487382 32.657911,-86.487706 32.657853,-86.488029 32.657772,-86.488189 32.657725,-86.488755 32.657542,-86.489002 32.657489)\r\n2600;2698;even;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.500135 32.635603,-86.500685 32.636267,-86.501049 32.636678,-86.501266 32.636902,-86.501442 32.637064,-86.501686 32.63727,-86.50284 32.638132,-86.503141 32.638368,-86.503917 32.639011,-86.504273 32.639326,-86.504439 32.639485,-86.504593 32.639653,-86.504735 32.63983,-86.50508 32.64033,-86.505264 32.640577,-86.505508 32.640877,-86.506326 32.641806,-86.506545 32.642033,-86.506881 32.642359,-86.506928 32.642412,-86.507012 32.642527,-86.50708 32.64265,-86.507132 32.642781,-86.507168 32.642916,-86.507265 32.643432)\r\n2601;2699;odd;Autauga County 59;Autauga;AL;36067;LINESTRING(-86.500295 32.635509,-86.500845 32.636169,-86.501205 32.636574,-86.501418 32.636792,-86.501586 32.636948,-86.501824 32.637146,-86.502972 32.638008,-86.503277 32.638248,-86.504059 32.638893,-86.504419 32.639212,-86.504593 32.639377,-86.504755 32.639553,-86.504905 32.63974,-86.50525 32.640244,-86.50543 32.640485,-86.50567 32.640779,-86.506484 32.641702,-86.506697 32.641925,-86.507037 32.642251,-86.507094 32.642314,-86.507194 32.642443,-86.507272 32.642586,-86.50733 32.642735,-86.507366 32.642886,-86.507458 32.643406)\r\n1742;1778;all;Autauga County 81;Autauga;AL;36067;LINESTRING(-86.559535 32.532438,-86.559247 32.532645,-86.558075 32.533507,-86.557816 32.533705,-86.557454 32.534024,-86.557338 32.534136,-86.557115 32.534361,-86.556684 32.534824,-86.556579 32.534946,-86.556485 32.53508,-86.556412 32.535226,-86.556364 32.535376,-86.556321 32.535527,-86.556307 32.535681,-86.556304 32.53582)\r\n1000;1098;even;Choctaw Ridge Rd;Autauga;AL;36067;LINESTRING(-86.525141 32.454117,-86.524818 32.454026,-86.52464 32.454035)\r\n1001;1099;odd;Choctaw Ridge Rd;Autauga;AL;36067;LINESTRING(-86.525086 32.454275,-86.524786 32.45421,-86.52464 32.4542)\r\n474;498;even;Autauga County 165;Autauga;AL;36003;LINESTRING(-86.638779 32.46391,-86.638764 32.463913,-86.636869 32.46437,-86.636467 32.46447)\r\n401;499;odd;Autauga County 165;Autauga;AL;36003;LINESTRING(-86.638838 32.464067,-86.63882 32.464073,-86.636923 32.464528,-86.636522 32.464628)\r\n100;198;even;Ashton Oak Ct;Autauga;AL;36066;LINESTRING(-86.419857 32.488431,-86.419862 32.488617,-86.419868 32.488984,-86.419871 32.489033,-86.419816 32.489048,-86.418936 32.489069)\r\n101;199;odd;Ashton Oak Ct;Autauga;AL;36066;LINESTRING(-86.420051 32.488426,-86.420058 32.488613,-86.42007 32.488974,-86.420091 32.489131,-86.419874 32.48924,-86.418938 32.489234)\r\n101;199;all;Rushmore Ct;Autauga;AL;36022;LINESTRING(-86.419917 32.506952,-86.419876 32.506875,-86.419887 32.506808,-86.419887 32.506757,-86.419886 32.506658,-86.419887 32.506613)\r\n100;198;even;Shannon Ct;Autauga;AL;36066;LINESTRING(-86.412623 32.454272,-86.412766 32.454231,-86.412918 32.454204,-86.413159 32.454185,-86.413403 32.454206,-86.413563 32.454226,-86.413696 32.454248)\r\n101;199;odd;Shannon Ct;Autauga;AL;36066;LINESTRING(-86.412549 32.45412,-86.412706 32.454057,-86.412892 32.454032,-86.413161 32.454019,-86.413425 32.45404,-86.413599 32.454056,-86.413739 32.454087)\r\n880;898;all;Autauga County 6;Autauga;AL;36067;LINESTRING(-86.562542 32.542761,-86.562687 32.542729,-86.562838 32.542711,-86.563264 32.542716,-86.563444 32.542718,-86.563628 32.542697,-86.563804 32.542653,-86.563895 32.542627,-86.564057 32.542557,-86.56414 32.542519,-86.564229 32.54246)\r\n952;998;all;Washington Ferry Rd;Autauga;AL;36067;LINESTRING(-86.465052 32.430787,-86.465046 32.429543)\r\n199;137;odd;N Washington St;Autauga;AL;36067;LINESTRING(-86.469539 32.463918,-86.469562 32.463658)\r\n198;156;even;N Washington St;Autauga;AL;36067;LINESTRING(-86.469345 32.463906,-86.469368 32.463646)\r\n252;262;even;Teri Ln;Autauga;AL;36066;LINESTRING(-86.427051 32.448822,-86.427041 32.449158,-86.42704 32.44938,-86.427042 32.449492,-86.427073 32.449614,-86.4272 32.44977,-86.42735 32.449893)\r\n249;259;odd;Teri Ln;Autauga;AL;36066;LINESTRING(-86.427246 32.448826,-86.427237 32.44916,-86.42724 32.449374,-86.427252 32.449464,-86.427279 32.449538,-86.427366 32.449658,-86.427491 32.449779)\r\n342;354;all;Golson Rd;Autauga;AL;36067;LINESTRING(-86.552817 32.452263,-86.552766 32.452348,-86.552599 32.452591,-86.552504 32.452703,-86.552459 32.452753)\r\n1201;1299;all;Clara St;Autauga;AL;36066;LINESTRING(-86.441045 32.455687,-86.440955 32.455707)\r\n100;298;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.451027 32.464077,-86.451027 32.463908)\r\n503;501;odd;Durden Rd;Autauga;AL;36067;LINESTRING(-86.488814 32.483368,-86.488778 32.4831,-86.488696 32.482635)\r\n598;502;even;Durden Rd;Autauga;AL;36067;LINESTRING(-86.488621 32.483387,-86.488582 32.483122,-86.488504 32.482659)\r\n700;798;even;Waverly Ln;Autauga;AL;36067;LINESTRING(-86.485582 32.484628,-86.485222 32.484367,-86.484951 32.484177,-86.484943 32.484177)\r\n707;799;odd;Waverly Ln;Autauga;AL;36067;LINESTRING(-86.485456 32.484753,-86.485096 32.484495,-86.484831 32.484315,-86.484836 32.484314)\r\n1101;1199;all;Lipscomb Rd;Autauga;AL;36067;LINESTRING(-86.443284 32.41712,-86.443282 32.416985,-86.443272 32.41656,-86.443267 32.415619,-86.443268 32.414748,-86.443273 32.414533,-86.443284 32.414398)\r\n300;398;even;College St;Autauga;AL;36067;LINESTRING(-86.468754 32.459287,-86.468757 32.459271,-86.468798 32.458884)\r\n301;399;odd;College St;Autauga;AL;36067;LINESTRING(-86.46856 32.459269,-86.468561 32.459255,-86.468604 32.458869)\r\n1399;1317;odd;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.486546 32.503521,-86.48493 32.502106,-86.484815 32.501999,-86.484345 32.501583,-86.484117 32.501369,-86.483844 32.501098,-86.483791 32.501042,-86.483477 32.500704,-86.483279 32.500472,-86.483091 32.500238,-86.482985 32.5001)\r\n1398;1300;even;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.486407 32.503635,-86.484786 32.50222,-86.484671 32.502113,-86.484201 32.501697,-86.483969 32.501479,-86.483696 32.501204,-86.483637 32.501148,-86.483319 32.500804,-86.483117 32.500568,-86.482925 32.50033,-86.482821 32.500188)\r\n1660;1698;even;Autauga County 81;Autauga;AL;36067;LINESTRING(-86.569567 32.528385,-86.569403 32.528399,-86.566495 32.528469,-86.565969 32.528482,-86.565448 32.528495,-86.565272 32.528508,-86.565095 32.528526,-86.564919 32.52855,-86.564744 32.528585,-86.564573 32.528625,-86.564402 32.528668,-86.56415 32.528751)\r\n1673;1699;odd;Autauga County 81;Autauga;AL;36067;LINESTRING(-86.569592 32.528548,-86.569419 32.528571,-86.566501 32.528633,-86.565975 32.528646,-86.56546 32.528663,-86.565292 32.528674,-86.565123 32.528692,-86.564957 32.528716,-86.564792 32.528747,-86.564629 32.528785,-86.564468 32.528828,-86.564219 32.528905)\r\n3038;3072;even;Autauga County 57;Autauga;AL;36091;LINESTRING(-86.553754 32.694185,-86.553758 32.694218,-86.553778 32.694357,-86.553798 32.694645,-86.553804 32.695006,-86.55379 32.69761,-86.553794 32.697828,-86.553811 32.698119,-86.553835 32.698336,-86.553896 32.698767,-86.553922 32.698912,-86.55397 32.699126,-86.553983 32.699167)\r\n3039;3071;odd;Autauga County 57;Autauga;AL;36091;LINESTRING(-86.553945 32.694152,-86.553958 32.69419,-86.553978 32.694343,-86.553998 32.694639,-86.554 32.695006,-86.553986 32.697608,-86.553992 32.697822,-86.554009 32.698107,-86.554031 32.698318,-86.554092 32.698745,-86.554118 32.698884,-86.554164 32.699092,-86.554173 32.699129)\r\n197;177;all;2nd St;Autauga;AL;36703;LINESTRING(-86.804422 32.449921,-86.804412 32.450804,-86.804366 32.45229)\r\n1287;1299;all;Autauga County 19;Autauga;AL;36067;LINESTRING(-86.699795 32.533074,-86.699499 32.533374,-86.698806 32.534101,-86.698223 32.534723,-86.69769 32.535288,-86.697543 32.535461,-86.697312 32.535761,-86.697098 32.53607,-86.696942 32.536322,-86.696803 32.536583,-86.696617 32.536986,-86.69579 32.539041,-86.695361 32.540141,-86.695215 32.540483,-86.695052 32.54082,-86.69484 32.541214,-86.694787 32.541301)\r\n144;252;all;Autauga County 40;Autauga;AL;36022;LINESTRING(-86.458211 32.586609,-86.458077 32.586695,-86.457667 32.58695,-86.45732 32.587155,-86.457036 32.587314)\r\n1055;1199;all;Autauga County 1;Autauga;AL;36749;LINESTRING(-86.794576 32.582557,-86.79451 32.582626,-86.794325 32.582787,-86.793812 32.583187,-86.793045 32.583773,-86.791144 32.58524,-86.790449 32.585751,-86.790323 32.585834,-86.790274 32.585866)\r\n2499;2465;all;Fox Ridge Dr;Autauga;AL;36067;LINESTRING(-86.490147 32.619505,-86.488935 32.61952)\r\n4200;4226;even;Autauga County 60;Autauga;AL;36749;LINESTRING(-86.854933 32.56936,-86.854969 32.569373,-86.855273 32.569476,-86.855437 32.569524,-86.855607 32.569565,-86.855858 32.569605,-86.856272 32.569656,-86.856599 32.569707,-86.856643 32.569714)\r\n4201;4221;odd;Autauga County 60;Autauga;AL;36749;LINESTRING(-86.854997 32.569205,-86.855039 32.569215,-86.855343 32.569318,-86.855497 32.569362,-86.855653 32.569399,-86.855892 32.569439,-86.856304 32.56949,-86.856639 32.569543,-86.856686 32.569553)\r\n1500;1598;even;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.525629 32.477228,-86.529935 32.480163,-86.532272 32.481763,-86.535806 32.48417)\r\n1501;1599;odd;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.525751 32.477099,-86.530057 32.480035,-86.532394 32.481635,-86.535928 32.484042)\r\n699;601;all;Marshall Dr;Autauga;AL;36067;LINESTRING(-86.49404 32.440994,-86.493812 32.440989,-86.493302 32.441008,-86.492517 32.441049,-86.492369 32.441075,-86.49145 32.441132,-86.491284 32.441139,-86.491124 32.441124,-86.490982 32.441101)\r\n1401;1499;all;Morningview Dr;Autauga;AL;36067;LINESTRING(-86.504028 32.459535,-86.504031 32.459681,-86.504054 32.460192,-86.504057 32.46039)\r\n399;305;odd;Larry St;Autauga;AL;36067;LINESTRING(-86.489015 32.436369,-86.488954 32.436266)\r\n308;306;even;Larry St;Autauga;AL;36067;LINESTRING(-86.488841 32.436443,-86.48878 32.43634)\r\n4045;4001;odd;Fig Tree Dr;Autauga;AL;36749;LINESTRING(-86.843886 32.503028,-86.843983 32.502825,-86.844004 32.502736,-86.844001 32.50263,-86.84397 32.502539,-86.843823 32.502428,-86.843774 32.502377,-86.843737 32.502324,-86.843712 32.502274,-86.843667 32.502125)\r\n4044;4000;even;Fig Tree Dr;Autauga;AL;36749;LINESTRING(-86.843704 32.502971,-86.843783 32.502775,-86.843798 32.502724,-86.843787 32.502666,-86.843772 32.502643,-86.843673 32.502542,-86.843612 32.502481,-86.843549 32.50241,-86.84351 32.502326,-86.843477 32.502159)\r\n398;300;even;Martin Hill Ln;Autauga;AL;36703;LINESTRING(-86.881309 32.491743,-86.881318 32.491782,-86.881375 32.491924,-86.881427 32.492045,-86.881411 32.492062,-86.881397 32.492083,-86.881355 32.492103,-86.881211 32.492139,-86.880963 32.492176,-86.8808 32.49219,-86.880635 32.492195,-86.880123 32.492178,-86.879604 32.492154,-86.879249 32.492142,-86.879055 32.492154,-86.878866 32.492212,-86.878708 32.492311,-86.878582 32.492432,-86.878481 32.492562,-86.87839 32.492696,-86.87832 32.492843,-86.878275 32.492994,-86.878247 32.493148,-86.878228 32.493432,-86.878185 32.49354,-86.878104 32.493645,-86.877995 32.493751,-86.877846 32.493881,-86.877738 32.493955,-86.877638 32.494001,-86.877308 32.494099)\r\n399;301;odd;Martin Hill Ln;Autauga;AL;36703;LINESTRING(-86.881496 32.491699,-86.88151 32.491732,-86.881563 32.491866,-86.881639 32.492021,-86.881635 32.492154,-86.881527 32.492235,-86.881429 32.492275,-86.881253 32.492303,-86.880991 32.492346,-86.880812 32.49236,-86.880633 32.492361,-86.880113 32.492344,-86.879596 32.49232,-86.879257 32.492312,-86.879105 32.492332,-86.878968 32.492376,-86.87885 32.492445,-86.878746 32.49254,-86.878653 32.492652,-86.878576 32.492772,-86.878516 32.492897,-86.878475 32.493028,-86.878451 32.493164,-86.878444 32.493464,-86.878385 32.493628,-86.87826 32.493753,-86.878141 32.493865,-86.877986 32.494001,-86.877862 32.494113,-86.877712 32.494161,-86.87737 32.494255)\r\n1106;1154;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.434842 32.437897,-86.434572 32.437926,-86.43448 32.437935,-86.432869 32.438092,-86.432224 32.438142)\r\n1900;1932;even;Autauga County 107;Autauga;AL;36066;LINESTRING(-86.45824 32.579581,-86.458243 32.580117,-86.458238 32.580407,-86.458246 32.580915,-86.458256 32.581275,-86.458258 32.58214,-86.458244 32.583075,-86.45822 32.583721,-86.458219 32.583816)\r\n1907;1961;odd;Autauga County 107;Autauga;AL;36066;LINESTRING(-86.458435 32.57958,-86.458439 32.580119,-86.458432 32.580407,-86.458442 32.580911,-86.458454 32.581273,-86.458454 32.58214,-86.45844 32.583079,-86.458416 32.583725,-86.458414 32.583819)\r\n1928;1900;all;Suncrest Dr;Autauga;AL;36067;LINESTRING(-86.524076 32.5594,-86.524043 32.559305,-86.523993 32.559168,-86.523936 32.55903,-86.523889 32.558894,-86.523852 32.558796)\r\n1399;1361;odd;Reed St;Autauga;AL;36067;LINESTRING(-86.508155 32.468391,-86.508157 32.468378,-86.508099 32.468366,-86.507874 32.468259,-86.507719 32.468197,-86.507567 32.46813,-86.507102 32.467932,-86.506858 32.467845,-86.506696 32.467795)\r\n1398;1364;even;Reed St;Autauga;AL;36067;LINESTRING(-86.508145 32.468555,-86.508101 32.468566,-86.508007 32.468516,-86.507782 32.468409,-86.507629 32.468347,-86.507477 32.468278,-86.507018 32.468086,-86.506784 32.468001,-86.506627 32.467949)\r\n500;598;even;Graff Rd;Autauga;AL;36022;LINESTRING(-86.418131 32.507997,-86.417861 32.507972,-86.417442 32.507918,-86.41694 32.507835,-86.416598 32.507789,-86.416005 32.50772,-86.415423 32.507637,-86.415241 32.507608)\r\n501;599;odd;Graff Rd;Autauga;AL;36022;LINESTRING(-86.418112 32.508161,-86.417835 32.50814,-86.417408 32.508084,-86.416906 32.507999,-86.41657 32.507953,-86.415975 32.507886,-86.415387 32.507801,-86.415204 32.507769)\r\n698;622;all;Castle Brook Dr;Autauga;AL;36066;LINESTRING(-86.412845 32.470667,-86.412804 32.47064,-86.412799 32.470567)\r\n401;407;all;Buena Vista Way;Autauga;AL;36067;LINESTRING(-86.451865 32.430835,-86.45162 32.430839)\r\n1404;1408;all;Breakfast Creek Rd;Autauga;AL;36067;LINESTRING(-86.497595 32.511852,-86.497606 32.51223,-86.497583 32.512663,-86.497574 32.512738,-86.49756 32.512879,-86.497523 32.513092,-86.497508 32.513231)\r\n637;601;all;Autauga County 97;Autauga;AL;36749;LINESTRING(-86.830303 32.538397,-86.830315 32.538403,-86.830555 32.53847,-86.830697 32.538526,-86.830905 32.538636,-86.831104 32.538763,-86.831362 32.538944,-86.831485 32.539039,-86.831721 32.539242,-86.832005 32.539506,-86.832168 32.539671,-86.832264 32.539783,-86.832395 32.539962,-86.832462 32.540064)\r\n2000;2036;even;Alpha Springs Rd;Autauga;AL;36066;LINESTRING(-86.456301 32.539143,-86.455961 32.539356,-86.45508 32.539929,-86.452403 32.541719,-86.45166 32.542213)\r\n2001;2023;odd;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.456417 32.539276,-86.456079 32.539488,-86.4552 32.540059,-86.452523 32.541849,-86.45178 32.542342)\r\n1700;1798;even;Pearson Rd;Autauga;AL;36067;LINESTRING(-86.46859 32.541909,-86.468588 32.541945,-86.468722 32.542068,-86.468846 32.542165,-86.468891 32.542212,-86.468919 32.542259,-86.46896 32.542376,-86.468981 32.542586,-86.468992 32.542661,-86.469037 32.54288,-86.469133 32.543159,-86.469168 32.543295,-86.469188 32.543428,-86.469191 32.543563,-86.469175 32.543699,-86.469158 32.543758,-86.469102 32.543877,-86.46902 32.543986,-86.4689 32.544098,-86.468804 32.544252,-86.4688 32.544435,-86.468919 32.544653,-86.468996 32.544782,-86.469024 32.544841,-86.469069 32.54497,-86.4691 32.545106,-86.469117 32.545242,-86.469123 32.54538,-86.469097 32.545955,-86.469054 32.546457,-86.469034 32.546593,-86.468972 32.546775,-86.468776 32.546951,-86.46865 32.547012,-86.468499 32.547062,-86.468325 32.547101,-86.468151 32.547195,-86.468049 32.547349,-86.46799 32.547575,-86.467942 32.547866,-86.467925 32.548016,-86.467907 32.548416,-86.467885 32.548589,-86.467859 32.54888,-86.467844 32.549241,-86.46783 32.549406,-86.467833 32.549533,-86.467823 32.549671,-86.467795 32.549882,-86.467766 32.55002,-86.467726 32.550149,-86.467667 32.550272,-86.467568 32.550404,-86.467569 32.550486)\r\n1701;1751;odd;Pearson Rd;Autauga;AL;36067;LINESTRING(-86.468776 32.54186,-86.468788 32.541851,-86.468872 32.541948,-86.468998 32.542045,-86.469061 32.54211,-86.469121 32.542187,-86.46917 32.542346,-86.469181 32.54257,-86.46919 32.542635,-86.469235 32.542842,-86.469325 32.543117,-86.46937 32.543263,-86.469394 32.543416,-86.469393 32.543571,-86.469377 32.543725,-86.46936 32.543806,-86.469294 32.543963,-86.469182 32.54409,-86.469082 32.544198,-86.469028 32.5443,-86.469022 32.544401,-86.469101 32.544581,-86.46918 32.54471,-86.469216 32.544783,-86.469267 32.54493,-86.469302 32.545082,-86.469319 32.545232,-86.469319 32.545382,-86.469295 32.545965,-86.469252 32.546471,-86.469236 32.546621,-86.469184 32.546871,-86.468908 32.547103,-86.468732 32.547172,-86.468565 32.547222,-86.468421 32.547269,-86.468321 32.547331,-86.468253 32.547419,-86.46819 32.547609,-86.46814 32.547886,-86.468125 32.548026,-86.468109 32.548428,-86.468083 32.548605,-86.468057 32.54889,-86.468042 32.549249,-86.46803 32.54941,-86.468031 32.549535,-86.468025 32.549685,-86.467991 32.549906,-86.467964 32.550054,-86.467924 32.550203,-86.467853 32.550348,-86.467784 32.550466,-86.467762 32.550509)\r\n301;399;all;Cheeks Ln;Autauga;AL;36067;LINESTRING(-86.481886 32.542004,-86.481945 32.542033,-86.482022 32.542192,-86.48209 32.542295,-86.48215 32.542361,-86.482257 32.542456)\r\n801;899;all;Criddle Rd;Autauga;AL;36067;LINESTRING(-86.573794 32.575826,-86.573813 32.576021,-86.573835 32.576312,-86.573876 32.577036,-86.573904 32.577469,-86.573906 32.577611,-86.573874 32.578333,-86.573865 32.578979,-86.573856 32.579117,-86.573829 32.579323,-86.573803 32.579456,-86.573783 32.57951,-86.57378 32.579532)\r\n317;301;odd;Tapia Ln;Autauga;AL;36067;LINESTRING(-86.552437 32.403342,-86.552465 32.4019)\r\n310;300;even;Tapia Ln;Autauga;AL;36067;LINESTRING(-86.552242 32.403339,-86.55227 32.401897)\r\n198;180;all;Autauga County 40;Autauga;AL;36067;LINESTRING(-86.476069 32.573773,-86.475262 32.574405)\r\n1222;1398;even;Autauga County 42;Autauga;AL;36067;LINESTRING(-86.609003 32.619152,-86.610272 32.619128,-86.61285 32.619103,-86.614131 32.619097,-86.614548 32.61909,-86.614962 32.619089,-86.615385 32.619093,-86.616684 32.619079,-86.617111 32.619085,-86.617696 32.619077,-86.618121 32.619082,-86.619496 32.619102,-86.619833 32.619099,-86.620249 32.6191,-86.621448 32.619072,-86.621619 32.619072,-86.622287 32.619082,-86.622691 32.619094,-86.623131 32.619079,-86.624846 32.619062,-86.626083 32.619076)\r\n1237;1399;odd;Autauga County 42;Autauga;AL;36067;LINESTRING(-86.608999 32.618988,-86.610268 32.618962,-86.612848 32.618937,-86.614129 32.618931,-86.614546 32.618924,-86.614964 32.618923,-86.615385 32.618929,-86.616684 32.618915,-86.617111 32.618921,-86.617696 32.618913,-86.618123 32.618916,-86.619496 32.618938,-86.619831 32.618933,-86.620247 32.618934,-86.621446 32.618906,-86.621621 32.618906,-86.622293 32.618916,-86.622691 32.618928,-86.623125 32.618911,-86.624846 32.618898,-86.626085 32.618911)\r\n804;800;all;Stonewall Dr;Autauga;AL;36067;LINESTRING(-86.446071 32.451939,-86.446126 32.451863,-86.446202 32.451744,-86.446231 32.451684,-86.446255 32.451623,-86.446266 32.451597)\r\n2700;2750;even;Autauga County 57;Autauga;AL;36051;LINESTRING(-86.533065 32.653314,-86.533063 32.653348,-86.533132 32.653647,-86.533363 32.654873,-86.533438 32.65523,-86.533588 32.656081,-86.533625 32.656367,-86.533642 32.656582,-86.533653 32.656941,-86.533637 32.657445,-86.533623 32.657659,-86.533539 32.658594,-86.533528 32.658819)\r\n2701;2751;odd;Autauga County 57;Autauga;AL;36051;LINESTRING(-86.53326 32.653302,-86.533267 32.653326,-86.533326 32.653619,-86.533557 32.654845,-86.533634 32.655202,-86.533786 32.656059,-86.533823 32.656353,-86.533842 32.656574,-86.533849 32.656941,-86.533835 32.657451,-86.533819 32.657671,-86.533737 32.658604,-86.533723 32.658827)\r\n598;514;all;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.682409 32.366527,-86.682426 32.366642,-86.682478 32.366905,-86.683037 32.369321,-86.683062 32.369472,-86.683077 32.369621,-86.683079 32.369772,-86.683065 32.37007,-86.682951 32.371094,-86.682892 32.37153,-86.682369 32.374559,-86.681748 32.378345,-86.681714 32.378491,-86.681673 32.37863,-86.681633 32.378778,-86.681546 32.379035,-86.681499 32.379176,-86.681492 32.379201,-86.681482 32.379227)\r\n303;301;all;Festival Dr;Autauga;AL;36067;LINESTRING(-86.462484 32.447498,-86.462644 32.447496)\r\n2700;2798;even;Manasco;Autauga;AL;36066;LINESTRING(-86.415993 32.444217,-86.415995 32.444149,-86.415653 32.443798,-86.41539 32.443529,-86.415156 32.443291,-86.414937 32.44324,-86.414799 32.443222,-86.414418 32.443255)\r\n2701;2799;odd;Manasco;Autauga;AL;36066;LINESTRING(-86.415802 32.444248,-86.415781 32.444231,-86.415499 32.443902,-86.41524 32.443639,-86.415026 32.443459,-86.414885 32.44341,-86.414791 32.443392,-86.414437 32.443419)\r\n1700;1798;even;Twelve Oaks Ct;Autauga;AL;36066;LINESTRING(-86.423134 32.464285,-86.423107 32.464367,-86.423064 32.464484,-86.423024 32.464646)\r\n101;199;odd;Twelve Oaks Ct;Autauga;AL;36066;LINESTRING(-86.423322 32.464325,-86.423299 32.464413,-86.423258 32.464528,-86.423213 32.464683)\r\n199;101;odd;Cherokee Dr;Autauga;AL;36067;LINESTRING(-86.518193 32.462455,-86.518236 32.462414,-86.518356 32.462304,-86.518628 32.46201,-86.518739 32.461898,-86.519132 32.461517,-86.519307 32.461372,-86.519437 32.461297,-86.519662 32.461215,-86.519813 32.461186,-86.52006 32.461172,-86.5206 32.461196)\r\n100;198;even;Cherokee Dr;Autauga;AL;36067;LINESTRING(-86.518042 32.462352,-86.518084 32.462304,-86.518202 32.462194,-86.518476 32.461906,-86.518589 32.46179,-86.518984 32.461403,-86.519171 32.461234,-86.519335 32.461141,-86.519596 32.461043,-86.519787 32.46101,-86.520062 32.461006,-86.520611 32.461032)\r\n697;699;all;Clarks Landing Rd;Autauga;AL;36003;LINESTRING(-86.636465 32.419863,-86.636463 32.419853)\r\n2101;2199;all;Autauga County 77;Autauga;AL;36006;LINESTRING(-86.691583 32.626288,-86.691583 32.626301,-86.691586 32.626388,-86.691621 32.62759,-86.691628 32.627955,-86.691615 32.629033,-86.691622 32.62954,-86.691619 32.630122,-86.691605 32.630343,-86.691586 32.630493,-86.691558 32.63064,-86.691508 32.630854,-86.691395 32.631278,-86.691359 32.631489,-86.691344 32.631625,-86.691369 32.63183,-86.691403 32.631961,-86.691428 32.632021,-86.691533 32.632206,-86.691623 32.632322,-86.692098 32.632813,-86.692271 32.632985,-86.692438 32.633153,-86.692531 32.633282,-86.692933 32.633919,-86.693316 32.634563,-86.69371 32.635201,-86.694099 32.63584,-86.694402 32.636356,-86.694472 32.636492,-86.6946 32.636759,-86.694659 32.636898,-86.69471 32.637039,-86.694796 32.637325,-86.694993 32.638175,-86.695034 32.638311,-86.695085 32.638446,-86.695143 32.638576,-86.695212 32.638705,-86.695289 32.638833,-86.695371 32.638957,-86.695544 32.639199,-86.69575 32.639471)\r\n2823;2899;all;River Bend Rd;Autauga;AL;36003;LINESTRING(-86.675992 32.359526,-86.676401 32.359185,-86.677369 32.358454,-86.677757 32.358167,-86.67813 32.357868,-86.678247 32.357765,-86.678355 32.357659,-86.678669 32.357308,-86.678907 32.357088,-86.679031 32.35698,-86.679165 32.356882,-86.679299 32.356786,-86.679436 32.356694,-86.679576 32.356606,-86.679726 32.356523,-86.679887 32.356451,-86.680057 32.356398,-86.680228 32.356355,-86.680559 32.356289,-86.680712 32.356248,-86.680858 32.356194,-86.681143 32.35605,-86.681823 32.355619,-86.681967 32.355534,-86.682115 32.355454,-86.682267 32.355375,-86.682427 32.355306,-86.682589 32.355238,-86.682757 32.355185,-86.683093 32.355097,-86.683267 32.355062,-86.683446 32.355033,-86.68363 32.355031,-86.683808 32.355039,-86.684319 32.355073,-86.684478 32.355078,-86.684785 32.355053,-86.684864 32.355043)\r\n1078;1098;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.444977 32.453178,-86.444886 32.453084)\r\n199;101;odd;Thornton Ct;Autauga;AL;36066;LINESTRING(-86.422919 32.471496,-86.423007 32.471614,-86.423011 32.471618)\r\n198;100;even;Thornton Ct;Autauga;AL;36066;LINESTRING(-86.423083 32.471408,-86.423173 32.471526,-86.423176 32.471532)\r\n299;201;odd;Avant St;Autauga;AL;36067;LINESTRING(-86.486371 32.436397,-86.486248 32.436163,-86.485703 32.435273)\r\n298;100;even;Avant St;Autauga;AL;36067;LINESTRING(-86.486194 32.436465,-86.486068 32.436237,-86.48553 32.435348)\r\n1066;1062;all;Old Ridge Rd;Autauga;AL;36066;LINESTRING(-86.443602 32.494702,-86.443722 32.494697)\r\n999;901;odd;Eason Brown Rd;Autauga;AL;36067;LINESTRING(-86.609814 32.658878,-86.60927 32.658885,-86.608438 32.658884,-86.607655 32.658914,-86.606558 32.658945,-86.605688 32.658914,-86.604825 32.658925,-86.604144 32.658925,-86.603523 32.658935,-86.602456 32.658939)\r\n998;900;even;Eason Brown Rd;Autauga;AL;36067;LINESTRING(-86.609817 32.659042,-86.609272 32.659051,-86.608442 32.659052,-86.607663 32.65908,-86.606558 32.659111,-86.605686 32.65908,-86.604827 32.659091,-86.604146 32.659091,-86.603525 32.659101,-86.602457 32.659104)\r\n707;701;all;Allenville Rd;Autauga;AL;36067;LINESTRING(-86.497806 32.464563,-86.497756 32.464603,-86.497382 32.464895,-86.497255 32.464983,-86.497121 32.465063,-86.496542 32.465376,-86.496401 32.465467,-86.496133 32.465649,-86.495863 32.465821,-86.495726 32.465898,-86.495577 32.465969,-86.495536 32.465989)\r\n1100;1124;even;Wright St;Autauga;AL;36066;LINESTRING(-86.446622 32.465969,-86.446602 32.465972,-86.446447 32.466008,-86.446032 32.466093,-86.445852 32.466138)\r\n1101;1199;odd;Wright St;Autauga;AL;36066;LINESTRING(-86.446679 32.466126,-86.446656 32.466134,-86.446495 32.466168,-86.446082 32.466255,-86.445905 32.466296)\r\n422;498;even;Hallmark Dr;Autauga;AL;36067;LINESTRING(-86.461859 32.45595,-86.461865 32.455951,-86.461962 32.455958,-86.462071 32.455947,-86.462172 32.455915,-86.462263 32.455868,-86.462343 32.455812,-86.462414 32.455749,-86.462471 32.455672,-86.46252 32.45559,-86.46255 32.455433,-86.462584 32.455211,-86.462606 32.454986)\r\n427;499;odd;Hallmark Dr;Autauga;AL;36067;LINESTRING(-86.461867 32.455786,-86.461875 32.455785,-86.461952 32.455786,-86.462017 32.455773,-86.462082 32.455753,-86.462143 32.455724,-86.462201 32.455684,-86.462248 32.455639,-86.462289 32.455588,-86.462314 32.455534,-86.462352 32.455405,-86.462386 32.455193,-86.462412 32.454972)\r\n999;901;odd;Strickland Landing Rd;Autauga;AL;36003;LINESTRING(-86.639596 32.407749,-86.63839 32.406529,-86.6379 32.406027,-86.637751 32.405856,-86.637662 32.405737,-86.636849 32.404472,-86.636782 32.404345,-86.636756 32.404282,-86.636733 32.404216,-86.636688 32.40399,-86.636657 32.403977)\r\n956;900;even;Strickland Landing Rd;Autauga;AL;36003;LINESTRING(-86.639447 32.407854,-86.63824 32.406635,-86.637744 32.406131,-86.637583 32.405952,-86.63749 32.405821,-86.636667 32.404548,-86.636596 32.404407,-86.636564 32.404334,-86.636539 32.404258,-86.636478 32.404072,-86.636503 32.404078)\r\n1400;1598;even;Co Rd 127;Autauga;AL;36006;LINESTRING(-86.744218 32.607051,-86.744281 32.607114,-86.744749 32.607539,-86.744868 32.607711,-86.745057 32.607948,-86.745157 32.608106,-86.745212 32.608216,-86.745185 32.608323,-86.74513 32.608438,-86.745021 32.608592,-86.744964 32.608812,-86.745052 32.608896,-86.745139 32.608985,-86.745331 32.60911,-86.745543 32.609221,-86.745693 32.60928,-86.745759 32.609323,-86.745841 32.6094,-86.745918 32.609512,-86.746051 32.609799,-86.746176 32.61041,-86.746358 32.610726,-86.746708 32.611375,-86.747002 32.611761,-86.747488 32.612473,-86.747763 32.612735,-86.74807 32.613101,-86.748181 32.613259,-86.748289 32.613386,-86.748482 32.61358,-86.748691 32.613843,-86.748804 32.613945,-86.748939 32.613984,-86.749585 32.614319,-86.750062 32.614664,-86.750415 32.614871,-86.751313 32.615297,-86.752802 32.616059,-86.754096 32.616629,-86.754487 32.616871,-86.755143 32.617214,-86.756067 32.61759)\r\n1401;1499;odd;Co Rd 127;Autauga;AL;36006;LINESTRING(-86.744364 32.606942,-86.744427 32.607,-86.744925 32.607429,-86.745042 32.607621,-86.745233 32.607858,-86.745339 32.608032,-86.745422 32.608192,-86.745397 32.608377,-86.74531 32.608516,-86.745221 32.608662,-86.745168 32.608766,-86.745198 32.608778,-86.745285 32.608855,-86.745449 32.608968,-86.745641 32.609069,-86.745783 32.60913,-86.745907 32.609173,-86.746015 32.609302,-86.746104 32.609436,-86.746257 32.609749,-86.746384 32.610356,-86.746536 32.610658,-86.74689 32.611291,-86.747172 32.611673,-86.74766 32.612369,-86.747923 32.612629,-86.74824 32.613007,-86.748351 32.613165,-86.748449 32.613282,-86.748644 32.613476,-86.748853 32.613727,-86.74893 32.613783,-86.749033 32.613824,-86.749709 32.614177,-86.750188 32.614528,-86.750523 32.614725,-86.751413 32.615153,-86.7529 32.615911,-86.754208 32.616479,-86.754601 32.616729,-86.755241 32.617062,-86.756152 32.617442)\r\n2100;2324;even;Autauga County 77;Autauga;AL;36006;LINESTRING(-86.69575 32.639767,-86.696035 32.640122,-86.696313 32.640485,-86.69667 32.64098,-86.697189 32.641724,-86.69805 32.643047,-86.698273 32.64343,-86.698412 32.643692,-86.69854 32.643959,-86.698656 32.644229,-86.698812 32.644642,-86.698996 32.64519,-86.699035 32.645325,-86.699105 32.645603,-86.699197 32.646026,-86.699298 32.646593,-86.699328 32.646877,-86.69934 32.64716,-86.699333 32.6473,-86.69932 32.647441,-86.699301 32.647581,-86.699158 32.64836,-86.699061 32.648857,-86.698984 32.649212,-86.698882 32.649712,-86.698814 32.650146,-86.698805 32.650295,-86.698802 32.650441,-86.698806 32.650589,-86.698822 32.650739,-86.698905 32.651169,-86.698994 32.651523,-86.699187 32.652226,-86.699323 32.652747,-86.699371 32.652928,-86.699465 32.653277,-86.699721 32.654409,-86.699801 32.654835,-86.699871 32.655285,-86.699956 32.65584,-86.700015 32.656125)\r\n2201;2399;odd;Autauga County 77;Autauga;AL;36006;LINESTRING(-86.695911 32.639675,-86.696199 32.64003,-86.696481 32.640397,-86.696838 32.640894,-86.697361 32.641642,-86.698226 32.642969,-86.698453 32.643358,-86.698594 32.643626,-86.698726 32.643899,-86.698844 32.644175,-86.699002 32.644594,-86.699188 32.645148,-86.699227 32.645289,-86.699299 32.645571,-86.699393 32.645998,-86.699498 32.646573,-86.699528 32.646867,-86.699536 32.64716,-86.699531 32.64731,-86.699518 32.647457,-86.699497 32.647603,-86.699352 32.648386,-86.699255 32.648885,-86.699178 32.64924,-86.699078 32.649736,-86.699014 32.650162,-86.699003 32.650301,-86.698998 32.650441,-86.699006 32.650579,-86.699022 32.650717,-86.699101 32.651139,-86.699186 32.651487,-86.699379 32.65219,-86.699513 32.652711,-86.699561 32.652892,-86.699659 32.653243,-86.699917 32.654381,-86.699997 32.654811,-86.700065 32.655263,-86.700152 32.655814,-86.700208 32.656098)\r\n2332;2300;all;Ellis Dr;Autauga;AL;36003;LINESTRING(-86.657416 32.449792,-86.657349 32.4498,-86.657202 32.44979)\r\n2530;2598;all;Wyngate Dr;Autauga;AL;36067;LINESTRING(-86.520139 32.44268,-86.520107 32.442563,-86.520045 32.442274,-86.520012 32.442096)\r\n1343;1399;all;Autauga County 69;Autauga;AL;36067;LINESTRING(-86.644662 32.571338,-86.644978 32.571577,-86.645709 32.572169,-86.647273 32.573399,-86.647646 32.573697,-86.648015 32.574008,-86.648188 32.57418,-86.648294 32.574303,-86.648389 32.574429,-86.648477 32.574563,-86.648588 32.574765,-86.64865 32.574907,-86.648702 32.575051,-86.648762 32.575267,-86.648786 32.575417,-86.648799 32.575564,-86.648797 32.57578,-86.64876 32.576638,-86.648739 32.578064,-86.648727 32.578426)\r\n2498;2420;all;Autauga County 40;Autauga;AL;36006;LINESTRING(-86.772961 32.548941,-86.772882 32.548869,-86.772828 32.548825,-86.7727 32.548739,-86.772492 32.54862,-86.77235 32.548548,-86.772203 32.548483,-86.772052 32.548426,-86.771897 32.548378,-86.771819 32.548357,-86.771658 32.548324,-86.771495 32.5483,-86.771415 32.548294,-86.771167 32.548291,-86.771003 32.548303,-86.770841 32.548324,-86.770682 32.548356,-86.770526 32.548399,-86.77014 32.548534,-86.769443 32.54881,-86.768755 32.549092)\r\n1706;1708;all;E Bank Rd;Autauga;AL;36067;LINESTRING(-86.507085 32.543791,-86.507153 32.543918,-86.507248 32.544248)\r\n1902;1900;all;Autauga County 38;Autauga;AL;36067;LINESTRING(-86.708608 32.524742,-86.708557 32.524746,-86.708462 32.524732,-86.70829 32.524698,-86.707716 32.524544,-86.707389 32.524451,-86.707146 32.52437,-86.706609 32.524148,-86.706458 32.524094,-86.706304 32.52405,-86.706147 32.524016,-86.705987 32.523994,-86.705826 32.523983,-86.704982 32.524003,-86.704646 32.524024,-86.704399 32.524053,-86.704153 32.524096,-86.703664 32.524208,-86.703017 32.524386,-86.702921 32.524415)\r\n899;801;odd;Criddle Rd;Autauga;AL;36067;LINESTRING(-86.573638 32.5797,-86.573629 32.579699,-86.573522 32.579759,-86.573456 32.57978,-86.573374 32.579798,-86.573212 32.579793,-86.57287 32.579763,-86.572527 32.579747,-86.57227 32.579738,-86.572094 32.579737,-86.571998 32.579739,-86.571845 32.579779)\r\n898;844;even;Criddle Rd;Autauga;AL;36067;LINESTRING(-86.573769 32.579822,-86.573757 32.579839,-86.573624 32.579911,-86.573522 32.57996,-86.573386 32.57997,-86.573198 32.579963,-86.572854 32.579931,-86.572517 32.579913,-86.572266 32.579906,-86.572102 32.579907,-86.572032 32.579915,-86.571894 32.579938)\r\n100;198;even;Jordan Xing;Autauga;AL;36067;LINESTRING(-86.482268 32.487088,-86.482657 32.487121,-86.482841 32.487121,-86.483023 32.487099,-86.483114 32.487079,-86.483204 32.487058,-86.48328 32.487027,-86.483516 32.486956,-86.483599 32.486928,-86.483673 32.486911,-86.483831 32.486888,-86.483903 32.486883,-86.483974 32.486893,-86.484042 32.48691,-86.484106 32.486934,-86.48416 32.486968,-86.484204 32.487007,-86.484237 32.487054,-86.484263 32.487108,-86.484277 32.487169,-86.484292 32.487306,-86.484299 32.487513,-86.4843 32.487522)\r\n101;199;odd;Jordan Xing;Autauga;AL;36067;LINESTRING(-86.482286 32.486924,-86.482665 32.486951,-86.482825 32.486947,-86.482985 32.486929,-86.48306 32.486915,-86.48313 32.486894,-86.483204 32.486867,-86.483446 32.486798,-86.483529 32.486768,-86.483623 32.486739,-86.483811 32.486714,-86.483911 32.486713,-86.484014 32.486721,-86.484114 32.486742,-86.48421 32.48678,-86.4843 32.48683,-86.484374 32.486899,-86.484431 32.486976,-86.484463 32.487062,-86.484483 32.487147,-86.48449 32.487298,-86.484497 32.487517,-86.484494 32.487533)\r\n244;254;all;Golson Rd;Autauga;AL;36067;LINESTRING(-86.551716 32.44567,-86.552423 32.446945,-86.552569 32.447199)\r\n814;800;all;Strickland Landing Rd;Autauga;AL;36003;LINESTRING(-86.639786 32.407862,-86.639844 32.407877,-86.63996 32.407926,-86.640122 32.408001,-86.6402 32.408059,-86.640264 32.40812,-86.640322 32.408185,-86.640372 32.408259,-86.640405 32.408338,-86.640436 32.408416,-86.640441 32.408505,-86.640441 32.408595,-86.6404 32.408676,-86.640358 32.408753,-86.640298 32.408817,-86.640237 32.408877,-86.640144 32.408929)\r\n1339;1305;odd;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.417621 32.511744,-86.417664 32.511643,-86.417761 32.511437,-86.417844 32.511234,-86.418027 32.510823,-86.418132 32.510543,-86.418219 32.510263,-86.418284 32.509982,-86.418296 32.509889)\r\n1310;1300;even;Autauga County 39;Autauga;AL;36022;LINESTRING(-86.417437 32.511691,-86.417478 32.511585,-86.417575 32.511379,-86.41766 32.511178,-86.417839 32.510769,-86.41794 32.510497,-86.418023 32.510225,-86.418086 32.509954,-86.418103 32.509867)\r\n2734;2758;even;Autauga County 85;Autauga;AL;36022;LINESTRING(-86.424265 32.625073,-86.42425 32.625284,-86.424154 32.626506)\r\n2739;2763;odd;Autauga County 85;Autauga;AL;36022;LINESTRING(-86.424459 32.625082,-86.424446 32.625294,-86.424349 32.626517)\r\n900;948;all;Langford Ct;Autauga;AL;36067;LINESTRING(-86.460122 32.427369,-86.459699 32.42742,-86.459599 32.427451,-86.459516 32.427497,-86.459365 32.427581,-86.459218 32.427675,-86.459091 32.427793,-86.459041 32.427868,-86.459002 32.427947)\r\n298;200;all;Autauga County 45;Autauga;AL;36003;LINESTRING(-86.710055 32.42825,-86.710084 32.430444,-86.710082 32.431027,-86.710068 32.432195,-86.710076 32.432781,-86.710113 32.433661,-86.710111 32.434683,-86.710117 32.435122,-86.710142 32.435902)\r\n100;126;even;Shady Oak Ln;Autauga;AL;36066;LINESTRING(-86.436359 32.469621,-86.436355 32.469454,-86.436358 32.469166,-86.436355 32.468802,-86.436309 32.468438,-86.436151 32.467654,-86.436121 32.467493,-86.435966 32.466656,-86.435932 32.466509)\r\n101;125;odd;Shady Oak Ln;Autauga;AL;36066;LINESTRING(-86.436165 32.469626,-86.436159 32.469456,-86.436164 32.469166,-86.436153 32.468812,-86.436111 32.46846,-86.435959 32.46768,-86.435929 32.467519,-86.435772 32.466684,-86.435741 32.466539)\r\n2200;2210;even;Wynhaven Dr;Autauga;AL;36067;LINESTRING(-86.515205 32.449892,-86.51519 32.449795,-86.515162 32.449572,-86.515126 32.449423,-86.515064 32.449209,-86.515035 32.44907,-86.515012 32.448862,-86.515031 32.448651,-86.515072 32.448287,-86.515078 32.448064,-86.515072 32.447719,-86.515106 32.447522)\r\n2201;2299;odd;Wynhaven Dr;Autauga;AL;36067;LINESTRING(-86.515012 32.449915,-86.514994 32.449817,-86.514962 32.449598,-86.514932 32.449459,-86.514868 32.449245,-86.514831 32.449092,-86.514818 32.448862,-86.514835 32.448637,-86.514872 32.448277,-86.514884 32.448064,-86.514866 32.447707,-86.514914 32.447495)\r\n1100;1198;even;Gaddis Ave;Autauga;AL;36066;LINESTRING(-86.445844 32.461259,-86.4455 32.461255,-86.445159 32.461257,-86.444036 32.461258)\r\n1101;1199;odd;Gaddis Ave;Autauga;AL;36066;LINESTRING(-86.445841 32.461423,-86.4455 32.461419,-86.445161 32.461423,-86.444036 32.461422)\r\n2200;2312;even;Autauga County 61;Autauga;AL;36022;LINESTRING(-86.487657 32.591093,-86.487656 32.59116,-86.487664 32.591307,-86.487653 32.59218,-86.487664 32.593696,-86.487657 32.593908,-86.48765 32.593976,-86.487636 32.594041,-86.487616 32.594101,-86.487589 32.594161,-86.487554 32.594218,-86.487511 32.594273,-86.487411 32.59438,-86.487119 32.594638,-86.486685 32.594987,-86.486561 32.595096,-86.486454 32.595219,-86.486359 32.595348,-86.486193 32.595607,-86.485536 32.596707,-86.485196 32.597288,-86.485036 32.597536,-86.484861 32.597778,-86.484672 32.598012,-86.484522 32.59818,-86.484361 32.598342,-86.483668 32.59897,-86.483433 32.599173,-86.483068 32.599468,-86.482814 32.599653,-86.482143 32.60009,-86.481937 32.60021,-86.481796 32.600281,-86.481649 32.600343,-86.481579 32.600366,-86.481504 32.600384,-86.481346 32.600407,-86.481164 32.600422)\r\n2201;2407;odd;Autauga County 61;Autauga;AL;36022;LINESTRING(-86.487852 32.591092,-86.487854 32.591156,-86.487862 32.591305,-86.487849 32.59218,-86.48786 32.593696,-86.487859 32.593918,-86.48785 32.593998,-86.487836 32.594077,-86.487812 32.594157,-86.487773 32.594233,-86.487728 32.594304,-86.487679 32.594373,-86.487565 32.594494,-86.487259 32.594758,-86.486827 32.595107,-86.486719 32.595208,-86.486622 32.595315,-86.486533 32.595434,-86.486369 32.595685,-86.485712 32.596781,-86.485372 32.597364,-86.48521 32.59762,-86.485029 32.59787,-86.484834 32.59811,-86.48468 32.598286,-86.484509 32.598454,-86.48381 32.599084,-86.483573 32.599291,-86.483202 32.599592,-86.482942 32.599785,-86.482261 32.600226,-86.482045 32.600352,-86.481894 32.600429,-86.481733 32.600501,-86.481643 32.60053,-86.48155 32.600552,-86.481372 32.600579,-86.481178 32.600586)\r\n162;186;all;Autauga County 20;Autauga;AL;36051;LINESTRING(-86.482881 32.700917,-86.482747 32.700934,-86.482412 32.700998,-86.481332 32.701209,-86.480669 32.701346,-86.480514 32.701377)\r\n1299;1251;all;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.464766 32.500075,-86.464838 32.499772,-86.464998 32.498847,-86.465117 32.498132,-86.465256 32.497355,-86.465348 32.496928,-86.46545 32.496508,-86.465527 32.496227,-86.466209 32.493693,-86.466241 32.493552,-86.466543 32.492422,-86.466652 32.492,-86.466769 32.491575,-86.46683 32.491331)\r\n1699;1601;all;Windstone Way;Autauga;AL;36066;LINESTRING(-86.429892 32.468221,-86.429939 32.468206,-86.430166 32.468137,-86.430316 32.468103,-86.430469 32.468084,-86.43072 32.468084,-86.430988 32.46805,-86.431159 32.468001,-86.431643 32.467868,-86.431874 32.467811)\r\n126;240;even;Autauga County 68;Autauga;AL;36022;LINESTRING(-86.479653 32.65741,-86.479484 32.657466,-86.479161 32.657568,-86.478686 32.657735,-86.476724 32.658448,-86.476408 32.658569,-86.476101 32.658709,-86.475731 32.658898,-86.475449 32.65907,-86.475243 32.659205,-86.474975 32.659394,-86.474786 32.659541,-86.474053 32.66015,-86.473806 32.660348,-86.473554 32.660542,-86.473298 32.660728,-86.473242 32.660767)\r\n173;241;odd;Autauga County 68;Autauga;AL;36022;LINESTRING(-86.479725 32.657563,-86.479556 32.657622,-86.479233 32.657724,-86.478762 32.657887,-86.476804 32.6586,-86.476498 32.658721,-86.476201 32.658855,-86.475843 32.65904,-86.475567 32.659204,-86.475367 32.659335,-86.475107 32.65952,-86.474922 32.659663,-86.474189 32.66027,-86.47394 32.66047,-86.473686 32.660666,-86.473424 32.660856,-86.473364 32.660895)\r\n4228;4242;even;Autauga County 60;Autauga;AL;36749;LINESTRING(-86.856929 32.569768,-86.856926 32.56977,-86.857248 32.56985,-86.857487 32.569919,-86.857965 32.570076,-86.858115 32.570135,-86.858799 32.570445,-86.85943 32.570683,-86.859733 32.570805,-86.859953 32.570908,-86.860165 32.571021,-86.860361 32.571147,-86.860481 32.57124,-86.860534 32.571288,-86.860653 32.571408)\r\n4257;4299;odd;Autauga County 60;Autauga;AL;36749;LINESTRING(-86.856971 32.569607,-86.856976 32.569606,-86.857308 32.56969,-86.857555 32.569761,-86.858043 32.56992,-86.858205 32.569983,-86.858889 32.570293,-86.859512 32.570533,-86.859825 32.570653,-86.860055 32.570762,-86.860281 32.570879,-86.860491 32.571015,-86.860623 32.571118,-86.860686 32.571176,-86.860805 32.571304)\r\n100;110;even;Richmond Way;Autauga;AL;36066;LINESTRING(-86.442369 32.471278,-86.442378 32.471262,-86.442387 32.471097,-86.442389 32.470948,-86.442386 32.47076)\r\n107;199;odd;Richmond Way;Autauga;AL;36066;LINESTRING(-86.442178 32.471251,-86.442174 32.471242,-86.442189 32.471091,-86.442193 32.470948,-86.442191 32.470761)\r\n3698;3600;even;Red Cross Rd;Autauga;AL;36003;LINESTRING(-86.795859 32.464632,-86.795871 32.464696,-86.795909 32.464982,-86.795947 32.46558)\r\n3699;3601;odd;Red Cross Rd;Autauga;AL;36703;LINESTRING(-86.796048 32.464592,-86.796077 32.464666,-86.796107 32.46497,-86.796141 32.465572)\r\n100;108;all;Sheila Blvd;Autauga;AL;36066;LINESTRING(-86.430011 32.442956,-86.430111 32.442816,-86.430562 32.442397,-86.430763 32.442186,-86.430796 32.442173)\r\n207;201;odd;Gail St;Autauga;AL;36066;LINESTRING(-86.438626 32.468563,-86.438603 32.46843,-86.438539 32.468003,-86.438524 32.467856,-86.438482 32.467672)\r\n208;200;even;Gail St;Autauga;AL;36066;LINESTRING(-86.438433 32.468589,-86.438407 32.468454,-86.438343 32.468021,-86.438324 32.46788,-86.43829 32.467701)\r\n1700;1734;all;Bridge Creek Rd;Autauga;AL;36067;LINESTRING(-86.51332 32.540058,-86.513386 32.540193,-86.514421 32.542182,-86.514555 32.542447,-86.514647 32.542646,-86.514753 32.542916,-86.514779 32.542989)\r\n1805;1801;odd;Briarwood St;Autauga;AL;36066;LINESTRING(-86.420857 32.464238,-86.421084 32.464241,-86.421502 32.464239,-86.421672 32.464251)\r\n398;300;even;Briarwood St;Autauga;AL;36066;LINESTRING(-86.42086 32.464074,-86.421084 32.464077,-86.421512 32.464067,-86.421694 32.464088)\r\n1099;1091;odd;Arrowhead Dr;Autauga;AL;36067;LINESTRING(-86.517367 32.459193,-86.51748 32.459195,-86.517754 32.45919,-86.518626 32.459181,-86.520339 32.459159,-86.521191 32.459153,-86.521203 32.459151)\r\n1088;1082;even;Arrowhead Dr;Autauga;AL;36067;LINESTRING(-86.517373 32.459028,-86.51748 32.459031,-86.51775 32.459024,-86.518624 32.459017,-86.520337 32.458993,-86.521185 32.458985,-86.521194 32.458986)\r\n1511;1503;odd;High Place Dr;Autauga;AL;36067;LINESTRING(-86.506095 32.46104,-86.506022 32.460964,-86.505867 32.46081,-86.505713 32.460621,-86.505588 32.460515,-86.505434 32.460443,-86.505096 32.460369,-86.504642 32.460393,-86.504101 32.460425)\r\n1506;1502;even;High Place Dr;Autauga;AL;36067;LINESTRING(-86.505946 32.461145,-86.505872 32.461072,-86.505707 32.460916,-86.505553 32.460737,-86.505458 32.460663,-86.505352 32.460613,-86.505074 32.460549,-86.504654 32.460559,-86.504114 32.460589)\r\n901;907;all;Skidmore Ave;Autauga;AL;36066;LINESTRING(-86.450958 32.475422,-86.450714 32.475431,-86.450693 32.475429)\r\n203;109;odd;N Autauga St;Autauga;AL;36003;LINESTRING(-86.652572 32.430593,-86.653162 32.431356,-86.653259 32.431484)\r\n206;200;even;N Autauga St;Autauga;AL;36003;LINESTRING(-86.652734 32.430503,-86.653328 32.431266,-86.653424 32.431397)\r\n1600;1698;even;Trolley Rd;Autauga;AL;36066;LINESTRING(-86.42162 32.488396,-86.421572 32.488442,-86.421473 32.488544,-86.421424 32.488591,-86.421374 32.488636,-86.421281 32.488716,-86.421233 32.488754,-86.421157 32.488794,-86.4211 32.488914)\r\n1601;1699;odd;Trolley Rd;Autauga;AL;36066;LINESTRING(-86.421768 32.488502,-86.421724 32.488548,-86.421625 32.488654,-86.421572 32.488701,-86.421524 32.488754,-86.421417 32.48884,-86.421361 32.48888,-86.421335 32.488914,-86.421273 32.488989)\r\n423;499;all;Oak Valley Rd;Autauga;AL;36022;LINESTRING(-86.443953 32.53712,-86.443977 32.537082,-86.444018 32.536932,-86.444061 32.53671,-86.444065 32.536559,-86.444067 32.536479,-86.444044 32.53633,-86.443983 32.536045,-86.443956 32.535835,-86.443927 32.535407,-86.443917 32.534906,-86.443927 32.53477,-86.44395 32.534629,-86.443957 32.534552,-86.443956 32.53447,-86.443942 32.534391,-86.443919 32.534313,-86.443886 32.534237,-86.443808 32.534103,-86.443561 32.533729,-86.443491 32.533606,-86.443463 32.533546,-86.443444 32.533485,-86.443432 32.533421,-86.443408 32.533139,-86.443415 32.533001,-86.443457 32.532714,-86.443459 32.532563,-86.443426 32.532272,-86.44342 32.532127,-86.443415 32.532048,-86.443391 32.531964,-86.443344 32.531885,-86.443284 32.531818,-86.443104 32.531654,-86.442687 32.531289,-86.442581 32.531184,-86.442576 32.531185)\r\n199;111;odd;Larry St;Autauga;AL;36067;LINESTRING(-86.487637 32.434125,-86.487531 32.433933,-86.487334 32.433625)\r\n198;112;even;Larry St;Autauga;AL;36067;LINESTRING(-86.487461 32.434196,-86.487353 32.434009,-86.487162 32.433703)\r\n199;101;odd;Sweet Meadow Ct;Autauga;AL;36066;LINESTRING(-86.420723 32.46961,-86.42062 32.469529)\r\n198;100;even;Sweet Meadow Ct;Autauga;AL;36066;LINESTRING(-86.420591 32.46973,-86.420488 32.469649)\r\n1588;1572;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.536391 32.43054,-86.536134 32.430539,-86.536046 32.430539,-86.533642 32.430529,-86.533023 32.430532)\r\n717;677;odd;Lower Kingston Rd;Autauga;AL;36067;LINESTRING(-86.486768 32.470363,-86.486467 32.470097)\r\n718;700;even;Lower Kingston Rd;Autauga;AL;36067;LINESTRING(-86.486628 32.470477,-86.486327 32.470211)\r\n722;798;all;Pinetuckett Pkwy;Autauga;AL;36022;LINESTRING(-86.468089 32.601012,-86.468519 32.601258)\r\n1599;1539;odd;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.532728 32.430372,-86.532413 32.430379,-86.532084 32.430381,-86.53097 32.430411,-86.527461 32.430487,-86.527297 32.430488)\r\n1570;1532;even;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.532734 32.430536,-86.532417 32.430545,-86.532088 32.430547,-86.530976 32.430575,-86.527463 32.430653,-86.527297 32.430652)\r\n1800;1856;even;Maul Dr;Autauga;AL;36006;LINESTRING(-86.7316 32.639793,-86.730801 32.641152,-86.730649 32.641414,-86.730438 32.641812,-86.730298 32.642082,-86.730003 32.642763,-86.729895 32.643039,-86.729881 32.643081)\r\n1801;1823;odd;Maul Dr;Autauga;AL;36006;LINESTRING(-86.731774 32.639866,-86.730977 32.641224,-86.730829 32.641484,-86.730618 32.641878,-86.730484 32.642144,-86.730189 32.642819,-86.730083 32.643089,-86.730067 32.643129)\r\n300;302;even;Hunting Ridge Rd;Autauga;AL;36067;LINESTRING(-86.474212 32.452835,-86.474275 32.452652,-86.474298 32.452418,-86.474299 32.452199,-86.474293 32.451871)\r\n301;303;odd;Hunting Ridge Rd;Autauga;AL;36067;LINESTRING(-86.474024 32.452794,-86.474069 32.452622,-86.474096 32.452408,-86.474105 32.452199,-86.474098 32.451874)\r\n200;220;even;Tatum Rd;Autauga;AL;36066;LINESTRING(-86.451458 32.515248,-86.45101 32.515258,-86.449676 32.515317)\r\n201;299;odd;Tatum Rd;Autauga;AL;36066;LINESTRING(-86.451464 32.515413,-86.451018 32.515424,-86.449686 32.515482)\r\n101;199;all;Co Rd 4 E;Autauga;AL;36067;LINESTRING(-86.473286 32.431139,-86.471552 32.431166)\r\n1159;1299;odd;Old Hwy 31;Autauga;AL;36067;LINESTRING(-86.440152 32.450249,-86.440099 32.450204,-86.440044 32.45016)\r\n1182;1188;even;Old Hwy 31;Autauga;AL;36067;LINESTRING(-86.440023 32.450372,-86.439959 32.450328,-86.439904 32.450274)\r\n604;610;all;Sunset Dr;Autauga;AL;36067;LINESTRING(-86.447447 32.449831,-86.446692 32.449846)\r\n2597;2501;all;Rollins Rd;Autauga;AL;36051;LINESTRING(-86.417883 32.683635,-86.417892 32.684242,-86.41789 32.684321,-86.41788 32.684401,-86.417839 32.684551,-86.417724 32.684822,-86.417707 32.684882,-86.417697 32.684945,-86.417691 32.685009,-86.417699 32.68507,-86.417711 32.685131,-86.417731 32.685193,-86.417758 32.685253,-86.417791 32.685312,-86.41783 32.685369,-86.417874 32.685423,-86.417974 32.685529,-86.418206 32.685742,-86.418264 32.685806,-86.418313 32.685876,-86.418356 32.685947,-86.418389 32.686024,-86.418416 32.686103,-86.418437 32.686256,-86.418436 32.686408,-86.418435 32.686632,-86.41841 32.686784,-86.418372 32.686931,-86.418318 32.687077,-86.41816 32.687417,-86.418017 32.687681,-86.417922 32.687876,-86.417877 32.687981)\r\n2799;2715;odd;Dutch Bend St;Autauga;AL;36003;LINESTRING(-86.663129 32.430884,-86.6631 32.430941,-86.663031 32.431076,-86.662901 32.431349,-86.662765 32.431611,-86.662686 32.431732,-86.662643 32.431784,-86.662532 32.431889,-86.662416 32.431978,-86.662282 32.432063,-86.660562 32.433039,-86.660366 32.433152)\r\n2798;2712;even;Dutch Bend St;Autauga;AL;36003;LINESTRING(-86.663311 32.430941,-86.663286 32.431005,-86.663213 32.431142,-86.663083 32.431413,-86.662947 32.431687,-86.66286 32.431824,-86.662803 32.431892,-86.662678 32.432011,-86.662544 32.432114,-86.662394 32.432201,-86.660672 32.433175,-86.660475 32.433288)\r\n526;572;even;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.895375 32.545524,-86.895366 32.54561)\r\n501;583;odd;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.895569 32.545537,-86.89556 32.545623)\r\n2300;2318;all;Autauga County 38;Autauga;AL;36006;LINESTRING(-86.750982 32.545916,-86.750976 32.545912,-86.751036 32.546192,-86.751101 32.546617,-86.751134 32.546898,-86.751147 32.54711,-86.751137 32.547337)\r\n1057;1055;odd;2nd St;Autauga;AL;36703;LINESTRING(-86.796098 32.343071,-86.796053 32.34342,-86.79605 32.343554)\r\n1056;1054;even;2nd St;Autauga;AL;36703;LINESTRING(-86.796292 32.343088,-86.796253 32.343432,-86.796244 32.34356)\r\n1598;1546;all;Autauga County 10;Autauga;AL;36067;LINESTRING(-86.553145 32.50132,-86.552835 32.501474,-86.551669 32.502095,-86.551445 32.502208,-86.551288 32.50228,-86.550971 32.502403,-86.550723 32.502483,-86.550388 32.502572,-86.550135 32.502626,-86.549873 32.502661,-86.549528 32.5027,-86.549266 32.50271,-86.549252 32.502708)\r\n300;398;even;S Nichols St;Autauga;AL;36066;LINESTRING(-86.446221 32.464003,-86.446161 32.463808,-86.446075 32.463576)\r\n301;399;odd;S Nichols St;Autauga;AL;36066;LINESTRING(-86.446033 32.464045,-86.445971 32.463854,-86.445889 32.463624)\r\n1220;1100;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.429797 32.438641,-86.429996 32.438617,-86.430168 32.438579,-86.430616 32.438469)\r\n200;222;even;Gardenia Ct;Autauga;AL;36067;LINESTRING(-86.457052 32.471096,-86.457207 32.471126,-86.457413 32.471174,-86.457562 32.471222,-86.458781 32.471743,-86.458871 32.471778)\r\n201;225;odd;Gardenia Ct;Autauga;AL;36067;LINESTRING(-86.457092 32.470935,-86.457253 32.470962,-86.457477 32.471008,-86.457646 32.471066,-86.458867 32.471593,-86.458954 32.471629)\r\n1148;1160;all;Valridge W;Autauga;AL;36066;LINESTRING(-86.438311 32.501414,-86.43841 32.501414,-86.438431 32.501413)\r\n2099;2007;odd;Lambert Ln;Autauga;AL;36067;LINESTRING(-86.482026 32.573833,-86.482003 32.573886,-86.482006 32.573968,-86.482006 32.574054,-86.482001 32.574248,-86.482 32.574351,-86.481998 32.574449,-86.481998 32.574548,-86.48202 32.574644,-86.482077 32.574732,-86.482169 32.574789,-86.48227 32.574818,-86.482369 32.574816,-86.482463 32.574815,-86.482562 32.574811,-86.48267 32.574809,-86.482905 32.5748,-86.483024 32.574794,-86.483143 32.57479,-86.48326 32.574787,-86.483378 32.574785,-86.483493 32.574781,-86.483605 32.57478,-86.483718 32.574777,-86.48383 32.574776,-86.48394 32.574775,-86.484053 32.574774,-86.484169 32.574775,-86.484287 32.574774,-86.484402 32.574774,-86.484518 32.574776,-86.484635 32.574777,-86.484754 32.574777,-86.484872 32.574775,-86.484992 32.574775,-86.485109 32.574776,-86.485221 32.574778,-86.485331 32.574774,-86.485432 32.57475,-86.485525 32.574713,-86.485599 32.574643,-86.485619 32.574553,-86.485631 32.574472,-86.485623 32.574379,-86.485606 32.574278,-86.485595 32.574178,-86.48559 32.57407,-86.485587 32.573958,-86.485582 32.573844,-86.485578 32.573723,-86.485571 32.573604,-86.485566 32.573489,-86.485559 32.573379,-86.485554 32.573275,-86.485547 32.573176,-86.485544 32.573078,-86.485532 32.57298,-86.485511 32.572881,-86.485481 32.572783,-86.485428 32.572687,-86.485359 32.572601,-86.485284 32.572521,-86.485198 32.572439,-86.485155 32.572418)\r\n2098;2014;even;Lambert Ln;Autauga;AL;36067;LINESTRING(-86.482216 32.57387,-86.482213 32.57391,-86.482204 32.573972,-86.482202 32.574056,-86.482197 32.57425,-86.482196 32.574351,-86.482198 32.574445,-86.482208 32.574524,-86.482226 32.574576,-86.482249 32.574604,-86.482275 32.574623,-86.482314 32.574636,-86.482375 32.574646,-86.482459 32.574647,-86.482556 32.574645,-86.482664 32.574643,-86.482895 32.574634,-86.483016 32.574628,-86.483137 32.574626,-86.483254 32.574623,-86.48337 32.574619,-86.483487 32.574613,-86.483603 32.574614,-86.483714 32.574613,-86.483826 32.57461,-86.483938 32.574609,-86.484053 32.57461,-86.484169 32.574609,-86.484287 32.574608,-86.484404 32.574608,-86.48452 32.57461,-86.484635 32.574611,-86.484752 32.574611,-86.484872 32.574609,-86.484994 32.574611,-86.485109 32.574612,-86.485211 32.574608,-86.485291 32.574598,-86.485352 32.574582,-86.485383 32.574563,-86.485395 32.574549,-86.485417 32.574515,-86.485429 32.574466,-86.485423 32.574397,-86.485404 32.574296,-86.485399 32.574186,-86.485394 32.574076,-86.485391 32.573962,-86.485386 32.57385,-86.485382 32.573729,-86.485375 32.573612,-86.48537 32.573497,-86.485363 32.573387,-86.485358 32.573283,-86.485353 32.573184,-86.485344 32.573092,-86.485332 32.573004,-86.485313 32.572921,-86.485285 32.572845,-86.485246 32.572773,-86.485193 32.572701,-86.48513 32.572633,-86.485056 32.572569,-86.485035 32.572548)\r\n1700;1714;even;Pebble Creek Dr;Autauga;AL;36066;LINESTRING(-86.42533 32.462398,-86.424783 32.462326,-86.424315 32.462274)\r\n1601;1715;odd;Pebble Creek Dr;Autauga;AL;36066;LINESTRING(-86.4253 32.462561,-86.424755 32.46249,-86.42429 32.462437)\r\n799;701;odd;Cranbrook Ct;Autauga;AL;36067;LINESTRING(-86.462204 32.448083,-86.462225 32.448105,-86.462314 32.448153,-86.462421 32.44818)\r\n300;398;even;Cranbrook Ct;Autauga;AL;36067;LINESTRING(-86.462329 32.447957,-86.462347 32.447963,-86.462408 32.447993,-86.46249 32.448026)\r\n2322;2378;even;Big Springs Church Rd;Autauga;AL;36006;LINESTRING(-86.713422 32.65287,-86.713398 32.652888,-86.713365 32.652969,-86.713341 32.653045,-86.713325 32.653122,-86.713304 32.653269,-86.713289 32.653989,-86.713294 32.654139,-86.713326 32.654433,-86.713358 32.65459)\r\n2411;2439;odd;Big Springs Church Rd;Autauga;AL;36006;LINESTRING(-86.713586 32.652959,-86.713588 32.65297,-86.713559 32.653023,-86.713539 32.653083,-86.713525 32.653146,-86.713508 32.653281,-86.713485 32.653987,-86.713494 32.654127,-86.713526 32.654413,-86.713551 32.654564)\r\n2498;2400;all;Sweetgum St;Autauga;AL;36003;LINESTRING(-86.658549 32.438742,-86.658526 32.438758,-86.658448 32.438801,-86.658291 32.43887,-86.658149 32.438944,-86.657871 32.439111,-86.657651 32.439226)\r\n1906;1998;even;Denny Dr;Autauga;AL;36022;LINESTRING(-86.415071 32.588095,-86.415075 32.588089,-86.415083 32.587936,-86.415084 32.587858,-86.415078 32.58777,-86.415038 32.587683,-86.414974 32.587607,-86.414892 32.587537,-86.414782 32.587497,-86.414677 32.587483,-86.414527 32.587481,-86.414327 32.587468,-86.414241 32.587466,-86.413727 32.587435,-86.413383 32.587427,-86.413287 32.587424,-86.413179 32.587433,-86.41308 32.587476,-86.412997 32.587524,-86.412916 32.587581,-86.41285 32.587654,-86.412805 32.587736,-86.412784 32.587817,-86.412763 32.587896,-86.412757 32.588053,-86.412763 32.58814,-86.412793 32.588196)\r\n1905;1999;odd;Denny Dr;Autauga;AL;36022;LINESTRING(-86.414878 32.588076,-86.414875 32.588075,-86.414885 32.587934,-86.41488 32.58787,-86.414866 32.587814,-86.414846 32.587769,-86.414812 32.587725,-86.414766 32.587693,-86.414716 32.587671,-86.414651 32.587657,-86.414515 32.587645,-86.414317 32.587636,-86.414231 32.587634,-86.413717 32.587603,-86.413381 32.587593,-86.413305 32.587598,-86.413243 32.587611,-86.413182 32.58763,-86.413123 32.587662,-86.413072 32.587703,-86.413032 32.587748,-86.413003 32.587798,-86.41298 32.587855,-86.412969 32.587918,-86.412957 32.588047,-86.412971 32.588102,-86.412979 32.588146)\r\n811;801;odd;Autauga County 140;Autauga;AL;36051;LINESTRING(-86.584172 32.605235,-86.584137 32.60528,-86.584105 32.605327)\r\n802;800;even;Autauga County 140;Autauga;AL;36051;LINESTRING(-86.584346 32.605311,-86.584315 32.605374,-86.584262 32.605425)\r\n508;514;even;Daniel Dr;Autauga;AL;36067;LINESTRING(-86.460659 32.477051,-86.460661 32.47713,-86.460654 32.477195,-86.460616 32.477456)\r\n507;513;odd;Daniel Dr;Autauga;AL;36067;LINESTRING(-86.460853 32.477046,-86.460857 32.477132,-86.460856 32.477211,-86.460809 32.477478)\r\n1077;1083;all;S Memorial Dr;Autauga;AL;36067;LINESTRING(-86.44473 32.453355,-86.444674 32.453306,-86.444636 32.453259)\r\n2207;2211;all;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.437251 32.559129,-86.43702 32.559363,-86.4368 32.559614)\r\n700;798;even;Loder St;Autauga;AL;36067;LINESTRING(-86.452486 32.459274,-86.452478 32.459168,-86.452466 32.458881,-86.452471 32.458808,-86.452465 32.458663,-86.452456 32.458075,-86.452439 32.457774,-86.452425 32.457692,-86.4524 32.457612,-86.452367 32.457534,-86.452332 32.457462,-86.452284 32.457398,-86.4522 32.457314)\r\n701;799;odd;Loder St;Autauga;AL;36067;LINESTRING(-86.452292 32.459288,-86.45228 32.459178,-86.45227 32.458879,-86.452275 32.458806,-86.452267 32.458667,-86.452258 32.458081,-86.452237 32.457792,-86.452225 32.457726,-86.452206 32.457662,-86.452179 32.457598,-86.452148 32.457544,-86.452116 32.457498,-86.452047 32.457416)\r\n1598;1698;all;Hawthorn Ln;Autauga;AL;36066;LINESTRING(-86.42459 32.471772,-86.424513 32.471706,-86.424421 32.471653,-86.424331 32.471627,-86.424158 32.471583,-86.423984 32.471551,-86.423723 32.471517,-86.423536 32.471508,-86.423347 32.471536,-86.423276 32.471562)\r\n1862;1998;even;Co Rd 7;Autauga;AL;36758;LINESTRING(-86.871824 32.650349,-86.871808 32.650439,-86.871812 32.650597,-86.871852 32.650968,-86.871906 32.651264,-86.871963 32.651481,-86.872012 32.651628,-86.872074 32.651768,-86.872181 32.65197,-86.872806 32.653093,-86.873039 32.653483,-86.873131 32.653614,-86.873285 32.653796,-86.873611 32.654139,-86.874059 32.654581,-86.874446 32.654955,-86.874663 32.655182,-86.874989 32.655514,-86.875165 32.655678,-86.875471 32.655937,-86.875664 32.65608,-86.87599 32.656314,-86.876284 32.656492,-86.876586 32.656654,-86.876815 32.656765,-86.877045 32.656869,-86.877271 32.656971,-86.877408 32.657045,-86.877469 32.657086,-86.877583 32.657179,-86.877686 32.657285,-86.877773 32.657397,-86.877807 32.657454,-86.877868 32.657581,-86.877973 32.657859,-86.878042 32.657998,-86.878087 32.658073,-86.878347 32.658361,-86.878386 32.658415,-86.878414 32.658468,-86.878433 32.658524,-86.878448 32.658579,-86.878435 32.658638,-86.878419 32.6587,-86.878369 32.65883,-86.878276 32.65903,-86.878195 32.659238,-86.87817 32.659312,-86.878149 32.659387,-86.878136 32.659467,-86.878137 32.659547,-86.878137 32.659629,-86.878157 32.659709,-86.878185 32.659785,-86.878219 32.659862,-86.878266 32.659931,-86.878314 32.659999,-86.878572 32.660289,-86.87866 32.660408,-86.878696 32.660467,-86.87876 32.660595,-86.878843 32.660796,-86.878939 32.661073,-86.87897 32.661171,-86.879131 32.661708,-86.879192 32.661989,-86.879228 32.662202,-86.879265 32.662348,-86.879296 32.662424,-86.879333 32.662497,-86.879366 32.662542,-86.879375 32.662562,-86.879424 32.66263,-86.879491 32.662698,-86.879556 32.662756,-86.879625 32.662812,-86.879705 32.662865,-86.8798 32.662916,-86.879846 32.662914)\r\n1901;1999;odd;Co Rd 7;Autauga;AL;36758;LINESTRING(-86.872018 32.650367,-86.872012 32.650447,-86.872014 32.650587,-86.872052 32.650948,-86.872104 32.651232,-86.872157 32.651439,-86.872204 32.651574,-86.87226 32.651704,-86.872361 32.651902,-86.872984 32.653019,-86.873215 32.653401,-86.873301 32.65352,-86.873445 32.653694,-86.873763 32.654033,-86.874207 32.654473,-86.874598 32.654847,-86.874815 32.655076,-86.875139 32.655404,-86.875309 32.655562,-86.875609 32.655813,-86.875794 32.655954,-86.876114 32.65618,-86.876396 32.656352,-86.87669 32.65651,-86.876911 32.656619,-86.877137 32.656723,-86.877373 32.656823,-86.877526 32.656905,-86.877603 32.656954,-86.877735 32.657061,-86.87785 32.657183,-86.877949 32.657309,-86.877995 32.657382,-86.878058 32.657525,-86.878163 32.657799,-86.878226 32.657924,-86.878263 32.657979,-86.878511 32.658263,-86.878566 32.658329,-86.878612 32.658406,-86.878639 32.65849,-86.878642 32.658579,-86.878637 32.658664,-86.878617 32.658746,-86.878557 32.658888,-86.878464 32.659088,-86.878385 32.659288,-86.878364 32.659352,-86.878349 32.659417,-86.87834 32.659481,-86.878333 32.659545,-86.878343 32.659607,-86.878355 32.659667,-86.878377 32.659729,-86.878407 32.65979,-86.87844 32.659847,-86.878482 32.659903,-86.87874 32.660193,-86.878836 32.660324,-86.87888 32.660395,-86.878946 32.660535,-86.879033 32.660744,-86.879129 32.661029,-86.87916 32.661129,-86.879329 32.661672,-86.879388 32.661963,-86.879426 32.66217,-86.879463 32.662302,-86.879486 32.662362,-86.879517 32.662421,-86.879542 32.662464,-86.879553 32.662478,-86.879592 32.66253,-86.879643 32.662586,-86.879698 32.662636,-86.879757 32.66268,-86.879819 32.662719,-86.87988 32.662742,-86.879889 32.662754)\r\n2204;2250;even;Autauga County 40;Autauga;AL;36006;LINESTRING(-86.740278 32.549543,-86.740284 32.549597,-86.740337 32.549813,-86.74038 32.549957,-86.740483 32.550237,-86.740571 32.550444,-86.740673 32.550646,-86.740828 32.55091,-86.740954 32.551103,-86.741097 32.551286,-86.741195 32.551404,-86.741358 32.551582,-86.741528 32.55175,-86.74183 32.552016,-86.742087 32.55221,-86.742294 32.552352,-86.742508 32.552475,-86.742956 32.552697,-86.743191 32.552796,-86.743431 32.552883,-86.743918 32.55303,-86.746073 32.553629)\r\n2149;2299;odd;Autauga County 40;Autauga;AL;36006;LINESTRING(-86.740471 32.549519,-86.740482 32.549567,-86.740531 32.549775,-86.740572 32.549911,-86.740671 32.550183,-86.740757 32.550382,-86.740855 32.550576,-86.741004 32.550832,-86.741126 32.551015,-86.741261 32.551192,-86.741355 32.551304,-86.741512 32.551476,-86.741676 32.551636,-86.74197 32.551894,-86.742217 32.552082,-86.742414 32.552214,-86.742616 32.552331,-86.743052 32.552547,-86.743275 32.552642,-86.743505 32.552725,-86.743982 32.552872,-86.746134 32.553472)\r\n722;748;even;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.890767 32.566412,-86.890778 32.566564,-86.890814 32.566854,-86.890866 32.567144,-86.89093 32.567432,-86.89134 32.569022)\r\n723;741;odd;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.890961 32.5664,-86.890976 32.56655,-86.891012 32.566832,-86.891062 32.567116,-86.891124 32.5674,-86.89153 32.568987)\r\n699;601;odd;Wisteria Rd;Autauga;AL;36067;LINESTRING(-86.456688 32.478341,-86.456688 32.478214,-86.456672 32.477564,-86.456662 32.476584)\r\n698;600;even;Wisteria Rd;Autauga;AL;36067;LINESTRING(-86.456494 32.478342,-86.456492 32.478216,-86.456476 32.477566,-86.456468 32.476585)\r\n2422;2428;even;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.432666 32.583204,-86.4333 32.584129)\r\n2425;2437;odd;Alpha Springs Rd;Autauga;AL;36022;LINESTRING(-86.432835 32.583122,-86.433469 32.584047)\r\n2732;2718;all;Autauga County 131;Autauga;AL;36051;LINESTRING(-86.431264 32.67616,-86.43138 32.676248,-86.431575 32.676378,-86.431782 32.676497,-86.432072 32.676644,-86.432368 32.676782,-86.432597 32.676874,-86.432751 32.676928,-86.432908 32.676975,-86.433151 32.677033,-86.433323 32.67706,-86.433649 32.677141,-86.43374 32.677161)\r\n181;113;odd;Forrester Dr;Autauga;AL;36066;LINESTRING(-86.451196 32.53086,-86.452268 32.53113,-86.452595 32.531225,-86.452659 32.531235)\r\n180;112;even;Forrester Dr;Autauga;AL;36066;LINESTRING(-86.451252 32.530702,-86.452328 32.53097,-86.452651 32.531061,-86.452705 32.531075)\r\n105;101;odd;Mantlewood Ct;Autauga;AL;36067;LINESTRING(-86.479556 32.445461,-86.479571 32.446025)\r\n112;100;even;Mantlewood Ct;Autauga;AL;36067;LINESTRING(-86.479751 32.445457,-86.479766 32.446021)\r\n3228;3256;even;State Rte 14;Autauga;AL;36003;LINESTRING(-86.729083 32.450591,-86.730027 32.450693,-86.730782 32.450779,-86.732157 32.450901,-86.733191 32.450976,-86.733398 32.450987)\r\n3201;3257;odd;State Rte 14;Autauga;AL;36003;LINESTRING(-86.729108 32.450428,-86.730053 32.450529,-86.730806 32.450613,-86.732175 32.450735,-86.733205 32.45081,-86.733411 32.450823)\r\n303;301;odd;Larry St;Autauga;AL;36067;LINESTRING(-86.488826 32.436053,-86.488604 32.435689)\r\n304;300;even;Larry St;Autauga;AL;36067;LINESTRING(-86.488653 32.436128,-86.488431 32.435764)\r\n2652;2698;all;Hanna Dr;Autauga;AL;36051;LINESTRING(-86.482781 32.63659,-86.482123 32.636662,-86.481412 32.636725,-86.480958 32.636855,-86.48047 32.637064,-86.479862 32.637401,-86.47952 32.637755,-86.479166 32.638117,-86.478832 32.638547,-86.478706 32.638976,-86.478627 32.639157,-86.478584 32.63955,-86.478686 32.639866,-86.478814 32.640041,-86.479008 32.64017,-86.479317 32.640163,-86.480719 32.640116,-86.482513 32.64004,-86.482804 32.640047,-86.483099 32.640053,-86.483309 32.64004,-86.483564 32.639951,-86.483777 32.639771,-86.483854 32.639661,-86.484013 32.639076,-86.484186 32.638466,-86.484274 32.638091,-86.484508 32.637143)\r\n2312;2322;all;Hilltop Farm Rd;Autauga;AL;36067;LINESTRING(-86.598413 32.491451,-86.598563 32.49145,-86.598739 32.491439,-86.598908 32.491419,-86.599081 32.491407,-86.599591 32.491343,-86.599755 32.491333,-86.599917 32.491334,-86.600077 32.491352,-86.600237 32.491383,-86.600396 32.491425,-86.60055 32.491476,-86.600699 32.491536,-86.600996 32.491676,-86.601218 32.491793,-86.601527 32.491924,-86.601593 32.491958,-86.601648 32.491997,-86.60165 32.491988)\r\n201;257;all;N Mulberry Rd;Autauga;AL;36003;LINESTRING(-86.769268 32.460727,-86.769255 32.461035,-86.769261 32.461336,-86.769289 32.461929,-86.769339 32.462657,-86.769355 32.463088,-86.76935 32.463665,-86.769338 32.463798,-86.769324 32.463852,-86.769269 32.463967,-86.769235 32.464012,-86.769187 32.464051,-86.769128 32.464085,-86.76906 32.464112,-86.768985 32.464133,-86.768733 32.464182,-86.768056 32.464284,-86.767885 32.464339,-86.767656 32.464452,-86.767508 32.464502,-86.767351 32.464536,-86.767194 32.464552,-86.766857 32.46455,-86.766686 32.464545,-86.766507 32.464541,-86.76631 32.464586,-86.766137 32.464698,-86.766031 32.464852,-86.765984 32.465014,-86.765947 32.465239,-86.765912 32.465592)\r\n100;198;even;Rollan Ave;Autauga;AL;36067;LINESTRING(-86.486222 32.46366,-86.486251 32.463552,-86.486321 32.463117,-86.48636 32.462829,-86.486417 32.462107,-86.486432 32.461722)\r\n101;199;odd;Rollan Ave;Autauga;AL;36067;LINESTRING(-86.486031 32.463628,-86.486053 32.463524,-86.486125 32.463097,-86.486162 32.462813,-86.486219 32.462099,-86.486237 32.461716)\r\n1500;1598;all;Autauga County 42;Autauga;AL;36067;LINESTRING(-86.653519 32.622486,-86.653523 32.6225,-86.653664 32.622602,-86.65389 32.622726,-86.654046 32.622796,-86.654514 32.622976,-86.654677 32.623031,-86.654846 32.623074,-86.655079 32.623116,-86.655188 32.623143,-86.655372 32.623152,-86.655558 32.623147,-86.655735 32.623119,-86.655905 32.623082,-86.656235 32.623,-86.656734 32.622896,-86.657395 32.622736,-86.658209 32.622514,-86.658534 32.622413,-86.658994 32.62226,-86.659064 32.622242,-86.659215 32.622216,-86.659365 32.622209,-86.659512 32.622237,-86.659648 32.622287,-86.659762 32.622359,-86.659854 32.622456,-86.659931 32.622573,-86.660067 32.622837,-86.660188 32.623105,-86.660238 32.623238,-86.660272 32.623371,-86.660308 32.623655,-86.660329 32.623945,-86.660345 32.624094,-86.66037 32.624241,-86.660406 32.624391,-86.660456 32.624536,-86.660524 32.624677,-86.660604 32.624811,-86.660687 32.624942,-86.660781 32.62507,-86.660887 32.62519,-86.660998 32.625306,-86.661355 32.62562,-86.661466 32.625725,-86.661571 32.625833,-86.66167 32.625945,-86.661909 32.626245,-86.662067 32.626423,-86.662183 32.626536,-86.662306 32.626644,-86.66241 32.626719,-86.662437 32.626742,-86.662575 32.626836,-86.662852 32.627009,-86.663548 32.627424,-86.663823 32.627594,-86.663969 32.627676,-86.664116 32.627755,-86.664272 32.627827,-86.664432 32.627892,-86.664597 32.627947,-86.664624 32.627952)\r\n1701;1747;all;Maul Dr;Autauga;AL;36006;LINESTRING(-86.738711 32.628702,-86.736604 32.630698,-86.73645 32.630862,-86.736308 32.631037,-86.73614 32.631284,-86.736035 32.631475,-86.735947 32.631671,-86.73582 32.632015,-86.735655 32.632512,-86.735574 32.632718,-86.735517 32.632854,-86.735352 32.633196,-86.735297 32.633287,-86.735275 32.633331,-86.735151 32.63353,-86.734969 32.633801)\r\n675;601;odd;2nd St;Autauga;AL;36703;LINESTRING(-86.794978 32.386009,-86.79477 32.387393)\r\n684;676;even;2nd St;Autauga;AL;36703;LINESTRING(-86.795171 32.38603,-86.794963 32.387414)\r\n200;262;even;Autauga County 15;Autauga;AL;36003;LINESTRING(-86.808565 32.479505,-86.808247 32.480628,-86.808211 32.480775,-86.808153 32.481062,-86.808134 32.481212,-86.80811 32.481506,-86.808106 32.481802,-86.808127 32.482101,-86.80817 32.482397,-86.808242 32.48269,-86.808288 32.482835,-86.808389 32.483118,-86.808446 32.483261,-86.808583 32.483537,-86.808658 32.483672,-86.80874 32.483805,-86.808827 32.483933,-86.809096 32.484312,-86.809399 32.484717)\r\n201;299;odd;Autauga County 15;Autauga;AL;36003;LINESTRING(-86.808755 32.479543,-86.808439 32.480664,-86.808405 32.480805,-86.808351 32.481086,-86.808332 32.481226,-86.80831 32.481512,-86.808306 32.481798,-86.808327 32.482085,-86.80837 32.482369,-86.808436 32.482652,-86.808478 32.482789,-86.808577 32.483066,-86.808634 32.483201,-86.808765 32.483469,-86.808836 32.483598,-86.808914 32.483725,-86.808997 32.483849,-86.809264 32.484224,-86.809564 32.48463)\r\n1903;1923;all;Autauga County 21;Autauga;AL;36067;LINESTRING(-86.600712 32.648284,-86.600716 32.648522,-86.600715 32.649039,-86.600733 32.649548,-86.600736 32.650485,-86.600754 32.651421,-86.60077 32.651736)\r\n2006;2066;even;Fairview Ave;Autauga;AL;36066;LINESTRING(-86.41416 32.484103,-86.413999 32.48419,-86.413581 32.484442,-86.413548 32.484465,-86.41331 32.484622,-86.412952 32.48487)\r\n2007;2051;odd;Fairview Ave;Autauga;AL;36066;LINESTRING(-86.414266 32.484241,-86.414111 32.484328,-86.413699 32.484576,-86.413668 32.484595,-86.413432 32.484752,-86.413075 32.484998)\r\n436;472;all;Autauga County 165;Autauga;AL;36003;LINESTRING(-86.641325 32.461547,-86.641233 32.461715,-86.640951 32.462327,-86.640883 32.462459,-86.640809 32.462586,-86.64073 32.462706,-86.640589 32.462894,-86.640545 32.462943,-86.640444 32.463053,-86.640334 32.463157,-86.640216 32.463255,-86.640091 32.463349,-86.639961 32.463437,-86.639827 32.463519,-86.639688 32.463595,-86.639546 32.463663,-86.639397 32.463724,-86.639244 32.463778,-86.639087 32.463826,-86.639058 32.463836)\r\n900;910;all;Skidmore Ave;Autauga;AL;36066;LINESTRING(-86.451825 32.475222,-86.451241 32.475247)\r\n1898;1846;all;Edinburgh St;Autauga;AL;36066;LINESTRING(-86.424306 32.475914,-86.424327 32.476015,-86.424351 32.476152,-86.424372 32.47636,-86.424377 32.476499)\r\n2398;2498;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.636632 32.53217,-86.636744 32.532259,-86.637485 32.53286,-86.637905 32.533219,-86.638223 32.533508)\r\n300;330;even;E Main St;Autauga;AL;36067;LINESTRING(-86.467214 32.459219,-86.467116 32.459213,-86.466178 32.459148,-86.466171 32.459149)\r\n301;399;odd;E Main St;Autauga;AL;36067;LINESTRING(-86.467203 32.459383,-86.467102 32.459379,-86.466156 32.459316,-86.466143 32.459312)\r\n1599;1523;all;Northington Rd;Autauga;AL;36067;LINESTRING(-86.517107 32.449872,-86.516693 32.44989,-86.515271 32.449939)\r\n699;601;odd;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.470741 32.473551,-86.470744 32.473549,-86.470831 32.47324,-86.470994 32.472835,-86.471565 32.471536,-86.471627 32.471393,-86.471638 32.471325,-86.471681 32.47117,-86.471714 32.470946,-86.471747 32.470581,-86.471746 32.47053)\r\n698;602;even;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.470549 32.473522,-86.470548 32.473515,-86.470635 32.473192,-86.470808 32.472779,-86.471379 32.47148,-86.471427 32.471347,-86.471446 32.471291,-86.471481 32.47114,-86.471516 32.470928,-86.471547 32.470573,-86.471551 32.470526)\r\n1798;1776;even;Edinburgh St;Autauga;AL;36066;LINESTRING(-86.428907 32.478222,-86.429254 32.478205,-86.429509 32.478188,-86.42976 32.478186,-86.430445 32.478165,-86.431039 32.478123,-86.431295 32.478109,-86.43139 32.478101)\r\n1759;1701;odd;Edinburgh St;Autauga;AL;36066;LINESTRING(-86.428896 32.478057,-86.42924 32.478039,-86.429499 32.478016,-86.429756 32.478018,-86.430433 32.477997,-86.431025 32.477957,-86.431281 32.477943,-86.431373 32.477937)\r\n101;199;all;Jessee Samuel Hunt Blvd;Autauga;AL;36066;LINESTRING(-86.462647 32.564144,-86.461589 32.56416,-86.459556 32.564211,-86.459418 32.564249,-86.459165 32.564382,-86.458994 32.56451,-86.45887 32.564632,-86.458786 32.564894,-86.458703 32.565158,-86.458604 32.565466,-86.458412 32.565694,-86.458177 32.566004,-86.458064 32.566074)\r\n1793;1797;all;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.541933 32.541409,-86.543067 32.543151,-86.543473 32.543785,-86.544086 32.544722)\r\n1900;1998;all;Autauga County 85;Autauga;AL;36067;LINESTRING(-86.460097 32.534371,-86.459671 32.534624,-86.456139 32.536686)\r\n2276;2296;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.613163 32.521206,-86.613457 32.521254,-86.61388 32.521316,-86.615142 32.521519,-86.615444 32.521565)\r\n1999;1901;odd;Suncrest Dr;Autauga;AL;36067;LINESTRING(-86.524395 32.568966,-86.524399 32.568821,-86.524414 32.568528,-86.52441 32.568381,-86.524421 32.567217,-86.524421 32.56649,-86.524436 32.565408,-86.524452 32.564271,-86.524471 32.564229,-86.524495 32.564195,-86.524624 32.564105,-86.524698 32.564047,-86.524758 32.563977,-86.524805 32.563901,-86.524837 32.563825,-86.524865 32.563748,-86.524902 32.563601,-86.524931 32.563451,-86.524941 32.563227,-86.524939 32.5625,-86.524942 32.562021)\r\n1998;1956;even;Suncrest Dr;Autauga;AL;36067;LINESTRING(-86.5242 32.568963,-86.524201 32.568815,-86.524218 32.568526,-86.524214 32.568383,-86.524225 32.567217,-86.524225 32.56649,-86.52424 32.565406,-86.52424 32.564251,-86.524259 32.564143,-86.524345 32.564065,-86.52449 32.563975,-86.52454 32.563931,-86.524582 32.563883,-86.524617 32.563829,-86.524647 32.563769,-86.524669 32.563706,-86.524704 32.563571,-86.524727 32.563433,-86.524741 32.563223,-86.524743 32.5625,-86.524748 32.56202)\r\n100;104;even;Abney Dr;Autauga;AL;36067;LINESTRING(-86.454097 32.449869,-86.454111 32.449828,-86.454179 32.449538,-86.454212 32.449384,-86.454212 32.44929,-86.454188 32.449191,-86.454118 32.449134)\r\n101;105;odd;Abney Dr;Autauga;AL;36067;LINESTRING(-86.453908 32.449831,-86.453917 32.449792,-86.453985 32.449508,-86.454008 32.449374,-86.454 32.449316,-86.453982 32.449275,-86.453963 32.449234)\r\n865;801;odd;Autauga County 24;Autauga;AL;36051;LINESTRING(-86.595149 32.690411,-86.595085 32.690487,-86.594529 32.691112,-86.594004 32.691688,-86.593751 32.691987,-86.593463 32.692353,-86.593373 32.692485,-86.593299 32.692624,-86.593238 32.692767,-86.593161 32.692981,-86.593125 32.693129,-86.593101 32.693276,-86.593084 32.693494,-86.59309 32.693857,-86.593136 32.69523,-86.593143 32.695588,-86.59313 32.695876,-86.593102 32.696162,-86.59303 32.696665,-86.592939 32.697389,-86.592834 32.69847,-86.592786 32.698751,-86.592721 32.699032,-86.592659 32.699241,-86.592609 32.699376,-86.59252 32.699576,-86.592385 32.699843,-86.592158 32.700236,-86.591682 32.700985,-86.591415 32.70144,-86.591305 32.701643,-86.591211 32.701852,-86.591134 32.702066,-86.590877 32.70292,-86.590766 32.703255,-86.590666 32.703519,-86.590209 32.704616,-86.590138 32.70483,-86.590102 32.704978,-86.590101 32.705022,-86.590084 32.705129,-86.590078 32.70535,-86.59008 32.705431,-86.590084 32.705571,-86.590097 32.705719,-86.590129 32.70601,-86.590209 32.706448,-86.590217 32.706471)\r\n898;800;even;Autauga County 24;Autauga;AL;36091;LINESTRING(-86.595311 32.690502,-86.595249 32.690585,-86.594685 32.691212,-86.594164 32.691788,-86.593915 32.692081,-86.593635 32.692441,-86.593555 32.692563,-86.593487 32.692688,-86.593428 32.692821,-86.593357 32.693023,-86.593323 32.693157,-86.593301 32.693294,-86.593284 32.693498,-86.593286 32.693853,-86.593332 32.695226,-86.593339 32.69559,-86.59333 32.695886,-86.5933 32.69618,-86.593226 32.696683,-86.593135 32.697405,-86.593034 32.698488,-86.592984 32.698779,-86.592915 32.699068,-86.592853 32.699287,-86.592799 32.699432,-86.592704 32.699638,-86.592567 32.699913,-86.592334 32.700312,-86.591858 32.701061,-86.591595 32.701512,-86.591491 32.701709,-86.591401 32.701908,-86.591326 32.702112,-86.591067 32.702962,-86.590958 32.703303,-86.590852 32.703573,-86.590401 32.704666,-86.590334 32.70487,-86.590304 32.705004,-86.590295 32.70504,-86.590286 32.705141,-86.590274 32.705352,-86.590276 32.705427,-86.590282 32.705563,-86.590293 32.705705,-86.590327 32.705988,-86.590405 32.706418,-86.590408 32.706439)\r\n2212;2266;even;Maul Dr;Autauga;AL;36006;LINESTRING(-86.702087 32.667388,-86.702082 32.668129,-86.702087 32.668859,-86.702094 32.669051,-86.702104 32.669442,-86.702108 32.669478)\r\n2215;2243;odd;Maul Dr;Autauga;AL;36006;LINESTRING(-86.702282 32.667389,-86.702278 32.668129,-86.702283 32.668857,-86.702288 32.669047,-86.702302 32.669434,-86.702303 32.669468)\r\n801;899;all;Geneva St;Autauga;AL;36066;LINESTRING(-86.442653 32.459329,-86.442645 32.458717)\r\n100;198;even;E 3rd St;Autauga;AL;36067;LINESTRING(-86.472458 32.461168,-86.472231 32.46115,-86.470261 32.461025,-86.469903 32.460997)\r\n101;299;odd;E 3rd St;Autauga;AL;36067;LINESTRING(-86.472441 32.461332,-86.472215 32.461316,-86.470245 32.461191,-86.469884 32.461161)\r\n137;129;all;Cosby Ct;Autauga;AL;36067;LINESTRING(-86.469326 32.471405,-86.469449 32.471129,-86.469526 32.470961,-86.469565 32.470859)\r\n175;127;odd;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.6674 32.422162,-86.667468 32.422366,-86.667501 32.422504,-86.667532 32.422716,-86.667543 32.422857,-86.667537 32.423071,-86.667539 32.423078,-86.667531 32.423141,-86.667496 32.423353,-86.667462 32.42349,-86.667394 32.423699,-86.667284 32.423972,-86.666593 32.425547,-86.665704 32.427602,-86.665578 32.427889)\r\n156;100;even;Dutch Bend Rd;Autauga;AL;36003;LINESTRING(-86.667585 32.422114,-86.667666 32.422324,-86.667699 32.422478,-86.667732 32.4227,-86.667741 32.422853,-86.667739 32.423081,-86.667735 32.423092,-86.667733 32.423159,-86.667692 32.423383,-86.667658 32.42353,-86.667586 32.423749,-86.66747 32.424028,-86.666775 32.425605,-86.665886 32.427658,-86.665761 32.427946)\r\n2300;2398;even;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.547641 32.612097,-86.547591 32.612359,-86.547563 32.612579,-86.547541 32.612869,-86.547533 32.613162,-86.547536 32.613454,-86.547602 32.614753,-86.547655 32.615617,-86.54777 32.61778,-86.547801 32.618211,-86.54781 32.618425,-86.54781 32.618854,-86.547788 32.619137,-86.547779 32.619205,-86.547738 32.619416,-86.5477 32.619551,-86.547651 32.619685,-86.547565 32.619887,-86.547499 32.620014,-86.547386 32.620206,-86.545978 32.622271,-86.545733 32.622619)\r\n2301;2399;odd;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.547833 32.612121,-86.547789 32.612381,-86.547761 32.612593,-86.547739 32.612877,-86.547729 32.613164,-86.547734 32.61345,-86.547798 32.614745,-86.547851 32.615609,-86.547966 32.617772,-86.547997 32.618203,-86.548008 32.618421,-86.54801 32.61886,-86.547988 32.619153,-86.547977 32.619229,-86.547936 32.61945,-86.547892 32.619595,-86.547841 32.619739,-86.547751 32.619949,-86.547681 32.620086,-86.547564 32.620286,-86.546148 32.622355,-86.545901 32.622703)\r\n3000;3098;even;Autauga County 114;Autauga;AL;36067;LINESTRING(-86.69964 32.510672,-86.699674 32.510669,-86.699745 32.510603,-86.699803 32.510538,-86.69993 32.510354,-86.700023 32.510242,-86.700127 32.510139,-86.700181 32.510094,-86.700307 32.510009,-86.700369 32.509974,-86.700512 32.509911,-86.700741 32.509832,-86.70122 32.50969,-86.701461 32.509632,-86.701704 32.509589,-86.701863 32.509574,-86.701936 32.509574,-86.70201 32.50958,-86.702087 32.509591,-86.702414 32.509662,-86.702588 32.509692,-86.70395 32.509828,-86.704551 32.509878,-86.704897 32.509892,-86.705161 32.509893,-86.705426 32.509872,-86.705602 32.509849,-86.706103 32.509759,-86.706772 32.509647,-86.707687 32.509486,-86.70785 32.509466,-86.7081 32.509445,-86.708264 32.509438,-86.709121 32.509457,-86.709643 32.509451,-86.710325 32.509393,-86.710489 32.509384,-86.710562 32.509389,-86.710716 32.50941,-86.710788 32.509426,-86.710857 32.509449,-86.710924 32.509479,-86.711056 32.509553,-86.711112 32.509592,-86.711167 32.509639,-86.711271 32.509745,-86.711474 32.509974,-86.711869 32.510454,-86.711983 32.51057,-86.712111 32.510678,-86.712311 32.510822,-86.713118 32.511369,-86.713263 32.511456,-86.71342 32.511533,-86.713507 32.511566,-86.713593 32.511595,-86.713682 32.511617,-86.713859 32.511651,-86.71412 32.511682,-86.714385 32.511699,-86.714651 32.511693,-86.715089 32.511665,-86.71513 32.511656)\r\n3001;3099;odd;Autauga County 114;Autauga;AL;36067;LINESTRING(-86.699552 32.510525,-86.699544 32.510517,-86.699589 32.510487,-86.699633 32.51044,-86.69976 32.510262,-86.699861 32.510138,-86.699977 32.510021,-86.700047 32.509964,-86.700187 32.509869,-86.700267 32.509826,-86.700426 32.509755,-86.700671 32.509674,-86.70116 32.50953,-86.701411 32.509466,-86.70167 32.509419,-86.701851 32.5094,-86.701948 32.5094,-86.702042 32.50941,-86.702131 32.509427,-86.702458 32.509498,-86.70262 32.509524,-86.703972 32.509662,-86.704565 32.50971,-86.704901 32.509724,-86.705151 32.509721,-86.705402 32.509704,-86.705566 32.509683,-86.706065 32.509597,-86.706732 32.509485,-86.707651 32.50932,-86.707826 32.509298,-86.708086 32.509277,-86.708262 32.509272,-86.709121 32.509291,-86.709631 32.509281,-86.710309 32.509227,-86.710485 32.509216,-86.71058 32.509215,-86.710762 32.509238,-86.710854 32.509264,-86.710941 32.509293,-86.711028 32.509329,-86.711178 32.509413,-86.711252 32.509466,-86.711317 32.509525,-86.711429 32.509641,-86.711634 32.509876,-86.712029 32.51035,-86.712133 32.510454,-86.712249 32.510554,-86.712437 32.510694,-86.713238 32.511233,-86.713373 32.511312,-86.713514 32.511381,-86.713585 32.51141,-86.713659 32.511433,-86.713734 32.511453,-86.713895 32.511483,-86.714142 32.511514,-86.714391 32.511531,-86.714641 32.511525,-86.715065 32.511495,-86.7151 32.511494)\r\n107;101;all;Overlook Dr;Autauga;AL;36066;LINESTRING(-86.436199 32.446955,-86.436408 32.446736,-86.436674 32.446454,-86.436725 32.44638)\r\n300;306;all;Autauga County 20;Autauga;AL;36051;LINESTRING(-86.463502 32.699679,-86.463316 32.699794,-86.463031 32.699959,-86.462893 32.700047,-86.462357 32.700369)\r\n666;670;all;Autauga County 83;Autauga;AL;36749;LINESTRING(-86.891353 32.557779,-86.891249 32.55832)\r\n2100;2198;even;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.549326 32.589493,-86.549284 32.589977,-86.549259 32.590411,-86.549253 32.590774,-86.54926 32.591424,-86.549282 32.59186,-86.549316 32.592222,-86.549366 32.592655,-86.549656 32.594736,-86.549688 32.595094,-86.549699 32.595303,-86.549701 32.595662,-86.54968 32.596091,-86.549652 32.596376,-86.549612 32.596658,-86.549558 32.59694,-86.549455 32.59736,-86.549108 32.598629,-86.54906 32.598846,-86.549022 32.599064,-86.548971 32.599427,-86.548951 32.599649,-86.54892 32.60038,-86.548908 32.600955)\r\n2133;2199;odd;Autauga County 57;Autauga;AL;36067;LINESTRING(-86.549521 32.589505,-86.54948 32.589987,-86.549457 32.590417,-86.549449 32.590774,-86.549458 32.59142,-86.54948 32.59185,-86.549512 32.592208,-86.549562 32.592637,-86.549854 32.59472,-86.549886 32.595084,-86.549899 32.595299,-86.549899 32.595666,-86.549878 32.596101,-86.54985 32.596392,-86.549808 32.596682,-86.549754 32.59697,-86.549647 32.597396,-86.549302 32.598663,-86.549256 32.598874,-86.549218 32.599086,-86.549169 32.599443,-86.549149 32.599659,-86.549116 32.600384,-86.549103 32.600958)\r\n601;699;all;Belle Maison;Autauga;AL;36067;LINESTRING(-86.486391 32.492047,-86.486521 32.492145,-86.486679 32.492275,-86.487095 32.492611)\r\n100;106;even;Diane Dr;Autauga;AL;36066;LINESTRING(-86.43817 32.477598,-86.438105 32.477527,-86.438022 32.477422,-86.437958 32.477313,-86.437907 32.477186,-86.437874 32.477053,-86.437849 32.476892)\r\n101;105;odd;Diane Dr;Autauga;AL;36066;LINESTRING(-86.438021 32.477704,-86.437943 32.477631,-86.437844 32.47751,-86.437768 32.477381,-86.437707 32.477232,-86.437674 32.477079,-86.437656 32.47691)\r\n700;714;even;Kingsley Dr;Autauga;AL;36066;LINESTRING(-86.42085 32.469132,-86.42073 32.469189,-86.420527 32.469327,-86.420488 32.469362)\r\n701;715;odd;Kingsley Dr;Autauga;AL;36066;LINESTRING(-86.420952 32.469272,-86.420848 32.469331,-86.420659 32.469457,-86.420622 32.469482)\r\n900;928;all;Autauga County 1;Autauga;AL;36749;LINESTRING(-86.810904 32.555603,-86.810239 32.556086,-86.808945 32.557039,-86.807969 32.55775,-86.807575 32.558045,-86.807455 32.558155,-86.807281 32.558324,-86.807173 32.55845,-86.807066 32.55858,-86.807009 32.558679)\r\n570;672;even;Autauga County 15;Autauga;AL;36003;LINESTRING(-86.802068 32.516469,-86.801904 32.516512,-86.801242 32.516665,-86.800499 32.516828,-86.800164 32.516906,-86.799998 32.516956,-86.799835 32.517012,-86.799676 32.517075,-86.79952 32.517143,-86.799371 32.51722,-86.799222 32.5173,-86.799079 32.517388,-86.79894 32.51748,-86.798808 32.517577,-86.798563 32.517788,-86.798442 32.517897,-86.798331 32.518015,-86.798067 32.518305,-86.794537 32.522354,-86.79407 32.522875,-86.79375 32.523216,-86.793308 32.523662,-86.792853 32.524098,-86.7925 32.524415,-86.7919 32.524931,-86.791651 32.525131,-86.789562 32.526763,-86.789249 32.527012,-86.788743 32.527403,-86.788301 32.527751,-86.788053 32.527955,-86.787814 32.528169,-86.787587 32.52839,-86.787369 32.528618,-86.787059 32.52897,-86.786887 32.529202)\r\n409;699;odd;Autauga County 15;Autauga;AL;36003;LINESTRING(-86.802129 32.516625,-86.801962 32.516674,-86.801292 32.516825,-86.800551 32.516988,-86.800224 32.517068,-86.800068 32.517114,-86.799915 32.517166,-86.799764 32.517225,-86.799618 32.517291,-86.799475 32.517362,-86.799334 32.51744,-86.799199 32.517522,-86.799068 32.51761,-86.798946 32.517701,-86.798707 32.517904,-86.798594 32.518009,-86.798485 32.518119,-86.798225 32.518405,-86.794693 32.522454,-86.794226 32.522977,-86.793902 32.523322,-86.793458 32.52377,-86.792999 32.52421,-86.792642 32.524531,-86.792038 32.525051,-86.791785 32.525251,-86.789696 32.526883,-86.789383 32.527134,-86.788875 32.527525,-86.788437 32.527871,-86.788195 32.528073,-86.787962 32.528281,-86.787739 32.528498,-86.787527 32.52872,-86.787225 32.529066,-86.787051 32.529291)\r\n200;298;all;S Chestnut St;Autauga;AL;36067;LINESTRING(-86.472709 32.461148,-86.472726 32.461034,-86.472761 32.460682)\r\n899;709;odd;Autauga County 20;Autauga;AL;36091;LINESTRING(-86.585351 32.654428,-86.585145 32.654495,-86.581159 32.655765,-86.581 32.655811,-86.58068 32.65589,-86.580188 32.65597,-86.579998 32.655987,-86.57969 32.656005,-86.579275 32.655998,-86.578857 32.655955,-86.577605 32.655747,-86.57677 32.655611,-86.57627 32.655521,-86.575767 32.655442,-86.575425 32.655394,-86.57491 32.655358,-86.574309 32.65536,-86.574045 32.655375,-86.573699 32.655412,-86.573272 32.655481,-86.572934 32.655552,-86.566905 32.657156,-86.563328 32.658095,-86.562835 32.658215,-86.562423 32.6583,-86.562008 32.658374,-86.56159 32.658438,-86.560163 32.658628,-86.558476 32.658844,-86.557554 32.658966,-86.557492 32.658973)\r\n898;700;even;Autauga County 20;Autauga;AL;36091;LINESTRING(-86.585422 32.654581,-86.585215 32.654649,-86.581225 32.655923,-86.58106 32.655969,-86.58073 32.656058,-86.580216 32.656142,-86.580014 32.656151,-86.579696 32.656175,-86.579261 32.65617,-86.578825 32.656123,-86.577567 32.655909,-86.57673 32.655775,-86.576232 32.655685,-86.575733 32.655606,-86.575401 32.655564,-86.574902 32.655528,-86.574315 32.65553,-86.574065 32.655543,-86.573731 32.65558,-86.573316 32.655647,-86.572988 32.655716,-86.566963 32.657314,-86.563384 32.658255,-86.562887 32.658377,-86.562467 32.658464,-86.562046 32.658538,-86.561622 32.658602,-86.560193 32.658792,-86.558506 32.659008,-86.55758 32.659134,-86.557511 32.659137)\r\n1100;1348;even;Autauga County 1;Autauga;AL;36006;LINESTRING(-86.784748 32.589669,-86.78468 32.58974,-86.784373 32.590114,-86.783859 32.590705,-86.783643 32.590922,-86.783529 32.591027,-86.783408 32.591129,-86.783286 32.591224,-86.783027 32.591408,-86.782896 32.591494,-86.782759 32.591576,-86.78247 32.591724,-86.78225 32.591825,-86.781318 32.592195,-86.780385 32.592566,-86.780232 32.592632,-86.779934 32.592775,-86.779788 32.592859,-86.779647 32.592942,-86.779372 32.593122,-86.779178 32.593268,-86.778928 32.593474,-86.7787 32.593693,-86.778484 32.593918,-86.777656 32.594747,-86.777548 32.594864,-86.777345 32.595106,-86.777161 32.595356,-86.777026 32.595547,-86.776861 32.595806,-86.776607 32.596271,-86.775259 32.598937,-86.77504 32.599329,-86.774884 32.599585,-86.774716 32.599838,-86.774541 32.600085,-86.774358 32.60033,-86.774169 32.60057,-86.773973 32.600804,-86.773463 32.601387,-86.772956 32.601975,-86.771936 32.603139,-86.771417 32.603715,-86.77089 32.60428,-86.770546 32.604658,-86.770276 32.604952,-86.770069 32.605201,-86.769887 32.605461,-86.769721 32.605726,-86.769512 32.606132,-86.769332 32.606547,-86.769165 32.606962,-86.768904 32.607578,-86.768811 32.60778,-86.76871 32.607979,-86.768697 32.608004)\r\n1201;1399;odd;Autauga County 1;Autauga;AL;36006;LINESTRING(-86.784902 32.589769,-86.78484 32.58984,-86.784533 32.59021,-86.784017 32.590809,-86.783793 32.591034,-86.783671 32.591143,-86.783546 32.591249,-86.783418 32.59135,-86.783151 32.591538,-86.783016 32.591628,-86.782871 32.59172,-86.782568 32.591868,-86.782342 32.591977,-86.7814 32.592345,-86.780473 32.592716,-86.780326 32.59278,-86.78004 32.592919,-86.7799 32.592997,-86.779765 32.593078,-86.7795 32.593252,-86.779314 32.593392,-86.779074 32.593592,-86.778852 32.593801,-86.778634 32.594024,-86.77781 32.594853,-86.777708 32.594964,-86.777511 32.5952,-86.777329 32.595442,-86.7772 32.595629,-86.777041 32.595882,-86.776787 32.596339,-86.775439 32.599005,-86.775218 32.599403,-86.775058 32.599665,-86.774886 32.599922,-86.774709 32.600173,-86.774524 32.60042,-86.774333 32.600664,-86.774133 32.600902,-86.773621 32.601485,-86.773114 32.602073,-86.772092 32.603239,-86.771573 32.603817,-86.771044 32.604382,-86.7707 32.604758,-86.770436 32.605052,-86.770239 32.605293,-86.770061 32.605543,-86.769903 32.6058,-86.769698 32.606196,-86.769518 32.606603,-86.769349 32.607016,-86.76909 32.607636,-86.768995 32.607844,-86.76889 32.608047,-86.768873 32.608074)\r\n801;999;odd;Lexington Ln;Autauga;AL;36067;LINESTRING(-86.483547 32.490933,-86.483545 32.490939,-86.48371 32.491187,-86.484228 32.491945,-86.484717 32.492634,-86.48485 32.492814,-86.484916 32.492878)\r\n800;998;even;Lexington Ln;Autauga;AL;36067;LINESTRING(-86.483706 32.490839,-86.483719 32.490847,-86.483882 32.491105,-86.484398 32.491861,-86.484885 32.492546,-86.485016 32.492714,-86.485069 32.492776)\r\n2161;2101;all;Selma Hwy;Autauga;AL;36067;LINESTRING(-86.624048 32.437078,-86.621796 32.437088,-86.618354 32.437112,-86.617715 32.437114)\r\n808;898;even;Fairwood Dr;Autauga;AL;36067;LINESTRING(-86.49973 32.454836,-86.499705 32.454865,-86.499611 32.454979,-86.499446 32.455143,-86.498922 32.455615,-86.498806 32.455707,-86.498683 32.45579,-86.498623 32.455818,-86.498563 32.455834,-86.498497 32.455848,-86.498423 32.455837,-86.498264 32.455807,-86.498106 32.455761,-86.497872 32.455675,-86.497267 32.455408,-86.497185 32.455375,-86.497099 32.455349,-86.49701 32.455331,-86.49692 32.455323,-86.496833 32.455317,-86.496659 32.455316,-86.496476 32.455327,-86.496379 32.455358,-86.496298 32.455394,-86.49622 32.45543,-86.49612 32.45549)\r\n807;899;odd;Fairwood Dr;Autauga;AL;36067;LINESTRING(-86.499904 32.45491,-86.499883 32.454957,-86.499771 32.455085,-86.499594 32.455255,-86.499064 32.455733,-86.49894 32.455835,-86.498803 32.455934,-86.498715 32.455982,-86.498607 32.456016,-86.498497 32.456012,-86.498391 32.456013,-86.498206 32.455971,-86.498032 32.455921,-86.497786 32.455827,-86.497179 32.45556,-86.497109 32.455535,-86.497041 32.455515,-86.496972 32.455501,-86.4969 32.455491,-86.496825 32.455487,-86.496669 32.455488,-86.496522 32.455505,-86.496457 32.45552,-86.49639 32.455544,-86.496326 32.455576,-86.496228 32.455627)\r\n120;124;even;Warwick Dr;Autauga;AL;36066;LINESTRING(-86.439509 32.472433,-86.439468 32.47228,-86.439421 32.472068,-86.439338 32.471755)\r\n119;127;odd;Warwick Dr;Autauga;AL;36066;LINESTRING(-86.43932 32.472472,-86.439272 32.472316,-86.439227 32.4721,-86.439148 32.47179)\r\n199;1;odd;S Washington St;Autauga;AL;36003;LINESTRING(-86.654717 32.430952,-86.655417 32.431853)\r\n198;2;even;S Washington St;Autauga;AL;36003;LINESTRING(-86.654879 32.430862,-86.655579 32.431763)\r\n2241;2249;all;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.469365 32.60815,-86.469711 32.608321,-86.470019 32.608469)\r\n701;799;all;Gene St;Autauga;AL;36067;LINESTRING(-86.467028 32.440548,-86.467028 32.440512,-86.46703 32.44045)\r\n1200;1272;all;E Main St;Autauga;AL;36066;LINESTRING(-86.440425 32.460355,-86.440269 32.460358,-86.439849 32.460362,-86.439515 32.460351,-86.439285 32.46036,-86.438799 32.460363)\r\n1013;901;odd;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.469657 32.481817,-86.469649 32.480255,-86.469651 32.479974)\r\n798;700;even;Martin Luther King Dr;Autauga;AL;36067;LINESTRING(-86.469462 32.481818,-86.469455 32.480255,-86.469456 32.479973)\r\n2218;2230;even;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.465745 32.606266,-86.465932 32.606442,-86.466171 32.606655,-86.4665 32.606892,-86.46678 32.607065,-86.467067 32.607231,-86.467437 32.607418,-86.467586 32.607491,-86.46767 32.607534)\r\n2217;2225;odd;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.465889 32.606155,-86.466076 32.606328,-86.466311 32.606529,-86.466626 32.606758,-86.466896 32.606929,-86.467175 32.607089,-86.467537 32.607274,-86.46769 32.607345,-86.467776 32.607396)\r\n300;498;even;Macon Pl;Autauga;AL;36003;LINESTRING(-86.803768 32.483633,-86.803778 32.483675,-86.803792 32.483741,-86.80381 32.483883,-86.803818 32.484179,-86.803851 32.484331,-86.803965 32.484687,-86.80401 32.484832,-86.804091 32.484985,-86.804179 32.485056,-86.804283 32.485102,-86.804467 32.485122,-86.804535 32.485141,-86.804595 32.485166,-86.804636 32.485198,-86.804709 32.485298,-86.804747 32.485419,-86.804762 32.485553,-86.80475 32.485692,-86.804681 32.486124,-86.804655 32.486424,-86.804655 32.486719,-86.804695 32.488621,-86.804777 32.491171,-86.804791 32.4919,-86.804841 32.49313,-86.804836 32.493276,-86.804866 32.493462,-86.805066 32.493588,-86.805281 32.493586,-86.806063 32.493571,-86.80649 32.493568,-86.807167 32.493554,-86.807232 32.493564,-86.807271 32.493581,-86.807288 32.493597,-86.807315 32.493628,-86.807299 32.493684,-86.807088 32.494384,-86.807036 32.494517,-86.807004 32.494577,-86.806885 32.494758,-86.806841 32.494811,-86.806571 32.49508,-86.806395 32.495232,-86.806323 32.495306,-86.806266 32.495366,-86.806239 32.495454,-86.80619 32.495736,-86.806123 32.496007,-86.806094 32.496097)\r\n305;427;odd;Macon Pl;Autauga;AL;36003;LINESTRING(-86.803955 32.483589,-86.803974 32.483635,-86.803994 32.483715,-86.804012 32.483871,-86.804024 32.484161,-86.804049 32.484295,-86.804155 32.484641,-86.804206 32.484768,-86.804273 32.484873,-86.804309 32.484904,-86.804355 32.484924,-86.804509 32.484956,-86.804607 32.484971,-86.804709 32.485012,-86.804804 32.485072,-86.804917 32.485226,-86.804957 32.485395,-86.804956 32.485553,-86.804954 32.485708,-86.804881 32.486142,-86.804855 32.48643,-86.804851 32.486719,-86.804891 32.488617,-86.804973 32.491167,-86.804987 32.491896,-86.805039 32.493126,-86.805046 32.493258,-86.80508 32.49335,-86.80515 32.493396,-86.805285 32.493418,-86.806061 32.493405,-86.806486 32.493402,-86.807169 32.493388,-86.807266 32.493384,-86.807399 32.493409,-86.807502 32.493507,-86.807511 32.493624,-86.807499 32.493718,-86.80728 32.494432,-86.807224 32.494575,-86.807192 32.494653,-86.807057 32.49485,-86.807003 32.494917,-86.806719 32.495194,-86.806547 32.495346,-86.806487 32.495408,-86.806464 32.495448,-86.806441 32.495494,-86.806386 32.495766,-86.806321 32.496051,-86.806279 32.496148)\r\n100;132;all;Hughes St;Autauga;AL;36067;LINESTRING(-86.469596 32.485473,-86.470037 32.485466)\r\n100;198;even;St Andrews Ct;Autauga;AL;36066;LINESTRING(-86.416638 32.47425,-86.416858 32.474483,-86.416903 32.474507,-86.41695 32.474545,-86.417027 32.474552,-86.417712 32.474601)\r\n199;101;odd;St Andrews Ct;Autauga;AL;36066;LINESTRING(-86.416787 32.474145,-86.417006 32.474353,-86.417021 32.474369,-86.41704 32.474369,-86.417059 32.47438,-86.41773 32.474438)\r\n3101;3199;all;Watchman Cir W;Autauga;AL;36091;LINESTRING(-86.557422 32.704093,-86.557463 32.704158,-86.557511 32.704294,-86.557509 32.704365,-86.557519 32.704469,-86.557512 32.704627,-86.557442 32.704846,-86.557369 32.705064,-86.557286 32.705254)\r\n315;301;odd;Hampstead St;Autauga;AL;36066;LINESTRING(-86.419479 32.465287,-86.419485 32.465582,-86.419484 32.465797,-86.419491 32.466134)\r\n316;308;even;Hampstead St;Autauga;AL;36066;LINESTRING(-86.419673 32.465284,-86.419681 32.46558,-86.41968 32.465797,-86.419685 32.466131)\r\n199;101;all;Avalon Dr;Autauga;AL;36067;LINESTRING(-86.461278 32.486496,-86.461304 32.486232,-86.461323 32.486087,-86.461341 32.485868,-86.461347 32.485648,-86.461339 32.485421,-86.461327 32.485402)\r\n100;198;even;Kelse Pl;Autauga;AL;36066;LINESTRING(-86.420975 32.47623,-86.420987 32.476327)\r\n101;199;odd;Kelse Pl;Autauga;AL;36066;LINESTRING(-86.421168 32.476212,-86.42118 32.476309)\r\n102;100;all;Willow Oak Dr;Autauga;AL;36067;LINESTRING(-86.475352 32.473624,-86.475354 32.473608,-86.475366 32.473545,-86.475376 32.473483,-86.475371 32.473389)\r\n1928;1998;even;Cedar Ridge Loop;Autauga;AL;36067;LINESTRING(-86.47108 32.57213,-86.471095 32.572059,-86.47111 32.571987,-86.471132 32.571912,-86.471161 32.57183,-86.471181 32.571667,-86.471176 32.571496,-86.471176 32.571413,-86.471176 32.571332,-86.471176 32.571254,-86.471178 32.57118,-86.471174 32.571117)\r\n1937;1999;odd;Cedar Ridge Loop;Autauga;AL;36067;LINESTRING(-86.470887 32.572111,-86.470893 32.572031,-86.470918 32.571949,-86.470942 32.571872,-86.470957 32.5718,-86.470977 32.571657,-86.470982 32.571496,-86.470982 32.571413,-86.470982 32.571332,-86.470982 32.571254,-86.47098 32.571182,-86.47098 32.571122)\r\n100;198;even;Carriage Hills Ct;Autauga;AL;36067;LINESTRING(-86.500986 32.502214,-86.500964 32.501865,-86.500941 32.501352,-86.500925 32.501215)\r\n1299;1201;odd;Carriage Hills Ct;Autauga;AL;36067;LINESTRING(-86.500792 32.502223,-86.500768 32.501873,-86.500743 32.501362,-86.500731 32.501229)\r\n2000;2098;even;Landee Ct;Autauga;AL;36022;LINESTRING(-86.438363 32.601675,-86.43835 32.601108)\r\n2001;2099;odd;Landee Ct;Autauga;AL;36022;LINESTRING(-86.438168 32.601678,-86.438155 32.601111)\r\n1934;1998;all;Autauga County 107;Autauga;AL;36066;LINESTRING(-86.458216 32.584064,-86.458213 32.584296,-86.458188 32.585163,-86.458184 32.585455,-86.458204 32.58575,-86.458248 32.58611,-86.458279 32.586481)\r\n801;845;all;Washington Ferry Rd;Autauga;AL;36067;LINESTRING(-86.46467 32.439682,-86.464674 32.439409,-86.464688 32.439025)\r\n400;420;even;Hallmark Dr;Autauga;AL;36067;LINESTRING(-86.460852 32.457639,-86.460877 32.457516,-86.460922 32.457005,-86.460937 32.456784,-86.460946 32.456563,-86.460969 32.45628,-86.460981 32.456218,-86.461001 32.456161,-86.46103 32.456108,-86.461069 32.45606,-86.461115 32.45602,-86.46117 32.455984,-86.461232 32.455957,-86.461293 32.455942,-86.461446 32.455925,-86.461522 32.455929,-86.46156 32.455929)\r\n101;199;odd;Hallmark Dr;Autauga;AL;36067;LINESTRING(-86.46066 32.457615,-86.460677 32.457498,-86.460726 32.456993,-86.460741 32.456776,-86.46075 32.456555,-86.460767 32.456262,-86.460779 32.456182,-86.460805 32.456099,-86.460848 32.456022,-86.460905 32.455948,-86.460977 32.455884,-86.46106 32.455836,-86.461148 32.455793,-86.461251 32.455762,-86.461442 32.455757,-86.461538 32.455757,-86.461584 32.455766)\r\n4080;4098;even;Fig Tree Dr;Autauga;AL;36749;LINESTRING(-86.847956 32.504739,-86.848083 32.504775,-86.848415 32.504842,-86.848758 32.504886,-86.849443 32.504968,-86.84979 32.504998,-86.85023 32.505021,-86.850325 32.505022,-86.850405 32.505016)\r\n4063;4099;odd;Fig Tree Dr;Autauga;AL;36749;LINESTRING(-86.848013 32.504582,-86.848135 32.504611,-86.848455 32.504674,-86.848788 32.504722,-86.849467 32.504802,-86.849806 32.50483,-86.850238 32.504853,-86.850321 32.504854,-86.850394 32.504852)\r\n999;901;odd;Autauga County 150;Autauga;AL;36051;LINESTRING(-86.593017 32.604553,-86.592713 32.604531,-86.592368 32.604522,-86.592023 32.604519,-86.591343 32.604535,-86.591003 32.604548,-86.590491 32.604585,-86.590318 32.604606,-86.589814 32.604692,-86.587411 32.605178,-86.586912 32.605275,-86.586748 32.605303,-86.586584 32.605326,-86.586418 32.605343,-86.586251 32.605355,-86.585744 32.605373,-86.584643 32.605385)\r\n998;900;even;Autauga County 150;Autauga;AL;36051;LINESTRING(-86.593002 32.604717,-86.592701 32.604699,-86.592364 32.604688,-86.592025 32.604685,-86.591351 32.604701,-86.591017 32.604716,-86.590513 32.604753,-86.590352 32.604772,-86.589856 32.604856,-86.587455 32.605338,-86.586954 32.605437,-86.586784 32.605467,-86.586612 32.605492,-86.586438 32.605511,-86.586263 32.605521,-86.58575 32.605541,-86.584645 32.60555)\r\n2200;2216;even;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.4646 32.60463,-86.464638 32.60473,-86.46474 32.604933,-86.464886 32.605196,-86.465005 32.605391,-86.465175 32.605647,-86.465423 32.605947,-86.465551 32.606075)\r\n2201;2215;odd;US Hwy 31;Autauga;AL;36022;LINESTRING(-86.464783 32.604575,-86.464826 32.60467,-86.464922 32.604865,-86.465064 32.605122,-86.465179 32.605311,-86.465347 32.605555,-86.465585 32.605845,-86.465702 32.605971)\r\n1700;1798;even;Formosa Ct;Autauga;AL;36022;LINESTRING(-86.41605 32.532882,-86.416051 32.532751,-86.416071 32.532104,-86.416096 32.531971,-86.416193 32.531696,-86.416228 32.531544,-86.416241 32.531333)\r\n1701;1799;odd;Formosa Ct;Autauga;AL;36022;LINESTRING(-86.415855 32.532881,-86.415855 32.532749,-86.415863 32.532088,-86.415896 32.531931,-86.415995 32.531654,-86.416024 32.531522,-86.416047 32.531321)\r\n100;198;even;Sara Ln;Autauga;AL;36067;LINESTRING(-86.445404 32.450065,-86.445345 32.450538,-86.445297 32.451054,-86.445281 32.451106,-86.445279 32.451139)\r\n101;199;odd;Sara Ln;Autauga;AL;36067;LINESTRING(-86.445598 32.450082,-86.445541 32.450552,-86.445497 32.451062,-86.445509 32.451158,-86.44545 32.451219)\r\n1380;1376;all;Chilton County 446;Autauga;AL;36051;LINESTRING(-86.530733 32.704181,-86.530995 32.704514,-86.53112 32.70469,-86.53149 32.705314,-86.531697 32.705609)\r\n799;701;all;US Hwy 82;Autauga;AL;36067;LINESTRING(-86.490433 32.451767,-86.490391 32.451695,-86.489928 32.450992,-86.48962 32.450549,-86.489076 32.449804,-86.488914 32.449591)\r\n300;316;even;Camellia Dr;Autauga;AL;36067;LINESTRING(-86.459476 32.475487,-86.460393 32.475887,-86.460614 32.475988,-86.460836 32.476096,-86.460889 32.476117)\r\n301;313;odd;Camellia Dr;Autauga;AL;36067;LINESTRING(-86.459565 32.47534,-86.460483 32.475741,-86.46071 32.475842,-86.46093 32.475948,-86.460977 32.47597)\r\n743;661;odd;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.481332 32.47656,-86.481326 32.476438,-86.481289 32.476272,-86.481229 32.476054,-86.481113 32.475772,-86.481039 32.475633,-86.480956 32.4755,-86.480866 32.475372,-86.479983 32.474216,-86.479841 32.474024)\r\n744;644;even;Upper Kingston Rd;Autauga;AL;36067;LINESTRING(-86.481138 32.476572,-86.481124 32.47646,-86.481093 32.476306,-86.481033 32.476102,-86.480925 32.475834,-86.480859 32.475707,-86.480782 32.475582,-86.480698 32.47546,-86.479817 32.474304,-86.479676 32.47411)\r\n725;807;all;Doster Rd;Autauga;AL;36067;LINESTRING(-86.463072 32.445798,-86.462843 32.445391,-86.462648 32.44507,-86.462151 32.44439,-86.461542 32.443592,-86.461489 32.443516)\r\n"
  },
  {
    "path": "utils/import_multiple_regions.sh",
    "content": "#!/bin/bash -xv\n\n# Script to set up Nominatim database for multiple countries\n\n# Steps to follow:\n\n#     *) Get the pbf files from server\n\n#     *) Set up sequence.state for updates\n\n#     *) Setup nominatim db using 'setup.php --osm-file'\n\n# Hint:\n#\n# Use \"bashdb ./update_database.sh\" and bashdb's \"next\" command for step-by-step\n# execution.\n\n# ******************************************************************************\n\ntouch2() { mkdir -p \"$(dirname \"$1\")\" && touch \"$1\" ; }\n\n# ******************************************************************************\n# Configuration section: Variables in this section should be set according to your requirements\n\n# REPLACE WITH LIST OF YOUR \"COUNTRIES\":\n\nCOUNTRIES=\"europe/monaco europe/andorra\"\n\n# SET TO YOUR replication server URL:\n\nBASEURL=\"https://download.geofabrik.de\"\nDOWNCOUNTRYPOSTFIX=\"-latest.osm.pbf\"\n\n# End of configuration section\n# ******************************************************************************\n\nUPDATEDIR=update\nIMPORT_CMD=\"nominatim import\"\n\nmkdir -p ${UPDATEDIR}\npushd ${UPDATEDIR}\nrm -rf tmp\nmkdir -p tmp\npopd\n\nfor COUNTRY in $COUNTRIES;\ndo\n    echo \"====================================================================\"\n    echo \"$COUNTRY\"\n    echo \"====================================================================\"\n    DIR=\"$UPDATEDIR/$COUNTRY\"\n    DOWNURL=\"$BASEURL/$COUNTRY$DOWNCOUNTRYPOSTFIX\"\n    IMPORTFILE=$COUNTRY$DOWNCOUNTRYPOSTFIX\n    IMPORTFILEPATH=${UPDATEDIR}/tmp/${IMPORTFILE}\n\n    touch2 $IMPORTFILEPATH\n    wget ${DOWNURL} -O $IMPORTFILEPATH\n\n    touch2 ${DIR}/sequence.state\n    pyosmium-get-changes -O $IMPORTFILEPATH -f ${DIR}/sequence.state -v\n\n    IMPORT_CMD=\"${IMPORT_CMD} --osm-file ${IMPORTFILEPATH}\"\n    echo $IMPORTFILE\n    echo \"====================================================================\"\ndone\n\necho \"====================================================================\"\necho \"Setting up nominatim db\"\n${IMPORT_CMD} 2>&1\necho \"====================================================================\"\n"
  },
  {
    "path": "utils/update_database.sh",
    "content": "#!/bin/bash -xv\n\n# Derived from https://gist.github.com/RhinoDevel/8a35ebd2a08166f328eca01ab005c6de and edited to work with Pyosmium\n# Related to https://github.com/osm-search/Nominatim/issues/1683\n\n# Steps being followed:\n\n#     *) Get the diff file from server\n#         1) pyosmium-get-changes (with -f sequence.state for getting sequenceNumber)\n\n#     *) Import diff\n#         1) utils/update.php --import-diff\n\n#     *) Index for all the countries at the end\n\n# Hint:\n#\n# Use \"bashdb ./update_database.sh\" and bashdb's \"next\" command for step-by-step\n# execution.\n\n# ******************************************************************************\n\n# REPLACE WITH LIST OF YOUR \"COUNTRIES\":\n#\nCOUNTRIES=\"europe/monaco europe/andorra\"\n\nUPDATEBASEURL=\"https://download.geofabrik.de\"\nUPDATECOUNTRYPOSTFIX=\"-updates\"\n\n# If you do not use Photon, let Nominatim handle (re-)indexing:\n#\nFOLLOWUP=\"nominatim index\"\n#\n# If you use Photon, update Photon and let it handle the index\n# (Photon server must be running and must have been started with \"-database\",\n# \"-user\" and \"-password\" parameters):\n#\n#FOLLOWUP=\"curl http://localhost:2322/nominatim-update\"\n\n# ******************************************************************************\nUPDATEDIR=\"update\"\n\nfor COUNTRY in $COUNTRIES;\ndo\n    echo \"====================================================================\"\n    echo \"$COUNTRY\"\n    echo \"====================================================================\"\n    DIR=\"$UPDATEDIR/$COUNTRY\"\n    FILE=\"$DIR/sequence.state\"\n    BASEURL=\"$UPDATEBASEURL/$COUNTRY$UPDATECOUNTRYPOSTFIX\"\n    FILENAME=${COUNTRY//[\\/]/_}\n\n    echo \"Attempting to get changes\"\n    rm -f ${DIR}/${FILENAME}.osc.gz\n    pyosmium-get-changes -o ${DIR}/${FILENAME}.osc.gz -f ${FILE} --server $BASEURL -v\n\n    echo \"Attempting to import diffs\"\n    nominatim add-data --diff ${DIR}/${FILENAME}.osc.gz\ndone\n\necho \"====================================================================\"\necho \"Reindexing\" \n${FOLLOWUP}\necho \"====================================================================\"\n"
  },
  {
    "path": "vagrant/Install-on-Ubuntu-22.sh",
    "content": "#!/bin/bash -e\n#\n# hacks for broken vagrant box      #DOCS:\nsudo rm -f /var/lib/dpkg/lock       #DOCS:\nexport APT_LISTCHANGES_FRONTEND=none #DOCS:\nexport DEBIAN_FRONTEND=noninteractive #DOCS:\n\n# *Note:* these installation instructions are also available in executable\n#         form for use with vagrant under vagrant/Install-on-Ubuntu-22.sh.\n#\n# Installing the Required Software\n# ================================\n#\n# These instructions expect that you have a freshly installed Ubuntu 22.04.\n#\n# Make sure all packages are up-to-date by running:\n#\n\n    sudo apt-get update -qq\n\n# Now you can install all packages needed for Nominatim:\n\n    sudo apt-get install -y build-essential cmake g++ libboost-dev libboost-system-dev \\\n                        libboost-filesystem-dev libexpat1-dev zlib1g-dev \\\n                        libbz2-dev libpq-dev liblua5.3-dev lua5.3 lua-dkjson \\\n                        nlohmann-json3-dev postgresql-14-postgis-3 \\\n                        postgresql-contrib-14 postgresql-14-postgis-3-scripts \\\n                        libicu-dev virtualenv git\n\n#\n# System Configuration\n# ====================\n#\n# The following steps are meant to configure a fresh Ubuntu installation\n# for use with Nominatim. You may skip some of the steps if you have your\n# OS already configured.\n#\n# Creating Dedicated User Accounts\n# --------------------------------\n#\n# Nominatim will run as a global service on your machine. It is therefore\n# best to install it under its own separate user account. In the following\n# we assume this user is called nominatim and the installation will be in\n# /srv/nominatim. To create the user and directory run:\n#\n#     sudo useradd -d /srv/nominatim -s /bin/bash -m nominatim\n#\n# You may find a more suitable location if you wish.\n#\n# The following instructions assume you are logged in as this user.\n# You can also switch to the user with:\n#\n#     sudo -u nominatim bash\n#\n# To be able to copy and paste instructions from this manual, export\n# user name and home directory now like this:\n#\nif [ \"x$USERNAME\" == \"x\" ]; then #DOCS:\n    export USERNAME=vagrant        #DOCS:    export USERNAME=nominatim\n    export USERHOME=/home/vagrant  #DOCS:    export USERHOME=/srv/nominatim\nfi                                 #DOCS:\n#\n# **Never, ever run the installation as a root user.** You have been warned.\n#\n# Make sure that system servers can read from the home directory:\n\n    chmod a+x $USERHOME\n\n# Setting up PostgreSQL\n# ---------------------\n#\n# Tune the postgresql configuration, which is located in \n# `/etc/postgresql/14/main/postgresql.conf`. See section *Tuning the PostgreSQL database*\n# in [the installation page](../admin/Installation.md#tuning-the-postgresql-database)\n# for the parameters to change.\n#\n# Restart the postgresql service after updating this config file.\n\nif [ \"x$NOSYSTEMD\" == \"xyes\" ]; then  #DOCS:\n    sudo pg_ctlcluster 14 main start  #DOCS:\nelse                                  #DOCS:\n    sudo systemctl restart postgresql\nfi                                    #DOCS:\n#\n# Finally, we need to add two postgres users: one for the user that does\n# the import and another for the webserver which should access the database\n# for reading only:\n#\n\n    sudo -u postgres createuser -s $USERNAME\n    sudo -u postgres createuser www-data\n\n#\n# Installing Nominatim\n# ====================\n#\n# Building and Configuration\n# --------------------------\n#\n# Get the source code from Github and change into the source directory\n#\nif [ \"x$1\" == \"xyes\" ]; then  #DOCS:    :::sh\n    cd $USERHOME\n    git clone https://github.com/osm-search/Nominatim.git\n    cd Nominatim\nelse                               #DOCS:\n    cd $USERHOME/Nominatim         #DOCS:\nfi                                 #DOCS:\n\n# When installing the latest source from github, you also need to\n# download the country grid:\n\nif [ ! -f data/country_osm_grid.sql.gz ]; then       #DOCS:    :::sh\n    wget -O data/country_osm_grid.sql.gz https://nominatim.org/data/country_grid.sql.gz\nfi                                 #DOCS:\n\n# Nominatim needs osm2pgsql >= 1.8. The version that comes with Ubuntu is\n# too old. Download and compile your own:\n\n    cd $USERHOME\n    git clone https://github.com/osm2pgsql-dev/osm2pgsql\n    mkdir osm2pgsql-build\n    cd osm2pgsql-build\n    cmake ../osm2pgsql\n    make\n    sudo make install\n    cd $USERHOME/Nominatim\n\n# Nominatim should be installed in a separate Python virtual environment.\n# Create the virtual environment:\n\n    virtualenv $USERHOME/nominatim-venv\n\n# We want the faster binary version of psycopg, so install that:\n\n    $USERHOME/nominatim-venv/bin/pip install psycopg[binary]\n\n# Now install Nominatim using pip:\n\n    cd $USERHOME/Nominatim\n    $USERHOME/nominatim-venv/bin/pip install packaging/nominatim-db\n\n# Nominatim is now ready to use. You can continue with\n# [importing a database from OSM data](../admin/Import.md). If you want to set up\n# the API frontend first, continue reading.\n#\n# Setting up the Python frontend\n# ==============================\n#\n# The Python frontend is contained in the nominatim-api package. To run\n# the API as a webservice, you also need falcon with uvicorn to serve the API.\n# It is generally recommended to run falcon/uvicorn on top of gunicorn.\n#\n# To install all packages, run:\n\n#DOCS:```sh\n$USERHOME/nominatim-venv/bin/pip install falcon uvicorn gunicorn\ncd $USERHOME/Nominatim\n$USERHOME/nominatim-venv/bin/pip install packaging/nominatim-api\n#DOCS:```\n\n\n# Next you need to create a systemd job that runs Nominatim on gunicorn.\n# First create a systemd job that manages the socket file:\n\n#DOCS:```sh\nsudo tee /etc/systemd/system/nominatim.socket << EOFSOCKETSYSTEMD\n[Unit]\nDescription=Gunicorn socket for Nominatim\n\n[Socket]\nListenStream=/run/nominatim.sock\nSocketUser=www-data\n\n[Install]\nWantedBy=multi-user.target\nEOFSOCKETSYSTEMD\n#DOCS:```\n\n# Then create the service for Nominatim itself.\n\n#DOCS:```sh\nsudo tee /etc/systemd/system/nominatim.service << EOFNOMINATIMSYSTEMD\n[Unit]\nDescription=Nominatim running as a gunicorn application\nAfter=network.target\nRequires=nominatim.socket\n\n[Service]\nType=simple\nUser=www-data\nGroup=www-data\nWorkingDirectory=$USERHOME/nominatim-project\nExecStart=$USERHOME/nominatim-venv/bin/gunicorn -b unix:/run/nominatim.sock -w 4 -k uvicorn.workers.UvicornWorker \"nominatim_api.server.falcon.server:run_wsgi()\"\nExecReload=/bin/kill -s HUP \\$MAINPID\nPrivateTmp=true\nTimeoutStopSec=5\nKillMode=mixed\n\n[Install]\nWantedBy=multi-user.target\nEOFNOMINATIMSYSTEMD\n#DOCS:```\n\n# Activate the services:\n\nif [ \"x$NOSYSTEMD\" != \"xyes\" ]; then  #DOCS:\n    sudo systemctl daemon-reload\n    sudo systemctl enable nominatim.socket\n    sudo systemctl start nominatim.socket\n    sudo systemctl enable nominatim.service\nfi                                    #DOCS:\n\n# Setting up a webserver\n# ======================\n#\n# The webserver is only needed as a proxy between the public interface\n# and the gunicorn service.\n#\n# The frontend will need configuration information from the project\n# directory, which will be populated later\n# [during the import process](../admin/Import.md#creating-the-project-directory)\n# Already create the project directory itself now:\n\n    mkdir $USERHOME/nominatim-project\n\n#\n# Option 1: Using Apache\n# ----------------------\n#\nif [ \"x$2\" == \"xinstall-apache\" ]; then #DOCS:\n#\n# First install apache itself and enable the proxy module:\n\n    sudo apt-get install -y apache2\n    sudo a2enmod proxy_http\n\n#\n# To set up proxying for Apache add the following configuration:\n\n#DOCS:```sh\nsudo tee /etc/apache2/conf-available/nominatim.conf << EOFAPACHECONF\n\nProxyPass /nominatim \"unix:/run/nominatim.sock|http://localhost/\"\nEOFAPACHECONF\n#DOCS:```\n\n#\n# Then enable the configuration and restart apache\n#\n\n#DOCS:```sh\nsudo a2enconf nominatim\n#DOCS:```\n\nif [ \"x$NOSYSTEMD\" == \"xyes\" ]; then  #DOCS:\n    sudo apache2ctl start             #DOCS:\nelse                                  #DOCS:\n    sudo systemctl restart apache2\nfi                                    #DOCS:\n\n# The Nominatim API is now available at `http://localhost/nominatim/`. Point your browser\n# to the status output `http://localhost/nominatim/status` to test if everything is ok.\n\nfi   #DOCS:\n\n#\n# Option 2: Using nginx\n# ---------------------\n#\nif [ \"x$2\" == \"xinstall-nginx\" ]; then #DOCS:\n\n# First install nginx itself:\n\n    sudo apt-get install -y nginx\n\n\n# Then create a Nginx configuration to forward http requests to that socket.\n\n#DOCS:```sh\nsudo tee /etc/nginx/sites-available/default << EOF_NGINX_CONF\nserver {\n    listen 80 default_server;\n    listen [::]:80 default_server;\n\n    root $USERHOME/nominatim-project/website;\n    index /search;\n\n    location /nominatim/ {\n            proxy_set_header Host \\$http_host;\n            proxy_set_header X-Forwarded-For \\$proxy_add_x_forwarded_for;\n            proxy_set_header X-Forwarded-Proto \\$scheme;\n            proxy_redirect off;\n            proxy_pass http://unix:/run/nominatim.sock:/;\n    }\n}\nEOF_NGINX_CONF\n#DOCS:```\n\n# Enable the configuration and restart Nginx\n#\n\nif [ \"x$NOSYSTEMD\" == \"xyes\" ]; then  #DOCS:\n    sudo /usr/sbin/nginx &            #DOCS:\nelse                                  #DOCS:\n    sudo systemctl restart nginx\nfi                                    #DOCS:\n\n# The Nominatim API is now available at `http://localhost/nominatim/`. Point your browser\n# to the status output `http://localhost/nominatim/status` to test if everything is ok.\n\nfi   #DOCS:\n"
  },
  {
    "path": "vagrant/Install-on-Ubuntu-24.sh",
    "content": "#!/bin/bash -e\n#\n# hacks for broken vagrant box      #DOCS:\nsudo rm -f /var/lib/dpkg/lock       #DOCS:\nexport APT_LISTCHANGES_FRONTEND=none #DOCS:\nexport DEBIAN_FRONTEND=noninteractive #DOCS:\n\n# *Note:* these installation instructions are also available in executable\n#         form for use with vagrant under vagrant/Install-on-Ubuntu-24.sh.\n#\n# Installing the Required Software\n# ================================\n#\n# These instructions expect that you have a freshly installed Ubuntu 24.04.\n#\n# Make sure all packages are up-to-date by running:\n#\n\n    sudo apt-get update -qq\n\n# Now you can install all packages needed for Nominatim:\n\n    sudo apt-get install -y osm2pgsql postgresql-postgis postgresql-postgis-scripts \\\n                            pkg-config libicu-dev virtualenv git\n\n\n#\n# System Configuration\n# ====================\n#\n# The following steps are meant to configure a fresh Ubuntu installation\n# for use with Nominatim. You may skip some of the steps if you have your\n# OS already configured.\n#\n# Creating Dedicated User Accounts\n# --------------------------------\n#\n# Nominatim will run as a global service on your machine. It is therefore\n# best to install it under its own separate user account. In the following\n# we assume this user is called nominatim and the installation will be in\n# /srv/nominatim. To create the user and directory run:\n#\n#     sudo useradd -d /srv/nominatim -s /bin/bash -m nominatim\n#\n# You may find a more suitable location if you wish.\n#\n# The following instructions assume you are logged in as this user.\n# You can also switch to the user with:\n#\n#     sudo -u nominatim bash\n#\n# To be able to copy and paste instructions from this manual, export\n# user name and home directory now like this:\n#\nif [ \"x$USERNAME\" == \"x\" ]; then #DOCS:\n    export USERNAME=vagrant        #DOCS:    export USERNAME=nominatim\n    export USERHOME=/home/vagrant  #DOCS:    export USERHOME=/srv/nominatim\nfi                                 #DOCS:\n#\n# **Never, ever run the installation as a root user.** You have been warned.\n#\n# Make sure that system servers can read from the home directory:\n\n    chmod a+x $USERHOME\n\n# Setting up PostgreSQL\n# ---------------------\n#\n# Tune the postgresql configuration, which is located in \n# `/etc/postgresql/16/main/postgresql.conf`. See section *Tuning the PostgreSQL database*\n# in [the installation page](../admin/Installation.md#tuning-the-postgresql-database)\n# for the parameters to change.\n#\n# Restart the postgresql service after updating this config file.\n\nif [ \"x$NOSYSTEMD\" == \"xyes\" ]; then  #DOCS:\n    sudo pg_ctlcluster 16 main start  #DOCS:\nelse                                  #DOCS:\n    sudo systemctl restart postgresql\nfi                                    #DOCS:\n#\n# Finally, we need to add two postgres users: one for the user that does\n# the import and another for the webserver which should access the database\n# for reading only:\n#\n\n    sudo -u postgres createuser -s $USERNAME\n    sudo -u postgres createuser www-data\n\n#\n# Installing Nominatim\n# ====================\n#\n# Building and Configuration\n# --------------------------\n#\n# Get the source code from Github and change into the source directory\n#\nif [ \"x$1\" == \"xyes\" ]; then  #DOCS:    :::sh\n    cd $USERHOME\n    git clone https://github.com/osm-search/Nominatim.git\n    cd Nominatim\nelse                               #DOCS:\n    cd $USERHOME/Nominatim         #DOCS:\nfi                                 #DOCS:\n\n# When installing the latest source from github, you also need to\n# download the country grid:\n\nif [ ! -f data/country_osm_grid.sql.gz ]; then       #DOCS:    :::sh\n    wget -O data/country_osm_grid.sql.gz https://nominatim.org/data/country_grid.sql.gz\nfi                                 #DOCS:\n\n# Nominatim should be installed in a separate Python virtual environment.\n# Create the virtual environment:\n\n    virtualenv $USERHOME/nominatim-venv\n\n# We want the faster binary version of psycopg, so install that:\n\n    $USERHOME/nominatim-venv/bin/pip install psycopg[binary]\n\n# Now install Nominatim using pip:\n\n    cd $USERHOME/Nominatim\n    $USERHOME/nominatim-venv/bin/pip install packaging/nominatim-db\n\n# Nominatim is now ready to use. The nominatim binary is available at\n# `$USERHOME/venv/bin/nominatim`. If you want to have 'nominatim' in your\n# path, simply activate the virtual environment:\n#\n#DOCS:```sh\n# . $USERHOME/nominatim-venv/bin/activate\n#DOCS:```\n#\n# You can continue with\n# [importing a database from OSM data](../admin/Import.md). If you want to set up\n# the API frontend first, continue reading.\n#\n# Setting up the Python frontend\n# ==============================\n#\n# The Python frontend is contained in the nominatim-api package. To run\n# the API as a webservice, you also need falcon with uvicorn to serve the API.\n# It is generally recommended to run falcon/uvicorn on top of gunicorn.\n#\n# To install all packages, run:\n\n#DOCS:```sh\n$USERHOME/nominatim-venv/bin/pip install falcon uvicorn gunicorn\ncd $USERHOME/Nominatim\n$USERHOME/nominatim-venv/bin/pip install packaging/nominatim-api\n#DOCS:```\n\n# Next you need to create a systemd job that runs Nominatim on gunicorn.\n# First create a systemd job that manages the socket file:\n\n#DOCS:```sh\nsudo tee /etc/systemd/system/nominatim.socket << EOFSOCKETSYSTEMD\n[Unit]\nDescription=Gunicorn socket for Nominatim\n\n[Socket]\nListenStream=/run/nominatim.sock\nSocketUser=www-data\n\n[Install]\nWantedBy=multi-user.target\nEOFSOCKETSYSTEMD\n#DOCS:```\n\n# Then create the service for Nominatim itself.\n\n#DOCS:```sh\nsudo tee /etc/systemd/system/nominatim.service << EOFNOMINATIMSYSTEMD\n[Unit]\nDescription=Nominatim running as a gunicorn application\nAfter=network.target\nRequires=nominatim.socket\n\n[Service]\nType=simple\nUser=www-data\nGroup=www-data\nWorkingDirectory=$USERHOME/nominatim-project\nExecStart=$USERHOME/nominatim-venv/bin/gunicorn -b unix:/run/nominatim.sock -w 4 -k uvicorn.workers.UvicornWorker \"nominatim_api.server.falcon.server:run_wsgi()\"\nExecReload=/bin/kill -s HUP \\$MAINPID\nPrivateTmp=true\nTimeoutStopSec=5\nKillMode=mixed\n\n[Install]\nWantedBy=multi-user.target\nEOFNOMINATIMSYSTEMD\n#DOCS:```\n\n# Activate the services:\n\nif [ \"x$NOSYSTEMD\" != \"xyes\" ]; then  #DOCS:\n    sudo systemctl daemon-reload\n    sudo systemctl enable nominatim.socket\n    sudo systemctl start nominatim.socket\n    sudo systemctl enable nominatim.service\nfi                                    #DOCS:\n\n# Setting up a webserver\n# ======================\n#\n# The webserver is only needed as a proxy between the public interface\n# and the gunicorn service.\n#\n# The frontend will need configuration information from the project\n# directory, which will be populated later\n# [during the import process](../admin/Import.md#creating-the-project-directory)\n# Already create the project directory itself now:\n\n    mkdir $USERHOME/nominatim-project\n\n#\n# Option 1: Using Apache\n# ----------------------\n#\nif [ \"x$2\" == \"xinstall-apache\" ]; then #DOCS:\n#\n# First install apache itself and enable the proxy module:\n\n    sudo apt-get install -y apache2\n    sudo a2enmod proxy_http\n\n#\n# To set up proxying for Apache add the following configuration:\n\n#DOCS:```sh\nsudo tee /etc/apache2/conf-available/nominatim.conf << EOFAPACHECONF\n\nProxyPass /nominatim \"unix:/run/nominatim.sock|http://localhost/\"\nEOFAPACHECONF\n#DOCS:```\n\n#\n# Then enable the configuration and restart apache\n#\n\n#DOCS:```sh\nsudo a2enconf nominatim\n#DOCS:```\n\nif [ \"x$NOSYSTEMD\" == \"xyes\" ]; then  #DOCS:\n    sudo apache2ctl start             #DOCS:\nelse                                  #DOCS:\n    sudo systemctl restart apache2\nfi                                    #DOCS:\n\n# The Nominatim API is now available at `http://localhost/nominatim/`. Point your browser\n# to the status output `http://localhost/nominatim/status` to test if everything is ok.\n\nfi   #DOCS:\n\n#\n# Option 2: Using nginx\n# ---------------------\n#\nif [ \"x$2\" == \"xinstall-nginx\" ]; then #DOCS:\n\n# First install nginx itself:\n\n    sudo apt-get install -y nginx\n\n\n# Then create a Nginx configuration to forward http requests to that socket.\n\n#DOCS:```sh\nsudo tee /etc/nginx/sites-available/default << EOF_NGINX_CONF\nserver {\n    listen 80 default_server;\n    listen [::]:80 default_server;\n\n    root $USERHOME/nominatim-project/website;\n    index /search;\n\n    location /nominatim/ {\n            proxy_set_header Host \\$http_host;\n            proxy_set_header X-Forwarded-For \\$proxy_add_x_forwarded_for;\n            proxy_set_header X-Forwarded-Proto \\$scheme;\n            proxy_redirect off;\n            proxy_pass http://unix:/run/nominatim.sock:/;\n    }\n}\nEOF_NGINX_CONF\n#DOCS:```\n\n# Enable the configuration and restart Nginx\n#\n\nif [ \"x$NOSYSTEMD\" == \"xyes\" ]; then  #DOCS:\n    sudo /usr/sbin/nginx &            #DOCS:\nelse                                  #DOCS:\n    sudo systemctl restart nginx\nfi                                    #DOCS:\n\n# The Nominatim API is now available at `http://localhost/nominatim/`. Point your browser\n# to the status output `http://localhost/nominatim/status` to test if everything is ok.\n\nfi   #DOCS:\n"
  }
]