Full Code of twain47/Nominatim for AI

master fd68dd4ee63f cached
725 files
5.4 MB
1.5M tokens
2762 symbols
1 requests
Download .txt
Showing preview only (5,941K chars total). Download the full file or copy to clipboard to get everything.
Repository: twain47/Nominatim
Branch: master
Commit: fd68dd4ee63f
Files: 725
Total size: 5.4 MB

Directory structure:
gitextract_d41547bl/

├── .codespellrc
├── .flake8
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── config.yml
│   │   ├── feature_request.md
│   │   ├── report-issues-with-search-results.md
│   │   └── report-problems-with-the-software.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── actions/
│   │   ├── build-nominatim/
│   │   │   └── action.yml
│   │   ├── setup-postgresql/
│   │   │   └── action.yml
│   │   └── setup-postgresql-windows/
│   │       └── action.yml
│   └── workflows/
│       └── ci-tests.yml
├── .gitignore
├── .gitmodules
├── .mypy.ini
├── AUTHORS
├── CONTRIBUTING.md
├── COPYING
├── ChangeLog
├── LICENSES/
│   ├── Apache-2.0.txt
│   └── GPL-2.0-only.txt
├── Makefile
├── README.md
├── SECURITY.md
├── VAGRANT.md
├── Vagrantfile
├── data/
│   └── words.sql
├── docs/
│   ├── admin/
│   │   ├── Advanced-Installations.md
│   │   ├── Deployment-Python.md
│   │   ├── Faq.md
│   │   ├── Import.md
│   │   ├── Installation.md
│   │   ├── Maintenance.md
│   │   ├── Migration.md
│   │   ├── Setup-Nominatim-UI.md
│   │   └── Update.md
│   ├── api/
│   │   ├── Details.md
│   │   ├── Faq.md
│   │   ├── Lookup.md
│   │   ├── Output.md
│   │   ├── Overview.md
│   │   ├── Reverse.md
│   │   ├── Search.md
│   │   └── Status.md
│   ├── customize/
│   │   ├── Country-Settings.md
│   │   ├── Import-Styles.md
│   │   ├── Importance.md
│   │   ├── Overview.md
│   │   ├── Postcodes.md
│   │   ├── Ranking.md
│   │   ├── Result-Formatting.md
│   │   ├── SQLite.md
│   │   ├── Settings.md
│   │   ├── Special-Phrases.md
│   │   ├── Tiger.md
│   │   └── Tokenizers.md
│   ├── develop/
│   │   ├── Database-Layout.md
│   │   ├── Development-Environment.md
│   │   ├── ICU-Tokenizer-Modules.md
│   │   ├── Indexing.md
│   │   ├── Testing.md
│   │   ├── Tokenizers.md
│   │   ├── address-tables.plantuml
│   │   ├── data-sources.md
│   │   ├── osm2pgsql-tables.plantuml
│   │   ├── overview.md
│   │   ├── parenting-flow.plantuml
│   │   └── search-tables.plantuml
│   ├── extra.css
│   ├── index.md
│   ├── library/
│   │   ├── Configuration.md
│   │   ├── Getting-Started.md
│   │   ├── Input-Parameter-Types.md
│   │   ├── Low-Level-DB-Access.md
│   │   ├── NominatimAPI.md
│   │   └── Result-Handling.md
│   ├── mk_install_instructions.py
│   └── styles.css
├── lib-lua/
│   ├── flex-base.lua
│   ├── import-address.lua
│   ├── import-admin.lua
│   ├── import-extratags.lua
│   ├── import-full.lua
│   ├── import-street.lua
│   ├── taginfo.lua
│   └── themes/
│       └── nominatim/
│           ├── init.lua
│           ├── presets.lua
│           └── topics/
│               ├── address.lua
│               ├── admin.lua
│               ├── full.lua
│               └── street.lua
├── lib-sql/
│   ├── functions/
│   │   ├── associated_street_triggers.sql
│   │   ├── importance.sql
│   │   ├── interpolation.sql
│   │   ├── partition-functions.sql
│   │   ├── place_triggers.sql
│   │   ├── placex_triggers.sql
│   │   ├── postcode_triggers.sql
│   │   ├── ranking.sql
│   │   ├── updates.sql
│   │   └── utils.sql
│   ├── functions.sql
│   ├── grants.sql
│   ├── indices.sql
│   ├── partition-tables.src.sql
│   ├── postcode_tables.sql
│   ├── table-triggers.sql
│   ├── tables/
│   │   ├── addressline.sql
│   │   ├── entrance.sql
│   │   ├── import_reports.sql
│   │   ├── importance_tables.sql
│   │   ├── interpolation.sql
│   │   ├── location_area.sql
│   │   ├── nominatim_properties.sql
│   │   ├── placex.sql
│   │   ├── postcodes.sql
│   │   ├── search_name.sql
│   │   ├── status.sql
│   │   └── tiger.sql
│   ├── tables.sql
│   ├── tiger_import_finish.sql
│   ├── tiger_import_start.sql
│   └── tokenizer/
│       └── icu_tokenizer.sql
├── man/
│   ├── create-manpage.py
│   └── nominatim.1
├── mkdocs.yml
├── munin/
│   ├── nominatim_importlag
│   ├── nominatim_query_speed
│   └── nominatim_requests
├── nominatim-cli.py
├── packaging/
│   ├── nominatim-api/
│   │   ├── COPYING
│   │   ├── README.md
│   │   ├── extra_src/
│   │   │   └── paths.py
│   │   └── pyproject.toml
│   └── nominatim-db/
│       ├── COPYING
│       ├── README.md
│       ├── extra_src/
│       │   └── nominatim_db/
│       │       └── paths.py
│       ├── pyproject.toml
│       └── scripts/
│           └── nominatim
├── settings/
│   ├── address-levels.json
│   ├── country-names/
│   │   ├── ad.yaml
│   │   ├── ae.yaml
│   │   ├── af.yaml
│   │   ├── ag.yaml
│   │   ├── ai.yaml
│   │   ├── al.yaml
│   │   ├── am.yaml
│   │   ├── ao.yaml
│   │   ├── ar.yaml
│   │   ├── at.yaml
│   │   ├── au.yaml
│   │   ├── az.yaml
│   │   ├── ba.yaml
│   │   ├── bb.yaml
│   │   ├── bd.yaml
│   │   ├── be.yaml
│   │   ├── bf.yaml
│   │   ├── bg.yaml
│   │   ├── bh.yaml
│   │   ├── bi.yaml
│   │   ├── bj.yaml
│   │   ├── bm.yaml
│   │   ├── bn.yaml
│   │   ├── bo.yaml
│   │   ├── br.yaml
│   │   ├── bs.yaml
│   │   ├── bt.yaml
│   │   ├── bw.yaml
│   │   ├── by.yaml
│   │   ├── bz.yaml
│   │   ├── ca.yaml
│   │   ├── cd.yaml
│   │   ├── cf.yaml
│   │   ├── cg.yaml
│   │   ├── ch.yaml
│   │   ├── ci.yaml
│   │   ├── ck.yaml
│   │   ├── cl.yaml
│   │   ├── cm.yaml
│   │   ├── cn.yaml
│   │   ├── co.yaml
│   │   ├── cr.yaml
│   │   ├── cu.yaml
│   │   ├── cv.yaml
│   │   ├── cy.yaml
│   │   ├── cz.yaml
│   │   ├── de.yaml
│   │   ├── dj.yaml
│   │   ├── dk.yaml
│   │   ├── dm.yaml
│   │   ├── do.yaml
│   │   ├── dz.yaml
│   │   ├── ec.yaml
│   │   ├── ee.yaml
│   │   ├── eg.yaml
│   │   ├── eh.yaml
│   │   ├── er.yaml
│   │   ├── es.yaml
│   │   ├── et.yaml
│   │   ├── fi.yaml
│   │   ├── fj.yaml
│   │   ├── fk.yaml
│   │   ├── fm.yaml
│   │   ├── fo.yaml
│   │   ├── fr.yaml
│   │   ├── ga.yaml
│   │   ├── gb.yaml
│   │   ├── gd.yaml
│   │   ├── ge.yaml
│   │   ├── gg.yaml
│   │   ├── gh.yaml
│   │   ├── gi.yaml
│   │   ├── gl.yaml
│   │   ├── gm.yaml
│   │   ├── gn.yaml
│   │   ├── gq.yaml
│   │   ├── gr.yaml
│   │   ├── gs.yaml
│   │   ├── gt.yaml
│   │   ├── gw.yaml
│   │   ├── gy.yaml
│   │   ├── hn.yaml
│   │   ├── hr.yaml
│   │   ├── ht.yaml
│   │   ├── hu.yaml
│   │   ├── id.yaml
│   │   ├── ie.yaml
│   │   ├── il.yaml
│   │   ├── im.yaml
│   │   ├── in.yaml
│   │   ├── io.yaml
│   │   ├── iq.yaml
│   │   ├── ir.yaml
│   │   ├── is.yaml
│   │   ├── it.yaml
│   │   ├── je.yaml
│   │   ├── jm.yaml
│   │   ├── jo.yaml
│   │   ├── jp.yaml
│   │   ├── ke.yaml
│   │   ├── kg.yaml
│   │   ├── kh.yaml
│   │   ├── ki.yaml
│   │   ├── km.yaml
│   │   ├── kn.yaml
│   │   ├── kp.yaml
│   │   ├── kr.yaml
│   │   ├── kw.yaml
│   │   ├── ky.yaml
│   │   ├── kz.yaml
│   │   ├── la.yaml
│   │   ├── lb.yaml
│   │   ├── lc.yaml
│   │   ├── li.yaml
│   │   ├── lk.yaml
│   │   ├── lr.yaml
│   │   ├── ls.yaml
│   │   ├── lt.yaml
│   │   ├── lu.yaml
│   │   ├── lv.yaml
│   │   ├── ly.yaml
│   │   ├── ma.yaml
│   │   ├── mc.yaml
│   │   ├── md.yaml
│   │   ├── me.yaml
│   │   ├── mg.yaml
│   │   ├── mh.yaml
│   │   ├── mk.yaml
│   │   ├── ml.yaml
│   │   ├── mm.yaml
│   │   ├── mn.yaml
│   │   ├── mr.yaml
│   │   ├── ms.yaml
│   │   ├── mt.yaml
│   │   ├── mu.yaml
│   │   ├── mv.yaml
│   │   ├── mw.yaml
│   │   ├── mx.yaml
│   │   ├── my.yaml
│   │   ├── mz.yaml
│   │   ├── na.yaml
│   │   ├── ne.yaml
│   │   ├── ng.yaml
│   │   ├── ni.yaml
│   │   ├── nl.yaml
│   │   ├── no.yaml
│   │   ├── np.yaml
│   │   ├── nr.yaml
│   │   ├── nu.yaml
│   │   ├── nz.yaml
│   │   ├── om.yaml
│   │   ├── pa.yaml
│   │   ├── pe.yaml
│   │   ├── pg.yaml
│   │   ├── ph.yaml
│   │   ├── pk.yaml
│   │   ├── pl.yaml
│   │   ├── pn.yaml
│   │   ├── ps.yaml
│   │   ├── pt.yaml
│   │   ├── pw.yaml
│   │   ├── py.yaml
│   │   ├── qa.yaml
│   │   ├── ro.yaml
│   │   ├── rs.yaml
│   │   ├── ru.yaml
│   │   ├── rw.yaml
│   │   ├── sa.yaml
│   │   ├── sb.yaml
│   │   ├── sc.yaml
│   │   ├── sd.yaml
│   │   ├── se.yaml
│   │   ├── sg.yaml
│   │   ├── sh.yaml
│   │   ├── si.yaml
│   │   ├── sk.yaml
│   │   ├── sl.yaml
│   │   ├── sm.yaml
│   │   ├── sn.yaml
│   │   ├── so.yaml
│   │   ├── sr.yaml
│   │   ├── ss.yaml
│   │   ├── st.yaml
│   │   ├── sv.yaml
│   │   ├── sy.yaml
│   │   ├── sz.yaml
│   │   ├── tc.yaml
│   │   ├── td.yaml
│   │   ├── tg.yaml
│   │   ├── th.yaml
│   │   ├── tj.yaml
│   │   ├── tk.yaml
│   │   ├── tl.yaml
│   │   ├── tm.yaml
│   │   ├── tn.yaml
│   │   ├── to.yaml
│   │   ├── tr.yaml
│   │   ├── tt.yaml
│   │   ├── tv.yaml
│   │   ├── tw.yaml
│   │   ├── tz.yaml
│   │   ├── ua.yaml
│   │   ├── ug.yaml
│   │   ├── us.yaml
│   │   ├── uy.yaml
│   │   ├── uz.yaml
│   │   ├── va.yaml
│   │   ├── vc.yaml
│   │   ├── ve.yaml
│   │   ├── vg.yaml
│   │   ├── vn.yaml
│   │   ├── vu.yaml
│   │   ├── ws.yaml
│   │   ├── xk.yaml
│   │   ├── ye.yaml
│   │   ├── za.yaml
│   │   ├── zm.yaml
│   │   └── zw.yaml
│   ├── country_settings.yaml
│   ├── env.defaults
│   ├── icu-rules/
│   │   ├── extended-unicode-to-asccii.yaml
│   │   ├── unicode-digits-to-decimal.yaml
│   │   ├── variants-bg.yaml
│   │   ├── variants-ca.yaml
│   │   ├── variants-cs.yaml
│   │   ├── variants-da.yaml
│   │   ├── variants-de.yaml
│   │   ├── variants-el.yaml
│   │   ├── variants-en.yaml
│   │   ├── variants-es.yaml
│   │   ├── variants-et.yaml
│   │   ├── variants-eu.yaml
│   │   ├── variants-fi.yaml
│   │   ├── variants-fr.yaml
│   │   ├── variants-gl.yaml
│   │   ├── variants-hu.yaml
│   │   ├── variants-it.yaml
│   │   ├── variants-mg.yaml
│   │   ├── variants-ms.yaml
│   │   ├── variants-nl.yaml
│   │   ├── variants-no.yaml
│   │   ├── variants-pl.yaml
│   │   ├── variants-pt.yaml
│   │   ├── variants-ro.yaml
│   │   ├── variants-ru.yaml
│   │   ├── variants-sk.yaml
│   │   ├── variants-sl.yaml
│   │   ├── variants-sv.yaml
│   │   ├── variants-tr.yaml
│   │   ├── variants-uk.yaml
│   │   └── variants-vi.yaml
│   ├── icu_tokenizer.yaml
│   └── phrase-settings.json
├── src/
│   ├── nominatim_api/
│   │   ├── __init__.py
│   │   ├── config.py
│   │   ├── connection.py
│   │   ├── core.py
│   │   ├── errors.py
│   │   ├── localization.py
│   │   ├── logging.py
│   │   ├── lookup.py
│   │   ├── py.typed
│   │   ├── query_preprocessing/
│   │   │   ├── __init__.py
│   │   │   ├── base.py
│   │   │   ├── config.py
│   │   │   ├── normalize.py
│   │   │   ├── regex_replace.py
│   │   │   └── split_japanese_phrases.py
│   │   ├── result_formatting.py
│   │   ├── results.py
│   │   ├── reverse.py
│   │   ├── search/
│   │   │   ├── __init__.py
│   │   │   ├── db_search_builder.py
│   │   │   ├── db_search_fields.py
│   │   │   ├── db_search_lookups.py
│   │   │   ├── db_searches/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── address_search.py
│   │   │   │   ├── base.py
│   │   │   │   ├── country_search.py
│   │   │   │   ├── near_search.py
│   │   │   │   ├── place_search.py
│   │   │   │   ├── poi_search.py
│   │   │   │   └── postcode_search.py
│   │   │   ├── geocoder.py
│   │   │   ├── icu_tokenizer.py
│   │   │   ├── postcode_parser.py
│   │   │   ├── query.py
│   │   │   ├── query_analyzer_factory.py
│   │   │   └── token_assignment.py
│   │   ├── server/
│   │   │   ├── __init__.py
│   │   │   ├── asgi_adaptor.py
│   │   │   ├── content_types.py
│   │   │   ├── falcon/
│   │   │   │   ├── __init__.py
│   │   │   │   └── server.py
│   │   │   └── starlette/
│   │   │       ├── __init__.py
│   │   │       └── server.py
│   │   ├── sql/
│   │   │   ├── __init__.py
│   │   │   ├── async_core_library.py
│   │   │   ├── sqlalchemy_functions.py
│   │   │   ├── sqlalchemy_schema.py
│   │   │   ├── sqlalchemy_types/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── geometry.py
│   │   │   │   ├── int_array.py
│   │   │   │   ├── json.py
│   │   │   │   └── key_value.py
│   │   │   └── sqlite_functions.py
│   │   ├── status.py
│   │   ├── timeout.py
│   │   ├── types.py
│   │   ├── typing.py
│   │   ├── utils/
│   │   │   ├── __init__.py
│   │   │   └── json_writer.py
│   │   ├── v1/
│   │   │   ├── __init__.py
│   │   │   ├── classtypes.py
│   │   │   ├── format.py
│   │   │   ├── format_json.py
│   │   │   ├── format_xml.py
│   │   │   ├── helpers.py
│   │   │   └── server_glue.py
│   │   └── version.py
│   └── nominatim_db/
│       ├── __init__.py
│       ├── cli.py
│       ├── clicmd/
│       │   ├── __init__.py
│       │   ├── add_data.py
│       │   ├── admin.py
│       │   ├── api.py
│       │   ├── args.py
│       │   ├── convert.py
│       │   ├── export.py
│       │   ├── freeze.py
│       │   ├── index.py
│       │   ├── refresh.py
│       │   ├── replication.py
│       │   ├── setup.py
│       │   └── special_phrases.py
│       ├── config.py
│       ├── data/
│       │   ├── __init__.py
│       │   ├── country_info.py
│       │   ├── place_info.py
│       │   ├── place_name.py
│       │   └── postcode_format.py
│       ├── db/
│       │   ├── __init__.py
│       │   ├── connection.py
│       │   ├── properties.py
│       │   ├── query_pool.py
│       │   ├── sql_preprocessor.py
│       │   ├── status.py
│       │   └── utils.py
│       ├── errors.py
│       ├── indexer/
│       │   ├── __init__.py
│       │   ├── indexer.py
│       │   ├── progress.py
│       │   └── runners.py
│       ├── paths.py
│       ├── tokenizer/
│       │   ├── __init__.py
│       │   ├── base.py
│       │   ├── factory.py
│       │   ├── icu_rule_loader.py
│       │   ├── icu_token_analysis.py
│       │   ├── icu_tokenizer.py
│       │   ├── place_sanitizer.py
│       │   ├── sanitizers/
│       │   │   ├── __init__.py
│       │   │   ├── base.py
│       │   │   ├── clean_housenumbers.py
│       │   │   ├── clean_postcodes.py
│       │   │   ├── clean_tiger_tags.py
│       │   │   ├── config.py
│       │   │   ├── delete_tags.py
│       │   │   ├── split_name_list.py
│       │   │   ├── strip_brace_terms.py
│       │   │   ├── tag_analyzer_by_language.py
│       │   │   └── tag_japanese.py
│       │   └── token_analysis/
│       │       ├── __init__.py
│       │       ├── base.py
│       │       ├── config_variants.py
│       │       ├── generic.py
│       │       ├── generic_mutation.py
│       │       ├── housenumbers.py
│       │       ├── postcodes.py
│       │       └── simple_trie.py
│       ├── tools/
│       │   ├── __init__.py
│       │   ├── add_osm_data.py
│       │   ├── admin.py
│       │   ├── check_database.py
│       │   ├── collect_os_info.py
│       │   ├── convert_sqlite.py
│       │   ├── database_import.py
│       │   ├── exec_utils.py
│       │   ├── freeze.py
│       │   ├── migration.py
│       │   ├── postcodes.py
│       │   ├── refresh.py
│       │   ├── replication.py
│       │   ├── special_phrases/
│       │   │   ├── __init__.py
│       │   │   ├── importer_statistics.py
│       │   │   ├── sp_csv_loader.py
│       │   │   ├── sp_importer.py
│       │   │   ├── sp_wiki_loader.py
│       │   │   └── special_phrase.py
│       │   └── tiger_data.py
│       ├── typing.py
│       ├── utils/
│       │   ├── __init__.py
│       │   ├── centroid.py
│       │   └── url_utils.py
│       └── version.py
├── test/
│   ├── bdd/
│   │   ├── conftest.py
│   │   ├── features/
│   │   │   ├── api/
│   │   │   │   ├── details/
│   │   │   │   │   ├── language.feature
│   │   │   │   │   ├── params.feature
│   │   │   │   │   └── simple.feature
│   │   │   │   ├── lookup/
│   │   │   │   │   └── simple.feature
│   │   │   │   ├── reverse/
│   │   │   │   │   ├── geometry.feature
│   │   │   │   │   ├── language.feature
│   │   │   │   │   ├── layers.feature
│   │   │   │   │   ├── queries.feature
│   │   │   │   │   ├── v1_geocodejson.feature
│   │   │   │   │   ├── v1_geojson.feature
│   │   │   │   │   ├── v1_json.feature
│   │   │   │   │   ├── v1_params.feature
│   │   │   │   │   └── v1_xml.feature
│   │   │   │   ├── search/
│   │   │   │   │   ├── language.feature
│   │   │   │   │   ├── params.feature
│   │   │   │   │   ├── postcode.feature
│   │   │   │   │   ├── queries.feature
│   │   │   │   │   ├── simple.feature
│   │   │   │   │   ├── structured.feature
│   │   │   │   │   └── v1_geocodejson.feature
│   │   │   │   └── status/
│   │   │   │       ├── failures.feature
│   │   │   │       └── simple.feature
│   │   │   ├── db/
│   │   │   │   ├── import/
│   │   │   │   │   ├── addressing.feature
│   │   │   │   │   ├── country.feature
│   │   │   │   │   ├── entrances.feature
│   │   │   │   │   ├── interpolation.feature
│   │   │   │   │   ├── linking.feature
│   │   │   │   │   ├── naming.feature
│   │   │   │   │   ├── parenting.feature
│   │   │   │   │   ├── placex.feature
│   │   │   │   │   ├── postcodes.feature
│   │   │   │   │   ├── rank_computation.feature
│   │   │   │   │   └── search_name.feature
│   │   │   │   ├── query/
│   │   │   │   │   ├── housenumbers.feature
│   │   │   │   │   ├── interpolation.feature
│   │   │   │   │   ├── japanese.feature
│   │   │   │   │   ├── linking.feature
│   │   │   │   │   ├── normalization.feature
│   │   │   │   │   ├── postcodes.feature
│   │   │   │   │   ├── reverse.feature
│   │   │   │   │   └── search_simple.feature
│   │   │   │   └── update/
│   │   │   │       ├── addressing.feature
│   │   │   │       ├── country.feature
│   │   │   │       ├── entrances.feature
│   │   │   │       ├── interpolation.feature
│   │   │   │       ├── linked_places.feature
│   │   │   │       ├── parenting.feature
│   │   │   │       ├── postcode.feature
│   │   │   │       └── simple.feature
│   │   │   └── osm2pgsql/
│   │   │       ├── import/
│   │   │       │   ├── broken.feature
│   │   │       │   ├── custom_style.feature
│   │   │       │   ├── entrances.feature
│   │   │       │   ├── interpolation.feature
│   │   │       │   ├── relation.feature
│   │   │       │   ├── simple.feature
│   │   │       │   └── tags.feature
│   │   │       └── update/
│   │   │           ├── entrances.feature
│   │   │           ├── interpolations.feature
│   │   │           ├── postcodes.feature
│   │   │           ├── relation.feature
│   │   │           ├── simple.feature
│   │   │           └── tags.feature
│   │   ├── test_api.py
│   │   ├── test_db.py
│   │   ├── test_osm2pgsql.py
│   │   └── utils/
│   │       ├── __init__.py
│   │       ├── api_result.py
│   │       ├── api_runner.py
│   │       ├── checks.py
│   │       ├── db.py
│   │       ├── geometry_alias.py
│   │       ├── grid.py
│   │       └── place_inserter.py
│   ├── python/
│   │   ├── api/
│   │   │   ├── conftest.py
│   │   │   ├── fake_adaptor.py
│   │   │   ├── query_processing/
│   │   │   │   ├── test_normalize.py
│   │   │   │   ├── test_regex_replace.py
│   │   │   │   └── test_split_japanese_phrases.py
│   │   │   ├── search/
│   │   │   │   ├── test_api_search_query.py
│   │   │   │   ├── test_db_search_builder.py
│   │   │   │   ├── test_icu_query_analyzer.py
│   │   │   │   ├── test_postcode_parser.py
│   │   │   │   ├── test_query.py
│   │   │   │   ├── test_query_analyzer_factory.py
│   │   │   │   ├── test_search_address.py
│   │   │   │   ├── test_search_country.py
│   │   │   │   ├── test_search_near.py
│   │   │   │   ├── test_search_places.py
│   │   │   │   ├── test_search_poi.py
│   │   │   │   ├── test_search_postcode.py
│   │   │   │   └── test_token_assignment.py
│   │   │   ├── test_api_connection.py
│   │   │   ├── test_api_deletable_v1.py
│   │   │   ├── test_api_details.py
│   │   │   ├── test_api_lookup.py
│   │   │   ├── test_api_polygons_v1.py
│   │   │   ├── test_api_reverse.py
│   │   │   ├── test_api_search.py
│   │   │   ├── test_api_status.py
│   │   │   ├── test_api_types.py
│   │   │   ├── test_export.py
│   │   │   ├── test_helpers_v1.py
│   │   │   ├── test_localization.py
│   │   │   ├── test_result_formatting_v1.py
│   │   │   ├── test_result_formatting_v1_reverse.py
│   │   │   ├── test_results.py
│   │   │   ├── test_server_glue_v1.py
│   │   │   ├── test_timeout.py
│   │   │   └── test_warm.py
│   │   ├── cli/
│   │   │   ├── conftest.py
│   │   │   ├── test_cli.py
│   │   │   ├── test_cmd_admin.py
│   │   │   ├── test_cmd_api.py
│   │   │   ├── test_cmd_import.py
│   │   │   ├── test_cmd_index.py
│   │   │   ├── test_cmd_refresh.py
│   │   │   └── test_cmd_replication.py
│   │   ├── config/
│   │   │   ├── test_config.py
│   │   │   └── test_config_load_module.py
│   │   ├── conftest.py
│   │   ├── cursor.py
│   │   ├── data/
│   │   │   └── test_country_info.py
│   │   ├── db/
│   │   │   ├── test_connection.py
│   │   │   ├── test_properties.py
│   │   │   ├── test_sql_preprocessor.py
│   │   │   ├── test_status.py
│   │   │   └── test_utils.py
│   │   ├── dummy_tokenizer.py
│   │   ├── indexer/
│   │   │   └── test_indexing.py
│   │   ├── mock_icu_word_table.py
│   │   ├── pytest.ini
│   │   ├── tokenizer/
│   │   │   ├── sanitizers/
│   │   │   │   ├── test_clean_housenumbers.py
│   │   │   │   ├── test_clean_postcodes.py
│   │   │   │   ├── test_clean_tiger_tags.py
│   │   │   │   ├── test_delete_tags.py
│   │   │   │   ├── test_sanitizer_config.py
│   │   │   │   ├── test_split_name_list.py
│   │   │   │   ├── test_strip_brace_terms.py
│   │   │   │   ├── test_tag_analyzer_by_language.py
│   │   │   │   └── test_tag_japanese.py
│   │   │   ├── test_factory.py
│   │   │   ├── test_icu.py
│   │   │   ├── test_icu_rule_loader.py
│   │   │   ├── test_place_sanitizer.py
│   │   │   └── token_analysis/
│   │   │       ├── test_analysis_postcodes.py
│   │   │       ├── test_generic.py
│   │   │       ├── test_generic_mutation.py
│   │   │       └── test_simple_trie.py
│   │   ├── tools/
│   │   │   ├── conftest.py
│   │   │   ├── test_add_osm_data.py
│   │   │   ├── test_admin.py
│   │   │   ├── test_check_database.py
│   │   │   ├── test_database_import.py
│   │   │   ├── test_exec_utils.py
│   │   │   ├── test_freeze.py
│   │   │   ├── test_import_special_phrases.py
│   │   │   ├── test_migration.py
│   │   │   ├── test_postcodes.py
│   │   │   ├── test_refresh.py
│   │   │   ├── test_refresh_address_levels.py
│   │   │   ├── test_refresh_create_functions.py
│   │   │   ├── test_refresh_wiki_data.py
│   │   │   ├── test_replication.py
│   │   │   ├── test_sp_csv_loader.py
│   │   │   ├── test_sp_importer.py
│   │   │   ├── test_sp_wiki_loader.py
│   │   │   └── test_tiger_data.py
│   │   └── utils/
│   │       ├── test_centroid.py
│   │       └── test_json_writer.py
│   ├── testdata/
│   │   ├── sp_csv_test.csv
│   │   └── special_phrases_test_content.txt
│   └── testdb/
│       ├── additional_api_test.data.osm
│       ├── apidb-test-data.pbf
│       ├── full_en_phrases_test.csv
│       └── tiger/
│           └── 01001.csv
├── utils/
│   ├── import_multiple_regions.sh
│   └── update_database.sh
└── vagrant/
    ├── Install-on-Ubuntu-22.sh
    └── Install-on-Ubuntu-24.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .codespellrc
================================================
# https://github.com/codespell-project/codespell

[codespell]
skip = ./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
# Need to be lowercase in the list
# Unter = Unter den Linden (an example address)
ignore-words-list = inout,unter


================================================
FILE: .flake8
================================================
[flake8]
max-line-length = 100
max-doc-length = 100
extend-ignore =
    # something == None constructs are needed for SQLAlchemy
    E711
per-file-ignores =
    __init__.py: F401
    test/python/utils/test_json_writer.py: E131
    **/conftest.py: E402
    test/bdd/*: F821


================================================
FILE: .github/FUNDING.yml
================================================
github: lonvia
custom: "https://nominatim.org/funding/"


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
contact_links:
  - name: Nominatim Discussions
    url: https://github.com/osm-search/Nominatim/discussions
    about: Ask questions, get support, share ideas and discuss with community members.
  - name: Discussions about OpenStreetMap data
    url: https://community.openstreetmap.org/
    about: Ask questions about the data used by Nominatim and discuss with the OSM community.


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''

---

<!-- Before opening a new feature request, please search through the open issue to check that your request hasn't been reported already. -->

**Is your feature request related to a problem? Please describe.**
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->

**Describe the solution you'd like**
<!-- A clear and concise description of what you want to happen. -->

**Describe alternatives you've considered**
<!-- A clear and concise description of any alternative solutions or features you've considered. -->

**Additional context**
<!-- Add any other context or screenshots about the feature request here. -->


================================================
FILE: .github/ISSUE_TEMPLATE/report-issues-with-search-results.md
================================================
---
name: Report issues with search results
about: You have searched something with Nominatim and did not get the expected result.
title: ''
labels: ''
assignees: ''

---

<!-- 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. -->

## What did you search for?

<!-- 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. -->

## What result did you get?

## What result did you expect?

**When the result is in the right place and just named wrongly:** 

<!-- Please tell us the display name you expected. -->

**When the result is missing completely:**

<!-- 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.

To get the link to the OSM object, you can try the following:

 * Go to [https://openstreetmap.org](https://openstreetmap.org).
 * Move to the area of the map where you expect the result and then zoom in as much as possible.
 * 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.
 * Find the object of interest in the list that appears on the left side.
 * Click on the object and report back the URL that the browser shows.
-->

## Further details

<!-- Anything else we should know about the search. Particularities with addresses in the area etc. -->


================================================
FILE: .github/ISSUE_TEMPLATE/report-problems-with-the-software.md
================================================
---
name: Report problems with the software
about: You have your own installation of Nominatim and found a bug.
title: ''
labels: ''
assignees: ''

---

<!-- Note: if you are installing Nominatim through a docker image, you should report issues with the installation process with the docker repository first.

     Do not send screen shots! Copy any console output directly into the issue.
 -->

**Describe the bug**
<!-- A clear and concise description of what the bug is.-->

**To Reproduce**
<!-- Please describe what you did to get to the issue. -->

**Software Environment (please complete the following information):**
- Nominatim version: 
- Postgresql version: 
- Postgis version:
- OS: 

**Hardware Configuration (please complete the following information):**
- RAM: 
- number of CPUs:
- type and size of disks:

**Postgresql Configuration:**

<!-- List any configuration items you changed in your postgresql configuration. -->

**Nominatim Configuration:**

<!-- List the contents of your customized `.env` file. -->

**Additional context**

<!-- Add any other context about the problem here. -->


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
## Summary
<!-- Describe the purpose of your pull request and, if present, link to existing issues. -->

## AI usage
<!-- Please list where and to what extent AI was used. -->

## Contributor guidelines (mandatory)
<!-- We only accept pull requests that follow our guidelines. A deliberate violation may result in a ban. -->

- [ ] I have adhered to the [coding style](https://github.com/osm-search/Nominatim/blob/master/CONTRIBUTING.md#coding-style)
- [ ] I have [tested](https://github.com/osm-search/Nominatim/blob/master/CONTRIBUTING.md#testing) the proposed changes
- [ ] 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


================================================
FILE: .github/actions/build-nominatim/action.yml
================================================
name: 'Build Nominatim'

inputs:
    dependencies:
        description: 'Where to install dependencies from (pip/apt)'
        required: false
        default: 'pip'

runs:
    using: "composite"

    steps:
        - name: Clean out the disk
          run: |
            sudo rm -rf /opt/hostedtoolcache/go /opt/hostedtoolcache/CodeQL /usr/lib/jvm /usr/local/share/chromium /usr/local/lib/android
            df -h
          shell: bash
        - name: Install general prerequisites
          run: |
            sudo apt-get install -y -qq libspatialite-dev libsqlite3-mod-spatialite libicu-dev virtualenv python3-dev osm2pgsql
          shell: bash

        - name: Install prerequisites from apt
          run: |
            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
          shell: bash
          if: inputs.dependencies == 'apt'

        - name: Setup virtual environment (for pip)
          run: |
            virtualenv venv
            ./venv/bin/pip install -U pip
          shell: bash
          if: inputs.dependencies == 'pip'

        - name: Setup virtual environment (for apt)
          run: |
            virtualenv venv --system-site-packages
          shell: bash
          if: inputs.dependencies == 'apt'

        - name: Build nominatim
          run: ./venv/bin/pip install Nominatim/packaging/nominatim-{api,db}
          shell: bash


================================================
FILE: .github/actions/setup-postgresql/action.yml
================================================
name: 'Setup Postgresql and Postgis'

description: 'Installs PostgreSQL and PostGIS and configures it for CI tests'

inputs:
    postgresql-version:
        description: 'Version of PostgreSQL to install'
        required: true

runs:
    using: "composite"

    steps:
        - name: Remove existing PostgreSQL
          run: |
              sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -y
              sudo apt-get purge -yq postgresql*
              sudo apt-get update -qq

          shell: bash

        - name: Install PostgreSQL
          run: |
              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}
          shell: bash
          env:
              PGVER: ${{ inputs.postgresql-version }}

        - name: Adapt postgresql configuration
          run: |
              echo 'fsync = off' | sudo tee /etc/postgresql/${PGVER}/main/conf.d/local.conf
              echo 'synchronous_commit = off' | sudo tee -a /etc/postgresql/${PGVER}/main/conf.d/local.conf
              echo 'full_page_writes = off' | sudo tee -a /etc/postgresql/${PGVER}/main/conf.d/local.conf
              echo 'shared_buffers = 1GB' | sudo tee -a /etc/postgresql/${PGVER}/main/conf.d/local.conf
              echo 'port = 5432' | sudo tee -a /etc/postgresql/${PGVER}/main/conf.d/local.conf
          shell: bash
          env:
              PGVER: ${{ inputs.postgresql-version }}

        - name: Setup database
          run: |
              sudo systemctl restart postgresql
              sudo -u postgres createuser -S www-data
              sudo -u postgres createuser -s runner
          shell: bash


================================================
FILE: .github/actions/setup-postgresql-windows/action.yml
================================================
name: 'Setup Postgresql and Postgis on Windows'

description: 'Installs PostgreSQL and PostGIS for Windows and configures it for CI tests'

inputs:
    postgresql-version:
        description: 'Version of PostgreSQL to install'
        required: true

runs:
    using: "composite"  

    steps:
        - name: Set up PostgreSQL variables
          shell: pwsh
          run: |
            $version = "${{ inputs.postgresql-version }}"
            $root = "C:\Program Files\PostgreSQL\$version"
            $bin = "$root\bin"

            echo "PGROOT=$root" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
            echo "PGBIN=$bin"   | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append

            echo "$bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append

        - name: Decide Postgis version (Windows)
          id: postgis-ver
          shell: pwsh
          run: |
            echo "PowerShell version: ${PSVersionTable.PSVersion}"
            $PG_VERSION = Split-Path $env:PGROOT -Leaf
            $postgis_page = "https://download.osgeo.org/postgis/windows/pg$PG_VERSION"
            echo "Detecting PostGIS version from $postgis_page for PostgreSQL $PG_VERSION"
            $pgis_bundle = (Invoke-WebRequest -Uri $postgis_page -ErrorAction Stop).Links.Where({$_.href -match "^postgis.*zip$"}).href
            if (!$pgis_bundle) {
              Write-Error "Could not find latest PostGIS version in $postgis_page that would match  ^postgis.*zip$  pattern"
              exit 1
            }
            $pgis_bundle = [IO.Path]::ChangeExtension($pgis_bundle, [NullString]::Value)
            $pgis_bundle_url = "$postgis_page/$pgis_bundle.zip"
            Add-Content $env:GITHUB_OUTPUT "postgis_file=$pgis_bundle"
            Add-Content $env:GITHUB_OUTPUT "postgis_bundle_url=$pgis_bundle_url"

        - uses: actions/cache@v5
          with:
            path: |
              C:/postgis.zip
            key: postgis-cache-${{ steps.postgis-ver.outputs.postgis_file }}

        - name: Download postgis
          shell: pwsh
          run: |
            if (!(Test-Path "C:\postgis.zip")){(new-object net.webclient).DownloadFile($env:PGIS_BUNDLE_URL, "c:\postgis.zip")}
            if (Test-path "c:\postgis_archive"){Remove-Item "c:\postgis_archive" -Recurse -Force}
            7z x c:\postgis.zip -oc:\postgis_archive
          env: 
            PGIS_BUNDLE_URL: ${{ steps.postgis-ver.outputs.postgis_bundle_url }}

        - name: Install postgis
          shell: bash
          run: |
            echo "Root: $PGROOT, Bin: $PGBIN"
            cp -r c:/postgis_archive/postgis-bundle-*/* "$PGROOT" 

        - name: Start PostgreSQL on Windows
          run: |
            $pgService = Get-Service -Name postgresql*
            Set-Service -InputObject $pgService -Status running -StartupType automatic
            Start-Process -FilePath "$env:PGBIN\pg_isready" -Wait -PassThru
          shell: pwsh

        - name: Adapt postgresql configuration
          shell: pwsh
          env:
            PGPASSWORD: root
          run: |
            & "$env:PGBIN\psql" -U postgres -d postgres -c "ALTER SYSTEM SET fsync = 'off';"
            & "$env:PGBIN\psql" -U postgres -d postgres -c "ALTER SYSTEM SET synchronous_commit = 'off';"
            & "$env:PGBIN\psql" -U postgres -d postgres -c "ALTER SYSTEM SET full_page_writes = 'off';"
            & "$env:PGBIN\psql" -U postgres -d postgres -c "ALTER SYSTEM SET shared_buffers = '1GB';"
            & "$env:PGBIN\psql" -U postgres -d postgres -c "ALTER SYSTEM SET port = 5432;"

            Restart-Service -Name postgresql*
            Start-Process -FilePath "$env:PGBIN\pg_isready" -Wait -PassThru

        - name: Setup database users
          shell: pwsh
          env:
            PGPASSWORD: root
          run: |
            & "$env:PGBIN\createuser" -U postgres -S www-data
            & "$env:PGBIN\createuser" -U postgres -s runner
        




================================================
FILE: .github/workflows/ci-tests.yml
================================================
name: CI Tests

on: [ push, pull_request ]

jobs:
    create-archive:
        runs-on: ubuntu-latest

        steps:
            - uses: actions/checkout@v6
              with:
                submodules: true

            - uses: actions/cache@v5
              with:
                  path: |
                     data/country_osm_grid.sql.gz
                  key: nominatim-country-data-1

            - name: Package tarball
              run: |
                  if [ ! -f data/country_osm_grid.sql.gz ]; then
                      wget --no-verbose -O data/country_osm_grid.sql.gz https://www.nominatim.org/data/country_grid.sql.gz
                  fi
                  cd ..
                  tar czf nominatim-src.tar.bz2 Nominatim
                  mv nominatim-src.tar.bz2 Nominatim

            - name: 'Upload Artifact'
              uses: actions/upload-artifact@v7
              with:
                  name: full-source
                  path: nominatim-src.tar.bz2
                  retention-days: 1

    tests:
        needs: create-archive
        strategy:
            matrix:
                flavour: ["ubuntu-22", "ubuntu-24"]
                include:
                    - flavour: ubuntu-22
                      ubuntu: 22
                      postgresql: 12
                      lua: '5.1'
                      dependencies: pip
                      python: '3.9'
                    - flavour: ubuntu-24
                      ubuntu: 24
                      postgresql: 18
                      lua: '5.3'
                      dependencies: apt
                      python: 'builtin'

        runs-on: ubuntu-${{ matrix.ubuntu }}.04

        steps:
            - uses: actions/download-artifact@v8
              with:
                  name: full-source

            - name: Unpack Nominatim
              run: tar xf nominatim-src.tar.bz2

            - uses: ./Nominatim/.github/actions/setup-postgresql
              with:
                  postgresql-version: ${{ matrix.postgresql }}

            - uses: ./Nominatim/.github/actions/build-nominatim
              with:
                  dependencies: ${{ matrix.dependencies }}

            - uses: actions/cache@v5
              with:
                  path: |
                     /usr/local/bin/osm2pgsql
                  key: osm2pgsql-bin-22-1
              if: matrix.ubuntu == '22'

            - name: Set up Python
              uses: actions/setup-python@v6
              with:
                  python-version: ${{ matrix.python }}
              if: matrix.python != 'builtin'

            - name: Compile osm2pgsql
              run: |
                  if [ ! -f /usr/local/bin/osm2pgsql ]; then
                      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 
                      mkdir osm2pgsql-build
                      cd osm2pgsql-build
                      git clone https://github.com/osm2pgsql-dev/osm2pgsql
                      mkdir build
                      cd build
                      cmake ../osm2pgsql
                      make
                      sudo make install
                      cd ../..
                      rm -rf osm2pgsql-build
                  else
                      sudo apt-get install -y -qq libexpat1 liblua${LUA_VERSION}
                  fi
              if: matrix.ubuntu == '22'
              env:
                  LUA_VERSION: ${{ matrix.lua }}

            - name: Install test prerequisites (apt)
              run: sudo apt-get install -y -qq python3-pytest python3-pytest-asyncio uvicorn python3-falcon python3-aiosqlite python3-pyosmium
              if: matrix.dependencies == 'apt'

            - name: Install test prerequisites (pip)
              run: ./venv/bin/pip install pytest-asyncio falcon starlette asgi_lifespan aiosqlite osmium uvicorn
              if: matrix.dependencies == 'pip'

            - name: Install test prerequisites
              run: ./venv/bin/pip install pytest-bdd

            - name: Install latest flake8
              run: ./venv/bin/pip install -U flake8

            - name: Python linting
              run: ../venv/bin/python -m flake8 src test/python test/bdd
              working-directory: Nominatim

            - name: Install mypy and typechecking info
              run: ./venv/bin/pip install -U mypy types-PyYAML types-jinja2 types-psutil types-requests types-ujson types-Pygments typing-extensions
              if: matrix.dependencies == 'pip'

            - name: Python static typechecking
              run: ../venv/bin/python -m mypy --strict --python-version 3.9 src
              working-directory: Nominatim
              if: matrix.dependencies == 'pip'

            - name: Python unit tests
              run: ../venv/bin/python -m pytest test/python
              working-directory: Nominatim

            - name: BDD tests
              run: |
                  ../venv/bin/python -m pytest test/bdd --nominatim-purge
              working-directory: Nominatim

    tests-windows:
        needs: create-archive
        runs-on: windows-latest

        steps:
            - uses: actions/download-artifact@v8
              with:
                  name: full-source

            - name: Unpack Nominatim
              run: tar xf nominatim-src.tar.bz2

            - uses: ./Nominatim/.github/actions/setup-postgresql-windows
              with:
                  postgresql-version: 17

            - name: Set up Python
              uses: actions/setup-python@v6
              with:
                  python-version: '3.14'

            - name: Install Spatialite
              run: |
                  Invoke-WebRequest -Uri "https://www.gaia-gis.it/gaia-sins/windows-bin-amd64/mod_spatialite-5.1.0-win-amd64.7z" -OutFile "spatialite.7z"
                  7z x spatialite.7z -o"C:\spatialite"
                  echo "C:\spatialite\mod_spatialite-5.1.0-win-amd64" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append

            - name: Install osm2pgsql
              run: |
                  Invoke-WebRequest -Uri "https://osm2pgsql.org/download/windows/osm2pgsql-latest-x64.zip" -OutFile "osm2pgsql.zip"
                  Expand-Archive -Path "osm2pgsql.zip" -DestinationPath "C:\osm2pgsql"
                  $BinDir = Get-ChildItem -Path "C:\osm2pgsql" -Recurse -Filter "osm2pgsql.exe" | Select-Object -ExpandProperty DirectoryName | Select-Object -First 1
                  if (-not $BinDir) {
                      Write-Error "Could not find osm2pgsql.exe"
                      exit 1
                  }
                  echo "$BinDir" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
                  $FullExePath = Join-Path $BinDir "osm2pgsql.exe"
                  echo "NOMINATIM_OSM2PGSQL_BINARY=$FullExePath" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append

            - name: Set UTF-8 encoding
              run: |
                  [System.Console]::OutputEncoding = [System.Text.Encoding]::UTF8

            - name: Install PyICU from wheel
              run: |
                  python -m pip install https://github.com/cgohlke/pyicu-build/releases/download/v2.16.0/pyicu-2.16-cp314-cp314-win_amd64.whl
                  
            - name: Install test prerequisites
              run: |
                  python -m pip install -U pip
                  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

            - name: Python unit tests
              run: |
                  python -m pytest test/python -k "not (import_osm or run_osm2pgsql)"
              working-directory: Nominatim

    install:
        runs-on: ubuntu-latest
        needs: create-archive

        strategy:
            matrix:
                name: [Ubuntu-22, Ubuntu-24]
                include:
                    - name: Ubuntu-22
                      image: "ubuntu:22.04"
                      ubuntu: 22
                      install_mode: install-apache
                    - name: Ubuntu-24
                      image: "ubuntu:24.04"
                      ubuntu: 24
                      install_mode: install-apache

        container:
            image: ${{ matrix.image }}
            env:
                LANG: en_US.UTF-8

        defaults:
            run:
                shell: sudo -Hu nominatim bash --noprofile --norc -eo pipefail {0}

        steps:
            - name: Prepare container (Ubuntu)
              run: |
                  export APT_LISTCHANGES_FRONTEND=none
                  export DEBIAN_FRONTEND=noninteractive
                  apt-get update -qq
                  apt-get install -y git sudo wget
                  ln -snf /usr/share/zoneinfo/$CONTAINER_TIMEZONE /etc/localtime && echo $CONTAINER_TIMEZONE > /etc/timezone
              shell: bash

            - name: Setup import user
              run: |
                  useradd -m nominatim
                  echo 'nominatim   ALL=(ALL:ALL) NOPASSWD: ALL' > /etc/sudoers.d/nominiatim
                  echo "/home/nominatim/Nominatim/vagrant/Install-on-${OS}.sh no $INSTALL_MODE" > /home/nominatim/vagrant.sh
              shell: bash
              env:
                OS: ${{ matrix.name }}
                INSTALL_MODE: ${{ matrix.install_mode }}

            - uses: actions/download-artifact@v8
              with:
                  name: full-source
                  path: /home/nominatim

            - name: Install Nominatim
              run: |
                export USERNAME=nominatim
                export USERHOME=/home/nominatim
                export NOSYSTEMD=yes
                export HAVE_SELINUX=no
                tar xf nominatim-src.tar.bz2
                . vagrant.sh
              working-directory: /home/nominatim

            - name: Prepare import environment
              run: |
                  mv Nominatim/test/testdb/apidb-test-data.pbf test.pbf
                  rm -rf Nominatim
                  mkdir data-env-reverse
              working-directory: /home/nominatim

            - name: Add nominatim to path
              run: |
                sudo ln -s /home/nominatim/nominatim-venv/bin/nominatim /usr/local/bin/nominatim

            - name: Need lua binary
              run: |
                sudo apt-get install -y lua5.4 lua-dkjson

            - name: Print version
              run: nominatim --version
              working-directory: /home/nominatim/nominatim-project

            - name: Print taginfo
              run: lua ./nominatim-venv/lib/*/site-packages/nominatim_db/resources/lib-lua/taginfo.lua
              working-directory: /home/nominatim

            - name: Collect host OS information
              run: nominatim admin --collect-os-info
              working-directory: /home/nominatim/nominatim-project

            - name: Import
              run: nominatim import --osm-file ../test.pbf
              working-directory: /home/nominatim/nominatim-project

            - name: Import special phrases
              run: nominatim special-phrases --import-from-wiki
              working-directory: /home/nominatim/nominatim-project

            - name: Check full import
              run: nominatim admin --check-database
              working-directory: /home/nominatim/nominatim-project

            - name: Warm up database
              run: nominatim admin --warm
              working-directory: /home/nominatim/nominatim-project

            - name: Install osmium
              run: |
                  /home/nominatim/nominatim-venv/bin/pip install osmium

            - name: Run update
              run: |
                  nominatim replication --init
                  NOMINATIM_REPLICATION_MAX_DIFF=1 nominatim replication --once
              working-directory: /home/nominatim/nominatim-project

            - name: Clean up database
              run: nominatim refresh --postcodes --word-tokens
              working-directory: /home/nominatim/nominatim-project

            - name: Run reverse-only import
              run : |
                  echo 'NOMINATIM_DATABASE_DSN="pgsql:dbname=reverse"' >> .env
                  nominatim import --osm-file ../test.pbf --reverse-only --no-updates
              working-directory: /home/nominatim/data-env-reverse

            - name: Check reverse-only import
              run: nominatim admin --check-database
              working-directory: /home/nominatim/data-env-reverse

            - name: Clean up database (reverse-only import)
              run: nominatim refresh --postcodes --word-tokens
              working-directory: /home/nominatim/nominatim-project

    install-no-superuser:
      runs-on: ubuntu-24.04
      needs: create-archive

      steps:
          - uses: actions/download-artifact@v8
            with:
                name: full-source

          - name: Unpack Nominatim
            run: tar xf nominatim-src.tar.bz2

          - uses: ./Nominatim/.github/actions/setup-postgresql
            with:
                postgresql-version: 16

          - uses: ./Nominatim/.github/actions/build-nominatim

          - name: Prepare import environment
            run: |
                mv Nominatim/test/testdb/apidb-test-data.pbf test.pbf
                rm -rf Nominatim

          - name: Prepare Database
            run: |
                ./venv/bin/nominatim import --prepare-database

          - name: Create import user
            run: |
                sudo -u postgres createuser osm-import
                psql -d nominatim -c "ALTER USER \"osm-import\" WITH PASSWORD 'osm-import'"
                psql -d nominatim -c 'GRANT CREATE ON SCHEMA public TO "osm-import"'

          - name: Run import
            run: |
                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

          - name: Check full import
            run: ./venv/bin/nominatim admin --check-database

    migrate:
      runs-on: ubuntu-24.04
      needs: create-archive

      steps:
          - uses: actions/download-artifact@v8
            with:
                name: full-source

          - name: Unpack Nominatim
            run: tar xf nominatim-src.tar.bz2

          - uses: ./Nominatim/.github/actions/setup-postgresql
            with:
                postgresql-version: 18

          - name: Install Python dependencies
            run: |
              sudo apt-get install --no-install-recommends virtualenv osm2pgsql

          - name: Install Nominatim master version
            run: |
              virtualenv master
              cd Nominatim
              ../master/bin/pip install packaging/nominatim-db

          - name: Install Nominatim from pypi
            run: |
              virtualenv release
              ./release/bin/pip install nominatim-db

          - name: Import Nominatim database using release
            run: |
              ./release/bin/nominatim import --osm-file Nominatim/test/testdb/apidb-test-data.pbf
              ./release/bin/nominatim add-data --file Nominatim/test/testdb/additional_api_test.data.osm

          - name: Migrate to master version
            run: |
              ./master/bin/nominatim admin --migrate
              ./release/bin/nominatim add-data --file Nominatim/test/testdb/additional_api_test.data.osm


================================================
FILE: .gitignore
================================================
*.log
*.pyc
*.swp

docs/develop/*.png
site-html

build
dist
.coverage

.vagrant
data/country_osm_grid.sql.gz


================================================
FILE: .gitmodules
================================================


================================================
FILE: .mypy.ini
================================================
[mypy]
plugins = sqlalchemy.ext.mypy.plugin

[mypy-icu.*]
ignore_missing_imports = True

[mypy-asyncpg.*]
ignore_missing_imports = True

[mypy-dotenv.*]
ignore_missing_imports = True


================================================
FILE: AUTHORS
================================================
Nominatim was written by:

* Brian Quinion
* Sarah Hoffmann
* Marc Tobias Metten

* markigail
* AntoJvlt
* gemo1011
* darkshredder

and many more.

For a full list of contributors see the Git logs or visit
https://github.com/openstreetmap/Nominatim/graphs/contributors


================================================
FILE: CONTRIBUTING.md
================================================
# Nominatim contribution guidelines

## Reporting Bugs

Bugs can be reported at https://github.com/openstreetmap/Nominatim/issues.
Please always open a separate issue for each problem. In particular, do
not add your bugs to closed issues. They may look similar to you but
often are completely different from the maintainer's point of view.

If you just have a question or when you are not sure if what you have found
is an actual bug, use the [Discussion section](https://github.com/openstreetmap/Nominatim/discussions).

If you have questions about the underlying OpenStreetMap data rather than
the geocoding software, then the
[OpenStreetMap forum](https://community.openstreetmap.org/) is the best
place to start.

## Workflow for Pull Requests

We love to get pull requests from you. We operate the "Fork & Pull" model
explained at

https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests

You should fork the project into your own repo, create a topic branch
there and then make a single pull requests back to the main repository.
Your pull requests will then be reviewed and discussed.

Enable CI (we use Github Actions workflows) on your fork. It will run the
full test suite whenever you push to one of your branches.
https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository


Please make sure to follow these guidelines:

* Make sure CI passes _before_ opening the pull request. Check the "Actions" tab
  in your repo to make sure everything works.
* Make sure that you have time to react to these comments and amend the code or
  engage in a conversation. Do not expect that others will pick up your code,
  it will almost never happen.
* Open a separate pull request for each issue you want to address.
  Don't mix multiple changes. In particular, don't mix style cleanups with
  feature pull requests (exceptions, see 'Style modernisation' below).
* For small fixes and amendments open a PR directly.
  If you plan to make larger changes, please open an issue first or comment
  on the appropriate issue to outline your planned implementation.

### Using AI-assisted code generators

PRs that include AI-generated content, may that be in code, in the PR
description or in documentation need to

1. clearly mark the AI-generated sections as such, for example, by
   mentioning all use of AI in the PR description, and
2. include proof that you have run the generated code on an actual
   installation of Nominatim. Adding and executing tests will not be
   sufficient. You need to show that the code actually solves the problem
   the PR claims to solve.

## Getting Started with Development

Please see the development section of the Nominatim documentation for

* [an architecture overview](https://nominatim.org/release-docs/develop/develop/overview/)
  and backgrounds on some of the algorithms
* [how to set up a development environment](https://nominatim.org/release-docs/develop/develop/Development-Environment/)
* and background on [how tests are organised](https://nominatim.org/release-docs/develop/develop/Testing/)


## Coding style

The coding style for Python is enforced with flake8. It can be tested with:

```
make lint
```

SQL code is currently not linted but should follow the following rules:

* 2 spaces indentation
* UPPER CASE for all SQL keywords

### Style modernisation

There are a few places where we modernize code style as we go. The following
changes can be made when you touch the code anyway:

* update copyright date in the file header to the current year
* switch Python code to use [generics in standard collections](https://docs.python.org/3/whatsnew/3.9.html#type-hinting-generics-in-standard-collections)

## Testing

Before submitting a pull request make sure that the tests pass:

```
  make tests
```

## Releases

Nominatim follows semantic versioning. Major releases are done for large changes
that require (or at least strongly recommend) a reimport of the databases.
Minor releases can usually be applied to existing databases. Patch releases
contain bug fixes only and are released from a separate branch where the
relevant changes are cherry-picked from the master branch.

Checklist for releases:

* [ ] increase versions in
  * `src/nominatim_api/version.py`
  * `src/nominatim_db/version.py`
* [ ] update `ChangeLog` (copy information from patch releases from release branch)
* [ ] complete `docs/admin/Migration.md`
* [ ] update EOL dates in `SECURITY.md`
* [ ] commit and make sure CI tests pass
* [ ] update OSMF production repo and release new version -post1 there
* [ ] test migration
  * download, build and import previous version
  * migrate using master version
  * run updates using master version
* [ ] prepare tarball:
  * `git clone https://github.com/osm-search/Nominatim` (switch to right branch!)
  * `rm -r .git*`
  * copy country data into `data/`
  * add version to base directory and package
* [ ] upload tarball to https://nominatim.org
* [ ] prepare documentation
  * check out new docs branch
  * change git checkout instructions to tarball download instructions or adapt version on existing ones
  * build documentation and copy to https://github.com/osm-search/nominatim-org-site
  * add new version to history
* [ ] check release tarball
  * download tarball as per new documentation instructions
  * compile and import Nominatim
  * run `nominatim --version` to confirm correct version
* [ ] tag new release and add a release on github.com
* [ ] build pip packages and upload to pypi
  * `make build`
  * `twine upload dist/*`


================================================
FILE: COPYING
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007

Copyright © 2007 Free Software Foundation, Inc. <https://fsf.org/>

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

Preamble

The GNU General Public License is a free, copyleft license for software and other kinds of works.

The 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.

When 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.

To 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.

For 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.

Developers 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.

For 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.

Some 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.

Finally, 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.

The precise terms and conditions for copying, distribution and modification follow.

TERMS AND CONDITIONS

0. Definitions.

“This License” refers to version 3 of the GNU General Public License.

“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.

“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.

To “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.

A “covered work” means either the unmodified Program or a work based on the Program.

To “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.

To “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.

An 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.

1. Source Code.
The “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.

A “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.

The “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.

The “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.

The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.

The Corresponding Source for a work in source code form is that same work.

2. Basic Permissions.
All 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.

You 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.

Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.

3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No 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.

When 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.

4. Conveying Verbatim Copies.
You 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.

You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.

5. Conveying Modified Source Versions.
You 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:

     a) The work must carry prominent notices stating that you modified it, and giving a relevant date.

     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”.

     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.

     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.

A 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.

6. Conveying Non-Source Forms.
You 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:

     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.

     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.

     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.

     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.

     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.

A 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.

A “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.

“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.

If 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).

The 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.

Corresponding 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.

7. Additional Terms.
“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.

When 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.

Notwithstanding 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:

     a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or

     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

     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

     d) Limiting the use for publicity purposes of names of licensors or authors of the material; or

     e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or

     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.

All 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.

If 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.

Additional 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.

8. Termination.
You 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).

However, 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.

Moreover, 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.

Termination 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.

9. Acceptance Not Required for Having Copies.
You 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.

10. Automatic Licensing of Downstream Recipients.
Each 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.

An “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.

You 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.

11. Patents.
A “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”.

A 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.

Each 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.

In 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.

If 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.

If, 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.

A 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.

Nothing 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.

12. No Surrender of Others' Freedom.
If 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.

13. Use with the GNU Affero General Public License.
Notwithstanding 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.

14. Revised Versions of this License.
The 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.

Each 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.

If 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.

Later 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.

15. Disclaimer of Warranty.
THERE 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.

16. Limitation of Liability.
IN 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.

17. Interpretation of Sections 15 and 16.
If 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.

END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs

If 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.

To 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.

     <one line to give the program's name and a brief idea of what it does.>
     Copyright (C) <year>  <name of author>

     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.

     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.

     You should have received a copy of the GNU General Public License along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:

     <program>  Copyright (C) <year>  <name of author>
     This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
     This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.

The 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”.

You 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/>.

The 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>.


================================================
FILE: ChangeLog
================================================
5.3.0
 * reorganise postcode and interpolation handling into separate tables
 * add table for handling associatedStreet relations (thanks @Itz-Agasta)
 * allow TIGER data imports on frozen tables (thanks @AyushDharDubey)
 * add layer filtering option to search cli command (thanks @Itz-Agasta)
 * add support for addr:interpolation together with addr:housenumber
 * add support for exclude_place_ids to take an OSM ID (thanks @Itz-Agasta)
 * add more abbreviations for Malay (thanks @harithilmi)
   and Pakistan (thanks @bgo-eiu)
 * adaptions to boundary processing in Czech Republic, Australia and Brazil
 * return admin_level tag in extratags (thanks @kad-link)
 * clean up table creation SQL and add more constraints
 * add new cli administration tool to grant read rights to a new user
   (thanks @Itz-Agasta)
 * remove uvicorn from the deployment instructions, guvicorn is now sufficient
 * fix entrance output for reverse and lookup
 * fix performance issue with instantiation of config (thanks @AyushDharDubey)
 * fix badly quoted SQL
 * ensure use of UTF-8 everywhere (thanks @kad-link)
 * fix endless loop when indexing only partial ranks (thanks @jayaddison)
 * fix erroring on /search endpoint when Postgresql wasn't running on startup
 * improve searching addresses by addr:* tags (thanks @Itz-Agasta)
 * add langauge-aware penalty for matching country names (thanks @Itz-Agasta)
 * compute default langauge also for linked place names (thanks @jayaddison)
 * use mwparserfromhell for parsing wiki pages (thanks @AyushDharDubey)
 * refactor table creation SQL to be reusable in tests
 * reduce SQL queries for reverse
 * enforce non-null importance and remove all code that expects otherwise
 * add rematching against country names
 * import now reports on total time (thanks @daishu0000)
 * give wikidata matches preference over name matching when linking places
 * removed nat_name from list of parsed names
 * exclude zero-only postcodes
 * type annotation updates due to dependency changes (thanks @vytas5)
 * improve display of test names for BDD tests
 * enable CI unit tests on Windows (thanks @kad-link)
 * remove unused settings from the documentation
 * various fixes and improvements to documentation (thanks @28Deepakpandey,
   @Aditya30ag, @AmmarYasser455, @jonas-endter-optimax-energy, @vai67)

5.2.0
 * increase minimum required Python to 3.9
 * index and output entrances of buildings and areas (thanks @emlove)
 * name tags used for creating display names are now configurable
   (thanks @astridx)
 * new pattern-replacement query preprocessor (thanks @TuringVerified)
 * special phrases can now be filtered by presence of tags (thanks @anqixxx)
 * lua import style now always includes tags required by Nominatim
 * improved query time reporting and logging
 * improve word matching for languages with no word boundaries
 * POIs with addresses inherited from surrounding building are no
   longer returned in the address layer
 * avoid creating a directory for the tokenizer when not needed
 * replace behave with pytest-bdd for BDD testing
 * refactoring and performance improvements to query parsing
 * various smaller updates to styles
 * remove English as default language for South Korea
 * remove Japanese word variants
 * updated country names for Norwegians (thanks @Johannes-Andersen)
 * remove support for deprecated osm2pgsql gazetteer style
 * fix updating of importances (also needs to update search_name table)
 * fix query for deletable endpoint to use index again
 * fix reindexing of contained places when a boundary is deleted and reinstated
 * fix difference computation error when updating postcodes
 * bracket handling sanitizer no longer strips bracket terms in the middle of
   name
 * reduce precision of stored coordinates to 7-digits everywhere
 * avoid ST_Relate as it seems buggy on some systems
 * remove setting for logging queries in DB, no longer functional
 * postcode updates no longer require a project directory (needed for tests)
 * refactor locale handling code (thanks @anqixxx)
 * code updates for newer Python (thanks @emmanuel-ferdman)
 * better test coverage (thanks @asharmalik19)
 * various fixes and improvements to documentation
   (thanks @anqixxx, @dave-meyer, @hasandiwan)

5.1.0
 * replace datrie with simple internal trie implementation
 * add pattern-based postcode parser for queries,
   postcodes no longer need to be present in OSM to be found
 * take variants into account when computing token similarity
 * add extratags output to geocodejson format
 * fix default layer setting used for structured queries
 * update abbreviation lists for Russian and English
   (thanks @shoorick, @IvanShift, @mhsrn21)
 * fix variant generation for Norwegian
 * fix normalization around space-like characters
 * improve postcode search and handling of postcodes in queries
 * reorganise internal query structure and get rid of slow enums
 * enable code linting for tests
 * various code moderinsations in test code (thanks @eumiro)
 * remove setting osm2pgsql location via config.lib_dir
 * make SQL functions parallel save as far as possible (thanks @otbutz)
 * various fixes and improvements to documentation (thanks @TuringVerified)

5.0.0
 * increase required versions for PostgreSQL (12+), PostGIS (3.0+)
 * remove installation via cmake and debundle osm2pgsql
 * remove deprecated PHP frontend
 * remove deprecated legacy tokenizer
 * add configurable pre-processing of queries
 * add query pre-processor to split up Japanese addresses
 * rewrite of osm2pgsql style implementation
   (also adds support for osm2pgsql-themepark)
 * reduce the number of SQL queries needed to complete a 'lookup' call
 * improve computation of centroid for lines with only two points
 * improve bbox output for postcode areas
 * improve result order by returning the largest object when other things are
   equal
 * add fallback for reverse geocoding to default country tables
 * exclude postcode areas from reverse geocoding
 * disable search endpoint when database is reverse-only (regression)
 * minor performance improvements to area split algorithm
 * switch table and index creation to use autocommit mode to avoid deadlocks
 * drop overly long ways during import
 * restrict automatic migrations to versions 4.3+
 * switch linting from pylint to flake8
 * switch tests to use a wikimedia test file in the new CSV style
 * various fixes and improvements to documentation

4.5.0
 * allow building Nominatim as a pip package
 * make osm2pgsql building optional
 * switch importer to psycopg3
 * allow output format of web search to be customized in self-installations
 * look up potential postcode areas for postcode results
 * add word usage statistics for address terms
 * implement more light-weight CSV format for wiki importance tables
 * rewrite SQL for place search to use window functions
 * increase search radius when filtering by postcode
 * prefer POI points over POI areas
 * reintroduce full terms for address terms in search_name table
 * reindex postcodes when their parent is deleted
 * indexing: precompute counts of affected rows
 * ensure consistent country assignments for overlapping countries
 * make Nominatim[Async]API context manager to ensure proper calling of
   close()
 * make usage of project dir optional for library
 * drop interpolations when no parent can be found
 * style tweaks to reflect OSM usage (man_made, highway and others)
 * deprecation of: bundled osm2pgsql, legacy tokenizer, PHP frontend
 * make documentation buildable without CMake
 * various fixes and improvements to documentation

4.4.1
 * fix geocodejson output: admin level output should only print boundaries
 * updating: restrict invalidation of child objects on large street features
 * restrict valid interpolation house numbers to 0-999999
 * fix import error when SQLAlchemy 1.4 and psycopg3 are installed
 * various typo fixes in the documentation

4.4.0
 * add export to SQLite database and SQLite support for the frontend
 * switch to Python frontend as the default frontend
 * update to osm2pgsql 1.11.0
 * add support for new osm2pgsql middle table format
 * simplify geometry for large polygon objects not used in addresses
 * various performance tweaks for search in Python frontend
 * fix regression in search with categories where it was confused with near
   search
 * partially roll back use of SQLAlchemy lambda statements due to bugs
   in SQLAlchemy
 * fix handling of timezones for timestamps from the database
 * fix handling of full address searches in connection with a viewbox
 * fix postcode computation of highway areas
 * fix handling of timeout errors for Python <= 3.10
 * fix address computation for postcode areas
 * fix variable shadowing in osm2pgsql flex script, causing bugs with LuaJIT
 * make sure extratags are always null when empty
 * reduce importance of places without wikipedia reference
 * improve performance of word count computations
 * drop support for wikipedia tags with full URLs
 * replace get_addressdata() SQL implementation with a Python function
 * improve display name for non-address features
 * fix postcode validation for postcodes with country code
   (thanks @pawel-wroniszewski)
 * add possibility to run imports without superuser database rights
   (thanks @robbe-haesendonck)
 * new CLI command for cleaning deleted relations (thanks @lujoh)
 * add check for database version in the CLI check command
 * updates to import styles ignoring more unused objects
 * various typo fixes (thanks @kumarUjjawal)

4.3.2
 * fix potential SQL injection issue for 'nominatim admin --collect-os-info'
 * PHP frontend: fix on-the-fly lookup of postcode areas near boundaries
 * Python frontend: improve handling of viewbox
 * Python frontend: correct deployment instructions

4.3.1
 * reintroduce result rematching
 * improve search of multi-part names
 * fix accidentally switched meaning of --reverse-only and --search-only in
   warm command

4.3.0
 * fix failing importance recalculation command
 * fix merging of linked names into unnamed boundaries
 * fix a number of corner cases with interpolation splitting resulting in
   invalid geometries
 * fix failure in website generation when password contains curly brackets
 * fix broken use of ST_Project in PostGIS 3.4
 * new NOMINATIM_SEARCH_WITHIN_COUNTRIES setting to restrict reverse lookups
   to known countries (thanks @alfmarcua)
 * allow negative OSM IDs (thanks @alfmarcua)
 * disallow import of Tiger data in a frozen DB
 * avoid UPDATE to change settings to be compatible with r/o DBs (thanks @t-tomek)
 * update bundled osm2pgsql to 1.9.2
 * reorganise osm2pgsql flex style and make it the default
 * exclude names ending in :wikipedia from indexing
 * no longer accept comma as a list separator in name tags
 * process forward dependencies on update to catch updates in geometries
   of ways and relations
 * fix handling of isolated silent letters during transliteration
 * no longer assign postcodes to large linear features like rivers
 * introduce nominatim.paths module for finding data and libraries
 * documentation layout changed to material theme
 * new documentation section for library
 * various smaller fixes to existing documentation
   (thanks @woodpeck, @bloom256, @biswajit-k)
 * updates to vagrant install scripts, drop support for Ubuntu 18
   (thanks @n-timofeev)
 * removed obsolete configuration variables from env.defaults
 * add script for generating a taginfo description (thanks @biswajit-k)
 * modernize Python code around BDD test and add testing of Python frontend
 * lots of new BDD tests for API output

4.2.3

 * fix deletion handling for 'nominatim add-data'
 * adapt place_force_delete() to new deletion handling
 * flex style: avoid dropping of postcode areas
 * fix update errors on address interpolation handling

4.2.2

 * extend flex-style library to fully support all default styles
 * fix handling of Hebrew aleph
 * do not assign postcodes to rivers
 * fix string matching in PHP code
 * update osm2pgsql (various updates to flex)
 * fix slow query when deleting places on update
 * fix CLI details query
 * fix recalculation of importance values
 * fix polygon simplification in reverse results
 * add class/type information to reverse geocodejson result
 * minor improvements to default tokenizer configuration
 * various smaller fixes to documentation

4.2.1

 * fix XSS vulnerability in debug view

4.2.0

 * add experimental support for osm2pgsql flex style
 * introduce secondary importance value to be retrieved from a raster data file
   (currently still unused, to replace address importance, thanks to @tareqpi)
 * add new report tool `nominatim admin --collect-os-info`
   (thanks @micahcochran, @tareqpi)
 * reorganise index to improve lookup performance and size
 * run index creation after import in parallel
 * run ANALYZE more selectively to speed up continuation of indexing
 * fix crash on update when addr:interpolation receives an illegal value
 * fix minimum number of retrieved results to be at least 10
 * fix search for combinations of special term + name (e.g Hotel Bellevue)
 * do not return interpolations without a parent street on reverse search
 * improve invalidation of linked places on updates
 * fix address parsing for interpolation lines
 * make sure socket timeouts are respected during replication
   (working around a bug in some versions of pyosmium)
 * update bundled osm2pgsql to 1.7.1
 * add support for PostgreSQL 15
 * typing fixes to work with latest type annotations from typeshed
 * smaller improvements to documentation (thanks to @mausch)

4.1.1

 * fix XSS vulnerability in debug view

4.1.0

 * switch to ICU tokenizer as default
 * add housenumber normalization and support optional spaces during search
 * add postcode format checking and support optional spaces during search
 * add function for cleaning housenumbers in word table
 * add updates/deletion of country names imported from OSM
 * linked places no longer overwrite names from a place permanently
 * move default country name configuration into yaml file (thanks @tareqpi)
 * more compact layout for interpolation and TIGER tables
 * introduce mutations to ICU tokenizer (used for German umlauts)
 * support reinitializing a full project directory with refresh --website
 * fix various issues with linked places on updates
 * add support for external sanitizers and token analyzers
 * add CLI commands for forced indexing
 * add CLI command for version report
 * add offline import mode
 * change geocodejson to return a feature class in the 'type' field
 * add ISO3166-2 to address output (thanks @I70l0teN4ik)
 * improve parsing and matching of addr: tags
 * support relations as street members of associatedStreet
 * better ranking for address results from TIGER data
 * adapt rank classification to changed tag usage in OSM
 * update bundled osm2pgsql to 1.6.0
 * add typing information to Python code
 * improve unit test coverage
 * reorganise and speed up code for BDD tests, drop support for scenes
 * move PHP unit tests to PHP 9.5
 * extensive typo fixes in documentation (thanks @woodpeck,@StephanGeorg,
   @amandasaurus, @nslxndr, @stefkiourk, @Luflosi, @kianmeng)
 * drop official support for installation on CentOS
 * add installation instructions for Ubuntu 22.04
 * add support for PHP8
 * add setup instructions for updates and systemd
 * drop support for PostgreSQL 9.5

4.0.2

 * fix XSS vulnerability in debug view

4.0.1

 * fix initialisation error in replication script
 * ICU tokenizer: avoid any special characters in word tokens
 * better error message when API php script does not exist
 * fix quoting of house numbers in SQL queries
 * small fixes and improvements in search query parsing
 * add documentation for moving the database to a different machine

4.0.0

 * refactor name token computation and introduce ICU tokenizer
   * name processing now happens in the indexer outside the DB
   * reorganizes abbreviation handling and moves it to the indexing phases
   * adds preprocessing of names
 * add country-specific ranking for Spain, Slovakia
 * partially switch to using SP-GIST indexes
 * better updating of dependent addresses for name changes in streets
 * remove unused/broken tables for external housenumbers
 * move external postcodes to CSV format and no longer save them in tables
   (adds support for postcodes for arbitrary countries)
 * remove postcode helper entries from placex (thanks @AntoJvlt)
 * change required format for TIGER data to CSV
 * move configuration of default languages from wiki into config file
 * expect customized configuration files in project directory by default
 * disable search API for reverse-only import (thanks @darkshredder)
 * port most of maintenance/import code to Python and remove PHP utils
 * add catch-up mode for replication
 * add updating of special phrases (thanks @AntoJvlt)
 * add support for special phrases in CSV files (thanks @AntoJvlt)
 * switch to case-independent matching between place and boundary names
 * remove disabling of reverse query parsing
 * minor tweaks to search algorithm to avoid more false positives
 * major overhaul of the administrator and developer documentation
 * add security disclosure policy
 * add testing of installation scripts via CI
 * drop support for Python < 3.6 and Postgresql < 9.5

3.7.3

 * fix XSS vulnerability in debug view

3.7.2

 * fix database check for reverse-only imports
 * do not error out in status API result when import date is missing
 * add array_key_last function for PHP < 7.3 (thanks to @woodpeck)
 * fix more url when server name is unknown (thanks to @mogita)
 * commit changes to replication log table

3.7.1

 * fix smaller issues with special phrases import (thanks @AntoJvlt)
 * add index to speed up continued indexing during import
 * fix index on location_property_tiger(parent_place_id) (thanks @changpingc)
 * make sure Python code is backward-compatible with Python 3.5
 * various documentation fixes

3.7.0

 * switch to dotenv for configuration file
 * introduce 'make install' (reorganising most of the code)
 * introduce nominatim tool as replacement for various php scripts
 * introduce project directories and allow multiple installations from same build
 * clean up BDD tests: drop nose, reorganise step code
 * simplify test database for API BDD tests and autoinstall database
 * port most of the code for command-line tools to Python
   (thanks to @darkshredder and @AntoJvlt)
 * add tests for all tooling
 * replace pyosmium-get-changes with custom internal implementation using
   pyosmium
 * improve search for queries with housenumber and partial terms
 * add database versioning
 * use jinja2 for preprocessing SQL files
 * introduce automatic migrations
 * reverse fix preference of interpolations over housenumbers
 * parallelize indexing of postcodes
 * add non-key indexes to speed up housenumber + street searches
 * switch housenumber field in placex to save transliterated names

3.6.0

 * add full support for searching by and displaying of addr:* tags
 * improve address output for large-area objects
 * better use of country names from OSM data for search and display
 * better debug output for reverse call
 * add support for addr:place links without an place equivalent in OSM
 * improve finding postcodes with normalisation artefacts
 * batch object to index for rank 30, avoiding a wrap-around of transaction
   IDs in PostgreSQL
 * introduce dynamic address rank computation for administrative boundaries
   depending on linked objects and their place in the admin level hierarchy
 * add country-specific address ranking for Indonesia, Russia, Belgium and
   the Netherlands (thanks @hendrikmoree)
 * make sure wikidata/wikipedia tags are imported for all styles
 * make POIs searchable by name and housenumber (thanks @joy-yyd)
 * reverse geocoding now ignores places without an address rank (rivers etc.)
 * installation of a webserver is no longer mandatory, for development
   use the php internal webserver via 'make serve
 * reduce the influence of place nodes in addresses
 * drop support for the unspecific is_in tag
 * various minor tweaks to supplied styles
 * move HTML web frontend into its own project
 * move scripts for processing external data sources into separate directories
 * introduce separate configuration for website (thanks @krahulreddy)
 * update documentation, in particular, clean up development docs
 * update osm2pgsql to 1.4.0

3.5.2

 * ensure that wikipedia tags are imported for all styles
 * reinstate verbosity for indexing during updates
 * make house number reappear in display name on named POIs
 * introduce batch processing in indexer to avoid transaction ID overrun
 * increase splitting for large geometries to improve indexing speed
 * remove deprecated get_magic_quotes_gpc() function
 * make sure that all postcodes have an entry in word and are thus searchable
 * remove use of ST_Covers in conjunction with ST_Intersects,
   causes bad query planning and slow updates in Postgis3
 * update osm2pgsql

3.5.1

 * disable jit and parallel processing in PostgreSQL for osm2pgsql
 * update libosmium to 2.15.6 (fixes an issue with processing hanging
   on large multipolygons)

3.5.0

 * structured select on HTML search page
 * new PHP Nominatim\Shell class to wrap shell escaping
 * remove polygon parameter from all API calls
 * improve handling of postcode areas
 * reorganise place linking algorithm, now using wikidata tag as well
 * remove linkees from search_name and larger_area tables
 * introduce country-specific address ranks
 * reorganise rank address computation
 * cleanup of partition function
 * improve parenting for large POIs
 * add support for Postgresql 12 and Postgis 3
 * add earlier cleanup when --drop is given, to reduce memory usage
 * remove use of place_id in URLs
 * replace C nominatim indexer with a simpler Python implementation
 * split up the huge sql/functions.sql file
 * move osm2pgsql tests to osm2pgsql
 * add new extratags style which imports all tags from OSM
 * add new script for checking the import after completion
 * update osm2pgsql, reducing memory usage
 * use new wikipedia importance and add processing of wikidata tags
 * add search form for details page
 * use ExtraDataPath for country_grid table
 * remove short_name from list of names to be displayed
 * split up CMakeFile, so that all parts can be built separately
 * update installation instructions for CentOS and Ubuntu
 * add script for importing/updating multiple country extracts
 * various documentation improvements

3.4.2

 * fix security bug in /details endpoint where user input was not
   properly sanitized

3.4.1

 * update osm2pgsql to fix hans during updates and lost address numbers
   during updates

3.4.0

 * increase required version for PostgreSQL(9.3), PostGIS(2.2) and PHP(7.0)
 * better error reporting for out-of-memory errors
 * exclude postcode ranges separated by colon from centre point calculation
 * update osm2pgsql, better handling of imports without flatnode file
 * switch to more efficient algorithm for word set computation
 * use only boundaries for country and state parts of addresses
 * improve updates of addresses with housenumbers and interpolations
 * remove country from place_addressline table and use country_code instead
 * optimise indexes on search_name partition tables
 * improve searching of attached streets for large objects like airports
 * drop support for python 2
 * new scripts for importing Wikidata for importance
 * create and drop indexes concurrently to not clash with auto vacuum
 * various documentation improvements


3.3.0

 * zoom 17 in reverse now zooms in on minor streets
 * fix use of postcode relations in address
 * support for housenumber 0 on interpolations
 * replace database abstraction DB with PDO and switch to using exceptions
 * exclude line features at rank 30 from reverse geocoding
 * remove self-reference and country from place_addressline
 * make json output more readable (less escaping)
 * update conversion scripts for postcodes
 * scripts in utils/ are no longer executable (always use scripts in build dir)
 * remove Natural Earth country fallback (OSM is complete enough)
 * make rank assignments configurable
 * allow accept languages with underscore
 * new reverse-only import mode (without search index table)
 * rely on boundaries only for states and countries
 * update osm2pgsql, now using a configurable style
 * provide multiple import styles
 * improve search when house number and postcodes are dropped
 * overhaul of setup code
 * add support for PHPUnit 6
 * update test database
 * various documentation improvements

3.2.0

 * complete rewrite of reverse search algorithm
 * add new geojson and geocodejson output formats
 * add simple export script to export addresses to CSV
 * remove is_in terms from address computation
 * remove unused search_name_country tables
 * various smaller fixes to query parsing
 * convert Tokens and token types to class types
 * correctly handle update when boundary object type is changed
 * improve debug output for /search endpoint
 * update to latest osm2pgsql and leaflet.js
 * overhaul of /details endpoint:
     * new class parameter when using osmtype/osmid parameters
     * permalink to instance-independent osmtype/osmid parameter format
     * new json output format
 * update CentOS vagrant machine to use SELinux
 * add vagrant scripts for Ubuntu 18.04
 * fix build process for BSD
 * enable running the database on a different host than the setup scripts
 * allow to configure use of custom PHP binaries (PHP_BIN)
 * extensive coding style improvements to PHP code
 * more PHP unit tests for new classes
 * increase coverage for API tests
 * add documentation for API

3.1.0

 * rework postcode handling and introduce location_postcode table
 * make setup less verbose and print a summary in the end
 * setup: error out when web site user does not exist
 * add more API tests to complete code coverage
 * reinstate key-value amenity search (special term [key=value])
 * fix detection of coordinates in query
 * various smaller tweaks to ranking of search interpretations
 * complete overhaul of PHP frontend code using OOP
 * add address rank to details page
 * update Tiger scripts for 2017 data and clean up unused code
 * various bug fixes and improvements to UI
 * improve reverse geocoding performance close to coasts
 * more PHP style cleanup (quoting)
 * allow unnamed road in reverse geocoding to avoid too far off results
 * add function to recalculate counts for full-word search term
 * add function to check if new updates are available
 * update documentation and switch to mkdocs for generating HTML

3.0.1

 * fix bug in geometry building algorithm in osm2pgsql
 * fix typos in build instructions

3.0.0

 * move to cmake build system
 * various fixes to HTML output
 * reverse endpoint now can return geometries
 * add support for PHP7
 * move to on-the-fly computation of interpolations
 * improve handling of linked places (updating)
 * improve test framework:
    * replace lettuce with behave
    * use smaller database for API tests
 * drop support for postgres < 9.1, postgis < 2.0 and PHP < 5.4
 * make external data use optional (useful for imports without US)
 * detect postgres and postgis versions automatically
 * clean up query logging and remove unused tables
 * move installation documentation into this repo
 * add self-documenting vagrant scripts
 * remove --create-website, recommend to use website directory in build
 * add accessor functions for URL parameters and improve error checking
 * remove IP blocking and rate-limiting code
 * enable CI via travis
 * reformatting for more consistent coding style
 * make country search term creation part of setup
 * update country names and country grid
 * handle roads that cross boundaries better
 * keep full information on address tags
 * update to refactored osm2pgsql which use libosmium based types
 * switch from osmosis to pyosmium for updates
 * be more strict when matching against special search terms
 * handle postcode entries with multiple values correctly

2.5

 * reverse geocoding includes looking up housenumbers from Tiger data
 * added parameter to return simplified geometries
 * new lookup call for getting address information for OSM objects
 * new namedetails and extratags parameters that expose the name and extratags
   fields of the placex table
 * mobile website
 * reverse web view

2.4

 * drop support for postgres 8.4
 * rewrite address interpolation
 * switch to C++ version of osm2pgsql and rewrite tag filtering
 * support for bridge:name and tunnel:name, man_made, junction
 * drop way-node index (reduces database size by about 15%)
 * add support for configuring tablespaces and webserver user
 * better evaluation of search queries in right-to-left notation
 * improve house number search for streets with many duplicate entries
 * code cleanup (remove unused functions and tables)

2.3

 * further improve ordering of results
 * support for more lat/lon formats in search-as-reverse
 * fix handling of GB postcodes
 * new functional test suite
 * support for waterway relations
 * inherit postcodes from street to poi
 * fix housenumber normalisation to find non-latin house numbers
 * take viewbox into account for ordering of results
 * pois may now inherit address tags from surrounding buildings
 * improve what objects may participate in an address
 * clean up handled class/type combinations to current OSM usage
 * lots of bug fixes

2.2

 * correct database rights for www-data
 * add timestamps for update output
 * load postgis via extension for postgis >= 2.0
 * remove non-admin boundaries from addresses
 * further improve ordering of results with same importance
 * merge addr:postcode tags into object addresses
 * include rank and importance in reverse geocode output
 * replace ST_Line_Interpolate_Point with ST_LineInterpolatePoint
  (for postgis >= 2.1)
 * update osm2pgsql to latest version
 * properly detect changes of admin_level
 * remove landuses when name is removed
 * smaller fixes

2.1

 * update to openlayers 2.12 (now custom built)
 * update fallback OSM boundaries
 * add support for postgresql 9.2/9.3 and postgis 2.x
 * add structured queries
 * add options for polygon output in various formats
   (geojson, svg, kml, postgis text)
 * maintenance functions for deleting objects and updating regions
   (plcae_force_update/place_force_delete)
 * web view for polygons that need deleting
 * rate limiting using memcache
 * improve layout of details page
 * add support for boundary:postal_code
 * full CORS support
 * improve parenting of POIs
 * support for extract daily diffs from Geofabrik
 * support for addresses without a street
   (addr:place and conscription number house numbers)
 * improve layout of word and search_name_* tables
 * support for US ZIP+4 codes
 * refactoring of front-end PHP code
 * lots of smaller bug fixes

2.0.1

 * delete outdated entries from location_area_country
 * remove remaining uses of INTEGER, to allow node ids larger than 2^31


================================================
FILE: LICENSES/Apache-2.0.txt
================================================

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: LICENSES/GPL-2.0-only.txt
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.)  You can apply it to
your programs, too.

  When 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
this service 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.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  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.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

  The precise terms and conditions for copying, distribution and
modification follow.

                    GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License.  The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language.  (Hereinafter, translation is included without limitation in
the term "modification".)  Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.

  1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.

You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.

  2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices
    stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in
    whole or in part contains or is derived from the Program or any
    part thereof, to be licensed as a whole at no charge to all third
    parties under the terms of this License.

    c) If the modified program normally reads commands interactively
    when run, you must cause it, when started running for such
    interactive use in the most ordinary way, to print or display an
    announcement including an appropriate copyright notice and a
    notice that there is no warranty (or else, saying that you provide
    a warranty) and that users may redistribute the program under
    these conditions, and telling the user how to view a copy of this
    License.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on
    the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.

In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of Sections
    1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three
    years, to give any third party, for a charge no more than your
    cost of physically performing source distribution, a complete
    machine-readable copy of the corresponding source code, to be
    distributed under the terms of Sections 1 and 2 above on a medium
    customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer
    to distribute corresponding source code.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form with such
    an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for
making modifications to it.  For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable.  However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

  4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.

  5. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Program or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
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
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all.  For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded.  In such case, this License incorporates
the limitation as if written in the body of this License.

  9. The Free Software Foundation may publish revised and/or new versions
of the 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.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.

  10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

                            NO WARRANTY

  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE 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.

  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE 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.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If 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.

  To 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
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    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 2 of the License, or
    (at your option) any later version.

    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.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:

    Gnomovision version 69, Copyright (C) year name of author
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  `Gnomovision' (which makes passes at compilers) written by James Hacker.

  <signature of Ty Coon>, 1 April 1989
  Ty Coon, President of Vice

This 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.


================================================
FILE: Makefile
================================================
all:

# Building of wheels

build: clean-build build-db build-api

clean-build:
	rm -f dist/*

build-db:
	python3 -m build packaging/nominatim-db --outdir dist/

build-api:
	python3 -m build packaging/nominatim-api --outdir dist/

# Tests

tests: mypy lint pytest bdd

mypy:
	mypy --strict --python-version 3.9 src

pytest:
	pytest test/python

lint:
	flake8 src test/python test/bdd

bdd:
	pytest test/bdd --nominatim-purge

# Documentation

doc:
	mkdocs build

serve-doc:
	mkdocs serve

manpage:
	argparse-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


.PHONY: tests mypy pytest lint bdd build clean-build build-db build-api doc serve-doc manpage


================================================
FILE: README.md
================================================
[![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)

Nominatim
=========

Nominatim (from the Latin, 'by name') is a tool to search OpenStreetMap data
by name and address (geocoding) and to generate synthetic addresses of
OSM points (reverse geocoding). An instance with up-to-date data can be found
at https://nominatim.openstreetmap.org. Nominatim is also used as one of the
sources for the Search box on the OpenStreetMap home page.

Documentation
=============

The documentation of the latest development version is in the
`docs/` subdirectory. A HTML version can be found at
https://nominatim.org/release-docs/develop/ .

Installation
============

The latest stable release can be downloaded from https://nominatim.org.
There 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/).

[Detailed installation instructions for current master](https://nominatim.org/release-docs/develop/admin/Installation)
can be found at nominatim.org as well.

A quick summary of the necessary steps:


1. Clone this git repository and download the country grid

        git clone https://github.com/osm-search/Nominatim.git
        wget -O Nominatim/data/country_osm_grid.sql.gz https://nominatim.org/data/country_grid.sql.gz

2. Create a Python virtualenv and install the packages:

        python3 -m venv nominatim-venv
        ./nominatim-venv/bin/pip install packaging/nominatim-{api,db}

3. Create a project directory, get OSM data and import:

        mkdir nominatim-project
        cd nominatim-project
        ../nominatim-venv/bin/nominatim import --osm-file <your planet file> 2>&1 | tee setup.log


4. Start the webserver:

        ./nominatim-venv/bin/pip install uvicorn falcon
        ../nominatim-venv/bin/nominatim serve


License
=======

The Python source code is available under a GPL license version 3 or later.
The Lua configuration files for osm2pgsql are released under the
Apache License, Version 2.0. All other files are under a GPLv2 license.


Contributing
============

Contributions, bug reports and pull requests are welcome. When reporting a
bug, please use one of the
[issue templates](https://github.com/osm-search/Nominatim/issues/new/choose)
and make sure to provide all the information requested. If you are not
sure if you have really found a bug, please ask for help in the forums
first (see 'Questions' below).

For details on contributing, have a look at the
[contribution guide](CONTRIBUTING.md).


Questions and help
==================

If you have questions about search results and the OpenStreetMap data
used in the search, use the [OSM Forum](https://community.openstreetmap.org/).

For questions, community help and discussions around the software and
your own installation of Nominatim, use the
[Github discussions forum](https://github.com/osm-search/Nominatim/discussions).


================================================
FILE: SECURITY.md
================================================
# Security Policy

## Supported Versions

All Nominatim releases receive security updates for two years.

The following table lists the end of support for all currently supported
versions.

| Version | End of support for security updates |
| ------- | ----------------------------------- |
| 5.3.x   | 2028-04-04                          |
| 5.2.x   | 2027-10-29                          |
| 5.1.x   | 2027-04-01                          |
| 5.0.x   | 2027-02-06                          |
| 4.5.x   | 2026-09-12                          |

## Reporting a Vulnerability

If you believe, you have found an issue in Nominatim that has implications on
security, please send a description of the issue to **security@nominatim.org**.
You will receive an acknowledgement of your mail within 3 work days where we
also notify you of the next steps.

## How we Disclose Security Issues

** The following section only applies to security issues found in released
versions. Issues that concern the master development branch only will be
fixed immediately on the branch with the corresponding PR containing the
description of the nature and severity of the issue. **

Patches for identified security issues are applied to all affected versions and
new minor versions are released. At the same time we release a statement at
the [Nominatim blog](https://nominatim.org/blog/) describing the nature of the
incident.

## List of Previous Incidents

* 2023-11-20 - [SQL injection vulnerability](https://nominatim.org/2023/11/20/release-432.html)
* 2023-02-21 - [cross-site scripting vulnerability](https://nominatim.org/2023/02/21/release-421.html)
* 2020-05-04 - [SQL injection issue on /details endpoint](https://lists.openstreetmap.org/pipermail/geocoding/2020-May/002012.html)


================================================
FILE: VAGRANT.md
================================================
# Install Nominatim in a virtual machine for development and testing

This document describes how you can install Nominatim inside a Ubuntu 24
virtual machine on your desktop/laptop (host machine). The goal is to give
you a development environment to easily edit code and run the test suite
without affecting the rest of your system. 

The installation can run largely unsupervised. You should expect 1h from
start to finish depending on how fast your computer and download speed
is.

## Prerequisites

1. [Virtualbox](https://www.virtualbox.org/wiki/Downloads)

2. [Vagrant](https://www.vagrantup.com/downloads.html)

3. Nominatim

        git clone https://github.com/openstreetmap/Nominatim.git

## Installation

1. Start the virtual machine

        vagrant up ubuntu24-nginx

2. Log into the virtual machine

        vagrant ssh ubuntu24-nginx

3. Import a small country (Monaco)

    See the FAQ how to skip this step and point Nominatim to an existing database.

      ```
      # inside the virtual machine:
      cd nominatim-project
      wget --no-verbose --output-document=monaco.osm.pbf http://download.geofabrik.de/europe/monaco-latest.osm.pbf
      nominatim import --osm-file monaco.osm.pbf 2>&1 | tee monaco.$$.log
      ```

    To repeat an import you'd need to delete the database first

        dropdb --if-exists nominatim



## Development

Vagrant maps the virtual machine's port 8089 to your host machine. Thus you can
see Nominatim in action on [localhost:8089](http://localhost:8089/nominatim/).

You edit code on your host machine in any editor you like. There is no need to
restart any software: just refresh your browser window.

Use the functions of the `log()` object to create temporary debug output.
Add `&debug=1` to the URL to see the output.

In the Python BDD test you can use `logger.info()` for temporary debug
statements.

For more information on running tests, see
https://nominatim.org/release-docs/develop/develop/Testing/


## FAQ

##### Will it run on Windows?

Yes, Vagrant and Virtualbox can be installed on MS Windows just fine. You need
a 64bit version of Windows.

##### Will it run on Apple Silicon?

You might need to replace Virtualbox with [Parallels](https://www.parallels.com/products/desktop/).
There is no free/open source version of Parallels.

##### Why Monaco, can I use another country?

Of course! The Monaco import takes less than 10 minutes and works with 2GB RAM.

##### Will the results be the same as those from nominatim.openstreetmap.org?

No. Long-running Nominatim installations will differ once new import features (or
bug fixes) get added since those usually only get applied to new/changed data.

Also this document skips the optional Wikipedia data import which affects ranking
of search results. See [Nominatim installation](https://nominatim.org/release-docs/latest/admin/Installation)
for details.

##### Why Ubuntu? Can I test CentOS/Fedora/CoreOS/FreeBSD?

There used to be a Vagrant script for CentOS available, but the Nominatim directory
isn't symlinked/mounted to the host which makes development trickier. We used
it mainly for debugging installation with SELinux.

In general Nominatim will run in the other environments. The installation steps
are slightly different, e.g. the name of the package manager, Apache2 package
name, location of files. We chose Ubuntu because that is closest to the
nominatim.openstreetmap.org production environment.

You can configure/download other Vagrant boxes from
[https://app.vagrantup.com/boxes/search](https://app.vagrantup.com/boxes/search).

##### How can I connect to an existing database?

Let's say you have a Postgres database named `nominatim_it` on server `your-server.com`
and port `5432`. The Postgres username is `postgres`. You can edit the `.env` in your
project directory and point Nominatim to it.

    NOMINATIM_DATABASE_DSN="pgsql:host=your-server.com;port=5432;user=postgres;dbname=nominatim_it

No data import or restarting necessary.

If the Postgres installation is behind a firewall, you can try

    ssh -L 9999:localhost:5432 your-username@your-server.com

inside the virtual machine. It will map the port to `localhost:9999` and then
you edit `.env` file with

    NOMINATIM_DATABASE_DSN="pgsql:host=localhost;port=9999;user=postgres;dbname=nominatim_it"

To access postgres directly remember to specify the hostname,
e.g. `psql --host localhost --port 9999 nominatim_it`


##### My computer is slow and the import takes too long. Can I start the virtual machine "in the cloud"?

Yes. It's possible to start the virtual machine on [Amazon AWS (plugin)](https://github.com/mitchellh/vagrant-aws)
or [DigitalOcean (plugin)](https://github.com/smdahlen/vagrant-digitalocean).


================================================
FILE: Vagrantfile
================================================
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  # Apache webserver
  config.vm.network "forwarded_port", guest: 80, host: 8089
  config.vm.network "forwarded_port", guest: 8088, host: 8088

  # If true, then any SSH connections made will enable agent forwarding.
  config.ssh.forward_agent = true

  # Never sync the current directory to /vagrant.
  config.vm.synced_folder ".", "/vagrant", disabled: true

  checkout = "yes"
  if ENV['CHECKOUT'] != 'y' then
    checkout = "no"
  end

  config.vm.provider "hyperv" do |hv, override|
    hv.memory = 2048
    hv.linked_clone = true
    if ENV['CHECKOUT'] != 'y' then
      override.vm.synced_folder ".", "/home/vagrant/Nominatim", type: "smb", smb_host: ENV['SMB_HOST'] || ENV['COMPUTERNAME']
    end
  end

  config.vm.provider "virtualbox" do |vb, override|
    vb.gui = false
    vb.memory = 2048
    vb.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate//vagrant","0"]
    if ENV['CHECKOUT'] != 'y' then
      override.vm.synced_folder ".", "/home/vagrant/Nominatim"
    end
  end

  config.vm.provider "parallels" do |prl, override|
    prl.update_guest_tools = false
    prl.memory = 2048
    if ENV['CHECKOUT'] != 'y' then
      override.vm.synced_folder ".", "/home/vagrant/Nominatim"
    end
  end

  config.vm.provider "libvirt" do |lv, override|
    lv.memory = 2048
    lv.nested = true
    if ENV['CHECKOUT'] != 'y' then
      override.vm.synced_folder ".", "/home/vagrant/Nominatim", type: 'nfs', nfs_udp: false
    end
  end

  config.vm.define "ubuntu22", primary: true do |sub|
      sub.vm.box = "generic/ubuntu2204"
      sub.vm.provision :shell do |s|
        s.path = "vagrant/Install-on-Ubuntu-22.sh"
        s.privileged = false
        s.args = [checkout]
      end
  end

  config.vm.define "ubuntu22-apache" do |sub|
      sub.vm.box = "generic/ubuntu2204"
      sub.vm.provision :shell do |s|
        s.path = "vagrant/Install-on-Ubuntu-22.sh"
        s.privileged = false
        s.args = [checkout, "install-apache"]
      end
  end

  config.vm.define "ubuntu22-nginx" do |sub|
      sub.vm.box = "generic/ubuntu2204"
      sub.vm.provision :shell do |s|
        s.path = "vagrant/Install-on-Ubuntu-22.sh"
        s.privileged = false
        s.args = [checkout, "install-nginx"]
      end
  end

  config.vm.define "ubuntu24" do |sub|
      sub.vm.box = "bento/ubuntu-24.04"
      if RUBY_PLATFORM.include?('darwin') && RUBY_PLATFORM.include?('arm64')
        # Apple M processor
        sub.vm.box = 'gutehall/ubuntu24-04'
      end
      sub.vm.provision :shell do |s|
        s.path = "vagrant/Install-on-Ubuntu-24.sh"
        s.privileged = false
        s.args = [checkout]
      end
  end

  config.vm.define "ubuntu24-apache" do |sub|
      sub.vm.box = "bento/ubuntu-24.04"
      sub.vm.provision :shell do |s|
        s.path = "vagrant/Install-on-Ubuntu-24.sh"
        s.privileged = false
        s.args = [checkout, "install-apache"]
      end
  end

  config.vm.define "ubuntu24-nginx" do |sub|
      sub.vm.box = "bento/ubuntu-24.04"
      sub.vm.provision :shell do |s|
        s.path = "vagrant/Install-on-Ubuntu-24.sh"
        s.privileged = false
        s.args = [checkout, "install-nginx"]
      end
  end
end


================================================
FILE: data/words.sql
================================================
--
-- PostgreSQL database dump
--

SET statement_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;

SET search_path = public, pg_catalog;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- Name: word_frequencies; Type: TABLE; Schema: public; Owner: -; Tablespace: 
--

DROP TABLE IF EXISTS word_frequencies;

CREATE TABLE word_frequencies (
    word_token text,
    count bigint
);

--
-- Data for Name: word_frequencies; Type: TABLE DATA; Schema: public; Owner: -
--

COPY word_frequencies (word_token, count) FROM stdin;
gooseberry	501
qew	501
coaster	501
lubecker st	501
georg st	501
napravlinii	501
r georges bizet	501
jr chang pan xian	501
1550	501
wellington dr	501
starii	501
lundy	501
polizeistation	501
railway rd	501
r st antoine	501
gril	501
wirtschaft	501
ripa	501
minsenv	501
espanya	501
woodend	501
suz	501
sternen	501
mattos	501
schaf	501
mcdonald cr	501
gove	501
cox rd	501
murta	501
fermata	501
agios nikolaos	501
rake	501
dra	501
desportivo	501
talbach	501
n water st	501
prisma	501
banff	501
prigorodnaia ul	501
haller st	501
kabinit	501
zuider	501
krymskaia	501
irlanda	501
patha	501
misery	501
pleasant dr	501
banannarkanin	501
westfild rd	501
giono	501
cree	501
krems	501
hiram	501
st g	501
elkins	501
cantone	501
macchia	501
mex 1	501
adana sanliurfa otoyolu	502
poziomkowa	502
isidore	502
n 117	502
bhyrte	502
camat	502
qili	502
pinecrest dr	502
uva	502
tbr	502
armstrong rd	502
c so giuseppe garibaldi	502
evergreen st	502
grushivskogo vulitsia	502
d 949	502
2190	502
macro	502
pampas	502
rollo	502
viaraya	502
upon	502
baker cr	502
muhlhauser	502
kalinowa	502
coille	502
malteser	502
57a	502
sh25	502
shchirbakova	502
solon	502
e 40 e 41	502
a37	502
veronese	502
lloyd st	502
fructuoso	502
oun	502
purdy	502
mcnair	502
aleflshmaleflyte	502
banja	502
huntsville	502
asti	502
hensley	502
e 451	502
ozira	502
avtomagazin	502
myru st	502
mundial	502
plum cr	502
l 530	502
wainwright	502
schreiber	502
whitefild	502
ul zoi kosmodimianskoi	503
prvomajska	503
carney	503
sh5	503
rispublika	503
grasweg	503
mosconi	503
vistula	503
mclaren	503
seminar	503
arral	503
doshkilnii	503
piani	503
alder st	503
cisco	503
oliver rd	503
mulas	503
taurus	503
tusday	503
honved	503
1 88	503
rosenheimer st	503
labattoir	503
bahama	503
wegkreuz	503
bicicletas	503
refinery	503
dechant	503
mckinley st	503
2111	503
320th st	503
castlereagh	503
doan	503
aleflshhdalefhamza	503
kliuchivaia ul	503
v lazio	503
qtalefr	503
baustoffe	503
krolowej jadwigi	503
ooster	503
blokker	503
963	503
246a	503
hage	503
baixada	503
albion st	503
orbita	503
shearwater	503
zhong hua lu	503
daisy ln	503
keian electric railway keian main ln	503
lewiston	503
amedee	503
caupolican	504
incheon	504
pitt st	504
lokomotiv	504
brandes	504
bejar	504
mcdonald rd	504
nippo	504
shoh	504
weseler st	504
armazem	504
sharaf	504
khy	504
c s sebastian	504
casetta	504
bridger	504
fisher st	504
53k	504
gotthard	504
kreisverband	504
romualdo	504
landbackerei	504
krm	504
j st	504
tryon	504
hubertusweg	504
haustechnik	504
panasa	504
backbone	504
smit	504
sommet	504
carroll st	504
hayes rd	504
miscelanea	504
bramante	504
carmes	504
rocky branch	504
hunyadi janos u	504
bei chuan	504
co rd 28	504
windwood	504
sindicato	504
hulshoff	504
iper	504
economy	504
lepinette	504
mynydd	504
velarde	504
wooded	504
thessalonikes	504
vazhinka	504
hangweg	504
huipyeonzzyx	504
stardust	505
judd	505
c granada	505
gr bd	505
211th	505
turkish	505
simion	505
d 177	505
stockholms	505
5a c	505
valia	505
n 14	505
curt	505
w end	505
erlengrund	505
firmin	505
dig	505
sp233	505
izumi	505
wheatfild	505
markets	505
doll	505
putri	505
biriozovi	505
banki	505
vini	505
ia 27	505
radica	505
church vw	505
hermano	505
a76	505
gospital	505
xxx	505
sp71	505
akazin	505
shared	505
fifth st	505
xiaono	505
durval	505
podlisnaia	505
d 927	505
cis	505
randstad	505
harsfa	505
lawrence av	506
gentle	506
mcquen	506
meadow c	506
gabrila narutowicza	506
paralia	506
nauchno	506
1047	506
orikhovaia	506
adalberto	506
d 929	506
balle	506
jjimjilbang	506
yayayyat	506
odenwald st	506
stoll	506
dortmunder	506
shay	506
ic 2	506
ca 66	506
s fernando	506
trek	506
penedes	506
regato	506
crouch	506
varshavskoi shossi	506
tulane	506
jewett	506
djebel	506
chemistry	506
her	506
poison	506
1013	506
cumberland rd	506
e 903	506
los robles	506
di5	506
fireside	506
r paul cezanne	506
longchamp	506
pastora	506
yakima	506
av general paz	506
abteilung	506
events	506
gyeongjeon ln	506
eira	506
beans	506
lexus	506
standart	506
chas	506
pab	506
a167	506
rauch	506
laureano	506
ap 9	506
konoba	506
mo a	506
wakefild rd	506
co rd e	506
koupali	506
nh30	506
uranus	506
pulku	506
tashkintskaia	506
gioberti	506
pree	507
adnan	507
shalefrain 3	507
arpents	507
mercearia	507
fazant	507
decima	507
tupper	507
seven 1 holdings	507
oak cr	507
1077	507
a470	507
g219	507
peterson rd	507
murchison	507
nibelungen st	507
ukrainska vulitsia	507
bernstein	507
dan in luan huang yuki ze gyeongbu exp s	507
cutter	507
landsborough	507
dust	507
unitarian	507
augenoptik	507
chacon	507
ozirna vulitsia	507
saglik	507
s ding mu	507
yhdys	507
mather	507
ewald	507
townline rd	507
prospikt stroitilii	507
tikhniki	507
s jorge	507
linhares	507
ponente	507
delft	507
comm ctr	507
croas	507
mackenna	507
athlone	507
us 30 alternate old us 330	507
kwiatkowskigo	507
esteves	507
zwickaur	507
1650	507
electrica	507
tasca	507
wurttembergische	507
dao107	507
slovenija	507
mt zion cemetery	507
hiriy	507
limbach	507
starego	507
mzhd	507
preta	507
milliken	507
edgard	507
tiga	507
us 42	507
conn	507
quy	508
geant	508
cavaillon	508
jiffy lube	508
vorosmarty u	508
pitrovskogo vulitsia	508
leopard	508
geneva subdivision	508
lebre	508
anderson av	508
33rd st	508
fourneau	508
v novara	508
woluwe	508
berea	508
stoneouse	508
heritage ln	508
cian	508
pelto	508
alzira	508
stifan	508
s342	508
kamianka	508
rodnichok	508
tx 289	508
okhrany	508
paracelsus	508
spas	508
soccorso	508
brookwood dr	508
las lomas	508
2055	508
donk	508
birches	508
tineretului	508
ecoponto	508
studentenwerk	508
chp	508
rua 16	508
gyeongjeon	508
tolstoi	508
sp70	508
pineridge	508
rouse	508
cowper	508
berens	508
neubaur	508
2040	508
salem church	508
general building	508
bite	508
hansens	508
2191	508
rosemead	508
coffe	508
khntrl	508
kazan	508
cameron rd	509
ani	509
howland	509
pojazdow	509
okmulgee	509
ligne de savenay a landerneau	509
frunzi ul	509
balefnkh mly	509
monteagudo	509
cent	509
wurm	509
dixi rd	509
iuzhnoi	509
barkers	509
r du ch vert	509
luxemburger	509
rope	509
swirczewskigo	509
kongo	509
cruceiro	509
azure	509
pommerai	509
maximilian st	509
hammerweg	509
mission rd	509
redondel	509
ufa	509
r des noyers	509
hanwa	509
furza	509
miller ln	509
arriaga	509
3500	509
stefana batorego	509
karbyshiva	509
mesa dr	509
porche	509
odisskaia	509
2210	509
certosa	509
masarykovo	509
d 618	509
rats	509
absa	509
carpenter rd	509
bellviw	509
tangenziale est	509
barren	509
shms	509
bai chuan	509
vang	509
akacfa	509
ocotillo	509
shvp	509
bradley st	509
tervuren	509
n 25	509
dactivite	509
penna	509
comm rd	509
mechelse stwg	509
bidv	509
r 10	510
verdon	510
av aristide briand	510
bluberry ln	510
bella vsta	510
kiosko	510
chon	510
b 191	510
caruso	510
taqwa	510
voronizhskaia	510
perle	510
huhangyong gaosu	510
m14	510
ballarat	510
sh 14	510
beija	510
talat	510
n mkt st	510
5 kvetna	510
trones	510
dao176	510
orono	510
ebers	510
av presidente vargas	510
manzanillo	510
aydin	510
infancia	510
zikenhuis	510
mangga	510
l 173	510
oficina de correos	510
farr	510
dalniaia ul	510
phahon	510
barber shop	510
pascoal	510
murs	510
krakow	510
tiatralnaia ul	510
mskhn	510
bessi	510
sunlight	510
odori	510
rn6	510
oakcrest	510
laderas	510
frindship church	510
lafayette av	510
goldene	510
ep20	510
huhangyong exp	510
teczowa	510
cerezos	511
kulinariia	511
vysokaia	511
garaze	511
meall	511
stairs	511
tsilinnaia	511
antik	511
karma	511
ukrainky	511
kajaanin	511
wacker	511
latour	511
linder	511
contre	511
buschweg	511
ptitsifabrika	511
privokzalna	511
ruines	511
k 67	511
b 184	511
shalefh	511
columbus st	511
ash gr	511
hms	511
2025	511
n cr	511
asrama	511
converse	511
steinbruchweg	511
ilinka	511
total accs	511
kastell	511
wilden	511
marly	511
eintracht	511
n76	511
keller st	511
hatar	511
e 314	511
brot	511
badgers	511
ptarmigan	511
channing	511
1105	511
negara	511
khristova	512
bliska	512
warrego	512
abadia	512
gibson rd	512
lambeth	512
comuna	512
r louis bleriot	512
3c	512
n 7th av	512
dial	512
popple	512
bighorn	512
winkl	512
republiky	512
beatrix st	512
piramida	512
rabelo	512
e maple st	512
grasse	512
kolk	512
b60	512
fu xing lu	512
leeuw	512
kasprowicza	512
rocket	512
pesantren	512
fabra	512
sotni	512
bezrucova	512
seegraben	512
piacenza	512
potoka	512
montoya	512
longmeadow	512
aparecido	512
p za roma	512
clove	512
cth n	512
newstead	512
zhudalg	512
chante	512
mav	512
daodasdakdabs	513
wangen	513
sp73	513
mshhd	513
tidewater	513
mizhraionnaia	513
tasty	513
haslach	513
rmlte	513
stell	513
vigny	513
melezes	513
chickamauga	513
standort	513
clayton rd	513
waldpark	513
oberlin	513
arroyos	513
r101	513
ze15	513
sivastopolskaia ul	513
pl de verdun	513
landgasthaus	513
rona	513
molise	513
jacint	513
rua onze	513
golden state fwy	513
westerly	513
di4	513
kuopion	513
1 476	513
trinity church	513
hales	513
bartley	513
guo daodasdakdabs hao	513
kayu	513
cr 39	513
food mart	513
schaferei	513
gorkogo st	513
llorenc	513
rameau	513
tresor	513
walter st	513
manson	513
koya	513
doolittle	513
mechanical	513
n gr av	513
ferial	513
thionville	513
sotsialnogo	513
larchen st	513
eckert	513
cevennes	513
secao	513
herrenhaus	513
polivalente	513
iss	514
n 322	514
obsluzhivaniia	514
r augu ste renoir	514
cordel	514
d 643	514
andras	514
kab	514
serge	514
ademar	514
holywell	514
lutter	514
boulay	514
ende	514
vozrozhdinii	514
blu cr	514
platanen	514
bootshaus	514
ulsan	514
av of saints	514
emirates	514
obecni urad	514
rapida	514
pentland	514
asc	514
pleasant hill church	514
morg	514
v dei pini	514
alexander of macedonia	514
p t	514
omsk	514
collettore	514
partizanski	514
l 136	514
lloyds tsb	514
chardonnay	514
st 9	514
vat	514
a df pl	514
olimpiiskii	514
hanover st	514
iturbide	514
golfe	514
1185	514
zhong yang zong wu huan xing xian	514
asp	514
waddell	514
colas	514
guadalquivir	514
chine	514
cottage ln	514
dzamija	514
pioneer dr	514
school number 1	514
amstel	515
aquileia	515
feld bg st	515
cypriana kamila norwida	515
boyd st	515
chiusa	515
hochwald	515
antistaseos	515
bluff rd	515
zhd	515
lastra	515
supercarretera	515
schleswig	515
broome	515
stapleton	515
hunger	515
malinovskogo	515
rn 2	515
alefmalefmzalefdh	515
sony	515
timoteo	515
anas	515
trio	515
wayne st	515
mekong	515
jatoba	515
hillwood	515
ljubljanska	515
groveland	515
mdkhte	515
natalia	515
paradise rd	515
radio shack	515
lamadrid	515
leiten	515
sidings	515
nowej	515
dorm	515
sainsburys local	515
miskii	515
tangerine	515
horny	515
arran	515
private dr	515
b 81	515
aspen ct	515
eifelautobahn	515
kharkovskaia	515
dominicana	515
e 18 ah8	515
savona	515
2070	515
brecon	516
benfica	516
tanka	516
kir	516
menotti	516
st johns cemetery	516
montseny	516
richnoi piriulok	516
harp	516
lupin	516
rua boa vsta	516
71a	516
piute	516
byn	516
cra 28	516
signature	516
xiao tian chuan	516
agraria	516
vvur	516
riqulme	516
volcano	516
shan yang dao	516
confederate	516
bold	516
colibris	516
miskas	516
sportu	516
kool	516
n 24th st	516
yum	516
tojo	516
1 66	516
td bank	516
hough	516
oak rdge rd	516
1s	516
collision	516
borngasse	516
d 820	516
birgit	516
cranbourne	516
devine	516
upt	516
pk bd	516
ostrovskogo vulitsia	516
cards	516
elio	516
sio	516
v cassia	516
simpson rd	516
swing	516
crowne	516
w chester pk	517
sdis	517
guo daodabsdabdak hao	517
sultana	517
rn2	517
hannibal	517
hackett	517
kholiittai bhiiddrbhng	517
av g	517
munch	517
detmolder st	517
yam	517
studinchiskaia ul	517
esportes	517
l 21	517
bhiiddrbhng	517
new r	517
mgdl	517
carson st	517
solnichni piriulok	517
mccloud	517
proliv	517
qua	517
n63	517
highschool	517
amadeo	517
d 220	517
jmy	517
daodabsdabdak	517
stadt graz	517
simona	517
sinagoga	517
siwa	517
texas av	517
okrzei	517
zong guan t lu	517
reten	517
stn depuration	517
spring branch	517
paja	517
dewberry	517
bloomingdale	517
dubki	517
20b	517
lyzhnaia	517
s pablo av	517
sheridan st	517
sevigne	517
tortuga	517
3115	517
lloyds bank	517
micala	517
teaching	517
poplars	518
rosemount	518
raba	518
neva	518
navasiolki	518
abilene	518
giambattista	518
aviator	518
wladyslawa jagilly	518
shhalefb	518
av 5	518
g 11	518
powell rd	518
kopalnia	518
palas	518
mdm	518
us 275	518
quasimodo	518
yothin	518
traurhalle	518
shorewood	518
vysoka	518
rak	518
qusada	518
inside	518
keepers	518
agropecuaria	518
atwater	518
strana	518
1113	518
aubrac	518
sophin	518
zinnia	518
cheonannonsan exp	518
jarv	518
cheonannonsan	518
villefranche	518
hlm	518
shang hai rao cheng gao su	518
sahil	518
culvert	518
859	518
rasen	519
pond st	519
g 7	519
resurrection	519
martir	519
nijverheids	519
iugra	519
wassermuhle	519
4500	519
08a	519
town hall	519
woodbine av	519
reseda	519
abid	519
ibiza	519
kniovna	519
dimitrov	519
r leon blum	519
bouillon	519
clearwater cr	519
worth st	519
vyhlidka	519
argun	519
moseley	519
shanghai ring exp	519
apolo	519
ferte	519
zoll st	519
that	519
olney	519
heywood	519
oakton	519
hashim	519
1170	519
alefltjnb	519
lormeau	519
arda	519
1 280	519
skoki	519
placeta	519
prinsen	519
rhodfa	519
hoyuk	519
kollataja	519
knooppunt	519
maisonneuve	519
arrigo	519
flowage	519
guarderia	519
rutgers	519
proyecto	519
n 3rd av	520
trans niderrhein magistrale	520
mazipi	520
zahir	520
t10	520
pleasant gr church	520
instytut	520
spolecznej	520
weimarer	520
veranda	520
yon	520
b 91	520
d 919	520
ss48	520
pionir	520
us 380	520
carpinteria	520
greenhills	520
homestead dr	520
visual	520
apricot	520
kasai	520
cuckoo	520
kemuning	520
cellar	520
arrayanes	520
1007	520
climat	520
wern	520
r des chardonnerets	520
matilda	520
983	520
berliner al	520
dan in xin gyeongbuseon	520
niki	520
vergel	520
autoroute jean lesage	520
edwarda	520
livi	520
chefferi	520
cliff rd	520
powstancow wilkopolskich	520
abraq	520
c s migul	520
2310	520
badgasse	520
bgn	520
ilse	520
tpu	520
gladstone st	521
janes	521
bernardi	521
vittime	521
taille	521
wisconsin central railroad	521
arodromio	521
boylston	521
jungbugosokdoro	521
r des artisans	521
coxs	521
abrams	521
zadni	521
1214	521
gau	521
blackwater r	521
seabrook	521
filding	521
childers	521
glowackigo	521
tsz	521
norden	521
wurttem	521
v 2 giugno	521
zalisi	521
burns rd	521
basler st	521
drinks	521
long rd	521
wells st	521
rinaldi	521
spotted	521
dinner	521
morristown	521
krolewska	521
giraud	521
pacifica	521
carrollton	521
autumn ln	521
griggs	521
lli	521
callahan	521
margaridas	521
r du pressoir	521
bumi	521
nuclear	521
faidherbe	521
mccarty	521
henderson st	522
unidocente	522
e 13	522
tudela	522
chinh	522
xi huang gao su	522
stanley av	522
ptu	522
k 66	522
bethleem church	522
lucknow	522
selim	522
guo dao8 hao	522
b 17	522
collegiate	522
r du ft	522
quen elizabeth wy	522
a d muhle	522
alkotmany u	522
32nd st	522
minster	522
docks	522
a wisengrund	522
sparse	522
b 255	522
us post office	522
d 218	522
turkestan siberia railway	522
rmk	522
teck	522
ring 2	522
kirchfeld	522
cth h	522
duncan st	522
druck	522
finances	522
sr 72	522
1450	522
oya	522
schnellfahrstrecke koln rh main	522
ug	522
amapa	522
dezesseis	522
o3	522
kifern	522
preparatoria	522
planetarium	522
alianza	522
35th st	522
hsl zuid	522
distretto	522
pokoju	522
burgenland	522
illa	522
pedemontana	522
anaya	522
zion church	522
clubhaus	522
gz	522
gerolamo	522
bydgoska	522
get	522
pazar	522
jester	522
hazen	522
robespirre	522
autoroute felix leclerc	522
bnsf railway	523
brande	523
tourist information	523
jing jiu xian	523
dwrbyn	523
fevereiro	523
ash av	523
tikkurilan	523
khudayr	523
guild	523
khana	523
urozhainaia ul	523
vesta	523
willow wy	523
remise	523
fco	523
like	523
azteca	523
harrell	523
parkhill	523
v monte rosa	523
scalinata	523
boite	523
amberley	523
carretas	523
dushana	523
pridorozhnaia	523
singing	523
tavistock	523
molodiozhni piriulok	523
sr 32	523
frati	523
volgograd	523
stn app	523
mujer	523
pl du champ de foire	523
collada	523
memorial pk	523
wolga	523
gaylord	523
crocetta	523
poul	523
chishma	523
d 603	523
larsen	523
endeavour	523
sportkompliks	523
bakeshop	524
av georges pompidou	524
piles	524
baylor	524
eurospar	524
tirheim	524
a 64	524
osterleden	524
piramide	524
frisen st	524
health ctr	524
golondrinas	524
colne	524
davis ln	524
silvestro	524
teja	524
kazanskaia	524
earle	524
stevens rd	524
keluarga	524
r jules gusde	524
breast	524
horizons	524
neu westbahn	524
uniwersytet	524
foxtail	524
phrrdhphlllng	524
petrol stn	524
maples	524
dawson rd	524
periwinkle	524
jlalefl	524
svoboda	524
mwqf	524
bidwell	524
snowsho	524
roure	524
dixon rd	524
basingstoke	524
sherman av	524
annas	524
varshavskoi	524
n 25th st	524
e14	524
nhs	524
malmo	524
cuiaba	524
halda	524
guo dao186 hao	524
ban ji dian t shen hu xian	524
drinking	524
849	524
rawhide	524
bernice	524
leroy merlin	524
chenevires	524
csarda	524
classroom	524
riddle	525
durant	525
petty	525
gong qian chuan	525
glades	525
windsor st	525
korner st	525
bland	525
chinquapin	525
xiantag	525
fresco	525
litva	525
rick	525
6000	525
druzhbi vulitsia	525
perito	525
o 52	525
sinopec	525
eurospin	525
c 49	525
ivanova	525
guter	525
st andrews rd	525
jarzebinowa	525
gourmand	525
mutter	525
bousqut	525
amarante	525
v matteotti	525
addington	525
pulai	525
ripon	525
kholm	525
expressa	525
observatorio	525
naturel	525
primax	525
caspian	525
immo	525
anggerik	525
badan	525
semi	525
teo	525
artinos	525
grist	525
stn service e leclerc	525
d 216	525
christiana	526
ostkustbanan	526
acacia ln	526
rzemislnicza	526
ager	526
kunterbunt	526
kastanin st	526
1 bruhl	526
palefyyn	526
rongwu	526
sinistro	526
dessau	526
morvan	526
acme	526
zimmerman	526
kozi	526
sharpe	526
z sport pl	526
brink st	526
hackney	526
dao54	526
marks spencer	526
ahon	526
wun	526
cr 42	526
eastwood dr	526
phetkasem rd	526
etap	526
albert einstein st	526
architecture	526
aleflalefswd	526
anvil	526
kashtanovaia	526
pappelallee	526
rais	526
anonima	526
maple cr	526
weid	526
btn	526
libero	526
southwind	526
contour	526
v francesco crispi	526
sodu g	526
opiki	526
s40	526
d 206	526
opshtina	526
zuoxhli	526
helms	526
vanessa	526
nordlicher	526
d 205	526
meteor	526
theodor storm st	526
jingha	526
mecklenburger	526
hangzhou ruili exp	526
national rt 42	526
deutschen	526
raiffaizin bank aval	526
copley	526
colombes	526
ainmalefr	526
lois ln	526
depanneur	527
skipton	527
candle	527
pine ct	527
scott av	527
s215	527
6th st n	527
miradouro	527
golf rd	527
nassau st	527
psj	527
bussteig 1	527
sr 73	527
pineurst dr	527
smolinskoi	527
r40	527
b 109	527
belmont st	527
mladost	527
3a c	527
r de stn	527
chateau deau	527
vostochni piriulok	527
mami	527
nimitz	527
nansen	527
smith cemetery	527
profissionalni	527
azalefdgalefn	527
pichler	527
stringer	527
kings r	527
feurbach	527
tanzschule	527
amal	527
sr 35	527
egan	527
beam	527
kiwanis	527
viwing	527
jizni	527
kuan	527
r 4	527
wohnbau	527
carrizo	527
longviw dr	527
berna	527
1 57	527
e 24	527
3011	527
prioziornaia	527
alpenverein	528
dagubusangan exp	528
se 15th st	528
gasoline	528
robinhood	528
tupac amaru	528
knowle	528
pracy	528
fiacre	528
b 93	528
petar	528
qullen st	528
fame	528
rt t	528
juniper ln	528
bdy st	528
hegi	528
l 78	528
bebe	528
dagubusangan	528
dantoni	528
chana	528
honor	528
beacon st	528
d 178	528
crown st	528
ss4	528
cra 26	528
gruben	528
touristiqu	528
heike	528
odilon	528
dvaro	528
kone	528
gall gall	528
amsel st	528
palefrq	528
jurija	528
bleus	528
geyer	528
thalia	528
dwr	528
mayberry	528
munitsipalni	528
pl dr	528
drink	528
tullys	528
c po	528
prairi av	528
keikyu main ln	528
tool	528
skelly	528
graduate	528
democracia	528
34th st	528
corning	529
itea antirrio	529
w madison st	529
pom	529
meter	529
brig	529
bazin	529
montpelir	529
permanente	529
paderborner	529
dmitra	529
credit mutul de bretagne	529
ruta nacional 3	529
lyndon b johnson fwy	529
almacenes	529
mubarak	529
glengarry	529
kelly st	529
r av	529
bca	529
geren	529
dakar	529
interamericana	529
st 2240	529
jing ha gao su	529
navchalnii	529
wp	529
albrecht durer st	529
caserta	529
nikolskii	529
quiteria	529
migul hidalgo costilla	529
grabowa	529
krasny	529
santambrogio	529
hagebau	529
morrison rd	529
lodewijk	529
dwyer	529
antwerpse stwg	529
old state rd	529
c madrid	529
pretoria	529
bash	529
mahmoud	529
krista	529
2 3	529
gorham	529
elim	529
forces	529
dempster	529
no name	529
bodo	529
dickey	529
amizade	529
outfitters	529
gurtel	529
gaviotas	529
cailloux	529
met	529
kal	529
savickaja vulica	529
ep15	529
clearviw dr	529
parish rd	529
epsom	529
altair	529
horsepen	529
he nei chuan	529
cr 41	529
atha	529
stonewood	529
besucherpark	529
scherer	529
khomeini	529
r mozart	529
l 73	530
temple st	530
st stefan cel mare	530
orwell	530
b 189	530
taha	530
purtas	530
gdn ln	530
tongu	530
portobello	530
muri	530
jovanovitsha	530
bipa	530
olimpiiskaia ul	530
chengkun ln	530
gisborne	530
ottica	530
gallen	530
rua paraiba	530
eastland	530
duclos	530
ul mindiliiva	530
tariq	530
nerudova	530
chenai	530
pez	530
athens thessaloniki evzoni	530
loring	530
klinge	530
crew	530
kharab	530
lakeridge	530
heung	530
volkova	530
editado por ivan arenas	530
mogilki	530
atv	530
karvej	530
vtoraia	530
ethnikes	530
arteaga	530
williams av	530
charanvincharanvinanjilinsan	530
r43	530
browns cr	530
oazis	530
boones	530
medellin	530
thibault	530
old us 330	530
chengkun	530
us 5	531
kandi	531
licenciado	531
geziret	531
howards	531
qumada	531
mirova	531
ashgrove	531
amapolas	531
wyli	531
bosse	531
facundo	531
errekea	531
c sevilla	531
reale	531
fukagawa	531
rua 13 de maio	531
nogura	531
langton	531
mibili	531
s228	531
edoardo	531
julitte	531
arthurs	531
stuart st	531
blumenau	531
bundesanstalt technisches hilfswerk thw	531
stellwerk	531
b 244	531
roti	531
bos ln	531
fomento	531
c s francisco	531
1134	531
sheridan rd	531
barba	531
fontane st	531
b 95	531
80n	531
haverhill	531
hohenzollern st	531
knigi	531
tilsiter st	531
jinshan	531
bellas	531
saddlebrook	531
purdu	531
magdalene	532
s ctr st	532
volontari	532
socita	532
pamiati	532
cinaga	532
dao311	532
r danjou	532
griffin rd	532
poirirs	532
ny g	532
popov	532
pomoshch	532
shuanghli	532
ul tsiolkovskogo	532
consulo	532
northwood dr	532
taitung	532
54a	532
mqr	532
allmend st	532
prumyslova	532
kaffee	532
r jacqus brel	532
holland rd	532
patrice	532
mt pleasant church	532
oaxaca	532
muskrat	532
v umbria	532
sh 82	532
d 163	532
tsin	532
frdwsy	532
nemocnice	532
ujezd	532
makarinko	532
nsr	532
co rd 31	532
lagar	532
cle	532
macarthur bd	532
kas	533
v della vittoria	533
horca	533
giron	533
hawthorne rd	533
ping ru gao su	533
jakes	533
ho hong luan huang yuki ze honam exp	533
marinkapelle	533
harvard av	533
rossiiskoi	533
1 35w	533
red oak dr	533
westelijke	533
1870	533
darmstadt	533
bronze	533
tyrone	533
liberazione	533
s224	533
yardley	533
wingfild	533
bozeny	533
2150	533
beausoleil	533
areas agricolas	533
noce	533
swm2	533
bakke	533
stavok	533
doorman	533
trakiia	533
i shi zi dong ch dao	533
shalefhd	533
sentir cotir	533
royd	533
badminton	533
corran	533
gondola	533
tradgards	533
october	533
h3	533
seccion	533
sherwood rd	533
severin	533
sp82	533
aunweg	533
meurthe	533
evesham	533
byrne	533
dogwood rd	533
n fork feather r	533
towarowa	533
editado	533
sman	533
zeus	533
achadh	533
gd	533
t15	533
feed	533
s61	533
buckner	533
gaspare	534
kuc	534
jeil	534
bouqut	534
eccles	534
mokyklos	534
6th av n	534
s agustin	534
ligne shinkansen sanyo	534
bayswater	534
jackson dr	534
disna	534
wenhua	534
chemi	534
sklady	534
jaune	534
psaje 4	534
duqusne	534
bakr	534
antena	534
church c	534
sanhardio sinkansen	534
dogwood st	534
scott dr	534
barqa	534
luar	534
prolitarska vulitsia	534
giro	534
kibitzweg	534
v delle rose	534
ho hong luan huang yuki ze	534
dan pi xin	534
lilinthal st	534
irvin	534
creation	534
hemlock ln	534
whittington	534
mem	534
success	534
pl du 19 mars 1962	534
beverly dr	534
long chuan	534
ind bd	534
tianjin	534
paradise ln	534
rrrnguuddh	534
marijke	534
mistleto	534
liberty av	534
french broad r	534
eglise notre dame de lassomption	534
rrrnguuddh uulllikorrngiireei	534
uulllikorrngiireei	534
pap	534
corts	535
marbach	535
sargento cabral	535
winter trl	535
shaffer	535
shane	535
securite	535
inspiration	535
korla	535
brugse	535
guillen	535
moveis	535
hitchcock	535
ridgeland	535
szanjo sinkanszen	535
1225	535
chia	535
schaffhauser	535
highpoint	535
footbridge	535
hells	535
odeon	535
w mkt st	535
westway	535
policlinica	535
s western main ln	535
masi	535
aspen ln	535
rua 15	535
mlynsky	535
szanjo	535
admiralty	535
bulldog	535
rua marechal deodoro	535
pizzas	535
bexley	535
yeo	535
bocaiuva	535
l 29	535
parkwood dr	535
yale univ	535
turin	535
schonaur	535
tawil	535
a 89	536
regio	536
lome	536
yayasan	536
giao	536
amour	536
around	536
davy	536
ainlmyn	536
parrot	536
lambs	536
nhw	536
sivirni piriulok	536
kustbanan	536
lida	536
ferruccio	536
hwn	536
falcon dr	536
commonwealth av	536
beyer	536
awg	536
ful stn	536
grossa	536
r13	536
neunkirchen	536
elise	536
dao309	536
gertrudis	536
bk st	536
br 316	536
oranje st	536
cochabamba	536
vtb 24	536
ivy st	536
muvelodesi	536
maraichers	536
gaucho	536
maybach	536
bilorusskaia	536
marcellin	536
indus	536
l 190	536
zhimchuzhina	536
mibilni	536
aleflnby	536
ellis rd	537
torrecilla	537
lindenwood	537
catharina	537
bryant st	537
cth e	537
rude	537
burton rd	537
kampweg	537
branchement	537
iowa st	537
loli	537
tualatin	537
102 qun	537
dao12	537
inst	537
gup	537
ibm	537
saverio	537
gharbiyah	537
al des peuplirs	537
tham	537
1082	537
onder	537
hani	537
badger cr	537
rio parana	537
piters	537
korinthos	537
parr	537
av 4	537
azalea dr	537
volia	537
rund	537
romans	537
2120	537
pk vw	537
consulado	537
turksib	537
n 4th av	537
margarethen	537
rayburn	537
schwartz	537
085	537
jackson cr	537
e 52 e 60	537
aras	537
rejo	537
landon	537
whrf rd	537
traube	537
av rd	537
us 44	537
parcheggio disabili	537
ss51	537
margit	537
carbonera	537
hakodate	538
xin dong ming gao su dao lu	538
b145	538
savane	538
gallagher	538
rodovia comandante joao ribeiro de barros	538
1091	538
desvio	538
thelma	538
a 104	538
ferguson rd	538
karczma	538
eunice	538
mudurlugu	538
kastoria	538
petru	538
mcdougall	538
kz	538
koto	538
rundwanderweg	538
aleksandar makedonski	538
pochinok	538
piu	538
masraf	538
lusine	538
nuri	538
generali	538
betania	538
tulsa	538
post ch ag	538
anderson cr	538
w 17th st	538
sry	538
fysl	538
d885	538
abdon	538
raritan	538
lenoir	538
wingert	538
kickapoo	538
salvia	538
vejlevej	538
1 67	538
ctra santander vinaroz	538
villares	538
huset	538
aleflmdrste	538
bugambilias	538
mure	538
capricorn	538
united states hwy 34	538
dg	538
jenner	538
ss17	538
fix price	538
state ln rd	538
ishun	538
bennet	538
puget	538
a 59	539
polici	539
conrado	539
voru	539
bateau	539
fels	539
polish	539
suryatlalefk	539
cr 46	539
026	539
nashua	539
overhill	539
flaubert	539
cardigan	539
seen	539
abukuma	539
grazhdanskaia ul	539
bricomarche	539
botro	539
l 140	539
meadowlands	539
usina	539
gerrit	539
s eastern main ln	539
l 361	539
fuzhou	539
vinzenz	539
kathryn	539
v s francesco dassisi	539
stalina	539
joubert	539
stocker	539
baleflalef	539
leipzig hof	539
misko	539
dempsey	539
64n	539
stockport	539
ky 80	539
prise	539
chabrowa	539
scizka	539
bono	539
twhyd	539
sp81	540
fees	540
400th	540
hedges	540
mechanic st	540
raabe	540
n31	540
c libertad	540
escanaba	540
ezers	540
grindstone	540
cab	540
rua orquideas	540
clothes	540
ss73	540
d 937	540
tirras	540
peking	540
798	540
flevolijn	540
pacific st	540
narzissenweg	540
butler rd	540
dufour	540
l4	540
l 151	540
tranquil	540
mayenne	540
ipanema	540
darsena	540
homburger	540
horns	540
jaagpad	540
vanguard	540
barbados	540
stocks	540
kayseri	540
pommern	540
villon	540
kiler st	540
importadora	540
militsii	540
windmuhlen	540
praspekt	540
alefljzyrte	540
rua j	540
pok	540
vegyesbolt	540
d 675	541
wuke	541
ditali	541
dimiana	541
almaty	541
dinamarca	541
dkhtralefnh	541
waldler	541
n 432	541
osinovka	541
rt yellowhead	541
ashbrook	541
speed camera	541
menengah	541
manara	541
michelbach	541
hessenweg	541
antigo	541
kalinina ul	541
r des sapins	541
boven	541
kuznichnaia	541
rudnik	541
aleixo	541
rafala	541
r ampere	541
bachelet	541
saraiva	541
michels	541
schellfischlini	541
cranford	541
r du chene	541
boing	541
ikhlas	541
menara	541
complanare	541
gellert	541
amer	541
r50	541
fo shan i huan	541
chenal	541
patuxent	541
arcangel	541
jose maria morelos	541
1036	541
jhalefd	541
phetkasem	541
lennon	542
biologiqu	542
proximite	542
frankston	542
direita	542
denizu	542
ygalefl	542
tirpark	542
adkins	542
ostsee	542
dezoito	542
snowden	542
firth	542
r 24	542
byaleflyq	542
arodromnaia	542
caffetteria	542
valls	542
stetson	542
goth	542
zwirki 1 wigury	542
scranton	542
celio	542
neisse	542
trotter	542
grenzgraben	542
whiteill	542
salguiro	542
loir	542
vvdas	542
l 39	542
donjon	542
e 234	542
v giuseppe parini	542
coupe	542
krutoi	542
hiper	542
corta	542
bazan	542
gave	542
msr	543
hancock st	543
l 163	543
sharps	543
perdido	543
n 601	543
kharbin	543
turkestan	543
hnos	543
magnoliia	543
produce	543
kerk ln	543
koster	543
cisterna	543
stephanus	543
av georges clemenceau	543
july	543
lobby	543
kert	543
av hipolito yrigoyen	543
monastere	543
integracao	543
caseros	543
saka	543
jdwl	543
espina	543
henriqus	543
solidaridad	543
palladio	543
subdivison	543
090	543
nzoz	543
muscat	543
meireles	543
wars	543
old r rd	543
nijverheidsweg	543
kaminica	543
lohe	543
national trust	543
tinistaia ul	543
maan	543
telepizza	544
c s pedro	544
roo	544
sinkanszen	544
tove	544
murmanskoi	544
carlota	544
utopia	544
autoteile	544
bjork	544
fayetteville	544
zilinii	544
brise	544
rayo	544
calade	544
mlyna	544
html	544
therme	544
grote st	544
svirdlova vulitsia	544
khvtsh	544
herrick	544
vins	544
khai	544
shalefrain 2	544
aaa	544
wittener st	544
s 15th st	544
manty	544
belmont rd	544
rodin	544
garros	544
w 18th st	544
buddy	544
pacinotti	544
shainbh	544
gaziantep	544
naif	544
reichenbacher	544
dorfbrunnen	544
zwijger	544
leu	544
eisenacher	544
harding st	544
bryson	544
zay	544
sandusky	545
laurel rd	545
r de provence	545
etos	545
stud	545
caridad	545
rudy	545
tonga	545
fosters	545
hyland	545
cr av	545
szabadsag ter	545
charcuteri	545
g110	545
fischerweg	545
xinjiang	545
d 191	545
archery	545
stanislawa wyspianskigo	545
n 8	545
tamagawa	545
us 56	545
alpenblick	545
crossings	545
torretta	545
weinstube	545
anello	545
mapleton	545
rua da igreja	545
035	545
thomas muntzer st	545
conquista	545
sntr	545
fusilles	545
2031	545
d 224	545
pl des tilleuls	545
nasi	545
tenerife	545
greensboro	545
cela	545
streda	545
barnes rd	545
schoner	545
dekra	545
l 200	545
great clips	545
tejo	545
escola mun de ensino fundamental	545
graig	545
valenciana	545
ulivi	545
4a c	545
cecilio	545
shaheed	545
b 254	545
cra 25	545
sta elena	545
cementerio mun	545
automat	546
farmaci	546
ponent	546
persian	546
d 210	546
s central av	546
hov	546
slack	546
alpine dr	546
gesundheitszentrum	546
hofmark	546
rittergut	546
shan yang dian qi t dao ben xian	546
municipales	546
seoulogwaksunhwangosokdoro	546
mcra	546
74a	546
taylor dr	546
osterfeld	546
oziorni	546
c h	546
botaniqu	546
livres	546
fancy	546
caseys general st	546
movi	546
altona	546
ars	546
balance	546
travail	546
kapsalon	546
strani	546
staufen	546
bigelow	546
sip	546
flagstone	546
medersa	546
podlesna	546
4010	546
cuneo	546
lowery	546
rn 11	547
dawes	547
horou	547
brown av	547
stjepana	547
c 52	547
clifton rd	547
testa	547
lugano	547
wladyslawa broniwskigo	547
bight	547
venizelou	547
qnp	547
andreu	547
k 65	547
ransom	547
kostelni	547
hofgarten	547
jumping	547
las vegas	547
dennen	547
primarschule	547
miniature	547
neris	547
guo dao53 hao	547
s36	547
lidia	547
padiglione	547
farhan	547
reed rd	547
bryd	547
hart st	547
salz st	547
couronne	547
dan in luan huang yuki ze gyeongbu exp n	547
capao	547
sp62	547
bellerive	547
rn34	547
pommir	547
dama	547
christians	547
guo daodabdamdang hao	547
fakultesi	547
sportivna	547
middel	547
dani	547
las vinas	547
rua rosas	547
elgin st	547
255th	547
juri	547
50 st	547
circulation	547
parka	547
cliffe	547
av principal	547
stoneleigh	547
m21	547
reza	547
bordj	547
alter weg	547
e mkt st	547
pluit	547
l 15	548
brewers	548
montagna	548
angostura	548
ze14	548
blaze	548
s338	548
maasdijk	548
venn	548
centrul	548
roccolo	548
tamarac	548
alefbyb	548
coldstream	548
woodmere	548
alessandria	548
edgewood rd	548
r des forges	548
traiteur	548
ul vorovskogo	548
stotis	548
ch des pres	548
biblioteca mun	548
pecanha	548
populiren	548
l 74	548
caselle	548
moa	548
piatra	548
sondergade	548
rosebank	548
pravda	548
toa	548
esteve	548
tanyard	548
a45	548
d 323	548
meadow ct	548
ul bogdana khmilnitskogo	548
martin luther king	548
bunting	548
cumberland st	548
suur	548
kempen	548
a96	548
dellappennino	548
waldsidlung	548
ch du chateau	548
antona	548
a 94	549
hilal	549
bundesanstalt technisches hilfswerk	549
patron	549
s 40	549
vezer	549
c po de futbol	549
rockville	549
lanza	549
seoul ring exp	549
waldheim	549
calzados	549
pinedale	549
pirates	549
anyar	549
raduzhnaia ul	549
optima	549
macia	549
marl	549
etela	549
ferraris	549
rousse	549
dillard	549
clubhouse dr	549
herr	549
savino	549
khaled	549
k 68	549
heine st	549
first church of christ scintist	549
malina	549
dincendi	549
sik	549
b 30	549
rn38	549
65a	549
ingleside	549
1a c	549
pogranichnaia ul	549
tallinna	549
koninginne	549
sobral	549
n33	549
landscape	549
xiang gang you zheng hong kong post	549
ck	549
vercelli	549
puglia	549
medival	549
talca	549
waldfriden	549
stivana	549
zhongshan rd	550
coburn	550
strait	550
federal hwy	550
bunny	550
antrim	550
khralefyb	550
dao18	550
cintura	550
melba	550
reinigung	550
bogdan	550
semmelweis	550
odd	550
sackville	550
benin	550
auto del sur	550
zwembad	550
khmys	550
kalefml	550
1112	550
nahkauf	550
diqu	550
prtco	550
hbnym	550
daodabdamdang	550
rua sta luzia	550
paschi	550
jin chuan	550
collina	550
grobla	550
petanqu	550
duren	550
rsaleflt	550
bergische	550
xiandal	550
barsuki	550
l 116	550
jenni	550
ind rd	550
scar	550
badweg	550
robinwood	550
r marcel pagnol	550
oak gr rd	551
jerrys	551
ze16	551
nair	551
guo dao19 hao	551
lir	551
v giovanni boccaccio	551
charcoal	551
mornington	551
banamex	551
sadova st	551
korczaka	551
ulianova	551
airlines	551
acqu	551
bernat	551
hickey	551
race st	551
sayh	551
tanager	551
lidicka	551
kholiittai	551
nh9	551
clinico	551
fairviw cemetery	551
febbraio	551
corr	551
filles	551
neukirchen	551
ch du lavoir	551
sap	551
a 48	551
kasteel st	551
horcajo	551
b52	551
sykes	551
warsaw	551
giochi	551
zhkkh	551
ul gaidara	551
coles express	551
druckerei	551
bermudez	551
av sao paulo	551
career	551
s222	551
antero	552
superstrada	552
faisal	552
ledesma	552
pitrova	552
jeune	552
diving	552
acevedo	552
wormser	552
g15w	552
cisowa	552
kuytun	552
papen	552
bartholomew	552
prolitarska	552
shasha	552
valta t	552
39a	552
duncan rd	552
artima vulitsia	552
pitrovka	552
r du tilleul	552
clive	552
n 2nd av	552
dezenove	552
r du viux moulin	552
a d bahn	552
r centrale	552
pisacane	553
huffman	553
tunguska	553
renfrew	553
quiktrip	553
gongke	553
984	553
escondida	553
jewellery	553
doon	553
3300	553
latorre	553
corrado	553
falefdl	553
nhm	553
lougheed hwy	553
eren	553
guadarrama	553
gimnazium	553
chanhlu	553
hoher weg	553
mapa	553
windemere	553
r st nicolas	553
breil	553
dinkey cr	553
donnelly	553
zwaluw	553
dotoru	553
syh	553
v stambanan	553
krupp	553
paliw	553
n broad st	553
olive gdn	553
amphitheater	553
350th	553
mannerheimin	553
diga	553
w maple st	553
europea	553
rance	553
danske	554
pinfold	554
shang yu xian	554
gigante	554
don bosco	554
sycamore cr	554
dekalb	554
hsynyh	554
monastir	554
raqul	554
maiakovskogo vulitsia	554
shhdalefy	554
qasim	554
rwe	554
wug	554
laveri	554
albeniz	554
capanna	554
bethel cemetery	554
r 256	554
hausen	554
ctt	554
other	554
sibirskaia ul	554
ruta nacional 14	554
fasanen st	554
orchidees	554
brooks rd	554
fridays	554
riz	554
v mazzini	554
al des chenes	554
brodi	554
ribbon	554
guo daodasdakdass hao	554
thuringer st	554
schonblick	554
defence	554
westerplatte	554
daodasdakdass	554
w state st	554
stearns	554
aleflsryainte	554
zachary	554
n jefferson st	554
valletta	554
vantage	554
geary	554
890	554
arch st	554
cuil	554
hurontario	554
baross	554
pow	555
lerma	555
loise	555
washington rd	555
picton	555
neptun	555
maxime	555
1212	555
amanecer	555
avtozimnik	555
sudhang	555
prevost	555
pawn	555
geranium	555
auto de mediterrania	555
bourse	555
wheatsheaf	555
alimentacion	555
kupang	555
kincaid	555
leatherwood	555
v tevere	555
traktovaia ul	555
sp92	555
economia	555
cathy	555
martin dr	555
woodroffe	555
paddington	555
tinker	555
deerfild dr	555
onibus	555
lombardo	555
glenfild	555
mtn av	555
jordao	555
poz	555
airy	555
lothar	555
natale	555
1035	555
zagorodnaia ul	555
marjori	555
modas	555
knightsbridge	555
las rosas	555
jordan rd	555
liningradskii	555
volks	555
millstream	555
virrey	555
shinjuku	555
salar	555
barnabas	555
c paz	555
vegetable	555
marten	555
salvator	556
kinizsi	556
pavlovka	556
dabrowka	556
cervera	556
n scottsdale rd	556
jula	556
passa	556
davis cr	556
busto	556
886	556
pors	556
b23	556
cromer	556
kidul	556
hali	556
flstyn	556
mahon	556
evangelist	556
magnit kosmitik	556
a300	556
58a	556
jas	556
mollard	556
meisen	556
crepe	556
leonard st	556
vrede	556
microrregiao	556
prospero	556
khngngpsnsdddhlllg	556
hosok	556
rungkut	556
almaden	556
jeovas	556
biltmore	556
caswell	556
dpd	556
pawnshop	556
berzu	556
heck	556
garrido	556
consejo	556
portella	556
st 10	556
101 qun	556
ita vla	556
herenweg	556
v flaminia	556
trafford	556
jacki	556
tranquility	556
04 22	556
baywa	556
town open space	557
berga	557
b 35	557
old farm rd	557
khor	557
grenville	557
ul novosiolov	557
kalan	557
hopfengarten	557
cottage st	557
b 455	557
druid	557
ss115	557
a350	557
sabin	557
kochi	557
castellar	557
r verte	557
cerrillos	557
terrir	557
mlodzizowa	557
l 10	557
abruzzese	557
thumb	557
aleflmtalefr	557
damour	557
obaga	557
rigel	557
oc	557
b 462	557
buna vsta	557
spider	557
ss35	557
huasenv	557
kaminnaia	557
chirvonoarmiiska vulitsia	557
us 410	557
us 91 sr 18	557
gateway dr	557
r de normandi	557
silskogo	557
r jean monnet	557
malek	557
ivroopt	557
bann	557
arnika	557
fu in gao su	558
damaschke	558
bedford st	558
hermon	558
v antonio vivaldi	558
vous	558
chartwell	558
fear	558
maltings	558
ferri	558
heathcote	558
wybudowani	558
wheeler rd	558
nadrzeczna	558
mhaleffzte	558
cerezo	558
gilbert st	558
roseland	558
c dr fleming	558
tela	558
c g	558
kami	558
noronha	558
herndon	558
cadiz subdivision	558
esquinas	558
aussichtspunkt	558
vignoble	558
al nipodleglosci	558
elm ct	558
daphne	558
cantos	558
grind	558
r 5	558
mysliwska	558
d 942	558
mooney	558
belvidere	558
venetian	558
1131	558
sannitico	558
hutt	558
steinmetz	558
roku	558
powell st	558
nova poshta 2	558
vire	558
karla marksa st	558
av de liberte	558
scintifico	559
duin	559
hayes st	559
davis av	559
pokrovskii	559
pl du chateau	559
jakobs	559
andromeda	559
oak hill rd	559
wuppertal	559
florianopolis	559
cripple	559
moors	559
argonne	559
poitirs	559
imports	559
holbein	559
linne	559
geoje	559
ji yan gao su	559
c s isidro	559
iris st	559
travellers	559
auto del cantabrico	559
chambery	559
nato	559
sirena	559
pl de toros	559
bavaria	559
bourke	559
d 219	559
tsara	559
pr bernhard ln	559
ekonom	559
church of nazarene	559
799	559
etats	559
vermeer	559
edmonds	559
chantemerle	559
whiteorse	559
newington	559
voortrekker	559
vereinshaus	559
b 32	559
wildwood ln	559
ayr	559
cory	559
o 4	559
chrzcicila	559
stern st	559
salute	560
las flores	560
midland hwy	560
nc 24	560
55a	560
phillips st	560
s marcos	560
heil	560
magistrala weglowa	560
donskoi	560
quensland	560
ravintola	560
giusto	560
marini	560
crenshaw bd	560
tub	560
tubingen	560
ludal	560
l 288	560
m 19	560
spoor st	560
monitor	560
baroni	560
kalvaria	560
horses	560
svitog	560
vegetarian	560
nevers	560
windsor ct	560
tilos	560
e 421	560
burnley	560
gregoriou	560
henning	560
r de leurope	560
psmar	560
af	560
gregor	560
peripheral	560
antal	560
ladopotamos	560
wody	560
mai dang lao	560
signora	560
laituri	560
nelly	560
svalka	560
kandang	560
coty	560
livio	560
puro	560
blk 2	560
vinschgaur	560
c 65	560
kantonalbank	560
dimas	561
fink	561
applid	561
yanzhiwu	561
officers	561
aoki	561
gradska	561
lesne	561
inga	561
heilbronner st	561
sid	561
d 917	561
columbus av	561
barbiri	561
melia	561
beech rd	561
whitworth	561
besson	561
shmvrt	561
kuznitsova	561
hands	561
fino	561
huan ba tongri	561
yanzhiwu exp	561
baise	561
irene st	561
gosudarstvinnogo	561
himmelreich	561
jackass	561
rubis	561
massachusetts tpk	561
lohr	561
deer run	561
sheetz	561
c 47	561
bussardweg	561
carriage ln	561
plenty	561
harrison rd	561
walt	561
msainwd	561
leben	561
yan zhi wu gao su gong lu	561
a 63	561
impala	561
coyote cr	561
pando	561
moksha	561
konya	561
alexander rd	561
tourismus	561
virag	561
gauss	561
cassidy	561
hama	561
sharm	562
wolters	562
luga	562
mersin	562
chestnut ln	562
ring 1	562
pilas	562
3s	562
bahntrassenradweg	562
malmin	562
q jia	562
hilliard	562
held	562
consolidated	562
johann sebastian bach st	562
tg	562
algeri po ste	562
periphereiake odos	562
pizza express	562
hawthorne dr	562
panhandle	562
mitsui	562
kendo	562
gatewood	562
slim	562
garnett	562
bure	562
adriatico	562
jingzhu exp	562
d 619	562
199th	562
d 840	562
fontenelle	562
waldsee	562
rheintalbahn	562
assiniboine	562
planas	562
betsy	562
48a	562
piraus	562
piton	562
zmaj	562
hamam	562
despagne	562
sfr	562
alder cr	562
paynes	563
u haupt st	563
chongqing	563
valk	563
bagutte	563
oulad	563
olympus	563
uslug	563
gurre	563
nghia	563
voinov	563
gruppa	563
lauberge	563
15n	563
lancaster rd	563
deventerweg	563
associazione	563
r du marche	563
khngngnynnrnnlddgvai	563
n 330	563
damen	563
koblenz	563
89a	563
wels	563
tbain	563
schulbus	563
hollins	563
1141	563
fest pl	563
clairire	563
japon	563
springwater	563
gr13	563
upc	563
pipeline rd	563
n ctr st	563
autostrada dei trafori	563
mikhaila grushivskogo vulitsia	563
filmann	563
petsmart	563
bourges	563
kirsch	563
brune	563
jong	563
ivanovskoi	563
v xxiv maggio	564
kron	564
ruta provincial 11	564
huidu	564
hutchison	564
e 762	564
rheinland	564
superiure	564
dok	564
metzger	564
tumulo	564
sparte	564
castelnuovo	564
nabirizhni	564
commanderi	564
rd 1	564
whistler	564
rib	564
terzo	564
krasna	564
hayfild	564
imp des jardins	564
strawberry ln	564
dinamo	564
r st michel	564
merrimac	564
paroquial	564
travessera	564
jagodowa	564
phra	564
bw 8	564
checkpoint	564
markgrafen	564
uptown	564
narita	564
ze20	564
ready	564
toc	564
eglise st etinne	564
toulon	564
diamantina	565
vrtic	565
pidagogichiskii	565
cervino	565
krainiaia	565
emporio	565
vincents	565
aliksandar makidonski	565
d 468	565
randolph st	565
trafori	565
maschinenbau	565
fantasy	565
belanger	565
r alphonse daudet	565
plantation dr	565
sw st	565
salter	565
harewood	565
damiao	565
mili	565
zacarias	565
c 58	565
bei lu dao	565
drumheller	565
r des fosses	565
nid	565
203rd	565
deken	565
r10	565
buurtweg	565
spanin	565
duck cr	565
alefyylvn	565
residentialarea	565
schilling	565
wasen	565
g7	565
donskaia	565
sr 42 old sr 10	565
quntuop	565
shokoladnitsa	565
popovka	565
vladimirescu	566
bildungszentrum	566
stover	566
arta	566
deesilla	566
khshalefwrzy	566
akademia	566
zeeman	566
burrito	566
szkola podstawowa	566
sesto	566
ryan rd	566
suk	566
bhr	566
1950	566
aurrera	566
banksia	566
c s roqu	566
kuria	566
aromos	566
luang	566
dao186	566
escape	566
phyllis	566
tab	566
forages	566
zrodlana	566
marmol	566
vive	566
3102	566
dancing	566
batavia	566
ep9	567
elzen	567
bagley	567
parkfild	567
kors	567
ul zhukovskogo	567
picacho	567
kitchens	567
mbtsain	567
gobel	567
n90	567
oberen	567
rundkurs	567
royce	567
s305	567
wi 32	567
g321	567
r des vosges	567
lugova vulitsia	567
costa rica	567
n 134	567
v magenta	567
corey	567
v giovanni amendola	567
cuirt	567
hamadi	567
pitka	567
central pk	567
marata	567
garvey	567
bogoroditsi	567
cm 412	567
bathurst st	567
mahendra hwy	567
granary	567
lyautey	567
imia	567
yayla	567
3111	567
walsall	567
tilden	567
earl st	567
2115	567
boni	567
autonoma	567
wilson dr	567
falkenstein	567
qadim	568
essex st	568
pfarr st	568
kinderspil	568
jnc rd	568
meix	568
ambar	568
poso	568
987	568
hussein	568
baraji	568
holly rd	568
1115	568
kazachia	568
anhalt	568
carnarvon	568
brookstone	568
h r blk	568
s311	568
si guo zong guan zi dong ch dao	568
pinturas	568
fach	568
mowbray	568
ladder	568
bamiyan	568
028	568
mylly	568
rindo	568
hallam	568
baitul	568
ch de chapelle	568
19b	568
st georg	568
2d	568
laurel cr	568
v giovanni verga	568
hjr	568
souris	568
loveland	568
simpson st	568
mudrogo	568
beale	568
hornbach	568
v brescia	568
elektrotechnik	568
romualda traugutta	568
wayland	568
d 918	568
johnson dr	568
ivey	568
sviatitilia	568
frg	568
r de bourgogne	568
lh	568
botany	568
agadir	569
agion	569
integrated	569
milne	569
guo dao11 hao	569
nstrn	569
onda	569
beobia	569
dublin rd	569
chastni	569
patel	569
ishikarigawa	569
khoziaistvinni	569
longfild	569
aumailngkrdhrrngkko	569
pobidy ul	569
bunder	569
skrzyzowani	569
kuros	569
chiuahua	569
vidin t	569
daycare	569
vignerons	569
bartolome mitre	569
dade	569
phil	569
e 272	569
16b	569
aubrey	569
d 181	569
223rd	569
3002	569
dres	569
zapote	570
zamecka	570
amadeu	570
chop	570
camper	570
meric	570
1720	570
b 465	570
taleflb	570
l 1140	570
laut	570
shakhta	570
thatcher	570
us 66 old us 99	570
nautico	570
jokai u	570
anges	570
qlyb	570
shoprite	570
b 471	570
than	570
alderwood	570
precision	570
m 40	570
varidades	570
rua da paz	570
adel	570
livanivskogo	570
jamil	570
d 974	570
tolbukhina	570
fistivalnaia ul	570
oakes	570
v degli alpini	570
juniper st	570
sp78	570
slauson	570
52a	570
ma 28	570
johnson ln	570
vaio	570
laporte	570
t16	570
js	571
chartreuse	571
dinfanteri	571
abbot	571
gure	571
e 18th st	571
v cantonale	571
eo7	571
mississauga	571
e 21st st	571
randy	571
c sol	571
poinciana	571
komeri	571
midwest	571
r du 8 mai	571
tampico	571
g323	571
walpole	571
ameghino	571
tompkins	571
macao	571
beek st	571
n 301	571
romao	571
lamarmora	571
v della chisa	571
bina	571
fd	571
blus	571
hickory rd	571
wigwam	571
sandgrube	571
folwark	571
ctra de madrid	571
notaria	572
quiznos	572
irineu	572
dolly	572
cabras	572
maitre	572
arnold st	572
fisk	572
vysokoi	572
b 431	572
chapin	572
gilead	572
kharkivska	572
bluwater	572
engelbert	572
winkel st	572
jeanette	572
hanger	572
centra	572
guss	572
s207	572
ep10	572
veerweg	572
nevado	572
platane	572
summit rd	572
progriss	572
gavilan	572
abbud	572
tura	572
e church st	572
bayerische	572
varas	572
rovnsutoa100	572
gabelsberger st	572
yau	572
planning	572
pret	572
stubbs	572
tetto	572
milton rd	572
union church	572
lamp	572
stantsii	572
buchanan st	572
rosenheim	572
pickens	572
r des ormes	573
mt auk branch	573
dolce vita	573
synalef	573
systeme u	573
mcguire	573
dom byta	573
6362	573
n 9	573
tsintar	573
vinaroz	573
tumbleweed	573
r louise michel	573
whitestone	573
rito	573
grafen	573
amins	573
univ bd	573
av parana	573
depositos	573
erdo	573
kortrijk	573
cra 27	573
kulz	573
rhine	573
kbc	573
associations	573
wallace rd	573
mark st	573
spil pl	573
cevre	573
v pasubio	573
eugeniusza	573
higuras	573
r des carrires	573
pancake	573
v sta lucia	573
alefbrhm	573
lituvos	573
riverton	573
charme	573
bakar	573
keolis	573
hory	573
is rd	573
blu trl	573
chester st	573
centennial dr	573
liningradskoi shossi	574
massachusetts av	574
cornet	574
hato	574
karntner	574
idlewild	574
aksu	574
zhuno	574
combs	574
rmt	574
trevor	574
danji	574
e ctr st	574
m52	574
sano	574
gabrille	574
overflow	574
private sect name no	574
ivrea	574
local private sect name no	574
bifurcacion	574
bearn	574
us 3	574
mnkhm bgyn	574
carro	574
a414	574
orellana	574
distrital	574
khmelnytskoho	574
doran	574
national rt 13	574
wlkp	574
2600	574
jr kagoshima honsen	574
s312	574
sagamore	574
stresemann st	574
verreri	574
niftibaza	574
se st	574
s wales main ln	574
mhlh	574
section 3	574
e 801	574
bild	575
rozen st	575
leuvense stwg	575
kopi	575
goa	575
chemnitzer st	575
birizka	575
tanners	575
schumann st	575
baudelaire	575
josef st	575
sault	575
nivo	575
kuwait	575
hmalefdy	575
riachulo	575
klinovaia	575
suka	575
galitskogo	575
lynn st	575
ainalefmr	575
pikin	575
sh7	575
brad	575
tanneri	575
halstead	575
bloor	575
buissons	575
cocina	575
yang an t lu	575
glavnaia	575
b 203	575
fuchsweg	575
chantry	575
covadonga	575
vody	575
ft st	575
bradford rd	575
chancery	575
veteran	575
n52	575
208th	575
nang	575
inspection	575
boro	575
virkhniaia ul	575
mita	575
g111	575
kea 1	575
tran	575
d 159	575
infirmary	575
1130	575
reit pl	576
r pirre brossolette	576
senioren	576
trucks	576
yukun exp	576
pyeong qigyakhli luan huang yuki ze	576
troitskaia	576
vorder	576
av f	576
zhong yang xian	576
caddo	576
d 606	576
eclipse	576
aurbach	576
kostiol	576
av du marechal leclerc	576
yukun	576
b 209	576
ebe	576
ikot	576
dich	576
shipley	576
s sebastian	576
colors	576
samarkand	576
toronto district school board	576
muan	576
ting1	576
tournai	576
856	576
qigyakhli	576
bayda	576
ashcroft	576
jose hernandez	576
balbin	576
pitrol	576
klettersteig	576
cordelirs	576
nau	576
daily yamazaki	576
steingasse	576
d 215	576
tongyeong	576
lerdo	576
3106	576
cataluna	576
co rd 30	576
n21	576
holzbau	576
us 131	576
linii	576
ep16	577
aleksandrowka	577
lalef	577
cercado	577
f2	577
transformator wizowy	577
vecchi	577
ostergade	577
chapaiva ul	577
flow	577
bard	577
smak	577
aleflbnk	577
balcarce	577
daquitaine	577
reformhaus	577
aix	577
stredisko	577
csapos kut	577
lp 8	577
jabir	577
ddhi	577
williams cr	577
kecil	577
admin	577
shale	577
frind	577
kalk	577
seidel	577
burger st	577
locust av	577
wilhelm busch st	577
synagoge	577
pong	577
frituur	577
passion	577
yu in luan huang yuki ze	577
carlsbad	577
dorozhni	577
odvojak	577
marii sklodovskoi kiuri vulitsia	577
e 125	577
janvir	577
r des tulipes	577
pleasure	578
a 41	578
lituva	578
2027	578
967	578
dzialkowe	578
porter rd	578
nahon	578
estuary	578
poinsettia	578
w jefferson st	578
huong	578
haharina	578
condamine	578
maybank	578
prunus	578
sr439	578
landshuter	578
akushirskii	578
sklodovskoi	578
v st	578
b 43	578
hopfen	578
manso	578
nh47	578
dong jiu zhou zi dong ch dao	578
najswitszego	578
autov del norde ste	578
2610707	578
milutina	578
eschen	578
pine rdge rd	578
shaurma	578
abdellah	578
kop	578
kepala	578
calzado	578
voronizh	578
roxas	578
firm	578
epulet	579
rua palmeiras	579
stockbridge	579
d 996	579
mallard dr	579
manaus	579
l 523	579
wendel	579
st 2244	579
coudray	579
lanark	579
buk	579
n 430	579
n 1st av	579
badi	579
union cemetery	579
brook rd	579
us 66 historic	579
hunyadi u	579
bruckenweg	579
northbrook	579
carrira	579
luki	579
a65	579
cavallo	579
dalefwd	579
sovkhoza	579
issa	579
meike	579
sp61	579
40th st	579
safra	579
elmwood dr	579
blackberry ln	579
melchor ocampo	579
pale	579
alpha bank	579
malinovaia	579
kosmitik	579
arantes	579
wizowy	579
bilac	579
papineau	579
marlene	579
viljandi	579
pilone	579
ep11	579
dourado	579
eyth	579
dari	579
mercadinho	580
minister	580
huan qi tongri	580
rollin	580
stadtwald	580
host	580
bernabe	580
denia	580
vorm	580
umgeungs st	580
hshtm	580
jagdhutte	580
ultra	580
studi	580
cerny	580
pitrovskoi	580
alefy	580
bogen st	580
lapin	580
battaglia	580
r grande	580
verdugo	580
gezelle	580
nanarupusu	580
reconquista	580
frontenac	580
damon	580
pomeroy	580
ctra de gijon a sevilla	580
himalaya	580
muhl bg	580
r des frenes	580
trot	580
students	581
mascarenhas	581
tsintralni rynok	581
pinho	581
polyvalent	581
tite	581
santiago del estero	581
e 871	581
garii	581
tuba	581
uss	581
st 8	581
meri	581
samgeori	581
35w	581
viajes	581
locust ln	581
csapos	581
surprise	581
gottinger	581
05 23	581
socidade	581
oliver st	581
b 170	581
coleridge	581
rampart	581
pionirskii piriulok	581
binder	581
krzysztofa	582
larrea	582
wilhelmina ln	582
young rd	582
douane	582
ul dimitrova	582
hebel	582
heatherwood	582
agenzia	582
torrens	582
ermine	582
e 803	582
2a av	582
diba	582
d 960	582
crawley	582
barge	582
obligado	582
zetkin	582
c del sol	582
mdyryte	582
sivastopolskaia	582
parku	582
navoi	582
d 948	582
r de prairi	582
karlsruher st	582
liniinaia ul	582
ss62	582
chuck	582
calvary baptist church	582
superiur	582
wynn	582
mein	582
frhng	582
chartered	582
zhi jian chuan	582
chennai	582
st nikolaus	582
vendeglo	582
potable	582
roos	582
fox st	582
kurfursten	582
central exp	582
tisserands	582
worship	582
appulo	583
olaf	583
planalto	583
ser	583
a t u	583
recife	583
republicii	583
amancio	583
coria	583
yongin	583
galveston	583
tuwima	583
dobo	583
iuzhno	583
bua	583
basile	583
lade st	583
ep17	583
rosali	583
baz	583
landsberger st	583
gasthuis	583
gerber st	583
calders	583
sidewalk	583
13b	583
tickets	583
jyvaskylan t	583
orzechowa	583
kardynala stefana wyszynskigo	583
perugia	583
venti	583
stredni	583
kremser	583
lan nan gao su	583
paulou	583
shar	583
khirr	583
peyre	583
aftokinitodromos	584
kentrikis	584
elche	584
mwy 7 central peloponnese	584
palmares	584
xi pan gao su	584
zoltan	584
5 de febrero	584
myanmar	584
autokinetodromos 7 kentrikes 
Download .txt
gitextract_d41547bl/

├── .codespellrc
├── .flake8
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── config.yml
│   │   ├── feature_request.md
│   │   ├── report-issues-with-search-results.md
│   │   └── report-problems-with-the-software.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── actions/
│   │   ├── build-nominatim/
│   │   │   └── action.yml
│   │   ├── setup-postgresql/
│   │   │   └── action.yml
│   │   └── setup-postgresql-windows/
│   │       └── action.yml
│   └── workflows/
│       └── ci-tests.yml
├── .gitignore
├── .gitmodules
├── .mypy.ini
├── AUTHORS
├── CONTRIBUTING.md
├── COPYING
├── ChangeLog
├── LICENSES/
│   ├── Apache-2.0.txt
│   └── GPL-2.0-only.txt
├── Makefile
├── README.md
├── SECURITY.md
├── VAGRANT.md
├── Vagrantfile
├── data/
│   └── words.sql
├── docs/
│   ├── admin/
│   │   ├── Advanced-Installations.md
│   │   ├── Deployment-Python.md
│   │   ├── Faq.md
│   │   ├── Import.md
│   │   ├── Installation.md
│   │   ├── Maintenance.md
│   │   ├── Migration.md
│   │   ├── Setup-Nominatim-UI.md
│   │   └── Update.md
│   ├── api/
│   │   ├── Details.md
│   │   ├── Faq.md
│   │   ├── Lookup.md
│   │   ├── Output.md
│   │   ├── Overview.md
│   │   ├── Reverse.md
│   │   ├── Search.md
│   │   └── Status.md
│   ├── customize/
│   │   ├── Country-Settings.md
│   │   ├── Import-Styles.md
│   │   ├── Importance.md
│   │   ├── Overview.md
│   │   ├── Postcodes.md
│   │   ├── Ranking.md
│   │   ├── Result-Formatting.md
│   │   ├── SQLite.md
│   │   ├── Settings.md
│   │   ├── Special-Phrases.md
│   │   ├── Tiger.md
│   │   └── Tokenizers.md
│   ├── develop/
│   │   ├── Database-Layout.md
│   │   ├── Development-Environment.md
│   │   ├── ICU-Tokenizer-Modules.md
│   │   ├── Indexing.md
│   │   ├── Testing.md
│   │   ├── Tokenizers.md
│   │   ├── address-tables.plantuml
│   │   ├── data-sources.md
│   │   ├── osm2pgsql-tables.plantuml
│   │   ├── overview.md
│   │   ├── parenting-flow.plantuml
│   │   └── search-tables.plantuml
│   ├── extra.css
│   ├── index.md
│   ├── library/
│   │   ├── Configuration.md
│   │   ├── Getting-Started.md
│   │   ├── Input-Parameter-Types.md
│   │   ├── Low-Level-DB-Access.md
│   │   ├── NominatimAPI.md
│   │   └── Result-Handling.md
│   ├── mk_install_instructions.py
│   └── styles.css
├── lib-lua/
│   ├── flex-base.lua
│   ├── import-address.lua
│   ├── import-admin.lua
│   ├── import-extratags.lua
│   ├── import-full.lua
│   ├── import-street.lua
│   ├── taginfo.lua
│   └── themes/
│       └── nominatim/
│           ├── init.lua
│           ├── presets.lua
│           └── topics/
│               ├── address.lua
│               ├── admin.lua
│               ├── full.lua
│               └── street.lua
├── lib-sql/
│   ├── functions/
│   │   ├── associated_street_triggers.sql
│   │   ├── importance.sql
│   │   ├── interpolation.sql
│   │   ├── partition-functions.sql
│   │   ├── place_triggers.sql
│   │   ├── placex_triggers.sql
│   │   ├── postcode_triggers.sql
│   │   ├── ranking.sql
│   │   ├── updates.sql
│   │   └── utils.sql
│   ├── functions.sql
│   ├── grants.sql
│   ├── indices.sql
│   ├── partition-tables.src.sql
│   ├── postcode_tables.sql
│   ├── table-triggers.sql
│   ├── tables/
│   │   ├── addressline.sql
│   │   ├── entrance.sql
│   │   ├── import_reports.sql
│   │   ├── importance_tables.sql
│   │   ├── interpolation.sql
│   │   ├── location_area.sql
│   │   ├── nominatim_properties.sql
│   │   ├── placex.sql
│   │   ├── postcodes.sql
│   │   ├── search_name.sql
│   │   ├── status.sql
│   │   └── tiger.sql
│   ├── tables.sql
│   ├── tiger_import_finish.sql
│   ├── tiger_import_start.sql
│   └── tokenizer/
│       └── icu_tokenizer.sql
├── man/
│   ├── create-manpage.py
│   └── nominatim.1
├── mkdocs.yml
├── munin/
│   ├── nominatim_importlag
│   ├── nominatim_query_speed
│   └── nominatim_requests
├── nominatim-cli.py
├── packaging/
│   ├── nominatim-api/
│   │   ├── COPYING
│   │   ├── README.md
│   │   ├── extra_src/
│   │   │   └── paths.py
│   │   └── pyproject.toml
│   └── nominatim-db/
│       ├── COPYING
│       ├── README.md
│       ├── extra_src/
│       │   └── nominatim_db/
│       │       └── paths.py
│       ├── pyproject.toml
│       └── scripts/
│           └── nominatim
├── settings/
│   ├── address-levels.json
│   ├── country-names/
│   │   ├── ad.yaml
│   │   ├── ae.yaml
│   │   ├── af.yaml
│   │   ├── ag.yaml
│   │   ├── ai.yaml
│   │   ├── al.yaml
│   │   ├── am.yaml
│   │   ├── ao.yaml
│   │   ├── ar.yaml
│   │   ├── at.yaml
│   │   ├── au.yaml
│   │   ├── az.yaml
│   │   ├── ba.yaml
│   │   ├── bb.yaml
│   │   ├── bd.yaml
│   │   ├── be.yaml
│   │   ├── bf.yaml
│   │   ├── bg.yaml
│   │   ├── bh.yaml
│   │   ├── bi.yaml
│   │   ├── bj.yaml
│   │   ├── bm.yaml
│   │   ├── bn.yaml
│   │   ├── bo.yaml
│   │   ├── br.yaml
│   │   ├── bs.yaml
│   │   ├── bt.yaml
│   │   ├── bw.yaml
│   │   ├── by.yaml
│   │   ├── bz.yaml
│   │   ├── ca.yaml
│   │   ├── cd.yaml
│   │   ├── cf.yaml
│   │   ├── cg.yaml
│   │   ├── ch.yaml
│   │   ├── ci.yaml
│   │   ├── ck.yaml
│   │   ├── cl.yaml
│   │   ├── cm.yaml
│   │   ├── cn.yaml
│   │   ├── co.yaml
│   │   ├── cr.yaml
│   │   ├── cu.yaml
│   │   ├── cv.yaml
│   │   ├── cy.yaml
│   │   ├── cz.yaml
│   │   ├── de.yaml
│   │   ├── dj.yaml
│   │   ├── dk.yaml
│   │   ├── dm.yaml
│   │   ├── do.yaml
│   │   ├── dz.yaml
│   │   ├── ec.yaml
│   │   ├── ee.yaml
│   │   ├── eg.yaml
│   │   ├── eh.yaml
│   │   ├── er.yaml
│   │   ├── es.yaml
│   │   ├── et.yaml
│   │   ├── fi.yaml
│   │   ├── fj.yaml
│   │   ├── fk.yaml
│   │   ├── fm.yaml
│   │   ├── fo.yaml
│   │   ├── fr.yaml
│   │   ├── ga.yaml
│   │   ├── gb.yaml
│   │   ├── gd.yaml
│   │   ├── ge.yaml
│   │   ├── gg.yaml
│   │   ├── gh.yaml
│   │   ├── gi.yaml
│   │   ├── gl.yaml
│   │   ├── gm.yaml
│   │   ├── gn.yaml
│   │   ├── gq.yaml
│   │   ├── gr.yaml
│   │   ├── gs.yaml
│   │   ├── gt.yaml
│   │   ├── gw.yaml
│   │   ├── gy.yaml
│   │   ├── hn.yaml
│   │   ├── hr.yaml
│   │   ├── ht.yaml
│   │   ├── hu.yaml
│   │   ├── id.yaml
│   │   ├── ie.yaml
│   │   ├── il.yaml
│   │   ├── im.yaml
│   │   ├── in.yaml
│   │   ├── io.yaml
│   │   ├── iq.yaml
│   │   ├── ir.yaml
│   │   ├── is.yaml
│   │   ├── it.yaml
│   │   ├── je.yaml
│   │   ├── jm.yaml
│   │   ├── jo.yaml
│   │   ├── jp.yaml
│   │   ├── ke.yaml
│   │   ├── kg.yaml
│   │   ├── kh.yaml
│   │   ├── ki.yaml
│   │   ├── km.yaml
│   │   ├── kn.yaml
│   │   ├── kp.yaml
│   │   ├── kr.yaml
│   │   ├── kw.yaml
│   │   ├── ky.yaml
│   │   ├── kz.yaml
│   │   ├── la.yaml
│   │   ├── lb.yaml
│   │   ├── lc.yaml
│   │   ├── li.yaml
│   │   ├── lk.yaml
│   │   ├── lr.yaml
│   │   ├── ls.yaml
│   │   ├── lt.yaml
│   │   ├── lu.yaml
│   │   ├── lv.yaml
│   │   ├── ly.yaml
│   │   ├── ma.yaml
│   │   ├── mc.yaml
│   │   ├── md.yaml
│   │   ├── me.yaml
│   │   ├── mg.yaml
│   │   ├── mh.yaml
│   │   ├── mk.yaml
│   │   ├── ml.yaml
│   │   ├── mm.yaml
│   │   ├── mn.yaml
│   │   ├── mr.yaml
│   │   ├── ms.yaml
│   │   ├── mt.yaml
│   │   ├── mu.yaml
│   │   ├── mv.yaml
│   │   ├── mw.yaml
│   │   ├── mx.yaml
│   │   ├── my.yaml
│   │   ├── mz.yaml
│   │   ├── na.yaml
│   │   ├── ne.yaml
│   │   ├── ng.yaml
│   │   ├── ni.yaml
│   │   ├── nl.yaml
│   │   ├── no.yaml
│   │   ├── np.yaml
│   │   ├── nr.yaml
│   │   ├── nu.yaml
│   │   ├── nz.yaml
│   │   ├── om.yaml
│   │   ├── pa.yaml
│   │   ├── pe.yaml
│   │   ├── pg.yaml
│   │   ├── ph.yaml
│   │   ├── pk.yaml
│   │   ├── pl.yaml
│   │   ├── pn.yaml
│   │   ├── ps.yaml
│   │   ├── pt.yaml
│   │   ├── pw.yaml
│   │   ├── py.yaml
│   │   ├── qa.yaml
│   │   ├── ro.yaml
│   │   ├── rs.yaml
│   │   ├── ru.yaml
│   │   ├── rw.yaml
│   │   ├── sa.yaml
│   │   ├── sb.yaml
│   │   ├── sc.yaml
│   │   ├── sd.yaml
│   │   ├── se.yaml
│   │   ├── sg.yaml
│   │   ├── sh.yaml
│   │   ├── si.yaml
│   │   ├── sk.yaml
│   │   ├── sl.yaml
│   │   ├── sm.yaml
│   │   ├── sn.yaml
│   │   ├── so.yaml
│   │   ├── sr.yaml
│   │   ├── ss.yaml
│   │   ├── st.yaml
│   │   ├── sv.yaml
│   │   ├── sy.yaml
│   │   ├── sz.yaml
│   │   ├── tc.yaml
│   │   ├── td.yaml
│   │   ├── tg.yaml
│   │   ├── th.yaml
│   │   ├── tj.yaml
│   │   ├── tk.yaml
│   │   ├── tl.yaml
│   │   ├── tm.yaml
│   │   ├── tn.yaml
│   │   ├── to.yaml
│   │   ├── tr.yaml
│   │   ├── tt.yaml
│   │   ├── tv.yaml
│   │   ├── tw.yaml
│   │   ├── tz.yaml
│   │   ├── ua.yaml
│   │   ├── ug.yaml
│   │   ├── us.yaml
│   │   ├── uy.yaml
│   │   ├── uz.yaml
│   │   ├── va.yaml
│   │   ├── vc.yaml
│   │   ├── ve.yaml
│   │   ├── vg.yaml
│   │   ├── vn.yaml
│   │   ├── vu.yaml
│   │   ├── ws.yaml
│   │   ├── xk.yaml
│   │   ├── ye.yaml
│   │   ├── za.yaml
│   │   ├── zm.yaml
│   │   └── zw.yaml
│   ├── country_settings.yaml
│   ├── env.defaults
│   ├── icu-rules/
│   │   ├── extended-unicode-to-asccii.yaml
│   │   ├── unicode-digits-to-decimal.yaml
│   │   ├── variants-bg.yaml
│   │   ├── variants-ca.yaml
│   │   ├── variants-cs.yaml
│   │   ├── variants-da.yaml
│   │   ├── variants-de.yaml
│   │   ├── variants-el.yaml
│   │   ├── variants-en.yaml
│   │   ├── variants-es.yaml
│   │   ├── variants-et.yaml
│   │   ├── variants-eu.yaml
│   │   ├── variants-fi.yaml
│   │   ├── variants-fr.yaml
│   │   ├── variants-gl.yaml
│   │   ├── variants-hu.yaml
│   │   ├── variants-it.yaml
│   │   ├── variants-mg.yaml
│   │   ├── variants-ms.yaml
│   │   ├── variants-nl.yaml
│   │   ├── variants-no.yaml
│   │   ├── variants-pl.yaml
│   │   ├── variants-pt.yaml
│   │   ├── variants-ro.yaml
│   │   ├── variants-ru.yaml
│   │   ├── variants-sk.yaml
│   │   ├── variants-sl.yaml
│   │   ├── variants-sv.yaml
│   │   ├── variants-tr.yaml
│   │   ├── variants-uk.yaml
│   │   └── variants-vi.yaml
│   ├── icu_tokenizer.yaml
│   └── phrase-settings.json
├── src/
│   ├── nominatim_api/
│   │   ├── __init__.py
│   │   ├── config.py
│   │   ├── connection.py
│   │   ├── core.py
│   │   ├── errors.py
│   │   ├── localization.py
│   │   ├── logging.py
│   │   ├── lookup.py
│   │   ├── py.typed
│   │   ├── query_preprocessing/
│   │   │   ├── __init__.py
│   │   │   ├── base.py
│   │   │   ├── config.py
│   │   │   ├── normalize.py
│   │   │   ├── regex_replace.py
│   │   │   └── split_japanese_phrases.py
│   │   ├── result_formatting.py
│   │   ├── results.py
│   │   ├── reverse.py
│   │   ├── search/
│   │   │   ├── __init__.py
│   │   │   ├── db_search_builder.py
│   │   │   ├── db_search_fields.py
│   │   │   ├── db_search_lookups.py
│   │   │   ├── db_searches/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── address_search.py
│   │   │   │   ├── base.py
│   │   │   │   ├── country_search.py
│   │   │   │   ├── near_search.py
│   │   │   │   ├── place_search.py
│   │   │   │   ├── poi_search.py
│   │   │   │   └── postcode_search.py
│   │   │   ├── geocoder.py
│   │   │   ├── icu_tokenizer.py
│   │   │   ├── postcode_parser.py
│   │   │   ├── query.py
│   │   │   ├── query_analyzer_factory.py
│   │   │   └── token_assignment.py
│   │   ├── server/
│   │   │   ├── __init__.py
│   │   │   ├── asgi_adaptor.py
│   │   │   ├── content_types.py
│   │   │   ├── falcon/
│   │   │   │   ├── __init__.py
│   │   │   │   └── server.py
│   │   │   └── starlette/
│   │   │       ├── __init__.py
│   │   │       └── server.py
│   │   ├── sql/
│   │   │   ├── __init__.py
│   │   │   ├── async_core_library.py
│   │   │   ├── sqlalchemy_functions.py
│   │   │   ├── sqlalchemy_schema.py
│   │   │   ├── sqlalchemy_types/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── geometry.py
│   │   │   │   ├── int_array.py
│   │   │   │   ├── json.py
│   │   │   │   └── key_value.py
│   │   │   └── sqlite_functions.py
│   │   ├── status.py
│   │   ├── timeout.py
│   │   ├── types.py
│   │   ├── typing.py
│   │   ├── utils/
│   │   │   ├── __init__.py
│   │   │   └── json_writer.py
│   │   ├── v1/
│   │   │   ├── __init__.py
│   │   │   ├── classtypes.py
│   │   │   ├── format.py
│   │   │   ├── format_json.py
│   │   │   ├── format_xml.py
│   │   │   ├── helpers.py
│   │   │   └── server_glue.py
│   │   └── version.py
│   └── nominatim_db/
│       ├── __init__.py
│       ├── cli.py
│       ├── clicmd/
│       │   ├── __init__.py
│       │   ├── add_data.py
│       │   ├── admin.py
│       │   ├── api.py
│       │   ├── args.py
│       │   ├── convert.py
│       │   ├── export.py
│       │   ├── freeze.py
│       │   ├── index.py
│       │   ├── refresh.py
│       │   ├── replication.py
│       │   ├── setup.py
│       │   └── special_phrases.py
│       ├── config.py
│       ├── data/
│       │   ├── __init__.py
│       │   ├── country_info.py
│       │   ├── place_info.py
│       │   ├── place_name.py
│       │   └── postcode_format.py
│       ├── db/
│       │   ├── __init__.py
│       │   ├── connection.py
│       │   ├── properties.py
│       │   ├── query_pool.py
│       │   ├── sql_preprocessor.py
│       │   ├── status.py
│       │   └── utils.py
│       ├── errors.py
│       ├── indexer/
│       │   ├── __init__.py
│       │   ├── indexer.py
│       │   ├── progress.py
│       │   └── runners.py
│       ├── paths.py
│       ├── tokenizer/
│       │   ├── __init__.py
│       │   ├── base.py
│       │   ├── factory.py
│       │   ├── icu_rule_loader.py
│       │   ├── icu_token_analysis.py
│       │   ├── icu_tokenizer.py
│       │   ├── place_sanitizer.py
│       │   ├── sanitizers/
│       │   │   ├── __init__.py
│       │   │   ├── base.py
│       │   │   ├── clean_housenumbers.py
│       │   │   ├── clean_postcodes.py
│       │   │   ├── clean_tiger_tags.py
│       │   │   ├── config.py
│       │   │   ├── delete_tags.py
│       │   │   ├── split_name_list.py
│       │   │   ├── strip_brace_terms.py
│       │   │   ├── tag_analyzer_by_language.py
│       │   │   └── tag_japanese.py
│       │   └── token_analysis/
│       │       ├── __init__.py
│       │       ├── base.py
│       │       ├── config_variants.py
│       │       ├── generic.py
│       │       ├── generic_mutation.py
│       │       ├── housenumbers.py
│       │       ├── postcodes.py
│       │       └── simple_trie.py
│       ├── tools/
│       │   ├── __init__.py
│       │   ├── add_osm_data.py
│       │   ├── admin.py
│       │   ├── check_database.py
│       │   ├── collect_os_info.py
│       │   ├── convert_sqlite.py
│       │   ├── database_import.py
│       │   ├── exec_utils.py
│       │   ├── freeze.py
│       │   ├── migration.py
│       │   ├── postcodes.py
│       │   ├── refresh.py
│       │   ├── replication.py
│       │   ├── special_phrases/
│       │   │   ├── __init__.py
│       │   │   ├── importer_statistics.py
│       │   │   ├── sp_csv_loader.py
│       │   │   ├── sp_importer.py
│       │   │   ├── sp_wiki_loader.py
│       │   │   └── special_phrase.py
│       │   └── tiger_data.py
│       ├── typing.py
│       ├── utils/
│       │   ├── __init__.py
│       │   ├── centroid.py
│       │   └── url_utils.py
│       └── version.py
├── test/
│   ├── bdd/
│   │   ├── conftest.py
│   │   ├── features/
│   │   │   ├── api/
│   │   │   │   ├── details/
│   │   │   │   │   ├── language.feature
│   │   │   │   │   ├── params.feature
│   │   │   │   │   └── simple.feature
│   │   │   │   ├── lookup/
│   │   │   │   │   └── simple.feature
│   │   │   │   ├── reverse/
│   │   │   │   │   ├── geometry.feature
│   │   │   │   │   ├── language.feature
│   │   │   │   │   ├── layers.feature
│   │   │   │   │   ├── queries.feature
│   │   │   │   │   ├── v1_geocodejson.feature
│   │   │   │   │   ├── v1_geojson.feature
│   │   │   │   │   ├── v1_json.feature
│   │   │   │   │   ├── v1_params.feature
│   │   │   │   │   └── v1_xml.feature
│   │   │   │   ├── search/
│   │   │   │   │   ├── language.feature
│   │   │   │   │   ├── params.feature
│   │   │   │   │   ├── postcode.feature
│   │   │   │   │   ├── queries.feature
│   │   │   │   │   ├── simple.feature
│   │   │   │   │   ├── structured.feature
│   │   │   │   │   └── v1_geocodejson.feature
│   │   │   │   └── status/
│   │   │   │       ├── failures.feature
│   │   │   │       └── simple.feature
│   │   │   ├── db/
│   │   │   │   ├── import/
│   │   │   │   │   ├── addressing.feature
│   │   │   │   │   ├── country.feature
│   │   │   │   │   ├── entrances.feature
│   │   │   │   │   ├── interpolation.feature
│   │   │   │   │   ├── linking.feature
│   │   │   │   │   ├── naming.feature
│   │   │   │   │   ├── parenting.feature
│   │   │   │   │   ├── placex.feature
│   │   │   │   │   ├── postcodes.feature
│   │   │   │   │   ├── rank_computation.feature
│   │   │   │   │   └── search_name.feature
│   │   │   │   ├── query/
│   │   │   │   │   ├── housenumbers.feature
│   │   │   │   │   ├── interpolation.feature
│   │   │   │   │   ├── japanese.feature
│   │   │   │   │   ├── linking.feature
│   │   │   │   │   ├── normalization.feature
│   │   │   │   │   ├── postcodes.feature
│   │   │   │   │   ├── reverse.feature
│   │   │   │   │   └── search_simple.feature
│   │   │   │   └── update/
│   │   │   │       ├── addressing.feature
│   │   │   │       ├── country.feature
│   │   │   │       ├── entrances.feature
│   │   │   │       ├── interpolation.feature
│   │   │   │       ├── linked_places.feature
│   │   │   │       ├── parenting.feature
│   │   │   │       ├── postcode.feature
│   │   │   │       └── simple.feature
│   │   │   └── osm2pgsql/
│   │   │       ├── import/
│   │   │       │   ├── broken.feature
│   │   │       │   ├── custom_style.feature
│   │   │       │   ├── entrances.feature
│   │   │       │   ├── interpolation.feature
│   │   │       │   ├── relation.feature
│   │   │       │   ├── simple.feature
│   │   │       │   └── tags.feature
│   │   │       └── update/
│   │   │           ├── entrances.feature
│   │   │           ├── interpolations.feature
│   │   │           ├── postcodes.feature
│   │   │           ├── relation.feature
│   │   │           ├── simple.feature
│   │   │           └── tags.feature
│   │   ├── test_api.py
│   │   ├── test_db.py
│   │   ├── test_osm2pgsql.py
│   │   └── utils/
│   │       ├── __init__.py
│   │       ├── api_result.py
│   │       ├── api_runner.py
│   │       ├── checks.py
│   │       ├── db.py
│   │       ├── geometry_alias.py
│   │       ├── grid.py
│   │       └── place_inserter.py
│   ├── python/
│   │   ├── api/
│   │   │   ├── conftest.py
│   │   │   ├── fake_adaptor.py
│   │   │   ├── query_processing/
│   │   │   │   ├── test_normalize.py
│   │   │   │   ├── test_regex_replace.py
│   │   │   │   └── test_split_japanese_phrases.py
│   │   │   ├── search/
│   │   │   │   ├── test_api_search_query.py
│   │   │   │   ├── test_db_search_builder.py
│   │   │   │   ├── test_icu_query_analyzer.py
│   │   │   │   ├── test_postcode_parser.py
│   │   │   │   ├── test_query.py
│   │   │   │   ├── test_query_analyzer_factory.py
│   │   │   │   ├── test_search_address.py
│   │   │   │   ├── test_search_country.py
│   │   │   │   ├── test_search_near.py
│   │   │   │   ├── test_search_places.py
│   │   │   │   ├── test_search_poi.py
│   │   │   │   ├── test_search_postcode.py
│   │   │   │   └── test_token_assignment.py
│   │   │   ├── test_api_connection.py
│   │   │   ├── test_api_deletable_v1.py
│   │   │   ├── test_api_details.py
│   │   │   ├── test_api_lookup.py
│   │   │   ├── test_api_polygons_v1.py
│   │   │   ├── test_api_reverse.py
│   │   │   ├── test_api_search.py
│   │   │   ├── test_api_status.py
│   │   │   ├── test_api_types.py
│   │   │   ├── test_export.py
│   │   │   ├── test_helpers_v1.py
│   │   │   ├── test_localization.py
│   │   │   ├── test_result_formatting_v1.py
│   │   │   ├── test_result_formatting_v1_reverse.py
│   │   │   ├── test_results.py
│   │   │   ├── test_server_glue_v1.py
│   │   │   ├── test_timeout.py
│   │   │   └── test_warm.py
│   │   ├── cli/
│   │   │   ├── conftest.py
│   │   │   ├── test_cli.py
│   │   │   ├── test_cmd_admin.py
│   │   │   ├── test_cmd_api.py
│   │   │   ├── test_cmd_import.py
│   │   │   ├── test_cmd_index.py
│   │   │   ├── test_cmd_refresh.py
│   │   │   └── test_cmd_replication.py
│   │   ├── config/
│   │   │   ├── test_config.py
│   │   │   └── test_config_load_module.py
│   │   ├── conftest.py
│   │   ├── cursor.py
│   │   ├── data/
│   │   │   └── test_country_info.py
│   │   ├── db/
│   │   │   ├── test_connection.py
│   │   │   ├── test_properties.py
│   │   │   ├── test_sql_preprocessor.py
│   │   │   ├── test_status.py
│   │   │   └── test_utils.py
│   │   ├── dummy_tokenizer.py
│   │   ├── indexer/
│   │   │   └── test_indexing.py
│   │   ├── mock_icu_word_table.py
│   │   ├── pytest.ini
│   │   ├── tokenizer/
│   │   │   ├── sanitizers/
│   │   │   │   ├── test_clean_housenumbers.py
│   │   │   │   ├── test_clean_postcodes.py
│   │   │   │   ├── test_clean_tiger_tags.py
│   │   │   │   ├── test_delete_tags.py
│   │   │   │   ├── test_sanitizer_config.py
│   │   │   │   ├── test_split_name_list.py
│   │   │   │   ├── test_strip_brace_terms.py
│   │   │   │   ├── test_tag_analyzer_by_language.py
│   │   │   │   └── test_tag_japanese.py
│   │   │   ├── test_factory.py
│   │   │   ├── test_icu.py
│   │   │   ├── test_icu_rule_loader.py
│   │   │   ├── test_place_sanitizer.py
│   │   │   └── token_analysis/
│   │   │       ├── test_analysis_postcodes.py
│   │   │       ├── test_generic.py
│   │   │       ├── test_generic_mutation.py
│   │   │       └── test_simple_trie.py
│   │   ├── tools/
│   │   │   ├── conftest.py
│   │   │   ├── test_add_osm_data.py
│   │   │   ├── test_admin.py
│   │   │   ├── test_check_database.py
│   │   │   ├── test_database_import.py
│   │   │   ├── test_exec_utils.py
│   │   │   ├── test_freeze.py
│   │   │   ├── test_import_special_phrases.py
│   │   │   ├── test_migration.py
│   │   │   ├── test_postcodes.py
│   │   │   ├── test_refresh.py
│   │   │   ├── test_refresh_address_levels.py
│   │   │   ├── test_refresh_create_functions.py
│   │   │   ├── test_refresh_wiki_data.py
│   │   │   ├── test_replication.py
│   │   │   ├── test_sp_csv_loader.py
│   │   │   ├── test_sp_importer.py
│   │   │   ├── test_sp_wiki_loader.py
│   │   │   └── test_tiger_data.py
│   │   └── utils/
│   │       ├── test_centroid.py
│   │       └── test_json_writer.py
│   ├── testdata/
│   │   ├── sp_csv_test.csv
│   │   └── special_phrases_test_content.txt
│   └── testdb/
│       ├── additional_api_test.data.osm
│       ├── apidb-test-data.pbf
│       ├── full_en_phrases_test.csv
│       └── tiger/
│           └── 01001.csv
├── utils/
│   ├── import_multiple_regions.sh
│   └── update_database.sh
└── vagrant/
    ├── Install-on-Ubuntu-22.sh
    └── Install-on-Ubuntu-24.sh
Download .txt
Showing preview only (270K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2762 symbols across 255 files)

FILE: data/words.sql
  type word_frequencies (line 23) | CREATE TABLE word_frequencies (

FILE: lib-sql/functions/importance.sql
  function get_wikipedia_match (line 25) | CREATE OR REPLACE FUNCTION get_wikipedia_match(extratags HSTORE, country...

FILE: lib-sql/functions/interpolation.sql
  function place_interpolation_insert (line 10) | CREATE OR REPLACE FUNCTION place_interpolation_insert()
  function get_interpolation_address (line 99) | CREATE OR REPLACE FUNCTION get_interpolation_address(in_address HSTORE, ...
  function osmline_insert (line 167) | CREATE OR REPLACE FUNCTION osmline_insert()

FILE: lib-sql/functions/partition-functions.sql
  function getNearFeatures (line 20) | CREATE OR REPLACE function getNearFeatures(in_partition INTEGER, feature...
  function deleteLocationArea (line 93) | create or replace function deleteLocationArea(in_partition INTEGER, in_p...
  function insertLocationAreaLarge (line 116) | create or replace function insertLocationAreaLarge(
  function getNearestNamedRoadPlaceId (line 150) | CREATE OR REPLACE FUNCTION getNearestNamedRoadPlaceId(in_partition INTEGER,
  function getNearestNamedPlacePlaceId (line 179) | CREATE OR REPLACE FUNCTION getNearestNamedPlacePlaceId(in_partition INTE...
  function insertSearchName (line 209) | create or replace function insertSearchName(
  function insertLocationRoad (line 248) | create or replace function insertLocationRoad(
  function deleteRoad (line 267) | create or replace function deleteRoad(in_partition INTEGER, in_place_id ...

FILE: lib-sql/functions/placex_triggers.sql
  function placex_indexing_prepare (line 25) | CREATE OR REPLACE FUNCTION placex_indexing_prepare(p placex)
  function find_parent_for_poi (line 191) | CREATE OR REPLACE FUNCTION find_parent_for_poi(poi_osm_type CHAR(1),

FILE: lib-sql/functions/postcode_triggers.sql
  function postcodes_update (line 16) | CREATE OR REPLACE FUNCTION postcodes_update()
  function postcodes_insert (line 62) | CREATE OR REPLACE FUNCTION postcodes_insert()

FILE: lib-sql/functions/ranking.sql
  function is_rankable_place (line 12) | CREATE OR REPLACE FUNCTION is_rankable_place(osm_type TEXT, class TEXT,
  function reverse_place_diameter (line 39) | CREATE OR REPLACE FUNCTION reverse_place_diameter(rank_search SMALLINT)
  function update_place_diameter (line 64) | CREATE OR REPLACE FUNCTION update_place_diameter(rank_search SMALLINT)
  function geometry_to_rank (line 98) | CREATE OR REPLACE FUNCTION geometry_to_rank(search_rank SMALLINT, geomet...
  function weigh_search (line 256) | CREATE OR REPLACE FUNCTION weigh_search(search_vector INT[],

FILE: lib-sql/functions/updates.sql
  function update_invalidate_for_new_place (line 11) | CREATE OR REPLACE FUNCTION update_invalidate_for_new_place(address_rank ...

FILE: lib-sql/functions/utils.sql
  function get_center_point (line 10) | CREATE OR REPLACE FUNCTION get_center_point(place GEOMETRY)
  function geometry_sector (line 30) | CREATE OR REPLACE FUNCTION geometry_sector(partition INTEGER, place GEOM...
  function array_merge (line 41) | CREATE OR REPLACE FUNCTION array_merge(a INTEGER[], b INTEGER[])
  function get_rel_node_members (line 73) | CREATE OR REPLACE FUNCTION get_rel_node_members(members TEXT[],
  function get_rel_node_members (line 94) | CREATE OR REPLACE FUNCTION get_rel_node_members(members JSONB, memberLab...
  function add_default_place_name (line 121) | CREATE OR REPLACE FUNCTION add_default_place_name(country_code VARCHAR(2),
  function get_country_code (line 186) | CREATE OR REPLACE FUNCTION get_country_code(place geometry)
  function get_country_language_code (line 247) | CREATE OR REPLACE FUNCTION get_country_language_code(search_country_code...
  function get_partition (line 265) | CREATE OR REPLACE FUNCTION get_partition(in_country_code VARCHAR(10))
  function find_parent_for_address (line 289) | CREATE OR REPLACE FUNCTION find_parent_for_address(token_info JSONB,
  function place_node_fuzzy_area (line 338) | CREATE OR REPLACE FUNCTION place_node_fuzzy_area(geom GEOMETRY, rank_sea...
  function add_location (line 360) | CREATE OR REPLACE FUNCTION add_location(place_id BIGINT, country_code va...
  function quad_split_geometry (line 394) | CREATE OR REPLACE FUNCTION quad_split_geometry(geometry GEOMETRY, maxare...
  function place_force_delete (line 518) | CREATE OR REPLACE FUNCTION place_force_delete(placeid BIGINT)
  function place_force_update (line 541) | CREATE OR REPLACE FUNCTION place_force_update(placeid BIGINT)
  function flush_deleted_places (line 589) | CREATE OR REPLACE FUNCTION flush_deleted_places()
  function place_update_entrances (line 647) | CREATE OR REPLACE FUNCTION place_update_entrances(placeid BIGINT, osmid ...

FILE: lib-sql/indices.sql
  type idx_place_addressline_address_place_id (line 11) | CREATE INDEX IF NOT EXISTS idx_place_addressline_address_place_id
  type place_interpolation_to_be_deleted (line 77) | CREATE TABLE IF NOT EXISTS place_interpolation_to_be_deleted (

FILE: lib-sql/partition-tables.src.sql
  type search_name_blank (line 9) | CREATE TABLE search_name_blank (
  type location_area_large_ (line 17) | CREATE TABLE location_area_large_{{ partition }} () INHERITS (location_a...

FILE: lib-sql/tables/addressline.sql
  type place_addressline (line 10) | CREATE TABLE place_addressline (

FILE: lib-sql/tables/entrance.sql
  type placex_entrance (line 11) | CREATE TABLE placex_entrance (

FILE: lib-sql/tables/import_reports.sql
  type import_polygon_error (line 9) | CREATE TABLE import_polygon_error (
  type idx_import_polygon_error_osmid (line 22) | CREATE INDEX idx_import_polygon_error_osmid ON import_polygon_error
  type import_polygon_delete (line 27) | CREATE TABLE import_polygon_delete (
  type idx_import_polygon_delete_osmid (line 34) | CREATE INDEX idx_import_polygon_delete_osmid ON import_polygon_delete

FILE: lib-sql/tables/importance_tables.sql
  type wikimedia_importance (line 10) | CREATE TABLE wikimedia_importance (

FILE: lib-sql/tables/interpolation.sql
  type location_property_osmline (line 9) | CREATE TABLE location_property_osmline (

FILE: lib-sql/tables/location_area.sql
  type location_area (line 9) | CREATE TABLE location_area (
  type location_area_large (line 22) | CREATE TABLE location_area_large () INHERITS (location_area)
  type location_area_country (line 25) | CREATE TABLE location_area_country (

FILE: lib-sql/tables/nominatim_properties.sql
  type nominatim_properties (line 9) | CREATE TABLE nominatim_properties (

FILE: lib-sql/tables/placex.sql
  type placex (line 11) | CREATE TABLE placex (
  type idx_place_id (line 31) | CREATE UNIQUE INDEX idx_place_id ON placex USING BTREE (place_id) {{db.t...
  type idx_placex_geometry_address_area_candidates (line 48) | CREATE INDEX idx_placex_geometry_address_area_candidates ON placex
  type idx_placex_geometry_buildings (line 54) | CREATE INDEX idx_placex_geometry_buildings ON placex

FILE: lib-sql/tables/postcodes.sql
  type location_postcodes (line 9) | CREATE TABLE location_postcodes (

FILE: lib-sql/tables/search_name.sql
  type search_name (line 12) | CREATE TABLE search_name (

FILE: lib-sql/tables/status.sql
  type import_status (line 9) | CREATE TABLE import_status (
  type import_osmosis_log (line 16) | CREATE TABLE import_osmosis_log (

FILE: lib-sql/tables/tiger.sql
  type location_property_tiger (line 9) | CREATE TABLE location_property_tiger (

FILE: lib-sql/tiger_import_finish.sql
  type idx_location_property_tiger_parent_place_id_imp (line 9) | CREATE INDEX IF NOT EXISTS idx_location_property_tiger_parent_place_id_imp

FILE: lib-sql/tiger_import_start.sql
  type location_property_tiger_import (line 8) | CREATE TABLE location_property_tiger_import (
  function getNearestNamedRoadPlaceIdSlow (line 21) | CREATE OR REPLACE FUNCTION getNearestNamedRoadPlaceIdSlow(in_centroid GE...
  function getNearestParallelRoadFeatureSlow (line 46) | CREATE OR REPLACE FUNCTION getNearestParallelRoadFeatureSlow(line GEOMETRY)
  function getNearestRoadPlaceIdSlow (line 85) | CREATE OR REPLACE FUNCTION getNearestRoadPlaceIdSlow(point GEOMETRY)
  function tiger_line_import (line 111) | CREATE OR REPLACE FUNCTION tiger_line_import(linegeo GEOMETRY, in_startn...

FILE: lib-sql/tokenizer/icu_tokenizer.sql
  function token_get_name_search_tokens (line 11) | CREATE OR REPLACE FUNCTION token_get_name_search_tokens(info JSONB)
  function token_get_name_match_tokens (line 21) | CREATE OR REPLACE FUNCTION token_get_name_match_tokens(info JSONB)
  function token_get_housenumber_search_tokens (line 29) | CREATE OR REPLACE FUNCTION token_get_housenumber_search_tokens(info JSONB)
  function token_normalized_housenumber (line 37) | CREATE OR REPLACE FUNCTION token_normalized_housenumber(info JSONB)
  function token_is_street_address (line 44) | CREATE OR REPLACE FUNCTION token_is_street_address(info JSONB)
  function token_has_addr_street (line 51) | CREATE OR REPLACE FUNCTION token_has_addr_street(info JSONB)
  function token_has_addr_place (line 58) | CREATE OR REPLACE FUNCTION token_has_addr_place(info JSONB)
  function token_matches_street (line 65) | CREATE OR REPLACE FUNCTION token_matches_street(info JSONB, street_token...
  function token_matches_place (line 72) | CREATE OR REPLACE FUNCTION token_matches_place(info JSONB, place_tokens ...
  function token_addr_place_search_tokens (line 79) | CREATE OR REPLACE FUNCTION token_addr_place_search_tokens(info JSONB)
  function token_get_address_keys (line 86) | CREATE OR REPLACE FUNCTION token_get_address_keys(info JSONB)
  function token_get_address_search_tokens (line 93) | CREATE OR REPLACE FUNCTION token_get_address_search_tokens(info JSONB, k...
  function token_matches_address (line 100) | CREATE OR REPLACE FUNCTION token_matches_address(info JSONB, key TEXT, t...
  function token_get_postcode (line 107) | CREATE OR REPLACE FUNCTION token_get_postcode(info JSONB)
  function token_strip_info (line 115) | CREATE OR REPLACE FUNCTION token_strip_info(info JSONB)
  function getorcreate_partial_word (line 221) | CREATE OR REPLACE FUNCTION getorcreate_partial_word(partial TEXT)
  function getorcreate_hnr_id (line 242) | CREATE OR REPLACE FUNCTION getorcreate_hnr_id(lookup_term TEXT)
  function create_analyzed_hnr_id (line 263) | CREATE OR REPLACE FUNCTION create_analyzed_hnr_id(norm_term TEXT, lookup...
  function create_postcode_word (line 285) | CREATE OR REPLACE FUNCTION create_postcode_word(postcode TEXT, lookup_te...

FILE: man/create-manpage.py
  function get_parser (line 9) | def get_parser():

FILE: src/nominatim_api/connection.py
  class SearchConnection (line 26) | class SearchConnection:
    method __init__ (line 33) | def __init__(self, conn: AsyncConnection,
    method set_query_timeout (line 44) | def set_query_timeout(self, timeout: Optional[int]) -> None:
    method scalar (line 50) | async def scalar(self, sql: sa.sql.base.Executable,
    method execute (line 57) | async def execute(self, sql: 'sa.Executable',
    method get_property (line 65) | async def get_property(self, name: str, cached: bool = True) -> str:
    method get_db_property (line 91) | async def get_db_property(self, name: str) -> Any:
    method get_cached_value (line 103) | async def get_cached_value(self, group: str, name: str,
    method get_class_table (line 125) | async def get_class_table(self, cls: str, typ: str) -> Optional[SaFrom...

FILE: src/nominatim_api/core.py
  class NominatimAPIAsync (line 40) | class NominatimAPIAsync:
    method __init__ (line 51) | def __init__(self, project_dir: Optional[Union[str, Path]] = None,
    method setup_database (line 84) | async def setup_database(self) -> None:
    method close (line 166) | async def close(self) -> None:
    method __aenter__ (line 174) | async def __aenter__(self) -> 'NominatimAPIAsync':
    method __aexit__ (line 177) | async def __aexit__(self, *_: Any) -> None:
    method begin (line 181) | async def begin(self, abs_timeout: Optional[float] = None) -> AsyncIte...
    method status (line 200) | async def status(self) -> StatusResult:
    method details (line 213) | async def details(self, place: ntyp.PlaceRef, **params: Any) -> Option...
    method lookup (line 228) | async def lookup(self, places: Sequence[ntyp.PlaceRef], **params: Any)...
    method reverse (line 243) | async def reverse(self, coord: ntyp.AnyPoint, **params: Any) -> Option...
    method search (line 266) | async def search(self, query: str, **params: Any) -> SearchResults:
    method search_address (line 283) | async def search_address(self, amenity: Optional[str] = None,
    method search_category (line 340) | async def search_category(self, categories: List[Tuple[str, str]],
  class NominatimAPI (line 367) | class NominatimAPI:
    method __init__ (line 375) | def __init__(self, project_dir: Optional[Union[str, Path]] = None,
    method close (line 391) | def close(self) -> None:
    method __enter__ (line 401) | def __enter__(self) -> 'NominatimAPI':
    method __exit__ (line 404) | def __exit__(self, *_: Any) -> None:
    method config (line 408) | def config(self) -> Configuration:
    method status (line 414) | def status(self) -> StatusResult:
    method details (line 432) | def details(self, place: ntyp.PlaceRef, **params: Any) -> Optional[Det...
    method lookup (line 516) | def lookup(self, places: Sequence[ntyp.PlaceRef], **params: Any) -> Se...
    method reverse (line 594) | def reverse(self, coord: ntyp.AnyPoint, **params: Any) -> Optional[Rev...
    method search (line 677) | def search(self, query: str, **params: Any) -> SearchResults:
    method search_address (line 778) | def search_address(self, amenity: Optional[str] = None,
    method search_category (line 897) | def search_category(self, categories: List[Tuple[str, str]],

FILE: src/nominatim_api/errors.py
  class UsageError (line 12) | class UsageError(Exception):

FILE: src/nominatim_api/localization.py
  class Locales (line 16) | class Locales:
    method __init__ (line 23) | def __init__(self, langs: Optional[List[str]] = None,
    method __bool__ (line 37) | def __bool__(self) -> bool:
    method _add_tags (line 40) | def _add_tags(self, *tags: str) -> None:
    method _add_lang_tags (line 45) | def _add_lang_tags(self, *tags: str) -> None:
    method display_name (line 51) | def display_name(self, names: Optional[Mapping[str, str]]) -> str:
    method from_accept_languages (line 70) | def from_accept_languages(langstr: str, names: str = 'name:XX,name') -...
    method localize (line 100) | def localize(self, lines: AddressLines) -> None:
    method localize_results (line 112) | def localize_results(self, results: List[BaseResultT]) -> None:

FILE: src/nominatim_api/logging.py
  function _debug_name (line 30) | def _debug_name(res: Any) -> str:
  class BaseLogger (line 37) | class BaseLogger:
    method get_buffer (line 43) | def get_buffer(self) -> str:
    method function (line 48) | def function(self, func: str, **kwargs: Any) -> None:
    method section (line 52) | def section(self, heading: str) -> None:
    method comment (line 56) | def comment(self, text: str) -> None:
    method var_dump (line 60) | def var_dump(self, heading: str, var: Any) -> None:
    method table_dump (line 65) | def table_dump(self, heading: str, rows: Iterator[Optional[List[Any]]]...
    method result_dump (line 69) | def result_dump(self, heading: str, results: Iterator[Tuple[Any, Any]]...
    method sql (line 73) | def sql(self, conn: AsyncConnection, statement: 'sa.Executable',
    method format_sql (line 78) | def format_sql(self, conn: AsyncConnection, statement: 'sa.Executable',
  class HTMLLogger (line 123) | class HTMLLogger(BaseLogger):
    method __init__ (line 126) | def __init__(self) -> None:
    method _timestamp (line 129) | def _timestamp(self) -> None:
    method get_buffer (line 132) | def get_buffer(self) -> str:
    method function (line 135) | def function(self, func: str, **kwargs: Any) -> None:
    method section (line 142) | def section(self, heading: str) -> None:
    method comment (line 146) | def comment(self, text: str) -> None:
    method var_dump (line 150) | def var_dump(self, heading: str, var: Any) -> None:
    method table_dump (line 157) | def table_dump(self, heading: str, rows: Iterator[Optional[List[Any]]]...
    method result_dump (line 173) | def result_dump(self, heading: str, results: Iterator[Tuple[Any, Any]]...
    method sql (line 206) | def sql(self, conn: AsyncConnection, statement: 'sa.Executable',
    method _python_var (line 217) | def _python_var(self, var: Any) -> str:
    method _write (line 224) | def _write(self, text: str) -> None:
  class TextLogger (line 230) | class TextLogger(BaseLogger):
    method __init__ (line 233) | def __init__(self) -> None:
    method _timestamp (line 236) | def _timestamp(self) -> None:
    method get_buffer (line 239) | def get_buffer(self) -> str:
    method function (line 242) | def function(self, func: str, **kwargs: Any) -> None:
    method section (line 248) | def section(self, heading: str) -> None:
    method comment (line 252) | def comment(self, text: str) -> None:
    method var_dump (line 255) | def var_dump(self, heading: str, var: Any) -> None:
    method table_dump (line 261) | def table_dump(self, heading: str, rows: Iterator[Optional[List[Any]]]...
    method result_dump (line 281) | def result_dump(self, heading: str, results: Iterator[Tuple[Any, Any]]...
    method sql (line 295) | def sql(self, conn: AsyncConnection, statement: 'sa.Executable',
    method _python_var (line 301) | def _python_var(self, var: Any) -> str:
    method _write (line 304) | def _write(self, text: str) -> None:
  function set_log_output (line 311) | def set_log_output(fmt: str) -> None:
  function log (line 322) | def log() -> BaseLogger:
  function get_and_disable (line 328) | def get_and_disable() -> str:

FILE: src/nominatim_api/lookup.py
  class LookupTuple (line 36) | class LookupTuple:
  class LookupCollector (line 43) | class LookupCollector:
    method __init__ (line 49) | def __init__(self, places: Iterable[ntyp.PlaceRef],
    method get_results (line 54) | def get_results(self) -> nres.SearchResults:
    method add_rows_from_sql (line 59) | async def add_rows_from_sql(self, conn: SearchConnection, sql: SaSelect,
    method enumerate_free_place_ids (line 85) | def enumerate_free_place_ids(self) -> Iterable[Tuple[int, ntyp.PlaceID]]:
    method enumerate_free_osm_ids (line 89) | def enumerate_free_osm_ids(self) -> Iterable[Tuple[int, ntyp.OsmID]]:
  class DetailedCollector (line 94) | class DetailedCollector:
    method __init__ (line 100) | def __init__(self, place: ntyp.PlaceRef, with_geometry: bool) -> None:
    method add_rows_from_sql (line 105) | async def add_rows_from_sql(self, conn: SearchConnection, sql: SaSelect,
    method enumerate_free_place_ids (line 132) | def enumerate_free_place_ids(self) -> Iterable[Tuple[int, ntyp.PlaceID]]:
    method enumerate_free_osm_ids (line 137) | def enumerate_free_osm_ids(self) -> Iterable[Tuple[int, ntyp.OsmID]]:
  function get_detailed_place (line 146) | async def get_detailed_place(conn: SearchConnection, place: ntyp.PlaceRef,
  function get_places (line 168) | async def get_places(conn: SearchConnection, places: Iterable[ntyp.Place...
  function find_in_placex (line 187) | async def find_in_placex(conn: SearchConnection, collector: Collector) -...
  function find_in_osmline (line 236) | async def find_in_osmline(conn: SearchConnection, collector: Collector) ...
  function find_in_postcode (line 279) | async def find_in_postcode(conn: SearchConnection, collector: Collector)...
  function find_in_tiger (line 324) | async def find_in_tiger(conn: SearchConnection, collector: Collector) ->...

FILE: src/nominatim_api/query_preprocessing/base.py
  class QueryHandler (line 19) | class QueryHandler(Protocol):
    method create (line 22) | def create(self, config: QueryConfig) -> QueryProcessingFunc:

FILE: src/nominatim_api/query_preprocessing/config.py
  class QueryConfig (line 21) | class QueryConfig(_BaseUserDict):
    method set_normalizer (line 29) | def set_normalizer(self, normalizer: Any) -> 'QueryConfig':

FILE: src/nominatim_api/query_preprocessing/normalize.py
  function create (line 22) | def create(config: QueryConfig) -> QueryProcessingFunc:

FILE: src/nominatim_api/query_preprocessing/regex_replace.py
  class _GenericPreprocessing (line 22) | class _GenericPreprocessing:
    method __init__ (line 25) | def __init__(self, config: QueryConfig) -> None:
    method split_phrase (line 34) | def split_phrase(self, phrase: Phrase) -> Phrase:
    method __call__ (line 41) | def __call__(self, phrases: List[Phrase]) -> List[Phrase]:
  function create (line 50) | def create(config: QueryConfig) -> QueryProcessingFunc:

FILE: src/nominatim_api/query_preprocessing/split_japanese_phrases.py
  class _JapanesePreprocessing (line 36) | class _JapanesePreprocessing:
    method __init__ (line 38) | def __init__(self, config: QueryConfig) -> None:
    method split_phrase (line 41) | def split_phrase(self, phrase: Phrase) -> Phrase:
    method __call__ (line 52) | def __call__(self, phrases: List[Phrase]) -> List[Phrase]:
  function create (line 58) | def create(config: QueryConfig) -> QueryProcessingFunc:

FILE: src/nominatim_api/result_formatting.py
  class FormatDispatcher (line 22) | class FormatDispatcher:
    method __init__ (line 27) | def __init__(self, content_types: Optional[Mapping[str, str]] = None) ...
    method format_func (line 34) | def format_func(self, result_class: Type[T],
    method error_format_func (line 45) | def error_format_func(self, func: ErrorFormatFunc) -> ErrorFormatFunc:
    method list_formats (line 53) | def list_formats(self, result_type: Type[Any]) -> List[str]:
    method supports_format (line 58) | def supports_format(self, result_type: Type[Any], fmt: str) -> bool:
    method format_result (line 63) | def format_result(self, result: Any, fmt: str, options: Mapping[str, A...
    method format_error (line 71) | def format_error(self, content_type: str, msg: str, status: int) -> str:
    method set_content_type (line 79) | def set_content_type(self, fmt: str, content_type: str) -> None:
    method get_content_type (line 86) | def get_content_type(self, fmt: str) -> str:
  function load_format_dispatcher (line 95) | def load_format_dispatcher(api_name: str, project_dir: Optional[Path]) -...

FILE: src/nominatim_api/results.py
  function _mingle_name_tags (line 33) | def _mingle_name_tags(names: Optional[Dict[str, str]]) -> Optional[Dict[...
  class SourceTable (line 51) | class SourceTable(enum.Enum):
  class AddressLine (line 82) | class AddressLine:
    method display_name (line 136) | def display_name(self) -> Optional[str]:
  class AddressLines (line 148) | class AddressLines(List[AddressLine]):
  class WordInfo (line 153) | class WordInfo:
  class BaseResult (line 173) | class BaseResult:
    method lat (line 214) | def lat(self) -> float:
    method lon (line 220) | def lon(self) -> float:
    method display_name (line 226) | def display_name(self) -> Optional[str]:
    method calculated_importance (line 254) | def calculated_importance(self) -> float:
  class DetailedResult (line 266) | class DetailedResult(BaseResult):
  class ReverseResult (line 274) | class ReverseResult(BaseResult):
  class ReverseResults (line 281) | class ReverseResults(List[ReverseResult]):
  class SearchResult (line 288) | class SearchResult(BaseResult):
    method ranking (line 295) | def ranking(self) -> float:
  class SearchResults (line 302) | class SearchResults(List[SearchResult]):
  function _filter_geometries (line 308) | def _filter_geometries(row: SaRow) -> Dict[str, str]:
  function create_from_placex_row (line 313) | def create_from_placex_row(row: SaRow, class_type: Type[BaseResultT]) ->...
  function create_from_osmline_row (line 339) | def create_from_osmline_row(row: SaRow, class_type: Type[BaseResultT]) -...
  function create_from_tiger_row (line 370) | def create_from_tiger_row(row: SaRow,
  function create_from_postcode_row (line 403) | def create_from_postcode_row(row: SaRow, class_type: Type[BaseResultT]) ...
  function create_from_country_row (line 422) | def create_from_country_row(row: SaRow, class_type: Type[BaseResultT]) -...
  function add_result_details (line 436) | async def add_result_details(conn: SearchConnection, results: List[BaseR...
  function _result_row_to_address_row (line 463) | def _result_row_to_address_row(row: SaRow, isaddress: Optional[bool] = N...
  function _get_address_lookup_id (line 489) | def _get_address_lookup_id(result: BaseResultT) -> int:
  function _finalize_entry (line 497) | async def _finalize_entry(conn: SearchConnection, result: BaseResultT) -...
  function _setup_address_details (line 536) | def _setup_address_details(result: BaseResultT) -> None:
  function complete_address_details (line 570) | async def complete_address_details(conn: SearchConnection, results: List...
  function _placex_select_address_row (line 673) | def _placex_select_address_row(conn: SearchConnection,
  function complete_linked_places (line 685) | async def complete_linked_places(conn: SearchConnection, result: BaseRes...
  function complete_entrances_details (line 699) | async def complete_entrances_details(conn: SearchConnection, results: Li...
  function complete_keywords (line 723) | async def complete_keywords(conn: SearchConnection, result: BaseResult) ...
  function complete_parented_places (line 747) | async def complete_parented_places(conn: SearchConnection, result: BaseR...

FILE: src/nominatim_api/reverse.py
  function no_index (line 30) | def no_index(expr: SaColumn) -> SaColumn:
  function _select_from_placex (line 37) | def _select_from_placex(t: SaFromClause, use_wkt: bool = True) -> SaSelect:
  function _interpolated_housenumber (line 61) | def _interpolated_housenumber(table: SaFromClause) -> SaLabel:
  function _interpolated_position (line 68) | def _interpolated_position(table: SaFromClause) -> SaLabel:
  function _locate_interpolation (line 76) | def _locate_interpolation(table: SaFromClause) -> SaLabel:
  function _get_closest (line 84) | def _get_closest(*rows: Optional[SaRow]) -> Optional[SaRow]:
  class ReverseGeocoder (line 88) | class ReverseGeocoder:
    method __init__ (line 93) | def __init__(self, conn: SearchConnection, params: ReverseDetails,
    method max_rank (line 102) | def max_rank(self) -> int:
    method has_geometries (line 107) | def has_geometries(self) -> bool:
    method layer_enabled (line 112) | def layer_enabled(self, *layer: DataLayer) -> bool:
    method layer_disabled (line 117) | def layer_disabled(self, *layer: DataLayer) -> bool:
    method has_feature_layers (line 122) | def has_feature_layers(self) -> bool:
    method _add_geometry_columns (line 127) | def _add_geometry_columns(self, sql: SaLambdaSelect, col: SaColumn) ->...
    method _filter_by_layer (line 144) | def _filter_by_layer(self, table: SaFromClause) -> SaColumn:
    method _find_closest_street_or_pois (line 160) | async def _find_closest_street_or_pois(self, distance: float,
    method _find_housenumber_for_street (line 241) | async def _find_housenumber_for_street(self, parent_place_id: int) -> ...
    method _find_interpolation_for_street (line 262) | async def _find_interpolation_for_street(self, parent_place_id: Option...
    method _find_tiger_number_for_street (line 292) | async def _find_tiger_number_for_street(self, parent_place_id: int) ->...
    method lookup_street_poi (line 321) | async def lookup_street_poi(self) -> Tuple[Optional[SaRow], RowFunc]:
    method _lookup_area_address (line 389) | async def _lookup_area_address(self) -> Optional[SaRow]:
    method _lookup_area_others (line 459) | async def _lookup_area_others(self) -> Optional[SaRow]:
    method lookup_area (line 489) | async def lookup_area(self) -> Optional[SaRow]:
    method lookup_country_codes (line 506) | async def lookup_country_codes(self) -> List[str]:
    method lookup_country (line 518) | async def lookup_country(self, ccodes: List[str]) -> Tuple[Optional[Sa...
    method lookup (line 605) | async def lookup(self, coord: AnyPoint) -> Optional[nres.ReverseResult]:

FILE: src/nominatim_api/search/db_search_builder.py
  function wrap_near_search (line 21) | def wrap_near_search(categories: List[Tuple[str, str]],
  function build_poi_search (line 32) | def build_poi_search(category: List[Tuple[str, str]],
  class SearchBuilder (line 50) | class SearchBuilder:
    method __init__ (line 54) | def __init__(self, query: qmod.QueryStruct, details: SearchDetails) ->...
    method configured_for_country (line 59) | def configured_for_country(self) -> bool:
    method configured_for_postcode (line 67) | def configured_for_postcode(self) -> bool:
    method configured_for_housenumbers (line 75) | def configured_for_housenumbers(self) -> bool:
    method build (line 82) | def build(self, assignment: TokenAssignment) -> Iterator[dbs.AbstractS...
    method build_poi_search (line 122) | def build_poi_search(self, sdata: dbf.SearchData) -> Iterator[dbs.Abst...
    method build_special_search (line 130) | def build_special_search(self, sdata: dbf.SearchData,
    method build_housenumber_search (line 153) | def build_housenumber_search(self, sdata: dbf.SearchData, hnrs: List[q...
    method build_name_search (line 193) | def build_name_search(self, sdata: dbf.SearchData,
    method yield_lookups (line 210) | def yield_lookups(self, name: qmod.TokenRange, address: List[qmod.Toke...
    method yield_name_only_lookups (line 226) | def yield_name_only_lookups(self, partials: dbf.CountedTokenIDs, name:...
    method yield_address_lookups (line 249) | def yield_address_lookups(self, name_partials: dbf.CountedTokenIDs,
    method get_name_ranking (line 299) | def get_name_ranking(self, trange: qmod.TokenRange,
    method get_addr_ranking (line 314) | def get_addr_ranking(self, trange: qmod.TokenRange) -> dbf.FieldRanking:
    method get_search_data (line 368) | def get_search_data(self, assignment: TokenAssignment) -> Optional[dbf...
    method get_country_tokens (line 410) | def get_country_tokens(self, trange: qmod.TokenRange) -> List[qmod.Tok...
    method get_qualifier_tokens (line 421) | def get_qualifier_tokens(self, trange: qmod.TokenRange) -> List[qmod.T...
    method get_near_items (line 432) | def get_near_items(self, assignment: TokenAssignment) -> Optional[dbf....

FILE: src/nominatim_api/search/db_search_fields.py
  class CountedTokenIDs (line 21) | class CountedTokenIDs:
    method __init__ (line 29) | def __init__(self, tokens: Iterator[Token], count_column: str = 'count'):
    method __len__ (line 33) | def __len__(self) -> int:
    method get_num_lookup_tokens (line 36) | def get_num_lookup_tokens(self, limit: int, fac: int) -> int:
    method min_count (line 59) | def min_count(self) -> int:
    method expected_for_all_search (line 62) | def expected_for_all_search(self, fac: int = 5) -> int:
    method get_tokens (line 65) | def get_tokens(self) -> List[int]:
    method get_head_tokens (line 68) | def get_head_tokens(self, num_tokens: int) -> List[int]:
    method get_tail_tokens (line 71) | def get_tail_tokens(self, first: int) -> List[int]:
    method split_lookup (line 74) | def split_lookup(self, split: int, column: str) -> 'List[FieldLookup]':
  class WeightedStrings (line 82) | class WeightedStrings:
    method __bool__ (line 88) | def __bool__(self) -> bool:
    method __iter__ (line 91) | def __iter__(self) -> Iterator[Tuple[str, float]]:
    method get_penalty (line 94) | def get_penalty(self, value: str, default: float = 1000.0) -> float:
  class WeightedCategories (line 106) | class WeightedCategories:
    method __bool__ (line 112) | def __bool__(self) -> bool:
    method __iter__ (line 115) | def __iter__(self) -> Iterator[Tuple[Tuple[str, str], float]]:
    method get_penalty (line 118) | def get_penalty(self, value: Tuple[str, str], default: float = 1000.0)...
    method sql_restrict (line 128) | def sql_restrict(self, table: SaFromClause) -> SaExpression:
  class RankedTokens (line 144) | class RankedTokens:
    method with_token (line 150) | def with_token(self, t: Token, transition_penalty: float) -> 'RankedTo...
  class FieldRanking (line 160) | class FieldRanking:
    method normalize_penalty (line 169) | def normalize_penalty(self) -> float:
    method sql_penalty (line 183) | def sql_penalty(self, table: SaFromClause) -> SaColumn:
  class FieldLookup (line 202) | class FieldLookup:
    method sql_condition (line 213) | def sql_condition(self, table: SaFromClause) -> SaColumn:
  class SearchData (line 219) | class SearchData:
    method set_strings (line 234) | def set_strings(self, field: str, tokens: List[Token]) -> None:
    method set_countries (line 247) | def set_countries(self, tokens: List[Token]) -> None:
    method set_qualifiers (line 262) | def set_qualifiers(self, tokens: List[Token]) -> None:
    method set_ranking (line 277) | def set_ranking(self, rankings: List[FieldRanking]) -> None:
  function lookup_by_any_name (line 289) | def lookup_by_any_name(name_tokens: List[int], addr_restrict_tokens: Lis...

FILE: src/nominatim_api/search/db_search_lookups.py
  class LookupAll (line 22) | class LookupAll(LookupType):
    method __init__ (line 28) | def __init__(self, table: SaFromClause, column: str, tokens: List[int]...
  function _default_lookup_all (line 34) | def _default_lookup_all(element: LookupAll,
  function _sqlite_lookup_all (line 42) | def _sqlite_lookup_all(element: LookupAll,
  class LookupAny (line 60) | class LookupAny(LookupType):
    method __init__ (line 66) | def __init__(self, table: SaFromClause, column: str, tokens: List[int]...
  function _default_lookup_any (line 72) | def _default_lookup_any(element: LookupAny,
  function _sqlite_lookup_any (line 80) | def _sqlite_lookup_any(element: LookupAny,
  class Restrict (line 92) | class Restrict(LookupType):
    method __init__ (line 98) | def __init__(self, table: SaFromClause, column: str, tokens: List[int]...
  function _default_restrict (line 104) | def _default_restrict(element: Restrict,
  function _sqlite_restrict (line 112) | def _sqlite_restrict(element: Restrict,

FILE: src/nominatim_api/search/db_searches/address_search.py
  function _int_list_to_subquery (line 33) | def _int_list_to_subquery(inp: List[int]) -> 'sa.Subquery':
  function _interpolated_position (line 42) | def _interpolated_position(table: SaFromClause, nr: SaColumn) -> SaColumn:
  function _make_interpolation_subquery (line 49) | def _make_interpolation_subquery(table: SaFromClause, inner: SaFromClause,
  function _get_placex_housenumbers (line 70) | async def _get_placex_housenumbers(conn: SearchConnection,
  function _get_osmline (line 86) | async def _get_osmline(conn: SearchConnection, place_ids: List[int],
  function _get_tiger (line 108) | async def _get_tiger(conn: SearchConnection, place_ids: List[int],
  class AddressSearch (line 130) | class AddressSearch(base.AbstractSearch):
    method __init__ (line 135) | def __init__(self, extra_penalty: float, sdata: SearchData,
    method _inner_search_name_cte (line 148) | def _inner_search_name_cte(self, conn: SearchConnection,
    method lookup (line 204) | async def lookup(self, conn: SearchConnection,

FILE: src/nominatim_api/search/db_searches/base.py
  class AbstractSearch (line 22) | class AbstractSearch(abc.ABC):
    method __init__ (line 27) | def __init__(self, penalty: float) -> None:
    method lookup (line 31) | async def lookup(self, conn: SearchConnection, details: SearchDetails)...
  function select_placex (line 36) | def select_placex(t: SaFromClause) -> SaSelect:
  function exclude_places (line 53) | def exclude_places(t: SaFromClause) -> Callable[[], SaExpression]:
  function filter_by_layer (line 62) | def filter_by_layer(table: SaFromClause, layers: DataLayer) -> SaColumn:
  function no_index (line 98) | def no_index(expr: SaColumn) -> SaColumn:
  function filter_by_area (line 105) | def filter_by_area(sql: SaSelect, t: SaFromClause,
  function add_geometry_columns (line 127) | def add_geometry_columns(sql: SaLambdaSelect, col: SaColumn, details: Se...

FILE: src/nominatim_api/search/db_searches/country_search.py
  class CountrySearch (line 20) | class CountrySearch(base.AbstractSearch):
    method __init__ (line 25) | def __init__(self, sdata: SearchData) -> None:
    method lookup (line 29) | async def lookup(self, conn: SearchConnection,
    method lookup_in_country_table (line 72) | async def lookup_in_country_table(self, conn: SearchConnection,

FILE: src/nominatim_api/search/db_searches/near_search.py
  class NearSearch (line 28) | class NearSearch(base.AbstractSearch):
    method __init__ (line 31) | def __init__(self, penalty: float, categories: WeightedCategories,
    method lookup (line 37) | async def lookup(self, conn: SearchConnection,
    method lookup_category (line 75) | async def lookup_category(self, results: nres.SearchResults,

FILE: src/nominatim_api/search/db_searches/place_search.py
  class PlaceSearch (line 33) | class PlaceSearch(base.AbstractSearch):
    method __init__ (line 38) | def __init__(self, extra_penalty: float, sdata: SearchData,
    method _inner_search_name_cte (line 50) | def _inner_search_name_cte(self, conn: SearchConnection,
    method lookup (line 134) | async def lookup(self, conn: SearchConnection,

FILE: src/nominatim_api/search/db_searches/poi_search.py
  class PoiSearch (line 29) | class PoiSearch(base.AbstractSearch):
    method __init__ (line 32) | def __init__(self, sdata: SearchData) -> None:
    method lookup (line 37) | async def lookup(self, conn: SearchConnection,

FILE: src/nominatim_api/search/db_searches/postcode_search.py
  class PostcodeSearch (line 28) | class PostcodeSearch(base.AbstractSearch):
    method __init__ (line 31) | def __init__(self, extra_penalty: float, sdata: SearchData) -> None:
    method lookup (line 38) | async def lookup(self, conn: SearchConnection,

FILE: src/nominatim_api/search/geocoder.py
  class ForwardGeocoder (line 29) | class ForwardGeocoder:
    method __init__ (line 33) | def __init__(self, conn: SearchConnection,
    method limit (line 41) | def limit(self) -> int:
    method _resolve_excluded_osm_ids (line 46) | async def _resolve_excluded_osm_ids(self) -> None:
    method build_searches (line 76) | async def build_searches(self,
    method execute_searches (line 105) | async def execute_searches(self, query: QueryStruct,
    method pre_filter_results (line 149) | def pre_filter_results(self, results: SearchResults) -> SearchResults:
    method sort_and_cut_results (line 159) | def sort_and_cut_results(self, results: SearchResults) -> SearchResults:
    method rerank_by_query (line 178) | def rerank_by_query(self, query: QueryStruct, results: SearchResults) ...
    method lookup_pois (line 221) | async def lookup_pois(self, categories: List[Tuple[str, str]],
    method lookup (line 252) | async def lookup(self, phrases: List[Phrase]) -> SearchResults:
  function _dump_searches (line 280) | def _dump_searches(searches: List[AbstractSearch], query: QueryStruct,

FILE: src/nominatim_api/search/icu_tokenizer.py
  class ICUToken (line 52) | class ICUToken(qmod.Token):
    method get_category (line 58) | def get_category(self) -> Tuple[str, str]:
    method get_country (line 62) | def get_country(self) -> str:
    method match_penalty (line 66) | def match_penalty(self, norm: str) -> float:
    method from_db_row (line 85) | def from_db_row(row: SaRow) -> 'ICUToken':
  class ICUAnalyzerConfig (line 121) | class ICUAnalyzerConfig:
    method create (line 128) | async def create(conn: SearchConnection) -> 'ICUAnalyzerConfig':
  class ICUQueryAnalyzer (line 155) | class ICUQueryAnalyzer(AbstractQueryAnalyzer):
    method __init__ (line 159) | def __init__(self, conn: SearchConnection, config: ICUAnalyzerConfig) ...
    method analyze_query (line 166) | async def analyze_query(self, phrases: List[qmod.Phrase]) -> qmod.Quer...
    method normalize_text (line 219) | def normalize_text(self, text: str) -> str:
    method split_transliteration (line 226) | def split_transliteration(self, trans: str, word: str) -> list[tuple[s...
    method split_query (line 254) | def split_query(self, query: qmod.QueryStruct) -> None:
    method lookup_in_db (line 275) | async def lookup_in_db(self, words: List[str]) -> 'sa.Result[Any]':
    method add_extra_tokens (line 286) | def add_extra_tokens(self, query: qmod.QueryStruct) -> None:
    method rerank_tokens (line 302) | def rerank_tokens(self, query: qmod.QueryStruct) -> None:
    method compute_break_penalties (line 342) | def compute_break_penalties(self, query: qmod.QueryStruct) -> None:
  function _dump_word_tokens (line 349) | def _dump_word_tokens(query: qmod.QueryStruct) -> Iterator[List[Any]]:
  function create_query_analyzer (line 363) | async def create_query_analyzer(conn: SearchConnection) -> AbstractQuery...

FILE: src/nominatim_api/search/postcode_parser.py
  class PostcodeParser (line 20) | class PostcodeParser:
    method __init__ (line 27) | def __init__(self, config: Configuration) -> None:
    method parse (line 50) | def parse(self, query: qmod.QueryStruct) -> Set[Tuple[int, int, str]]:
    method _match_word (line 85) | def _match_word(self, word: str, pos: int, fullmatch: bool,

FILE: src/nominatim_api/search/query.py
  function _phrase_compatible_with (line 92) | def _phrase_compatible_with(ptype: PhraseType, ttype: TokenType,
  class Token (line 113) | class Token(ABC):
    method get_category (line 125) | def get_category(self) -> Tuple[str, str]:
    method get_country (line 131) | def get_country(self) -> str:
  class TokenRange (line 138) | class TokenRange:
    method __lt__ (line 144) | def __lt__(self, other: 'TokenRange') -> bool:
    method __le__ (line 147) | def __le__(self, other: 'TokenRange') -> bool:
    method __gt__ (line 150) | def __gt__(self, other: 'TokenRange') -> bool:
    method __ge__ (line 153) | def __ge__(self, other: 'TokenRange') -> bool:
    method replace_start (line 156) | def replace_start(self, new_start: int) -> 'TokenRange':
    method replace_end (line 161) | def replace_end(self, new_end: int) -> 'TokenRange':
    method split (line 166) | def split(self, index: int) -> Tuple['TokenRange', 'TokenRange']:
  class TokenList (line 174) | class TokenList:
    method add_penalty (line 181) | def add_penalty(self, penalty: float) -> None:
  class QueryNode (line 189) | class QueryNode:
    method word_break_penalty (line 221) | def word_break_penalty(self) -> float:
    method word_continuation_penalty (line 227) | def word_continuation_penalty(self) -> float:
    method name_address_ratio (line 233) | def name_address_ratio(self) -> float:
    method has_tokens (line 242) | def has_tokens(self, end: int, *ttypes: TokenType) -> bool:
    method get_tokens (line 248) | def get_tokens(self, end: int, ttype: TokenType) -> Optional[List[Toke...
  class Phrase (line 260) | class Phrase:
  class QueryStruct (line 268) | class QueryStruct:
    method __init__ (line 288) | def __init__(self, source: List[Phrase]) -> None:
    method num_token_slots (line 295) | def num_token_slots(self) -> int:
    method add_node (line 300) | def add_node(self, btype: BreakType, ptype: PhraseType,
    method add_token (line 308) | def add_token(self, trange: TokenRange, ttype: TokenType, token: Token...
    method compute_direction_penalty (line 333) | def compute_direction_penalty(self) -> None:
    method get_tokens (line 348) | def get_tokens(self, trange: TokenRange, ttype: TokenType) -> List[Tok...
    method get_in_word_penalty (line 358) | def get_in_word_penalty(self, trange: TokenRange) -> float:
    method iter_partials (line 365) | def iter_partials(self, trange: TokenRange) -> Iterator[Token]:
    method iter_tokens_by_edge (line 371) | def iter_tokens_by_edge(self) -> Iterator[Tuple[int, int, Dict[TokenTy...
    method find_lookup_word_by_id (line 384) | def find_lookup_word_by_id(self, token: int) -> str:
    method extract_words (line 399) | def extract_words(self, start: int = 0,

FILE: src/nominatim_api/search/query_analyzer_factory.py
  class AbstractQueryAnalyzer (line 22) | class AbstractQueryAnalyzer(ABC):
    method analyze_query (line 29) | async def analyze_query(self, phrases: List['Phrase']) -> 'QueryStruct':
    method normalize_text (line 34) | def normalize_text(self, text: str) -> str:
  function make_query_analyzer (line 41) | async def make_query_analyzer(conn: SearchConnection) -> AbstractQueryAn...

FILE: src/nominatim_api/search/token_assignment.py
  class TypedRange (line 19) | class TypedRange:
  class TokenAssignment (line 30) | class TokenAssignment:
    method from_ranges (line 44) | def from_ranges(ranges: TypedRangeSeq) -> 'TokenAssignment':
  class _TokenSequence (line 64) | class _TokenSequence:
    method __init__ (line 70) | def __init__(self, seq: TypedRangeSeq,
    method __str__ (line 76) | def __str__(self) -> str:
    method end_pos (line 81) | def end_pos(self) -> int:
    method has_types (line 86) | def has_types(self, *ttypes: qmod.TokenType) -> bool:
    method is_final (line 92) | def is_final(self) -> bool:
    method appendable (line 100) | def appendable(self, ttype: qmod.TokenType) -> Optional[int]:
    method advance (line 184) | def advance(self, ttype: qmod.TokenType, end_pos: int,
    method _adapt_penalty_from_priors (line 210) | def _adapt_penalty_from_priors(self, priors: int, new_dir: int) -> bool:
    method recheck_sequence (line 222) | def recheck_sequence(self) -> bool:
    method _get_assignments_postcode (line 249) | def _get_assignments_postcode(self, base: TokenAssignment,
    method _get_assignments_address_forward (line 267) | def _get_assignments_address_forward(self, base: TokenAssignment,
    method _get_assignments_address_backward (line 312) | def _get_assignments_address_backward(self, base: TokenAssignment,
    method get_assignments (line 357) | def get_assignments(self, query: qmod.QueryStruct) -> Iterator[TokenAs...
  function yield_token_assignments (line 402) | def yield_token_assignments(query: qmod.QueryStruct) -> Iterator[TokenAs...
  function _append_state_to_todo (line 432) | def _append_state_to_todo(query: qmod.QueryStruct, todo: List[_TokenSequ...

FILE: src/nominatim_api/server/asgi_adaptor.py
  class ASGIAdaptor (line 21) | class ASGIAdaptor(abc.ABC):
    method get (line 28) | def get(self, name: str, default: Optional[str] = None) -> Optional[str]:
    method get_header (line 34) | def get_header(self, name: str, default: Optional[str] = None) -> Opti...
    method error (line 40) | def error(self, msg: str, status: int = 400) -> Exception:
    method create_response (line 46) | def create_response(self, status: int, output: str, num_results: int) ...
    method base_uri (line 58) | def base_uri(self) -> str:
    method config (line 63) | def config(self) -> Configuration:
    method formatting (line 68) | def formatting(self) -> FormatDispatcher:
    method query_stats (line 73) | def query_stats(self) -> Optional[QueryStatistics]:
    method get_int (line 78) | def get_int(self, name: str, default: Optional[int] = None) -> int:
    method get_float (line 101) | def get_float(self, name: str, default: Optional[float] = None) -> float:
    method get_bool (line 127) | def get_bool(self, name: str, default: Optional[bool] = None) -> bool:
    method raise_error (line 145) | def raise_error(self, msg: str, status: int = 400) -> NoReturn:

FILE: src/nominatim_api/server/falcon/server.py
  class HTTPNominatimError (line 28) | class HTTPNominatimError(Exception):
    method __init__ (line 31) | def __init__(self, msg: str, status: int, content_type: str) -> None:
  function nominatim_error_handler (line 37) | async def nominatim_error_handler(req: Request, resp: Response,
  function timeout_error_handler (line 48) | async def timeout_error_handler(req: Request, resp: Response,
  class ParamWrapper (line 66) | class ParamWrapper(ASGIAdaptor):
    method __init__ (line 70) | def __init__(self, req: Request, resp: Response,
    method get (line 77) | def get(self, name: str, default: Optional[str] = None) -> Optional[str]:
    method get_header (line 80) | def get_header(self, name: str, default: Optional[str] = None) -> Opti...
    method error (line 83) | def error(self, msg: str, status: int = 400) -> HTTPNominatimError:
    method create_response (line 86) | def create_response(self, status: int, output: str, num_results: int) ...
    method base_uri (line 92) | def base_uri(self) -> str:
    method config (line 95) | def config(self) -> Configuration:
    method formatting (line 98) | def formatting(self) -> FormatDispatcher:
    method query_stats (line 101) | def query_stats(self) -> Optional[QueryStatistics]:
  class EndpointWrapper (line 105) | class EndpointWrapper:
    method __init__ (line 109) | def __init__(self, name: str, func: EndpointFunc, api: NominatimAPIAsync,
    method on_get (line 116) | async def on_get(self, req: Request, resp: Response) -> None:
  class FileLoggingMiddleware (line 123) | class FileLoggingMiddleware:
    method __init__ (line 127) | def __init__(self, file_name: str, logstr: str):
    method process_request (line 131) | async def process_request(self, req: Request, _: Response) -> None:
    method process_response (line 136) | async def process_response(self, req: Request, resp: Response,
  class APIMiddleware (line 160) | class APIMiddleware:
    method __init__ (line 164) | def __init__(self, project_dir: Path, environ: Optional[Mapping[str, s...
    method config (line 169) | def config(self) -> Configuration:
    method set_app (line 174) | def set_app(self, app: App[Request, Response]) -> None:
    method process_startup (line 179) | async def process_startup(self, *_: Any) -> None:
    method process_shutdown (line 195) | async def process_shutdown(self, *_: Any) -> None:
  function get_application (line 201) | def get_application(project_dir: Path,
  function run_wsgi (line 224) | def run_wsgi() -> App[Request, Response]:

FILE: src/nominatim_api/server/starlette/server.py
  class ParamWrapper (line 35) | class ParamWrapper(ASGIAdaptor):
    method __init__ (line 39) | def __init__(self, request: Request) -> None:
    method get (line 42) | def get(self, name: str, default: Optional[str] = None) -> Optional[str]:
    method get_header (line 45) | def get_header(self, name: str, default: Optional[str] = None) -> Opti...
    method error (line 48) | def error(self, msg: str, status: int = 400) -> HTTPException:
    method create_response (line 52) | def create_response(self, status: int, output: str, num_results: int) ...
    method base_uri (line 56) | def base_uri(self) -> str:
    method config (line 68) | def config(self) -> Configuration:
    method formatting (line 71) | def formatting(self) -> FormatDispatcher:
    method query_stats (line 74) | def query_stats(self) -> Optional[QueryStatistics]:
  function _wrap_endpoint (line 78) | def _wrap_endpoint(func: EndpointFunc)\
  class FileLoggingMiddleware (line 86) | class FileLoggingMiddleware(BaseHTTPMiddleware):
    method __init__ (line 90) | def __init__(self, app: Starlette, file_name: str = '', logstr: str = ...
    method dispatch (line 95) | async def dispatch(self, request: Request,
  function timeout_error (line 123) | async def timeout_error(request: Request,
  function get_application (line 136) | def get_application(project_dir: Path,
  function run_wsgi (line 185) | def run_wsgi() -> Starlette:

FILE: src/nominatim_api/sql/sqlalchemy_functions.py
  class PlacexGeometryReverseLookuppolygon (line 19) | class PlacexGeometryReverseLookuppolygon(sa.sql.functions.GenericFunctio...
  function _default_intersects (line 31) | def _default_intersects(element: PlacexGeometryReverseLookuppolygon,
  function _sqlite_intersects (line 41) | def _sqlite_intersects(element: PlacexGeometryReverseLookuppolygon,
  class IntersectsReverseDistance (line 50) | class IntersectsReverseDistance(sa.sql.functions.GenericFunction[Any]):
    method __init__ (line 54) | def __init__(self, table: sa.Table, geom: SaColumn) -> None:
  function default_reverse_place_diameter (line 61) | def default_reverse_place_diameter(element: IntersectsReverseDistance,
  function sqlite_reverse_place_diameter (line 73) | def sqlite_reverse_place_diameter(element: IntersectsReverseDistance,
  class IsBelowReverseDistance (line 94) | class IsBelowReverseDistance(sa.sql.functions.GenericFunction[Any]):
  function default_is_below_reverse_distance (line 100) | def default_is_below_reverse_distance(element: IsBelowReverseDistance,
  function sqlite_is_below_reverse_distance (line 108) | def sqlite_is_below_reverse_distance(element: IsBelowReverseDistance,
  class IsAddressPoint (line 115) | class IsAddressPoint(sa.sql.functions.GenericFunction[Any]):
    method __init__ (line 119) | def __init__(self, table: sa.Table) -> None:
  function default_is_address_point (line 125) | def default_is_address_point(element: IsAddressPoint,
  function sqlite_is_address_point (line 138) | def sqlite_is_address_point(element: IsAddressPoint,
  class CrosscheckNames (line 149) | class CrosscheckNames(sa.sql.functions.GenericFunction[Any]):
  function compile_crosscheck_names (line 158) | def compile_crosscheck_names(element: CrosscheckNames,
  function compile_sqlite_crosscheck_names (line 166) | def compile_sqlite_crosscheck_names(element: CrosscheckNames,
  class JsonArrayEach (line 175) | class JsonArrayEach(sa.sql.functions.GenericFunction[Any]):
  function default_json_array_each (line 183) | def default_json_array_each(element: JsonArrayEach, compiler: 'sa.Compil...
  function sqlite_json_array_each (line 188) | def sqlite_json_array_each(element: JsonArrayEach, compiler: 'sa.Compile...
  class Greatest (line 192) | class Greatest(sa.sql.functions.GenericFunction[Any]):
  function sqlite_greatest (line 200) | def sqlite_greatest(element: Greatest, compiler: 'sa.Compiled', **kw: An...
  class RegexpWord (line 204) | class RegexpWord(sa.sql.functions.GenericFunction[Any]):
  function postgres_regexp_nocase (line 212) | def postgres_regexp_nocase(element: RegexpWord, compiler: 'sa.Compiled',...
  function sqlite_regexp_nocase (line 219) | def sqlite_regexp_nocase(element: RegexpWord, compiler: 'sa.Compiled', *...

FILE: src/nominatim_api/sql/sqlalchemy_schema.py
  class SearchTables (line 15) | class SearchTables:
    method __init__ (line 22) | def __init__(self, meta: sa.MetaData) -> None:

FILE: src/nominatim_api/sql/sqlalchemy_types/geometry.py
  class Geometry_DistanceSpheroid (line 20) | class Geometry_DistanceSpheroid(sa.sql.expression.FunctionElement[float]):
  function _default_distance_spheroid (line 29) | def _default_distance_spheroid(element: Geometry_DistanceSpheroid,
  function _spatialite_distance_spheroid (line 37) | def _spatialite_distance_spheroid(element: Geometry_DistanceSpheroid,
  class Geometry_IsLineLike (line 42) | class Geometry_IsLineLike(sa.sql.expression.FunctionElement[Any]):
  function _default_is_line_like (line 50) | def _default_is_line_like(element: Geometry_IsLineLike,
  function _sqlite_is_line_like (line 57) | def _sqlite_is_line_like(element: Geometry_IsLineLike,
  class Geometry_IsAreaLike (line 63) | class Geometry_IsAreaLike(sa.sql.expression.FunctionElement[Any]):
  function _default_is_area_like (line 71) | def _default_is_area_like(element: Geometry_IsAreaLike,
  function _sqlite_is_area_like (line 78) | def _sqlite_is_area_like(element: Geometry_IsAreaLike,
  class Geometry_IntersectsBbox (line 84) | class Geometry_IntersectsBbox(sa.sql.expression.FunctionElement[Any]):
  function _default_intersects (line 92) | def _default_intersects(element: Geometry_IntersectsBbox,
  function _sqlite_intersects (line 99) | def _sqlite_intersects(element: Geometry_IntersectsBbox,
  class Geometry_ColumnIntersectsBbox (line 104) | class Geometry_ColumnIntersectsBbox(sa.sql.expression.FunctionElement[An...
  function default_intersects_column (line 115) | def default_intersects_column(element: Geometry_ColumnIntersectsBbox,
  function spatialite_intersects_column (line 122) | def spatialite_intersects_column(element: Geometry_ColumnIntersectsBbox,
  class Geometry_ColumnDWithin (line 135) | class Geometry_ColumnDWithin(sa.sql.expression.FunctionElement[Any]):
  function default_dwithin_column (line 146) | def default_dwithin_column(element: Geometry_ColumnDWithin,
  function spatialite_dwithin_column (line 152) | def spatialite_dwithin_column(element: Geometry_ColumnDWithin,
  class Geometry (line 167) | class Geometry(types.UserDefinedType):  # type: ignore[type-arg]
    method __init__ (line 173) | def __init__(self, subtype: str = 'Geometry'):
    method get_col_spec (line 176) | def get_col_spec(self, **_: Any) -> str:
    method bind_processor (line 179) | def bind_processor(self, dialect: 'sa.Dialect') -> Callable[[Any], str]:
    method result_processor (line 189) | def result_processor(self, dialect: 'sa.Dialect', coltype: object) -> ...
    method column_expression (line 195) | def column_expression(self, col: SaColumn) -> SaColumn:
    method bind_expression (line 198) | def bind_expression(self, bindvalue: SaBind) -> SaColumn:
    class comparator_factory (line 201) | class comparator_factory(types.UserDefinedType.Comparator):  # type: i...
      method intersects (line 203) | def intersects(self, other: SaColumn, use_index: bool = True) -> 'sa...
      method is_line_like (line 212) | def is_line_like(self) -> SaColumn:
      method is_area (line 215) | def is_area(self) -> SaColumn:
      method within_distance (line 218) | def within_distance(self, other: SaColumn, distance: SaColumn) -> Sa...
      method ST_Distance (line 224) | def ST_Distance(self, other: SaColumn) -> SaColumn:
      method ST_Contains (line 227) | def ST_Contains(self, other: SaColumn) -> SaColumn:
      method ST_CoveredBy (line 230) | def ST_CoveredBy(self, other: SaColumn) -> SaColumn:
      method ST_ClosestPoint (line 233) | def ST_ClosestPoint(self, other: SaColumn) -> SaColumn:
      method ST_Buffer (line 237) | def ST_Buffer(self, other: SaColumn) -> SaColumn:
      method ST_Expand (line 240) | def ST_Expand(self, other: SaColumn) -> SaColumn:
      method ST_Collect (line 243) | def ST_Collect(self) -> SaColumn:
      method ST_Centroid (line 246) | def ST_Centroid(self) -> SaColumn:
      method ST_LineInterpolatePoint (line 249) | def ST_LineInterpolatePoint(self, other: SaColumn) -> SaColumn:
      method ST_LineLocatePoint (line 252) | def ST_LineLocatePoint(self, other: SaColumn) -> SaColumn:
      method distance_spheroid (line 255) | def distance_spheroid(self, other: SaColumn) -> SaColumn:
  function get_col_spec (line 260) | def get_col_spec(self, *args, **kwargs):  # type: ignore[no-untyped-def]
  function _add_function_alias (line 275) | def _add_function_alias(func: str, ftype: type, alias: str) -> None:

FILE: src/nominatim_api/sql/sqlalchemy_types/int_array.py
  class IntList (line 19) | class IntList(sa.types.TypeDecorator[Any]):
    method process_bind_param (line 25) | def process_bind_param(self, value: Optional[Any], dialect: 'sa.Dialec...
    method process_result_value (line 32) | def process_result_value(self, value: Optional[Any],
  class IntArray (line 37) | class IntArray(sa.types.TypeDecorator[Any]):
    method load_dialect_impl (line 43) | def load_dialect_impl(self, dialect: SaDialect) -> sa.types.TypeEngine...
    class comparator_factory (line 49) | class comparator_factory(sa.types.UserDefinedType.Comparator):  # type...
      method __add__ (line 51) | def __add__(self, other: SaColumn) -> 'sa.ColumnOperators':
      method contains (line 57) | def contains(self, other: SaColumn, **kwargs: Any) -> 'sa.ColumnOper...
  class ArrayAgg (line 64) | class ArrayAgg(sa.sql.functions.GenericFunction[Any]):
  function sqlite_array_agg (line 74) | def sqlite_array_agg(element: ArrayAgg, compiler: 'sa.Compiled', **kw: A...
  class ArrayContains (line 78) | class ArrayContains(sa.sql.expression.FunctionElement[Any]):
  function generic_array_contains (line 86) | def generic_array_contains(element: ArrayContains, compiler: 'sa.Compile...
  function sqlite_array_contains (line 93) | def sqlite_array_contains(element: ArrayContains, compiler: 'sa.Compiled...
  class ArrayCat (line 97) | class ArrayCat(sa.sql.expression.FunctionElement[Any]):
  function generic_array_cat (line 106) | def generic_array_cat(element: ArrayCat, compiler: 'sa.Compiled', **kw: ...
  function sqlite_array_cat (line 111) | def sqlite_array_cat(element: ArrayCat, compiler: 'sa.Compiled', **kw: A...

FILE: src/nominatim_api/sql/sqlalchemy_types/json.py
  class Json (line 19) | class Json(sa.types.TypeDecorator[Any]):
    method load_dialect_impl (line 25) | def load_dialect_impl(self, dialect: SaDialect) -> sa.types.TypeEngine...

FILE: src/nominatim_api/sql/sqlalchemy_types/key_value.py
  class KeyValueStore (line 20) | class KeyValueStore(sa.types.TypeDecorator[Any]):
    method load_dialect_impl (line 26) | def load_dialect_impl(self, dialect: SaDialect) -> sa.types.TypeEngine...
    class comparator_factory (line 32) | class comparator_factory(sa.types.UserDefinedType.Comparator):  # type...
      method merge (line 34) | def merge(self, other: SaColumn) -> 'sa.Operators':
  class KeyValueConcat (line 42) | class KeyValueConcat(sa.sql.expression.FunctionElement[Any]):
  function default_json_concat (line 51) | def default_json_concat(element: KeyValueConcat, compiler: 'sa.Compiled'...
  function sqlite_json_concat (line 58) | def sqlite_json_concat(element: KeyValueConcat, compiler: 'sa.Compiled',...

FILE: src/nominatim_api/sql/sqlite_functions.py
  function weigh_search (line 14) | def weigh_search(search_vector: Optional[str], rankings: str, default: f...
  class ArrayIntersectFuzzy (line 26) | class ArrayIntersectFuzzy:
    method __init__ (line 33) | def __init__(self) -> None:
    method step (line 37) | def step(self, value: Optional[str]) -> None:
    method finalize (line 48) | def finalize(self) -> str:
  class ArrayUnion (line 57) | class ArrayUnion:
    method __init__ (line 62) | def __init__(self) -> None:
    method step (line 65) | def step(self, value: Optional[str]) -> None:
    method finalize (line 74) | def finalize(self) -> str:
  function array_contains (line 80) | def array_contains(container: Optional[str], containee: Optional[str]) -...
  function array_pair_contains (line 90) | def array_pair_contains(container1: Optional[str], container2: Optional[...
  function install_custom_functions (line 102) | def install_custom_functions(conn: Any) -> None:
  function _make_aggregate (line 113) | async def _make_aggregate(aioconn: Any, *args: Any) -> None:
  function _create_aggregate (line 117) | def _create_aggregate(conn: Any, name: str, nargs: int, aggregate: Any) ...

FILE: src/nominatim_api/status.py
  class StatusResult (line 21) | class StatusResult:
  function get_status (line 31) | async def get_status(conn: SearchConnection) -> StatusResult:

FILE: src/nominatim_api/timeout.py
  class Timeout (line 14) | class Timeout:
    method __init__ (line 18) | def __init__(self, timeout: Optional[Union[int, float]]) -> None:
    method is_elapsed (line 21) | def is_elapsed(self) -> bool:

FILE: src/nominatim_api/types.py
  class PlaceID (line 26) | class PlaceID:
    method __str__ (line 39) | def __str__(self) -> str:
  class OsmID (line 44) | class OsmID:
    method __str__ (line 65) | def __str__(self) -> str:
    method __post_init__ (line 68) | def __post_init__(self) -> None:
    method class_as_housenumber (line 72) | def class_as_housenumber(self) -> Optional[int]:
  class Point (line 87) | class Point(NamedTuple):
    method lat (line 94) | def lat(self) -> float:
    method lon (line 100) | def lon(self) -> float:
    method to_geojson (line 105) | def to_geojson(self) -> str:
    method from_wkb (line 111) | def from_wkb(wkb: Union[str, bytes]) -> 'Point':
    method from_param (line 133) | def from_param(inp: Any) -> 'Point':
    method to_wkt (line 160) | def to_wkt(self) -> str:
  class Bbox (line 172) | class Bbox:
    method __init__ (line 178) | def __init__(self, minx: float, miny: float, maxx: float, maxy: float)...
    method minlat (line 185) | def minlat(self) -> float:
    method maxlat (line 191) | def maxlat(self) -> float:
    method minlon (line 197) | def minlon(self) -> float:
    method maxlon (line 203) | def maxlon(self) -> float:
    method area (line 209) | def area(self) -> float:
    method contains (line 214) | def contains(self, pt: Point) -> bool:
    method to_wkt (line 220) | def to_wkt(self) -> str:
    method from_wkb (line 228) | def from_wkb(wkb: Union[None, str, bytes]) -> 'Optional[Bbox]':
    method from_point (line 250) | def from_point(pt: Point, buffer: float) -> 'Bbox':
    method from_param (line 257) | def from_param(inp: Any) -> 'Bbox':
  class GeometryFormat (line 289) | class GeometryFormat(enum.Flag):
  class DataLayer (line 316) | class DataLayer(enum.Flag):
  class QueryStatistics (line 346) | class QueryStatistics(dict[str, Any]):
    method __enter__ (line 350) | def __enter__(self) -> 'QueryStatistics':
    method __exit__ (line 354) | def __exit__(self, *_: Any) -> None:
    method __missing__ (line 364) | def __missing__(self, key: str) -> str:
    method log_time (line 367) | def log_time(self, key: str) -> None:
  class NoQueryStats (line 371) | class NoQueryStats:
    method __enter__ (line 375) | def __enter__(self) -> 'NoQueryStats':
    method __exit__ (line 378) | def __exit__(self, *_: Any) -> None:
    method __setitem__ (line 381) | def __setitem__(self, key: str, value: Any) -> None:
    method __getitem__ (line 384) | def __getitem__(self, key: str) -> Any:
    method __contains__ (line 387) | def __contains__(self, key: str, default: Any = None) -> bool:
    method log_time (line 390) | def log_time(self, key: str) -> None:
  function format_country (line 394) | def format_country(cc: Any) -> List[str]:
  function format_excluded (line 411) | def format_excluded(ids: Any) -> List[PlaceRef]:
  function format_categories (line 450) | def format_categories(categories: List[Tuple[str, str]]) -> List[Tuple[s...
  class LookupDetails (line 460) | class LookupDetails:
    method from_kwargs (line 498) | def from_kwargs(cls: Type[TParam], kwargs: Dict[str, Any]) -> TParam:
  class ReverseDetails (line 522) | class ReverseDetails(LookupDetails):
  class SearchDetails (line 537) | class SearchDetails(LookupDetails):
    method __post_init__ (line 609) | def __post_init__(self) -> None:
    method excluded_place_ids (line 617) | def excluded_place_ids(self) -> List[int]:
    method restrict_min_max_rank (line 624) | def restrict_min_max_rank(self, new_min: int, new_max: int) -> None:
    method is_impossible (line 632) | def is_impossible(self) -> bool:
    method layer_enabled (line 644) | def layer_enabled(self, layer: DataLayer) -> bool:
  class EntranceDetails (line 652) | class EntranceDetails:

FILE: src/nominatim_api/utils/json_writer.py
  class JsonWriter (line 20) | class JsonWriter:
    method __init__ (line 33) | def __init__(self) -> None:
    method __call__ (line 37) | def __call__(self) -> str:
    method start_object (line 47) | def start_object(self) -> 'JsonWriter':
    method end_object (line 55) | def end_object(self) -> 'JsonWriter':
    method start_array (line 64) | def start_array(self) -> 'JsonWriter':
    method end_array (line 72) | def end_array(self) -> 'JsonWriter':
    method key (line 81) | def key(self, name: str) -> 'JsonWriter':
    method value (line 90) | def value(self, value: Any) -> 'JsonWriter':
    method float (line 97) | def float(self, value: float, precision: int) -> 'JsonWriter':
    method next (line 102) | def next(self) -> 'JsonWriter':
    method raw (line 110) | def raw(self, raw_json: str) -> 'JsonWriter':
    method keyval (line 120) | def keyval(self, key: str, value: Any) -> 'JsonWriter':
    method keyval_not_none (line 128) | def keyval_not_none(self, key: str, value: Optional[T],

FILE: src/nominatim_api/v1/classtypes.py
  function get_label_tag (line 19) | def get_label_tag(category: Tuple[str, str], extratags: Optional[Mapping...
  function bbox_from_result (line 46) | def bbox_from_result(result: Union[ReverseResult, SearchResult]) -> Bbox:

FILE: src/nominatim_api/v1/format.py
  class RawDataList (line 27) | class RawDataList(List[Dict[str, Any]]):
  function _format_error (line 38) | def _format_error(content_type: str, msg: str, status: int) -> str:
  function _format_status_text (line 60) | def _format_status_text(result: StatusResult, _: Mapping[str, Any]) -> str:
  function _format_status_json (line 68) | def _format_status_json(result: StatusResult, _: Mapping[str, Any]) -> str:
  function _add_address_row (line 83) | def _add_address_row(writer: JsonWriter, row: AddressLine,
  function _add_address_rows (line 105) | def _add_address_rows(writer: JsonWriter, section: str, rows: AddressLines,
  function _add_parent_rows_grouped (line 114) | def _add_parent_rows_grouped(writer: JsonWriter, rows: AddressLines,
  function _format_details_json (line 135) | def _format_details_json(result: DetailedResult, options: Mapping[str, A...
  function _format_reverse_xml (line 209) | def _format_reverse_xml(results: ReverseResults, options: Mapping[str, A...
  function _format_reverse_geojson (line 216) | def _format_reverse_geojson(results: ReverseResults,
  function _format_reverse_geocodejson (line 222) | def _format_reverse_geocodejson(results: ReverseResults,
  function _format_reverse_json (line 228) | def _format_reverse_json(results: ReverseResults,
  function _format_reverse_jsonv2 (line 235) | def _format_reverse_jsonv2(results: ReverseResults,
  function _format_search_xml (line 242) | def _format_search_xml(results: SearchResults, options: Mapping[str, Any...
  function _format_search_geojson (line 252) | def _format_search_geojson(results: SearchResults,
  function _format_search_geocodejson (line 258) | def _format_search_geocodejson(results: SearchResults,
  function _format_search_json (line 264) | def _format_search_json(results: SearchResults,
  function _format_search_jsonv2 (line 271) | def _format_search_jsonv2(results: SearchResults,
  function _format_raw_data_json (line 278) | def _format_raw_data_json(results: RawDataList,  _: Mapping[str, Any]) -...

FILE: src/nominatim_api/v1/format_json.py
  function _write_osm_id (line 19) | def _write_osm_id(out: JsonWriter, osm_object: Optional[Tuple[str, int]]...
  function _write_typed_address (line 25) | def _write_typed_address(out: JsonWriter, address: Optional[AddressLines],
  function _write_geocodejson_address (line 45) | def _write_geocodejson_address(out: JsonWriter,
  function write_entrances (line 69) | def write_entrances(out: JsonWriter, entrances: Optional[List[EntranceDe...
  function format_base_json (line 91) | def format_base_json(results: Union[ReverseResults, SearchResults],
  function format_base_geojson (line 171) | def format_base_geojson(results: Union[ReverseResults, SearchResults],
  function format_base_geocodejson (line 236) | def format_base_geocodejson(results: Union[ReverseResults, SearchResults],

FILE: src/nominatim_api/v1/format_xml.py
  function _write_xml_address (line 21) | def _write_xml_address(root: ET.Element, address: AddressLines,
  function _create_base_entry (line 41) | def _create_base_entry(result: Union[ReverseResult, SearchResult],
  function _create_entrance (line 87) | def _create_entrance(root: ET.Element, entrance: EntranceDetails) -> None:
  function format_base_xml (line 99) | def format_base_xml(results: Union[ReverseResults, SearchResults],

FILE: src/nominatim_api/v1/helpers.py
  function _add_admin_level (line 19) | def _add_admin_level(result: BaseResult) -> Optional[Dict[str, str]]:
  function zoom_to_rank (line 45) | def zoom_to_rank(zoom: int) -> int:
  function feature_type_to_rank (line 59) | def feature_type_to_rank(feature_type: Optional[str]) -> Tuple[int, int]:
  function extend_query_parts (line 66) | def extend_query_parts(queryparts: Dict[str, Any], details: Dict[str, Any],
  function deduplicate_results (line 110) | def deduplicate_results(results: SearchResults, max_results: int) -> Sea...
  function _deg (line 138) | def _deg(axis: str) -> str:
  function _deg_min (line 142) | def _deg_min(axis: str) -> str:
  function _deg_min_sec (line 146) | def _deg_min_sec(axis: str) -> str:
  function extract_coords_from_query (line 161) | def extract_coords_from_query(query: str) -> Tuple[str, Optional[float],...
  function extract_category_from_query (line 193) | def extract_category_from_query(query: str) -> Tuple[str, Optional[str],...

FILE: src/nominatim_api/v1/server_glue.py
  function build_response (line 33) | def build_response(adaptor: ASGIAdaptor, output: str, status: int = 200,
  function get_accepted_languages (line 49) | def get_accepted_languages(adaptor: ASGIAdaptor) -> str:
  function setup_debugging (line 57) | def setup_debugging(adaptor: ASGIAdaptor) -> bool:
  function get_layers (line 70) | def get_layers(adaptor: ASGIAdaptor) -> Optional[DataLayer]:
  function parse_format (line 82) | def parse_format(adaptor: ASGIAdaptor, result_type: Type[Any], default: ...
  function parse_geometry_details (line 100) | def parse_geometry_details(adaptor: ASGIAdaptor, fmt: str) -> Dict[str, ...
  function has_search_name (line 128) | def has_search_name(conn: sa.engine.Connection) -> bool:
  function status_endpoint (line 134) | async def status_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -...
  function details_endpoint (line 150) | async def details_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) ...
  function reverse_endpoint (line 199) | async def reverse_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) ...
  function lookup_endpoint (line 242) | async def lookup_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -...
  function _unstructured_search (line 281) | async def _unstructured_search(query: str, api: NominatimAPIAsync,
  function search_endpoint (line 312) | async def search_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor) -...
  function deletable_endpoint (line 401) | async def deletable_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor...
  function polygons_endpoint (line 424) | async def polygons_endpoint(api: NominatimAPIAsync, params: ASGIAdaptor)...
  function search_unavailable_endpoint (line 456) | async def search_unavailable_endpoint(api: NominatimAPIAsync, params: AS...
  class LazySearchEndpoint (line 463) | class LazySearchEndpoint:
    method __init__ (line 473) | def __init__(self, api: NominatimAPIAsync, real_endpoint: EndpointFunc):
    method set_wrapper (line 480) | def set_wrapper(self, wrapper: Any) -> None:
    method __call__ (line 483) | async def __call__(self, api: NominatimAPIAsync, params: ASGIAdaptor) ...
  function get_routes (line 511) | async def get_routes(api: NominatimAPIAsync) -> Sequence[Tuple[str, Endp...

FILE: src/nominatim_db/cli.py
  class CommandlineParser (line 28) | class CommandlineParser:
    method __init__ (line 32) | def __init__(self, prog: str, description: Optional[str]):
    method nominatim_version_text (line 60) | def nominatim_version_text(self) -> str:
    method add_subcommand (line 68) | def add_subcommand(self, name: str, cmd: Subcommand) -> None:
    method run (line 83) | def run(self, cli_args: Optional[List[str]],
  class AdminServe (line 136) | class AdminServe:
    method add_args (line 152) | def add_args(self, parser: argparse.ArgumentParser) -> None:
    method run (line 160) | def run(self, args: NominatimArgs) -> int:
    method run_uvicorn (line 165) | async def run_uvicorn(self, args: NominatimArgs) -> None:
  function get_set_parser (line 186) | def get_set_parser() -> CommandlineParser:
  function nominatim (line 232) | def nominatim(cli_args: Optional[List[str]] = None,

FILE: src/nominatim_db/clicmd/add_data.py
  class UpdateAddData (line 25) | class UpdateAddData:
    method add_args (line 42) | def add_args(self, parser: argparse.ArgumentParser) -> None:
    method run (line 65) | def run(self, args: NominatimArgs) -> int:
    method _add_tiger_data (line 102) | async def _add_tiger_data(self, args: NominatimArgs) -> int:

FILE: src/nominatim_db/clicmd/admin.py
  class AdminFuncs (line 22) | class AdminFuncs:
    method add_args (line 27) | def add_args(self, parser: argparse.ArgumentParser) -> None:
    method run (line 56) | def run(self, args: NominatimArgs) -> int:
    method _warm (line 90) | def _warm(self, args: NominatimArgs) -> int:

FILE: src/nominatim_db/clicmd/api.py
  function _add_list_format (line 50) | def _add_list_format(parser: argparse.ArgumentParser) -> None:
  function _add_api_output_arguments (line 56) | def _add_api_output_arguments(parser: argparse.ArgumentParser) -> None:
  function _get_geometry_output (line 74) | def _get_geometry_output(args: NominatimArgs) -> napi.GeometryFormat:
  function _get_locales (line 95) | def _get_locales(args: NominatimArgs, config: Configuration) -> napi.Loc...
  function _get_layers (line 107) | def _get_layers(args: NominatimArgs, default: Optional[napi.DataLayer]) ...
  function _list_formats (line 117) | def _list_formats(formatter: napi.FormatDispatcher, rtype: Type[Any]) ->...
  function _print_output (line 126) | def _print_output(formatter: napi.FormatDispatcher, result: Any,
  class APISearch (line 146) | class APISearch:
    method add_args (line 156) | def add_args(self, parser: argparse.ArgumentParser) -> None:
    method run (line 184) | def run(self, args: NominatimArgs) -> int:
  class APIReverse (line 244) | class APIReverse:
    method add_args (line 254) | def add_args(self, parser: argparse.ArgumentParser) -> None:
    method run (line 270) | def run(self, args: NominatimArgs) -> int:
  class APILookup (line 319) | class APILookup:
    method add_args (line 329) | def add_args(self, parser: argparse.ArgumentParser) -> None:
    method run (line 338) | def run(self, args: NominatimArgs) -> int:
  class APIDetails (line 379) | class APIDetails:
    method add_args (line 389) | def add_args(self, parser: argparse.ArgumentParser) -> None:
    method run (line 424) | def run(self, args: NominatimArgs) -> int:
  class APIStatus (line 480) | class APIStatus:
    method add_args (line 490) | def add_args(self, parser: argparse.ArgumentParser) -> None:
    method run (line 496) | def run(self, args: NominatimArgs) -> int:

FILE: src/nominatim_db/clicmd/args.py
  class Subcommand (line 23) | class Subcommand(Protocol):
    method add_args (line 28) | def add_args(self, parser: argparse.ArgumentParser) -> None:
    method run (line 34) | def run(self, args: 'NominatimArgs') -> int:
  class NominatimArgs (line 40) | class NominatimArgs:
    method osm2pgsql_options (line 187) | def osm2pgsql_options(self, default_cache: int,
    method get_osm_file_list (line 207) | def get_osm_file_list(self) -> Optional[List[Path]]:

FILE: src/nominatim_db/clicmd/convert.py
  class WithAction (line 19) | class WithAction(argparse.Action):
    method __init__ (line 23) | def __init__(self, option_strings: Sequence[str], dest: Any,
    method __call__ (line 42) | def __call__(self, parser: argparse.ArgumentParser, namespace: argpars...
  class ConvertDB (line 52) | class ConvertDB:
    method __init__ (line 60) | def __init__(self) -> None:
    method add_args (line 63) | def add_args(self, parser: argparse.ArgumentParser) -> None:
    method run (line 79) | def run(self, args: NominatimArgs) -> int:

FILE: src/nominatim_db/clicmd/export.py
  class QueryExport (line 50) | class QueryExport:
    method add_args (line 57) | def add_args(self, parser: argparse.ArgumentParser) -> None:
    method run (line 84) | def run(self, args: NominatimArgs) -> int:
  function export (line 88) | async def export(args: NominatimArgs) -> int:
  function init_csv_writer (line 142) | def init_csv_writer(output_format: str) -> 'csv.DictWriter[str]':
  function dump_results (line 150) | async def dump_results(conn: napi.SearchConnection,
  function get_parent_id (line 174) | async def get_parent_id(conn: napi.SearchConnection, node_id: Optional[i...

FILE: src/nominatim_db/clicmd/freeze.py
  class SetupFreeze (line 16) | class SetupFreeze:
    method add_args (line 28) | def add_args(self, parser: argparse.ArgumentParser) -> None:
    method run (line 31) | def run(self, args: NominatimArgs) -> int:

FILE: src/nominatim_db/clicmd/index.py
  class UpdateIndex (line 20) | class UpdateIndex:
    method add_args (line 30) | def add_args(self, parser: argparse.ArgumentParser) -> None:
    method run (line 41) | def run(self, args: NominatimArgs) -> int:
    method _do_index (line 51) | async def _do_index(self, args: NominatimArgs) -> None:

FILE: src/nominatim_db/clicmd/refresh.py
  function _parse_osm_object (line 25) | def _parse_osm_object(obj: str) -> Tuple[str, int]:
  class UpdateRefresh (line 35) | class UpdateRefresh:
    method __init__ (line 47) | def __init__(self) -> None:
    method add_args (line 50) | def add_args(self, parser: argparse.ArgumentParser) -> None:
    method run (line 92) | def run(self, args: NominatimArgs) -> int:
    method _get_tokenizer (line 184) | def _get_tokenizer(self, config: Configuration) -> AbstractTokenizer:

FILE: src/nominatim_db/clicmd/replication.py
  class UpdateReplication (line 26) | class UpdateReplication:
    method add_args (line 44) | def add_args(self, parser: argparse.ArgumentParser) -> None:
    method _init_replication (line 70) | def _init_replication(self, args: NominatimArgs) -> int:
    method _check_for_updates (line 82) | def _check_for_updates(self, args: NominatimArgs) -> int:
    method _report_update (line 89) | def _report_update(self, batchdate: dt.datetime,
    method _compute_update_interval (line 102) | def _compute_update_interval(self, args: NominatimArgs) -> int:
    method _update (line 118) | async def _update(self, args: NominatimArgs) -> None:
    method run (line 179) | def run(self, args: NominatimArgs) -> int:

FILE: src/nominatim_db/clicmd/setup.py
  class SetupAll (line 31) | class SetupAll:
    method add_args (line 40) | def add_args(self, parser: argparse.ArgumentParser) -> None:
    method run (line 71) | def run(self, args: NominatimArgs) -> int:
    method async_run (line 85) | async def async_run(self, args: NominatimArgs) -> int:
    method _base_import (line 152) | def _base_import(self, args: NominatimArgs) -> None:
    method _setup_tables (line 190) | def _setup_tables(self, config: Configuration, reverse_only: bool) -> ...
    method _get_tokenizer (line 211) | def _get_tokenizer(self, continue_at: Optional[str],
    method _finalize_database (line 224) | def _finalize_database(self, dsn: str, offline: bool) -> None:

FILE: src/nominatim_db/clicmd/special_phrases.py
  class ImportSpecialPhrases (line 25) | class ImportSpecialPhrases:
    method add_args (line 53) | def add_args(self, parser: argparse.ArgumentParser) -> None:
    method run (line 64) | def run(self, args: NominatimArgs) -> int:
    method start_import (line 78) | def start_import(self, args: NominatimArgs, loader: SpecialPhraseLoade...

FILE: src/nominatim_db/config.py
  function flatten_config_list (line 32) | def flatten_config_list(content: Any, section: str = '') -> List[Any]:
  class Configuration (line 52) | class Configuration:
    method __init__ (line 64) | def __init__(self, project_dir: Optional[Union[Path, str]],
    method set_libdirs (line 88) | def set_libdirs(self, **kwargs: StrPath) -> None:
    method __getattr__ (line 94) | def __getattr__(self, name: str) -> str:
    method get_bool (line 102) | def get_bool(self, name: str) -> bool:
    method get_int (line 114) | def get_int(self, name: str) -> int:
    method get_str_list (line 133) | def get_str_list(self, name: str) -> Optional[List[str]]:
    method get_path (line 152) | def get_path(self, name: str) -> Optional[Path]:
    method get_libpq_dsn (line 177) | def get_libpq_dsn(self) -> str:
    method get_database_params (line 196) | def get_database_params(self) -> Mapping[str, Union[str, int, None]]:
    method get_import_style_file (line 207) | def get_import_style_file(self) -> Path:
    method get_os_env (line 219) | def get_os_env(self) -> Dict[str, str]:
    method load_sub_configuration (line 228) | def load_sub_configuration(self, filename: StrPath,
    method load_plugin_module (line 265) | def load_plugin_module(self, module_name: str, internal_path: str) -> ...
    method find_config_file (line 307) | def find_config_file(self, filename: StrPath,
    method _load_from_yaml (line 339) | def _load_from_yaml(self, cfgfile: Path) -> Any:
    method _yaml_include_representer (line 347) | def _yaml_include_representer(self, loader: Any, node: yaml.Node) -> Any:

FILE: src/nominatim_db/data/country_info.py
  function _flatten_name_list (line 20) | def _flatten_name_list(names: Any) -> Dict[str, str]:
  class _CountryInfo (line 43) | class _CountryInfo:
    method __init__ (line 47) | def __init__(self) -> None:
    method load (line 50) | def load(self, config: Configuration) -> None:
    method items (line 65) | def items(self) -> Iterable[Tuple[str, Dict[str, Any]]]:
    method get (line 70) | def get(self, country_code: str) -> Dict[str, Any]:
  function setup_country_config (line 79) | def setup_country_config(config: Configuration) -> None:
  function iterate (line 88) | def iterate() -> Iterable[Tuple[str, Dict[str, Any]]]:
  function iterate (line 93) | def iterate(prop: str) -> Iterable[Tuple[str, Any]]:
  function iterate (line 97) | def iterate(prop: Optional[str] = None) -> Iterable[Tuple[str, Dict[str,...
  function setup_country_tables (line 113) | def setup_country_tables(dsn: str, sql_dir: Path, ignore_partitions: boo...
  function create_country_names (line 149) | def create_country_names(conn: Connection, tokenizer: AbstractTokenizer,

FILE: src/nominatim_db/data/place_info.py
  class PlaceInfo (line 14) | class PlaceInfo:
    method __init__ (line 19) | def __init__(self, info: Mapping[str, Any]) -> None:
    method name (line 23) | def name(self) -> Optional[Mapping[str, str]]:
    method address (line 32) | def address(self) -> Optional[Mapping[str, str]]:
    method country_code (line 46) | def country_code(self) -> Optional[str]:
    method rank_address (line 54) | def rank_address(self) -> int:
    method centroid (line 62) | def centroid(self) -> Optional[Tuple[float, float]]:
    method is_a (line 69) | def is_a(self, key: str, value: str) -> bool:
    method is_country (line 75) | def is_country(self) -> bool:

FILE: src/nominatim_db/data/place_name.py
  class PlaceName (line 13) | class PlaceName:
    method __init__ (line 30) | def __init__(self, name: str, kind: str, suffix: Optional[str]):
    method __repr__ (line 36) | def __repr__(self) -> str:
    method clone (line 39) | def clone(self, name: Optional[str] = None,
    method set_attr (line 59) | def set_attr(self, key: str, value: str) -> None:
    method get_attr (line 65) | def get_attr(self, key: str, default: Optional[str] = None) -> Optiona...
    method has_attr (line 71) | def has_attr(self, key: str) -> bool:

FILE: src/nominatim_db/data/postcode_format.py
  class CountryPostcodeMatcher (line 18) | class CountryPostcodeMatcher:
    method __init__ (line 22) | def __init__(self, country_code: str, config: Mapping[str, Any]) -> None:
    method match (line 37) | def match(self, postcode: str) -> Optional[Match[str]]:
    method normalize (line 53) | def normalize(self, match: Match[str]) -> str:
  class PostcodeFormatter (line 61) | class PostcodeFormatter:
    method __init__ (line 65) | def __init__(self) -> None:
    method set_default_pattern (line 82) | def set_default_pattern(self, pattern: str) -> None:
    method get_matcher (line 88) | def get_matcher(self, country_code: Optional[str]) -> Optional[Country...
    method match (line 101) | def match(self, country_code: Optional[str], postcode: str) -> Optiona...
    method normalize (line 113) | def normalize(self, country_code: str, match: Match[str]) -> str:
    method get_postcode_extent (line 120) | def get_postcode_extent(self, country_code: Optional[str]) -> int:

FILE: src/nominatim_db/db/connection.py
  function execute_scalar (line 27) | def execute_scalar(conn: Connection, sql: psycopg.abc.Query, args: Any =...
  function table_exists (line 43) | def table_exists(conn: Connection, table: str) -> bool:
  function table_has_column (line 53) | def table_has_column(conn: Connection, table: str, column: str) -> bool:
  function index_exists (line 63) | def index_exists(conn: Connection, index: str, table: Optional[str] = No...
  function drop_tables (line 83) | def drop_tables(conn: Connection, *names: str,
  function server_version_tuple (line 100) | def server_version_tuple(conn: Connection) -> Tuple[int, int]:
  function postgis_version_tuple (line 111) | def postgis_version_tuple(conn: Connection) -> Tuple[int, int]:
  function register_hstore (line 125) | def register_hstore(conn: Connection) -> None:
  function connect (line 134) | def connect(dsn: str, **kwargs: Any) -> Connection:
  function get_pg_env (line 178) | def get_pg_env(dsn: str,
  function run_async_query (line 196) | async def run_async_query(dsn: str, query: psycopg.abc.Query) -> None:

FILE: src/nominatim_db/db/properties.py
  function set_property (line 15) | def set_property(conn: Connection, name: str, value: str) -> None:
  function get_property (line 31) | def get_property(conn: Connection, name: str) -> Optional[str]:

FILE: src/nominatim_db/db/query_pool.py
  class QueryPool (line 22) | class QueryPool:
    method __init__ (line 29) | def __init__(self, dsn: str, pool_size: int = 1, **conn_args: Any) -> ...
    method put_query (line 37) | async def put_query(self, query: psycopg.abc.Query, params: Any) -> None:
    method finish (line 54) | async def finish(self) -> None:
    method clear_queue (line 69) | def clear_queue(self) -> None:
    method _worker_loop_cancellable (line 78) | async def _worker_loop_cancellable(self, dsn: str, **conn_args: Any) -...
    method _worker_loop (line 88) | async def _worker_loop(self, dsn: str, **conn_args: Any) -> None:
    method __aenter__ (line 108) | async def __aenter__(self) -> 'QueryPool':
    method __aexit__ (line 111) | async def __aexit__(self, exc_type: Any, exc_value: Any, traceback: An...

FILE: src/nominatim_db/db/sql_preprocessor.py
  function _get_partitions (line 20) | def _get_partitions(conn: Connection) -> Set[int]:
  function _get_tables (line 32) | def _get_tables(conn: Connection) -> Set[str]:
  function _get_middle_db_format (line 43) | def _get_middle_db_format(conn: Connection, tables: Set[str]) -> str:
  function _setup_tablespace_sql (line 56) | def _setup_tablespace_sql(config: Configuration) -> Dict[str, str]:
  function _setup_postgresql_features (line 71) | def _setup_postgresql_features(conn: Connection) -> Dict[str, Any]:
  class SQLPreprocessor (line 78) | class SQLPreprocessor:
    method __init__ (line 89) | def __init__(self, conn: Connection, config: Configuration) -> None:
    method run_string (line 104) | def run_string(self, conn: Connection, template: str, **kwargs: Any) -...
    method run_sql_file (line 115) | def run_sql_file(self, conn: Connection, name: str, **kwargs: Any) -> ...
    method run_parallel_sql_file (line 125) | async def run_parallel_sql_file(self, dsn: str, name: str, num_threads...

FILE: src/nominatim_db/db/status.py
  function compute_database_date (line 23) | def compute_database_date(conn: Connection, offline: bool = False) -> dt...
  function set_status (line 67) | def set_status(conn: Connection, date: Optional[dt.datetime],
  function get_status (line 87) | def get_status(conn: Connection) -> Tuple[Optional[dt.datetime], Optiona...
  function set_indexed (line 101) | def set_indexed(conn: Connection, state: bool) -> None:
  function log_status (line 109) | def log_status(conn: Connection, start: dt.datetime,

FILE: src/nominatim_db/db/utils.py
  function _pipe_to_proc (line 22) | def _pipe_to_proc(proc: 'subprocess.Popen[bytes]',
  function execute_file (line 36) | def execute_file(dsn: str, fname: Path,

FILE: src/nominatim_db/errors.py
  class UsageError (line 12) | class UsageError(Exception):

FILE: src/nominatim_db/indexer/indexer.py
  class Indexer (line 25) | class Indexer:
    method __init__ (line 29) | def __init__(self, dsn: str, tokenizer: AbstractTokenizer, num_threads...
    method has_pending (line 34) | def has_pending(self, minrank: int = 0, maxrank: int = 30) -> bool:
    method index_full (line 49) | async def index_full(self, analyse: bool = True) -> None:
    method index_boundaries (line 85) | async def index_boundaries(self, minrank: int = 0, maxrank: int = 30) ...
    method index_by_rank (line 119) | async def index_by_rank(self, minrank: int, maxrank: int) -> int:
    method index_postcodes (line 167) | async def index_postcodes(self) -> int:
    method update_status_table (line 174) | def update_status_table(self) -> None:
    method _index (line 183) | async def _index(self, runner: runners.Runner, batch: int = 1,
    method _prepare_indexing (line 233) | def _prepare_indexing(self, runner: runners.Runner) -> int:

FILE: src/nominatim_db/indexer/progress.py
  class ProgressLogger (line 18) | class ProgressLogger:
    method __init__ (line 26) | def __init__(self, name: str, total: int, log_interval: int = 1) -> None:
    method add (line 34) | def add(self, num: int = 1) -> None:
    method done (line 59) | def done(self) -> int:

FILE: src/nominatim_db/indexer/runners.py
  function _mk_valuelist (line 23) | def _mk_valuelist(template: str, num: int) -> pysql.Composed:
  function _analyze_place (line 27) | def _analyze_place(place: DictRow, analyzer: AbstractAnalyzer) -> Json:
  class Runner (line 31) | class Runner(Protocol):
    method name (line 32) | def name(self) -> str: ...
    method sql_count_objects (line 33) | def sql_count_objects(self) -> Query: ...
    method sql_get_objects (line 34) | def sql_get_objects(self) -> Query: ...
    method index_places_query (line 35) | def index_places_query(self, batch_size: int) -> Query: ...
    method index_places_params (line 36) | def index_places_params(self, place: DictRow) -> Sequence[Any]: ...
  class AbstractPlacexRunner (line 45) | class AbstractPlacexRunner:
    method __init__ (line 49) | def __init__(self, rank: int, analyzer: AbstractAnalyzer) -> None:
    method index_places_query (line 53) | def index_places_query(self, batch_size: int) -> Query:
    method index_places_params (line 62) | def index_places_params(self, place: DictRow) -> Sequence[Any]:
  class RankRunner (line 70) | class RankRunner(AbstractPlacexRunner):
    method name (line 74) | def name(self) -> str:
    method sql_count_objects (line 77) | def sql_count_objects(self) -> pysql.Composed:
    method sql_get_objects (line 82) | def sql_get_objects(self) -> pysql.Composed:
  class BoundaryRunner (line 89) | class BoundaryRunner(AbstractPlacexRunner):
    method name (line 94) | def name(self) -> str:
    method sql_count_objects (line 97) | def sql_count_objects(self) -> Query:
    method sql_get_objects (line 104) | def sql_get_objects(self) -> Query:
  class InterpolationRunner (line 112) | class InterpolationRunner:
    method __init__ (line 117) | def __init__(self, analyzer: AbstractAnalyzer) -> None:
    method name (line 120) | def name(self) -> str:
    method sql_count_objects (line 123) | def sql_count_objects(self) -> Query:
    method sql_get_objects (line 127) | def sql_get_objects(self) -> Query:
    method index_places_query (line 133) | def index_places_query(self, batch_size: int) -> Query:
    method index_places_params (line 140) | def index_places_params(self, place: DictRow) -> Sequence[Any]:
  class PostcodeRunner (line 145) | class PostcodeRunner(Runner):
    method name (line 149) | def name(self) -> str:
    method sql_count_objects (line 152) | def sql_count_objects(self) -> Query:
    method sql_get_objects (line 155) | def sql_get_objects(self) -> Query:
    method index_places_query (line 160) | def index_places_query(self, batch_size: int) -> Query:
    method index_places_params (line 165) | def index_places_params(self, place: DictRow) -> Sequence[Any]:

FILE: src/nominatim_db/tokenizer/base.py
  class AbstractAnalyzer (line 20) | class AbstractAnalyzer(ABC):
    method __enter__ (line 28) | def __enter__(self) -> 'AbstractAnalyzer':
    method __exit__ (line 31) | def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> N...
    method close (line 35) | def close(self) -> None:
    method get_word_token_info (line 40) | def get_word_token_info(self, words: List[str]) -> List[Tuple[str, str...
    method normalize_postcode (line 58) | def normalize_postcode(self, postcode: str) -> str:
    method update_postcodes_from_db (line 72) | def update_postcodes_from_db(self) -> None:
    method update_special_phrases (line 78) | def update_special_phrases(self,
    method add_country_names (line 93) | def add_country_names(self, country_code: str, names: Dict[str, str]) ...
    method process_place (line 103) | def process_place(self, place: PlaceInfo) -> Any:
  class AbstractTokenizer (line 117) | class AbstractTokenizer(ABC):
    method init_new_db (line 124) | def init_new_db(self, config: Configuration, init_db: bool = True) -> ...
    method init_from_project (line 141) | def init_from_project(self, config: Configuration) -> None:
    method finalize_import (line 152) | def finalize_import(self, config: Configuration) -> None:
    method update_sql_functions (line 163) | def update_sql_functions(self, config: Configuration) -> None:
    method check_database (line 176) | def check_database(self, config: Configuration) -> Optional[str]:
    method update_statistics (line 190) | def update_statistics(self, config: Configuration, threads: int = 1) -...
    method update_word_tokens (line 198) | def update_word_tokens(self) -> None:
    method name_analyzer (line 204) | def name_analyzer(self) -> AbstractAnalyzer:
    method most_frequent_words (line 219) | def most_frequent_words(self, conn: Connection, num: int) -> List[str]:
  class TokenizerModule (line 229) | class TokenizerModule(Protocol):
    method create (line 234) | def create(self, dsn: str) -> AbstractTokenizer:

FILE: src/nominatim_db/tokenizer/factory.py
  function _import_tokenizer (line 33) | def _import_tokenizer(name: str) -> TokenizerModule:
  function create_tokenizer (line 45) | def create_tokenizer(config: Configuration, init_db: bool = True,
  function get_tokenizer_for_db (line 67) | def get_tokenizer_for_db(config: Configuration) -> AbstractTokenizer:

FILE: src/nominatim_db/tokenizer/icu_rule_loader.py
  function _get_section (line 33) | def _get_section(rules: Mapping[str, Any], section: str) -> Any:
  class ICURuleLoader (line 44) | class ICURuleLoader:
    method __init__ (line 48) | def __init__(self, config: Configuration) -> None:
    method load_config_from_db (line 64) | def load_config_from_db(self, conn: Connection) -> None:
    method save_config_to_db (line 83) | def save_config_to_db(self, conn: Connection) -> None:
    method make_sanitizer (line 91) | def make_sanitizer(self) -> PlaceSanitizer:
    method make_token_analysis (line 96) | def make_token_analysis(self) -> ICUTokenAnalysis:
    method get_search_rules (line 102) | def get_search_rules(self) -> str:
    method get_normalization_rules (line 114) | def get_normalization_rules(self) -> str:
    method get_transliteration_rules (line 119) | def get_transliteration_rules(self) -> str:
    method _setup_analysis (line 124) | def _setup_analysis(self) -> None:
    method _cfg_to_icu_rules (line 150) | def _cfg_to_icu_rules(rules: Mapping[str, Any], section: str) -> str:
  class TokenAnalyzerRule (line 165) | class TokenAnalyzerRule:
    method __init__ (line 170) | def __init__(self, rules: Mapping[str, Any],
    method create (line 183) | def create(self, normalizer: Any, transliterator: Any) -> Analyzer:

FILE: src/nominatim_db/tokenizer/icu_token_analysis.py
  class ICUTokenAnalysis (line 21) | class ICUTokenAnalysis:
    method __init__ (line 26) | def __init__(self, norm_rules: str, trans_rules: str,
    method get_analyzer (line 41) | def get_analyzer(self, name: Optional[str]) -> Analyzer:

FILE: src/nominatim_db/tokenizer/icu_tokenizer.py
  function create (line 40) | def create(dsn: str) -> 'ICUTokenizer':
  class ICUTokenizer (line 46) | class ICUTokenizer(AbstractTokenizer):
    method __init__ (line 52) | def __init__(self, dsn: str) -> None:
    method init_new_db (line 56) | def init_new_db(self, config: Configuration, init_db: bool = True) -> ...
    method init_from_project (line 71) | def init_from_project(self, config: Configuration) -> None:
    method finalize_import (line 79) | def finalize_import(self, config: Configuration) -> None:
    method update_sql_functions (line 85) | def update_sql_functions(self, config: Configuration) -> None:
    method check_database (line 92) | def check_database(self, config: Configuration) -> None:
    method update_statistics (line 98) | def update_statistics(self, config: Configuration, threads: int = 2) -...
    method _cleanup_housenumbers (line 155) | def _cleanup_housenumbers(self) -> None:
    method update_word_tokens (line 188) | def update_word_tokens(self) -> None:
    method name_analyzer (line 195) | def name_analyzer(self) -> 'ICUNameAnalyzer':
    method most_frequent_words (line 214) | def most_frequent_words(self, conn: Connection, num: int) -> List[str]:
    method _save_config (line 225) | def _save_config(self) -> None:
    method _setup_db_tables (line 233) | def _setup_db_tables(self, config: Configuration) -> None:
    method _create_base_indices (line 256) | def _create_base_indices(self, config: Configuration, table_name: str)...
    method _create_lookup_indices (line 276) | def _create_lookup_indices(self, config: Configuration, table_name: st...
    method _move_temporary_word_table (line 291) | def _move_temporary_word_table(self, old: str) -> None:
  class ICUNameAnalyzer (line 306) | class ICUNameAnalyzer(AbstractAnalyzer):
    method __init__ (line 313) | def __init__(self, dsn: str, sanitizer: PlaceSanitizer,
    method close (line 322) | def close(self) -> None:
    method _search_normalized (line 329) | def _search_normalized(self, name: str) -> str:
    method _normalized (line 334) | def _normalized(self, name: str) -> str:
    method get_word_token_info (line 340) | def get_word_token_info(self, words: Sequence[str]) -> List[Tuple[str,...
    method normalize_postcode (line 373) | def normalize_postcode(self, postcode: str) -> str:
    method update_postcodes_from_db (line 381) | def update_postcodes_from_db(self) -> None:
    method update_special_phrases (line 392) | def update_special_phrases(self, phrases: Iterable[Tuple[str, str, str...
    method _add_special_phrases (line 421) | def _add_special_phrases(self, cursor: Cursor,
    method _remove_special_phrases (line 440) | def _remove_special_phrases(self, cursor: Cursor,
    method add_country_names (line 458) | def add_country_names(self, country_code: str, names: Mapping[str, str...
    method _add_country_full_names (line 469) | def _add_country_full_names(self, country_code: str, names: Sequence[P...
    method process_place (line 525) | def process_place(self, place: PlaceInfo) -> Mapping[str, Any]:
    method _process_place_address (line 547) | def _process_place_address(self, token_info: '_TokenInfo',
    method _compute_housenumber_token (line 564) | def _compute_housenumber_token(self, hnr: PlaceName) -> Tuple[Optional...
    method _retrieve_full_tokens (line 603) | def _retrieve_full_tokens(self, name: str) -> List[int]:
    method _compute_name_tokens (line 623) | def _compute_name_tokens(self, names: Sequence[PlaceName]) -> Tuple[Se...
    method _add_postcode (line 664) | def _add_postcode(self, item: PlaceName) -> Optional[str]:
  class _TokenInfo (line 676) | class _TokenInfo:
    method __init__ (line 679) | def __init__(self) -> None:
    method _mk_array (line 688) | def _mk_array(self, tokens: Iterable[Any]) -> str:
    method to_dict (line 691) | def to_dict(self) -> Dict[str, Any]:
    method set_names (line 717) | def set_names(self, fulls: Iterable[int], partials: Iterable[int]) -> ...
    method add_housenumber (line 722) | def add_housenumber(self, token: Optional[int], hnr: Optional[str]) ->...
    method add_street (line 731) | def add_street(self, tokens: Iterable[int]) -> None:
    method add_place (line 738) | def add_place(self, tokens: Iterable[int]) -> None:
    method add_address_term (line 743) | def add_address_term(self, key: str, partials: Iterable[int]) -> None:
    method set_postcode (line 750) | def set_postcode(self, postcode: Optional[str]) -> None:
  class _TokenCache (line 756) | class _TokenCache:
    method __init__ (line 762) | def __init__(self) -> None:

FILE: src/nominatim_db/tokenizer/place_sanitizer.py
  class PlaceSanitizer (line 21) | class PlaceSanitizer:
    method __init__ (line 26) | def __init__(self, rules: Optional[Sequence[Mapping[str, Any]]],
    method process_names (line 42) | def process_names(self, place: PlaceInfo) -> Tuple[List[PlaceName], Li...

FILE: src/nominatim_db/tokenizer/sanitizers/base.py
  class ProcessInfo (line 18) | class ProcessInfo:
    method __init__ (line 25) | def __init__(self, place: PlaceInfo):
    method _convert_name_dict (line 31) | def _convert_name_dict(names: Optional[Mapping[str, str]]) -> List[Pla...
  class SanitizerHandler (line 48) | class SanitizerHandler(Protocol):
    method create (line 52) | def create(self, config: SanitizerConfig) -> Callable[[ProcessInfo], N...

FILE: src/nominatim_db/tokenizer/sanitizers/clean_housenumbers.py
  class _HousenumberSanitizer (line 41) | class _HousenumberSanitizer:
    method __init__ (line 43) | def __init__(self, config: SanitizerConfig) -> None:
    method __call__ (line 50) | def __call__(self, obj: ProcessInfo) -> None:
    method sanitize (line 86) | def sanitize(self, value: str) -> Iterator[str]:
    method _regularize (line 96) | def _regularize(self, hnr: str) -> Iterator[str]:
    method _expand_range (line 99) | def _expand_range(self, itype: Union[str, int], hnr: str) -> Iterable[...
  function create (line 116) | def create(config: SanitizerConfig) -> Callable[[ProcessInfo], None]:

FILE: src/nominatim_db/tokenizer/sanitizers/clean_postcodes.py
  class _PostcodeSanitizer (line 30) | class _PostcodeSanitizer:
    method __init__ (line 32) | def __init__(self, config: SanitizerConfig) -> None:
    method __call__ (line 40) | def __call__(self, obj: ProcessInfo) -> None:
    method scan (line 58) | def scan(self, postcode: str, country: Optional[str]) -> Optional[Tupl...
  function create (line 73) | def create(config: SanitizerConfig) -> Callable[[ProcessInfo], None]:

FILE: src/nominatim_db/tokenizer/sanitizers/clean_tiger_tags.py
  function _clean_tiger_county (line 23) | def _clean_tiger_county(obj: ProcessInfo) -> None:
  function create (line 44) | def create(_: SanitizerConfig) -> Callable[[ProcessInfo], None]:

FILE: src/nominatim_db/tokenizer/sanitizers/config.py
  class SanitizerConfig (line 24) | class SanitizerConfig(_BaseUserDict):
    method get_string_list (line 32) | def get_string_list(self, param: str, default: Sequence[str] = tuple()...
    method get_bool (line 65) | def get_bool(self, param: str, default: Optional[bool] = None) -> bool:
    method get_delimiter (line 85) | def get_delimiter(self, default: str = ',;') -> Pattern[str]:
    method get_filter (line 107) | def get_filter(self, param: str, default: Union[str, Sequence[str]] = ...

FILE: src/nominatim_db/tokenizer/sanitizers/delete_tags.py
  class _TagSanitizer (line 64) | class _TagSanitizer:
    method __init__ (line 66) | def __init__(self, config: SanitizerConfig) -> None:
    method __call__ (line 78) | def __call__(self, obj: ProcessInfo) -> None:
    method _set_allowed_ranks (line 101) | def _set_allowed_ranks(self, ranks: Sequence[str]) -> Tuple[bool, ...]:
  function create (line 121) | def create(config: SanitizerConfig) -> Callable[[ProcessInfo], None]:

FILE: src/nominatim_db/tokenizer/sanitizers/split_name_list.py
  function create (line 20) | def create(config: SanitizerConfig) -> Callable[[ProcessInfo], None]:

FILE: src/nominatim_db/tokenizer/sanitizers/strip_brace_terms.py
  function create (line 18) | def create(_: SanitizerConfig) -> Callable[[ProcessInfo], None]:

FILE: src/nominatim_db/tokenizer/sanitizers/tag_analyzer_by_language.py
  class _AnalyzerByLanguage (line 40) | class _AnalyzerByLanguage:
    method __init__ (line 44) | def __init__(self, config: SanitizerConfig) -> None:
    method _compute_default_languages (line 51) | def _compute_default_languages(self, use_defaults: str) -> None:
    method _suffix_matches (line 62) | def _suffix_matches(self, suffix: str) -> bool:
    method __call__ (line 68) | def __call__(self, obj: ProcessInfo) -> None:
  function create (line 92) | def create(config: SanitizerConfig) -> Callable[[ProcessInfo], None]:

FILE: src/nominatim_db/tokenizer/sanitizers/tag_japanese.py
  function create (line 22) | def create(_: SanitizerConfig) -> Callable[[ProcessInfo], None]:
  function reconbine_housenumber (line 28) | def reconbine_housenumber(
  function reconbine_place (line 62) | def reconbine_place(
  function tag_japanese (line 96) | def tag_japanese(obj: ProcessInfo) -> None:

FILE: src/nominatim_db/tokenizer/token_analysis/base.py
  class Analyzer (line 16) | class Analyzer(Protocol):
    method get_canonical_id (line 21) | def get_canonical_id(self, name: PlaceName) -> str:
    method compute_variants (line 36) | def compute_variants(self, canonical_id: str) -> Union[List[str], Tupl...
  class AnalysisModule (line 56) | class AnalysisModule(Protocol):
    method configure (line 62) | def configure(self, rules: Mapping[str, Any],
    method create (line 82) | def create(self, normalizer: Any, transliterator: Any, config: Any) ->...

FILE: src/nominatim_db/tokenizer/token_analysis/config_variants.py
  class ICUVariant (line 19) | class ICUVariant(NamedTuple):
  function get_variant_config (line 26) | def get_variant_config(in_rules: Any,
  class _VariantMaker (line 59) | class _VariantMaker:
    method __init__ (line 65) | def __init__(self, normalizer: Any) -> None:
    method compute (line 68) | def compute(self, rule: Any) -> Iterator[ICUVariant]:
    method _parse_variant_word (line 91) | def _parse_variant_word(self, name: str) -> Optional[Tuple[str, str, s...
  function _create_variants (line 108) | def _create_variants(src: str, preflag: str, postflag: str,

FILE: src/nominatim_db/tokenizer/token_analysis/generic.py
  function configure (line 22) | def configure(rules: Mapping[str, Any], normalizer: Any, _: Any) -> Dict...
  function create (line 51) | def create(normalizer: Any, transliterator: Any,
  class GenericTokenAnalysis (line 58) | class GenericTokenAnalysis:
    method __init__ (line 63) | def __init__(self, norm: Any, to_ascii: Any, config: Mapping[str, Any]...
    method get_canonical_id (line 75) | def get_canonical_id(self, name: PlaceName) -> str:
    method compute_variants (line 81) | def compute_variants(self, norm_name: str) -> Tuple[List[str], List[st...
    method _generate_word_variants (line 105) | def _generate_word_variants(self, norm_name: str) -> Iterable[str]:

FILE: src/nominatim_db/tokenizer/token_analysis/generic_mutation.py
  function _zigzag (line 20) | def _zigzag(outer: Iterable[str], inner: Iterable[str]) -> Iterator[str]:
  class MutationVariantGenerator (line 24) | class MutationVariantGenerator:
    method __init__ (line 31) | def __init__(self, pattern: str, replacements: Sequence[str]):
    method generate (line 40) | def generate(self, names: Iterable[str]) -> Iterator[str]:
    method _fillers (line 52) | def _fillers(self, num_parts: int) -> Iterator[Tuple[str, ...]]:

FILE: src/nominatim_db/tokenizer/token_analysis/housenumbers.py
  function configure (line 25) | def configure(*_: Any) -> None:
  function create (line 33) | def create(normalizer: Any, transliterator: Any, config: None) -> 'House...
  class HousenumberTokenAnalysis (line 39) | class HousenumberTokenAnalysis:
    method __init__ (line 42) | def __init__(self, norm: Any, trans: Any) -> None:
    method get_canonical_id (line 48) | def get_canonical_id(self, name: PlaceName) -> str:
    method compute_variants (line 67) | def compute_variants(self, norm_name: str) -> List[str]:

FILE: src/nominatim_db/tokenizer/token_analysis/postcodes.py
  function configure (line 19) | def configure(*_: Any) -> None:
  function create (line 27) | def create(normalizer: Any, transliterator: Any, config: None) -> 'Postc...
  class PostcodeTokenAnalysis (line 33) | class PostcodeTokenAnalysis:
    method __init__ (line 43) | def __init__(self, norm: Any, trans: Any) -> None:
    method get_canonical_id (line 49) | def get_canonical_id(self, name: PlaceName) -> str:
    method compute_variants (line 54) | def compute_variants(self, norm_name: str) -> List[str]:

FILE: src/nominatim_db/tokenizer/token_analysis/simple_trie.py
  class SimpleTrie (line 16) | class SimpleTrie(Generic[T]):
    method __init__ (line 22) | def __init__(self, data: Optional[List[Tuple[str, T]]] = None) -> None:
    method _add (line 33) | def _add(self, word: str, pos: int, value: T) -> None:
    method _make_compact (line 43) | def _make_compact(self) -> None:
    method longest_prefix (line 59) | def longest_prefix(self, word: str, start: int = 0) -> Tuple[Optional[...

FILE: src/nominatim_db/tools/add_osm_data.py
  function _run_osm2pgsql (line 22) | def _run_osm2pgsql(dsn: str, options: MutableMapping[str, Any]) -> None:
  function add_data_from_file (line 32) | def add_data_from_file(dsn: str, fname: str, options: MutableMapping[str...
  function add_osm_object (line 44) | def add_osm_object(dsn: str, osm_type: str, osm_id: int, use_main_api: b...

FILE: src/nominatim_db/tools/admin.py
  function _get_place_info (line 27) | def _get_place_info(cursor: Cursor, osm_id: Optional[str],
  function analyse_indexing (line 58) | def analyse_indexing(config: Configuration, osm_id: Optional[str] = None,
  function clean_deleted_relations (line 95) | def clean_deleted_relations(config: Configuration, age: str) -> None:
  function grant_ro_access (line 111) | def grant_ro_access(dsn: str, config: Configuration) -> None:

FILE: src/nominatim_db/tools/check_database.py
  class CheckState (line 26) | class CheckState(Enum):
  function _check (line 40) | def _check(hint: Optional[str] = None) -> Callable[[CheckFunc], CheckFunc]:
  class _BadConnection (line 75) | class _BadConnection:
    method __init__ (line 77) | def __init__(self, msg: str) -> None:
    method close (line 80) | def close(self) -> None:
  function check_database (line 85) | def check_database(config: Configuration) -> int:
  function _get_indexes (line 106) | def _get_indexes(conn: Connection) -> List[str]:
  function check_connection (line 153) | def check_connection(conn: Any, config: Configuration) -> CheckResult:
  function check_database_version (line 171) | def check_database_version(conn: Connection, config: Configuration) -> C...
  function check_placex_table (line 211) | def check_placex_table(conn: Connection, config: Configuration) -> Check...
  function check_placex_size (line 221) | def check_placex_size(conn: Connection, _: Configuration) -> CheckResult:
  function check_tokenizer (line 230) | def check_tokenizer(_: Connection, config: Configuration) -> CheckResult:
  function check_existance_wikipedia (line 252) | def check_existance_wikipedia(conn: Connection, _: Configuration) -> Che...
  function check_indexing (line 271) | def check_indexing(conn: Connection, _: Configuration) -> CheckResult:
  function check_database_indexes (line 301) | def check_database_indexes(conn: Connection, _: Configuration) -> CheckR...
  function check_database_index_valid (line 323) | def check_database_index_valid(conn: Connection, _: Configuration) -> Ch...
  function check_tiger_table (line 343) | def check_tiger_table(conn: Connection, config: Configuration) -> CheckR...

FILE: src/nominatim_db/tools/collect_os_info.py
  function friendly_memory_string (line 24) | def friendly_memory_string(mem: float) -> str:
  function run_command (line 36) | def run_command(cmd: Union[str, List[str]]) -> str:
  function os_name_info (line 49) | def os_name_info() -> str:
  function from_file_find_line_portion (line 71) | def from_file_find_line_portion(
  function get_postgresql_config (line 84) | def get_postgresql_config(version: int) -> str:
  function report_system_information (line 95) | def report_system_information(config: Configuration) -> None:

FILE: src/nominatim_db/tools/convert_sqlite.py
  function convert (line 25) | async def convert(project_dir: Optional[Union[str, Path]],
  class SqliteWriter (line 47) | class SqliteWriter:
    method __init__ (line 51) | def __init__(self, src: napi.SearchConnection,
    method write (line 57) | async def write(self) -> None:
    method create_tables (line 70) | async def create_tables(self) -> None:
    method create_class_tables (line 89) | async def create_class_tables(self) -> None:
    method create_word_table (line 100) | async def create_word_table(self) -> None:
    method copy_data (line 122) | async def copy_data(self) -> None:
    method create_indexes (line 150) | async def create_indexes(self) -> None:
    method create_spatial_index (line 195) | async def create_spatial_index(self, table: str, column: str) -> None:
    method create_index (line 201) | async def create_index(self, table_name: str, column: str) -> None:
    method create_search_index (line 208) | async def create_search_index(self) -> None:
    method select_from (line 237) | def select_from(self, table: str) -> SaSelect:

FILE: src/nominatim_db/tools/database_import.py
  function _require_version (line 33) | def _require_version(module: str, actual: Tuple[int, int], expected: Tup...
  function _require_loaded (line 44) | def _require_loaded(extension_name: str, conn: Connection) -> None:
  function check_existing_database_plugins (line 53) | def check_existing_database_plugins(dsn: str) -> None:
  function setup_database_skeleton (line 65) | def setup_database_skeleton(dsn: str, rouser: Optional[str] = None) -> N...
  function import_osm_data (line 110) | def import_osm_data(osm_files: Union[Path, Sequence[Path]],
  function create_tables (line 150) | def create_tables(conn: Connection, config: Configuration, reverse_only:...
  function create_table_triggers (line 162) | def create_table_triggers(conn: Connection, config: Configuration) -> None:
  function create_partition_tables (line 170) | def create_partition_tables(conn: Connection, config: Configuration) -> ...
  function truncate_data_tables (line 177) | def truncate_data_tables(conn: Connection) -> None:
  function load_data (line 208) | async def load_data(dsn: str, threads: int) -> None:
  function _progress_print (line 239) | async def _progress_print() -> None:
  function create_search_indices (line 249) | async def create_search_indices(conn: Connection, config: Configuration,

FILE: src/nominatim_db/tools/exec_utils.py
  function run_osm2pgsql (line 24) | def run_osm2pgsql(options: Mapping[str, Any]) -> None:
  function _mk_tablespace_options (line 73) | def _mk_tablespace_options(ttype: str, options: Mapping[str, Any]) -> Li...
  function _find_osm2pgsql_cmd (line 83) | def _find_osm2pgsql_cmd(cmdline: Optional[str]) -> str:
  function _check_osm2pgsql_version (line 94) | def _check_osm2pgsql_version(cmdline: Optional[str]) -> None:

FILE: src/nominatim_db/tools/freeze.py
  function drop_update_tables (line 34) | def drop_update_tables(conn: Connection) -> None:
  function drop_flatnode_file (line 49) | def drop_flatnode_file(fpath: Optional[Path]) -> None:
  function is_frozen (line 56) | def is_frozen(conn: Connection) -> bool:

FILE: src/nominatim_db/tools/migration.py
  function migrate (line 30) | def migrate(config: Configuration, paths: Any) -> int:
  function _migration (line 79) | def _migration(major: int, minor: int, patch: int = 0,
  function create_postcode_area_lookup_index (line 102) | def create_postcode_area_lookup_index(conn: Connection, **_: Any) -> None:
  function create_postcode_parent_index (line 113) | def create_postcode_parent_index(conn: Connection, **_: Any) -> None:
  function create_placex_entrance_table (line 124) | def create_placex_entrance_table(conn: Connection, config: Configuration...
  function create_place_entrance_table (line 145) | def create_place_entrance_table(conn: Connection, config: Configuration,...
  function convert_country_tokens (line 164) | def convert_country_tokens(conn: Connection, config: Configuration, **_:...
  function create_place_postcode_table (line 186) | def create_place_postcode_table(conn: Connection, config: Configuration,...
  function create_place_interpolation_table (line 356) | def create_place_interpolation_table(conn: Connection, config: Configura...
  function backfill_importance (line 426) | def backfill_importance(conn: Connection, **_: Any) -> None:
  function create_place_associated_street_table (line 443) | def create_place_associated_street_table(conn: Connection, **_: Any) -> ...
  function create_associated_street_triggers (line 502) | def create_associated_street_triggers(conn: Connection, config: Configur...

FILE: src/nominatim_db/tools/postcodes.py
  function _to_float (line 29) | def _to_float(numstr: str, max_value: float) -> float:
  function _extent_to_rank (line 41) | def _extent_to_rank(extent: int) -> int:
  class _PostcodeCollector (line 51) | class _PostcodeCollector:
    method __init__ (line 55) | def __init__(self, country: str, matcher: Optional[CountryPostcodeMatc...
    method add (line 64) | def add(self, postcode: str, x: float, y: float) -> None:
    method commit (line 80) | def commit(self, conn: Connection, analyzer: AbstractAnalyzer,
    method _update_from_external (line 135) | def _update_from_external(self, analyzer: AbstractAnalyzer, project_di...
    method _open_external (line 164) | def _open_external(self, project_dir: Path) -> Optional[TextIO]:
  function update_postcodes (line 180) | def update_postcodes(dsn: str, project_dir: Optional[Path],
  function _is_postcode_table_empty (line 213) | def _is_postcode_table_empty(conn: Connection) -> bool:
  function _insert_postcode_areas (line 221) | def _insert_postcode_areas(conn: Connection, country_code: str,
  function _update_postcode_areas (line 250) | def _update_postcode_areas(conn: Connection, analyzer: AbstractAnalyzer,
  function _update_guessed_postcode (line 294) | def _update_guessed_postcode(conn: Connection, analyzer: AbstractAnalyzer,
  function can_compute (line 371) | def can_compute(dsn: str) -> bool:

FILE: src/nominatim_db/tools/refresh.py
  function _add_address_level_rows_from_entry (line 28) | def _add_address_level_rows_from_entry(rows: MutableSequence[Tuple[Any, ...
  function load_address_levels (line 47) | def load_address_levels(conn: Connection, table: str, levels: Sequence[M...
  function load_address_levels_from_config (line 78) | def load_address_levels_from_config(conn: Connection, config: Configurat...
  function create_functions (line 88) | def create_functions(conn: Connection, config: Configuration,
  function import_wikipedia_articles (line 100) | def import_wikipedia_articles(dsn: str, data_path: Path, ignore_errors: ...
  function import_importance_csv (line 116) | def import_importance_csv(dsn: str, data_file: Path) -> int:
  function import_importance_sql (line 166) | def import_importance_sql(dsn: str, data_file: Path, ignore_errors: bool...
  function import_secondary_importance (line 184) | def import_secondary_importance(dsn: str, data_path: Path, ignore_errors...
  function recompute_importance (line 199) | def recompute_importance(conn: Connection) -> None:
  function invalidate_osm_object (line 227) | def invalidate_osm_object(osm_type: str, osm_id: int, conn: Connection,

FILE: src/nominatim_db/tools/replication.py
  function init_replication (line 37) | def init_replication(conn: Connection, base_url: str,
  function check_for_updates (line 61) | def check_for_updates(conn: Connection, base_url: str,
  class UpdateState (line 88) | class UpdateState(Enum):
  function update (line 97) | def update(dsn: str, options: MutableMapping[str, Any],
  function run_osm2pgsql_updates (line 149) | def run_osm2pgsql_updates(conn: Connection, options: MutableMapping[str,...
  function _make_replication_server (line 168) | def _make_replication_server(url: str, timeout: int) -> ContextManager[R...

FILE: src/nominatim_db/tools/special_phrases/importer_statistics.py
  class SpecialPhrasesImporterStatistics (line 15) | class SpecialPhrasesImporterStatistics():
    method __init__ (line 20) | def __init__(self) -> None:
    method _intialize_values (line 23) | def _intialize_values(self) -> None:
    method notify_one_phrase_invalid (line 33) | def notify_one_phrase_invalid(self) -> None:
    method notify_one_table_created (line 40) | def notify_one_table_created(self) -> None:
    method notify_one_table_deleted (line 46) | def notify_one_table_deleted(self) -> None:
    method notify_one_table_ignored (line 52) | def notify_one_table_ignored(self) -> None:
    method notify_import_done (line 58) | def notify_import_done(self) -> None:

FILE: src/nominatim_db/tools/special_phrases/sp_csv_loader.py
  class SPCsvLoader (line 20) | class SPCsvLoader:
    method __init__ (line 24) | def __init__(self, csv_path: str) -> None:
    method generate_phrases (line 27) | def generate_phrases(self) -> Iterable[SpecialPhrase]:
    method _check_csv_validity (line 38) | def _check_csv_validity(self) -> None:

FILE: src/nominatim_db/tools/special_phrases/sp_importer.py
  function _classtype_table (line 31) | def _classtype_table(phrase_class: str, phrase_type: str) -> str:
  class SpecialPhraseLoader (line 37) | class SpecialPhraseLoader(Protocol):
    method generate_phrases (line 41) | def generate_phrases(self) -> Iterable[SpecialPhrase]:
  class SPImporter (line 46) | class SPImporter():
    method __init__ (line 52) | def __init__(self, config: Configuration, conn: Connection,
    method get_classtype_pairs (line 67) | def get_classtype_pairs(self, min: int = 0) -> Set[Tuple[str, str]]:
    method import_phrases (line 91) | def import_phrases(self, tokenizer: AbstractTokenizer, should_replace:...
    method _fetch_existing_place_classtype_tables (line 124) | def _fetch_existing_place_classtype_tables(self) -> None:
    method _load_white_and_black_lists (line 140) | def _load_white_and_black_lists(self) \
    method _check_sanity (line 149) | def _check_sanity(self, phrase: SpecialPhrase) -> bool:
    method _process_phrase (line 163) | def _process_phrase(self, phrase: SpecialPhrase) -> Optional[Tuple[str...
    method _create_classtype_table_and_indexes (line 190) | def _create_classtype_table_and_indexes(self,
    method _create_place_classtype_table (line 243) | def _create_place_classtype_table(self, sql_tablespace: str,
    method _create_place_classtype_indexes (line 259) | def _create_place_classtype_indexes(self, sql_tablespace: str,
    method _grant_access_to_webuser (line 282) | def _grant_access_to_webuser(self, phrase_class: str, phrase_type: str...
    method _remove_non_existent_tables_from_db (line 292) | def _remove_non_existent_tables_from_db(self) -> None:

FILE: src/nominatim_db/tools/special_phrases/sp_wiki_loader.py
  function _get_wiki_content (line 23) | def _get_wiki_content(lang: str) -> str:
  class SPWikiLoader (line 35) | class SPWikiLoader:
    method __init__ (line 39) | def __init__(self, config: Configuration) -> None:
    method generate_phrases (line 51) | def generate_phrases(self) -> Iterable[SpecialPhrase]:

FILE: src/nominatim_db/tools/special_phrases/special_phrase.py
  class SpecialPhrase (line 16) | class SpecialPhrase:
    method __init__ (line 20) | def __init__(self, p_label: str, p_class: str, p_type: str, p_operator...
    method __eq__ (line 28) | def __eq__(self, other: Any) -> bool:
    method __hash__ (line 37) | def __hash__(self) -> int:

FILE: src/nominatim_db/tools/tiger_data.py
  class TigerInput (line 30) | class TigerInput:
    method __init__ (line 35) | def __init__(self, data_dir: str) -> None:
    method __enter__ (line 56) | def __enter__(self) -> 'TigerInput':
    method __exit__ (line 59) | def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
    method __bool__ (line 64) | def __bool__(self) -> bool:
    method get_file (line 67) | def get_file(self, fname: Union[str, tarfile.TarInfo]) -> TextIO:
    method __iter__ (line 78) | def __iter__(self) -> Iterator[Dict[str, Any]]:
  function add_tiger_data (line 86) | async def add_tiger_data(data_dir: str, config: Configuration, threads: ...

FILE: src/nominatim_db/typing.py
  class DictCursorResult (line 27) | class DictCursorResult(Mapping[str, Any]):
    method __getitem__ (line 28) | def __getitem__(self, x: Union[int, str]) -> Any: ...

FILE: src/nominatim_db/utils/centroid.py
  class PointsCentroid (line 14) | class PointsCentroid:
    method __init__ (line 22) | def __init__(self) -> None:
    method centroid (line 27) | def centroid(self) -> Tuple[float, float]:
    method __len__ (line 36) | def __len__(self) -> int:
    method __iadd__ (line 39) | def __iadd__(self, other: Any) -> 'PointsCentroid':

FILE: src/nominatim_db/utils/url_utils.py
  function get_url (line 19) | def get_url(url: str) -> str:

FILE: src/nominatim_db/version.py
  class NominatimVersion (line 13) | class NominatimVersion(NamedTuple):
    method __str__ (line 34) | def __str__(self) -> str:
    method release_version (line 40) | def release_version(self) -> str:
  function parse_version (line 48) | def parse_version(version: str) -> NominatimVersion:

FILE: test/bdd/conftest.py
  function _strlist (line 40) | def _strlist(inp):
  function _pretty_json (line 44) | def _pretty_json(inp):
  function pytest_addoption (line 48) | def pytest_addoption(parser, pluginmanager):
  function datatable (line 70) | def datatable():
  function node_grid (line 77) | def node_grid():
  function setup_country_info (line 84) | def setup_country_info():
  function template_db (line 89) | def template_db(pytestconfig):
  function def_config (line 110) | def def_config(pytestconfig):
  function db (line 118) | def db(template_db, pytestconfig):
  function db_conn (line 134) | def db_conn(db, def_config):
  function reverse_geocode_via_api (line 143) | def reverse_geocode_via_api(test_config_env, pytestconfig, datatable, la...
  function reverse_geocode_via_api_and_grid (line 164) | def reverse_geocode_via_api_and_grid(test_config_env, pytestconfig, node...
  function forward_geocode_via_api (line 174) | def forward_geocode_via_api(test_config_env, pytestconfig, datatable, qu...
  function check_number_of_results (line 199) | def check_number_of_results(nominatim_result, op, num):
  function check_metadata_for_fields (line 205) | def check_metadata_for_fields(nominatim_result, datatable):
  function check_metadata_for_field_presence (line 217) | def check_metadata_for_field_presence(nominatim_result, attributes):
  function check_result_for_fields (line 224) | def check_result_for_fields(nominatim_result, datatable, node_grid, field):
  function check_result_for_field_presence (line 240) | def check_result_for_field_presence(nominatim_result, attributes):
  function check_result_for_field_absence (line 247) | def check_result_for_field_absence(nominatim_result, attributes):
  function check_result_array_field_for_attributes (line 255) | def check_result_array_field_for_attributes(nominatim_result, datatable,...
  function check_result_list_match (line 270) | def check_result_list_match(nominatim_result, datatable, exact):
  function check_all_results_for_field_presence (line 293) | def check_all_results_for_field_presence(nominatim_result, attributes):
  function check_all_result_for_field_absence (line 303) | def check_all_result_for_field_absence(nominatim_result, attributes):
  function check_all_results_contain (line 312) | def check_all_results_contain(nominatim_result, datatable, node_grid, fi...
  function check_specific_result_for_fields (line 330) | def check_specific_result_for_fields(nominatim_result, datatable, num, f...
  function set_node_grid (line 347) | def set_node_grid(datatable, step, origin):
  function check_place_missing_lines (line 368) | def check_place_missing_lines(db_conn, table, osm_type, osm_id, osm_class):
  function pytest_pycollect_makemodule (line 381) | def pytest_pycollect_makemodule(module_path, parent):
  class BddTestCollector (line 385) | class BddTestCollector(pytest.Module):
    method __init__ (line 387) | def __init__(self, **kwargs):
    method collect (line 390) | def collect(self):
  function make_python_name (line 404) | def make_python_name(string: str) -> str:
  class FeatureFile (line 410) | class FeatureFile(pytest.File):
    class obj (line 411) | class obj:
    method __init__ (line 414) | def __init__(self, feature, **kwargs):
    method collect (line 418) | def collect(self):

FILE: test/bdd/test_api.py
  function session_api_test_db (line 40) | def session_api_test_db(pytestconfig):
  function test_config_env (line 76) | def test_config_env(pytestconfig):
  function api_http_request_headers (line 90) | def api_http_request_headers():
  function set_additional_http_headers (line 95) | def set_additional_http_headers(api_http_request_headers, datatable):
  function setup_connection_unknown_database (line 101) | def setup_connection_unknown_database(test_config_env):
  function send_api_status (line 108) | def send_api_status(test_config_env, api_http_request_headers, pytestcon...
  function check_http_result (line 115) | def check_http_result(api_response, status):
  function check_page_content_exact (line 120) | def check_page_content_exact(api_response, content):
  function check_for_html_correctness (line 125) | def check_for_html_correctness(api_response):
  function parse_api_json_response (line 142) | def parse_api_json_response(api_response, fmt, num):

FILE: test/bdd/test_db.py
  function _rewrite_placeid_field (line 34) | def _rewrite_placeid_field(field, new_field, datatable, place_ids):
  function _collect_place_ids (line 44) | def _collect_place_ids(conn):
  function row_factory (line 55) | def row_factory(db_conn):
  function test_config_env (line 83) | def test_config_env(pytestconfig):
  function update_config (line 97) | def update_config(def_config):
  function import_places (line 106) | def import_places(db_conn, named, datatable, node_grid):
  function import_place_entrances (line 117) | def import_place_entrances(row_factory, datatable, node_grid):
  function import_place_interpolations (line 133) | def import_place_interpolations(row_factory, datatable, node_grid):
  function import_place_postcode (line 150) | def import_place_postcode(db_conn, datatable, node_grid):
  function import_ways (line 185) | def import_ways(row_factory, datatable):
  function import_rels (line 200) | def import_rels(row_factory, datatable):
  function do_import (line 232) | def do_import(db_conn, def_config):
  function do_update (line 245) | def do_update(db_conn, update_config, node_grid, datatable):
  function do_update_relations (line 261) | def do_update_relations(db_conn, update_config, datatable):
  function update_place_entrances (line 292) | def update_place_entrances(db_conn, datatable, node_grid):
  function update_place_interpolations (line 310) | def update_place_interpolations(db_conn, row_factory, update_config, dat...
  function do_postcode_update (line 332) | def do_postcode_update(update_config):
  function do_delete_place (line 340) | def do_delete_place(db_conn, update_config, node_grid, otype, oid):
  function then_check_table_content (line 361) | def then_check_table_content(db_conn, place_ids, datatable, node_grid, t...
  function then_check_place_missing_lines (line 376) | def then_check_place_missing_lines(db_conn, place_ids, table, oid):
  function then_check_interpolation_table (line 388) | def then_check_interpolation_table(db_conn, node_grid, place_ids, oid, d...
  function then_check_interpolation_table_negative (line 420) | def then_check_interpolation_table_negative(db_conn, oid):

FILE: test/bdd/test_osm2pgsql.py
  function osm2pgsql_options (line 26) | def osm2pgsql_options(def_config):
  function opl_writer (line 40) | def opl_writer(tmp_path, node_grid):
  function set_lua_style_file (line 60) | def set_lua_style_file(osm2pgsql_options, docstring, tmp_path):
  function load_from_osm_file (line 69) | def load_from_osm_file(db, osm2pgsql_options, opl_writer, docstring):
  function update_from_osm_file (line 81) | def update_from_osm_file(db_conn, def_config, osm2pgsql_options, opl_wri...
  function do_index (line 98) | def do_index(def_config):
  function check_place_content (line 105) | def check_place_content(db_conn, datatable, node_grid, table, exact):

FILE: test/bdd/utils/api_result.py
  class APIResult (line 14) | class APIResult:
    method __init__ (line 16) | def __init__(self, fmt, endpoint, body):
    method is_simple (line 19) | def is_simple(self):
    method __len__ (line 22) | def __len__(self):
    method __str__ (line 25) | def __str__(self):
    method _parse_json (line 28) | def _parse_json(self, _, body):
    method _parse_xml (line 32) | def _parse_xml(self, endpoint, body):
    method _parse_xml_simple (line 44) | def _parse_xml_simple(self, xml):
    method _parse_xml_multi (line 71) | def _parse_xml_multi(self, xml):
    method _parse_geojson (line 96) | def _parse_geojson(self, _, body):
    method _parse_geocodejson (line 121) | def _parse_geocodejson(self, endpoint, body):

FILE: test/bdd/utils/api_runner.py
  class APIRunner (line 16) | class APIRunner:
    method __init__ (line 19) | def __init__(self, environ, api_engine):
    method run (line 23) | def run(self, endpoint, params, http_headers):
    method run_step (line 26) | def run_step(self, endpoint, base_params, datatable, fmt, http_headers):
    method create_engine_falcon (line 38) | def create_engine_falcon(self, environ):
    method create_engine_starlette (line 54) | def create_engine_starlette(self, environ):

FILE: test/bdd/utils/checks.py
  function _pretty (line 28) | def _pretty(obj):
  function _pt_close (line 32) | def _pt_close(p1, p2):
  function within_box (line 37) | def within_box(value, expect):
  class ResultAttr (line 73) | class ResultAttr:
    method __init__ (line 93) | def __init__(self, obj, key, grid=None):
    method __eq__ (line 121) | def __eq__(self, other):
    method __repr__ (line 139) | def __repr__(self):
    method compare_wkt (line 145) | def compare_wkt(self, value, expected):
    method get_point (line 202) | def get_point(self, pt):
  function check_table_content (line 212) | def check_table_content(conn, tablename, data, grid=None, exact=False):

FILE: test/bdd/utils/db.py
  class DBManager (line 22) | class DBManager:
    method __init__ (line 24) | def __init__(self, purge=False):
    method check_for_db (line 27) | def check_for_db(self, dbname):
    method drop_db (line 38) | def drop_db(self, dbname):
    method exists_db (line 46) | def exists_db(self, dbname):
    method create_db_from_template (line 54) | def create_db_from_template(self, dbname, template):
    method setup_template_db (line 66) | def setup_template_db(self, config):

FILE: test/bdd/utils/grid.py
  class Grid (line 14) | class Grid:
    method __init__ (line 16) | def __init__(self, table, step, origin):
    method get (line 32) | def get(self, nodeid):
    method parse_point (line 37) | def parse_point(self, value):
    method parse_line (line 46) | def parse_line(self, value):
    method geometry_to_wkt (line 49) | def geometry_to_wkt(self, value):

FILE: test/bdd/utils/place_inserter.py
  class PlaceColumn (line 18) | class PlaceColumn:
    method __init__ (line 22) | def __init__(self, grid=None):
    method add_row (line 27) | def add_row(self, headings, row, force_name):
    method _add (line 45) | def _add(self, key, value):
    method _set_key_name (line 59) | def _set_key_name(self, value):
    method _set_key_osm (line 62) | def _set_key_osm(self, value):
    method _set_key_admin (line 69) | def _set_key_admin(self, value):
    method _set_key_housenr (line 72) | def _set_key_housenr(self, value):
    method _set_key_postcode (line 76) | def _set_key_postcode(self, value):
    method _set_key_street (line 80) | def _set_key_street(self, value):
    method _set_key_addr_place (line 84) | def _set_key_addr_place(self, value):
    method _set_key_country (line 88) | def _set_key_country(self, value):
    method _set_key_geometry (line 92) | def _set_key_geometry(self, value):
    method _add_hstore (line 100) | def _add_hstore(self, column, key, value):
    method get_wkt (line 106) | def get_wkt(self):
    method db_delete (line 117) | def db_delete(self, cursor):
    method db_insert (line 123) | def db_insert(self, cursor):

FILE: test/python/api/conftest.py
  class APITester (line 23) | class APITester:
    method __init__ (line 25) | def __init__(self):
    method async_to_sync (line 29) | def async_to_sync(self, func):
    method add_data (line 35) | def add_data(self, table, data):
    method add_placex (line 41) | def add_placex(self, **kw):
    method add_address_placex (line 74) | def add_address_placex(self, object_id, **kw):
    method add_osmline (line 84) | def add_osmline(self, **kw):
    method add_tiger (line 100) | def add_tiger(self, **kw):
    method add_postcode (line 110) | def add_postcode(self, **kw):
    method add_country (line 125) | def add_country(self, country_code, geometry):
    method add_country_name (line 131) | def add_country_name(self, country_code, names, partition=0):
    method add_search_name (line 137) | def add_search_name(self, place_id, **kw):
    method add_class_type_table (line 149) | def add_class_type_table(self, cls, typ):
    method add_word_table (line 156) | def add_word_table(self, content):
    method exec_async (line 171) | async def exec_async(self, sql, *args, **kwargs):
    method create_tables (line 175) | async def create_tables(self):
  function apiobj (line 181) | def apiobj(temp_db_with_extensions, temp_db_conn, monkeypatch):
  function frontend (line 199) | def frontend(request, tmp_path):
  function api (line 239) | async def api(temp_db):

FILE: test/python/api/fake_adaptor.py
  class FakeError (line 17) | class FakeError(BaseException):
    method __init__ (line 19) | def __init__(self, msg, status):
    method __str__ (line 23) | def __str__(self):
  class FakeAdaptor (line 30) | class FakeAdaptor(glue.ASGIAdaptor):
    method __init__ (line 32) | def __init__(self, params=None, headers=None, config=None):
    method get (line 37) | def get(self, name, default=None):
    method get_header (line 40) | def get_header(self, name, default=None):
    method error (line 43) | def error(self, msg, status=400):
    method create_response (line 46) | def create_response(self, status, output, num_results):
    method base_uri (line 49) | def base_uri(self):
    method config (line 52) | def config(self):
    method formatting (line 55) | def formatting(self):
    method query_stats (line 58) | def query_stats(self):

FILE: test/python/api/query_processing/test_normalize.py
  function run_preprocessor_on (line 17) | def run_preprocessor_on(query, norm):
  function test_normalize_simple (line 24) | def test_normalize_simple():

FILE: test/python/api/query_processing/test_regex_replace.py
  function run_preprocessor_on (line 17) | def run_preprocessor_on(query):
  function test_split_phrases (line 45) | def test_split_phrases(inp, outp):

FILE: test/python/api/query_processing/test_split_japanese_phrases.py
  function run_preprocessor_on (line 17) | def run_preprocessor_on(query):
  function test_split_phrases (line 26) | def test_split_phrases(inp, outp):

FILE: test/python/api/search/test_api_search_query.py
  class MyToken (line 15) | class MyToken(query.Token):
    method get_category (line 17) | def get_category(self):
    method get_country (line 20) | def get_country(self):
  function mktoken (line 24) | def mktoken(tid: int):
  function qnode (line 30) | def qnode():
  function test_phrase_compatible (line 40) | def test_phrase_compatible(ptype, ttype):
  function test_phrase_incompatible (line 45) | def test_phrase_incompatible(ptype):
  function test_query_node_empty (line 49) | def test_query_node_empty(qnode):
  function test_query_node_with_content (line 53) | def test_query_node_with_content(qnode):
  function test_query_struct_empty (line 67) | def test_query_struct_empty():
  function test_query_struct_with_tokens (line 73) | def test_query_struct_with_tokens():
  function test_query_struct_incompatible_token (line 97) | def test_query_struct_incompatible_token():
  function test_query_struct_amenity_single_word (line 108) | def test_query_struct_amenity_single_word():
  function test_query_struct_amenity_two_words (line 121) | def test_query_struct_amenity_two_words():

FILE: test/python/api/search/test_db_search_builder.py
  class MyToken (line 23) | class MyToken(Token):
    method get_category (line 26) | def get_category(self):
    method get_country (line 29) | def get_country(self):
  function make_query (line 33) | def make_query(*args):
  function test_country_search (line 54) | def test_country_search():
  function test_country_search_with_country_restriction (line 71) | def test_country_search_with_country_restriction():
  function test_country_search_with_conflicting_country_restriction (line 88) | def test_country_search_with_conflicting_country_restriction():
  function test_postcode_search_simple (line 100) | def test_postcode_search_simple():
  function test_postcode_with_country (line 116) | def test_postcode_with_country():
  function test_postcode_with_address (line 137) | def test_postcode_with_address():
  function test_postcode_with_address_with_full_word (line 155) | def test_postcode_with_address_with_full_word():
  function test_near_item_only (line 176) | def test_near_item_only(kwargs):
  function test_near_item_skipped (line 192) | def test_near_item_skipped(kwargs):
  function test_name_only_search (line 201) | def test_name_only_search():
  function test_name_with_qualifier (line 219) | def test_name_with_qualifier():
  function test_name_with_housenumber_search (line 239) | def test_name_with_housenumber_search():
  function test_name_and_address (line 259) | def test_name_and_address():
  function test_name_and_complex_address (line 282) | def test_name_and_complex_address():
  function test_name_only_near_search (line 306) | def test_name_only_near_search():
  function test_name_only_search_with_category (line 322) | def test_name_only_search_with_category():
  function test_name_with_near_item_search_with_category_mismatch (line 336) | def test_name_with_near_item_search_with_category_mismatch():
  function test_name_with_near_item_search_with_category_match (line 348) | def test_name_with_near_item_search_with_category_match():
  function test_name_with_qualifier_search_with_category_mismatch (line 365) | def test_name_with_qualifier_search_with_category_mismatch():
  function test_name_with_qualifier_search_with_category_match (line 377) | def test_name_with_qualifier_search_with_category_match():
  function test_name_only_search_with_countries (line 394) | def test_name_only_search_with_countries():
  function make_counted_searches (line 409) | def make_counted_searches(name_part, name_full, address_part, address_full,
  function test_infrequent_partials_in_name (line 432) | def test_infrequent_partials_in_name():
  function test_frequent_partials_in_name_and_address (line 446) | def test_frequent_partials_in_name_and_address():
  function test_too_frequent_partials_in_name_and_address (line 460) | def test_too_frequent_partials_in_name_and_address():

FILE: test/python/api/search/test_icu_query_analyzer.py
  function add_word (line 20) | async def add_word(conn, word_id, word_token, wtype, word, info=None):
  function make_phrase (line 29) | def make_phrase(query):
  function conn (line 34) | async def conn(table_factory):
  function test_empty_phrase (line 50) | async def test_empty_phrase(conn):
  function test_single_phrase_with_unknown_terms (line 60) | async def test_single_phrase_with_unknown_terms(conn):
  function test_multiple_phrases (line 77) | async def test_multiple_phrases(conn):
  function test_splitting_in_transliteration (line 91) | async def test_splitting_in_transliteration(conn):
  function test_penalty_postcodes_and_housenumbers (line 108) | async def test_penalty_postcodes_and_housenumbers(conn, term, order):
  function test_category_words_only_at_beginning (line 128) | async def test_category_words_only_at_beginning(conn):
  function test_freestanding_qualifier_words_become_category (line 143) | async def test_freestanding_qualifier_words_become_category(conn):
  function test_qualifier_words (line 156) | async def test_qualifier_words(conn):
  function test_add_unknown_housenumbers (line 171) | async def test_add_unknown_housenumbers(conn):
  function test_log_output (line 193) | async def test_log_output(conn, logtype):

FILE: test/python/api/search/test_postcode_parser.py
  function pc_config (line 21) | def pc_config(project_env):
  function mk_query (line 66) | def mk_query(inp):
  function test_simple_postcode (line 84) | def test_simple_postcode(pc_config, query, pos):
  function test_postcode_matching_case_insensitive (line 93) | def test_postcode_matching_case_insensitive(pc_config, query):
  function test_contained_postcode (line 99) | def test_contained_postcode(pc_config):
  function test_postcode_with_space (line 109) | def test_postcode_with_space(pc_config, query, frm, to):
  function test_overlapping_postcode (line 117) | def test_overlapping_postcode(pc_config):
  function test_not_a_postcode (line 126) | def test_not_a_postcode(pc_config, query):
  function test_postcode_with_country_prefix (line 133) | def test_postcode_with_country_prefix(pc_config, query):
  function test_postcode_with_joined_country_prefix (line 139) | def test_postcode_with_joined_country_prefix(pc_config):
  function test_postcode_with_non_matching_country_prefix (line 145) | def test_postcode_with_non_matching_country_prefix(pc_config):
  function test_postcode_inside_postcode_phrase (line 151) | def test_postcode_inside_postcode_phrase(pc_config):
  function test_partial_postcode_in_postcode_phrase (line 163) | def test_partial_postcode_in_postcode_phrase(pc_config):

FILE: test/python/api/search/test_query.py
  function test_token_range_equal (line 15) | def test_token_range_equal():
  function test_token_range_unequal (line 23) | def test_token_range_unequal(lop, rop):
  function test_token_range_lt (line 28) | def test_token_range_lt():
  function test_token_rankge_gt (line 36) | def test_token_rankge_gt():
  function test_token_range_unimplemented_ops (line 45) | def test_token_range_unimplemented_ops():
  function test_query_extract_words (line 52) | def test_query_extract_words():

FILE: test/python/api/search/test_query_analyzer_factory.py
  function test_import_icu_tokenizer (line 17) | async def test_import_icu_tokenizer(table_factory, api):
  function test_import_missing_property (line 31) | async def test_import_missing_property(table_factory, api):
  function test_import_missing_module (line 41) | async def test_import_missing_module(table_factory, api):

FILE: test/python/api/search/test_search_address.py
  function run_search (line 22) | def run_search(apiobj, frontend, global_penalty, lookup, ranking, count=2,
  class TestStreetWithHousenumber (line 51) | class TestStreetWithHousenumber:
    method fill_database (line 54) | def fill_database(self, apiobj):
    method test_lookup_by_single_housenumber (line 86) | def test_lookup_by_single_housenumber(self, apiobj, frontend, hnr, res):
    method test_lookup_with_country_restriction (line 95) | def test_lookup_with_country_restriction(self, apiobj, frontend, cc, r...
    method test_lookup_exclude_housenumber_placeid (line 104) | def test_lookup_exclude_housenumber_placeid(self, apiobj, frontend):
    method test_lookup_exclude_street_placeid (line 113) | def test_lookup_exclude_street_placeid(self, apiobj, frontend):
    method test_lookup_only_house_qualifier (line 122) | def test_lookup_only_house_qualifier(self, apiobj, frontend):
    method test_lookup_only_street_qualifier (line 131) | def test_lookup_only_street_qualifier(self, apiobj, frontend):
    method test_lookup_min_rank (line 141) | def test_lookup_min_rank(self, apiobj, frontend, rank, found):
    method test_return_geometries (line 154) | def test_return_geometries(self, apiobj, frontend, geom):
  function test_very_large_housenumber (line 164) | def test_very_large_housenumber(apiobj, frontend):
  class TestInterpolations (line 184) | class TestInterpolations:
    method fill_database (line 187) | def fill_database(self, apiobj):
    method test_lookup_housenumber (line 206) | def test_lookup_housenumber(self, apiobj, frontend, hnr, res):
    method test_osmline_with_geometries (line 217) | def test_osmline_with_geometries(self, apiobj, frontend, geom):
  class TestTiger (line 227) | class TestTiger:
    method fill_database (line 230) | def fill_database(self, apiobj):
    method test_lookup_housenumber (line 251) | def test_lookup_housenumber(self, apiobj, frontend, hnr, res):
    method test_tiger_with_geometries (line 262) | def test_tiger_with_geometries(self, apiobj, frontend, geom):

FILE: test/python/api/search/test_search_country.py
  function run_search (line 18) | def run_search(apiobj, frontend, global_penalty, ccodes,
  function test_find_from_placex (line 37) | def test_find_from_placex(apiobj, frontend):
  function test_find_from_fallback_countries (line 52) | def test_find_from_fallback_countries(apiobj, frontend):
  function test_find_none (line 62) | def test_find_none(apiobj, frontend):
  function test_find_near (line 67) | def test_find_near(apiobj, frontend, coord, numres):
  class TestCountryParameters (line 78) | class TestCountryParameters:
    method fill_database (line 81) | def fill_database(self, apiobj):
    method test_return_geometries (line 96) | def test_return_geometries(self, apiobj, frontend, geom, cc):
    method test_exclude_place_id (line 104) | def test_exclude_place_id(self, apiobj, frontend, pid, rids):
    method test_bounded_viewbox_in_placex (line 112) | def test_bounded_viewbox_in_placex(self, apiobj, frontend, viewbox, ri...
    method test_bounded_viewbox_in_fallback (line 121) | def test_bounded_viewbox_in_fallback(self, apiobj, frontend, viewbox, ...

FILE: test/python/api/search/test_search_near.py
  function run_search (line 20) | def run_search(apiobj, frontend, global_penalty, cat, cat_penalty=None, ...
  function test_no_results_inner_query (line 54) | def test_no_results_inner_query(apiobj, frontend):
  function test_no_appropriate_results_inner_query (line 58) | def test_no_appropriate_results_inner_query(apiobj, frontend):
  class TestNearSearch (line 70) | class TestNearSearch:
    method fill_database (line 73) | def fill_database(self, apiobj):
    method test_near_in_placex (line 83) | def test_near_in_placex(self, apiobj, frontend):
    method test_multiple_types_near_in_placex (line 93) | def test_multiple_types_near_in_placex(self, apiobj, frontend):
    method test_near_in_classtype (line 106) | def test_near_in_classtype(self, apiobj, frontend):
    method test_restrict_by_country (line 119) | def test_restrict_by_country(self, apiobj, frontend, cc, rid):
    method test_exclude_place_by_id (line 138) | def test_exclude_place_by_id(self, apiobj, frontend, excluded, rid):
    method test_with_layer (line 153) | def test_with_layer(self, apiobj, frontend, layer, rids):

FILE: test/python/api/search/test_search_places.py
  function run_search (line 24) | def run_search(apiobj, frontend, global_penalty, lookup, ranking, count=2,
  class TestNameOnlySearches (line 53) | class TestNameOnlySearches:
    method fill_database (line 56) | def fill_database(self, apiobj):
    method test_lookup_all_match (line 69) | def test_lookup_all_match(self, apiobj, frontend, lookup_type, rank, r...
    method test_lookup_all_partial_match (line 78) | def test_lookup_all_partial_match(self, apiobj, frontend, lookup_type):
    method test_lookup_any_match (line 89) | def test_lookup_any_match(self, apiobj, frontend, rank, res):
    method test_lookup_any_partial_match (line 97) | def test_lookup_any_partial_match(self, apiobj, frontend):
    method test_lookup_restrict_country (line 107) | def test_lookup_restrict_country(self, apiobj, frontend, cc, res):
    method test_lookup_restrict_placeid (line 115) | def test_lookup_restrict_placeid(self, apiobj, frontend):
    method test_return_geometries (line 128) | def test_return_geometries(self, apiobj, frontend, geom):
    method test_return_simplified_geometry (line 138) | def test_return_simplified_geometry(self, apiobj, frontend, factor, np...
    method test_prefer_viewbox (line 163) | def test_prefer_viewbox(self, apiobj, frontend, viewbox, rids, wcount):
    method test_force_viewbox (line 176) | def test_force_viewbox(self, apiobj, frontend, viewbox):
    method test_prefer_near (line 185) | def test_prefer_near(self, apiobj, frontend):
    method test_force_near (line 199) | def test_force_near(self, apiobj, frontend, radius):
  function test_name_and_postcode (line 211) | def test_name_and_postcode(apiobj, frontend, wcount, rids):
  class TestLayersRank30 (line 238) | class TestLayersRank30:
    method fill_database (line 241) | def fill_database(self, apiobj):
    method test_layers_rank30 (line 283) | def test_layers_rank30(self, apiobj, frontend, layer, res):

FILE: test/python/api/search/test_search_poi.py
  function run_search (line 17) | def run_search(apiobj, frontend, global_penalty, poitypes, poi_penalties...
  function test_simple_near_search_in_placex (line 40) | def test_simple_near_search_in_placex(apiobj, frontend, coord, pid):
  function test_simple_near_search_in_classtype (line 56) | def test_simple_near_search_in_classtype(apiobj, frontend, coord, pid):
  class TestPoiSearchWithRestrictions (line 70) | class TestPoiSearchWithRestrictions:
    method fill_database (line 73) | def fill_database(self, apiobj, request):
    method test_unrestricted (line 86) | def test_unrestricted(self, apiobj, frontend):
    method test_restict_country (line 92) | def test_restict_country(self, apiobj, frontend):
    method test_restrict_by_viewbox (line 99) | def test_restrict_by_viewbox(self, apiobj, frontend):

FILE: test/python/api/search/test_search_postcode.py
  function poly_around (line 19) | def poly_around(x, y, diff=0.01):
  function run_search (line 24) | def run_search(apiobj, frontend, global_penalty, pcs, pc_penalties=None,
  function test_postcode_only_search (line 47) | def test_postcode_only_search(apiobj, frontend):
  function test_postcode_with_country (line 57) | def test_postcode_with_country(apiobj, frontend):
  function test_postcode_area (line 69) | def test_postcode_area(apiobj, frontend):
  class TestPostcodeSearchWithAddress (line 81) | class TestPostcodeSearchWithAddress:
    method fill_database (line 84) | def fill_database(self, apiobj):
    method test_lookup_both (line 104) | def test_lookup_both(self, apiobj, frontend):
    method test_restrict_by_name (line 112) | def test_restrict_by_name(self, apiobj, frontend):
    method test_lookup_near (line 121) | def test_lookup_near(self, apiobj, frontend, coord, place_id):
    method test_return_geometries (line 136) | def test_return_geometries(self, apiobj, frontend, geom):
    method test_prefer_viewbox (line 145) | def test_prefer_viewbox(self, apiobj, frontend, viewbox, rids):
    method test_restrict_to_viewbox (line 153) | def test_restrict_to_viewbox(self, apiobj, frontend, viewbox, rid):
    method test_prefer_near (line 162) | def test_prefer_near(self, apiobj, frontend, coord, rids):
    method test_exclude (line 169) | def test_exclude(self, apiobj, frontend, pid, rid):

FILE: test/python/api/search/test_token_assignment.py
  class MyToken (line 19) | class MyToken(Token):
    method get_category (line 20) | def get_category(self):
    method get_country (line 23) | def get_country(self):
  function make_query (line 27) | def make_query(*args):
  function check_assignments (line 44) | def check_assignments(actual, *expected):
  function test_query_with_missing_tokens (line 53) | def test_query_with_missing_tokens():
  function test_one_word_query (line 60) | def test_one_word_query():
  function test_single_postcode (line 70) | def test_single_postcode():
  function test_single_country_name (line 78) | def test_single_country_name():
  function test_single_word_poi_search (line 86) | def test_single_word_poi_search():
  function test_multiple_simple_words (line 96) | def test_multiple_simple_words(btype):
  function test_multiple_words_respect_phrase_break (line 115) | def test_multiple_words_respect_phrase_break():
  function test_housenumber_and_street (line 126) | def test_housenumber_and_street():
  function test_housenumber_and_street_backwards (line 137) | def test_housenumber_and_street_backwards():
  function test_housenumber_and_postcode (line 148) | def test_housenumber_and_postcode():
  function test_postcode_and_housenumber (line 166) | def test_postcode_and_housenumber():
  function test_country_housenumber_postcode (line 184) | def test_country_housenumber_postcode():
  function test_housenumber_with_only_special_terms (line 195) | def test_housenumber_with_only_special_terms(ttype):
  function test_multiple_special_tokens (line 203) | def test_multiple_special_tokens(ttype):
  function test_housenumber_many_phrases (line 211) | def test_housenumber_many_phrases():
  function test_country_at_beginning (line 230) | def test_country_at_beginning():
  function test_country_at_end (line 239) | def test_country_at_end():
  function test_country_in_middle (line 248) | def test_country_in_middle():
  function test_postcode_with_designation (line 256) | def test_postcode_with_designation():
  function test_postcode_with_designation_backwards (line 267) | def test_postcode_with_designation_backwards():
  function test_near_item_at_beginning (line 278) | def test_near_item_at_beginning():
  function test_near_item_at_end (line 287) | def test_near_item_at_end():
  function test_near_item_in_middle (line 296) | def test_near_item_in_middle():
  function test_qualifier_at_beginning (line 304) | def test_qualifier_at_beginning():
  function test_qualifier_after_name (line 317) | def test_qualifier_after_name():
  function test_qualifier_before_housenumber (line 333) | def test_qualifier_before_housenumber():
  function test_qualifier_after_housenumber (line 341) | def test_qualifier_after_housenumber():
  function test_qualifier_in_middle_of_phrase (line 349) | def test_qualifier_in_middle_of_phrase():

FILE: test/python/api/test_api_connection.py
  function test_run_scalar (line 16) | async def test_run_scalar(api, table_factory):
  function test_run_execute (line 24) | async def test_run_execute(api, table_factory):
  function test_get_property_existing_cached (line 33) | async def test_get_property_existing_cached(api, table_factory):
  function test_get_property_existing_uncached (line 47) | async def test_get_property_existing_uncached(api, table_factory):
  function test_get_property_missing (line 62) | async def test_get_property_missing(api, table_factory, param):
  function test_get_db_property_existing (line 72) | async def test_get_db_property_existing(api):
  function test_get_db_property_bad_name (line 78) | async def test_get_db_property_bad_name(api):

FILE: test/python/api/test_api_deletable_v1.py
  class TestDeletableEndPoint (line 19) | class TestDeletableEndPoint:
    method setup_deletable_table (line 22) | def setup_deletable_table(self, temp_db_cursor, table_factory, temp_db...
    method test_deletable (line 37) | async def test_deletable(self, api):

FILE: test/python/api/test_api_details.py
  function test_lookup_in_placex (line 19) | def test_lookup_in_placex(apiobj, frontend, idobj):
  function test_lookup_in_placex_minimal_info (line 75) | def test_lookup_in_placex_minimal_info(apiobj, frontend):
  function test_lookup_in_placex_with_geometry (line 126) | def test_lookup_in_placex_with_geometry(apiobj, frontend):
  function test_lookup_placex_with_address_details (line 136) | def test_lookup_placex_with_address_details(apiobj, frontend):
  function test_lookup_place_with_linked_places_none_existing (line 184) | def test_lookup_place_with_linked_places_none_existing(apiobj, frontend):
  function test_lookup_place_with_linked_places_existing (line 196) | def test_lookup_place_with_linked_places_existing(apiobj, frontend):
  function test_lookup_place_with_parented_places_not_existing (line 227) | def test_lookup_place_with_parented_places_not_existing(apiobj, frontend):
  function test_lookup_place_with_parented_places_existing (line 239) | def test_lookup_place_with_parented_places_existing(apiobj, frontend):
  function test_lookup_in_osmline (line 266) | def test_lookup_in_osmline(apiobj, frontend, idobj):
  function test_lookup_in_osmline_split_interpolation (line 315) | def test_lookup_in_osmline_split_interpolation(apiobj, frontend):
  function test_lookup_osmline_with_address_details (line 335) | def test_lookup_osmline_with_address_details(apiobj, frontend):
  function test_lookup_in_tiger (line 386) | def test_lookup_in_tiger(apiobj, frontend):
  function test_lookup_tiger_with_address_details (line 436) | def test_lookup_tiger_with_address_details(apiobj, frontend):
  function test_lookup_in_postcode (line 487) | def test_lookup_in_postcode(apiobj, frontend):
  function test_lookup_postcode_with_address_details (line 539) | def test_lookup_postcode_with_address_details(apiobj, frontend, lookup):
  function test_lookup_missing_object (line 589) | def test_lookup_missing_object(apiobj, frontend, objid):
  function test_lookup_unsupported_geometry (line 600) | def test_lookup_unsupported_geometry(apiobj, frontend, gtype):

FILE: test/python/api/test_api_lookup.py
  function test_lookup_empty_list (line 17) | def test_lookup_empty_list(apiobj, frontend):
  function test_lookup_non_existing (line 22) | def test_lookup_non_existing(apiobj, frontend):
  function test_lookup_single_placex (line 30) | def test_lookup_single_placex(apiobj, frontend, idobj):
  function test_lookup_multiple_places (line 81) | def test_lookup_multiple_places(apiobj, frontend):
  function test_simple_place_with_geometry (line 112) | def test_simple_place_with_geometry(apiobj, frontend, gtype):
  function test_simple_place_with_geometry_simplified (line 138) | def test_simple_place_with_geometry_simplified(apiobj, frontend):

FILE: test/python/api/test_api_polygons_v1.py
  class TestPolygonsEndPoint (line 20) | class TestPolygonsEndPoint:
    method setup_deletable_table (line 23) | def setup_deletable_table(self, temp_db_cursor, table_factory, temp_db...
    method test_polygons_simple (line 46) | async def test_polygons_simple(self, api):
    method test_polygons_days (line 66) | async def test_polygons_days(self, api):
    method test_polygons_class (line 76) | async def test_polygons_class(self, api):
    method test_polygons_reduced (line 86) | async def test_polygons_reduced(self, api):

FILE: test/python/api/test_api_reverse.py
  function test_reverse_rank_30 (line 22) | def test_reverse_rank_30(apiobj, frontend):
  function test_reverse_street (line 36) | def test_reverse_street(apiobj, frontend, country):
  function test_reverse_ignore_unindexed (line 48) | def test_reverse_ignore_unindexed(apiobj, frontend):
  function test_reverse_rank_30_layers (line 73) | def test_reverse_rank_30_layers(apiobj, frontend, y, layer, place_id):
  function test_reverse_poi_layer_with_no_pois (line 111) | def test_reverse_poi_layer_with_no_pois(apiobj, frontend):
  function test_reverse_housenumber_on_street (line 124) | def test_reverse_housenumber_on_street(apiobj, frontend, with_geom):
  function test_reverse_housenumber_interpolation (line 156) | def test_reverse_housenumber_interpolation(apiobj, frontend, with_geom):
  function test_reverse_housenumber_point_interpolation (line 190) | def test_reverse_housenumber_point_interpolation(apiobj, frontend):
  function test_reverse_tiger_number (line 208) | def test_reverse_tiger_number(apiobj, frontend):
  function test_reverse_point_tiger (line 226) | def test_reverse_point_tiger(apiobj, frontend):
  function test_reverse_low_zoom_address (line 245) | def test_reverse_low_zoom_address(apiobj, frontend):
  function test_reverse_place_node_in_area (line 264) | def test_reverse_place_node_in_area(apiobj, frontend):
  function test_reverse_larger_area_layers (line 288) | def test_reverse_larger_area_layers(apiobj, frontend, layer, place_id):
  function test_reverse_country_lookup_no_objects (line 309) | def test_reverse_country_lookup_no_objects(apiobj, frontend):
  function test_reverse_country_lookup_country_only (line 318) | def test_reverse_country_lookup_country_only(apiobj, frontend, rank, wit...
  function test_reverse_country_lookup_place_node_inside (line 338) | def test_reverse_country_lookup_place_node_inside(apiobj, frontend, with...
  function test_reverse_geometry_output_placex (line 364) | def test_reverse_geometry_output_placex(apiobj, frontend, gtype):
  function test_reverse_simplified_geometry (line 384) | def test_reverse_simplified_geometry(apiobj, frontend):
  function test_reverse_interpolation_geometry (line 397) | def test_reverse_interpolation_geometry(apiobj, frontend):
  function test_reverse_tiger_geometry (line 410) | def test_reverse_tiger_geometry(apiobj, frontend):

FILE: test/python/api/test_api_search.py
  function setup_icu_tokenizer (line 21) | def setup_icu_tokenizer(apiobj):
  function test_search_no_content (line 32) | def test_search_no_content(apiobj, frontend):
  function test_search_simple_word (line 39) | def test_search_simple_word(apiobj, frontend):
  function test_search_with_debug (line 54) | def test_search_with_debug(apiobj, frontend, logtype):
  function test_address_no_content (line 69) | def test_address_no_content(apiobj, frontend):
  function test_address_simple_places (line 86) | def test_address_simple_places(apiobj, frontend, atype, address, search):
  function test_address_country (line 101) | def test_address_country(apiobj, frontend):
  function test_category_no_categories (line 110) | def test_category_no_categories(apiobj, frontend):
  function test_category_no_content (line 117) | def test_category_no_content(apiobj, frontend):
  function test_category_simple_restaurant (line 124) | def test_category_simple_restaurant(apiobj, frontend):
  function test_category_with_search_phrase (line 138) | def test_category_with_search_phrase(apiobj, frontend):

FILE: test/python/api/test_api_status.py
  function test_status_no_extra_info (line 19) | def test_status_no_extra_info(apiobj, frontend):
  function test_status_full (line 30) | def test_status_full(apiobj, frontend):
  function test_status_database_not_found (line 47) | def test_status_database_not_found(monkeypatch):
  function test_status_connection_timeout_single_pool (line 62) | async def test_status_connection_timeout_single_pool(status_table, prope...
  function test_status_connection_timeout_multi_pool (line 75) | async def test_status_connection_timeout_multi_pool(status_table, proper...

FILE: test/python/api/test_api_types.py
  function test_no_params_defaults (line 16) | def test_no_params_defaults():
  function test_bad_format_reverse (line 26) | def test_bad_format_reverse(k, v):
  function test_rank_params (line 33) | def test_rank_params(rin, rout):
  class TestFormatExcluded (line 39) | class TestFormatExcluded:
    method test_empty_value (line 42) | def test_empty_value(self, inp):
    method test_valid_exclude_ids (line 60) | def test_valid_exclude_ids(self, inp, expected):
    method test_invalid_exclude_ids (line 71) | def test_invalid_exclude_ids(self, inp, bad_id):
    method test_invalid_list_element_type (line 76) | def test_invalid_list_element_type(self, inp):

FILE: test/python/api/test_export.py
  function run_export (line 16) | def run_export(tmp_path, capsys):
  function setup_database_with_context (line 26) | def setup_database_with_context(apiobj):
  function test_export_default (line 44) | def test_export_default(run_export):
  function test_export_output_type (line 50) | def test_export_output_type(run_export):
  function test_export_output_format (line 56) | def test_export_output_format(run_export):
  function test_export_restrict_to_node_good (line 62) | def test_export_restrict_to_node_good(run_export):
  function test_export_restrict_to_node_not_address (line 68) | def test_export_restrict_to_node_not_address(run_export):

FILE: test/python/api/test_helpers_v1.py
  function test_extract_coords_no_coords (line 20) | def test_extract_coords_no_coords(inp):
  function test_extract_coords_null_island (line 28) | def test_extract_coords_null_island():
  function test_extract_coords_with_text_before (line 32) | def test_extract_coords_with_text_before():
  function test_extract_coords_with_text_after (line 36) | def test_extract_coords_with_text_after():
  function test_extract_coords_with_spaces (line 41) | def test_extract_coords_with_spaces(inp):
  function test_extract_coords_formats (line 75) | def test_extract_coords_formats(inp):
  function test_extract_coords_formats_southeast (line 95) | def test_extract_coords_formats_southeast():
  function test_extract_category_good (line 107) | def test_extract_category_good(inp):
  function test_extract_category_only (line 115) | def test_extract_category_only():
  function test_extract_category_no_match (line 120) | def test_extract_category_no_match(inp):

FILE: test/python/api/test_localization.py
  function test_display_name_empty_names (line 15) | def test_display_name_empty_names():
  function test_display_name_none_localized (line 22) | def test_display_name_none_localized():
  function test_output_names_none_localized (line 30) | def test_output_names_none_localized():
  function test_output_names_none_localized_and_custom_output_names (line 40) | def test_output_names_none_localized_and_custom_output_names():
  function test_output_names_none_localized_and_custom_output_names_more_than_two_changes (line 51) | def test_output_names_none_localized_and_custom_output_names_more_than_t...
  function test_output_names_none_localized_and_custom_output_names_including_space (line 63) | def test_output_names_none_localized_and_custom_output_names_including_s...
  function test_display_name_localized (line 73) | def test_display_name_localized():
  function test_output_names_localized (line 81) | def test_output_names_localized():
  function test_output_names_localized_and_empty_names (line 91) | def test_output_names_localized_and_empty_names():
  function test_output_names_localized_and_custom_names_ordering_logic (line 98) | def test_output_names_localized_and_custom_names_ordering_logic():
  function test_output_names_localized_and_custom_output_names_including_space (line 109) | def test_output_names_localized_and_custom_output_names_including_space():
  function test_output_names_localized_and_custom_output_names (line 122) | def test_output_names_localized_and_custom_output_names():
  function test_output_names_localized_and_custom_output_names_start_with_tag_that_has_no_XX (line 138) | def test_output_names_localized_and_custom_output_names_start_with_tag_t...
  function test_output_names_localized_and_custom_output_names_no_named_tags (line 153) | def test_output_names_localized_and_custom_output_names_no_named_tags():
  function test_output_names_localized_and_custom_output_names_only_named_tags (line 163) | def test_output_names_localized_and_custom_output_names_only_named_tags():
  function test_output_names_localized_and_custom_output_names_more_than_two_changes (line 178) | def test_output_names_localized_and_custom_output_names_more_than_two_ch...
  function test_output_names_localized_and_custom_output_names_XX_in_the_middle (line 194) | def test_output_names_localized_and_custom_output_names_XX_in_the_middle():
  function test_display_name_preference (line 210) | def test_display_name_preference():
  function test_from_language_preferences (line 226) | def test_from_language_preferences(langstr, langlist):

FILE: test/python/api/test_result_formatting_v1.py
  function test_status_format_list (line 27) | def test_status_format_list():
  function test_status_supported (line 32) | def test_status_supported(fmt):
  function test_status_unsupported (line 36) | def test_status_unsupported():
  function test_status_format_text (line 40) | def test_status_format_text():
  function test_status_format_error_text (line 45) | def test_status_format_error_text():
  function test_status_format_json_minimal (line 50) | def test_status_format_json_minimal():
  function test_status_format_json_full (line 60) | def test_status_format_json_full():
  function test_search_details_minimal (line 76) | def test_search_details_minimal():
  function test_search_details_full (line 100) | def test_search_details_full():
  function test_search_details_no_geometry (line 158) | def test_search_details_no_geometry(gtype, isarea):
  function test_search_details_with_geometry (line 171) | def test_search_details_with_geometry():
  function test_search_details_with_icon_available (line 185) | def test_search_details_with_icon_available():
  function test_search_details_with_icon_not_available (line 196) | def test_search_details_with_icon_not_available():
  function test_search_details_with_address_minimal (line 207) | def test_search_details_with_address_minimal():
  function test_search_details_with_further_infos (line 239) | def test_search_details_with_further_infos(field, outfield):
  function test_search_details_grouped_hierarchy (line 273) | def test_search_details_grouped_hierarchy():
  function test_search_details_keywords_name (line 306) | def test_search_details_keywords_name():
  function test_search_details_keywords_address (line 322) | def test_search_details_keywords_address():
  function test_search_extratags_boundary_administrative_injects_admin_level (line 344) | def test_search_extratags_boundary_administrative_injects_admin_level(fmt):
  function test_search_extratags_non_boundary_no_admin_level_injection (line 374) | def test_search_extratags_non_boundary_no_admin_level_injection(fmt):
  function test_search_extratags_boundary_admin_level_15_no_injection (line 404) | def test_search_extratags_boundary_admin_level_15_no_injection(fmt):

FILE: test/python/api/test_result_formatting_v1_reverse.py
  function test_format_reverse_minimal (line 25) | def test_format_reverse_minimal(fmt):
  function test_format_reverse_no_result (line 41) | def test_format_reverse_no_result(fmt):
  function test_format_reverse_with_osm_id (line 52) | def test_format_reverse_with_osm_id(fmt):
  function test_format_reverse_with_address (line 78) | def test_format_reverse_with_address(fmt):
  function test_format_reverse_geocodejson_special_parts (line 128) | def test_format_reverse_geocodejson_special_parts():
  function test_format_reverse_with_address_none (line 179) | def test_format_reverse_with_address_none(fmt):
  function test_format_reverse_with_extratags (line 208) | def test_format_reverse_with_extratags(fmt):
  function test_format_reverse_with_extratags_none (line 231) | def test_format_reverse_with_extratags_none(fmt):
  function test_format_reverse_with_namedetails_with_name (line 253) | def test_format_reverse_with_namedetails_with_name(fmt):
  function test_format_reverse_with_namedetails_without_name (line 276) | def test_format_reverse_with_namedetails_without_name(fmt):
  function test_search_details_with_icon_available (line 298) | def test_search_details_with_icon_available(fmt):
  function test_search_details_with_icon_not_available (line 312) | def test_search_details_with_icon_not_available(fmt):

FILE: test/python/api/test_results.py
  function mkpoint (line 19) | def mkpoint(x, y):
  class FakeRow (line 23) | class FakeRow:
    method __init__ (line 24) | def __init__(self, **kwargs):
  function test_minimal_detailed_result (line 32) | def test_minimal_detailed_result():
  function test_detailed_result_custom_importance (line 42) | def test_detailed_result_custom_importance():
  function test_create_row_with_housenumber (line 53) | def test_create_row_with_housenumber(func):
  function test_create_row_without_housenumber (line 67) | def test_create_row_without_housenumber(func):

FILE: test/python/api/test_server_glue_v1.py
  function test_adaptor_get_int_missing_but_required (line 25) | def test_adaptor_get_int_missing_but_required(func):
  function test_adaptor_get_int_missing_with_default (line 31) | def test_adaptor_get_int_missing_with_default(func, val):
  function test_adaptor_get_int_success (line 36) | def test_adaptor_get_int_success(inp):
  function test_adaptor_get_int_bad_number (line 42) | def test_adaptor_get_int_bad_number(inp):
  function test_adaptor_get_bool_trueish (line 48) | def test_adaptor_get_bool_trueish(inp):
  function test_adaptor_get_bool_falsish (line 52) | def test_adaptor_get_bool_falsish():
  function test_adaptor_parse_format_use_default (line 58) | def test_adaptor_parse_format_use_default():
  function test_adaptor_parse_format_use_configured (line 65) | def test_adaptor_parse_format_use_configured():
  function test_adaptor_parse_format_invalid_value (line 72) | def test_adaptor_parse_format_invalid_value():
  function test_accepted_languages_from_param (line 81) | def test_accepted_languages_from_param():
  function test_accepted_languages_from_header (line 86) | def test_accepted_languages_from_header():
  function test_accepted_languages_from_default (line 91) | def test_accepted_languages_from_default(monkeypatch):
  function test_accepted_languages_param_over_header (line 97) | def test_accepted_languages_param_over_header():
  function test_accepted_languages_header_over_default (line 103) | def test_accepted_languages_header_over_default(monkeypatch):
  class TestAdaptorRaiseError (line 111) | class TestAdaptorRaiseError:
    method init_adaptor (line 114) | def init_adaptor(self):
    method run_raise_error (line 118) | def run_raise_error(self, msg, status):
    method test_without_content_set (line 124) | def test_without_content_set(self):
    method test_json (line 131) | def test_json(self):
    method test_xml (line 140) | def test_xml(self):
  function test_raise_error_during_debug (line 152) | def test_raise_error_during_debug():
  function test_build_response_without_content_type (line 170) | def test_build_response_without_content_type():
  function test_build_response_with_status (line 179) | def test_build_response_with_status():
  function test_build_response_jsonp_with_json (line 191) | def test_build_response_jsonp_with_json():
  function test_build_response_jsonp_without_json (line 203) | def test_build_response_jsonp_without_json():
  function test_build_response_jsonp_bad_format (line 216) | def test_build_response_jsonp_bad_format(param):
  class TestStatusEndpoint (line 226) | class TestStatusEndpoint:
    method patch_status_func (line 229) | def patch_status_func(self, monkeypatch):
    method test_status_without_params (line 236) | async def test_status_without_params(self):
    method test_status_with_error (line 247) | async def test_status_with_error(self):
    method test_status_json_with_error (line 258) | async def test_status_json_with_error(self):
    method test_status_bad_format (line 269) | async def test_status_bad_format(self):
  class TestDetailsEndpoint (line 279) | class TestDetailsEndpoint:
    method patch_lookup_func (line 282) | def patch_lookup_func(self, monkeypatch):
    method test_details_no_params (line 295) | async def test_details_no_params(self):
    method test_details_by_place_id (line 302) | async def test_details_by_place_id(self):
    method test_details_by_osm_id (line 310) | async def test_details_by_osm_id(self):
    method test_details_with_debugging (line 320) | async def test_details_with_debugging(self):
    method test_details_no_result (line 330) | async def test_details_no_result(self):
  class TestReverseEndPoint (line 339) | class TestReverseEndPoint:
    method patch_reverse_func (line 342) | def patch_reverse_func(self, monkeypatch):
    method test_reverse_no_params (line 354) | async def test_reverse_no_params(self, params):
    method test_reverse_success (line 363) | async def test_reverse_success(self):
    method test_reverse_from_search (line 371) | async def test_reverse_from_search(self):
  class TestLookupEndpoint (line 383) | class TestLookupEndpoint:
    method patch_lookup_func (line 386) | def patch_lookup_func(self, monkeypatch):
    method test_lookup_no_params (line 397) | async def test_lookup_no_params(self):
    method test_lookup_bad_params (line 407) | async def test_lookup_bad_params(self, param):
    method test_lookup_bad_osm_type (line 418) | async def test_lookup_bad_osm_type(self, param):
    method test_lookup_working (line 428) | async def test_lookup_working(self):
  class TestSearchEndPointSearch (line 440) | class TestSearchEndPointSearch:
    method patch_lookup_func (line 443) | def patch_lookup_func(self, monkeypatch):
    method test_search_free_text (line 454) | async def test_search_free_text(self):
    method test_search_free_text_xml (line 463) | async def test_search_free_text_xml(self):
    method test_search_free_and_structured (line 474) | async def test_search_free_and_structured(self):
    method test_search_dedupe (line 484) | async def test_search_dedupe(self, dedupe, numres):
  class TestSearchEndPointSearchAddress (line 496) | class TestSearchEndPointSearchAddress:
    method patch_lookup_func (line 499) | def patch_lookup_func(self, monkeypatch):
    method test_search_structured (line 510) | async def test_search_structured(self):
  class TestSearchEndPointSearchCategory (line 519) | class TestSearchEndPointSearchCategory:
    method patch_lookup_func (line 522) | def patch_lookup_func(self, monkeypatch):
    method test_search_category (line 533) | async def test_search_category(self):

FILE: test/python/api/test_timeout.py
  function test_timeout_none (line 18) | async def test_timeout_none():
  function test_timeout_should_not_be_elapsed_after_creation (line 26) | async def test_timeout_should_not_be_elapsed_after_creation():
  function test_timeout_elapse (line 31) | async def test_timeout_elapse():

FILE: test/python/api/test_warm.py
  function setup_database_with_context (line 16) | def setup_database_with_context(apiobj, table_factory):
  function test_warm_all (line 31) | def test_warm_all(tmp_path, args):

FILE: test/python/cli/conftest.py
  class MockParamCapture (line 12) | class MockParamCapture:
    method __init__ (line 16) | def __init__(self, retval=0):
    method __call__ (line 22) | def __call__(self, *args, **kwargs):
  class AsyncMockParamCapture (line 29) | class AsyncMockParamCapture:
    method __init__ (line 33) | def __init__(self, retval=0):
    method __call__ (line 39) | async def __call__(self, *args, **kwargs):
  class DummyTokenizer (line 46) | class DummyTokenizer:
    method __init__ (line 47) | def __init__(self, *args, **kwargs):
    method update_sql_functions (line 53) | def update_sql_functions(self, *args, **kwargs):
    method finalize_import (line 56) | def finalize_import(self, *args, **kwargs):
    method update_statistics (line 59) | def update_statistics(self, *args, **kwargs):
    method update_word_tokens (line 62) | def update_word_tokens(self, *args, **kwargs):
  function cli_call (line 67) | def cli_call():
  function mock_func_factory (line 78) | def mock_func_factory(monkeypatch):
  function async_mock_func_factory (line 89) | def async_mock_func_factory(monkeypatch):
  function cli_tokenizer_mock (line 100) | def cli_tokenizer_mock(monkeypatch):

FILE: test/python/cli/test_cli.py
  function test_cli_help (line 22) | def test_cli_help(cli_call, capsys):
  function test_cli_version (line 31) | def test_cli_version(cli_call, capsys):
  class TestCliWithDb (line 40) | class TestCliWithDb:
    method setup_cli_call (line 43) | def setup_cli_call(self, cli_call, temp_db, cli_tokenizer_mock, table_...
    method test_cli_add_data_file_command (line 50) | def test_cli_add_data_file_command(self, cli_call, mock_func_factory, ...
    method test_cli_add_data_object_command (line 57) | def test_cli_add_data_object_command(self, cli_call, mock_func_factory...
    method test_cli_add_data_tiger_data (line 63) | def test_cli_add_data_tiger_data(self, cli_call, cli_tokenizer_mock, a...
    method test_freeze_command (line 70) | def test_freeze_command(self, mock_func_factory):
    method test_index_command (line 84) | def test_index_command(self, monkeypatch, async_mock_func_factory, tab...
    method test_special_phrases_wiki_command (line 104) | def test_special_phrases_wiki_command(self, mock_func_factory):
    method test_special_phrases_csv_command (line 111) | def test_special_phrases_csv_command(self, src_dir, mock_func_factory):
    method test_special_phrases_csv_bad_file (line 120) | def test_special_phrases_csv_bad_file(self, src_dir):

FILE: test/python/cli/test_cmd_admin.py
  function test_admin_command_check_database (line 22) | def test_admin_command_check_database(cli_call, mock_func_factory):
  function test_admin_migrate (line 29) | def test_admin_migrate(cli_call, mock_func_factory):
  function test_admin_clean_deleted_relations (line 36) | def test_admin_clean_deleted_relations(cli_call, mock_func_factory):
  function test_admin_clean_deleted_relations_no_age (line 43) | def test_admin_clean_deleted_relations_no_age(cli_call, mock_func_factory):
  class TestCliAdminWithDb (line 49) | class TestCliAdminWithDb:
    method setup_cli_call (line 52) | def setup_cli_call(self, cli_call, temp_db, cli_tokenizer_mock):
    method test_analyse_indexing (line 57) | def test_analyse_indexing(self, mock_func_factory, func, params):

FILE: test/python/cli/test_cmd_api.py
  function test_list_format (line 17) | def test_list_format(cli_call, call):
  function test_bad_format (line 22) | def test_bad_format(cli_call, call):
  class TestCliStatusCall (line 26) | class TestCliStatusCall:
    method setup_status_mock (line 29) | def setup_status_mock(self, monkeypatch):
    method test_status_simple (line 33) | def test_status_simple(self, cli_call, tmp_path):
    method test_status_json_format (line 38) | def test_status_json_format(self, cli_call, tmp_path, capsys):
  class TestCliDetailsCall (line 47) | class TestCliDetailsCall:
    method setup_status_mock (line 50) | def setup_status_mock(self, monkeypatch):
    method test_details_json_format (line 61) | def test_details_json_format(self, cli_call, tmp_path, capsys, params):
  class TestCliReverseCall (line 69) | class TestCliReverseCall:
    method setup_reverse_mock (line 72) | def setup_reverse_mock(self, monkeypatch):
    method test_reverse_simple (line 82) | def test_reverse_simple(self, cli_call, tmp_path, capsys):
    method test_reverse_extra_stuff (line 97) | def test_reverse_extra_stuff(self, cli_call, tmp_path, capsys, param, ...
    method test_reverse_format (line 106) | def test_reverse_format(self, cli_call, tmp_path, capsys):
  class TestCliLookupCall (line 116) | class TestCliLookupCall:
    method setup_lookup_mock (line 119) | def setup_lookup_mock(self, monkeypatch):
    method test_lookup_simple (line 129) | def test_lookup_simple(self, cli_call, tmp_path, capsys):
  function test_search (line 146) | def test_search(cli_call, tmp_path, capsys, monkeypatch, endpoint, params):

FILE: test/python/cli/test_cmd_import.py
  class TestCliImportWithDb (line 20) | class TestCliImportWithDb:
    method setup_cli_call (line 23) | def setup_cli_call(self, cli_call, temp_db, cli_tokenizer_mock):
    method test_import_missing_file (line 27) | def test_import_missing_file(self):
    method test_import_bad_file (line 30) | def test_import_bad_file(self):
    method test_import_full (line 34) | def test_import_full(self, mock_func_factory, async_mock_func_factory,
    method test_import_continue_load_data (line 70) | def test_import_continue_load_data(self, mock_func_factory, async_mock...
    method test_import_continue_indexing (line 87) | def test_import_continue_indexing(self, mock_func_factory, async_mock_...
    method test_import_continue_postprocess (line 104) | def test_import_continue_postprocess(self, mock_func_factory, async_mo...

FILE: test/python/cli/test_cmd_index.py
  class TestCliIndexWithDb (line 15) | class TestCliIndexWithDb:
    method setup_cli_call (line 18) | def setup_cli_call(self, cli_call, cli_tokenizer_mock):
    method test_index_empty_subset (line 22) | def test_index_empty_subset(self, monkeypatch, async_mock_func_factory...

FILE: test/python/cli/test_cmd_refresh.py
  class TestRefresh (line 17) | class TestRefresh:
    method setup_cli_call (line 20) | def setup_cli_call(self, cli_call, temp_db, cli_tokenizer_mock):
    method test_refresh_command (line 29) | def test_refresh_command(self, mock_func_factory, command, func):
    method test_refresh_word_count (line 36) | def test_refresh_word_count(self):
    method test_refresh_word_tokens (line 40) | def test_refresh_word_tokens(self):
    method test_refresh_postcodes (line 44) | def test_refresh_postcodes(self, async_mock_func_factory, mock_func_fa...
    method test_refresh_postcodes_no_place_table (line 53) | def test_refresh_postcodes_no_place_table(self):
    method test_refresh_create_functions (line 57) | def test_refresh_create_functions(self, mock_func_factory):
    method test_refresh_wikidata_file_not_found (line 64) | def test_refresh_wikidata_file_not_found(self, monkeypatch):
    method test_refresh_secondary_importance_file_not_found (line 69) | def test_refresh_secondary_importance_file_not_found(self):
    method test_refresh_secondary_importance_new_table (line 72) | def test_refresh_secondary_importance_new_table(self, mock_func_factory):
    method test_refresh_importance_computed_after_wiki_import (line 80) | def test_refresh_importance_computed_after_wiki_import(self, monkeypat...
    method test_refresh_objects (line 99) | def test_refresh_objects(self, params, mock_func_factory):
    method test_refresh_objects_bad_param (line 108) | def test_refresh_objects_bad_param(self, func, param, mock_func_factory):

FILE: test/python/cli/test_cmd_replication.py
  function tokenizer_mock (line 23) | def tokenizer_mock(monkeypatch):
  function init_status (line 45) | def init_status(temp_db_conn, status_table):
  function index_mock (line 50) | def index_mock(async_mock_func_factory, tokenizer_mock, init_status):
  function update_mock (line 55) | def update_mock(mock_func_factory, init_status, tokenizer_mock):
  class TestCliReplication (line 59) | class TestCliReplication:
    method setup_cli_call (line 62) | def setup_cli_call(self, cli_call, temp_db):
    method setup_update_function (line 66) | def setup_update_function(self, monkeypatch):
    method test_replication_command (line 78) | def test_replication_command(self, mock_func_factory, params, func):
    method test_replication_update_bad_interval (line 89) | def test_replication_update_bad_interval(self, monkeypatch):
    method test_replication_update_bad_interval_for_geofabrik (line 94) | def test_replication_update_bad_interval_for_geofabrik(self, monkeypat...
    method test_replication_update_continuous_no_index (line 100) | def test_replication_update_continuous_no_index(self):
    method test_replication_update_once_no_index (line 103) | def test_replication_update_once_no_index(self, update_mock, monkeypat...
    method test_replication_update_custom_osm2pgsql (line 109) | def test_replication_update_custom_osm2pgsql(self, monkeypatch, update...
    method test_replication_catchup (line 116) | def test_replication_catchup(self, placex_table, monkeypatch, index_mo...
    method test_replication_update_custom_threads (line 122) | def test_replication_update_custom_threads(self, update_mock):
    method test_replication_update_continuous (line 127) | def test_replication_update_continuous(self, index_mock):
    method test_replication_update_continuous_no_change (line 136) | def test_replication_update_continuous_no_change(self, mock_func_factory,

FILE: test/python/config/test_config.py
  function make_config (line 18) | def make_config():
  function make_config_path (line 28) | def make_config_path(tmp_path):
  function test_no_project_dir (line 42) | def test_no_project_dir(make_config):
  function test_prefer_project_setting_over_default (line 49) | def test_prefer_project_setting_over_default(make_config, val, tmp_path):
  function test_prefer_os_environ_over_project_setting (line 58) | def test_prefer_os_environ_over_project_setting(make_config, monkeypatch...
  function test_prefer_os_environ_can_unset_project_setting (line 69) | def test_prefer_os_environ_can_unset_project_setting(make_config, monkey...
  function test_get_os_env_add_defaults (line 80) | def test_get_os_env_add_defaults(make_config, monkeypatch):
  function test_get_os_env_prefer_os_environ (line 88) | def test_get_os_env_prefer_os_environ(make_config, monkeypatch):
  function test_get_libpq_dsn_convert_default (line 96) | def test_get_libpq_dsn_convert_default(make_config):
  function test_get_libpq_dsn_convert_php (line 102) | def test_get_libpq_dsn_convert_php(make_config, monkeypatch):
  function test_get_libpq_dsn_convert_php_special_chars (line 114) | def test_get_libpq_dsn_convert_php_special_chars(make_config, monkeypatc...
  function test_get_libpq_dsn_convert_libpq (line 123) | def test_get_libpq_dsn_convert_libpq(make_config, monkeypatch):
  function test_get_bool (line 135) | def test_get_bool(make_config, monkeypatch, value, result):
  function test_get_bool_empty (line 143) | def test_get_bool_empty(make_config):
  function test_get_int_success (line 152) | def test_get_int_success(make_config, monkeypatch, value, result):
  function test_get_int_bad_values (line 161) | def test_get_int_bad_values(make_config, monkeypatch, value):
  function test_get_int_empty (line 170) | def test_get_int_empty(make_config):
  function test_get_str_list_success (line 182) | def test_get_str_list_success(make_config, monkeypatch, value, outlist):
  function test_get_str_list_empty (line 190) | def test_get_str_list_empty(make_config):
  function test_get_path_empty (line 196) | def test_get_path_empty(make_config):
  function test_get_path_absolute (line 203) | def test_get_path_absolute(make_config, monkeypatch, tmp_path):
  function test_get_path_re
Condensed preview — 725 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,064K chars).
[
  {
    "path": ".codespellrc",
    "chars": 396,
    "preview": "# https://github.com/codespell-project/codespell\n\n[codespell]\nskip = ./man/nominatim.1,data,./docs/styles.css,lib-php,mo"
  },
  {
    "path": ".flake8",
    "chars": 273,
    "preview": "[flake8]\nmax-line-length = 100\nmax-doc-length = 100\nextend-ignore =\n    # something == None constructs are needed for SQ"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 56,
    "preview": "github: lonvia\ncustom: \"https://nominatim.org/funding/\"\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 382,
    "preview": "contact_links:\n  - name: Nominatim Discussions\n    url: https://github.com/osm-search/Nominatim/discussions\n    about: A"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 773,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n<!-- Before o"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/report-issues-with-search-results.md",
    "chars": 1764,
    "preview": "---\nname: Report issues with search results\nabout: You have searched something with Nominatim and did not get the expect"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/report-problems-with-the-software.md",
    "chars": 1107,
    "preview": "---\nname: Report problems with the software\nabout: You have your own installation of Nominatim and found a bug.\ntitle: '"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 784,
    "preview": "## Summary\n<!-- Describe the purpose of your pull request and, if present, link to existing issues. -->\n\n## AI usage\n<!-"
  },
  {
    "path": ".github/actions/build-nominatim/action.yml",
    "chars": 1505,
    "preview": "name: 'Build Nominatim'\n\ninputs:\n    dependencies:\n        description: 'Where to install dependencies from (pip/apt)'\n "
  },
  {
    "path": ".github/actions/setup-postgresql/action.yml",
    "chars": 1779,
    "preview": "name: 'Setup Postgresql and Postgis'\n\ndescription: 'Installs PostgreSQL and PostGIS and configures it for CI tests'\n\ninp"
  },
  {
    "path": ".github/actions/setup-postgresql-windows/action.yml",
    "chars": 3962,
    "preview": "name: 'Setup Postgresql and Postgis on Windows'\n\ndescription: 'Installs PostgreSQL and PostGIS for Windows and configure"
  },
  {
    "path": ".github/workflows/ci-tests.yml",
    "chars": 15649,
    "preview": "name: CI Tests\n\non: [ push, pull_request ]\n\njobs:\n    create-archive:\n        runs-on: ubuntu-latest\n\n        steps:\n   "
  },
  {
    "path": ".gitignore",
    "chars": 109,
    "preview": "*.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",
    "chars": 0,
    "preview": ""
  },
  {
    "path": ".mypy.ini",
    "chars": 183,
    "preview": "[mypy]\nplugins = sqlalchemy.ext.mypy.plugin\n\n[mypy-icu.*]\nignore_missing_imports = True\n\n[mypy-asyncpg.*]\nignore_missing"
  },
  {
    "path": "AUTHORS",
    "chars": 269,
    "preview": "Nominatim was written by:\n\n* Brian Quinion\n* Sarah Hoffmann\n* Marc Tobias Metten\n\n* markigail\n* AntoJvlt\n* gemo1011\n* da"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 5724,
    "preview": "# Nominatim contribution guidelines\n\n## Reporting Bugs\n\nBugs can be reported at https://github.com/openstreetmap/Nominat"
  },
  {
    "path": "COPYING",
    "chars": 34509,
    "preview": "GNU GENERAL PUBLIC LICENSE\nVersion 3, 29 June 2007\n\nCopyright © 2007 Free Software Foundation, Inc. <https://fsf.org/>\n\n"
  },
  {
    "path": "ChangeLog",
    "chars": 31190,
    "preview": "5.3.0\n * reorganise postcode and interpolation handling into separate tables\n * add table for handling associatedStreet "
  },
  {
    "path": "LICENSES/Apache-2.0.txt",
    "chars": 11358,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "LICENSES/GPL-2.0-only.txt",
    "chars": 18092,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Fr"
  },
  {
    "path": "Makefile",
    "chars": 816,
    "preview": "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 bui"
  },
  {
    "path": "README.md",
    "chars": 3112,
    "preview": "[![Build Status](https://github.com/osm-search/Nominatim/workflows/CI%20Tests/badge.svg)](https://github.com/osm-search/"
  },
  {
    "path": "SECURITY.md",
    "chars": 1764,
    "preview": "# Security Policy\n\n## Supported Versions\n\nAll Nominatim releases receive security updates for two years.\n\nThe following "
  },
  {
    "path": "VAGRANT.md",
    "chars": 4725,
    "preview": "# Install Nominatim in a virtual machine for development and testing\n\nThis document describes how you can install Nomina"
  },
  {
    "path": "Vagrantfile",
    "chars": 3271,
    "preview": "# -*- mode: ruby -*-\n# vi: set ft=ruby :\n\nVagrant.configure(\"2\") do |config|\n  # Apache webserver\n  config.vm.network \"f"
  },
  {
    "path": "data/words.sql",
    "chars": 371338,
    "preview": "--\n-- PostgreSQL database dump\n--\n\nSET statement_timeout = 0;\nSET client_encoding = 'UTF8';\nSET standard_conforming_stri"
  },
  {
    "path": "docs/admin/Advanced-Installations.md",
    "chars": 5952,
    "preview": "# Advanced installations\n\nThis page contains instructions for setting up multiple countries in \nyour Nominatim database."
  },
  {
    "path": "docs/admin/Deployment-Python.md",
    "chars": 4403,
    "preview": "# Deploying the Nominatim Python frontend\n\nNominatim can be run as a Python-based\n[ASGI web application](https://asgi.re"
  },
  {
    "path": "docs/admin/Faq.md",
    "chars": 3944,
    "preview": "# Troubleshooting Nominatim Installations\n\n## Installation Issues\n\n### Can a stopped/killed import process be resumed?\n\n"
  },
  {
    "path": "docs/admin/Import.md",
    "chars": 12948,
    "preview": "# Importing the Database\n\nThe following instructions explain how to create a Nominatim database\nfrom an OSM planet file."
  },
  {
    "path": "docs/admin/Installation.md",
    "chars": 5121,
    "preview": "# Basic Installation\n\nThis page contains generic installation instructions for Nominatim and its\nprerequisites. There ar"
  },
  {
    "path": "docs/admin/Maintenance.md",
    "chars": 3273,
    "preview": "This chapter describes the various operations the Nominatim database administrator\nmay use to clean and maintain the dat"
  },
  {
    "path": "docs/admin/Migration.md",
    "chars": 17054,
    "preview": "# Database Migrations\n\nNominatim offers automatic migrations for versions 4.3+. Please follow\nthe following steps:\n\n* St"
  },
  {
    "path": "docs/admin/Setup-Nominatim-UI.md",
    "chars": 5075,
    "preview": "# Setting up the Nominatim UI\n\nNominatim is a search API, it does not provide a website interface on its\nown. [nominatim"
  },
  {
    "path": "docs/admin/Update.md",
    "chars": 7109,
    "preview": "# Updating the Database\n\nThere are many different ways to update your Nominatim database.\nThe following section describe"
  },
  {
    "path": "docs/api/Details.md",
    "chars": 5637,
    "preview": "# Place details\n\nShow all details about a single place saved in the database.\n\nThis API endpoint is meant for visual ins"
  },
  {
    "path": "docs/api/Faq.md",
    "chars": 4716,
    "preview": "# Frequently Asked Questions\n\n## API Results\n\n#### 1. The address of my search results contains far-away places that don"
  },
  {
    "path": "docs/api/Lookup.md",
    "chars": 8724,
    "preview": "# Address lookup\n\nThe lookup API allows to query the address and other details of one or\nmultiple OSM objects like node,"
  },
  {
    "path": "docs/api/Output.md",
    "chars": 15325,
    "preview": "# Place Output\n\nThe [/reverse](Reverse.md), [/search](Search.md) and [/lookup](Lookup.md)\nAPI calls produce very similar"
  },
  {
    "path": "docs/api/Overview.md",
    "chars": 692,
    "preview": "This section describes the API V1 of the Nominatim web service. The\nservice offers the following endpoints:\n\n * __[/sear"
  },
  {
    "path": "docs/api/Reverse.md",
    "chars": 11922,
    "preview": "# Reverse Geocoding\n\nReverse geocoding generates an address from a coordinate given as\nlatitude and longitude.\n\n## How i"
  },
  {
    "path": "docs/api/Search.md",
    "chars": 19828,
    "preview": "# Search queries\n\nThe search API allows you to look up a location from a textual description\nor address. Nominatim suppo"
  },
  {
    "path": "docs/api/Status.md",
    "chars": 1653,
    "preview": "# Status\n\nReport on the state of the service and database. Useful for checking if the\nservice is up and running. The JSO"
  },
  {
    "path": "docs/customize/Country-Settings.md",
    "chars": 5972,
    "preview": "# Customizing Per-Country Data\n\nWhenever an OSM is imported into Nominatim, the object is first assigned\na country. Nomi"
  },
  {
    "path": "docs/customize/Import-Styles.md",
    "chars": 26921,
    "preview": "# Configuring the Import of OSM data\n\nIn the very first step of a Nominatim import, OSM data is loaded into the\ndatabase"
  },
  {
    "path": "docs/customize/Importance.md",
    "chars": 2492,
    "preview": "## Importance\n\nSearch requests can yield multiple results which match equally well with\nthe original query. In such case"
  },
  {
    "path": "docs/customize/Overview.md",
    "chars": 1185,
    "preview": "Nominatim comes with a predefined set of configuration options that should\nwork for most standard installations. If you "
  },
  {
    "path": "docs/customize/Postcodes.md",
    "chars": 1761,
    "preview": "# External postcode data\n\nNominatim creates a table of known postcode centroids during import. This table\nis used for se"
  },
  {
    "path": "docs/customize/Ranking.md",
    "chars": 5073,
    "preview": "# Place Ranking in Nominatim\n\nNominatim uses two metrics to rank a place: search rank and address rank.\nThis chapter exp"
  },
  {
    "path": "docs/customize/Result-Formatting.md",
    "chars": 9313,
    "preview": "# Changing the Appearance of Results in the Server API\n\nThe Nominatim Server API offers a number of formatting options t"
  },
  {
    "path": "docs/customize/SQLite.md",
    "chars": 1947,
    "preview": "A Nominatim database can be converted into an SQLite database and used as\na read-only source for geocoding queries. This"
  },
  {
    "path": "docs/customize/Settings.md",
    "chars": 27211,
    "preview": "This section provides a reference of all configuration parameters that can\nbe used with Nominatim.\n\n# Configuring Nomina"
  },
  {
    "path": "docs/customize/Special-Phrases.md",
    "chars": 1797,
    "preview": "# Special phrases\n\n## Importing OSM user-maintained special phrases\n\nAs described in the [Import section](../admin/Impor"
  },
  {
    "path": "docs/customize/Tiger.md",
    "chars": 996,
    "preview": "# Installing TIGER housenumber data for the US\n\nNominatim is able to use the official [TIGER](https://www.census.gov/geo"
  },
  {
    "path": "docs/customize/Tokenizers.md",
    "chars": 14574,
    "preview": "# Tokenizers\n\nThe tokenizer module in Nominatim is responsible for analysing the names given\nto OSM objects and the term"
  },
  {
    "path": "docs/develop/Database-Layout.md",
    "chars": 10434,
    "preview": "# Database Layout\n\n### Import tables\n\nOSM data is initially imported using [osm2pgsql](https://osm2pgsql.org).\nNominatim"
  },
  {
    "path": "docs/develop/Development-Environment.md",
    "chars": 5116,
    "preview": "# Setting up Nominatim for Development\n\nThis chapter gives an overview how to set up Nominatim for development\nand how t"
  },
  {
    "path": "docs/develop/ICU-Tokenizer-Modules.md",
    "chars": 10496,
    "preview": "# Writing custom sanitizer and token analysis modules for the ICU tokenizer\n\nThe [ICU tokenizer](../customize/Tokenizers"
  },
  {
    "path": "docs/develop/Indexing.md",
    "chars": 7053,
    "preview": "# Indexing Places\n\nIn Nominatim, the word __indexing__ refers to the process that takes the raw\nOpenStreetMap data from "
  },
  {
    "path": "docs/develop/Testing.md",
    "chars": 5074,
    "preview": "# Nominatim Test Suite\n\nThis chapter describes the tests in the `/test` directory, how they are\nstructured and how to ex"
  },
  {
    "path": "docs/develop/Tokenizers.md",
    "chars": 12351,
    "preview": "# Tokenizers\n\nThe tokenizer is the component of Nominatim that is responsible for\nanalysing names of OSM objects and que"
  },
  {
    "path": "docs/develop/address-tables.plantuml",
    "chars": 671,
    "preview": "@startuml\nskinparam monochrome true\nskinparam ObjectFontStyle bold\n\nmap search_name_X {\n  place_id => BIGINT\n  address_r"
  },
  {
    "path": "docs/develop/data-sources.md",
    "chars": 1170,
    "preview": "# Additional Data Sources\n\nThis guide explains how data sources other than OpenStreetMap mentioned in\nthe install instru"
  },
  {
    "path": "docs/develop/osm2pgsql-tables.plantuml",
    "chars": 1145,
    "preview": "@startuml\nskinparam monochrome true\nskinparam ObjectFontStyle bold\n\nmap planet_osm_nodes #eee {\n  id => BIGINT\n  lat => "
  },
  {
    "path": "docs/develop/overview.md",
    "chars": 1281,
    "preview": "# Basic Architecture\n\nNominatim provides geocoding based on OpenStreetMap data. It uses a PostgreSQL\ndatabase as a backe"
  },
  {
    "path": "docs/develop/parenting-flow.plantuml",
    "chars": 585,
    "preview": "@startuml\nskinparam monochrome true\n\nstart\n\nif (has 'addr:street'?) then (yes)\n  if (street with that name\\n nearby?) th"
  },
  {
    "path": "docs/develop/search-tables.plantuml",
    "chars": 2177,
    "preview": "@startuml\nskinparam monochrome true\nskinparam ObjectFontStyle bold\n\nleft to right direction\n\nmap placex {\n  place_id => "
  },
  {
    "path": "docs/extra.css",
    "chars": 580,
    "preview": ".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"
  },
  {
    "path": "docs/index.md",
    "chars": 810,
    "preview": "Nominatim (from the Latin, 'by name') is a tool to search OSM data by name and\naddress and to generate synthetic address"
  },
  {
    "path": "docs/library/Configuration.md",
    "chars": 1341,
    "preview": "# Configuration\n\nWhen using Nominatim through the library, it can be configured in exactly\nthe same way as when running "
  },
  {
    "path": "docs/library/Getting-Started.md",
    "chars": 10793,
    "preview": "# Getting Started\n\nThe Nominatim search frontend is implemented as a Python library and can as\nsuch directly be used in "
  },
  {
    "path": "docs/library/Input-Parameter-Types.md",
    "chars": 1298,
    "preview": "# Input Parameter Types\n\nThis page describes in more detail some of the input parameter types used\nin the query function"
  },
  {
    "path": "docs/library/Low-Level-DB-Access.md",
    "chars": 1838,
    "preview": "# Low-level connections\n\nThe `NominatimAPIAsync` class allows to directly access the underlying\ndatabase connection to e"
  },
  {
    "path": "docs/library/NominatimAPI.md",
    "chars": 845,
    "preview": "# The Nominatim API classes\n\nThe API classes are the core object of the search library. Always instantiate\none of these "
  },
  {
    "path": "docs/library/Result-Handling.md",
    "chars": 2191,
    "preview": "# Result handling\n\nThe search functions of the Nominatim API always return a result object\nwith the raw information abou"
  },
  {
    "path": "docs/mk_install_instructions.py",
    "chars": 1128,
    "preview": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C"
  },
  {
    "path": "docs/styles.css",
    "chars": 4471,
    "preview": ".codehilite .hll { background-color: #ffffcc }\n.codehilite  { background: #f0f0f0; }\n.codehilite .c { color: #60a0b0; fo"
  },
  {
    "path": "lib-lua/flex-base.lua",
    "chars": 419,
    "preview": "-- This is just an alias for the Nominatim themepark theme module\nlocal flex = require('themes/nominatim/init')\n\nfunctio"
  },
  {
    "path": "lib-lua/import-address.lua",
    "chars": 142,
    "preview": "-- This is just an alias for the Nominatim themepark address topic\nlocal flex = require('flex-base')\n\nflex.load_topic('a"
  },
  {
    "path": "lib-lua/import-admin.lua",
    "chars": 138,
    "preview": "-- This is just an alias for the Nominatim themepark admin topic\nlocal flex = require('flex-base')\n\nflex.load_topic('adm"
  },
  {
    "path": "lib-lua/import-extratags.lua",
    "chars": 161,
    "preview": "-- This is just an alias for the Nominatim themepark full topic\nlocal flex = require('flex-base')\n\nflex.load_topic('full"
  },
  {
    "path": "lib-lua/import-full.lua",
    "chars": 136,
    "preview": "-- This is just an alias for the Nominatim themepark full topic\nlocal flex = require('flex-base')\n\nflex.load_topic('full"
  },
  {
    "path": "lib-lua/import-street.lua",
    "chars": 140,
    "preview": "-- This is just an alias for the Nominatim themepark street topic\nlocal flex = require('flex-base')\n\nflex.load_topic('st"
  },
  {
    "path": "lib-lua/taginfo.lua",
    "chars": 4276,
    "preview": "-- Prints taginfo project description in the standard output\n--\n\n-- create fake \"osm2pgsql\" table for flex-base, origina"
  },
  {
    "path": "lib-lua/themes/nominatim/init.lua",
    "chars": 33944,
    "preview": "-- Nominatim themepark theme.\n--\n-- The Nominatim theme creates a fixed set of import tables for use with\n-- Nominatim. "
  },
  {
    "path": "lib-lua/themes/nominatim/presets.lua",
    "chars": 12864,
    "preview": "-- Defines defaults used in the topic definitions.\n\nlocal module = {}\n\n-- Helper functions\n\nlocal function group_merge(g"
  },
  {
    "path": "lib-lua/themes/nominatim/topics/address.lua",
    "chars": 565,
    "preview": "local _, flex, cfg = ...\n\nflex.set_main_tags('admin')\nflex.modify_main_tags('street/' .. (cfg.street_theme or 'default')"
  },
  {
    "path": "lib-lua/themes/nominatim/topics/admin.lua",
    "chars": 404,
    "preview": "local _, flex, cfg = ...\n\nflex.set_main_tags('admin')\n\nflex.set_name_tags('core')\n\nflex.set_address_tags('core')\nflex.se"
  },
  {
    "path": "lib-lua/themes/nominatim/topics/full.lua",
    "chars": 743,
    "preview": "local _, flex, cfg = ...\n\nlocal group\nif cfg.with_extratags then\n    group = 'extra'\nelse\n    group = 'delete'\nend\n\nflex"
  },
  {
    "path": "lib-lua/themes/nominatim/topics/street.lua",
    "chars": 531,
    "preview": "local _, flex, cfg = ...\n\nflex.set_main_tags('admin')\nflex.modify_main_tags('street/' .. (cfg.street_theme or 'default')"
  },
  {
    "path": "lib-sql/functions/associated_street_triggers.sql",
    "chars": 1077,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/functions/importance.sql",
    "chars": 7224,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/functions/interpolation.sql",
    "chars": 12794,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/functions/partition-functions.sql",
    "chars": 10807,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/functions/place_triggers.sql",
    "chars": 10471,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/functions/placex_triggers.sql",
    "chars": 53970,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/functions/postcode_triggers.sql",
    "chars": 3760,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/functions/ranking.sql",
    "chars": 8053,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/functions/updates.sql",
    "chars": 2751,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/functions/utils.sql",
    "chars": 20374,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/functions.sql",
    "chars": 820,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/grants.sql",
    "chars": 1648,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/indices.sql",
    "chars": 4385,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/partition-tables.src.sql",
    "chars": 2189,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/postcode_tables.sql",
    "chars": 625,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/table-triggers.sql",
    "chars": 2208,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/tables/addressline.sql",
    "chars": 636,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/tables/entrance.sql",
    "chars": 613,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/tables/import_reports.sql",
    "chars": 921,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/tables/importance_tables.sql",
    "chars": 544,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/tables/interpolation.sql",
    "chars": 1231,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/tables/location_area.sql",
    "chars": 1027,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/tables/nominatim_properties.sql",
    "chars": 339,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/tables/placex.sql",
    "chars": 3563,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/tables/postcodes.sql",
    "chars": 1271,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/tables/search_name.sql",
    "chars": 714,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/tables/status.sql",
    "chars": 577,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/tables/tiger.sql",
    "chars": 519,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/tables.sql",
    "chars": 768,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/tiger_import_finish.sql",
    "chars": 1279,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/tiger_import_start.sql",
    "chars": 6289,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "lib-sql/tokenizer/icu_tokenizer.sql",
    "chars": 8621,
    "preview": "-- SPDX-License-Identifier: GPL-2.0-only\n--\n-- This file is part of Nominatim. (https://nominatim.org)\n--\n-- Copyright ("
  },
  {
    "path": "man/create-manpage.py",
    "chars": 233,
    "preview": "import sys\nimport os\nfrom pathlib import Path\n\nsys.path.append(str(Path(__file__, '..', '..', 'src').resolve()))\n\nfrom n"
  },
  {
    "path": "man/nominatim.1",
    "chars": 30055,
    "preview": ".TH nominatim \"1\" Manual\n.SH NAME\nnominatim\n.SH SYNOPSIS\n.B nominatim\n[-h] [--version] {import,freeze,replication,specia"
  },
  {
    "path": "mkdocs.yml",
    "chars": 3538,
    "preview": "site_name: Nominatim Manual\ntheme:\n  font: false\n  name: material\n  features:\n    - navigation.tabs\n    - toc.integrate\n"
  },
  {
    "path": "munin/nominatim_importlag",
    "chars": 1199,
    "preview": "#!/bin/sh\n#\n# Plugin to monitor the age of the imported data in the rendering db\n#\n# Can be configured through libpq env"
  },
  {
    "path": "munin/nominatim_query_speed",
    "chars": 3572,
    "preview": "#!/usr/bin/perl -w\n# Plugin to monitor response time of search queries.\n#\n# Based on a plugin by Dalibo <cedric.villemai"
  },
  {
    "path": "munin/nominatim_requests",
    "chars": 1389,
    "preview": "#!/bin/sh\n#\n# Plugin to monitor the types of requests made to the API\n#\n# Can be configured through libpq environment va"
  },
  {
    "path": "nominatim-cli.py",
    "chars": 473,
    "preview": "#!/usr/bin/env python3\n# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominati"
  },
  {
    "path": "packaging/nominatim-api/COPYING",
    "chars": 34509,
    "preview": "GNU GENERAL PUBLIC LICENSE\nVersion 3, 29 June 2007\n\nCopyright © 2007 Free Software Foundation, Inc. <https://fsf.org/>\n\n"
  },
  {
    "path": "packaging/nominatim-api/README.md",
    "chars": 1151,
    "preview": "# Nominatim - Frontend Library\n\nNominatim is a tool to search OpenStreetMap data\nby name and address (geocoding) and to "
  },
  {
    "path": "packaging/nominatim-api/extra_src/paths.py",
    "chars": 419,
    "preview": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C"
  },
  {
    "path": "packaging/nominatim-api/pyproject.toml",
    "chars": 1638,
    "preview": "[project]\nname = \"nominatim-api\"\ndescription = \"A tool for building a database of OpenStreetMap for geocoding and for se"
  },
  {
    "path": "packaging/nominatim-db/COPYING",
    "chars": 34509,
    "preview": "GNU GENERAL PUBLIC LICENSE\nVersion 3, 29 June 2007\n\nCopyright © 2007 Free Software Foundation, Inc. <https://fsf.org/>\n\n"
  },
  {
    "path": "packaging/nominatim-db/README.md",
    "chars": 1499,
    "preview": "# Nominatim - DB Backend\n\nNominatim is a tool to search OpenStreetMap data\nby name and address (geocoding) and to genera"
  },
  {
    "path": "packaging/nominatim-db/extra_src/nominatim_db/paths.py",
    "chars": 461,
    "preview": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# This file is part of Nominatim. (https://nominatim.org)\n#\n# Copyright (C"
  },
  {
    "path": "packaging/nominatim-db/pyproject.toml",
    "chars": 2007,
    "preview": "[project]\nname = \"nominatim-db\"\ndescription = \"A tool for building a database of OpenStreetMap for geocoding and for sea"
  },
  {
    "path": "packaging/nominatim-db/scripts/nominatim",
    "chars": 63,
    "preview": "#!python3\n\nfrom nominatim_db import cli\n\nexit(cli.nominatim())\n"
  },
  {
    "path": "settings/address-levels.json",
    "chars": 6510,
    "preview": "[\n{ \"tags\" : {\n      \"place\" : {\n          \"sea\" : [2, 0],\n          \"island\" : [17, 0],\n          \"islet\" : [20, 0],\n  "
  },
  {
    "path": "settings/country-names/ad.yaml",
    "chars": 2484,
    "preview": "name: \n    default: Andorra\n    ab: Андора\n    af: Andorra\n    ak: Andora\n    am: አንዶራ\n    an: Andorra\n    ar: أندورا\n  "
  },
  {
    "path": "settings/country-names/ae.yaml",
    "chars": 3969,
    "preview": "name: \n    default: الإمارات العربية المتحدة\n    af: Verenigde Arabiese Emirate\n    am: የተባበሩት የዓረብ ግዛቶች\n    an: Emirato"
  },
  {
    "path": "settings/country-names/af.yaml",
    "chars": 3068,
    "preview": "name: \n    default: افغانستان\n    af: Afghanistan\n    ak: Afganistan\n    am: አፍጋኒስታን\n    an: Afganistán\n    ar: أفغانستا"
  },
  {
    "path": "settings/country-names/ag.yaml",
    "chars": 3793,
    "preview": "name: \n    default: Antigua and Barbuda\n    af: Antigua en Barbuda\n    ak: Antigua ne Baabuda\n    am: አንቲጋ እና ባርቡዳ\n    a"
  },
  {
    "path": "settings/country-names/ai.yaml",
    "chars": 1315,
    "preview": "name: \n    default: Anguilla\n    af: Anguilla\n    an: Anguila\n    ar: أنجويلا\n    az: Angilya\n    ba: Ангилья\n    be: Ан"
  },
  {
    "path": "settings/country-names/al.yaml",
    "chars": 2761,
    "preview": "name: \n    default: Shqipëria\n    ab: Арнауыҭтәыла\n    af: Albanië\n    ak: Albania\n    am: አልባኒያ\n    an: Albania\n    ar:"
  },
  {
    "path": "settings/country-names/am.yaml",
    "chars": 2715,
    "preview": "name: \n    default: Հայաստան\n    ab: Ермантәыла\n    af: Armenië\n    ak: Armenia\n    am: አርመኒያ\n    an: Armenia\n    ar: أر"
  },
  {
    "path": "settings/country-names/ao.yaml",
    "chars": 2284,
    "preview": "name: \n    default: Angola\n    af: Angola\n    am: አንጎላ\n    an: Angola\n    ar: أنغولا\n    az: Anqola\n    ba: Анго́ла\n    "
  },
  {
    "path": "settings/country-names/ar.yaml",
    "chars": 2934,
    "preview": "name: \n    default: Argentina\n    af: Argentinië\n    ak: Agyɛntina\n    am: አርጀንቲና\n    an: Archentina\n    ar: الأرجنتين\n "
  },
  {
    "path": "settings/country-names/at.yaml",
    "chars": 2619,
    "preview": "name: \n    default: Österreich\n    ab: Австриа\n    af: Oostenryk\n    ak: Austria\n    am: ኦስትሪያ\n    an: Austria\n    ar: ا"
  },
  {
    "path": "settings/country-names/au.yaml",
    "chars": 2836,
    "preview": "name: \n    default: Australia\n    ab: Австралиа\n    af: Australië\n    am: አውስትራልያ\n    an: Australia\n    ar: أستراليا\n   "
  },
  {
    "path": "settings/country-names/az.yaml",
    "chars": 3130,
    "preview": "name: \n    default: Azərbaycan\n    ab: Азербаиџьан\n    af: Azerbeidjan\n    ak: Azerbaijan\n    am: አዘርባይጃን\n    an: Azerba"
  },
  {
    "path": "settings/country-names/ba.yaml",
    "chars": 4525,
    "preview": "name: \n    default: Bosna i Hercegovina / Босна и Херцеговина\n    af: Bosnië en Herzegowina\n    ak: Bosnia and Herzegovi"
  },
  {
    "path": "settings/country-names/bb.yaml",
    "chars": 2129,
    "preview": "name: \n    default: Barbados\n    af: Barbados\n    am: ባርቤዶስ\n    an: Barbados\n    ar: باربادوس\n    ay: Barbados\n    az: B"
  },
  {
    "path": "settings/country-names/bd.yaml",
    "chars": 762,
    "preview": "name: \n    default: Bangladesh\n    af: Bangladesj\n    ar: بنغلاديش\n    az: Banqladeş\n    be: Бангладэш\n    br: Banglades"
  },
  {
    "path": "settings/country-names/be.yaml",
    "chars": 2539,
    "preview": "name: \n    default: België / Belgique / Belgien\n    af: België\n    ak: Belgium\n    am: ቤልጅግ\n    an: Belchica\n    ar: بلج"
  },
  {
    "path": "settings/country-names/bf.yaml",
    "chars": 3089,
    "preview": "name: \n    default: Burkina Faso\n    af: Burkina Faso\n    ak: Burkina Faso\n    am: ቡርኪና ፋሶ\n    an: Burkina Faso\n    ar: "
  },
  {
    "path": "settings/country-names/bg.yaml",
    "chars": 2672,
    "preview": "name: \n    default: Бългaрия\n    ab: Болга́риа\n    af: Bulgarye\n    ak: Bulgaria\n    am: ቡልጋሪያ\n    an: Bulgaria\n    ar: "
  },
  {
    "path": "settings/country-names/bh.yaml",
    "chars": 2356,
    "preview": "name: \n    default: البحرين\n    af: Bahrein\n    ak: Baren\n    am: ባሕሬን\n    an: Bahrein\n    ar: البحرين\n    as: বাহৰেইন\n "
  },
  {
    "path": "settings/country-names/bi.yaml",
    "chars": 2375,
    "preview": "name: \n    default: Burundi\n    af: Burundi\n    am: ቡሩንዲ\n    an: Burundi\n    ar: بوروندي\n    az: Burundi\n    ba: Буру́нд"
  },
  {
    "path": "settings/country-names/bj.yaml",
    "chars": 2115,
    "preview": "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: Бенин"
  },
  {
    "path": "settings/country-names/bm.yaml",
    "chars": 695,
    "preview": "name: \n    default: Bermuda\n    ar: برمودا\n    be: Бярмуды\n    br: Bermudez\n    ca: Bermudes\n    cs: Bermudy\n    da: Ber"
  },
  {
    "path": "settings/country-names/bn.yaml",
    "chars": 2244,
    "preview": "name: \n    default: Brunei\n    af: Broenei\n    ak: Brunae\n    am: ብሩናይ\n    an: Brunei\n    ar: بروناي\n    as: ব্ৰুণেই\n   "
  },
  {
    "path": "settings/country-names/bo.yaml",
    "chars": 2505,
    "preview": "name: \n    default: Bolivia\n    ab: Боли́виа\n    af: Bolivië\n    am: ቦሊቪያ\n    an: Bolivia\n    ar: بوليفيا\n    ay: Wuliwy"
  },
  {
    "path": "settings/country-names/br.yaml",
    "chars": 2608,
    "preview": "name: \n    default: Brasil\n    af: Brasilië\n    ak: Brazil\n    am: ብራዚል\n    an: Brasil\n    ar: البَرَازِيل\n    as: ব্ৰাজ"
  },
  {
    "path": "settings/country-names/bs.yaml",
    "chars": 2444,
    "preview": "name: \n    default: The Bahamas\n    af: Bahamas\n    ak: Bahama\n    am: ባሃማስ\n    an: Bahamas\n    ar: جزر باهاماس\n    ay: "
  },
  {
    "path": "settings/country-names/bt.yaml",
    "chars": 2208,
    "preview": "name: \n    default: འབྲུག་ཡུལ་\n    ab: Бутан\n    af: Bhoetan\n    ak: Butan\n    am: ቡታን\n    an: Bután\n    ar: بوتان\n    a"
  },
  {
    "path": "settings/country-names/bw.yaml",
    "chars": 2603,
    "preview": "name: \n    default: Botswana\n    af: Botswana\n    ak: Bɔtswana\n    am: ቦትስዋና\n    an: Botswana\n    ar: بوتسوانا\n    az: B"
  },
  {
    "path": "settings/country-names/by.yaml",
    "chars": 2364,
    "preview": "name: \n    default: Беларусь\n    af: Wit-Rusland\n    am: ቤላሩስ\n    an: Belarrusia\n    ar: روسيا البيضاء\n    az: Belarus\n "
  },
  {
    "path": "settings/country-names/bz.yaml",
    "chars": 2065,
    "preview": "name: \n    default: Belize\n    af: Belize\n    ak: Beliz\n    am: ቤሊዝ\n    an: Belize\n    ar: بليز\n    ay: Wilisi\n    az: B"
  },
  {
    "path": "settings/country-names/ca.yaml",
    "chars": 2261,
    "preview": "name: \n    default: Canada\n    ab: Канада\n    af: Kanada\n    am: ካናዳ\n    an: Canadá\n    ar: كندا\n    as: কানাডা\n    av: "
  },
  {
    "path": "settings/country-names/cd.yaml",
    "chars": 4500,
    "preview": "name: \n    default: République démocratique du Congo\n    af: Demokratiese Republiek van die Kongo\n    am: ኮንጎ ዲሞክራሲያዊ ሪፐ"
  },
  {
    "path": "settings/country-names/cf.yaml",
    "chars": 4115,
    "preview": "name: \n    default: Ködörösêse tî Bêafrîka - République Centrafricaine\n    af: Sentraal-Afrikaanse Republiek\n    am: የመካ"
  },
  {
    "path": "settings/country-names/cg.yaml",
    "chars": 2968,
    "preview": "name: \n    default: Congo\n    af: Republiek van die Kongo\n    am: ኮንጎ ሪፐብሊክ\n    an: Republica d'o Congo\n    ar: جمهورية "
  },
  {
    "path": "settings/country-names/ch.yaml",
    "chars": 2338,
    "preview": "name: \n    default: Schweiz/Suisse/Svizzera/Svizra\n    af: Switserland\n    am: ስዊዘርላንድ\n    an: Suiza\n    ar: سويسرا\n    "
  },
  {
    "path": "settings/country-names/ci.yaml",
    "chars": 2913,
    "preview": "name: \n    default: Côte d’Ivoire\n    af: Ivoorkus\n    am: ኮት ዲቯር\n    an: Costa de Vori\n    ar: ساحل العاج\n    az: Fil D"
  },
  {
    "path": "settings/country-names/ck.yaml",
    "chars": 2655,
    "preview": "name: \n    default: Kūki 'Āirani\n    af: Cookeilande\n    ak: Kook Nsupɔw\n    am: ኩክ ደሴቶች\n    an: islas Cook\n    ar: جزر "
  },
  {
    "path": "settings/country-names/cl.yaml",
    "chars": 2342,
    "preview": "name: \n    default: Chile\n    ab: Чили\n    af: Chili\n    ak: Chile\n    am: ቺሌ\n    an: Chile\n    ar: تشيلي\n    as: চিলি\n "
  },
  {
    "path": "settings/country-names/cm.yaml",
    "chars": 2156,
    "preview": "name: \n    default: Cameroun\n    af: Kameroen\n    am: ካሜሩን\n    an: Camerún\n    ar: الكاميرون\n    az: Kamerun\n    ba: Кам"
  },
  {
    "path": "settings/country-names/cn.yaml",
    "chars": 2393,
    "preview": "name: \n    default: 中国\n    ab: Чынҭ\n    af: China\n    ak: China\n    am: የቻይና\n    an: China\n    ar: الصين\n    as: চীন\n   "
  },
  {
    "path": "settings/country-names/co.yaml",
    "chars": 2240,
    "preview": "name: \n    default: Colombia\n    af: Colombia\n    am: ኮሎምቢያ\n    an: Colombia\n    ar: كولومبيا\n    ay: Kuluwya\n    az: Ko"
  },
  {
    "path": "settings/country-names/cr.yaml",
    "chars": 2496,
    "preview": "name: \n    default: Costa Rica\n    ab: Коста-Рика\n    af: Costa Rica\n    am: ኮስታ ሪካ\n    an: Costa Rica\n    ar: كوستاريكا"
  },
  {
    "path": "settings/country-names/cu.yaml",
    "chars": 1699,
    "preview": "name: \n    default: Cuba\n    af: Kuba\n    am: ኩባ\n    an: Cuba\n    ar: كوبا\n    ay: Kuba\n    az: Kuba\n    ba: Куба\n    be"
  },
  {
    "path": "settings/country-names/cv.yaml",
    "chars": 1083,
    "preview": "name: \n    default: Cabo Verde\n    af: Kaap Verde\n    ar: الرأس الأخضر\n    be: Каба-Вердэ\n    br: Kab Glas\n    ca: Cap V"
  },
  {
    "path": "settings/country-names/cy.yaml",
    "chars": 1918,
    "preview": "name: \n    default: Κύπρος - Kıbrıs\n    af: Siprus\n    am: ቆጵሮስ\n    an: Chipre\n    ar: قبرص\n    az: Kipr\n    be: Кіпр\n  "
  },
  {
    "path": "settings/country-names/cz.yaml",
    "chars": 2767,
    "preview": "name: \n    default: Česko\n    ab: Чехиа\n    af: Tsjeggië\n    am: ቼክ ሪፐብሊክ\n    an: Republica Checa\n    ar: التشيك\n    av:"
  },
  {
    "path": "settings/country-names/de.yaml",
    "chars": 2636,
    "preview": "name: \n    default: Deutschland\n    ab: Алмантәыла\n    af: Duitsland\n    ak: Germany\n    am: ጀርመን\n    an: Alemanya\n    a"
  },
  {
    "path": "settings/country-names/dj.yaml",
    "chars": 2039,
    "preview": "name: \n    default: Djibouti جيبوتي\n    af: Djiboeti\n    am: ጅቡቲ\n    an: Chibuti\n    ar: جيبوتي\n    az: Cibuti\n    ba: Д"
  },
  {
    "path": "settings/country-names/dk.yaml",
    "chars": 2210,
    "preview": "name: \n    default: Danmark\n    af: Denemarke\n    am: ዴንማርክ\n    an: Dinamarca\n    ar: الدنمارك\n    az: Danimarka\n    ba:"
  },
  {
    "path": "settings/country-names/dm.yaml",
    "chars": 752,
    "preview": "name: \n    default: Dominica\n    af: Dominika\n    ar: دومينيكا\n    be: Дамініка\n    br: Republik Dominikan\n    cs: Domin"
  },
  {
    "path": "settings/country-names/do.yaml",
    "chars": 3296,
    "preview": "name: \n    default: República Dominicana\n    af: Dominikaanse Republiek\n    am: ዶሚኒካን ሪፐብሊክ\n    an: Republica Dominicana"
  },
  {
    "path": "settings/country-names/dz.yaml",
    "chars": 2627,
    "preview": "name: \n    default: Algérie / ⵍⵣⵣⴰⵢⴻⵔ / الجزائر\n    af: Algerië\n    ak: Algeria\n    am: አልጄሪያ\n    an: Alcheria\n    ar: ا"
  },
  {
    "path": "settings/country-names/ec.yaml",
    "chars": 2041,
    "preview": "name: \n    default: Ecuador\n    am: ኤኳዶር\n    an: Ecuador\n    ar: الإكوادور\n    ay: Ikwadur\n    az: Ekvador\n    ba: Эквад"
  },
  {
    "path": "settings/country-names/ee.yaml",
    "chars": 2233,
    "preview": "name: \n    default: Eesti\n    af: Estland\n    am: ኤስቶኒያ\n    an: Estonia\n    ar: إستونيا\n    az: Estoniya\n    ba: Эстония"
  },
  {
    "path": "settings/country-names/eg.yaml",
    "chars": 2396,
    "preview": "name: \n    default: مصر\n    ab: Мы́сры\n    af: Egipte\n    ak: Igyipt\n    am: ግብፅ\n    an: Echipto\n    ar: مصر\n    as: ইজি"
  },
  {
    "path": "settings/country-names/eh.yaml",
    "chars": 871,
    "preview": "name: \n    default: الجمهورية العربية الصحراوية الديمقراطية\n    ar: الجمهورية العربية الصحراوية الديمقراطية\n    cs: Saha"
  },
  {
    "path": "settings/country-names/er.yaml",
    "chars": 2135,
    "preview": "name: \n    default: ኤርትራ Eritrea إرتريا\n    af: Eritrea\n    am: ኤርትራ\n    an: Eritrea\n    ar: إرتريا\n    az: Eritreya\n   "
  },
  {
    "path": "settings/country-names/es.yaml",
    "chars": 2322,
    "preview": "name: \n    default: España\n    af: Spanje\n    am: እስፓንያ\n    an: Espanya\n    ar: إسبانيا\n    ay: Ispaña\n    az: İspaniya\n"
  },
  {
    "path": "settings/country-names/et.yaml",
    "chars": 2589,
    "preview": "name: \n    default: ኢትዮጵያ\n    af: Ethiopië\n    ak: Ithiopia\n    am: ኢትዮጵያ\n    an: Etiopia\n    ar: إثيوبيا\n    av: Хабаши"
  },
  {
    "path": "settings/country-names/fi.yaml",
    "chars": 2446,
    "preview": "name: \n    default: Suomi\n    ab: Суоми\n    af: Finland\n    am: ፊንላንድ\n    an: Finlandia\n    ar: فنلندا\n    ay: Phini suy"
  }
]

// ... and 525 more files (download for full content)

About this extraction

This page contains the full source code of the twain47/Nominatim GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 725 files (5.4 MB), approximately 1.5M tokens, and a symbol index with 2762 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!